diff --git a/cmd/account/show/allowances.go b/cmd/account/show/allowances.go index 5369a0b2..ce156938 100644 --- a/cmd/account/show/allowances.go +++ b/cmd/account/show/allowances.go @@ -7,6 +7,8 @@ import ( staking "github.com/oasisprotocol/oasis-core/go/staking/api" + "github.com/oasisprotocol/cli/cmd/common" + "github.com/oasisprotocol/oasis-sdk/client-sdk/go/config" "github.com/oasisprotocol/oasis-sdk/client-sdk/go/helpers" "github.com/oasisprotocol/oasis-sdk/client-sdk/go/types" @@ -61,7 +63,8 @@ func prettyPrintAllowanceDescriptions( lenLongest := lenLongestString(beneficiaryFieldName, amountFieldName) for _, desc := range allowDescriptions { - fmt.Fprintf(w, "%s - %-*s %s", prefix, lenLongest, beneficiaryFieldName, desc.beneficiary) + prettyAddr := common.PrettyAddress(desc.beneficiary.String()) + fmt.Fprintf(w, "%s - %-*s %s", prefix, lenLongest, beneficiaryFieldName, prettyAddr) if desc.self { fmt.Fprintf(w, " (self)") } diff --git a/cmd/account/show/delegations.go b/cmd/account/show/delegations.go index 7186ace3..d77dc1e3 100644 --- a/cmd/account/show/delegations.go +++ b/cmd/account/show/delegations.go @@ -16,6 +16,8 @@ import ( "github.com/oasisprotocol/oasis-sdk/client-sdk/go/helpers" "github.com/oasisprotocol/oasis-sdk/client-sdk/go/modules/consensusaccounts" "github.com/oasisprotocol/oasis-sdk/client-sdk/go/types" + + "github.com/oasisprotocol/cli/cmd/common" ) const amountFieldName = "Amount:" @@ -87,6 +89,12 @@ func prettyPrintDelegationDescriptions( fmt.Fprintf(w, "%sDelegations:\n", prefix) + // Guard against empty slice to prevent panic when accessing delDescriptions[0]. + if len(delDescriptions) == 0 { + fmt.Fprintf(w, "%s \n", prefix) + return + } + sort.Sort(byEndTimeAmountAddress(delDescriptions)) // Get the length of name of the longest field to display for each @@ -103,7 +111,8 @@ func prettyPrintDelegationDescriptions( } for _, desc := range delDescriptions { - fmt.Fprintf(w, "%s - %-*s %s", prefix, lenLongest, addressFieldName, desc.address) + prettyAddr := common.PrettyAddress(desc.address.String()) + fmt.Fprintf(w, "%s - %-*s %s", prefix, lenLongest, addressFieldName, prettyAddr) if desc.self { fmt.Fprintf(w, " (self)") } diff --git a/cmd/account/show/show.go b/cmd/account/show/show.go index f04f361f..ccf9efe1 100644 --- a/cmd/account/show/show.go +++ b/cmd/account/show/show.go @@ -83,9 +83,20 @@ var ( nativeAddr, ethAddr, err := common.ResolveLocalAccountOrAddress(npa.Network, targetAddress) cobra.CheckErr(err) - out.EthereumAddress = ethAddr out.NativeAddress = nativeAddr - out.Name = common.FindAccountName(nativeAddr.String()) + addrCtx := common.GenAddressFormatContext() + out.Name = addrCtx.Names[nativeAddr.String()] + + // If eth address is not available, try to get it from locally-known mappings + // (wallet/addressbook/test accounts). No unlock required. + if ethAddr == nil { + if ethHex := addrCtx.Eth[nativeAddr.String()]; ethHex != "" && ethCommon.IsHexAddress(ethHex) { + eth := ethCommon.HexToAddress(ethHex) + ethAddr = ð + } + } + + out.EthereumAddress = ethAddr height, err := common.GetActualHeight( ctx, diff --git a/cmd/common/helpers.go b/cmd/common/helpers.go index 88b09439..0281d9eb 100644 --- a/cmd/common/helpers.go +++ b/cmd/common/helpers.go @@ -3,12 +3,16 @@ package common import ( "fmt" "os" + "sort" "github.com/spf13/cobra" + staking "github.com/oasisprotocol/oasis-core/go/staking/api" + "github.com/oasisprotocol/oasis-sdk/client-sdk/go/helpers" "github.com/oasisprotocol/oasis-sdk/client-sdk/go/testing" "github.com/oasisprotocol/oasis-sdk/client-sdk/go/types" + buildRoflProvider "github.com/oasisprotocol/cli/build/rofl/provider" "github.com/oasisprotocol/cli/config" ) @@ -41,19 +45,66 @@ func CheckForceErr(err interface{}) { cobra.CheckErr(errMsg) } -// GenAccountNames generates a map of all addresses -> account name for pretty printing. +// GenAccountNames generates a map of all known native addresses -> account name for pretty printing. +// It includes test accounts, configured networks (paratimes/ROFL defaults), addressbook and wallet. +// +// Priority order (later entries overwrite earlier): +// test accounts < network entries < addressbook < wallet. func GenAccountNames() types.AccountNames { an := types.AccountNames{} - for name, acc := range config.Global().Wallet.All { - an[acc.GetAddress().String()] = name + + // Test accounts have lowest priority. + for name, acc := range testing.TestAccounts { + an[acc.Address.String()] = fmt.Sprintf("test:%s", name) + } + + // Network-derived entries (paratimes, ROFL providers) have second-lowest priority. + cfg := config.Global() + netNames := make([]string, 0, len(cfg.Networks.All)) + for name := range cfg.Networks.All { + netNames = append(netNames, name) + } + sort.Strings(netNames) + for _, netName := range netNames { + net := cfg.Networks.All[netName] + if net == nil { + continue + } + + // Include ParaTime runtime addresses as paratime:. + ptNames := make([]string, 0, len(net.ParaTimes.All)) + for ptName := range net.ParaTimes.All { + ptNames = append(ptNames, ptName) + } + sort.Strings(ptNames) + for _, ptName := range ptNames { + pt := net.ParaTimes.All[ptName] + if pt == nil { + continue + } + + rtAddr := types.NewAddressFromConsensus(staking.NewRuntimeAddress(pt.Namespace())) + an[rtAddr.String()] = fmt.Sprintf("paratime:%s", ptName) + + // Include ROFL default provider addresses as rofl:provider:. + if svc, ok := buildRoflProvider.DefaultRoflServices[pt.ID]; ok { + if svc.Provider != "" { + if a, _, err := helpers.ResolveEthOrOasisAddress(svc.Provider); err == nil && a != nil { + an[a.String()] = fmt.Sprintf("rofl:provider:%s", ptName) + } + } + } + } } - for name, acc := range config.Global().AddressBook.All { + // Addressbook entries have medium priority. + for name, acc := range cfg.AddressBook.All { an[acc.GetAddress().String()] = name } - for name, acc := range testing.TestAccounts { - an[acc.Address.String()] = fmt.Sprintf("test:%s", name) + // Wallet entries have highest priority. + for name, acc := range cfg.Wallet.All { + an[acc.GetAddress().String()] = name } return an @@ -64,3 +115,82 @@ func FindAccountName(address string) string { an := GenAccountNames() return an[address] } + +// AddressFormatContext contains precomputed maps for address formatting. +type AddressFormatContext struct { + // Names maps native address string to account name. + Names types.AccountNames + // Eth maps native address string to Ethereum hex address string, if known. + Eth map[string]string +} + +// GenAccountEthMap generates a map of native address string -> eth hex address (if known). +// Priority order matches GenAccountNames: test accounts < addressbook < wallet. +func GenAccountEthMap() map[string]string { + eth := make(map[string]string) + + for _, acc := range testing.TestAccounts { + if acc.EthAddress != nil { + eth[acc.Address.String()] = acc.EthAddress.Hex() + } + } + + for _, acc := range config.Global().AddressBook.All { + if ethAddr := acc.GetEthAddress(); ethAddr != nil { + eth[acc.GetAddress().String()] = ethAddr.Hex() + } + } + + for _, acc := range config.Global().Wallet.All { + if ethAddr := acc.GetEthAddress(); ethAddr != nil { + eth[acc.GetAddress().String()] = ethAddr.Hex() + } + } + + return eth +} + +// GenAddressFormatContext builds both name and eth address maps for formatting. +func GenAddressFormatContext() AddressFormatContext { + return AddressFormatContext{ + Names: GenAccountNames(), + Eth: GenAccountEthMap(), + } +} + +// PrettyAddressWith formats the address in native or eth string for display using a precomputed context. +// Known addresses return "name (preferred_addr)", unknown addresses return the input unchanged. +func PrettyAddressWith(ctx AddressFormatContext, addr string) string { + nativeAddr, ethFromInput, err := helpers.ResolveEthOrOasisAddress(addr) + if err != nil || nativeAddr == nil { + return addr + } + + nativeStr := nativeAddr.String() + + name := ctx.Names[nativeStr] + if name == "" { + return addr + } + + // Prefer eth address in parentheses when available. + var parenAddr string + if ethFromInput != nil { + parenAddr = ethFromInput.Hex() + } else if ethHex := ctx.Eth[nativeStr]; ethHex != "" { + parenAddr = ethHex + } else { + parenAddr = nativeStr + } + + if name == parenAddr { + return parenAddr + } + + return fmt.Sprintf("%s (%s)", name, parenAddr) +} + +// PrettyAddress is like PrettyAddressWith but builds a fresh context on each call. +func PrettyAddress(addr string) string { + return PrettyAddressWith(GenAddressFormatContext(), addr) +} diff --git a/cmd/common/helpers_test.go b/cmd/common/helpers_test.go new file mode 100644 index 00000000..b51af194 --- /dev/null +++ b/cmd/common/helpers_test.go @@ -0,0 +1,69 @@ +package common + +import ( + "testing" + + "github.com/stretchr/testify/require" + + "github.com/oasisprotocol/oasis-sdk/client-sdk/go/helpers" + "github.com/oasisprotocol/oasis-sdk/client-sdk/go/types" +) + +func TestPrettyAddressWith(t *testing.T) { + require := require.New(t) + + nativeAddr, ethAddr, err := helpers.ResolveEthOrOasisAddress("0x60a6321eA71d37102Dbf923AAe2E08d005C4e403") + require.NoError(err) + require.NotNil(nativeAddr) + require.NotNil(ethAddr) + + t.Run("eth preferred when known", func(_ *testing.T) { + ctx := AddressFormatContext{ + Names: types.AccountNames{ + nativeAddr.String(): "my", + }, + Eth: map[string]string{ + nativeAddr.String(): ethAddr.Hex(), + }, + } + + require.Equal("my ("+ethAddr.Hex()+")", PrettyAddressWith(ctx, nativeAddr.String())) + require.Equal("my ("+ethAddr.Hex()+")", PrettyAddressWith(ctx, ethAddr.Hex())) + }) + + t.Run("native fallback when eth unknown", func(_ *testing.T) { + ctx := AddressFormatContext{ + Names: types.AccountNames{ + nativeAddr.String(): "my", + }, + Eth: map[string]string{}, + } + + require.Equal("my ("+nativeAddr.String()+")", PrettyAddressWith(ctx, nativeAddr.String())) + // If the user explicitly provided an Ethereum address, prefer it even if not in ctx.Eth. + require.Equal("my ("+ethAddr.Hex()+")", PrettyAddressWith(ctx, ethAddr.Hex())) + }) + + t.Run("unknown returns unchanged", func(_ *testing.T) { + ctx := AddressFormatContext{ + Names: types.AccountNames{}, + Eth: map[string]string{}, + } + + require.Equal(nativeAddr.String(), PrettyAddressWith(ctx, nativeAddr.String())) + require.Equal(ethAddr.Hex(), PrettyAddressWith(ctx, ethAddr.Hex())) + }) + + t.Run("unparseable returns unchanged", func(_ *testing.T) { + ctx := AddressFormatContext{ + Names: types.AccountNames{ + nativeAddr.String(): "my", + }, + Eth: map[string]string{ + nativeAddr.String(): ethAddr.Hex(), + }, + } + + require.Equal("not-an-address", PrettyAddressWith(ctx, "not-an-address")) + }) +} diff --git a/cmd/common/json.go b/cmd/common/json.go index e3436aa7..248f1a67 100644 --- a/cmd/common/json.go +++ b/cmd/common/json.go @@ -152,6 +152,11 @@ func JSONMarshalUniversalValue(v interface{}) []byte { // For types implementing consensusPretty.PrettyPrinter, it uses the custom pretty printer. // For other types, it does basic JSON indentation and cleanup of common delimiters. func PrettyPrint(npa *NPASelection, prefix string, blob interface{}) string { + return PrettyPrintWithTxDetails(npa, prefix, blob, nil) +} + +// PrettyPrintWithTxDetails is like PrettyPrint but passes txDetails to the signature context. +func PrettyPrintWithTxDetails(npa *NPASelection, prefix string, blob interface{}, txDetails *signature.TxDetails) string { ret := "" switch rtx := blob.(type) { case consensusPretty.PrettyPrinter: @@ -164,6 +169,7 @@ func PrettyPrint(npa *NPASelection, prefix string, blob interface{}) string { RuntimeID: ns, ChainContext: npa.Network.ChainContext, Base: types.SignatureContextBase, + TxDetails: txDetails, } ctx := context.Background() ctx = context.WithValue(ctx, consensusPretty.ContextKeyTokenSymbol, npa.Network.Denomination.Symbol) @@ -172,7 +178,19 @@ func PrettyPrint(npa *NPASelection, prefix string, blob interface{}) string { ctx = context.WithValue(ctx, config.ContextKeyParaTimeCfg, npa.ParaTime) } ctx = context.WithValue(ctx, signature.ContextKeySigContext, &sigCtx) - ctx = context.WithValue(ctx, types.ContextKeyAccountNames, GenAccountNames()) + + // Provide locally-known names and native->ETH mapping for address formatting. + addrCtx := GenAddressFormatContext() + + // Inject the original Ethereum "To" address into the eth map so that + // FormatNamedAddressWith can prefer it over the native representation. + if txDetails != nil && txDetails.OrigTo != nil { + native := types.NewAddressFromEth(txDetails.OrigTo.Bytes()).String() + addrCtx.Eth[native] = txDetails.OrigTo.Hex() + } + + ctx = context.WithValue(ctx, types.ContextKeyAccountNames, addrCtx.Names) + ctx = context.WithValue(ctx, types.ContextKeyAccountEthMap, addrCtx.Eth) // Set up chain context for signature verification during pretty-printing. coreSignature.UnsafeResetChainContext() diff --git a/cmd/common/json_test.go b/cmd/common/json_test.go new file mode 100644 index 00000000..d33ac6fb --- /dev/null +++ b/cmd/common/json_test.go @@ -0,0 +1,55 @@ +package common + +import ( + "strings" + "testing" + + ethCommon "github.com/ethereum/go-ethereum/common" + "github.com/stretchr/testify/require" + + "github.com/oasisprotocol/oasis-core/go/common/quantity" + + sdkConfig "github.com/oasisprotocol/oasis-sdk/client-sdk/go/config" + sdkSignature "github.com/oasisprotocol/oasis-sdk/client-sdk/go/crypto/signature" + "github.com/oasisprotocol/oasis-sdk/client-sdk/go/modules/accounts" + "github.com/oasisprotocol/oasis-sdk/client-sdk/go/types" +) + +func TestPrettyPrintWithTxDetails_PreservesUnnamedEthTo(t *testing.T) { + require := require.New(t) + + pt := &sdkConfig.ParaTime{ + ID: strings.Repeat("0", 64), + Denominations: map[string]*sdkConfig.DenominationInfo{ + sdkConfig.NativeDenominationKey: { + Symbol: "TEST", + Decimals: 18, + }, + }, + } + + npa := &NPASelection{ + NetworkName: "testnet", + Network: &sdkConfig.Network{ + ChainContext: "test-chain-context", + Denomination: sdkConfig.DenominationInfo{ + Symbol: "TEST", + Decimals: 9, + }, + }, + ParaTimeName: "test-paratime", + ParaTime: pt, + } + + ethAddr := ethCommon.HexToAddress("0x1111111111111111111111111111111111111111") + to := types.NewAddressFromEth(ethAddr.Bytes()) + amt := types.NewBaseUnits(*quantity.NewFromUint64(0), types.NativeDenomination) + tx := accounts.NewTransferTx(nil, &accounts.Transfer{ + To: to, + Amount: amt, + }) + + out := PrettyPrintWithTxDetails(npa, "", tx, &sdkSignature.TxDetails{OrigTo: ðAddr}) + + require.Contains(out, "To: "+ethAddr.Hex()+" ("+to.String()+")") +} diff --git a/cmd/common/transaction.go b/cmd/common/transaction.go index 15112103..b94ea550 100644 --- a/cmd/common/transaction.go +++ b/cmd/common/transaction.go @@ -188,7 +188,7 @@ func SignConsensusTransaction( return tx, nil } - PrintTransactionBeforeSigning(npa, tx) + PrintTransactionBeforeSigning(npa, tx, nil) // Sign the transaction. // NOTE: We build our own domain separation context here as we need to support multiple chain @@ -345,7 +345,7 @@ func SignParaTimeTransaction( return tx, meta, nil } - PrintTransactionBeforeSigning(npa, tx) + PrintTransactionBeforeSigning(npa, tx, txDetails) // Sign the transaction. ts := tx.PrepareForSigning() @@ -363,9 +363,14 @@ func SignParaTimeTransaction( // PrintTransactionRaw prints the transaction which can be either signed or unsigned. func PrintTransactionRaw(npa *NPASelection, tx interface{}) { + PrintTransactionRawWithTxDetails(npa, tx, nil) +} + +// PrintTransactionRawWithTxDetails is like PrintTransactionRaw but passes txDetails to the pretty-printer. +func PrintTransactionRawWithTxDetails(npa *NPASelection, tx interface{}, txDetails *signature.TxDetails) { switch tx.(type) { case consensusPretty.PrettyPrinter: - fmt.Print(PrettyPrint(npa, "", tx)) + fmt.Print(PrettyPrintWithTxDetails(npa, "", tx, txDetails)) default: fmt.Printf("[unsupported transaction type: %T]\n", tx) } @@ -374,7 +379,12 @@ func PrintTransactionRaw(npa *NPASelection, tx interface{}) { // PrintTransaction prints the transaction which can be either signed or unsigned together with // information about the selected network/ParaTime. func PrintTransaction(npa *NPASelection, tx interface{}) { - PrintTransactionRaw(npa, tx) + PrintTransactionWithTxDetails(npa, tx, nil) +} + +// PrintTransactionWithTxDetails is like PrintTransaction but passes txDetails to the pretty-printer. +func PrintTransactionWithTxDetails(npa *NPASelection, tx interface{}, txDetails *signature.TxDetails) { + PrintTransactionRawWithTxDetails(npa, tx, txDetails) fmt.Println() fmt.Printf("Network: %s", npa.PrettyPrintNetwork()) @@ -392,10 +402,10 @@ func PrintTransaction(npa *NPASelection, tx interface{}) { } // PrintTransactionBeforeSigning prints the transaction and asks the user for confirmation. -func PrintTransactionBeforeSigning(npa *NPASelection, tx interface{}) { +func PrintTransactionBeforeSigning(npa *NPASelection, tx interface{}, txDetails *signature.TxDetails) { fmt.Printf("You are about to sign the following transaction:\n") - PrintTransaction(npa, tx) + PrintTransactionWithTxDetails(npa, tx, txDetails) fmt.Printf("Account: %s", npa.AccountName) if len(npa.Account.Description) > 0 { diff --git a/cmd/common/wallet.go b/cmd/common/wallet.go index 54f3b9db..c72dbf2e 100644 --- a/cmd/common/wallet.go +++ b/cmd/common/wallet.go @@ -130,6 +130,16 @@ func LoadAccount(cfg *config.Config, name string) wallet.Account { acc, err := cfg.Wallet.Load(name, passphrase) cobra.CheckErr(err) + // Persist eth address on unlock so future commands can show it without unlocking again. + if accCfg, ok := cfg.Wallet.All[name]; ok && accCfg.EthAddress == "" { + if ethAddr := acc.EthAddress(); ethAddr != nil { + accCfg.EthAddress = ethAddr.Hex() + if err := cfg.Save(); err != nil { + Warnf("Warning: failed to persist eth_address for wallet account '%s': %v", name, err) + } + } + } + return acc } @@ -200,8 +210,7 @@ func ResolveLocalAccountOrAddress(net *configSdk.Network, address string) (*type // Check if address is the account name in the wallet. if acc, ok := config.Global().Wallet.All[address]; ok { addr := acc.GetAddress() - // TODO: Implement acc.GetEthAddress() - return &addr, nil, nil + return &addr, acc.GetEthAddress(), nil } // Check if address is the name of an address book entry. diff --git a/cmd/contract.go b/cmd/contract.go index 7961e90f..24287978 100644 --- a/cmd/contract.go +++ b/cmd/contract.go @@ -61,7 +61,7 @@ var ( fmt.Printf("ID: %d\n", inst.ID) fmt.Printf("Code ID: %d\n", inst.CodeID) - fmt.Printf("Creator: %s\n", inst.Creator) + fmt.Printf("Creator: %s\n", common.PrettyAddress(inst.Creator.String())) fmt.Printf("Upgrades policy: %s\n", formatPolicy(&inst.UpgradesPolicy)) }, } @@ -90,7 +90,7 @@ var ( fmt.Printf("ID: %d\n", code.ID) fmt.Printf("Hash: %s\n", code.Hash) fmt.Printf("ABI: %s (sv: %d)\n", code.ABI, code.ABISubVersion) - fmt.Printf("Uploader: %s\n", code.Uploader) + fmt.Printf("Uploader: %s\n", common.PrettyAddress(code.Uploader.String())) fmt.Printf("Instantiate policy: %s\n", formatPolicy(&code.InstantiatePolicy)) }, } diff --git a/cmd/network/governance/list.go b/cmd/network/governance/list.go index 0a114fc6..6a98bb7d 100644 --- a/cmd/network/governance/list.go +++ b/cmd/network/governance/list.go @@ -52,7 +52,7 @@ var govListCmd = &cobra.Command{ output = append(output, []string{ fmt.Sprintf("%d", proposal.ID), kind, - proposal.Submitter.String(), + common.PrettyAddress(proposal.Submitter.String()), fmt.Sprintf("%d", proposal.CreatedAt), fmt.Sprintf("%d", proposal.ClosesAt), proposal.State.String(), diff --git a/cmd/network/governance/show.go b/cmd/network/governance/show.go index 894848a6..07d5812d 100644 --- a/cmd/network/governance/show.go +++ b/cmd/network/governance/show.go @@ -276,7 +276,7 @@ var ( fmt.Printf("Network: %s\n", npa.PrettyPrintNetwork()) fmt.Printf("Proposal ID: %d\n", proposalID) fmt.Printf("Status: %s\n", proposal.State) - fmt.Printf("Submitted By: %s\n", proposal.Submitter) + fmt.Printf("Submitted By: %s\n", common.PrettyAddress(proposal.Submitter.String())) fmt.Printf("Created At: epoch %d\n", proposal.CreatedAt) switch proposal.State { @@ -391,24 +391,26 @@ var ( fmt.Println("=== VALIDATORS VOTED ===") votersList := entitiesByDescendingStake(validatorVoters) for i, val := range votersList { + valAddr := common.PrettyAddress(val.Address.String()) name := getName(val.Address) stakePercentage := new(big.Float).SetInt(val.Stake.Clone().ToBigInt()) stakePercentage = stakePercentage.Mul(stakePercentage, new(big.Float).SetInt64(100)) stakePercentage = stakePercentage.Quo(stakePercentage, new(big.Float).SetInt(totalVotingStake.ToBigInt())) if hasCorrectVotingPower { - fmt.Printf(" %d. %s,%s,%s (%.2f%%): %s\n", i+1, val.Address, name, val.Stake, stakePercentage, validatorVotes[val.Address]) + fmt.Printf(" %d. %s,%s,%s (%.2f%%): %s\n", i+1, valAddr, name, val.Stake, stakePercentage, validatorVotes[val.Address]) } else { - fmt.Printf(" %d. %s,%s: %s\n", i+1, val.Address, name, validatorVotes[val.Address]) + fmt.Printf(" %d. %s,%s: %s\n", i+1, valAddr, name, validatorVotes[val.Address]) } // Display delegators that voted differently. for voter, override := range validatorVoteOverrides[val.Address] { + voterAddr := common.PrettyAddress(voter.String()) voterName := getName(voter) if hasCorrectVotingPower { - fmt.Printf(" - %s,%s,%s (%.2f%%) -> %s\n", voter, voterName, override.shares, override.sharePercent, override.vote) + fmt.Printf(" - %s,%s,%s (%.2f%%) -> %s\n", voterAddr, voterName, override.shares, override.sharePercent, override.vote) } else { - fmt.Printf(" - %s,%s -> %s\n", voter, voterName, override.vote) + fmt.Printf(" - %s,%s -> %s\n", voterAddr, voterName, override.vote) } } } @@ -418,16 +420,18 @@ var ( fmt.Println("=== VALIDATORS NOT VOTED ===") nonVotersList := entitiesByDescendingStake(validatorNonVoters) for i, val := range nonVotersList { + valAddr := common.PrettyAddress(val.Address.String()) name := getName(val.Address) stakePercentage := new(big.Float).SetInt(val.Stake.Clone().ToBigInt()) stakePercentage = stakePercentage.Mul(stakePercentage, new(big.Float).SetInt64(100)) stakePercentage = stakePercentage.Quo(stakePercentage, new(big.Float).SetInt(totalVotingStake.ToBigInt())) - fmt.Printf(" %d. %s,%s,%s (%.2f%%)", i+1, val.Address, name, val.Stake, stakePercentage) + fmt.Printf(" %d. %s,%s,%s (%.2f%%)", i+1, valAddr, name, val.Stake, stakePercentage) fmt.Println() // Display delegators that voted differently. for voter, override := range validatorVoteOverrides[val.Address] { + voterAddr := common.PrettyAddress(voter.String()) voterName := getName(voter) - fmt.Printf(" - %s,%s,%s (%.2f%%) -> %s", voter, voterName, override.shares, override.sharePercent, override.vote) + fmt.Printf(" - %s,%s,%s (%.2f%%) -> %s", voterAddr, voterName, override.shares, override.sharePercent, override.vote) fmt.Println() } } diff --git a/cmd/network/show.go b/cmd/network/show.go index 09d2288f..a998390b 100644 --- a/cmd/network/show.go +++ b/cmd/network/show.go @@ -52,7 +52,7 @@ func prettyPrintEntityNodes(ctx context.Context, npa *common.NPASelection, staki fmt.Printf("=== ENTITY ===\n") entityAddr := staking.NewAddress(entity.ID) - fmt.Printf("Entity Address: %s\n", entityAddr.String()) + fmt.Printf("Entity Address: %s\n", common.PrettyAddress(entityAddr.String())) fmt.Printf("Entity ID: %s\n", entity.ID.String()) @@ -86,7 +86,7 @@ func prettyPrintEntityNodes(ctx context.Context, npa *common.NPASelection, staki fmt.Printf("=== NODES ===\n") for i, node := range entity.Nodes { nodeAddr := staking.NewAddress(node) - fmt.Printf("Node Address: %s\n", nodeAddr.String()) + fmt.Printf("Node Address: %s\n", common.PrettyAddress(nodeAddr.String())) fmt.Printf("Node ID: %s\n", node.String()) idQuery2 := ®istry.IDQuery{ Height: height, diff --git a/cmd/paratime/show.go b/cmd/paratime/show.go index b2d7f6a8..5fc3282b 100644 --- a/cmd/paratime/show.go +++ b/cmd/paratime/show.go @@ -201,7 +201,11 @@ var ( fmt.Printf("Chain ID: %s\n", ethTx.ChainId()) fmt.Printf("Nonce: %d\n", ethTx.Nonce()) fmt.Printf("Type: %d\n", ethTx.Type()) - fmt.Printf("To: %s\n", ethTx.To()) + toStr := "" + if to := ethTx.To(); to != nil { + toStr = common.PrettyAddress(to.Hex()) + } + fmt.Printf("To: %s\n", toStr) fmt.Printf("Value: %s\n", ethTx.Value()) fmt.Printf("Gas limit: %d\n", ethTx.Gas()) fmt.Printf("Gas price: %s\n", ethTx.GasPrice()) diff --git a/cmd/rofl/deploy.go b/cmd/rofl/deploy.go index 0ce37124..ba7ec1cb 100644 --- a/cmd/rofl/deploy.go +++ b/cmd/rofl/deploy.go @@ -122,12 +122,16 @@ var ( } // Resolve provider address. - providerAddr, _, err := common.ResolveLocalAccountOrAddress(npa.Network, machine.Provider) + providerAddr, providerEthAddr, err := common.ResolveLocalAccountOrAddress(npa.Network, machine.Provider) if err != nil { cobra.CheckErr(fmt.Sprintf("Invalid provider address: %s", err)) } - fmt.Printf("Using provider: %s (%s)\n", machine.Provider, providerAddr) + providerStr := providerAddr.String() + if providerEthAddr != nil { + providerStr = providerEthAddr.Hex() + } + fmt.Printf("Using provider: %s\n", common.PrettyAddress(providerStr)) if roflCommon.ShowOffers { // Display all offers supported by the provider. diff --git a/cmd/rofl/list.go b/cmd/rofl/list.go index a8348d3b..451cb263 100644 --- a/cmd/rofl/list.go +++ b/cmd/rofl/list.go @@ -8,6 +8,7 @@ import ( "github.com/spf13/cobra" "github.com/oasisprotocol/oasis-sdk/client-sdk/go/client" + "github.com/oasisprotocol/oasis-sdk/client-sdk/go/config" "github.com/oasisprotocol/oasis-sdk/client-sdk/go/connection" "github.com/oasisprotocol/oasis-sdk/client-sdk/go/modules/rofl" @@ -58,7 +59,7 @@ Use --format json for machine-readable output.`, return } - outputAppsText(apps) + outputAppsText(npa.Network, apps) }, } @@ -75,7 +76,7 @@ func outputAppsJSON(apps []*rofl.AppConfig) { } // outputAppsText returns apps in human-readable table format. -func outputAppsText(apps []*rofl.AppConfig) { +func outputAppsText(_ *config.Network, apps []*rofl.AppConfig) { tbl := table.New() tbl.Header("App ID", "Name", "Version", "Admin") @@ -87,10 +88,9 @@ func outputAppsText(apps []*rofl.AppConfig) { // Extract version from metadata. version := app.Metadata["net.oasis.rofl.version"] - // Format admin address. var admin string if app.Admin != nil { - admin = app.Admin.String() + admin = common.PrettyAddress(app.Admin.String()) } rows = append(rows, []string{ diff --git a/cmd/rofl/machine/mgmt.go b/cmd/rofl/machine/mgmt.go index 25c48b71..fe9a9730 100644 --- a/cmd/rofl/machine/mgmt.go +++ b/cmd/rofl/machine/mgmt.go @@ -80,7 +80,7 @@ var ( cobra.CheckErr(err) } - fmt.Printf("Using provider: %s (%s)\n", mCfg.Machine.Provider, mCfg.ProviderAddr) + fmt.Printf("Using provider: %s\n", common.PrettyAddress(mCfg.ProviderAddr.String())) fmt.Printf("Canceling machine: %s [%s]\n", mCfg.MachineName, mCfg.Machine.ID) common.Warn("WARNING: Canceling a machine will permanently destroy it including any persistent storage!") roflCommon.PrintRentRefundWarning() @@ -135,7 +135,7 @@ var ( } // Resolve new admin address. - newAdminAddr, _, err := common.ResolveLocalAccountOrAddress(mCfg.NPA.Network, newAdminAddress) + newAdminAddr, newAdminEthAddr, err := common.ResolveLocalAccountOrAddress(mCfg.NPA.Network, newAdminAddress) if err != nil { cobra.CheckErr(fmt.Errorf("invalid admin address: %w", err)) } @@ -148,7 +148,7 @@ var ( cobra.CheckErr(err) } - fmt.Printf("Provider: %s (%s)\n", mCfg.Machine.Provider, mCfg.ProviderAddr) + fmt.Printf("Provider: %s\n", common.PrettyAddress(mCfg.ProviderAddr.String())) fmt.Printf("Machine: %s [%s]\n", mCfg.MachineName, mCfg.Machine.ID) // Resolve old admin in online mode. @@ -156,10 +156,14 @@ var ( insDsc, err := conn.Runtime(mCfg.NPA.ParaTime).ROFLMarket.Instance(ctx, client.RoundLatest, *mCfg.ProviderAddr, mCfg.MachineID) cobra.CheckErr(err) - fmt.Printf("Old admin: %s\n", insDsc.Admin) + fmt.Printf("Old admin: %s\n", common.PrettyAddress(insDsc.Admin.String())) } - fmt.Printf("New admin: %s\n", newAdminAddr) + newAdminStr := newAdminAddr.String() + if newAdminEthAddr != nil { + newAdminStr = newAdminEthAddr.Hex() + } + fmt.Printf("New admin: %s\n", common.PrettyAddress(newAdminStr)) // Prepare transaction. tx := roflmarket.NewInstanceChangeAdmin(nil, &roflmarket.InstanceChangeAdmin{ @@ -244,7 +248,7 @@ var ( } } - fmt.Printf("Using provider: %s (%s)\n", mCfg.Machine.Provider, mCfg.ProviderAddr) + fmt.Printf("Using provider: %s\n", common.PrettyAddress(mCfg.ProviderAddr.String())) fmt.Printf("Top-up machine: %s [%s]\n", mCfg.MachineName, mCfg.Machine.ID) if txCfg.Offline { fmt.Printf("Top-up term: %d x %s\n", roflCommon.TermCount, roflCommon.Term) @@ -406,7 +410,7 @@ func queueCommand(cliArgs []string, method string, args any, msgAfter string) { cobra.CheckErr(err) } - fmt.Printf("Using provider: %s (%s)\n", mCfg.Machine.Provider, mCfg.ProviderAddr) + fmt.Printf("Using provider: %s\n", common.PrettyAddress(mCfg.ProviderAddr.String())) fmt.Printf("Machine: %s [%s]\n", mCfg.MachineName, mCfg.Machine.ID) fmt.Printf("Command: %s\n", method) fmt.Printf("Args:\n") diff --git a/cmd/rofl/machine/show.go b/cmd/rofl/machine/show.go index 39ca227f..75ba04de 100644 --- a/cmd/rofl/machine/show.go +++ b/cmd/rofl/machine/show.go @@ -97,7 +97,7 @@ func prettyPrintMachine(mCfg *machineCfg, out *machineShowOutput) { expired := !time.Now().Before(paidUntil) fmt.Printf("Name: %s\n", mCfg.MachineName) - fmt.Printf("Provider: %s\n", out.Machine.Provider) + fmt.Printf("Provider: %s\n", common.PrettyAddress(out.Machine.Provider.String())) fmt.Printf("ID: %s\n", out.Machine.ID) fmt.Printf("Offer: %s\n", out.Machine.Offer) fmt.Printf("Status: %s", out.Machine.Status) @@ -105,8 +105,8 @@ func prettyPrintMachine(mCfg *machineCfg, out *machineShowOutput) { fmt.Printf(" (EXPIRED)") } fmt.Println() - fmt.Printf("Creator: %s\n", out.Machine.Creator) - fmt.Printf("Admin: %s\n", out.Machine.Admin) + fmt.Printf("Creator: %s\n", common.PrettyAddress(out.Machine.Creator.String())) + fmt.Printf("Admin: %s\n", common.PrettyAddress(out.Machine.Admin.String())) switch out.Machine.NodeID { case nil: fmt.Printf("Node ID: \n") diff --git a/cmd/rofl/mgmt.go b/cmd/rofl/mgmt.go index c6e5fe83..f7fa481a 100644 --- a/cmd/rofl/mgmt.go +++ b/cmd/rofl/mgmt.go @@ -512,7 +512,7 @@ var ( case nil: fmt.Printf("none\n") default: - fmt.Printf("%s\n", *appCfg.Admin) + fmt.Printf("%s\n", common.PrettyAddress(appCfg.Admin.String())) } stakedAmnt := helpers.FormatParaTimeDenomination(npa.ParaTime, appCfg.Stake) fmt.Printf("Staked amount: %s\n", stakedAmnt) diff --git a/cmd/rofl/provider/list.go b/cmd/rofl/provider/list.go index a565439f..e09ce9a3 100644 --- a/cmd/rofl/provider/list.go +++ b/cmd/rofl/provider/list.go @@ -112,7 +112,7 @@ func outputText(ctx context.Context, npa *common.NPASelection, conn connection.C } rows = append(rows, []string{ - provider.Address.String(), + common.PrettyAddress(provider.Address.String()), provider.SchedulerApp.String(), nodesList, fmt.Sprintf("%d", provider.OffersCount), @@ -139,8 +139,10 @@ func showProviderOffersExpanded(ctx context.Context, npa *common.NPASelection, c cobra.CheckErr(fmt.Errorf("failed to query offers for provider %s: %w", provider.Address, err)) } + prettyAddr := common.PrettyAddress(provider.Address.String()) + if len(offers) == 0 { - fmt.Printf("Provider %s: No offers\n", provider.Address) + fmt.Printf("Provider %s: No offers\n", prettyAddr) return } @@ -154,7 +156,7 @@ func showProviderOffersExpanded(ctx context.Context, npa *common.NPASelection, c return false }) - fmt.Printf("Provider %s (%d offers):\n", provider.Address, len(offers)) + fmt.Printf("Provider %s (%d offers):\n", prettyAddr, len(offers)) for _, offer := range offers { ShowOfferSummary(npa, offer) } diff --git a/cmd/rofl/provider/show.go b/cmd/rofl/provider/show.go index 435de21d..bd5df6b4 100644 --- a/cmd/rofl/provider/show.go +++ b/cmd/rofl/provider/show.go @@ -85,20 +85,20 @@ func outputProviderJSON(provider *roflmarket.Provider, offers []*roflmarket.Offe // outputProviderText outputs provider details in human-readable format. func outputProviderText(npa *common.NPASelection, provider *roflmarket.Provider, offers []*roflmarket.Offer) { - fmt.Printf("Provider: %s\n", provider.Address) + fmt.Printf("Provider: %s\n", common.PrettyAddress(provider.Address.String())) fmt.Println() // Basic information. fmt.Println("=== Basic Information ===") fmt.Printf("Scheduler App: %s\n", provider.SchedulerApp) - // Payment address. var paymentAddr string switch { case provider.PaymentAddress.Native != nil: - paymentAddr = provider.PaymentAddress.Native.String() + paymentAddr = common.PrettyAddress(provider.PaymentAddress.Native.String()) case provider.PaymentAddress.Eth != nil: - paymentAddr = fmt.Sprintf("0x%x", provider.PaymentAddress.Eth[:]) + ethAddr := fmt.Sprintf("0x%x", provider.PaymentAddress.Eth[:]) + paymentAddr = common.PrettyAddress(ethAddr) default: paymentAddr = "" } diff --git a/cmd/wallet/list.go b/cmd/wallet/list.go index 60eb3d9d..6b3a65a7 100644 --- a/cmd/wallet/list.go +++ b/cmd/wallet/list.go @@ -25,10 +25,15 @@ var listCmd = &cobra.Command{ if cfg.Wallet.Default == name { name += common.DefaultMarker } + + addrStr := acc.Address + if ethAddr := acc.GetEthAddress(); ethAddr != nil { + addrStr = ethAddr.Hex() + } output = append(output, []string{ name, acc.PrettyKind(), - acc.Address, + addrStr, }) } diff --git a/cmd/wallet/remote_signer.go b/cmd/wallet/remote_signer.go index 5405fcd6..d6ab586c 100644 --- a/cmd/wallet/remote_signer.go +++ b/cmd/wallet/remote_signer.go @@ -58,7 +58,7 @@ var remoteSignerCmd = &cobra.Command{ err = srv.Start() cobra.CheckErr(err) - fmt.Printf("Address: %s\n", acc.Address()) + fmt.Printf("Address: %s\n", common.PrettyAddress(acc.Address().String())) fmt.Printf("Node Args:\n --signer.backend=remote \\\n --signer.remote.address=unix:%s\n", socketPath) fmt.Printf("\n*** REMOTE SIGNER READY ***\n") diff --git a/config/addressbook.go b/config/addressbook.go index ff8dff8d..bdef2b1d 100644 --- a/config/addressbook.go +++ b/config/addressbook.go @@ -4,7 +4,6 @@ import ( "fmt" ethCommon "github.com/ethereum/go-ethereum/common" - "github.com/spf13/cobra" "github.com/oasisprotocol/oasis-sdk/client-sdk/go/config" "github.com/oasisprotocol/oasis-sdk/client-sdk/go/helpers" @@ -127,11 +126,11 @@ func (a *AddressBookEntry) Validate() error { } if a.EthAddress != "" { - nativeAddr, _, err := helpers.ResolveEthOrOasisAddress(a.EthAddress) + nativeAddr, ethAddr, err := helpers.ResolveEthOrOasisAddress(a.EthAddress) if err != nil { return fmt.Errorf("malformed address '%s': %w", a.EthAddress, err) } - if nativeAddr == nil { + if nativeAddr == nil || ethAddr == nil { return fmt.Errorf("eth address '%s' was not recognized as valid eth address", a.EthAddress) } if nativeAddr.String() != a.Address { @@ -155,7 +154,9 @@ func (a *AddressBookEntry) GetAddress() types.Address { func (a *AddressBookEntry) GetEthAddress() *ethCommon.Address { if a.EthAddress != "" { _, ethAddr, err := helpers.ResolveEthOrOasisAddress(a.EthAddress) - cobra.CheckErr(err) + if err != nil { + return nil + } return ethAddr } diff --git a/config/config.go b/config/config.go index 60972f0a..1fba4af0 100644 --- a/config/config.go +++ b/config/config.go @@ -73,7 +73,13 @@ func encode(in interface{}) (interface{}, error) { const tagName = "mapstructure" v := reflect.ValueOf(in) + if !v.IsValid() { + return nil, nil + } if v.Kind() == reflect.Ptr { + if v.IsNil() { + return nil, nil + } v = v.Elem() } @@ -100,6 +106,11 @@ func encode(in interface{}) (interface{}, error) { } } + // Implement omitempty similarly to encoding/json: omit zero values when requested. + if attributes["omitempty"] && isEmptyValue(v.Field(i)) { + continue + } + // Encode value. value, err := encode(v.Field(i).Interface()) if err != nil { @@ -150,6 +161,25 @@ func encode(in interface{}) (interface{}, error) { } } +func isEmptyValue(v reflect.Value) bool { + switch v.Kind() { + case reflect.Array, reflect.Map, reflect.Slice, reflect.String: + return v.Len() == 0 + case reflect.Bool: + return !v.Bool() + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Interface, reflect.Ptr: + return v.IsNil() + default: + return false + } +} + // Save saves the configuration structure to viper. func (cfg *Config) Save() error { if err := cfg.Validate(); err != nil { diff --git a/config/config_test.go b/config/config_test.go new file mode 100644 index 00000000..848ff368 --- /dev/null +++ b/config/config_test.go @@ -0,0 +1,38 @@ +package config + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestEncodeOmitEmptyMapstructure(t *testing.T) { + require := require.New(t) + + t.Run("omitempty omits empty string field", func(_ *testing.T) { + entry := AddressBookEntry{ + Description: "d", + Address: "oasis1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqd39y6h", + EthAddress: "", + } + + enc, err := encode(entry) + require.NoError(err) + m, ok := enc.(map[string]interface{}) + require.True(ok) + require.NotContains(m, "eth_address") + }) + + t.Run("omitempty includes non-empty string field", func(_ *testing.T) { + entry := AddressBookEntry{ + Address: "oasis1qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqd39y6h", + EthAddress: "0x60a6321ea71d37102dbf923aae2e08d005c4e403", + } + + enc, err := encode(entry) + require.NoError(err) + m, ok := enc.(map[string]interface{}) + require.True(ok) + require.Equal(entry.EthAddress, m["eth_address"]) + }) +} diff --git a/config/wallet.go b/config/wallet.go index 511f6fad..faa59359 100644 --- a/config/wallet.go +++ b/config/wallet.go @@ -3,7 +3,10 @@ package config import ( "fmt" + ethCommon "github.com/ethereum/go-ethereum/common" + "github.com/oasisprotocol/oasis-sdk/client-sdk/go/config" + "github.com/oasisprotocol/oasis-sdk/client-sdk/go/helpers" "github.com/oasisprotocol/oasis-sdk/client-sdk/go/types" "github.com/oasisprotocol/cli/wallet" @@ -80,6 +83,11 @@ func (w *Wallet) Create(name string, passphrase string, nw *Account) error { } nw.Address = string(address) + // Store eth address so wallet list can show it without unlocking. + if ethAddr := acc.EthAddress(); ethAddr != nil { + nw.EthAddress = ethAddr.Hex() + } + if w.All == nil { w.All = make(map[string]*Account) } @@ -219,6 +227,11 @@ func (w *Wallet) Import(name string, passphrase string, nw *Account, src *wallet } nw.Address = string(address) + // Store eth address (same as Create). + if ethAddr := acc.EthAddress(); ethAddr != nil { + nw.EthAddress = ethAddr.Hex() + } + if w.All == nil { w.All = make(map[string]*Account) } @@ -252,6 +265,7 @@ type Account struct { Description string `mapstructure:"description"` Kind string `mapstructure:"kind"` Address string `mapstructure:"address"` + EthAddress string `mapstructure:"eth_address,omitempty"` // Config contains kind-specific configuration for this wallet. Config map[string]interface{} `mapstructure:",remain"` @@ -270,6 +284,20 @@ func (a *Account) Validate() error { return fmt.Errorf("malformed address '%s': %w", a.Address, err) } + // Check that Ethereum address is valid and matches native address, if set. + if a.EthAddress != "" { + nativeAddr, ethAddr, err := helpers.ResolveEthOrOasisAddress(a.EthAddress) + if err != nil { + return fmt.Errorf("malformed eth address '%s': %w", a.EthAddress, err) + } + if nativeAddr == nil || ethAddr == nil { + return fmt.Errorf("eth address '%s' was not recognized as valid eth address", a.EthAddress) + } + if nativeAddr.String() != a.Address { + return fmt.Errorf("eth address '%s' (converted to '%s') mismatches stored address '%s'", a.EthAddress, nativeAddr.String(), a.Address) + } + } + // Check the algorithm is not empty. if _, ok := a.Config["algorithm"]; !ok { return fmt.Errorf("algorithm field not defined") @@ -287,6 +315,19 @@ func (a *Account) GetAddress() types.Address { return address } +// GetEthAddress returns the Ethereum address object, if set. +func (a *Account) GetEthAddress() *ethCommon.Address { + if a.EthAddress == "" { + return nil + } + + _, ethAddr, err := helpers.ResolveEthOrOasisAddress(a.EthAddress) + if err != nil { + return nil + } + return ethAddr +} + // SetConfigFromFlags populates the kind-specific configuration from CLI flags. func (a *Account) SetConfigFromFlags() error { af, err := wallet.Load(a.Kind) diff --git a/examples/account/deposit-eth.y.out b/examples/account/deposit-eth.y.out index 0af71590..9cc048ae 100644 --- a/examples/account/deposit-eth.y.out +++ b/examples/account/deposit-eth.y.out @@ -2,7 +2,7 @@ You are about to sign the following transaction: Format: plain Method: consensus.Deposit Body: - To: oasis1qpupfu7e2n6pkezeaw0yhj8mcem8anj64ytrayne + To: 0x90adE3B7065fa715c7a150313877dF1d33e777D5 (oasis1qpupfu7e2n6pkezeaw0yhj8mcem8anj64ytrayne) Amount: 10.0 TEST Authorized signer(s): 1. Bx6gOixnxy15tCs09ua5DcKyX9uo2Forb32O6Hyjoc8= (ed25519) diff --git a/examples/account/transfer-eth.y.out b/examples/account/transfer-eth.y.out index 7af3cae9..07493384 100644 --- a/examples/account/transfer-eth.y.out +++ b/examples/account/transfer-eth.y.out @@ -2,7 +2,7 @@ You are about to sign the following transaction: Format: plain Method: accounts.Transfer Body: - To: test:dave (oasis1qrk58a6j2qn065m6p06jgjyt032f7qucy5wqeqpt) + To: test:dave (0xDce075E1C39b1ae0b75D554558b6451A226ffe00) Amount: 1.5 TEST Authorized signer(s): 1. cb+NHKt7JT4fumy0wQdkiBwO3P+DUh8ylozMpsu1xH4= (ed25519) diff --git a/examples/account/transfer-eth2.y.out b/examples/account/transfer-eth2.y.out index c1139ba6..62ff29ec 100644 --- a/examples/account/transfer-eth2.y.out +++ b/examples/account/transfer-eth2.y.out @@ -2,7 +2,7 @@ You are about to sign the following transaction: Format: plain Method: accounts.Transfer Body: - To: test:dave (oasis1qrk58a6j2qn065m6p06jgjyt032f7qucy5wqeqpt) + To: test:dave (0xDce075E1C39b1ae0b75D554558b6451A226ffe00) Amount: 1.5 TEST Authorized signer(s): 1. A1ik9X/7X/eGSoSYOKSIJqM7pZ5It/gHbF+wraxi33u3 (secp256k1eth) diff --git a/examples/account/transfer-subtract-fee.y.out b/examples/account/transfer-subtract-fee.y.out index 2ffe3631..e9baeb19 100644 --- a/examples/account/transfer-subtract-fee.y.out +++ b/examples/account/transfer-subtract-fee.y.out @@ -2,7 +2,7 @@ You are about to sign the following transaction: Format: plain Method: accounts.Transfer Body: - To: test:dave (oasis1qrk58a6j2qn065m6p06jgjyt032f7qucy5wqeqpt) + To: test:dave (0xDce075E1C39b1ae0b75D554558b6451A226ffe00) Amount: 0.9997228 TEST Authorized signer(s): 1. cb+NHKt7JT4fumy0wQdkiBwO3P+DUh8ylozMpsu1xH4= (ed25519) diff --git a/examples/addressbook/02-transfer.y.out b/examples/addressbook/02-transfer.y.out index f5e17704..6ce2c73d 100644 --- a/examples/addressbook/02-transfer.y.out +++ b/examples/addressbook/02-transfer.y.out @@ -2,7 +2,7 @@ You are about to sign the following transaction: Format: plain Method: accounts.Transfer Body: - To: meghan (oasis1qrjzcve7y6qp3nqs3n7ghavw68vkdh3epcv64ega) + To: meghan (0xBe8B38ED9b0794e7ab9EbEfC1e710b4F4EC6F6C1) Amount: 2.5 ROSE Authorized signer(s): 1. ArEjDxsPfDvfeLlity4mjGzy8E/nI4umiC8vYQh+eh/c (secp256k1eth) diff --git a/examples/paratime-remove/00-list.out b/examples/paratime-remove/00-list.out index 4596ce8a..aabbec74 100644 --- a/examples/paratime-remove/00-list.out +++ b/examples/paratime-remove/00-list.out @@ -4,9 +4,9 @@ mainnet emerald (*) 000000000000000000000000000000000000000000000000e2eaa99 mainnet sapphire 000000000000000000000000000000000000000000000000f80306c9858e7279 ROSE[18] (*) testnet cipher 0000000000000000000000000000000000000000000000000000000000000000 TEST[9] (*) testnet emerald (*) 00000000000000000000000000000000000000000000000072c8215e60d5bca7 TEST[18] (*) -testnet pontusx_dev 0000000000000000000000000000000000000000000000004febe52eb412b421 EUROe[18] (*) +testnet pontusx_dev 0000000000000000000000000000000000000000000000004febe52eb412b421 EURAU[18] (*) TEST[18] -testnet pontusx_test 00000000000000000000000000000000000000000000000004a6f9071c007069 EUROe[18] (*) +testnet pontusx_test 00000000000000000000000000000000000000000000000004a6f9071c007069 EURAU[18] (*) TEST[18] testnet sapphire 000000000000000000000000000000000000000000000000a6d1e3ebf60dff6c TEST[18] (*) testnet sapphire2 000000000000000000000000000000000000000000000000a6d1e3ebf60dff6d TEST[18] (*) diff --git a/examples/paratime-remove/02-list.out b/examples/paratime-remove/02-list.out index e86f5c63..36f745f0 100644 --- a/examples/paratime-remove/02-list.out +++ b/examples/paratime-remove/02-list.out @@ -4,8 +4,8 @@ mainnet emerald (*) 000000000000000000000000000000000000000000000000e2eaa99 mainnet sapphire 000000000000000000000000000000000000000000000000f80306c9858e7279 ROSE[18] (*) testnet cipher 0000000000000000000000000000000000000000000000000000000000000000 TEST[9] (*) testnet emerald (*) 00000000000000000000000000000000000000000000000072c8215e60d5bca7 TEST[18] (*) -testnet pontusx_dev 0000000000000000000000000000000000000000000000004febe52eb412b421 EUROe[18] (*) +testnet pontusx_dev 0000000000000000000000000000000000000000000000004febe52eb412b421 EURAU[18] (*) TEST[18] -testnet pontusx_test 00000000000000000000000000000000000000000000000004a6f9071c007069 EUROe[18] (*) +testnet pontusx_test 00000000000000000000000000000000000000000000000004a6f9071c007069 EURAU[18] (*) TEST[18] testnet sapphire 000000000000000000000000000000000000000000000000a6d1e3ebf60dff6c TEST[18] (*) diff --git a/examples/paratime/00-list.out b/examples/paratime/00-list.out index 3f7440c8..c277146d 100644 --- a/examples/paratime/00-list.out +++ b/examples/paratime/00-list.out @@ -4,8 +4,8 @@ mainnet emerald 000000000000000000000000000000000000000000000000e2eaa99 mainnet sapphire (*) 000000000000000000000000000000000000000000000000f80306c9858e7279 ROSE[18] (*) testnet cipher 0000000000000000000000000000000000000000000000000000000000000000 TEST[9] (*) testnet emerald 00000000000000000000000000000000000000000000000072c8215e60d5bca7 TEST[18] (*) -testnet pontusx_dev 0000000000000000000000000000000000000000000000004febe52eb412b421 EUROe[18] (*) +testnet pontusx_dev 0000000000000000000000000000000000000000000000004febe52eb412b421 EURAU[18] (*) TEST[18] -testnet pontusx_test 00000000000000000000000000000000000000000000000004a6f9071c007069 EUROe[18] (*) +testnet pontusx_test 00000000000000000000000000000000000000000000000004a6f9071c007069 EURAU[18] (*) TEST[18] testnet sapphire (*) 000000000000000000000000000000000000000000000000a6d1e3ebf60dff6c TEST[18] (*) diff --git a/examples/paratime/02-list.out b/examples/paratime/02-list.out index 7021835a..90aeb5a8 100644 --- a/examples/paratime/02-list.out +++ b/examples/paratime/02-list.out @@ -4,8 +4,8 @@ mainnet emerald 000000000000000000000000000000000000000000000000e2eaa99 mainnet sapphire (*) 000000000000000000000000000000000000000000000000f80306c9858e7279 ROSE[18] (*) testnet cipher (*) 0000000000000000000000000000000000000000000000000000000000000000 TEST[9] (*) testnet emerald 00000000000000000000000000000000000000000000000072c8215e60d5bca7 TEST[18] (*) -testnet pontusx_dev 0000000000000000000000000000000000000000000000004febe52eb412b421 EUROe[18] (*) +testnet pontusx_dev 0000000000000000000000000000000000000000000000004febe52eb412b421 EURAU[18] (*) TEST[18] -testnet pontusx_test 00000000000000000000000000000000000000000000000004a6f9071c007069 EUROe[18] (*) +testnet pontusx_test 00000000000000000000000000000000000000000000000004a6f9071c007069 EURAU[18] (*) TEST[18] testnet sapphire 000000000000000000000000000000000000000000000000a6d1e3ebf60dff6c TEST[18] (*) diff --git a/go.mod b/go.mod index cf7bc9b9..6e619919 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/oasisprotocol/cli go 1.25.4 -replace github.com/cometbft/cometbft => github.com/oasisprotocol/cometbft v0.37.9-oasis1 +replace github.com/cometbft/cometbft => github.com/oasisprotocol/cometbft v0.37.15-oasis1 require ( github.com/AlecAivazis/survey/v2 v2.3.7 @@ -15,11 +15,11 @@ require ( github.com/google/uuid v1.6.0 github.com/miguelmota/go-ethereum-hdwallet v0.1.3 github.com/mitchellh/mapstructure v1.5.0 - github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a + github.com/oasisprotocol/curve25519-voi v0.0.0-20251114093237-2ab5a27a1729 github.com/oasisprotocol/deoxysii v0.0.0-20220228165953-2091330c22b7 github.com/oasisprotocol/metadata-registry-tools v0.0.0-20220406100644-7e9a2b991920 - github.com/oasisprotocol/oasis-core/go v0.2505.0 - github.com/oasisprotocol/oasis-sdk/client-sdk/go v0.16.0 + github.com/oasisprotocol/oasis-core/go v0.2509.0 + github.com/oasisprotocol/oasis-sdk/client-sdk/go v0.16.1 github.com/olekukonko/tablewriter v1.1.2 github.com/opencontainers/image-spec v1.1.1 github.com/spf13/cobra v1.10.2 @@ -29,11 +29,11 @@ require ( github.com/tyler-smith/go-bip39 v1.1.0 github.com/wI2L/jsondiff v0.7.0 github.com/zondax/ledger-go v1.0.1 - golang.org/x/crypto v0.41.0 - golang.org/x/net v0.43.0 - golang.org/x/sys v0.36.0 - golang.org/x/term v0.34.0 - golang.org/x/text v0.28.0 + golang.org/x/crypto v0.45.0 + golang.org/x/net v0.47.0 + golang.org/x/sys v0.38.0 + golang.org/x/term v0.37.0 + golang.org/x/text v0.31.0 gopkg.in/yaml.v3 v3.0.1 oras.land/oras-go/v2 v2.6.0 ) @@ -42,12 +42,12 @@ require ( dario.cat/mergo v1.0.0 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6 // indirect - github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect + github.com/ProtonMail/go-crypto v1.1.3 // indirect github.com/a8m/envsubst v1.4.2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bits-and-blooms/bitset v1.20.0 // indirect - github.com/btcsuite/btcd v0.24.0 // indirect - github.com/btcsuite/btcd/btcutil v1.1.5 // indirect + github.com/btcsuite/btcd v0.24.2 // indirect + github.com/btcsuite/btcd/btcutil v1.1.6 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect github.com/btcsuite/btcutil v1.0.3-0.20201208143702-a53e38424cce // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect @@ -56,11 +56,11 @@ require ( github.com/clipperhouse/stringish v0.1.1 // indirect github.com/clipperhouse/uax29/v2 v2.3.0 // indirect github.com/cloudflare/circl v1.3.7 // indirect - github.com/cometbft/cometbft v0.37.15 // indirect + github.com/cometbft/cometbft v0.37.16 // indirect github.com/consensys/gnark-crypto v0.18.0 // indirect github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect - github.com/cyphar/filepath-securejoin v0.2.4 // indirect + github.com/cyphar/filepath-securejoin v0.2.5 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 // indirect github.com/dgraph-io/badger/v4 v4.5.1 // indirect @@ -78,8 +78,8 @@ require ( github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/fxamacker/cbor/v2 v2.4.0 // indirect github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.5.0 // indirect - github.com/go-git/go-git/v5 v5.11.0 // indirect + github.com/go-git/go-billy/v5 v5.6.0 // indirect + github.com/go-git/go-git/v5 v5.13.0 // indirect github.com/go-jose/go-jose/v4 v4.1.1 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect @@ -101,7 +101,7 @@ require ( github.com/klauspost/compress v1.18.0 // indirect github.com/klauspost/cpuid/v2 v2.2.10 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/libp2p/go-libp2p v0.42.0 // indirect + github.com/libp2p/go-libp2p v0.44.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.19 // indirect @@ -134,10 +134,10 @@ require ( github.com/prometheus/procfs v0.16.1 // indirect github.com/sagikazarmark/locafero v0.11.0 // indirect github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 // indirect - github.com/sergi/go-diff v1.3.1 // indirect + github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/shopspring/decimal v1.4.0 // indirect github.com/sirupsen/logrus v1.9.3 // indirect - github.com/skeema/knownhosts v1.2.1 // indirect + github.com/skeema/knownhosts v1.3.0 // indirect github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect github.com/spf13/afero v1.15.0 // indirect @@ -161,7 +161,7 @@ require ( go.uber.org/zap v1.27.0 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect golang.org/x/exp v0.0.0-20250606033433-dcc06ee1d476 // indirect - golang.org/x/sync v0.16.0 // indirect + golang.org/x/sync v0.18.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250818200422-3122310a409c // indirect google.golang.org/grpc v1.75.0 // indirect google.golang.org/grpc/security/advancedtls v0.0.0-20221004221323-12db695f1648 // indirect diff --git a/go.sum b/go.sum index d74a0cdd..8e4b4a7e 100644 --- a/go.sum +++ b/go.sum @@ -44,8 +44,8 @@ github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2 h1:+vx7roKuyA63n github.com/Netflix/go-expect v0.0.0-20220104043353-73e0943537d2/go.mod h1:HBCaDeC1lPdgDeDbhX8XFpy1jqjK0IBG8W5K+xYqA0w= github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6 h1:1zYrtlhrZ6/b6SAjLSfKzWtdgqK0U+HtH/VcBWh1BaU= github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6/go.mod h1:ioLG6R+5bUSO1oeGSDxOV3FADARuMoytZCSX6MEMQkI= -github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 h1:kkhsdkhsCvIsutKu5zLMgWtgh9YxGCNAw8Ad8hjwfYg= -github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= +github.com/ProtonMail/go-crypto v1.1.3 h1:nRBOetoydLeUb4nHajyO2bKqMLfWQ/ZPwkXqXxPxCFk= +github.com/ProtonMail/go-crypto v1.1.3/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE= github.com/a8m/envsubst v1.4.2 h1:4yWIHXOLEJHQEFd4UjrWDrYeYlV7ncFWJOCBRLOZHQg= github.com/a8m/envsubst v1.4.2/go.mod h1:MVUTQNGQ3tsjOOtKCNd+fl8RzhsXcDvvAEzkhGtlsbY= github.com/adrg/xdg v0.5.3 h1:xRnxJXne7+oWDatRhR1JLnvuccuIeCoBu2rtuLqQB78= @@ -64,16 +64,17 @@ github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6 github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd v0.22.0-beta.0.20220111032746-97732e52810c/go.mod h1:tjmYdS6MLJ5/s0Fj4DbLgSbDHbEqLJrtnHecBFkdz5M= github.com/btcsuite/btcd v0.23.5-0.20231215221805-96c9fd8078fd/go.mod h1:nm3Bko6zh6bWP60UxwoT5LzdGJsQJaPo6HjduXq9p6A= -github.com/btcsuite/btcd v0.24.0 h1:gL3uHE/IaFj6fcZSu03SvqPMSx7s/dPzfpG/atRwWdo= -github.com/btcsuite/btcd v0.24.0/go.mod h1:K4IDc1593s8jKXIF7yS7yCTSxrknB9z0STzc2j6XgE4= +github.com/btcsuite/btcd v0.24.2 h1:aLmxPguqxza+4ag8R1I2nnJjSu2iFn/kqtHTIImswcY= +github.com/btcsuite/btcd v0.24.2/go.mod h1:5C8ChTkl5ejr3WHj8tkQSCmydiMEPB0ZhQhehpq7Dgg= github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/btcec/v2 v2.3.5 h1:dpAlnAwmT1yIBm3exhT1/8iUSD98RDJM5vqJVQDQLiU= github.com/btcsuite/btcd/btcec/v2 v2.3.5/go.mod h1:m22FrOAiuxl/tht9wIqAoGHcbnCCaPWyauO8y2LGGtQ= github.com/btcsuite/btcd/btcutil v1.0.0/go.mod h1:Uoxwv0pqYWhD//tfTiipkxNfdhG9UrLwaeswfjfdF0A= github.com/btcsuite/btcd/btcutil v1.1.0/go.mod h1:5OapHB7A2hBBWLm48mmw4MOHNJCcUBTwmWH/0Jn8VHE= -github.com/btcsuite/btcd/btcutil v1.1.5 h1:+wER79R5670vs/ZusMTF1yTcRYE5GUsFbdjdisflzM8= github.com/btcsuite/btcd/btcutil v1.1.5/go.mod h1:PSZZ4UitpLBWzxGd5VGOrLnmOjtPP/a6HaFo12zMs00= +github.com/btcsuite/btcd/btcutil v1.1.6 h1:zFL2+c3Lb9gEgqKNzowKUPQNb8jV7v5Oaodi/AYFd6c= +github.com/btcsuite/btcd/btcutil v1.1.6/go.mod h1:9dFymx8HpuLqBnsPELrImQeTQfKBQqzqGbbV3jK55aE= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= @@ -89,7 +90,6 @@ github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku github.com/btcsuite/snappy-go v1.0.0/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -105,7 +105,6 @@ github.com/clipperhouse/stringish v0.1.1 h1:+NSqMOr3GR6k1FdRhhnXrLfztGzuG+VuFDfa github.com/clipperhouse/stringish v0.1.1/go.mod h1:v/WhFtE1q0ovMta2+m+UbpZ+2/HEXNWYXQgCt4hdOzA= github.com/clipperhouse/uax29/v2 v2.3.0 h1:SNdx9DVUqMoBuBoW3iLOj4FQv3dN5mDtuqwuhIGpJy4= github.com/clipperhouse/uax29/v2 v2.3.0/go.mod h1:Wn1g7MK6OoeDT0vL+Q0SQLDz/KpfsVRgg6W7ihQeh4g= -github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/circl v1.3.7 h1:qlCDlTPz2n9fu58M0Nh1J/JzcFpfgkFHHX3O35r5vcU= github.com/cloudflare/circl v1.3.7/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -122,8 +121,8 @@ github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a/go.mod h1:sTwz github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0= github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= -github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= -github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/cyphar/filepath-securejoin v0.2.5 h1:6iR5tXJ/e6tJZzzdMc1km3Sa7RRIVBKAK32O2s7AYfo= +github.com/cyphar/filepath-securejoin v0.2.5/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -158,8 +157,8 @@ github.com/eapache/channels v1.1.0 h1:F1taHcn7/F0i8DYqKXJnyhJcVpp2kgFcNePxXtnyu4 github.com/eapache/channels v1.1.0/go.mod h1:jMm2qB5Ubtg9zLd+inMZd2/NUvXgzmWXsDaLyQIGfH0= github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/elazarl/goproxy v1.2.1 h1:njjgvO6cRG9rIqN2ebkqy6cQz2Njkx7Fsfv/zIZqgug= +github.com/elazarl/goproxy v1.2.1/go.mod h1:YfEbZtqP4AetfO6d40vWchF3znWX7C7Vd6ZMfdL8z64= github.com/emicklei/dot v1.6.2 h1:08GN+DD79cy/tzN6uLCT84+2Wk9u+wvqP+Hkx/dIR8A= github.com/emicklei/dot v1.6.2/go.mod h1:DeV7GvQtIw4h2u73RKBkkFdvVAz0D9fzeJrgPW6gy/s= github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= @@ -196,16 +195,16 @@ github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= github.com/github/go-spdx/v2 v2.3.3 h1:QI7evnHWEfWkT54eJwkoV/f3a0xD3gLlnVmT5wQG6LE= github.com/github/go-spdx/v2 v2.3.3/go.mod h1:2ZxKsOhvBp+OYBDlsGnUMcchLeo2mrpEBn2L1C+U3IQ= -github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= -github.com/gliderlabs/ssh v0.3.5/go.mod h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4= +github.com/gliderlabs/ssh v0.3.8 h1:a4YXD1V7xMF9g5nTkdfnja3Sxy1PVDCj1Zg4Wb8vY6c= +github.com/gliderlabs/ssh v0.3.8/go.mod h1:xYoytBv1sV0aL3CavoDuJIQNURXkkfPA/wxQ1pL1fAU= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= -github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= +github.com/go-git/go-billy/v5 v5.6.0 h1:w2hPNtoehvJIxR00Vb4xX94qHQi/ApZfX+nBE2Cjio8= +github.com/go-git/go-billy/v5 v5.6.0/go.mod h1:sFDq7xD3fn3E0GOwUSZqHo9lrkmx8xJhA0ZrfvjBRGM= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399/go.mod h1:1OCfN199q1Jm3HZlxleg+Dw/mwps2Wbk9frAWm+4FII= -github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4= -github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= +github.com/go-git/go-git/v5 v5.13.0 h1:vLn5wlGIh/X78El6r3Jr+30W16Blk0CTcxTYcYPWi5E= +github.com/go-git/go-git/v5 v5.13.0/go.mod h1:Wjo7/JyVKtQgUNdXYXIepzWfJQkUEIGvkvVkiXRR/zw= 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= @@ -221,8 +220,6 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= -github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= -github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= @@ -273,8 +270,6 @@ github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= -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/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= @@ -284,8 +279,6 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf 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-20250607225305-033d6d78b36a h1://KbezygeMJZCSHH+HgUZiTeSoiuFspbMg1ge+eFj18= -github.com/google/pprof v0.0.0-20250607225305-033d6d78b36a/go.mod h1:5hDyRhoBCxViHszMt12TnOpEI4VVi+U8Gm9iphldiMA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= @@ -327,8 +320,8 @@ github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABo github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jhump/protoreflect v1.12.1-0.20220721211354-060cc04fc18b h1:izTof8BKh/nE1wrKOrloNA5q4odOarjf+Xpe+4qow98= -github.com/jhump/protoreflect v1.12.1-0.20220721211354-060cc04fc18b/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= +github.com/jhump/protoreflect v1.6.0 h1:h5jfMVslIg6l29nsMs0D8Wj17RDVdNYti0vDN/PZZoE= +github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74= github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= 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= @@ -359,14 +352,14 @@ github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6 github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/libp2p/go-flow-metrics v0.2.0 h1:EIZzjmeOE6c8Dav0sNv35vhZxATIXWZg6j/C08XmmDw= github.com/libp2p/go-flow-metrics v0.2.0/go.mod h1:st3qqfu8+pMfh+9Mzqb2GTiwrAGjIPszEjZmtksN8Jc= -github.com/libp2p/go-libp2p v0.42.0 h1:A8foZk+ZEhZTv0Jb++7xUFlrFhBDv4j2Vh/uq4YX+KE= -github.com/libp2p/go-libp2p v0.42.0/go.mod h1:4NGcjbD9OIvFiSRb0XueCO19zJ4kSPK5vkyyOUYmMro= +github.com/libp2p/go-libp2p v0.44.0 h1:5Gtt8OrF8yiXmH+Mx4+/iBeFRMK1TY3a8OrEBDEqAvs= +github.com/libp2p/go-libp2p v0.44.0/go.mod h1:NovCojezAt4dnDd4fH048K7PKEqH0UFYYqJRjIIu8zc= github.com/libp2p/go-libp2p-asn-util v0.4.1 h1:xqL7++IKD9TBFMgnLPZR6/6iYhawHKHl950SO9L6n94= github.com/libp2p/go-libp2p-asn-util v0.4.1/go.mod h1:d/NI6XZ9qxw67b4e+NgpQexCIiFYJjErASrYW4PFDN8= github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= -github.com/libp2p/go-netroute v0.2.2 h1:Dejd8cQ47Qx2kRABg6lPwknU7+nBnFRpko45/fFPuZ8= -github.com/libp2p/go-netroute v0.2.2/go.mod h1:Rntq6jUAH0l9Gg17w5bFGhcC9a+vk4KNXs6s7IljKYE= +github.com/libp2p/go-netroute v0.3.0 h1:nqPCXHmeNmgTJnktosJ/sIef9hvwYCrsLxXmfNks/oc= +github.com/libp2p/go-netroute v0.3.0/go.mod h1:Nkd5ShYgSMS5MUKy/MU2T57xFoOKvvLR92Lic48LEyA= github.com/libp2p/go-reuseport v0.4.0 h1:nR5KU7hD0WxXCJbmw7r2rhRYruNRl2koHw8fQscQm2s= github.com/libp2p/go-reuseport v0.4.0/go.mod h1:ZtI03j/wO5hZVDFo2jKywN6bYKWLOy8Se6DrI2E1cLU= github.com/libp2p/go-yamux/v5 v5.0.1 h1:f0WoX/bEF2E8SbE4c/k1Mo+/9z0O4oC/hWEA+nfYRSg= @@ -429,18 +422,18 @@ github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOEL github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/oasisprotocol/cometbft v0.37.9-oasis1 h1:j48kZoMX2taUes6eXuYdTLBAcH6PuStxOIBVlH7D3eQ= -github.com/oasisprotocol/cometbft v0.37.9-oasis1/go.mod h1:hauDXUOQKEr48oRiPx+XGU/W+FY2xe3uOhwV4/k6DGM= -github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a h1:dlRvE5fWabOchtH7znfiFCcOvmIYgOeAS5ifBXBlh9Q= -github.com/oasisprotocol/curve25519-voi v0.0.0-20230904125328-1f23a7beb09a/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= +github.com/oasisprotocol/cometbft v0.37.15-oasis1 h1:2SOAr187qh8poRjNX+buawO46mnoIbBW4+gAUnSddIU= +github.com/oasisprotocol/cometbft v0.37.15-oasis1/go.mod h1:PeXF4BJSZ3DvCqMAKOqw2pcbbehw8XpgZBS7TlYbD2A= +github.com/oasisprotocol/curve25519-voi v0.0.0-20251114093237-2ab5a27a1729 h1:yfQ2sO9WJXUAIUR+g7NUkxJSKCAFJcR5sUDu+ZmjTZI= +github.com/oasisprotocol/curve25519-voi v0.0.0-20251114093237-2ab5a27a1729/go.mod h1:hVoHR2EVESiICEMbg137etN/Lx+lSrHPTD39Z/uE+2s= github.com/oasisprotocol/deoxysii v0.0.0-20220228165953-2091330c22b7 h1:1102pQc2SEPp5+xrS26wEaeb26sZy6k9/ZXlZN+eXE4= github.com/oasisprotocol/deoxysii v0.0.0-20220228165953-2091330c22b7/go.mod h1:UqoUn6cHESlliMhOnKLWr+CBH+e3bazUPvFj1XZwAjs= github.com/oasisprotocol/metadata-registry-tools v0.0.0-20220406100644-7e9a2b991920 h1:rugJRYKamNl6WGBaU+b0wLQFkYcsnBr0ycX5QmB+AYU= github.com/oasisprotocol/metadata-registry-tools v0.0.0-20220406100644-7e9a2b991920/go.mod h1:MKr/giwakLyCCjSWh0W9Pbaf7rDD1K96Wr57OhNoUK0= -github.com/oasisprotocol/oasis-core/go v0.2505.0 h1:V2O5f3JsHZPg+lQ9xIP898F3nxu0qdiq7g5nl2+CBiA= -github.com/oasisprotocol/oasis-core/go v0.2505.0/go.mod h1:zkYXWppUCs+/obBQ+AsSqKr9KwKE7Jtd1qlg83xoLHQ= -github.com/oasisprotocol/oasis-sdk/client-sdk/go v0.16.0 h1:RR18vzfrczejDUsD5nXln6weBNqUZoslh0rEpXcieDk= -github.com/oasisprotocol/oasis-sdk/client-sdk/go v0.16.0/go.mod h1:cLtdOgAtSsVGQAZ1KWCXCgnj9CzNeOOEWUMZB0PIBeA= +github.com/oasisprotocol/oasis-core/go v0.2509.0 h1:M8r/jGqtE2ZYU6bUKruNM8/9YLQnDx2l1+TaAN5tj60= +github.com/oasisprotocol/oasis-core/go v0.2509.0/go.mod h1:QtRUjSse8fqAF1TeWMn1SZlTtmkNBFJw8u4Q7OdXiqM= +github.com/oasisprotocol/oasis-sdk/client-sdk/go v0.16.1 h1:nYd83QOnWavxAOiltVAsaOhVze+NLrYLlY2Ioll89io= +github.com/oasisprotocol/oasis-sdk/client-sdk/go v0.16.1/go.mod h1:XWVBXiDxjr39P5Q1DdliPD80G6eduTaf83IZWefBau0= github.com/oklog/run v1.0.0 h1:Ru7dDtJNOyC66gQ5dQmaCa0qIsAUFY3sFpK1Xk8igrw= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/olekukonko/cat v0.0.0-20250911104152-50322a0618f6 h1:zrbMGy9YXpIeTnGj4EljqMiZsIcE09mmF8XsD5AYOJc= @@ -455,15 +448,12 @@ github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.4 h1:29JGrr5oVBm5ulCWet69zQkzWipVXIol6ygQUe/EzNc= -github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus= -github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8= github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= +github.com/onsi/gomega v1.36.3 h1:hID7cr8t3Wp26+cYnfcjR6HpJ00fdogN6dqZ1t6IylU= +github.com/onsi/gomega v1.36.3/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= @@ -528,10 +518,10 @@ github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzM github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= -github.com/quic-go/quic-go v0.52.0 h1:/SlHrCRElyaU6MaEPKqKr9z83sBg2v4FLLvWM+Z47pA= -github.com/quic-go/quic-go v0.52.0/go.mod h1:MFlGGpcpJqRAfmYi6NC2cptDPSxRWTOGNuP4wqrWmzQ= -github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66 h1:4WFk6u3sOT6pLa1kQ50ZVdm8BQFgJNA117cepZxtLIg= -github.com/quic-go/webtransport-go v0.8.1-0.20241018022711-4ac2c9250e66/go.mod h1:Vp72IJajgeOL6ddqrAhmp7IM9zbTcgkQxD/YdxrVwMw= +github.com/quic-go/quic-go v0.55.0 h1:zccPQIqYCXDt5NmcEabyYvOnomjs8Tlwl7tISjJh9Mk= +github.com/quic-go/quic-go v0.55.0/go.mod h1:DR51ilwU1uE164KuWXhinFcKWGlEjzys2l8zUl5Ss1U= +github.com/quic-go/webtransport-go v0.9.0 h1:jgys+7/wm6JarGDrW+lD/r9BGqBAmqY/ssklE09bA70= +github.com/quic-go/webtransport-go v0.9.0/go.mod h1:4FUYIiUc75XSsF6HShcLeXXYZJ9AGwo/xh3L8M/P1ao= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= @@ -540,8 +530,8 @@ github.com/sagikazarmark/locafero v0.11.0 h1:1iurJgmM9G3PA/I+wWYIOw/5SyBtxapeHDc github.com/sagikazarmark/locafero v0.11.0/go.mod h1:nVIGvgyzw595SUSUE6tvCp3YYTeHs15MvlmU87WwIik= github.com/santhosh-tekuri/jsonschema/v6 v6.0.1 h1:PKK9DyHxif4LZo+uQSgXNqs0jj5+xZwwfKHgph2lxBw= github.com/santhosh-tekuri/jsonschema/v6 v6.0.1/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= -github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= -github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= +github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= @@ -549,8 +539,8 @@ github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+D github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= -github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= +github.com/skeema/knownhosts v1.3.0 h1:AM+y0rI04VksttfwjkSTNQorvGqmwATnvnAHpSgc0LY= +github.com/skeema/knownhosts v1.3.0/go.mod h1:sPINvnADmT/qYH1kfv+ePMmOBTH6Tbl7b5LvTDjFK7M= github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 h1:+jumHNA0Wrelhe64i8F6HNlS8pkoyMv5sreGx2Ry5Rw= github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8/go.mod h1:3n1Cwaq1E1/1lhQhtRK2ts/ZwZEhjcQeJQ1RuC6Q/8U= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= @@ -581,6 +571,7 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= 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/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= @@ -651,8 +642,6 @@ go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFh go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps= go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4= go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0= -go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= -go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= go.uber.org/dig v1.19.0 h1:BACLhebsYdpQ7IROQ1AGPjrXcP5dF80U3gKoFzbaq/4= go.uber.org/dig v1.19.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= go.uber.org/fx v1.24.0 h1:wE8mruvpg2kiiL1Vqd0CC+tr0/24XIB10Iwp2lLWzkg= @@ -676,10 +665,8 @@ golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/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.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= -golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= +golang.org/x/crypto v0.45.0 h1:jMBrvKuj23MTlT0bQEOBcAE0mjg8mK9RXFhRH6nyF3Q= +golang.org/x/crypto v0.45.0/go.mod h1:XTGrrkGJve7CYK7J8PEww4aY7gM3qMCElcJQ8n8JdX4= 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= @@ -713,9 +700,8 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB 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.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= -golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= +golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= +golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -749,11 +735,8 @@ golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= -golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= +golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY= +golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU= 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= @@ -768,9 +751,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ 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-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= -golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I= +golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -818,19 +800,15 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/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-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= -golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc= +golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8 h1:LvzTn0GQhWuvKH/kVRS3R3bVAsdQWI7hvfLHGgh9+lU= +golang.org/x/telemetry v0.0.0-20251008203120-078029d740a8/go.mod h1:Pi4ztBfryZoJEkyFTI5/Ocsu2jXyDr6iSdgJiYE/uwE= 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.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= -golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= +golang.org/x/term v0.37.0 h1:8EGAD0qCmHYZg6J17DvsMy9/wJ7/D/4pV/wfnld5lTU= +golang.org/x/term v0.37.0/go.mod h1:5pB4lxRNYYVZuTLmy8oR2BH8dflOR+IbTYFD8fi3254= 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= @@ -839,10 +817,8 @@ golang.org/x/text v0.3.3/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.4.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= -golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= -golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= +golang.org/x/text v0.31.0 h1:aC8ghyu4JhP8VojJ2lEHBnochRno1sgL6nEi9WGFGMM= +golang.org/x/text v0.31.0/go.mod h1:tKRAlv61yKIjGGHX/4tP1LTbc13YSec1pxVEWXzfoeM= 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= @@ -889,9 +865,8 @@ golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200806022845-90696ccdc692/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= -golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= +golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= 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=