mirror of
				https://source.quilibrium.com/quilibrium/ceremonyclient.git
				synced 2025-10-31 21:18:59 +00:00 
			
		
		
		
	v2.0.0-p1 + QClient (#296)
This commit is contained in:
		
							parent
							
								
									2f03d021c7
								
							
						
					
					
						commit
						389ada9f28
					
				| @ -40,7 +40,12 @@ RUN go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest | ||||
| # Build and install qclient | ||||
| WORKDIR /opt/ceremonyclient/client | ||||
| 
 | ||||
| RUN go build -o qclient ./main.go | ||||
| RUN ./build.sh -o qclient && cp qclient /go/bin | ||||
| 
 | ||||
| # Allows exporting single binary | ||||
| FROM scratch as qclient | ||||
| COPY --from=build /go/bin/qclient /qclient | ||||
| ENTRYPOINT [ "/qclient" ] | ||||
| 
 | ||||
| # Allows exporting single binary | ||||
| FROM scratch AS node | ||||
|  | ||||
| @ -38,16 +38,33 @@ tasks: | ||||
|       - bls48581/generate.sh | ||||
|       - node/build.sh -o build/arm64_macos/node | ||||
| 
 | ||||
|   build_qclient_arm64_macos: | ||||
|     desc: Build the QClient node binary for MacOS ARM. Outputs to client/build | ||||
|     cmds: | ||||
|       - vdf/generate.sh | ||||
|       - bls48581/generate.sh | ||||
|       - client/build.sh -o build/arm64_macos/qclient | ||||
| 
 | ||||
|   build_node_arm64_linux: | ||||
|     desc: Build the Quilibrium node binary for ARM64 Linux. Outputs to node/build. | ||||
|     cmds: | ||||
|       - docker build --platform linux/arm64 -f Dockerfile.source --output node/build/arm64_linux --target=node . | ||||
| 
 | ||||
|   build_qclient_arm64_linux: | ||||
|     desc: Build the QClient node binary for ARM64 Linux. Outputs to client/build. | ||||
|     cmds: | ||||
|       - docker build --platform linux/arm64 -f Dockerfile.source --output client/build/arm64_linux --target=qclient . | ||||
| 
 | ||||
|   build_node_amd64_linux: | ||||
|     desc: Build the Quilibrium node binary for AMD64 Linux. Outputs to node/build. | ||||
|     cmds: | ||||
|       - docker build --platform linux/amd64 -f Dockerfile.source --output node/build/amd64_linux --target=node . | ||||
| 
 | ||||
|   build_qclient_amd64_linux: | ||||
|     desc: Build the QClient node binary for AMD64 Linux. Outputs to node/build. | ||||
|     cmds: | ||||
|       - docker build --platform linux/amd64 -f Dockerfile.source --output client/build/amd64_linux --target=qclient . | ||||
| 
 | ||||
|   build:source: | ||||
|     desc: Build the Quilibrium docker image from source. | ||||
|     cmds: | ||||
|  | ||||
							
								
								
									
										35
									
								
								client/build.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										35
									
								
								client/build.sh
									
									
									
									
									
										Executable file
									
								
							| @ -0,0 +1,35 @@ | ||||
| #!/bin/bash | ||||
| set -euxo pipefail | ||||
| 
 | ||||
| # This script builds the node binary for the current platform and statically links it with VDF static lib. | ||||
| # Assumes that the VDF library has been built by running the generate.sh script in the `../vdf` directory. | ||||
| 
 | ||||
| ROOT_DIR="${ROOT_DIR:-$( cd "$(dirname "$(realpath "$( dirname "${BASH_SOURCE[0]}" )")")" >/dev/null 2>&1 && pwd )}" | ||||
| 
 | ||||
| CLIENT_DIR="$ROOT_DIR/client" | ||||
| BINARIES_DIR="$ROOT_DIR/target/release" | ||||
| 
 | ||||
| pushd "$CLIENT_DIR" > /dev/null | ||||
| 
 | ||||
| export CGO_ENABLED=1 | ||||
| 
 | ||||
| os_type="$(uname)" | ||||
| case "$os_type" in | ||||
|     "Darwin") | ||||
|         # Check if the architecture is ARM | ||||
|         if [[ "$(uname -m)" == "arm64" ]]; then | ||||
|             # MacOS ld doesn't support -Bstatic and -Bdynamic, so it's important that there is only a static version of the library | ||||
|             go build -ldflags "-linkmode 'external' -extldflags '-L$BINARIES_DIR -lvdf -lbls48581 -ldl -lm'" "$@" | ||||
|         else | ||||
|             echo "Unsupported platform" | ||||
|             exit 1 | ||||
|         fi | ||||
|         ;; | ||||
|     "Linux") | ||||
|         go build -ldflags "-linkmode 'external' -extldflags '-L$BINARIES_DIR -Wl,-Bstatic -lvdf -lbls48581 -Wl,-Bdynamic -ldl -lm'" "$@" | ||||
|         ;; | ||||
|     *) | ||||
|         echo "Unsupported platform" | ||||
|         exit 1 | ||||
|         ;; | ||||
| esac | ||||
| @ -2,8 +2,6 @@ package cmd | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"math/big" | ||||
| 	"os" | ||||
| 
 | ||||
| 	"github.com/spf13/cobra" | ||||
| ) | ||||
| @ -18,18 +16,7 @@ var acceptCmd = &cobra.Command{ | ||||
| 	PendingTransaction - the address of the pending transfer | ||||
| 	`, | ||||
| 	Run: func(cmd *cobra.Command, args []string) { | ||||
| 		if len(args) != 1 { | ||||
| 			fmt.Println("invalid command") | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 
 | ||||
| 		_, ok := new(big.Int).SetString(args[0], 0) | ||||
| 		if !ok { | ||||
| 			fmt.Println("invalid PendingTransaction") | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 
 | ||||
| 		fmt.Println("25 QUIL (Coin 0x2688997f2776ab5993894ed04fcdac05577cf2494ddfedf356ebf8bd3de464ab)") | ||||
| 		fmt.Println("command not yet available") | ||||
| 	}, | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -10,7 +10,7 @@ var allCmd = &cobra.Command{ | ||||
| 	Use:   "all", | ||||
| 	Short: "Mints all available token rewards", | ||||
| 	Run: func(cmd *cobra.Command, args []string) { | ||||
| 		fmt.Println("1520.381923 QUIL (Coin 0x162ad88c319060b4f5ea6dbf9a0c2cd82d3d70dfc22d5fc99ca5371083d68416)") | ||||
| 		fmt.Println("command not yet available") | ||||
| 	}, | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -1,16 +1,50 @@ | ||||
| package cmd | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"math/big" | ||||
| 
 | ||||
| 	"github.com/iden3/go-iden3-crypto/poseidon" | ||||
| 	"github.com/spf13/cobra" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/protobufs" | ||||
| ) | ||||
| 
 | ||||
| var balanceCmd = &cobra.Command{ | ||||
| 	Use:   "balance", | ||||
| 	Short: "Lists the total balance of tokens in the managing account", | ||||
| 	Run: func(cmd *cobra.Command, args []string) { | ||||
| 		fmt.Println("1545.381923 QUIL (Account 0x026a5cf3d486b8e8733060d6ce0060074616f0f925671a0886faef744412dc8a)") | ||||
| 		conn, err := GetGRPCClient() | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 		defer conn.Close() | ||||
| 
 | ||||
| 		client := protobufs.NewNodeServiceClient(conn) | ||||
| 		peerId := GetPeerIDFromConfig(NodeConfig) | ||||
| 		addr, err := poseidon.HashBytes([]byte(peerId)) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 
 | ||||
| 		addrBytes := addr.FillBytes(make([]byte, 32)) | ||||
| 		info, err := client.GetTokenInfo( | ||||
| 			context.Background(), | ||||
| 			&protobufs.GetTokenInfoRequest{ | ||||
| 				Address: addrBytes, | ||||
| 			}, | ||||
| 		) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 
 | ||||
| 		if info.OwnedTokens == nil { | ||||
| 			panic("invalid response from RPC") | ||||
| 		} | ||||
| 		tokens := new(big.Int).SetBytes(info.OwnedTokens) | ||||
| 		conversionFactor, _ := new(big.Int).SetString("1DCD65000", 16) | ||||
| 		r := new(big.Rat).SetFrac(tokens, conversionFactor) | ||||
| 		fmt.Println("Total balance:", r.FloatString(12), "QUIL") | ||||
| 	}, | ||||
| } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										51764
									
								
								client/cmd/bridged.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51764
									
								
								client/cmd/bridged.json
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1,17 +1,59 @@ | ||||
| package cmd | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"encoding/hex" | ||||
| 	"fmt" | ||||
| 	"math/big" | ||||
| 
 | ||||
| 	"github.com/iden3/go-iden3-crypto/poseidon" | ||||
| 	"github.com/spf13/cobra" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/execution/intrinsics/token" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/protobufs" | ||||
| ) | ||||
| 
 | ||||
| var coinsCmd = &cobra.Command{ | ||||
| 	Use:   "coins", | ||||
| 	Short: "Lists all coins under control of the managing account", | ||||
| 	Run: func(cmd *cobra.Command, args []string) { | ||||
| 		fmt.Println("25.0 QUIL (Coin 0x1148092cdce78c721835601ef39f9c2cd8b48b7787cbea032dd3913a4106a58d)") | ||||
| 		fmt.Println("1520.381923 QUIL (Coin 0x162ad88c319060b4f5ea6dbf9a0c2cd82d3d70dfc22d5fc99ca5371083d68416)") | ||||
| 		conn, err := GetGRPCClient() | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 		defer conn.Close() | ||||
| 
 | ||||
| 		client := protobufs.NewNodeServiceClient(conn) | ||||
| 		peerId := GetPeerIDFromConfig(NodeConfig) | ||||
| 		addr, err := poseidon.HashBytes([]byte(peerId)) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 
 | ||||
| 		addrBytes := addr.FillBytes(make([]byte, 32)) | ||||
| 		resp, err := client.GetTokensByAccount( | ||||
| 			context.Background(), | ||||
| 			&protobufs.GetTokensByAccountRequest{ | ||||
| 				Address: addrBytes, | ||||
| 			}, | ||||
| 		) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 
 | ||||
| 		if len(resp.Coins) != len(resp.FrameNumbers) { | ||||
| 			panic("invalid response from RPC") | ||||
| 		} | ||||
| 
 | ||||
| 		for i, coin := range resp.Coins { | ||||
| 			amount := new(big.Int).SetBytes(coin.Amount) | ||||
| 			conversionFactor, _ := new(big.Int).SetString("1DCD65000", 16) | ||||
| 			r := new(big.Rat).SetFrac(amount, conversionFactor) | ||||
| 			addr, err := token.GetAddressOfCoin(coin, resp.FrameNumbers[i]) | ||||
| 			if err != nil { | ||||
| 				panic(err) | ||||
| 			} | ||||
| 			fmt.Println(r.FloatString(12), "QUIL (Coin 0x", hex.EncodeToString(addr), ")") | ||||
| 		} | ||||
| 	}, | ||||
| } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										12
									
								
								client/cmd/config.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								client/cmd/config.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| package cmd | ||||
| 
 | ||||
| import "github.com/spf13/cobra" | ||||
| 
 | ||||
| var configCmd = &cobra.Command{ | ||||
| 	Use:   "config", | ||||
| 	Short: "Performs a configuration operation", | ||||
| } | ||||
| 
 | ||||
| func init() { | ||||
| 	rootCmd.AddCommand(configCmd) | ||||
| } | ||||
| @ -10,13 +10,10 @@ import ( | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/cloudflare/circl/sign/ed448" | ||||
| 	"github.com/iden3/go-iden3-crypto/poseidon" | ||||
| 	libP2pCrypto "github.com/libp2p/go-libp2p/core/crypto" | ||||
| 	"github.com/mr-tron/base58" | ||||
| 	"github.com/pkg/errors" | ||||
| 	"github.com/spf13/cobra" | ||||
| 	"go.uber.org/zap" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/config" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/keys" | ||||
| ) | ||||
| 
 | ||||
| @ -25,10 +22,9 @@ var crossMintCmd = &cobra.Command{ | ||||
| 	Short: "Signs a payload from the Quilibrium bridge to mint tokens on Ethereum L1 and prints the result to stdout", | ||||
| 	Long: `Signs a payload from the Quilibrium bridge to mint tokens on Ethereum L1 and prints the result to stdout": | ||||
| 	 | ||||
| 	cross-mint <Payload> [<Voucher File Path>] | ||||
| 	cross-mint <Payload> | ||||
| 	 | ||||
| 	Payload – the hex-encoded payload from the Quilibrium bridge with optional 0x-prefix, must be specified | ||||
| 	Voucher File Path – (optional) the path to a voucher private key, from the initial KZG ceremony | ||||
| 	`, | ||||
| 	Run: func(cmd *cobra.Command, args []string) { | ||||
| 		if len(args) < 1 { | ||||
| @ -41,63 +37,7 @@ var crossMintCmd = &cobra.Command{ | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 
 | ||||
| 		if len(args) == 2 { | ||||
| 			rawVoucherHex, err := os.ReadFile(args[1]) | ||||
| 			if err != nil { | ||||
| 				fmt.Printf("invalid file: %s\n", args[1]) | ||||
| 				os.Exit(1) | ||||
| 			} | ||||
| 
 | ||||
| 			rawVoucherKey, err := hex.DecodeString(string(rawVoucherHex)) | ||||
| 			if err != nil { | ||||
| 				panic(errors.Wrap(err, "cross mint")) | ||||
| 			} | ||||
| 
 | ||||
| 			ed448Key := ed448.PrivateKey(rawVoucherKey) | ||||
| 
 | ||||
| 			result, err := CrossMint(&CrossMintArgs{ | ||||
| 				Payload:    args[0], | ||||
| 				PeerKey:    ed448Key, | ||||
| 				ProvingKey: ed448Key, | ||||
| 			}) | ||||
| 			if err != nil { | ||||
| 				panic(errors.Wrap(err, "error cross minting")) | ||||
| 			} | ||||
| 
 | ||||
| 			pubkeyBytes := ed448Key.Public().(ed448.PublicKey) | ||||
| 
 | ||||
| 			addr, err := poseidon.HashBytes(pubkeyBytes) | ||||
| 			if err != nil { | ||||
| 				panic(errors.Wrap(err, "error cross minting")) | ||||
| 			} | ||||
| 
 | ||||
| 			addrBytes := addr.Bytes() | ||||
| 			addrBytes = append(make([]byte, 32-len(addrBytes)), addrBytes...) | ||||
| 
 | ||||
| 			// Print the result
 | ||||
| 			fmt.Println("Voucher ID: " + base58.Encode(addrBytes)) | ||||
| 
 | ||||
| 			jsonResult, err := json.Marshal(result) | ||||
| 			if err != nil { | ||||
| 				panic(errors.Wrap(err, "error marshaling result to json")) | ||||
| 			} | ||||
| 			fmt.Println(string(jsonResult)) | ||||
| 			os.Exit(0) | ||||
| 		} | ||||
| 
 | ||||
| 		_, err := os.Stat(configDirectory) | ||||
| 		if os.IsNotExist(err) { | ||||
| 			fmt.Printf("config directory doesn't exist: %s\n", configDirectory) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 
 | ||||
| 		config, err := config.LoadConfig(configDirectory, "") | ||||
| 		if err != nil { | ||||
| 			fmt.Printf("invalid config directory: %s\n", configDirectory) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 
 | ||||
| 		rawPeerKey, err := hex.DecodeString(config.P2P.PeerPrivKey) | ||||
| 		rawPeerKey, err := hex.DecodeString(NodeConfig.P2P.PeerPrivKey) | ||||
| 		if err != nil { | ||||
| 			panic(errors.Wrap(err, "cross mint")) | ||||
| 		} | ||||
| @ -117,10 +57,10 @@ var crossMintCmd = &cobra.Command{ | ||||
| 		// `config.Key.KeyStoreFile.Path` defaults to `.config/keys.yml`.
 | ||||
| 		// We do our best here to make sure the  configuration value is taken into
 | ||||
| 		// account if it was changed.
 | ||||
| 		if !filepath.IsAbs(config.Key.KeyStoreFile.Path) { | ||||
| 			config.Key.KeyStoreFile.Path = filepath.Join( | ||||
| 		if !filepath.IsAbs(NodeConfig.Key.KeyStoreFile.Path) { | ||||
| 			NodeConfig.Key.KeyStoreFile.Path = filepath.Join( | ||||
| 				configDirectory, | ||||
| 				filepath.Base(config.Key.KeyStoreFile.Path), | ||||
| 				filepath.Base(NodeConfig.Key.KeyStoreFile.Path), | ||||
| 			) | ||||
| 		} | ||||
| 
 | ||||
| @ -129,8 +69,8 @@ var crossMintCmd = &cobra.Command{ | ||||
| 			panic(errors.Wrap(err, "cross mint")) | ||||
| 		} | ||||
| 
 | ||||
| 		fileKeyManager := keys.NewFileKeyManager(config.Key, logger) | ||||
| 		provingKey, err := fileKeyManager.GetSigningKey(config.Engine.ProvingKeyId) | ||||
| 		fileKeyManager := keys.NewFileKeyManager(NodeConfig.Key, logger) | ||||
| 		provingKey, err := fileKeyManager.GetSigningKey(NodeConfig.Engine.ProvingKeyId) | ||||
| 		if err != nil { | ||||
| 			panic(errors.Wrap(err, "cross mint")) | ||||
| 		} | ||||
|  | ||||
							
								
								
									
										1049
									
								
								client/cmd/first_retro.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1049
									
								
								client/cmd/first_retro.json
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										181103
									
								
								client/cmd/fourth_retro.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										181103
									
								
								client/cmd/fourth_retro.json
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1,42 +1,77 @@ | ||||
| package cmd | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"math/big" | ||||
| 	"os" | ||||
| 	"context" | ||||
| 	"encoding/hex" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/spf13/cobra" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/protobufs" | ||||
| ) | ||||
| 
 | ||||
| var mergeCmd = &cobra.Command{ | ||||
| 	Use:   "merge", | ||||
| 	Short: "Merges two coins", | ||||
| 	Long: `Merges two coins: | ||||
| 	Short: "Merges multiple coins", | ||||
| 	Long: `Merges multiple coins: | ||||
| 	 | ||||
| 	merge <LeftCoin> <RightCoin> | ||||
| 	 | ||||
| 	LeftCoin - the first coin address | ||||
| 	RightCoin - the second coin address | ||||
| 	merge <Coin Addresses>... | ||||
| 	`, | ||||
| 	Run: func(cmd *cobra.Command, args []string) { | ||||
| 		if len(args) != 2 { | ||||
| 			fmt.Println("invalid command") | ||||
| 			os.Exit(1) | ||||
| 		conn, err := GetGRPCClient() | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 		defer conn.Close() | ||||
| 
 | ||||
| 		client := protobufs.NewNodeServiceClient(conn) | ||||
| 		key, err := GetPrivKeyFromConfig(NodeConfig) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 
 | ||||
| 		_, ok := new(big.Int).SetString(args[0], 0) | ||||
| 		if !ok { | ||||
| 			fmt.Println("invalid LeftCoin") | ||||
| 			os.Exit(1) | ||||
| 		coinaddrs := []*protobufs.CoinRef{} | ||||
| 		payload := []byte("merge") | ||||
| 		for _, arg := range args { | ||||
| 			coinaddrHex, _ := strings.CutPrefix(arg, "0x") | ||||
| 			coinaddr, err := hex.DecodeString(coinaddrHex) | ||||
| 			if err != nil { | ||||
| 				panic(err) | ||||
| 			} | ||||
| 			coinaddrs = append(coinaddrs, &protobufs.CoinRef{ | ||||
| 				Address: coinaddr, | ||||
| 			}) | ||||
| 			payload = append(payload, coinaddr...) | ||||
| 		} | ||||
| 
 | ||||
| 		_, ok = new(big.Int).SetString(args[1], 0) | ||||
| 		if !ok { | ||||
| 			fmt.Println("invalid Rightcoin") | ||||
| 			os.Exit(1) | ||||
| 		sig, err := key.Sign(payload) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 
 | ||||
| 		fmt.Println("1545.381923 QUIL (Coin 0x151f4ae225e20759077e1724e4c5d0feae26c477fd10d728dfea962eec79b83f)") | ||||
| 		pub, err := key.GetPublic().Raw() | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 
 | ||||
| 		_, err = client.SendMessage( | ||||
| 			context.Background(), | ||||
| 			&protobufs.TokenRequest{ | ||||
| 				Request: &protobufs.TokenRequest_Merge{ | ||||
| 					Merge: &protobufs.MergeCoinRequest{ | ||||
| 						Coins: coinaddrs, | ||||
| 						Signature: &protobufs.Ed448Signature{ | ||||
| 							Signature: sig, | ||||
| 							PublicKey: &protobufs.Ed448PublicKey{ | ||||
| 								KeyValue: pub, | ||||
| 							}, | ||||
| 						}, | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| 		) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 	}, | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -2,10 +2,7 @@ package cmd | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/shopspring/decimal" | ||||
| 	"github.com/spf13/cobra" | ||||
| ) | ||||
| 
 | ||||
| @ -19,22 +16,7 @@ var mutualReceiveCmd = &cobra.Command{ | ||||
| 	ExpectedAmount - the amount expected in the transfer | ||||
| 	`, | ||||
| 	Run: func(cmd *cobra.Command, args []string) { | ||||
| 		if len(args) != 1 { | ||||
| 			fmt.Println("invalid command") | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 
 | ||||
| 		amount := args[len(args)-1] | ||||
| 		_, err := decimal.NewFromString(amount) | ||||
| 		if err != nil { | ||||
| 			fmt.Println("invalid ExpectedAmount") | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 		fmt.Println("Rendezvous: 0x2ad567e4fc1ac335a8d3d6077de2ee998aff996b51936da04ee1b0f5dc196a4f") | ||||
| 		fmt.Printf("Awaiting sender... ") | ||||
| 		time.Sleep(2 * time.Second) | ||||
| 		fmt.Println("OK") | ||||
| 		fmt.Println(amount + " QUIL (Coin 0x0525c76ecdc6ef21c2eb75df628b52396adcf402ba26a518ac395db8f5874a82)") | ||||
| 		fmt.Println("command not yet available") | ||||
| 	}, | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -2,8 +2,6 @@ package cmd | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"time" | ||||
| 
 | ||||
| 	"github.com/spf13/cobra" | ||||
| ) | ||||
| @ -22,15 +20,7 @@ var mutualTransferCmd = &cobra.Command{ | ||||
| 	Either Amount or OfCoin must be specified | ||||
| 	`, | ||||
| 	Run: func(cmd *cobra.Command, args []string) { | ||||
| 		if len(args) != 2 { | ||||
| 			fmt.Println("invalid command") | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 
 | ||||
| 		fmt.Printf("Confirming rendezvous... ") | ||||
| 		time.Sleep(500 * time.Millisecond) | ||||
| 		fmt.Println("OK") | ||||
| 		fmt.Println("50 QUIL (Coin [private])") | ||||
| 		fmt.Println("command not yet available") | ||||
| 	}, | ||||
| } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										12
									
								
								client/cmd/prover.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								client/cmd/prover.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| package cmd | ||||
| 
 | ||||
| import "github.com/spf13/cobra" | ||||
| 
 | ||||
| var proverCmd = &cobra.Command{ | ||||
| 	Use:   "prover", | ||||
| 	Short: "Performs a configuration operation for given prover info", | ||||
| } | ||||
| 
 | ||||
| func init() { | ||||
| 	configCmd.AddCommand(proverCmd) | ||||
| } | ||||
							
								
								
									
										299
									
								
								client/cmd/proverMerge.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										299
									
								
								client/cmd/proverMerge.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,299 @@ | ||||
| package cmd | ||||
| 
 | ||||
| import ( | ||||
| 	_ "embed" | ||||
| 	"encoding/hex" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"path" | ||||
| 	"strconv" | ||||
| 
 | ||||
| 	"github.com/libp2p/go-libp2p/core/crypto" | ||||
| 	"github.com/libp2p/go-libp2p/core/peer" | ||||
| 	"github.com/pkg/errors" | ||||
| 	"github.com/shopspring/decimal" | ||||
| 	"github.com/spf13/cobra" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/config" | ||||
| ) | ||||
| 
 | ||||
| var proverConfigMergeCmd = &cobra.Command{ | ||||
| 	Use:   "merge", | ||||
| 	Short: "Merges config data for prover seniority", | ||||
| 	Long: `Merges config data for prover seniority: | ||||
| 	 | ||||
| 	merge <Primary Config Path> [<Additional Config Paths>...] | ||||
| 
 | ||||
| 	Use with --dry-run to evaluate seniority score, this may take a while... | ||||
| 	`, | ||||
| 	Run: func(c *cobra.Command, args []string) { | ||||
| 		if len(args) <= 1 { | ||||
| 			fmt.Println("missing configs") | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 
 | ||||
| 		primaryConfig, err := config.LoadConfig(args[0], "", true) | ||||
| 		if err != nil { | ||||
| 			fmt.Printf("invalid config directory: %s\n", args[0]) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 
 | ||||
| 		otherPaths := []string{} | ||||
| 		peerIds := []string{GetPeerIDFromConfig(primaryConfig).String()} | ||||
| 		for _, p := range args[1:] { | ||||
| 			if !path.IsAbs(p) { | ||||
| 				fmt.Printf("%s is not an absolute path\n", p) | ||||
| 			} | ||||
| 			cfg, err := config.LoadConfig(p, "", true) | ||||
| 			if err != nil { | ||||
| 				fmt.Printf("invalid config directory: %s\n", p) | ||||
| 				os.Exit(1) | ||||
| 			} | ||||
| 
 | ||||
| 			peerId := GetPeerIDFromConfig(cfg).String() | ||||
| 			peerIds = append(peerIds, peerId) | ||||
| 			otherPaths = append(otherPaths, p) | ||||
| 		} | ||||
| 
 | ||||
| 		if DryRun { | ||||
| 			bridged := []*BridgedPeerJson{} | ||||
| 			firstRetro := []*FirstRetroJson{} | ||||
| 			secondRetro := []*SecondRetroJson{} | ||||
| 			thirdRetro := []*ThirdRetroJson{} | ||||
| 			fourthRetro := []*FourthRetroJson{} | ||||
| 
 | ||||
| 			err = json.Unmarshal(bridgedPeersJsonBinary, &bridged) | ||||
| 			if err != nil { | ||||
| 				panic(err) | ||||
| 			} | ||||
| 
 | ||||
| 			err = json.Unmarshal(firstRetroJsonBinary, &firstRetro) | ||||
| 			if err != nil { | ||||
| 				panic(err) | ||||
| 			} | ||||
| 
 | ||||
| 			err = json.Unmarshal(secondRetroJsonBinary, &secondRetro) | ||||
| 			if err != nil { | ||||
| 				panic(err) | ||||
| 			} | ||||
| 
 | ||||
| 			err = json.Unmarshal(thirdRetroJsonBinary, &thirdRetro) | ||||
| 			if err != nil { | ||||
| 				panic(err) | ||||
| 			} | ||||
| 
 | ||||
| 			err = json.Unmarshal(fourthRetroJsonBinary, &fourthRetro) | ||||
| 			if err != nil { | ||||
| 				panic(err) | ||||
| 			} | ||||
| 
 | ||||
| 			bridgedAddrs := map[string]struct{}{} | ||||
| 
 | ||||
| 			bridgeTotal := decimal.Zero | ||||
| 			for _, b := range bridged { | ||||
| 				amt, err := decimal.NewFromString(b.Amount) | ||||
| 				if err != nil { | ||||
| 					panic(err) | ||||
| 				} | ||||
| 				bridgeTotal = bridgeTotal.Add(amt) | ||||
| 				bridgedAddrs[b.Identifier] = struct{}{} | ||||
| 			} | ||||
| 
 | ||||
| 			highestFirst := uint64(0) | ||||
| 			highestSecond := uint64(0) | ||||
| 			highestThird := uint64(0) | ||||
| 			highestFourth := uint64(0) | ||||
| 
 | ||||
| 			for _, f := range firstRetro { | ||||
| 				found := false | ||||
| 				for _, p := range peerIds { | ||||
| 					if p != f.PeerId { | ||||
| 						continue | ||||
| 					} | ||||
| 					found = true | ||||
| 				} | ||||
| 				if !found { | ||||
| 					continue | ||||
| 				} | ||||
| 				// these don't have decimals so we can shortcut
 | ||||
| 				max := 137558 | ||||
| 				actual, err := strconv.Atoi(f.Reward) | ||||
| 				if err != nil { | ||||
| 					panic(err) | ||||
| 				} | ||||
| 
 | ||||
| 				s := uint64(10 * 6 * 60 * 24 * 92 / (max / actual)) | ||||
| 				if s > uint64(highestFirst) { | ||||
| 					highestFirst = s | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			for _, f := range secondRetro { | ||||
| 				found := false | ||||
| 				for _, p := range peerIds { | ||||
| 					if p != f.PeerId { | ||||
| 						continue | ||||
| 					} | ||||
| 					found = true | ||||
| 				} | ||||
| 				if !found { | ||||
| 					continue | ||||
| 				} | ||||
| 
 | ||||
| 				amt := uint64(0) | ||||
| 				if f.JanPresence { | ||||
| 					amt += (10 * 6 * 60 * 24 * 31) | ||||
| 				} | ||||
| 
 | ||||
| 				if f.FebPresence { | ||||
| 					amt += (10 * 6 * 60 * 24 * 29) | ||||
| 				} | ||||
| 
 | ||||
| 				if f.MarPresence { | ||||
| 					amt += (10 * 6 * 60 * 24 * 31) | ||||
| 				} | ||||
| 
 | ||||
| 				if f.AprPresence { | ||||
| 					amt += (10 * 6 * 60 * 24 * 30) | ||||
| 				} | ||||
| 
 | ||||
| 				if f.MayPresence { | ||||
| 					amt += (10 * 6 * 60 * 24 * 31) | ||||
| 				} | ||||
| 
 | ||||
| 				if amt > uint64(highestSecond) { | ||||
| 					highestSecond = amt | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			for _, f := range thirdRetro { | ||||
| 				found := false | ||||
| 				for _, p := range peerIds { | ||||
| 					if p != f.PeerId { | ||||
| 						continue | ||||
| 					} | ||||
| 					found = true | ||||
| 				} | ||||
| 				if !found { | ||||
| 					continue | ||||
| 				} | ||||
| 
 | ||||
| 				s := uint64(10 * 6 * 60 * 24 * 30) | ||||
| 				if s > uint64(highestThird) { | ||||
| 					highestThird = s | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			for _, f := range fourthRetro { | ||||
| 				found := false | ||||
| 				for _, p := range peerIds { | ||||
| 					if p != f.PeerId { | ||||
| 						continue | ||||
| 					} | ||||
| 					found = true | ||||
| 				} | ||||
| 				if !found { | ||||
| 					continue | ||||
| 				} | ||||
| 
 | ||||
| 				s := uint64(10 * 6 * 60 * 24 * 31) | ||||
| 				if s > uint64(highestFourth) { | ||||
| 					highestFourth = s | ||||
| 				} | ||||
| 			} | ||||
| 
 | ||||
| 			fmt.Printf("Effective seniority score: %d\n", highestFirst+highestSecond+highestThird+highestFourth) | ||||
| 		} else { | ||||
| 			for _, p := range args[1:] { | ||||
| 				primaryConfig.Engine.MultisigProverEnrollmentPaths = append( | ||||
| 					primaryConfig.Engine.MultisigProverEnrollmentPaths, | ||||
| 					p, | ||||
| 				) | ||||
| 			} | ||||
| 			err := config.SaveConfig(args[0], primaryConfig) | ||||
| 			if err != nil { | ||||
| 				panic(err) | ||||
| 			} | ||||
| 		} | ||||
| 	}, | ||||
| } | ||||
| 
 | ||||
| func GetPrivKeyFromConfig(cfg *config.Config) (crypto.PrivKey, error) { | ||||
| 	peerPrivKey, err := hex.DecodeString(cfg.P2P.PeerPrivKey) | ||||
| 	if err != nil { | ||||
| 		panic(errors.Wrap(err, "error unmarshaling peerkey")) | ||||
| 	} | ||||
| 
 | ||||
| 	privKey, err := crypto.UnmarshalEd448PrivateKey(peerPrivKey) | ||||
| 	return privKey, err | ||||
| } | ||||
| 
 | ||||
| func GetPeerIDFromConfig(cfg *config.Config) peer.ID { | ||||
| 	peerPrivKey, err := hex.DecodeString(cfg.P2P.PeerPrivKey) | ||||
| 	if err != nil { | ||||
| 		panic(errors.Wrap(err, "error unmarshaling peerkey")) | ||||
| 	} | ||||
| 
 | ||||
| 	privKey, err := crypto.UnmarshalEd448PrivateKey(peerPrivKey) | ||||
| 	if err != nil { | ||||
| 		panic(errors.Wrap(err, "error unmarshaling peerkey")) | ||||
| 	} | ||||
| 
 | ||||
| 	pub := privKey.GetPublic() | ||||
| 	id, err := peer.IDFromPublicKey(pub) | ||||
| 	if err != nil { | ||||
| 		panic(errors.Wrap(err, "error getting peer id")) | ||||
| 	} | ||||
| 
 | ||||
| 	return id | ||||
| } | ||||
| 
 | ||||
| type BridgedPeerJson struct { | ||||
| 	Amount     string `json:"amount"` | ||||
| 	Identifier string `json:"identifier"` | ||||
| 	Variant    string `json:"variant"` | ||||
| } | ||||
| 
 | ||||
| type FirstRetroJson struct { | ||||
| 	PeerId string `json:"peerId"` | ||||
| 	Reward string `json:"reward"` | ||||
| } | ||||
| 
 | ||||
| type SecondRetroJson struct { | ||||
| 	PeerId      string `json:"peerId"` | ||||
| 	Reward      string `json:"reward"` | ||||
| 	JanPresence bool   `json:"janPresence"` | ||||
| 	FebPresence bool   `json:"febPresence"` | ||||
| 	MarPresence bool   `json:"marPresence"` | ||||
| 	AprPresence bool   `json:"aprPresence"` | ||||
| 	MayPresence bool   `json:"mayPresence"` | ||||
| } | ||||
| 
 | ||||
| type ThirdRetroJson struct { | ||||
| 	PeerId string `json:"peerId"` | ||||
| 	Reward string `json:"reward"` | ||||
| } | ||||
| 
 | ||||
| type FourthRetroJson struct { | ||||
| 	PeerId string `json:"peerId"` | ||||
| 	Reward string `json:"reward"` | ||||
| } | ||||
| 
 | ||||
| //go:embed bridged.json
 | ||||
| var bridgedPeersJsonBinary []byte | ||||
| 
 | ||||
| //go:embed first_retro.json
 | ||||
| var firstRetroJsonBinary []byte | ||||
| 
 | ||||
| //go:embed second_retro.json
 | ||||
| var secondRetroJsonBinary []byte | ||||
| 
 | ||||
| //go:embed third_retro.json
 | ||||
| var thirdRetroJsonBinary []byte | ||||
| 
 | ||||
| //go:embed fourth_retro.json
 | ||||
| var fourthRetroJsonBinary []byte | ||||
| 
 | ||||
| func init() { | ||||
| 	proverCmd.AddCommand(proverConfigMergeCmd) | ||||
| } | ||||
| @ -2,8 +2,6 @@ package cmd | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"math/big" | ||||
| 	"os" | ||||
| 
 | ||||
| 	"github.com/spf13/cobra" | ||||
| ) | ||||
| @ -18,18 +16,7 @@ var rejectCmd = &cobra.Command{ | ||||
| 	PendingTransaction - the address of the pending transfer | ||||
| 	`, | ||||
| 	Run: func(cmd *cobra.Command, args []string) { | ||||
| 		if len(args) != 1 { | ||||
| 			fmt.Println("invalid command") | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 
 | ||||
| 		_, ok := new(big.Int).SetString(args[0], 0) | ||||
| 		if !ok { | ||||
| 			fmt.Println("invalid PendingTransaction") | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 
 | ||||
| 		fmt.Println("25 QUIL (PendingTransaction 0x27fff099dee515ece193d2af09b164864e4bb60c19eb6719b5bc981f92151009)") | ||||
| 		fmt.Println("command not yet available") | ||||
| 	}, | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -1,17 +1,118 @@ | ||||
| package cmd | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"crypto/tls" | ||||
| 	"encoding/hex" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/cloudflare/circl/sign/ed448" | ||||
| 	"github.com/multiformats/go-multiaddr" | ||||
| 	mn "github.com/multiformats/go-multiaddr/net" | ||||
| 	"github.com/spf13/cobra" | ||||
| 	"golang.org/x/crypto/sha3" | ||||
| 	"google.golang.org/grpc" | ||||
| 	"google.golang.org/grpc/credentials" | ||||
| 	"google.golang.org/grpc/credentials/insecure" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/config" | ||||
| ) | ||||
| 
 | ||||
| var configDirectory string | ||||
| var signatureCheck bool = true | ||||
| var NodeConfig *config.Config | ||||
| var simulateFail bool | ||||
| var LightNode bool = false | ||||
| var DryRun bool = false | ||||
| 
 | ||||
| var rootCmd = &cobra.Command{ | ||||
| 	Use:   "qclient", | ||||
| 	Short: "Quilibrium RPC Client", | ||||
| 	PersistentPreRun: func(cmd *cobra.Command, args []string) { | ||||
| 		if signatureCheck { | ||||
| 			ex, err := os.Executable() | ||||
| 			if err != nil { | ||||
| 				panic(err) | ||||
| 			} | ||||
| 
 | ||||
| 			b, err := os.ReadFile(ex) | ||||
| 			if err != nil { | ||||
| 				fmt.Println( | ||||
| 					"Error encountered during signature check – are you running this " + | ||||
| 						"from source? (use --signature-check=false)", | ||||
| 				) | ||||
| 				panic(err) | ||||
| 			} | ||||
| 
 | ||||
| 			checksum := sha3.Sum256(b) | ||||
| 			digest, err := os.ReadFile(ex + ".dgst") | ||||
| 			if err != nil { | ||||
| 				fmt.Println("Digest file not found") | ||||
| 				os.Exit(1) | ||||
| 			} | ||||
| 
 | ||||
| 			parts := strings.Split(string(digest), " ") | ||||
| 			if len(parts) != 2 { | ||||
| 				fmt.Println("Invalid digest file format") | ||||
| 				os.Exit(1) | ||||
| 			} | ||||
| 
 | ||||
| 			digestBytes, err := hex.DecodeString(parts[1][:64]) | ||||
| 			if err != nil { | ||||
| 				fmt.Println("Invalid digest file format") | ||||
| 				os.Exit(1) | ||||
| 			} | ||||
| 
 | ||||
| 			if !bytes.Equal(checksum[:], digestBytes) { | ||||
| 				fmt.Println("Invalid digest for node") | ||||
| 				os.Exit(1) | ||||
| 			} | ||||
| 
 | ||||
| 			count := 0 | ||||
| 
 | ||||
| 			for i := 1; i <= len(config.Signatories); i++ { | ||||
| 				signatureFile := fmt.Sprintf(ex+".dgst.sig.%d", i) | ||||
| 				sig, err := os.ReadFile(signatureFile) | ||||
| 				if err != nil { | ||||
| 					continue | ||||
| 				} | ||||
| 
 | ||||
| 				pubkey, _ := hex.DecodeString(config.Signatories[i-1]) | ||||
| 				if !ed448.Verify(pubkey, digest, sig, "") { | ||||
| 					fmt.Printf("Failed signature check for signatory #%d\n", i) | ||||
| 					os.Exit(1) | ||||
| 				} | ||||
| 				count++ | ||||
| 			} | ||||
| 
 | ||||
| 			if count < len(config.Signatories)/2+len(config.Signatories)%2 { | ||||
| 				fmt.Printf("Quorum on signatures not met") | ||||
| 				os.Exit(1) | ||||
| 			} | ||||
| 
 | ||||
| 			fmt.Println("Signature check passed") | ||||
| 		} else { | ||||
| 			fmt.Println("Signature check bypassed, be sure you know what you're doing") | ||||
| 		} | ||||
| 
 | ||||
| 		_, err := os.Stat(configDirectory) | ||||
| 		if os.IsNotExist(err) { | ||||
| 			fmt.Printf("config directory doesn't exist: %s\n", configDirectory) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 
 | ||||
| 		NodeConfig, err := config.LoadConfig(configDirectory, "", false) | ||||
| 		if err != nil { | ||||
| 			fmt.Printf("invalid config directory: %s\n", configDirectory) | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 
 | ||||
| 		if NodeConfig.ListenGRPCMultiaddr == "" { | ||||
| 			fmt.Println("gRPC not enabled, using light node") | ||||
| 			LightNode = true | ||||
| 		} | ||||
| 	}, | ||||
| } | ||||
| 
 | ||||
| func Execute() { | ||||
| @ -21,6 +122,34 @@ func Execute() { | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func GetGRPCClient() (*grpc.ClientConn, error) { | ||||
| 	addr := "rpc.quilibrium.com:8337" | ||||
| 	credentials := credentials.NewTLS(&tls.Config{InsecureSkipVerify: false}) | ||||
| 	if !LightNode { | ||||
| 		ma, err := multiaddr.NewMultiaddr(NodeConfig.ListenGRPCMultiaddr) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 
 | ||||
| 		_, addr, err = mn.DialArgs(ma) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 		credentials = insecure.NewCredentials() | ||||
| 	} | ||||
| 
 | ||||
| 	return grpc.Dial( | ||||
| 		addr, | ||||
| 		grpc.WithTransportCredentials( | ||||
| 			credentials, | ||||
| 		), | ||||
| 		grpc.WithDefaultCallOptions( | ||||
| 			grpc.MaxCallSendMsgSize(600*1024*1024), | ||||
| 			grpc.MaxCallRecvMsgSize(600*1024*1024), | ||||
| 		), | ||||
| 	) | ||||
| } | ||||
| 
 | ||||
| func init() { | ||||
| 	rootCmd.PersistentFlags().StringVar( | ||||
| 		&configDirectory, | ||||
| @ -28,4 +157,16 @@ func init() { | ||||
| 		".config/", | ||||
| 		"config directory (default is .config/)", | ||||
| 	) | ||||
| 	rootCmd.PersistentFlags().BoolVar( | ||||
| 		&DryRun, | ||||
| 		"dry-run", | ||||
| 		false, | ||||
| 		"runs the command (if applicable) without actually mutating state (printing effect output)", | ||||
| 	) | ||||
| 	rootCmd.PersistentFlags().BoolVar( | ||||
| 		&signatureCheck, | ||||
| 		"signature-check", | ||||
| 		true, | ||||
| 		"bypass signature check (not recommended for binaries)", | ||||
| 	) | ||||
| } | ||||
|  | ||||
							
								
								
									
										138554
									
								
								client/cmd/second_retro.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										138554
									
								
								client/cmd/second_retro.json
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1,52 +1,101 @@ | ||||
| package cmd | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"encoding/hex" | ||||
| 	"fmt" | ||||
| 	"math/big" | ||||
| 	"os" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/shopspring/decimal" | ||||
| 	"github.com/spf13/cobra" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/protobufs" | ||||
| ) | ||||
| 
 | ||||
| var splitCmd = &cobra.Command{ | ||||
| 	Use:   "split", | ||||
| 	Short: "Splits a coin into two coins", | ||||
| 	Long: `Splits a coin into two coins: | ||||
| 	Short: "Splits a coin into multiple coins", | ||||
| 	Long: `Splits a coin into multiple coins: | ||||
| 	 | ||||
| 	split <OfCoin> <LeftAmount> <RightAmount> | ||||
| 	split <OfCoin> <Amounts>... | ||||
| 	 | ||||
| 	OfCoin - the address of the coin to split | ||||
| 	LeftAmount - the first half of the split amount | ||||
| 	RightAmount - the second half of the split amount | ||||
| 	Amounts - the sets of amounts to split | ||||
| 	`, | ||||
| 	Run: func(cmd *cobra.Command, args []string) { | ||||
| 		if len(args) != 3 { | ||||
| 		if len(args) < 3 { | ||||
| 			fmt.Println("invalid command") | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 
 | ||||
| 		_, ok := new(big.Int).SetString(args[0], 0) | ||||
| 		if !ok { | ||||
| 			fmt.Println("invalid OfCoin") | ||||
| 		payload := []byte("split") | ||||
| 		coinaddrHex, _ := strings.CutPrefix(args[0], "0x") | ||||
| 		coinaddr, err := hex.DecodeString(coinaddrHex) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 		coin := &protobufs.CoinRef{ | ||||
| 			Address: coinaddr, | ||||
| 		} | ||||
| 		payload = append(payload, coinaddr...) | ||||
| 
 | ||||
| 		conversionFactor, _ := new(big.Int).SetString("1DCD65000", 16) | ||||
| 		amounts := [][]byte{} | ||||
| 		for _, amt := range args[1:] { | ||||
| 			amount, err := decimal.NewFromString(amt) | ||||
| 			if err != nil { | ||||
| 				fmt.Println("invalid amount") | ||||
| 				os.Exit(1) | ||||
| 			} | ||||
| 			amount.Mul(decimal.NewFromBigInt(conversionFactor, 0)) | ||||
| 			amountBytes := amount.BigInt().FillBytes(make([]byte, 32)) | ||||
| 			amounts = append(amounts, amountBytes) | ||||
| 			payload = append(payload, amountBytes...) | ||||
| 		} | ||||
| 
 | ||||
| 		leftAmount := args[1] | ||||
| 		_, err := decimal.NewFromString(leftAmount) | ||||
| 		conn, err := GetGRPCClient() | ||||
| 		if err != nil { | ||||
| 			fmt.Println("invalid LeftAmount") | ||||
| 			os.Exit(1) | ||||
| 			panic(err) | ||||
| 		} | ||||
| 		defer conn.Close() | ||||
| 
 | ||||
| 		client := protobufs.NewNodeServiceClient(conn) | ||||
| 		key, err := GetPrivKeyFromConfig(NodeConfig) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 
 | ||||
| 		rightAmount := args[2] | ||||
| 		_, err = decimal.NewFromString(rightAmount) | ||||
| 		sig, err := key.Sign(payload) | ||||
| 		if err != nil { | ||||
| 			fmt.Println("invalid RightAmount") | ||||
| 			os.Exit(1) | ||||
| 			panic(err) | ||||
| 		} | ||||
| 
 | ||||
| 		pub, err := key.GetPublic().Raw() | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 
 | ||||
| 		_, err = client.SendMessage( | ||||
| 			context.Background(), | ||||
| 			&protobufs.TokenRequest{ | ||||
| 				Request: &protobufs.TokenRequest_Split{ | ||||
| 					Split: &protobufs.SplitCoinRequest{ | ||||
| 						OfCoin:  coin, | ||||
| 						Amounts: amounts, | ||||
| 						Signature: &protobufs.Ed448Signature{ | ||||
| 							Signature: sig, | ||||
| 							PublicKey: &protobufs.Ed448PublicKey{ | ||||
| 								KeyValue: pub, | ||||
| 							}, | ||||
| 						}, | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| 		) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 		fmt.Println(leftAmount + " QUIL (Coin 0x024479f49f03dc53fd702198cd9b548c9e96004e19ef6a4e9c5211a9795ba34d)") | ||||
| 		fmt.Println(rightAmount + " QUIL (Coin 0x0140e01731256793bba03914f3844d645fbece26553acdea8ac4de4d84f91690)") | ||||
| 	}, | ||||
| } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										191064
									
								
								client/cmd/third_retro.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										191064
									
								
								client/cmd/third_retro.json
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1,13 +1,12 @@ | ||||
| package cmd | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"math/big" | ||||
| 	"os" | ||||
| 	"strconv" | ||||
| 	"context" | ||||
| 	"encoding/hex" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/shopspring/decimal" | ||||
| 	"github.com/spf13/cobra" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/protobufs" | ||||
| ) | ||||
| 
 | ||||
| var transferCmd = &cobra.Command{ | ||||
| @ -15,75 +14,84 @@ var transferCmd = &cobra.Command{ | ||||
| 	Short: "Creates a pending transfer of coin", | ||||
| 	Long: `Creates a pending transfer of coin: | ||||
| 	 | ||||
| 	transfer <ToAccount> [<RefundAccount>] [<Expiry>] (<Amount>|<OfCoin>) | ||||
| 	transfer <ToAccount> <OfCoin> | ||||
| 	 | ||||
| 	ToAccount – account address, must be specified | ||||
| 	RefundAccount - account address to receive coin if rejected (if omitted, uses sender address) | ||||
| 	Expiry – unix epoch time in seconds where the ToAccount can no longer claim (if omitted, does not expire) | ||||
| 	Amount – the amount to send, splitting/merging and sending as needed | ||||
| 	OfCoin – the address of the coin to send in whole | ||||
| 
 | ||||
| 	Either Amount or OfCoin must be specified | ||||
| 	`, | ||||
| 	Run: func(cmd *cobra.Command, args []string) { | ||||
| 		if len(args) < 2 || len(args) > 4 { | ||||
| 			fmt.Println("invalid command") | ||||
| 			os.Exit(1) | ||||
| 		if len(args) != 2 { | ||||
| 			panic("invalid arguments") | ||||
| 		} | ||||
| 
 | ||||
| 		_, ok := new(big.Int).SetString(args[0], 0) | ||||
| 		if !ok { | ||||
| 			fmt.Println("invalid ToAccount") | ||||
| 			os.Exit(1) | ||||
| 		} | ||||
| 
 | ||||
| 		refundAccount := "0x23c0f371e9faa7be4ffedd616361e0c9aeb776ae4d7f3a37605ecbfa40a55a90" | ||||
| 		// expiry := int64(9999999999)
 | ||||
| 		var err error | ||||
| 
 | ||||
| 		if len(args) >= 3 { | ||||
| 			if len(args[len(args)-2]) != 66 { | ||||
| 				_, err = strconv.ParseInt(args[len(args)-2], 10, 0) | ||||
| 		conn, err := GetGRPCClient() | ||||
| 		if err != nil { | ||||
| 					fmt.Println(err) | ||||
| 					os.Exit(1) | ||||
| 				} | ||||
| 			} else { | ||||
| 				refundAccount = args[1] | ||||
| 			} | ||||
| 			panic(err) | ||||
| 		} | ||||
| 		defer conn.Close() | ||||
| 
 | ||||
| 		if refundAccount[0] != '0' || refundAccount[1] != 'x' { | ||||
| 			_, ok := new(big.Int).SetString(refundAccount, 0) | ||||
| 			if !ok { | ||||
| 				fmt.Println("invalid refund account") | ||||
| 				os.Exit(1) | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		ofCoin := "" | ||||
| 		amount := "" | ||||
| 		if len(args[len(args)-1]) == 66 { | ||||
| 			ofCoin = args[len(args)-1] | ||||
| 			_, ok := new(big.Int).SetString(ofCoin, 0) | ||||
| 			if !ok { | ||||
| 				fmt.Println("invalid OfCoin") | ||||
| 				os.Exit(1) | ||||
| 			} | ||||
| 			switch ofCoin { | ||||
| 			case "0x1148092cdce78c721835601ef39f9c2cd8b48b7787cbea032dd3913a4106a58d": | ||||
| 				fmt.Println("25.0 QUIL (Pending Transaction 0x0382e4da0c7c0133a1b53453b05096272b80c1575c6828d0211c4e371f7c81bb)") | ||||
| 			case "0x162ad88c319060b4f5ea6dbf9a0c2cd82d3d70dfc22d5fc99ca5371083d68416": | ||||
| 				fmt.Println("1520.381923 QUIL (Pending Transaction 0x0382e4da0c7c0133a1b53453b05096272b80c1575c6828d0211c4e371f7c81bb)") | ||||
| 			} | ||||
| 		} else { | ||||
| 			amount = args[len(args)-1] | ||||
| 			_, err := decimal.NewFromString(amount) | ||||
| 		client := protobufs.NewNodeServiceClient(conn) | ||||
| 		key, err := GetPrivKeyFromConfig(NodeConfig) | ||||
| 		if err != nil { | ||||
| 				fmt.Println("invalid Amount") | ||||
| 				os.Exit(1) | ||||
| 			panic(err) | ||||
| 		} | ||||
| 			fmt.Println(amount + " QUIL (Pending Transaction 0x0382e4da0c7c0133a1b53453b05096272b80c1575c6828d0211c4e371f7c81bb)") | ||||
| 
 | ||||
| 		var coinaddr *protobufs.CoinRef | ||||
| 		payload := []byte("transfer") | ||||
| 		toaddr := []byte{} | ||||
| 		for i, arg := range args { | ||||
| 			addrHex, _ := strings.CutPrefix(arg, "0x") | ||||
| 			addr, err := hex.DecodeString(addrHex) | ||||
| 			if err != nil { | ||||
| 				panic(err) | ||||
| 			} | ||||
| 			if i == 0 { | ||||
| 				toaddr = addr | ||||
| 				continue | ||||
| 			} | ||||
| 
 | ||||
| 			coinaddr = &protobufs.CoinRef{ | ||||
| 				Address: addr, | ||||
| 			} | ||||
| 			payload = append(payload, addr...) | ||||
| 		} | ||||
| 		payload = append(payload, toaddr...) | ||||
| 
 | ||||
| 		sig, err := key.Sign(payload) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 
 | ||||
| 		pub, err := key.GetPublic().Raw() | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 
 | ||||
| 		_, err = client.SendMessage( | ||||
| 			context.Background(), | ||||
| 			&protobufs.TokenRequest{ | ||||
| 				Request: &protobufs.TokenRequest_Transfer{ | ||||
| 					Transfer: &protobufs.TransferCoinRequest{ | ||||
| 						OfCoin: coinaddr, | ||||
| 						ToAccount: &protobufs.AccountRef{ | ||||
| 							Account: &protobufs.AccountRef_ImplicitAccount{ | ||||
| 								ImplicitAccount: &protobufs.ImplicitAccount{ | ||||
| 									Address: toaddr, | ||||
| 								}, | ||||
| 							}, | ||||
| 						}, | ||||
| 						Signature: &protobufs.Ed448Signature{ | ||||
| 							Signature: sig, | ||||
| 							PublicKey: &protobufs.Ed448PublicKey{ | ||||
| 								KeyValue: pub, | ||||
| 							}, | ||||
| 						}, | ||||
| 					}, | ||||
| 				}, | ||||
| 			}, | ||||
| 		) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 	}, | ||||
| } | ||||
|  | ||||
							
								
								
									
										159
									
								
								client/go.mod
									
									
									
									
									
								
							
							
						
						
									
										159
									
								
								client/go.mod
									
									
									
									
									
								
							| @ -4,43 +4,190 @@ go 1.21 | ||||
| 
 | ||||
| toolchain go1.22.1 | ||||
| 
 | ||||
| replace source.quilibrium.com/quilibrium/monorepo/nekryptology => ../nekryptology | ||||
| 
 | ||||
| replace source.quilibrium.com/quilibrium/monorepo/bls48581 => ../bls48581 | ||||
| 
 | ||||
| replace source.quilibrium.com/quilibrium/monorepo/vdf => ../vdf | ||||
| 
 | ||||
| replace github.com/multiformats/go-multiaddr => ../go-multiaddr | ||||
| 
 | ||||
| replace github.com/multiformats/go-multiaddr-dns => ../go-multiaddr-dns | ||||
| 
 | ||||
| replace github.com/libp2p/go-libp2p => ../go-libp2p | ||||
| 
 | ||||
| replace github.com/libp2p/go-libp2p-kad-dht => ../go-libp2p-kad-dht | ||||
| 
 | ||||
| replace github.com/libp2p/go-libp2p-gostream => ../go-libp2p-gostream | ||||
| 
 | ||||
| replace source.quilibrium.com/quilibrium/monorepo/go-libp2p-blossomsub => ../go-libp2p-blossomsub | ||||
| 
 | ||||
| replace source.quilibrium.com/quilibrium/monorepo/node => ../node | ||||
| 
 | ||||
| replace source.quilibrium.com/quilibrium/monorepo/nekryptology => ../nekryptology | ||||
| replace github.com/cockroachdb/pebble => ../pebble | ||||
| 
 | ||||
| require ( | ||||
| 	github.com/iden3/go-iden3-crypto v0.0.15 | ||||
| 	github.com/iden3/go-iden3-crypto v0.0.16 | ||||
| 	github.com/mr-tron/base58 v1.2.0 | ||||
| 	github.com/multiformats/go-multiaddr v0.12.4 | ||||
| 	github.com/stretchr/testify v1.9.0 | ||||
| 	golang.org/x/crypto v0.24.0 | ||||
| 	google.golang.org/grpc v1.58.2 | ||||
| 	source.quilibrium.com/quilibrium/monorepo/node v0.0.0-00010101000000-000000000000 | ||||
| ) | ||||
| 
 | ||||
| require ( | ||||
| 	filippo.io/edwards25519 v1.0.0-rc.1 // indirect | ||||
| 	github.com/DataDog/zstd v1.4.5 // indirect | ||||
| 	github.com/benbjohnson/clock v1.3.5 // indirect | ||||
| 	github.com/beorn7/perks v1.0.1 // indirect | ||||
| 	github.com/btcsuite/btcd v0.21.0-beta.0.20201114000516-e9c7a5ac6401 // indirect | ||||
| 	github.com/bwesterb/go-ristretto v1.2.3 // indirect | ||||
| 	github.com/cespare/xxhash/v2 v2.2.0 // indirect | ||||
| 	github.com/cockroachdb/errors v1.11.1 // indirect | ||||
| 	github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect | ||||
| 	github.com/cockroachdb/pebble v0.0.0-20231210175920-b4d301aeb46a // indirect | ||||
| 	github.com/cockroachdb/redact v1.1.5 // indirect | ||||
| 	github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 // indirect | ||||
| 	github.com/consensys/gnark-crypto v0.5.3 // indirect | ||||
| 	github.com/containerd/cgroups v1.1.0 // indirect | ||||
| 	github.com/coreos/go-systemd/v22 v22.5.0 // indirect | ||||
| 	github.com/davecgh/go-spew v1.1.1 // indirect | ||||
| 	github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect | ||||
| 	github.com/docker/go-units v0.5.0 // indirect | ||||
| 	github.com/elastic/gosigar v0.14.2 // indirect | ||||
| 	github.com/flynn/noise v1.1.0 // indirect | ||||
| 	github.com/francoispqt/gojay v1.2.13 // indirect | ||||
| 	github.com/getsentry/sentry-go v0.18.0 // indirect | ||||
| 	github.com/go-logr/logr v1.3.0 // indirect | ||||
| 	github.com/go-logr/stdr v1.2.2 // indirect | ||||
| 	github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect | ||||
| 	github.com/godbus/dbus/v5 v5.1.0 // indirect | ||||
| 	github.com/gogo/protobuf v1.3.2 // indirect | ||||
| 	github.com/golang/protobuf v1.5.3 // indirect | ||||
| 	github.com/golang/snappy v0.0.4 // indirect | ||||
| 	github.com/google/gopacket v1.1.19 // indirect | ||||
| 	github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 // indirect | ||||
| 	github.com/google/uuid v1.4.0 // indirect | ||||
| 	github.com/gorilla/websocket v1.5.3 // indirect | ||||
| 	github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 // indirect | ||||
| 	github.com/hashicorp/errwrap v1.1.0 // indirect | ||||
| 	github.com/hashicorp/go-multierror v1.1.1 // indirect | ||||
| 	github.com/hashicorp/golang-lru v0.5.4 // indirect | ||||
| 	github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect | ||||
| 	github.com/huin/goupnp v1.3.0 // indirect | ||||
| 	github.com/ipfs/boxo v0.10.0 // indirect | ||||
| 	github.com/ipfs/go-cid v0.4.1 // indirect | ||||
| 	github.com/ipfs/go-datastore v0.6.0 // indirect | ||||
| 	github.com/ipfs/go-log v1.0.5 // indirect | ||||
| 	github.com/ipfs/go-log/v2 v2.5.1 // indirect | ||||
| 	github.com/ipld/go-ipld-prime v0.20.0 // indirect | ||||
| 	github.com/jackpal/go-nat-pmp v1.0.2 // indirect | ||||
| 	github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect | ||||
| 	github.com/jbenet/goprocess v0.1.4 // indirect | ||||
| 	github.com/klauspost/compress v1.17.8 // indirect | ||||
| 	github.com/klauspost/cpuid/v2 v2.2.7 // indirect | ||||
| 	github.com/koron/go-ssdp v0.0.4 // indirect | ||||
| 	github.com/kr/pretty v0.3.1 // indirect | ||||
| 	github.com/kr/text v0.2.0 // indirect | ||||
| 	github.com/libp2p/go-buffer-pool v0.1.0 // indirect | ||||
| 	github.com/libp2p/go-cidranger v1.1.0 // indirect | ||||
| 	github.com/libp2p/go-flow-metrics v0.1.0 // indirect | ||||
| 	github.com/libp2p/go-libp2p-asn-util v0.4.1 // indirect | ||||
| 	github.com/libp2p/go-libp2p-gostream v0.6.0 // indirect | ||||
| 	github.com/libp2p/go-libp2p-kad-dht v0.23.0 // indirect | ||||
| 	github.com/libp2p/go-libp2p-kbucket v0.6.3 // indirect | ||||
| 	github.com/libp2p/go-libp2p-record v0.2.0 // indirect | ||||
| 	github.com/libp2p/go-libp2p-routing-helpers v0.7.2 // indirect | ||||
| 	github.com/libp2p/go-msgio v0.3.0 // indirect | ||||
| 	github.com/libp2p/go-nat v0.2.0 // indirect | ||||
| 	github.com/libp2p/go-netroute v0.2.1 // indirect | ||||
| 	github.com/libp2p/go-reuseport v0.4.0 // indirect | ||||
| 	github.com/libp2p/go-yamux/v4 v4.0.1 // indirect | ||||
| 	github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect | ||||
| 	github.com/mattn/go-isatty v0.0.20 // indirect | ||||
| 	github.com/miekg/dns v1.1.58 // indirect | ||||
| 	github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect | ||||
| 	github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc // indirect | ||||
| 	github.com/minio/sha256-simd v1.0.1 // indirect | ||||
| 	github.com/multiformats/go-base32 v0.1.0 // indirect | ||||
| 	github.com/multiformats/go-base36 v0.2.0 // indirect | ||||
| 	github.com/multiformats/go-multiaddr-dns v0.3.1 // indirect | ||||
| 	github.com/multiformats/go-multiaddr-fmt v0.1.0 // indirect | ||||
| 	github.com/multiformats/go-multibase v0.2.0 // indirect | ||||
| 	github.com/multiformats/go-multicodec v0.9.0 // indirect | ||||
| 	github.com/multiformats/go-multihash v0.2.3 // indirect | ||||
| 	github.com/multiformats/go-multistream v0.5.0 // indirect | ||||
| 	github.com/multiformats/go-varint v0.0.7 // indirect | ||||
| 	github.com/onsi/ginkgo/v2 v2.15.0 // indirect | ||||
| 	github.com/opencontainers/runtime-spec v1.2.0 // indirect | ||||
| 	github.com/opentracing/opentracing-go v1.2.0 // indirect | ||||
| 	github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect | ||||
| 	github.com/pion/datachannel v1.5.6 // indirect | ||||
| 	github.com/pion/dtls/v2 v2.2.11 // indirect | ||||
| 	github.com/pion/ice/v2 v2.3.25 // indirect | ||||
| 	github.com/pion/interceptor v0.1.29 // indirect | ||||
| 	github.com/pion/logging v0.2.2 // indirect | ||||
| 	github.com/pion/mdns v0.0.12 // indirect | ||||
| 	github.com/pion/randutil v0.1.0 // indirect | ||||
| 	github.com/pion/rtcp v1.2.14 // indirect | ||||
| 	github.com/pion/rtp v1.8.6 // indirect | ||||
| 	github.com/pion/sctp v1.8.16 // indirect | ||||
| 	github.com/pion/sdp/v3 v3.0.9 // indirect | ||||
| 	github.com/pion/srtp/v2 v2.0.18 // indirect | ||||
| 	github.com/pion/stun v0.6.1 // indirect | ||||
| 	github.com/pion/transport/v2 v2.2.5 // indirect | ||||
| 	github.com/pion/turn/v2 v2.1.6 // indirect | ||||
| 	github.com/pion/webrtc/v3 v3.2.40 // indirect | ||||
| 	github.com/pmezard/go-difflib v1.0.0 // indirect | ||||
| 	github.com/polydawn/refmt v0.89.0 // indirect | ||||
| 	github.com/prometheus/client_golang v1.19.1 // indirect | ||||
| 	github.com/prometheus/client_model v0.6.1 // indirect | ||||
| 	github.com/prometheus/common v0.48.0 // indirect | ||||
| 	github.com/prometheus/procfs v0.12.0 // indirect | ||||
| 	github.com/quic-go/qpack v0.4.0 // indirect | ||||
| 	github.com/quic-go/quic-go v0.44.0 // indirect | ||||
| 	github.com/quic-go/webtransport-go v0.8.0 // indirect | ||||
| 	github.com/raulk/go-watchdog v1.3.0 // indirect | ||||
| 	github.com/rogpeppe/go-internal v1.10.0 // indirect | ||||
| 	github.com/spaolacci/murmur3 v1.1.0 // indirect | ||||
| 	github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 // indirect | ||||
| 	go.opencensus.io v0.24.0 // indirect | ||||
| 	go.opentelemetry.io/otel v1.16.0 // indirect | ||||
| 	go.opentelemetry.io/otel/metric v1.16.0 // indirect | ||||
| 	go.opentelemetry.io/otel/trace v1.16.0 // indirect | ||||
| 	go.uber.org/dig v1.17.1 // indirect | ||||
| 	go.uber.org/fx v1.22.1 // indirect | ||||
| 	go.uber.org/mock v0.4.0 // indirect | ||||
| 	go.uber.org/multierr v1.11.0 // indirect | ||||
| 	golang.org/x/crypto v0.24.0 // indirect | ||||
| 	golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect | ||||
| 	golang.org/x/mod v0.17.0 // indirect | ||||
| 	golang.org/x/net v0.25.0 // indirect | ||||
| 	golang.org/x/sync v0.7.0 // indirect | ||||
| 	golang.org/x/sys v0.21.0 // indirect | ||||
| 	golang.org/x/text v0.16.0 // indirect | ||||
| 	golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect | ||||
| 	gonum.org/v1/gonum v0.13.0 // indirect | ||||
| 	google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect | ||||
| 	google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect | ||||
| 	gopkg.in/yaml.v2 v2.4.0 // indirect | ||||
| 	gopkg.in/yaml.v3 v3.0.1 // indirect | ||||
| 	lukechampine.com/blake3 v1.2.1 // indirect | ||||
| 	source.quilibrium.com/quilibrium/monorepo/bls48581 v0.0.0-00010101000000-000000000000 // indirect | ||||
| 	source.quilibrium.com/quilibrium/monorepo/go-libp2p-blossomsub v0.0.0-00010101000000-000000000000 // indirect | ||||
| 	source.quilibrium.com/quilibrium/monorepo/nekryptology v0.0.0-00010101000000-000000000000 // indirect | ||||
| 	source.quilibrium.com/quilibrium/monorepo/vdf v0.0.0-00010101000000-000000000000 // indirect | ||||
| ) | ||||
| 
 | ||||
| require ( | ||||
| 	github.com/cloudflare/circl v1.3.8 | ||||
| 	github.com/cloudflare/circl v1.3.9 | ||||
| 	github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 // indirect | ||||
| 	github.com/inconshreveable/mousetrap v1.1.0 // indirect | ||||
| 	github.com/libp2p/go-libp2p v0.35.1 | ||||
| 	github.com/libp2p/go-libp2p v0.35.4 | ||||
| 	github.com/pkg/errors v0.9.1 | ||||
| 	github.com/shopspring/decimal v1.4.0 | ||||
| 	github.com/spf13/cobra v1.8.0 | ||||
| 	github.com/spf13/pflag v1.0.5 // indirect | ||||
| 	go.uber.org/zap v1.27.0 | ||||
| 	google.golang.org/protobuf v1.34.1 // indirect | ||||
| 	source.quilibrium.com/quilibrium/monorepo/node v1.14.17 | ||||
| ) | ||||
|  | ||||
							
								
								
									
										664
									
								
								client/go.sum
									
									
									
									
									
								
							
							
						
						
									
										664
									
								
								client/go.sum
									
									
									
									
									
								
							| @ -1,6 +1,27 @@ | ||||
| cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= | ||||
| cloud.google.com/go v0.31.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.37.0/go.mod h1:TS1dMSSfndXH133OKGwekG838Om/cQT0BUHV3HcBgoo= | ||||
| dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= | ||||
| dmitri.shuralyov.com/html/belt v0.0.0-20180602232347-f7d459c86be0/go.mod h1:JLBrvjyP0v+ecvNYvCpyZgu5/xkfAUhi6wJj28eUfSU= | ||||
| dmitri.shuralyov.com/service/change v0.0.0-20181023043359-a85b471d5412/go.mod h1:a1inKt/atXimZ4Mv927x+r7UpyzRUf4emIoiiSC2TN4= | ||||
| dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D6DFvNNtx+9ybjezNCa8XF0xaYcETyp6rHWU= | ||||
| filippo.io/edwards25519 v1.0.0-rc.1 h1:m0VOOB23frXZvAOK44usCgLWvtsxIoMCTBGJZlpmGfU= | ||||
| filippo.io/edwards25519 v1.0.0-rc.1/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= | ||||
| git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= | ||||
| github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= | ||||
| github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= | ||||
| github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= | ||||
| github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= | ||||
| github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= | ||||
| github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= | ||||
| github.com/benbjohnson/clock v1.3.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= | ||||
| github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= | ||||
| github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= | ||||
| github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= | ||||
| github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= | ||||
| github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= | ||||
| github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= | ||||
| github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= | ||||
| github.com/btcsuite/btcd v0.21.0-beta.0.20201114000516-e9c7a5ac6401 h1:0tjUthKCaF8zwF9Qg7lfnep0xdo4n8WiFUfQPaMHX6g= | ||||
| github.com/btcsuite/btcd v0.21.0-beta.0.20201114000516-e9c7a5ac6401/go.mod h1:Sv4JPQ3/M+teHz9Bo5jBpkNcP0x6r7rdihlNL/7tTAs= | ||||
| @ -14,131 +35,758 @@ 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/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= | ||||
| github.com/bwesterb/go-ristretto v1.2.3 h1:1w53tCkGhCQ5djbat3+MH0BAQ5Kfgbt56UZQ/JMzngw= | ||||
| github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= | ||||
| github.com/cloudflare/circl v1.3.8 h1:j+V8jJt09PoeMFIu2uh5JUyEaIHTXVOHslFoLNAKqwI= | ||||
| github.com/cloudflare/circl v1.3.8/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU= | ||||
| github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= | ||||
| github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= | ||||
| github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= | ||||
| github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= | ||||
| github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= | ||||
| github.com/cloudflare/circl v1.3.9 h1:QFrlgFYf2Qpi8bSpVPK1HBvWpx16v/1TZivyo7pGuBE= | ||||
| github.com/cloudflare/circl v1.3.9/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU= | ||||
| github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= | ||||
| 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= | ||||
| github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= | ||||
| github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= | ||||
| github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= | ||||
| github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895 h1:XANOgPYtvELQ/h4IrmPAohXqe2pWA8Bwhejr3VQoZsA= | ||||
| github.com/cockroachdb/metamorphic v0.0.0-20231108215700-4ba948b56895/go.mod h1:aPd7gM9ov9M8v32Yy5NJrDyOcD8z642dqs+F0CeNXfA= | ||||
| github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= | ||||
| github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= | ||||
| github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= | ||||
| github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ= | ||||
| github.com/consensys/bavard v0.1.8-0.20210915155054-088da2f7f54a/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= | ||||
| github.com/consensys/gnark-crypto v0.5.3 h1:4xLFGZR3NWEH2zy+YzvzHicpToQR8FXFbfLNvpGB+rE= | ||||
| github.com/consensys/gnark-crypto v0.5.3/go.mod h1:hOdPlWQV1gDLp7faZVeg8Y0iEPFaOUnCc4XeCCk96p0= | ||||
| github.com/containerd/cgroups v0.0.0-20201119153540-4cbc285b3327/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= | ||||
| github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= | ||||
| github.com/containerd/cgroups v1.1.0/go.mod h1:6ppBcbh/NOOUU+dMKrykgaBnK9lCIBxHqJDGwsa1mIw= | ||||
| github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= | ||||
| github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= | ||||
| github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= | ||||
| github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= | ||||
| github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= | ||||
| github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= | ||||
| github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= | ||||
| github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= | ||||
| github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= | ||||
| github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||
| github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= | ||||
| github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= | ||||
| github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= | ||||
| github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= | ||||
| github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0 h1:rpfIENRNNilwHwZeG5+P150SMrnNEcHYvcCuK6dPZSg= | ||||
| github.com/decred/dcrd/dcrec/secp256k1/v4 v4.3.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= | ||||
| github.com/decred/dcrd/lru v1.0.0/go.mod h1:mxKOwFd7lFjN2GZYsiz/ecgqR6kkYAl+0pz0tEMk218= | ||||
| github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= | ||||
| github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= | ||||
| github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= | ||||
| github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= | ||||
| github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= | ||||
| github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= | ||||
| github.com/elastic/gosigar v0.14.2/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= | ||||
| 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/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= | ||||
| github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= | ||||
| github.com/flynn/noise v1.1.0 h1:KjPQoQCEFdZDiP03phOvGi11+SVVhBG2wOWAorLsstg= | ||||
| github.com/flynn/noise v1.1.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= | ||||
| github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= | ||||
| github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= | ||||
| github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= | ||||
| github.com/frankban/quicktest v1.14.4/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= | ||||
| github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= | ||||
| github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= | ||||
| github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= | ||||
| github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= | ||||
| github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= | ||||
| github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= | ||||
| 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-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= | ||||
| github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= | ||||
| github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= | ||||
| 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-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= | ||||
| github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= | ||||
| github.com/go-yaml/yaml v2.1.0+incompatible/go.mod h1:w2MrLa16VYP0jy6N7M5kHaCkaLENm+P+Tv+MfurjSw0= | ||||
| github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= | ||||
| github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= | ||||
| github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= | ||||
| github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= | ||||
| github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= | ||||
| github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= | ||||
| github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= | ||||
| github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= | ||||
| github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= | ||||
| 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-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/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:tluoj9z5200jBnyusfRPU2LqT6J+DAorxEvtC7LHB+E= | ||||
| 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/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||||
| github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= | ||||
| github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||||
| github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||||
| github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= | ||||
| github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= | ||||
| github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= | ||||
| github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= | ||||
| github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= | ||||
| github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= | ||||
| 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.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= | ||||
| github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= | ||||
| github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= | ||||
| github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= | ||||
| github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= | ||||
| github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= | ||||
| github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | ||||
| github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | ||||
| github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.0/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.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||
| github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= | ||||
| github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= | ||||
| github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= | ||||
| github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= | ||||
| github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= | ||||
| 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/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= | ||||
| github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5 h1:E/LAvt58di64hlYjx7AsNS6C/ysHWYo+2qPCZKTQhRo= | ||||
| github.com/google/pprof v0.0.0-20240207164012-fb44976bdcd5/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= | ||||
| 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.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= | ||||
| github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||
| github.com/googleapis/gax-go v2.0.0+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= | ||||
| github.com/googleapis/gax-go/v2 v2.0.3/go.mod h1:LLvjysVCY1JZeum8Z6l8qUty8fiNwE08qbEPm1M08qg= | ||||
| github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= | ||||
| github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c h1:7lF+Vz0LqiRidnzC1Oq86fpX1q/iEv2KJdrCtttYjT4= | ||||
| github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= | ||||
| github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= | ||||
| github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= | ||||
| github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= | ||||
| github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= | ||||
| github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk= | ||||
| github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0/go.mod h1:TzP6duP4Py2pHLVPPQp42aoYI92+PCrVotyR5e8Vqlk= | ||||
| github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= | ||||
| github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= | ||||
| github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= | ||||
| 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/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= | ||||
| github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= | ||||
| github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= | ||||
| github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= | ||||
| github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= | ||||
| github.com/iden3/go-iden3-crypto v0.0.15 h1:4MJYlrot1l31Fzlo2sF56u7EVFeHHJkxGXXZCtESgK4= | ||||
| github.com/iden3/go-iden3-crypto v0.0.15/go.mod h1:dLpM4vEPJ3nDHzhWFXDjzkn1qHoBeOT/3UEhXsEsP3E= | ||||
| github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= | ||||
| github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= | ||||
| github.com/iden3/go-iden3-crypto v0.0.16 h1:zN867xiz6HgErXVIV/6WyteGcOukE9gybYTorBMEdsk= | ||||
| github.com/iden3/go-iden3-crypto v0.0.16/go.mod h1:dLpM4vEPJ3nDHzhWFXDjzkn1qHoBeOT/3UEhXsEsP3E= | ||||
| github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= | ||||
| github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= | ||||
| github.com/ipfs/boxo v0.10.0 h1:tdDAxq8jrsbRkYoF+5Rcqyeb91hgWe2hp7iLu7ORZLY= | ||||
| github.com/ipfs/boxo v0.10.0/go.mod h1:Fg+BnfxZ0RPzR0nOodzdIq3A7KgoWAOWsEIImrIQdBM= | ||||
| github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= | ||||
| github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= | ||||
| github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= | ||||
| github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= | ||||
| github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= | ||||
| github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= | ||||
| github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= | ||||
| github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= | ||||
| github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= | ||||
| github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= | ||||
| github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= | ||||
| github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= | ||||
| github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= | ||||
| github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= | ||||
| github.com/ipld/go-ipld-prime v0.20.0 h1:Ud3VwE9ClxpO2LkCYP7vWPc0Fo+dYdYzgxUJZ3uRG4g= | ||||
| github.com/ipld/go-ipld-prime v0.20.0/go.mod h1:PzqZ/ZR981eKbgdr3y2DJYeD/8bgMawdGVlJDE8kK+M= | ||||
| github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= | ||||
| github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= | ||||
| github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= | ||||
| github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= | ||||
| github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= | ||||
| github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= | ||||
| github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= | ||||
| github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= | ||||
| 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/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= | ||||
| github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= | ||||
| github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= | ||||
| github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= | ||||
| github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= | ||||
| github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= | ||||
| github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= | ||||
| github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= | ||||
| github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= | ||||
| github.com/klauspost/compress v1.17.8 h1:YcnTYrq7MikUT7k0Yb5eceMmALQPYBW/Xltxn0NAMnU= | ||||
| github.com/klauspost/compress v1.17.8/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= | ||||
| github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= | ||||
| github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= | ||||
| github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= | ||||
| github.com/klauspost/cpuid/v2 v2.2.6/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= | ||||
| github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= | ||||
| github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= | ||||
| 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/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= | ||||
| github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= | ||||
| github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= | ||||
| github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= | ||||
| github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | ||||
| github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | ||||
| github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | ||||
| github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= | ||||
| github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= | ||||
| github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= | ||||
| github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= | ||||
| github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= | ||||
| github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= | ||||
| github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= | ||||
| github.com/libp2p/go-cidranger v1.1.0/go.mod h1:KWZTfSr+r9qEo9OkI9/SIEeAtw+NNoU0dXIXt15Okic= | ||||
| github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= | ||||
| github.com/libp2p/go-flow-metrics v0.1.0/go.mod h1:4Xi8MX8wj5aWNDAZttg6UPmc0ZrnFNsMtpsYUClFtro= | ||||
| github.com/libp2p/go-libp2p-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-libp2p-kbucket v0.6.3 h1:p507271wWzpy2f1XxPzCQG9NiN6R6lHL9GiSErbQQo0= | ||||
| github.com/libp2p/go-libp2p-kbucket v0.6.3/go.mod h1:RCseT7AH6eJWxxk2ol03xtP9pEHetYSPXOaJnOiD8i0= | ||||
| github.com/libp2p/go-libp2p-record v0.2.0 h1:oiNUOCWno2BFuxt3my4i1frNrt7PerzB3queqa1NkQ0= | ||||
| github.com/libp2p/go-libp2p-record v0.2.0/go.mod h1:I+3zMkvvg5m2OcSdoL0KPljyJyvNDFGKX7QdlpYUcwk= | ||||
| github.com/libp2p/go-libp2p-routing-helpers v0.7.2 h1:xJMFyhQ3Iuqnk9Q2dYE1eUTzsah7NLw3Qs2zjUV78T0= | ||||
| github.com/libp2p/go-libp2p-routing-helpers v0.7.2/go.mod h1:cN4mJAD/7zfPKXBcs9ze31JGYAZgzdABEm+q/hkswb8= | ||||
| github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= | ||||
| github.com/libp2p/go-libp2p-testing v0.12.0/go.mod h1:KcGDRXyN7sQCllucn1cOOS+Dmm7ujhfEyXQL5lvkcPg= | ||||
| 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-nat v0.2.0 h1:Tyz+bUFAYqGyJ/ppPPymMGbIgNRH+WqC5QrT5fKrrGk= | ||||
| github.com/libp2p/go-nat v0.2.0/go.mod h1:3MJr+GRpRkyT65EpVPBstXLvOlAPzUVlG6Pwg9ohLJk= | ||||
| github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= | ||||
| github.com/libp2p/go-netroute v0.2.1/go.mod h1:hraioZr0fhBjG0ZRXJJ6Zj2IVEVNx6tDTFQfSmcq7mQ= | ||||
| 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/v4 v4.0.1 h1:FfDR4S1wj6Bw2Pqbc8Uz7pCxeRBPbwsBbEdfwiCypkQ= | ||||
| github.com/libp2p/go-yamux/v4 v4.0.1/go.mod h1:NWjl8ZTLOGlozrXSOZ/HlfG++39iKNnM5wwmtQP1YB4= | ||||
| github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= | ||||
| github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= | ||||
| github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= | ||||
| github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= | ||||
| github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= | ||||
| github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= | ||||
| github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= | ||||
| github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= | ||||
| github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= | ||||
| github.com/miekg/dns v1.1.58 h1:ca2Hdkz+cDg/7eNF6V56jjzuZ4aCAE+DbVkILdQWG/4= | ||||
| github.com/miekg/dns v1.1.58/go.mod h1:Ypv+3b/KadlvW9vJfXOTf300O4UqaHFzFCuHz+rPkBY= | ||||
| github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c h1:bzE/A84HN25pxAuk9Eej1Kz9OUelF97nAc82bDquQI8= | ||||
| github.com/mikioh/tcp v0.0.0-20190314235350-803a9b46060c/go.mod h1:0SQS9kMwD2VsyFEB++InYyBJroV/FRmBgcydeSUcJms= | ||||
| github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= | ||||
| github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b/go.mod h1:lxPUiZwKoFL8DUUmalo2yJJUCxbPKtm8OKfqr2/FTNU= | ||||
| github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= | ||||
| github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc/go.mod h1:cGKTAVKx4SxOuR/czcZ/E2RSJ3sfHs8FpHhQ5CWMf9s= | ||||
| github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= | ||||
| github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= | ||||
| github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= | ||||
| github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= | ||||
| github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= | ||||
| github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= | ||||
| github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= | ||||
| github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= | ||||
| github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= | ||||
| github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= | ||||
| github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= | ||||
| github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= | ||||
| github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= | ||||
| github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= | ||||
| github.com/multiformats/go-base36 v0.1.0/go.mod h1:kFGE83c6s80PklsHO9sRn2NCoffoRdUUOENyW/Vv6sM= | ||||
| github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= | ||||
| github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= | ||||
| github.com/multiformats/go-multiaddr v0.12.4 h1:rrKqpY9h+n80EwhhC/kkcunCZZ7URIF8yN1WEUt2Hvc= | ||||
| github.com/multiformats/go-multiaddr v0.12.4/go.mod h1:sBXrNzucqkFJhvKOiwwLyqamGa/P5EIXNPLovyhQCII= | ||||
| github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= | ||||
| github.com/multiformats/go-multiaddr-fmt v0.1.0/go.mod h1:hGtDIW4PU4BqJ50gW2quDuPVjyWNZxToGUh/HwTZYJo= | ||||
| github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= | ||||
| github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= | ||||
| github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= | ||||
| github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= | ||||
| github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= | ||||
| github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= | ||||
| github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= | ||||
| github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= | ||||
| github.com/multiformats/go-multistream v0.5.0 h1:5htLSLl7lvJk3xx3qT/8Zm9J4K8vEOf/QGkvOGQAyiE= | ||||
| github.com/multiformats/go-multistream v0.5.0/go.mod h1:n6tMZiwiP2wUsR8DgfDWw1dydlEqV3l6N3/GBsX6ILA= | ||||
| github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= | ||||
| github.com/multiformats/go-varint v0.0.6/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= | ||||
| github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= | ||||
| github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= | ||||
| github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= | ||||
| github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= | ||||
| github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||||
| github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= | ||||
| github.com/onsi/ginkgo/v2 v2.15.0 h1:79HwNRBAZHOEwrczrgSOPy+eFTTlIGELKy5as+ClttY= | ||||
| github.com/onsi/ginkgo/v2 v2.15.0/go.mod h1:HlxMHtYF57y6Dpf+mc5529KKmSq9h2FpCF+/ZkwUxKM= | ||||
| 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.30.0 h1:hvMK7xYz4D3HapigLTeGdId/NcfQx1VHMJc60ew99+8= | ||||
| github.com/onsi/gomega v1.30.0/go.mod h1:9sxs+SwGrKI0+PWe4Fxa9tFQQBG5xSsSbMXOI8PPpoQ= | ||||
| github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= | ||||
| github.com/opencontainers/runtime-spec v1.2.0 h1:z97+pHb3uELt/yiAWD691HNHQIF07bE7dzrbT927iTk= | ||||
| github.com/opencontainers/runtime-spec v1.2.0/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= | ||||
| github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= | ||||
| github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= | ||||
| github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= | ||||
| github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= | ||||
| github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= | ||||
| github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= | ||||
| github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= | ||||
| github.com/pion/datachannel v1.5.6 h1:1IxKJntfSlYkpUj8LlYRSWpYiTTC02nUrOE8T3DqGeg= | ||||
| github.com/pion/datachannel v1.5.6/go.mod h1:1eKT6Q85pRnr2mHiWHxJwO50SfZRtWHTsNIVb/NfGW4= | ||||
| github.com/pion/dtls/v2 v2.2.7/go.mod h1:8WiMkebSHFD0T+dIU+UeBaoV7kDhOW5oDCzZ7WZ/F9s= | ||||
| github.com/pion/dtls/v2 v2.2.11 h1:9U/dpCYl1ySttROPWJgqWKEylUdT0fXp/xst6JwY5Ks= | ||||
| github.com/pion/dtls/v2 v2.2.11/go.mod h1:d9SYc9fch0CqK90mRk1dC7AkzzpwJj6u2GU3u+9pqFE= | ||||
| github.com/pion/ice/v2 v2.3.25 h1:M5rJA07dqhi3nobJIg+uPtcVjFECTrhcR3n0ns8kDZs= | ||||
| github.com/pion/ice/v2 v2.3.25/go.mod h1:KXJJcZK7E8WzrBEYnV4UtqEZsGeWfHxsNqhVcVvgjxw= | ||||
| github.com/pion/interceptor v0.1.29 h1:39fsnlP1U8gw2JzOFWdfCU82vHvhW9o0rZnZF56wF+M= | ||||
| github.com/pion/interceptor v0.1.29/go.mod h1:ri+LGNjRUc5xUNtDEPzfdkmSqISixVTBF/z/Zms/6T4= | ||||
| github.com/pion/logging v0.2.2 h1:M9+AIj/+pxNsDfAT64+MAVgJO0rsyLnoJKCqf//DoeY= | ||||
| github.com/pion/logging v0.2.2/go.mod h1:k0/tDVsRCX2Mb2ZEmTqNa7CWsQPc+YYCB7Q+5pahoms= | ||||
| github.com/pion/mdns v0.0.12 h1:CiMYlY+O0azojWDmxdNr7ADGrnZ+V6Ilfner+6mSVK8= | ||||
| github.com/pion/mdns v0.0.12/go.mod h1:VExJjv8to/6Wqm1FXK+Ii/Z9tsVk/F5sD/N70cnYFbk= | ||||
| github.com/pion/randutil v0.1.0 h1:CFG1UdESneORglEsnimhUjf33Rwjubwj6xfiOXBa3mA= | ||||
| github.com/pion/randutil v0.1.0/go.mod h1:XcJrSMMbbMRhASFVOlj/5hQial/Y8oH/HVo7TBZq+j8= | ||||
| github.com/pion/rtcp v1.2.12/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= | ||||
| github.com/pion/rtcp v1.2.14 h1:KCkGV3vJ+4DAJmvP0vaQShsb0xkRfWkO540Gy102KyE= | ||||
| github.com/pion/rtcp v1.2.14/go.mod h1:sn6qjxvnwyAkkPzPULIbVqSKI5Dv54Rv7VG0kNxh9L4= | ||||
| github.com/pion/rtp v1.8.3/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= | ||||
| github.com/pion/rtp v1.8.6 h1:MTmn/b0aWWsAzux2AmP8WGllusBVw4NPYPVFFd7jUPw= | ||||
| github.com/pion/rtp v1.8.6/go.mod h1:pBGHaFt/yW7bf1jjWAoUjpSNoDnw98KTMg+jWWvziqU= | ||||
| github.com/pion/sctp v1.8.13/go.mod h1:YKSgO/bO/6aOMP9LCie1DuD7m+GamiK2yIiPM6vH+GA= | ||||
| github.com/pion/sctp v1.8.16 h1:PKrMs+o9EMLRvFfXq59WFsC+V8mN1wnKzqrv+3D/gYY= | ||||
| github.com/pion/sctp v1.8.16/go.mod h1:P6PbDVA++OJMrVNg2AL3XtYHV4uD6dvfyOovCgMs0PE= | ||||
| github.com/pion/sdp/v3 v3.0.9 h1:pX++dCHoHUwq43kuwf3PyJfHlwIj4hXA7Vrifiq0IJY= | ||||
| github.com/pion/sdp/v3 v3.0.9/go.mod h1:B5xmvENq5IXJimIO4zfp6LAe1fD9N+kFv+V/1lOdz8M= | ||||
| github.com/pion/srtp/v2 v2.0.18 h1:vKpAXfawO9RtTRKZJbG4y0v1b11NZxQnxRl85kGuUlo= | ||||
| github.com/pion/srtp/v2 v2.0.18/go.mod h1:0KJQjA99A6/a0DOVTu1PhDSw0CXF2jTkqOoMg3ODqdA= | ||||
| github.com/pion/stun v0.6.1 h1:8lp6YejULeHBF8NmV8e2787BogQhduZugh5PdhDyyN4= | ||||
| github.com/pion/stun v0.6.1/go.mod h1:/hO7APkX4hZKu/D0f2lHzNyvdkTGtIy3NDmLR7kSz/8= | ||||
| github.com/pion/transport/v2 v2.2.1/go.mod h1:cXXWavvCnFF6McHTft3DWS9iic2Mftcz1Aq29pGcU5g= | ||||
| github.com/pion/transport/v2 v2.2.2/go.mod h1:OJg3ojoBJopjEeECq2yJdXH9YVrUJ1uQ++NjXLOUorc= | ||||
| github.com/pion/transport/v2 v2.2.3/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= | ||||
| github.com/pion/transport/v2 v2.2.4/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= | ||||
| github.com/pion/transport/v2 v2.2.5 h1:iyi25i/21gQck4hfRhomF6SktmUQjRsRW4WJdhfc3Kc= | ||||
| github.com/pion/transport/v2 v2.2.5/go.mod h1:q2U/tf9FEfnSBGSW6w5Qp5PFWRLRj3NjLhCCgpRK4p0= | ||||
| github.com/pion/transport/v3 v3.0.1/go.mod h1:UY7kiITrlMv7/IKgd5eTUcaahZx5oUN3l9SzK5f5xE0= | ||||
| github.com/pion/transport/v3 v3.0.2 h1:r+40RJR25S9w3jbA6/5uEPTzcdn7ncyU44RWCbHkLg4= | ||||
| github.com/pion/transport/v3 v3.0.2/go.mod h1:nIToODoOlb5If2jF9y2Igfx3PFYWfuXi37m0IlWa/D0= | ||||
| github.com/pion/turn/v2 v2.1.3/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= | ||||
| github.com/pion/turn/v2 v2.1.6 h1:Xr2niVsiPTB0FPtt+yAWKFUkU1eotQbGgpTIld4x1Gc= | ||||
| github.com/pion/turn/v2 v2.1.6/go.mod h1:huEpByKKHix2/b9kmTAM3YoX6MKP+/D//0ClgUYR2fY= | ||||
| github.com/pion/webrtc/v3 v3.2.40 h1:Wtfi6AZMQg+624cvCXUuSmrKWepSB7zfgYDOYqsSOVU= | ||||
| github.com/pion/webrtc/v3 v3.2.40/go.mod h1:M1RAe3TNTD1tzyvqHrbVODfwdPGSXOUo/OgpoGGJqFY= | ||||
| github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= | ||||
| github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||
| github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= | ||||
| github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||
| github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= | ||||
| github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||
| github.com/polydawn/refmt v0.89.0 h1:ADJTApkvkeBZsN0tBTx8QjpD9JkmxbKp0cxfr9qszm4= | ||||
| github.com/polydawn/refmt v0.89.0/go.mod h1:/zvteZs/GwLtCgZ4BL6CBsk9IKIlexP43ObX9AxTqTw= | ||||
| github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= | ||||
| github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQeLaYJFJBOE= | ||||
| github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= | ||||
| github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= | ||||
| github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= | ||||
| github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= | ||||
| github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= | ||||
| github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= | ||||
| github.com/prometheus/common v0.48.0 h1:QO8U2CdOzSn1BBsmXJXduaaW+dY/5QLjfB8svtSzKKE= | ||||
| github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= | ||||
| github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= | ||||
| github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= | ||||
| github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= | ||||
| github.com/quic-go/qpack v0.4.0 h1:Cr9BXA1sQS2SmDUWjSofMPNKmvF6IiIfDRmgU0w1ZCo= | ||||
| github.com/quic-go/qpack v0.4.0/go.mod h1:UZVnYIfi5GRk+zI9UMaCPsmZ2xKJP7XBUvVyT1Knj9A= | ||||
| github.com/quic-go/quic-go v0.44.0 h1:So5wOr7jyO4vzL2sd8/pD9Kesciv91zSk8BoFngItQ0= | ||||
| github.com/quic-go/quic-go v0.44.0/go.mod h1:z4cx/9Ny9UtGITIPzmPTXh1ULfOyWh4qGQlpnPcWmek= | ||||
| github.com/quic-go/webtransport-go v0.8.0 h1:HxSrwun11U+LlmwpgM1kEqIqH90IT4N8auv/cD7QFJg= | ||||
| github.com/quic-go/webtransport-go v0.8.0/go.mod h1:N99tjprW432Ut5ONql/aUhSLT0YVSlwHohQsuac9WaM= | ||||
| github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= | ||||
| github.com/raulk/go-watchdog v1.3.0/go.mod h1:fIvOnLbF0b0ZwkB9YU4mOW9Did//4vPZtDqv66NfsMU= | ||||
| github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= | ||||
| github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= | ||||
| github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= | ||||
| github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= | ||||
| github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= | ||||
| github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= | ||||
| github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= | ||||
| github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= | ||||
| github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k= | ||||
| github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= | ||||
| github.com/shurcooL/component v0.0.0-20170202220835-f88ec8f54cc4/go.mod h1:XhFIlyj5a1fBNx5aJTbKoIq0mNaPvOagO+HjB3EtxrY= | ||||
| github.com/shurcooL/events v0.0.0-20181021180414-410e4ca65f48/go.mod h1:5u70Mqkb5O5cxEA8nxTsgrgLehJeAw6Oc4Ab1c/P1HM= | ||||
| github.com/shurcooL/github_flavored_markdown v0.0.0-20181002035957-2122de532470/go.mod h1:2dOwnU2uBioM+SGy2aZoq1f/Sd1l9OkAeAUvjSyvgU0= | ||||
| github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= | ||||
| github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ= | ||||
| github.com/shurcooL/gofontwoff v0.0.0-20180329035133-29b52fc0a18d/go.mod h1:05UtEgK5zq39gLST6uB0cf3NEHjETfB4Fgr3Gx5R9Vw= | ||||
| github.com/shurcooL/gopherjslib v0.0.0-20160914041154-feb6d3990c2c/go.mod h1:8d3azKNyqcHP1GaQE/c6dDgjkgSx2BZ4IoEi4F1reUI= | ||||
| github.com/shurcooL/highlight_diff v0.0.0-20170515013008-09bb4053de1b/go.mod h1:ZpfEhSmds4ytuByIcDnOLkTHGUI6KNqRNPDLHDk+mUU= | ||||
| github.com/shurcooL/highlight_go v0.0.0-20181028180052-98c3abbbae20/go.mod h1:UDKB5a1T23gOMUJrI+uSuH0VRDStOiUVSjBTRDVBVag= | ||||
| github.com/shurcooL/home v0.0.0-20181020052607-80b7ffcb30f9/go.mod h1:+rgNQw2P9ARFAs37qieuu7ohDNQ3gds9msbT2yn85sg= | ||||
| github.com/shurcooL/htmlg v0.0.0-20170918183704-d01228ac9e50/go.mod h1:zPn1wHpTIePGnXSHpsVPWEktKXHr6+SS6x/IKRb7cpw= | ||||
| github.com/shurcooL/httperror v0.0.0-20170206035902-86b7830d14cc/go.mod h1:aYMfkZ6DWSJPJ6c4Wwz3QtW22G7mf/PEgaB9k/ik5+Y= | ||||
| github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= | ||||
| github.com/shurcooL/httpgzip v0.0.0-20180522190206-b1c53ac65af9/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q= | ||||
| github.com/shurcooL/issues v0.0.0-20181008053335-6292fdc1e191/go.mod h1:e2qWDig5bLteJ4fwvDAc2NHzqFEthkqn7aOZAOpj+PQ= | ||||
| github.com/shurcooL/issuesapp v0.0.0-20180602232740-048589ce2241/go.mod h1:NPpHK2TI7iSaM0buivtFUc9offApnI0Alt/K8hcHy0I= | ||||
| github.com/shurcooL/notifications v0.0.0-20181007000457-627ab5aea122/go.mod h1:b5uSkrEVM1jQUspwbixRBhaIjIzL2xazXp6kntxYle0= | ||||
| github.com/shurcooL/octicon v0.0.0-20181028054416-fa4f57f9efb2/go.mod h1:eWdoE5JD4R5UVWDucdOPg1g2fqQRq78IQa9zlOV1vpQ= | ||||
| github.com/shurcooL/reactions v0.0.0-20181006231557-f2e0b4ca5b82/go.mod h1:TCR1lToEk4d2s07G3XGfz2QrgHXg4RJBvjrOozvoWfk= | ||||
| github.com/shurcooL/sanitized_anchor_name v0.0.0-20170918181015-86672fcb3f95/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= | ||||
| github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= | ||||
| github.com/shurcooL/users v0.0.0-20180125191416-49c67e49c537/go.mod h1:QJTqeLYEDaXHZDBsXlPCDqdhQuJkuw4NOtaxYe3xii4= | ||||
| github.com/shurcooL/webdavfs v0.0.0-20170829043945-18c3829fa133/go.mod h1:hKmq5kWdCj2z2KEozexVbfEZIWiTjhE0+UjmZgPqehw= | ||||
| github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= | ||||
| github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= | ||||
| github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= | ||||
| github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg= | ||||
| github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= | ||||
| github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= | ||||
| github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= | ||||
| github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= | ||||
| github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= | ||||
| github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= | ||||
| github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= | ||||
| github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= | ||||
| github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= | ||||
| github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||
| github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= | ||||
| github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= | ||||
| github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= | ||||
| github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= | ||||
| github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | ||||
| github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= | ||||
| github.com/stretchr/testify v1.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.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= | ||||
| github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= | ||||
| github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= | ||||
| github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= | ||||
| github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= | ||||
| github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= | ||||
| github.com/urfave/cli v1.22.10/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= | ||||
| github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= | ||||
| github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= | ||||
| github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0 h1:GDDkbFiaK8jsSDJfjId/PEGEShv6ugrt4kYsC5UIDaQ= | ||||
| github.com/warpfork/go-wish v0.0.0-20220906213052-39a1cc7a02d0/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= | ||||
| github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1 h1:EKhdznlJHPMoKr0XTrX+IlJs1LH3lyx2nfr1dOlZ79k= | ||||
| github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h1:8UvriyWtv5Q5EOgjHaSseUEdkQfvwFv1I/In/O2M9gc= | ||||
| github.com/yuin/goldmark v1.1.27/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= | ||||
| go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= | ||||
| 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= | ||||
| go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= | ||||
| go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= | ||||
| 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.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= | ||||
| go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= | ||||
| go.uber.org/dig v1.17.1 h1:Tga8Lz8PcYNsWsyHMZ1Vm0OQOUaJNDyvPImgbAu9YSc= | ||||
| go.uber.org/dig v1.17.1/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE= | ||||
| go.uber.org/fx v1.22.1 h1:nvvln7mwyT5s1q201YE29V/BFrGor6vMiDNpU/78Mys= | ||||
| go.uber.org/fx v1.22.1/go.mod h1:HT2M7d7RHo+ebKGh9NRcrsrHHfpZ60nW3QRubMRfv48= | ||||
| go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= | ||||
| go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= | ||||
| go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= | ||||
| go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= | ||||
| go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= | ||||
| go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= | ||||
| go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= | ||||
| go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= | ||||
| go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= | ||||
| go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= | ||||
| go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= | ||||
| go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= | ||||
| go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= | ||||
| go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= | ||||
| go4.org v0.0.0-20180809161055-417644f6feb5/go.mod h1:MkTOUMDaeVYJUOUsaDXIhWPZYa1yOyC1qaOBpL57BhE= | ||||
| golang.org/x/build v0.0.0-20190111050920-041ab4dc3f9d/go.mod h1:OWs+y06UdEOHN4y+MfF/py+xQ/tYqIWW03b70/CG9Rw= | ||||
| golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= | ||||
| golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/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-20190313024323-a1f597ede03a/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||
| golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||
| golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||
| golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/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-20220525230936-793ad666bf5e/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= | ||||
| golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= | ||||
| golang.org/x/crypto v0.8.0/go.mod h1:mRqEX+O9/h5TFCrQhkgjo2yKi0yYA+9ecGkdQoHrywE= | ||||
| golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= | ||||
| golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= | ||||
| golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg= | ||||
| golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= | ||||
| golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= | ||||
| golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= | ||||
| golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= | ||||
| golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | ||||
| golang.org/x/exp v0.0.0-20230725012225-302865e7556b/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= | ||||
| golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= | ||||
| golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= | ||||
| golang.org/x/lint v0.0.0-20180702182130-06c8688daad7/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= | ||||
| 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-20190313153728-d0100b6bd8b3/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-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= | ||||
| golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= | ||||
| golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/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.2/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.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= | ||||
| golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= | ||||
| golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= | ||||
| golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= | ||||
| golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= | ||||
| golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20181029044818-c44066c5c816/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20181106065722-10aee1819953/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= | ||||
| golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||
| golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||
| golang.org/x/net v0.0.0-20201021035429-f5854403a974/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-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-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= | ||||
| 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.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= | ||||
| golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= | ||||
| golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= | ||||
| golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= | ||||
| golang.org/x/net v0.13.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= | ||||
| golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= | ||||
| golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= | ||||
| golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= | ||||
| golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= | ||||
| golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= | ||||
| golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= | ||||
| golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | ||||
| golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | ||||
| golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | ||||
| golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | ||||
| golang.org/x/perf v0.0.0-20180704124530-6e6d33e29852/go.mod h1:JLpeXjPJfIyPr5TlbXLkXWLhP8nz10XfvxElABhCtcw= | ||||
| golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||
| golang.org/x/sync v0.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.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= | ||||
| golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= | ||||
| golang.org/x/sys v0.0.0-20180810173357-98c5dad5d1a0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||
| 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-20181029174526-d69651ed3497/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-20190316082340-a2f829d7f35f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/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-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210420205809-ac73e9fd8988/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||
| golang.org/x/sys v0.0.0-20210510120138-977fb7262007/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-20210630005230-0f9fa26af87c/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-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.1.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.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||
| golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||
| golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||
| golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||
| golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= | ||||
| golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= | ||||
| 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.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= | ||||
| golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= | ||||
| golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= | ||||
| golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= | ||||
| golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= | ||||
| golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= | ||||
| golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY= | ||||
| golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= | ||||
| golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= | ||||
| 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.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.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= | ||||
| golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= | ||||
| golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= | ||||
| golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= | ||||
| golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= | ||||
| golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= | ||||
| golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= | ||||
| golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= | ||||
| golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= | ||||
| golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= | ||||
| golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||
| golang.org/x/tools v0.0.0-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-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= | ||||
| golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= | ||||
| golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= | ||||
| golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||
| golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/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-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= | ||||
| golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= | ||||
| golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | ||||
| 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.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= | ||||
| golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= | ||||
| golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= | ||||
| golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= | ||||
| golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||
| gonum.org/v1/gonum v0.13.0 h1:a0T3bh+7fhRyqeNbiC3qVHYmkiQgit3wnNan/2c0HMM= | ||||
| gonum.org/v1/gonum v0.13.0/go.mod h1:/WPYRckkfWrhWefxyYTfrTtQR0KH4iyHNuzxqXAKyAU= | ||||
| google.golang.org/api v0.0.0-20180910000450-7ca32eb868bf/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= | ||||
| google.golang.org/api v0.0.0-20181030000543-1d582fd0359e/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= | ||||
| google.golang.org/api v0.1.0/go.mod h1:UGEZY7KEX120AnNLIHFMKIo4obdJhkp2tPbaPlQx13Y= | ||||
| google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= | ||||
| google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | ||||
| google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | ||||
| google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= | ||||
| 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-20181029155118-b69ba1387ce2/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= | ||||
| google.golang.org/genproto v0.0.0-20181202183823-bd91e49a0898/go.mod h1:7Ep/1NZk928CDR8SjdVbjWNpdIf6nzjE3BTgJDr2Atg= | ||||
| google.golang.org/genproto v0.0.0-20190306203927-b5d61aea6440/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= | ||||
| google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= | ||||
| google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= | ||||
| google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= | ||||
| google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= | ||||
| google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= | ||||
| google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= | ||||
| google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= | ||||
| google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= | ||||
| google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= | ||||
| google.golang.org/grpc v1.16.0/go.mod h1:0JHn/cJsOMiMfNA9+DeHDlAU7KAAB5GDlYFpa9MZMio= | ||||
| google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= | ||||
| google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= | ||||
| 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.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= | ||||
| google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= | ||||
| google.golang.org/grpc v1.58.2 h1:SXUpjxeVF3FKrTYQI4f4KvbGD5u2xccdYdurwowix5I= | ||||
| google.golang.org/grpc v1.58.2/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= | ||||
| 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.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.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= | ||||
| google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= | ||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||
| gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= | ||||
| gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= | ||||
| gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= | ||||
| gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= | ||||
| gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= | ||||
| gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= | ||||
| gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
| gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
| gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||
| gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= | ||||
| gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= | ||||
| gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||
| gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||
| gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||
| gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= | ||||
| gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||
| grpc.go4.org v0.0.0-20170609214715-11d0a25b4919/go.mod h1:77eQGdRu53HpSqPFJFmuJdjuHRquDANNeA4x7B8WQ9o= | ||||
| honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||
| 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-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||
| honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= | ||||
| lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= | ||||
| lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= | ||||
| lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= | ||||
| rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= | ||||
| sourcegraph.com/sourcegraph/go-diff v0.5.0/go.mod h1:kuch7UrkMzY0X+p9CRK03kfuPQ2zzQcaEFbx8wA8rck= | ||||
| sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0= | ||||
|  | ||||
| @ -79,12 +79,15 @@ func GetOutputs(output []byte) ( | ||||
| 	return index, indexProof, kzgCommitment, kzgProof | ||||
| } | ||||
| 
 | ||||
| func nearestPowerOfTwo(number uint64) uint64 { | ||||
| 	power := uint64(1) | ||||
| 	for number > power { | ||||
| 		power = power << 1 | ||||
| func nearestApplicablePowerOfTwo(number uint64) uint64 { | ||||
| 	power := uint64(128) | ||||
| 	if number > 2048 { | ||||
| 		power = 65536 | ||||
| 	} else if number > 1024 { | ||||
| 		power = 2048 | ||||
| 	} else if number > 128 { | ||||
| 		power = 1024 | ||||
| 	} | ||||
| 
 | ||||
| 	return power | ||||
| } | ||||
| 
 | ||||
| @ -112,7 +115,7 @@ func (n *Node) VerifyProofIntegrity() { | ||||
| 			idxCommit, | ||||
| 			int(idx), | ||||
| 			idxKP, | ||||
| 			nearestPowerOfTwo(uint64(parallelism)), | ||||
| 			nearestApplicablePowerOfTwo(uint64(parallelism)), | ||||
| 		) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
|  | ||||
| @ -200,7 +200,10 @@ func DownloadAndVerifyGenesis() (*SignedGenesisUnlock, error) { | ||||
| 
 | ||||
| var StasisSeed = "737461736973" | ||||
| 
 | ||||
| func LoadConfig(configPath string, proverKey string) (*Config, error) { | ||||
| func LoadConfig(configPath string, proverKey string, skipGenesisCheck bool) ( | ||||
| 	*Config, | ||||
| 	error, | ||||
| ) { | ||||
| 	info, err := os.Stat(configPath) | ||||
| 	if os.IsNotExist(err) { | ||||
| 		fmt.Println("Creating config directory " + configPath) | ||||
| @ -229,10 +232,12 @@ func LoadConfig(configPath string, proverKey string) (*Config, error) { | ||||
| 
 | ||||
| 	genesisSeed := StasisSeed | ||||
| 
 | ||||
| 	if !skipGenesisCheck { | ||||
| 		output, err := DownloadAndVerifyGenesis() | ||||
| 		if err == nil { | ||||
| 			genesisSeed = output.GenesisSeedHex | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	config := &Config{ | ||||
| 		DB: &DBConfig{ | ||||
|  | ||||
| @ -36,5 +36,5 @@ func FormatVersion(version []byte) string { | ||||
| } | ||||
| 
 | ||||
| func GetPatchNumber() byte { | ||||
| 	return 0x00 | ||||
| 	return 0x01 | ||||
| } | ||||
|  | ||||
| @ -6,6 +6,8 @@ import ( | ||||
| 	"crypto" | ||||
| 	"encoding/binary" | ||||
| 	"fmt" | ||||
| 	"math/big" | ||||
| 	"slices" | ||||
| 	"sync" | ||||
| 	"time" | ||||
| 
 | ||||
| @ -77,6 +79,7 @@ type DataClockConsensusEngine struct { | ||||
| 	lastFrameReceivedAt         time.Time | ||||
| 	latestFrameReceived         uint64 | ||||
| 	frameProverTries            []*tries.RollingFrecencyCritbitTrie | ||||
| 	frameProverTriesMx          sync.RWMutex | ||||
| 	dependencyMap               map[string]*anypb.Any | ||||
| 	pendingCommits              chan *anypb.Any | ||||
| 	pendingCommitWorkers        int64 | ||||
| @ -101,13 +104,41 @@ type DataClockConsensusEngine struct { | ||||
| 	stagedTransactionsMx           sync.Mutex | ||||
| 	peerMapMx                      sync.RWMutex | ||||
| 	peerAnnounceMapMx              sync.Mutex | ||||
| 	proverTrieJoinRequests         map[string]string | ||||
| 	proverTrieLeaveRequests        map[string]string | ||||
| 	proverTriePauseRequests        map[string]string | ||||
| 	proverTrieResumeRequests       map[string]string | ||||
| 	proverTrieRequestsMx           sync.Mutex | ||||
| 	lastKeyBundleAnnouncementFrame uint64 | ||||
| 	peerSeniority                  *peerSeniority | ||||
| 	peerMap                        map[string]*peerInfo | ||||
| 	uncooperativePeersMap          map[string]*peerInfo | ||||
| 	messageProcessorCh             chan *pb.Message | ||||
| 	report                         *protobufs.SelfTestReport | ||||
| } | ||||
| 
 | ||||
| type peerSeniorityItem struct { | ||||
| 	seniority uint64 | ||||
| 	addr      string | ||||
| } | ||||
| 
 | ||||
| type peerSeniority map[string]peerSeniorityItem | ||||
| 
 | ||||
| func newFromMap(m map[string]uint64) *peerSeniority { | ||||
| 	s := &peerSeniority{} | ||||
| 	for k, v := range m { | ||||
| 		(*s)[k] = peerSeniorityItem{ | ||||
| 			seniority: v, | ||||
| 			addr:      k, | ||||
| 		} | ||||
| 	} | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| func (p peerSeniorityItem) Priority() *big.Int { | ||||
| 	return big.NewInt(int64(p.seniority)) | ||||
| } | ||||
| 
 | ||||
| var _ consensus.DataConsensusEngine = (*DataClockConsensusEngine)(nil) | ||||
| 
 | ||||
| func NewDataClockConsensusEngine( | ||||
| @ -126,6 +157,7 @@ func NewDataClockConsensusEngine( | ||||
| 	report *protobufs.SelfTestReport, | ||||
| 	filter []byte, | ||||
| 	seed []byte, | ||||
| 	peerSeniority map[string]uint64, | ||||
| ) *DataClockConsensusEngine { | ||||
| 	if logger == nil { | ||||
| 		panic(errors.New("logger is nil")) | ||||
| @ -216,6 +248,7 @@ func NewDataClockConsensusEngine( | ||||
| 		masterTimeReel:            masterTimeReel, | ||||
| 		dataTimeReel:              dataTimeReel, | ||||
| 		peerInfoManager:           peerInfoManager, | ||||
| 		peerSeniority:             newFromMap(peerSeniority), | ||||
| 		messageProcessorCh:        make(chan *pb.Message), | ||||
| 	} | ||||
| 
 | ||||
| @ -420,8 +453,6 @@ func (e *DataClockConsensusEngine) PerformTimeProof( | ||||
| 	difficulty uint32, | ||||
| 	clients []protobufs.DataIPCServiceClient, | ||||
| ) []byte { | ||||
| 	proof := []byte{} | ||||
| 
 | ||||
| 	wg := sync.WaitGroup{} | ||||
| 	wg.Add(len(clients)) | ||||
| 	for i, client := range clients { | ||||
| @ -463,21 +494,60 @@ func (e *DataClockConsensusEngine) PerformTimeProof( | ||||
| 					continue | ||||
| 				} | ||||
| 
 | ||||
| 				proof = resp.Output | ||||
| 				sig, err := e.pubSub.SignMessage( | ||||
| 					append([]byte("mint"), resp.Output...), | ||||
| 				) | ||||
| 				if err != nil { | ||||
| 					e.logger.Error("failed to reconnect", zap.Error(err)) | ||||
| 					continue | ||||
| 				} | ||||
| 				e.publishMessage(e.filter, &protobufs.TokenRequest{ | ||||
| 					Request: &protobufs.TokenRequest_Mint{ | ||||
| 						Mint: &protobufs.MintCoinRequest{ | ||||
| 							Proofs: [][]byte{resp.Output}, | ||||
| 							Signature: &protobufs.Ed448Signature{ | ||||
| 								PublicKey: &protobufs.Ed448PublicKey{ | ||||
| 									KeyValue: e.pubSub.GetPublicKey(), | ||||
| 								}, | ||||
| 								Signature: sig, | ||||
| 							}, | ||||
| 						}, | ||||
| 					}, | ||||
| 				}) | ||||
| 				break | ||||
| 			} | ||||
| 			wg.Done() | ||||
| 		}() | ||||
| 	} | ||||
| 	wg.Wait() | ||||
| 
 | ||||
| 	return proof | ||||
| 	return []byte{} | ||||
| } | ||||
| 
 | ||||
| func ( | ||||
| 	e *DataClockConsensusEngine, | ||||
| ) GetFrameProverTries() []*tries.RollingFrecencyCritbitTrie { | ||||
| 	return e.frameProverTries | ||||
| 	e.frameProverTriesMx.RLock() | ||||
| 	frameProverTries := make( | ||||
| 		[]*tries.RollingFrecencyCritbitTrie, | ||||
| 		len(e.frameProverTries), | ||||
| 	) | ||||
| 
 | ||||
| 	for _, trie := range e.frameProverTries { | ||||
| 		newTrie := &tries.RollingFrecencyCritbitTrie{} | ||||
| 		b, err := trie.Serialize() | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 
 | ||||
| 		err = newTrie.Deserialize(b) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| 		frameProverTries = append(frameProverTries, newTrie) | ||||
| 	} | ||||
| 
 | ||||
| 	e.frameProverTriesMx.RUnlock() | ||||
| 	return frameProverTries | ||||
| } | ||||
| 
 | ||||
| func (e *DataClockConsensusEngine) runLoop() { | ||||
| @ -527,7 +597,11 @@ func (e *DataClockConsensusEngine) runLoop() { | ||||
| 					}() | ||||
| 				} | ||||
| 
 | ||||
| 				for _, trie := range e.frameProverTries { | ||||
| 				for _, trie := range e.GetFrameProverTries() { | ||||
| 					if bytes.Equal( | ||||
| 						trie.FindNearest(e.provingKeyAddress).External.Key, | ||||
| 						e.provingKeyAddress, | ||||
| 					) { | ||||
| 						var nextFrame *protobufs.ClockFrame | ||||
| 						if nextFrame, err = e.prove(latestFrame); err != nil { | ||||
| 							e.logger.Error("could not prove", zap.Error(err)) | ||||
| @ -535,16 +609,80 @@ func (e *DataClockConsensusEngine) runLoop() { | ||||
| 							continue | ||||
| 						} | ||||
| 
 | ||||
| 						e.proverTrieRequestsMx.Lock() | ||||
| 						joinAddrs := tries.NewMinHeap[peerSeniorityItem]() | ||||
| 						leaveAddrs := tries.NewMinHeap[peerSeniorityItem]() | ||||
| 						for _, addr := range e.proverTrieJoinRequests { | ||||
| 							if _, ok := (*e.peerSeniority)[addr]; !ok { | ||||
| 								joinAddrs.Push(peerSeniorityItem{ | ||||
| 									addr:      addr, | ||||
| 									seniority: 0, | ||||
| 								}) | ||||
| 							} else { | ||||
| 								joinAddrs.Push((*e.peerSeniority)[addr]) | ||||
| 							} | ||||
| 						} | ||||
| 						for _, addr := range e.proverTrieLeaveRequests { | ||||
| 							if _, ok := (*e.peerSeniority)[addr]; !ok { | ||||
| 								leaveAddrs.Push(peerSeniorityItem{ | ||||
| 									addr:      addr, | ||||
| 									seniority: 0, | ||||
| 								}) | ||||
| 							} else { | ||||
| 								leaveAddrs.Push((*e.peerSeniority)[addr]) | ||||
| 							} | ||||
| 						} | ||||
| 						for _, addr := range e.proverTrieResumeRequests { | ||||
| 							if _, ok := e.proverTriePauseRequests[addr]; ok { | ||||
| 								delete(e.proverTriePauseRequests, addr) | ||||
| 							} | ||||
| 						} | ||||
| 
 | ||||
| 						joinReqs := make([]peerSeniorityItem, len(joinAddrs.All())) | ||||
| 						copy(joinReqs, joinAddrs.All()) | ||||
| 						slices.Reverse(joinReqs) | ||||
| 						leaveReqs := make([]peerSeniorityItem, len(leaveAddrs.All())) | ||||
| 						copy(leaveReqs, leaveAddrs.All()) | ||||
| 						slices.Reverse(leaveReqs) | ||||
| 
 | ||||
| 						e.proverTrieJoinRequests = make(map[string]string) | ||||
| 						e.proverTrieLeaveRequests = make(map[string]string) | ||||
| 						e.proverTrieRequestsMx.Unlock() | ||||
| 
 | ||||
| 						e.frameProverTriesMx.Lock() | ||||
| 						for _, addr := range joinReqs { | ||||
| 							rings := len(e.frameProverTries) | ||||
| 							last := e.frameProverTries[rings-1] | ||||
| 							set := last.FindNearestAndApproximateNeighbors(make([]byte, 32)) | ||||
| 							if len(set) == 8 { | ||||
| 								e.frameProverTries = append( | ||||
| 									e.frameProverTries, | ||||
| 									&tries.RollingFrecencyCritbitTrie{}, | ||||
| 								) | ||||
| 								last = e.frameProverTries[rings] | ||||
| 							} | ||||
| 							last.Add([]byte(addr.addr), nextFrame.FrameNumber) | ||||
| 						} | ||||
| 						for _, addr := range leaveReqs { | ||||
| 							for _, t := range e.frameProverTries { | ||||
| 								if bytes.Equal( | ||||
| 						trie.FindNearest(e.provingKeyAddress).External.Key, | ||||
| 						e.provingKeyAddress, | ||||
| 									t.FindNearest([]byte(addr.addr)).External.Key, | ||||
| 									[]byte(addr.addr), | ||||
| 								) { | ||||
| 									t.Remove([]byte(addr.addr)) | ||||
| 									break | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 						e.frameProverTriesMx.Unlock() | ||||
| 
 | ||||
| 						e.dataTimeReel.Insert(nextFrame, false) | ||||
| 
 | ||||
| 						if err = e.publishProof(nextFrame); err != nil { | ||||
| 							e.logger.Error("could not publish", zap.Error(err)) | ||||
| 							e.state = consensus.EngineStateCollecting | ||||
| 						} | ||||
| 						break | ||||
| 					} | ||||
| 				} | ||||
| 			case <-time.After(20 * time.Second): | ||||
| @ -576,6 +714,11 @@ func (e *DataClockConsensusEngine) runLoop() { | ||||
| 					}() | ||||
| 				} | ||||
| 
 | ||||
| 				for _, trie := range e.GetFrameProverTries() { | ||||
| 					if bytes.Equal( | ||||
| 						trie.FindNearest(e.provingKeyAddress).External.Key, | ||||
| 						e.provingKeyAddress, | ||||
| 					) { | ||||
| 						var nextFrame *protobufs.ClockFrame | ||||
| 						if nextFrame, err = e.prove(latestFrame); err != nil { | ||||
| 							e.logger.Error("could not prove", zap.Error(err)) | ||||
| @ -583,17 +726,80 @@ func (e *DataClockConsensusEngine) runLoop() { | ||||
| 							continue | ||||
| 						} | ||||
| 
 | ||||
| 				for _, trie := range e.frameProverTries { | ||||
| 						e.proverTrieRequestsMx.Lock() | ||||
| 						joinAddrs := tries.NewMinHeap[peerSeniorityItem]() | ||||
| 						leaveAddrs := tries.NewMinHeap[peerSeniorityItem]() | ||||
| 						for _, addr := range e.proverTrieJoinRequests { | ||||
| 							if _, ok := (*e.peerSeniority)[addr]; !ok { | ||||
| 								joinAddrs.Push(peerSeniorityItem{ | ||||
| 									addr:      addr, | ||||
| 									seniority: 0, | ||||
| 								}) | ||||
| 							} else { | ||||
| 								joinAddrs.Push((*e.peerSeniority)[addr]) | ||||
| 							} | ||||
| 						} | ||||
| 						for _, addr := range e.proverTrieLeaveRequests { | ||||
| 							if _, ok := (*e.peerSeniority)[addr]; !ok { | ||||
| 								leaveAddrs.Push(peerSeniorityItem{ | ||||
| 									addr:      addr, | ||||
| 									seniority: 0, | ||||
| 								}) | ||||
| 							} else { | ||||
| 								leaveAddrs.Push((*e.peerSeniority)[addr]) | ||||
| 							} | ||||
| 						} | ||||
| 						for _, addr := range e.proverTrieResumeRequests { | ||||
| 							if _, ok := e.proverTriePauseRequests[addr]; ok { | ||||
| 								delete(e.proverTriePauseRequests, addr) | ||||
| 							} | ||||
| 						} | ||||
| 
 | ||||
| 						joinReqs := make([]peerSeniorityItem, len(joinAddrs.All())) | ||||
| 						copy(joinReqs, joinAddrs.All()) | ||||
| 						slices.Reverse(joinReqs) | ||||
| 						leaveReqs := make([]peerSeniorityItem, len(leaveAddrs.All())) | ||||
| 						copy(leaveReqs, leaveAddrs.All()) | ||||
| 						slices.Reverse(leaveReqs) | ||||
| 
 | ||||
| 						e.proverTrieJoinRequests = make(map[string]string) | ||||
| 						e.proverTrieLeaveRequests = make(map[string]string) | ||||
| 						e.proverTrieRequestsMx.Unlock() | ||||
| 
 | ||||
| 						e.frameProverTriesMx.Lock() | ||||
| 						for _, addr := range joinReqs { | ||||
| 							rings := len(e.frameProverTries) | ||||
| 							last := e.frameProverTries[rings-1] | ||||
| 							set := last.FindNearestAndApproximateNeighbors(make([]byte, 32)) | ||||
| 							if len(set) == 8 { | ||||
| 								e.frameProverTries = append( | ||||
| 									e.frameProverTries, | ||||
| 									&tries.RollingFrecencyCritbitTrie{}, | ||||
| 								) | ||||
| 								last = e.frameProverTries[rings] | ||||
| 							} | ||||
| 							last.Add([]byte(addr.addr), nextFrame.FrameNumber) | ||||
| 						} | ||||
| 						for _, addr := range leaveReqs { | ||||
| 							for _, t := range e.frameProverTries { | ||||
| 								if bytes.Equal( | ||||
| 						trie.FindNearest(e.provingKeyAddress).External.Key, | ||||
| 						e.provingKeyAddress, | ||||
| 									t.FindNearest([]byte(addr.addr)).External.Key, | ||||
| 									[]byte(addr.addr), | ||||
| 								) { | ||||
| 									t.Remove([]byte(addr.addr)) | ||||
| 									break | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 						e.frameProverTriesMx.Unlock() | ||||
| 
 | ||||
| 						e.dataTimeReel.Insert(nextFrame, false) | ||||
| 
 | ||||
| 						if err = e.publishProof(nextFrame); err != nil { | ||||
| 							e.logger.Error("could not publish", zap.Error(err)) | ||||
| 							e.state = consensus.EngineStateCollecting | ||||
| 						} | ||||
| 						break | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| @ -754,8 +960,8 @@ func (e *DataClockConsensusEngine) createParallelDataClientsFromListAndIndex( | ||||
| 			insecure.NewCredentials(), | ||||
| 		), | ||||
| 		grpc.WithDefaultCallOptions( | ||||
| 			grpc.MaxCallSendMsgSize(10*1024*1024), | ||||
| 			grpc.MaxCallRecvMsgSize(10*1024*1024), | ||||
| 			grpc.MaxCallSendMsgSize(600*1024*1024), | ||||
| 			grpc.MaxCallRecvMsgSize(600*1024*1024), | ||||
| 		), | ||||
| 	) | ||||
| 	if err != nil { | ||||
|  | ||||
| @ -81,6 +81,8 @@ func (e *DataClockConsensusEngine) runMessageHandler() { | ||||
| 						return nil | ||||
| 					}() | ||||
| 				} | ||||
| 			} else { | ||||
| 				return | ||||
| 			} | ||||
| 
 | ||||
| 			any := &anypb.Any{} | ||||
| @ -115,6 +117,41 @@ func (e *DataClockConsensusEngine) runMessageHandler() { | ||||
| 					); err != nil { | ||||
| 						return | ||||
| 					} | ||||
| 				case protobufs.AnnounceProverJoinType: | ||||
| 					if err := e.handleDataAnnounceProverJoin( | ||||
| 						message.From, | ||||
| 						msg.Address, | ||||
| 						any, | ||||
| 					); err != nil { | ||||
| 						return | ||||
| 					} | ||||
| 				case protobufs.AnnounceProverLeaveType: | ||||
| 					if !e.IsInProverTrie(peer.peerId) { | ||||
| 						return | ||||
| 					} | ||||
| 					if err := e.handleDataAnnounceProverLeave( | ||||
| 						message.From, | ||||
| 						msg.Address, | ||||
| 						any, | ||||
| 					); err != nil { | ||||
| 						return | ||||
| 					} | ||||
| 				case protobufs.AnnounceProverPauseType: | ||||
| 					if err := e.handleDataAnnounceProverPause( | ||||
| 						message.From, | ||||
| 						msg.Address, | ||||
| 						any, | ||||
| 					); err != nil { | ||||
| 						return | ||||
| 					} | ||||
| 				case protobufs.AnnounceProverResumeType: | ||||
| 					if err := e.handleDataAnnounceProverResume( | ||||
| 						message.From, | ||||
| 						msg.Address, | ||||
| 						any, | ||||
| 					); err != nil { | ||||
| 						return | ||||
| 					} | ||||
| 				} | ||||
| 			}() | ||||
| 		} | ||||
| @ -240,6 +277,128 @@ func (e *DataClockConsensusEngine) handleDataPeerListAnnounce( | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func (e *DataClockConsensusEngine) getAddressFromSignature( | ||||
| 	sig *protobufs.Ed448Signature, | ||||
| ) ([]byte, error) { | ||||
| 	addrBI, err := poseidon.HashBytes(sig.PublicKey.KeyValue) | ||||
| 	if err != nil { | ||||
| 		return nil, errors.Wrap(err, "get address from signature") | ||||
| 	} | ||||
| 
 | ||||
| 	return addrBI.FillBytes(make([]byte, 32)), nil | ||||
| } | ||||
| 
 | ||||
| func (e *DataClockConsensusEngine) handleDataAnnounceProverJoin( | ||||
| 	peerID []byte, | ||||
| 	address []byte, | ||||
| 	any *anypb.Any, | ||||
| ) error { | ||||
| 	announce := &protobufs.AnnounceProverJoin{} | ||||
| 	if err := any.UnmarshalTo(announce); err != nil { | ||||
| 		return errors.Wrap(err, "handle data announce prover join") | ||||
| 	} | ||||
| 
 | ||||
| 	address, err := e.getAddressFromSignature(announce.PublicKeySignatureEd448) | ||||
| 	if err != nil { | ||||
| 		return errors.Wrap(err, "handle data announce prover join") | ||||
| 	} | ||||
| 
 | ||||
| 	e.proverTrieRequestsMx.Lock() | ||||
| 	if len(announce.Filter) != len(e.filter) { | ||||
| 		return errors.Wrap( | ||||
| 			errors.New("filter width mismatch"), | ||||
| 			"handle data announce prover join", | ||||
| 		) | ||||
| 	} | ||||
| 
 | ||||
| 	e.proverTrieJoinRequests[string(address)] = string(announce.Filter) | ||||
| 	e.proverTrieRequestsMx.Unlock() | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func (e *DataClockConsensusEngine) handleDataAnnounceProverLeave( | ||||
| 	peerID []byte, | ||||
| 	address []byte, | ||||
| 	any *anypb.Any, | ||||
| ) error { | ||||
| 	announce := &protobufs.AnnounceProverLeave{} | ||||
| 	if err := any.UnmarshalTo(announce); err != nil { | ||||
| 		return errors.Wrap(err, "handle data announce prover leave") | ||||
| 	} | ||||
| 	e.proverTrieRequestsMx.Lock() | ||||
| 	if len(announce.Filter) != len(e.filter) { | ||||
| 		return errors.Wrap( | ||||
| 			errors.New("filter width mismatch"), | ||||
| 			"handle data announce prover leave", | ||||
| 		) | ||||
| 	} | ||||
| 
 | ||||
| 	address, err := e.getAddressFromSignature(announce.PublicKeySignatureEd448) | ||||
| 	if err != nil { | ||||
| 		return errors.Wrap(err, "handle data announce prover leave") | ||||
| 	} | ||||
| 
 | ||||
| 	e.proverTrieLeaveRequests[string(address)] = string(announce.Filter) | ||||
| 	e.proverTrieRequestsMx.Unlock() | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func (e *DataClockConsensusEngine) handleDataAnnounceProverPause( | ||||
| 	peerID []byte, | ||||
| 	address []byte, | ||||
| 	any *anypb.Any, | ||||
| ) error { | ||||
| 	announce := &protobufs.AnnounceProverPause{} | ||||
| 	if err := any.UnmarshalTo(announce); err != nil { | ||||
| 		return errors.Wrap(err, "handle data announce prover pause") | ||||
| 	} | ||||
| 
 | ||||
| 	e.proverTrieRequestsMx.Lock() | ||||
| 	if len(announce.Filter) != len(e.filter) { | ||||
| 		return errors.Wrap( | ||||
| 			errors.New("filter width mismatch"), | ||||
| 			"handle data announce prover pause", | ||||
| 		) | ||||
| 	} | ||||
| 
 | ||||
| 	address, err := e.getAddressFromSignature(announce.PublicKeySignatureEd448) | ||||
| 	if err != nil { | ||||
| 		return errors.Wrap(err, "handle data announce prover pause") | ||||
| 	} | ||||
| 
 | ||||
| 	e.proverTrieLeaveRequests[string(address)] = string(announce.Filter) | ||||
| 	e.proverTrieRequestsMx.Unlock() | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func (e *DataClockConsensusEngine) handleDataAnnounceProverResume( | ||||
| 	peerID []byte, | ||||
| 	address []byte, | ||||
| 	any *anypb.Any, | ||||
| ) error { | ||||
| 	announce := &protobufs.AnnounceProverResume{} | ||||
| 	if err := any.UnmarshalTo(announce); err != nil { | ||||
| 		return errors.Wrap(err, "handle data announce prover resume") | ||||
| 	} | ||||
| 
 | ||||
| 	e.proverTrieRequestsMx.Lock() | ||||
| 	if len(announce.Filter) != len(e.filter) { | ||||
| 		return errors.Wrap( | ||||
| 			errors.New("filter width mismatch"), | ||||
| 			"handle data announce prover resume", | ||||
| 		) | ||||
| 	} | ||||
| 
 | ||||
| 	address, err := e.getAddressFromSignature(announce.PublicKeySignatureEd448) | ||||
| 	if err != nil { | ||||
| 		return errors.Wrap(err, "handle data announce prover resume") | ||||
| 	} | ||||
| 
 | ||||
| 	e.proverTrieLeaveRequests[string(address)] = string(announce.Filter) | ||||
| 	e.proverTrieRequestsMx.Unlock() | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func (e *DataClockConsensusEngine) handleTokenRequest( | ||||
| 	transition *protobufs.TokenRequest, | ||||
| ) error { | ||||
| @ -326,7 +485,7 @@ func (e *DataClockConsensusEngine) handleClockFrameData( | ||||
| 		return errors.Wrap(err, "handle clock frame data") | ||||
| 	} | ||||
| 
 | ||||
| 	for _, trie := range e.frameProverTries { | ||||
| 	for _, trie := range e.GetFrameProverTries() { | ||||
| 		prover := trie.FindNearest(addr.Bytes()) | ||||
| 		if !bytes.Equal(prover.External.Key, addr.Bytes()) { | ||||
| 			e.logger.Info( | ||||
|  | ||||
| @ -57,7 +57,7 @@ func (e *DataClockConsensusEngine) IsInProverTrie(key []byte) bool { | ||||
| 	} | ||||
| 
 | ||||
| 	provingKeyAddress := h.Bytes() | ||||
| 	for _, tries := range e.frameProverTries { | ||||
| 	for _, tries := range e.GetFrameProverTries() { | ||||
| 		if tries.Contains(provingKeyAddress) { | ||||
| 			return true | ||||
| 		} | ||||
|  | ||||
| @ -53,24 +53,3 @@ func TestCalculateChallengeProofDifficulty(t *testing.T) { | ||||
| 	difficulty800k := w.CalculateChallengeProofDifficulty(800000) | ||||
| 	assert.Equal(t, 25000, difficulty800k) | ||||
| } | ||||
| 
 | ||||
| func TestCalculateChallengeProofDifficulty(t *testing.T) { | ||||
| 	l, _ := zap.NewProduction() | ||||
| 	w := crypto.NewWesolowskiFrameProver(l) | ||||
| 
 | ||||
| 	// At 0 increments, the difficulty should be 200,000
 | ||||
| 	difficulty0 := w.CalculateChallengeProofDifficulty(0) | ||||
| 	assert.Equal(t, 200000, difficulty0) | ||||
| 
 | ||||
| 	// At 100,000 increments, the difficulty should be 175,000
 | ||||
| 	difficulty100k := w.CalculateChallengeProofDifficulty(100000) | ||||
| 	assert.Equal(t, 175000, difficulty100k) | ||||
| 
 | ||||
| 	// At 700,000 increments, the difficulty should be 25,000
 | ||||
| 	difficulty700k := w.CalculateChallengeProofDifficulty(700000) | ||||
| 	assert.Equal(t, 25000, difficulty700k) | ||||
| 
 | ||||
| 	// At 800,000 increments, the difficulty should stay at 25,000
 | ||||
| 	difficulty800k := w.CalculateChallengeProofDifficulty(800000) | ||||
| 	assert.Equal(t, 25000, difficulty800k) | ||||
| } | ||||
|  | ||||
| @ -331,7 +331,7 @@ func (a *TokenApplication) ApplyTransitions( | ||||
| 					kzgCommitment, | ||||
| 					int(index), | ||||
| 					kzgProof, | ||||
| 					nearestPowerOfTwo(uint64(parallelism)), | ||||
| 					nearestApplicablePowerOfTwo(uint64(parallelism)), | ||||
| 				) | ||||
| 				if err != nil { | ||||
| 					if !skipFailures { | ||||
| @ -575,7 +575,7 @@ func (a *TokenApplication) ApplyTransitions( | ||||
| 				owner = coin.Owner | ||||
| 				deleted = append(deleted, &protobufs.TokenOutput{ | ||||
| 					Output: &protobufs.TokenOutput_DeletedCoin{ | ||||
| 						DeletedCoin: coin, | ||||
| 						DeletedCoin: c, | ||||
| 					}, | ||||
| 				}) | ||||
| 			} | ||||
| @ -748,7 +748,7 @@ func (a *TokenApplication) ApplyTransitions( | ||||
| 				outputs.Outputs, | ||||
| 				&protobufs.TokenOutput{ | ||||
| 					Output: &protobufs.TokenOutput_DeletedCoin{ | ||||
| 						DeletedCoin: coin, | ||||
| 						DeletedCoin: t.Split.OfCoin, | ||||
| 					}, | ||||
| 				}, | ||||
| 			) | ||||
| @ -894,7 +894,7 @@ func (a *TokenApplication) ApplyTransitions( | ||||
| 				}, | ||||
| 				&protobufs.TokenOutput{ | ||||
| 					Output: &protobufs.TokenOutput_DeletedCoin{ | ||||
| 						DeletedCoin: coin, | ||||
| 						DeletedCoin: t.Transfer.OfCoin, | ||||
| 					}, | ||||
| 				}, | ||||
| 			) | ||||
| @ -1079,7 +1079,7 @@ func (a *TokenApplication) ApplyTransitions( | ||||
| 					kzgCommitment, | ||||
| 					int(index), | ||||
| 					kzgProof, | ||||
| 					nearestPowerOfTwo(uint64(parallelism)), | ||||
| 					nearestApplicablePowerOfTwo(uint64(parallelism)), | ||||
| 				) | ||||
| 				if err != nil { | ||||
| 					if !skipFailures { | ||||
| @ -1368,12 +1368,15 @@ func (a *TokenApplication) ApplyTransitions( | ||||
| 	return a, finalizedTransitions, failedTransitions, nil | ||||
| } | ||||
| 
 | ||||
| func nearestPowerOfTwo(number uint64) uint64 { | ||||
| 	power := uint64(1) | ||||
| 	for number > power { | ||||
| 		power = power << 1 | ||||
| func nearestApplicablePowerOfTwo(number uint64) uint64 { | ||||
| 	power := uint64(128) | ||||
| 	if number > 2048 { | ||||
| 		power = 65536 | ||||
| 	} else if number > 1024 { | ||||
| 		power = 2048 | ||||
| 	} else if number > 128 { | ||||
| 		power = 1024 | ||||
| 	} | ||||
| 
 | ||||
| 	return power | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -146,6 +146,7 @@ func NewTokenExecutionEngine( | ||||
| 		report, | ||||
| 		intrinsicFilter, | ||||
| 		seed, | ||||
| 		peerSeniority, | ||||
| 	) | ||||
| 
 | ||||
| 	e := &TokenExecutionEngine{ | ||||
| @ -174,8 +175,7 @@ func NewTokenExecutionEngine( | ||||
| 		panic(err) | ||||
| 	} | ||||
| 
 | ||||
| 	addrBytes := addr.Bytes() | ||||
| 	addrBytes = append(make([]byte, 32-len(addrBytes)), addrBytes...) | ||||
| 	addrBytes := addr.FillBytes(make([]byte, 32)) | ||||
| 	e.peerIdHash = addrBytes | ||||
| 	provingKey, _, publicKeyBytes, provingKeyAddress := e.clock.GetProvingKey( | ||||
| 		engineConfig, | ||||
| @ -190,7 +190,7 @@ func NewTokenExecutionEngine( | ||||
| 				keys := [][]byte{} | ||||
| 				ksigs := [][]byte{} | ||||
| 				for _, conf := range e.engineConfig.MultisigProverEnrollmentPaths { | ||||
| 					extraConf, err := config.LoadConfig(conf, "") | ||||
| 					extraConf, err := config.LoadConfig(conf, "", false) | ||||
| 					if err != nil { | ||||
| 						panic(err) | ||||
| 					} | ||||
| @ -277,6 +277,21 @@ func NewTokenExecutionEngine( | ||||
| 						make([]byte, 32), | ||||
| 						proof, | ||||
| 					} | ||||
| 					payload := []byte("mint") | ||||
| 					for _, p := range announce.Announce.InitialProof.Proofs { | ||||
| 						payload = append(payload, p...) | ||||
| 					} | ||||
| 					sig, err := e.pubSub.SignMessage(payload) | ||||
| 					if err != nil { | ||||
| 						panic(err) | ||||
| 					} | ||||
| 
 | ||||
| 					announce.Announce.InitialProof.Signature = &protobufs.Ed448Signature{ | ||||
| 						PublicKey: &protobufs.Ed448PublicKey{ | ||||
| 							KeyValue: e.pubSub.GetPublicKey(), | ||||
| 						}, | ||||
| 						Signature: sig, | ||||
| 					} | ||||
| 				} | ||||
| 
 | ||||
| 				req := &protobufs.TokenRequest{ | ||||
| @ -291,6 +306,73 @@ func NewTokenExecutionEngine( | ||||
| 		}() | ||||
| 	} | ||||
| 
 | ||||
| 	inc, _, _, err := dataProofStore.GetLatestDataTimeProof(pubSub.GetPeerID()) | ||||
| 	if err != nil { | ||||
| 		go func() { | ||||
| 			addrBI, err := poseidon.HashBytes(pubSub.GetPeerID()) | ||||
| 			if err != nil { | ||||
| 				panic(err) | ||||
| 			} | ||||
| 
 | ||||
| 			addr := addrBI.FillBytes(make([]byte, 32)) | ||||
| 
 | ||||
| 			for { | ||||
| 				_, proofs, err := coinStore.GetPreCoinProofsForOwner(addr) | ||||
| 				if err == nil { | ||||
| 					for _, proof := range proofs { | ||||
| 						if proof.IndexProof != nil && len(proof.IndexProof) != 0 { | ||||
| 							if proof.Index < inc { | ||||
| 								_, par, input, output, err := dataProofStore.GetDataTimeProof( | ||||
| 									pubSub.GetPeerID(), | ||||
| 									proof.Index-1, | ||||
| 								) | ||||
| 								if err == nil { | ||||
| 									p := []byte{} | ||||
| 									p = binary.BigEndian.AppendUint32(p, proof.Index-1) | ||||
| 									p = binary.BigEndian.AppendUint32(p, par) | ||||
| 									p = binary.BigEndian.AppendUint64( | ||||
| 										p, | ||||
| 										uint64(len(input)), | ||||
| 									) | ||||
| 									p = append(p, input...) | ||||
| 									p = binary.BigEndian.AppendUint64(p, uint64(len(output))) | ||||
| 									p = append(p, output...) | ||||
| 									proofs := [][]byte{ | ||||
| 										[]byte("pre-dusk"), | ||||
| 										make([]byte, 32), | ||||
| 										p, | ||||
| 									} | ||||
| 									payload := []byte("mint") | ||||
| 									for _, i := range proofs { | ||||
| 										payload = append(payload, i...) | ||||
| 									} | ||||
| 									sig, err := e.pubSub.SignMessage(payload) | ||||
| 									if err != nil { | ||||
| 										panic(err) | ||||
| 									} | ||||
| 									e.publishMessage(e.intrinsicFilter, &protobufs.TokenRequest{ | ||||
| 										Request: &protobufs.TokenRequest_Mint{ | ||||
| 											Mint: &protobufs.MintCoinRequest{ | ||||
| 												Proofs: proofs, | ||||
| 												Signature: &protobufs.Ed448Signature{ | ||||
| 													PublicKey: &protobufs.Ed448PublicKey{ | ||||
| 														KeyValue: e.pubSub.GetPublicKey(), | ||||
| 													}, | ||||
| 													Signature: sig, | ||||
| 												}, | ||||
| 											}, | ||||
| 										}, | ||||
| 									}) | ||||
| 								} | ||||
| 							} | ||||
| 						} | ||||
| 					} | ||||
| 				} | ||||
| 				gotime.Sleep(10 * gotime.Second) | ||||
| 			} | ||||
| 		}() | ||||
| 	} | ||||
| 
 | ||||
| 	return e | ||||
| } | ||||
| 
 | ||||
| @ -663,7 +745,7 @@ func CreateGenesisState( | ||||
| 			panic(err) | ||||
| 		} | ||||
| 
 | ||||
| 		address, err := GetAddressOfCoin(output.GetCoin()) | ||||
| 		address, err := GetAddressOfCoin(output.GetCoin(), 0) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| @ -749,9 +831,11 @@ func CreateGenesisState( | ||||
| 
 | ||||
| func GetAddressOfCoin( | ||||
| 	coin *protobufs.Coin, | ||||
| 	frameNumber uint64, | ||||
| ) ([]byte, error) { | ||||
| 	eval := []byte{} | ||||
| 	eval = append(eval, application.TOKEN_ADDRESS...) | ||||
| 	eval = binary.BigEndian.AppendUint64(eval, frameNumber) | ||||
| 	eval = append(eval, coin.Amount...) | ||||
| 	eval = append(eval, coin.Intersection...) | ||||
| 	eval = binary.BigEndian.AppendUint32(eval, 0) | ||||
| @ -925,7 +1009,7 @@ func (e *TokenExecutionEngine) RunWorker() { | ||||
| 						panic(err) | ||||
| 					} | ||||
| 
 | ||||
| 					address, err := GetAddressOfCoin(o.Coin) | ||||
| 					address, err := GetAddressOfCoin(o.Coin, frame.FrameNumber) | ||||
| 					if err != nil { | ||||
| 						panic(err) | ||||
| 					} | ||||
| @ -947,14 +1031,14 @@ func (e *TokenExecutionEngine) RunWorker() { | ||||
| 						panic(err) | ||||
| 					} | ||||
| 
 | ||||
| 					address, err := GetAddressOfCoin(o.DeletedCoin) | ||||
| 					coin, err := e.coinStore.GetCoinByAddress(o.DeletedCoin.Address) | ||||
| 					if err != nil { | ||||
| 						panic(err) | ||||
| 					} | ||||
| 					err = e.coinStore.DeleteCoin( | ||||
| 						txn, | ||||
| 						address, | ||||
| 						o.DeletedCoin, | ||||
| 						o.DeletedCoin.Address, | ||||
| 						coin, | ||||
| 					) | ||||
| 					if err != nil { | ||||
| 						panic(err) | ||||
|  | ||||
							
								
								
									
										17
									
								
								node/main.go
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								node/main.go
									
									
									
									
									
								
							| @ -230,7 +230,7 @@ func main() { | ||||
| 	} | ||||
| 
 | ||||
| 	if *balance { | ||||
| 		config, err := config.LoadConfig(*configDirectory, "") | ||||
| 		config, err := config.LoadConfig(*configDirectory, "", false) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| @ -241,7 +241,7 @@ func main() { | ||||
| 	} | ||||
| 
 | ||||
| 	if *peerId { | ||||
| 		config, err := config.LoadConfig(*configDirectory, "") | ||||
| 		config, err := config.LoadConfig(*configDirectory, "", false) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| @ -251,7 +251,7 @@ func main() { | ||||
| 	} | ||||
| 
 | ||||
| 	if *importPrivKey != "" { | ||||
| 		config, err := config.LoadConfig(*configDirectory, *importPrivKey) | ||||
| 		config, err := config.LoadConfig(*configDirectory, *importPrivKey, false) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| @ -262,7 +262,7 @@ func main() { | ||||
| 	} | ||||
| 
 | ||||
| 	if *nodeInfo { | ||||
| 		config, err := config.LoadConfig(*configDirectory, "") | ||||
| 		config, err := config.LoadConfig(*configDirectory, "", false) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| 		} | ||||
| @ -277,7 +277,7 @@ func main() { | ||||
| 		fmt.Println(" ") | ||||
| 	} | ||||
| 
 | ||||
| 	nodeConfig, err := config.LoadConfig(*configDirectory, "") | ||||
| 	nodeConfig, err := config.LoadConfig(*configDirectory, "", false) | ||||
| 	if err != nil { | ||||
| 		panic(err) | ||||
| 	} | ||||
| @ -604,11 +604,10 @@ func printBalance(config *config.Config) { | ||||
| 		panic(err) | ||||
| 	} | ||||
| 
 | ||||
| 	// fmt.Println("Owned balance:", balance.Owned, "QUIL")
 | ||||
| 	conversionFactor, _ := new(big.Int).SetString("1DCD65000", 16) | ||||
| 	r := new(big.Rat).SetFrac(balance.UnconfirmedOwned, conversionFactor) | ||||
| 	fmt.Println("Note: Balance is strictly rewards earned with 1.4.19+, check https://www.quilibrium.com/rewards for more info about previous rewards.") | ||||
| 	fmt.Println("Unclaimed balance:", r.FloatString(12), "QUIL") | ||||
| 	r := new(big.Rat).SetFrac(balance.Owned, conversionFactor) | ||||
| 	fmt.Println("Owned balance:", r.FloatString(12), "QUIL") | ||||
| 	fmt.Println("Note: bridged balance is not reflected here, you must bridge back to QUIL to use QUIL on mainnet.") | ||||
| } | ||||
| 
 | ||||
| func getPeerID(p2pConfig *config.P2PConfig) peer.ID { | ||||
|  | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -328,6 +328,74 @@ func local_request_NodeService_GetPeerManifests_0(ctx context.Context, marshaler | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| func request_NodeService_SendMessage_0(ctx context.Context, marshaler runtime.Marshaler, client NodeServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq TokenRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
| 
 | ||||
| 	newReader, berr := utilities.IOReaderFactory(req.Body) | ||||
| 	if berr != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) | ||||
| 	} | ||||
| 	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	msg, err := client.SendMessage(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) | ||||
| 	return msg, metadata, err | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| func local_request_NodeService_SendMessage_0(ctx context.Context, marshaler runtime.Marshaler, server NodeServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq TokenRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
| 
 | ||||
| 	newReader, berr := utilities.IOReaderFactory(req.Body) | ||||
| 	if berr != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) | ||||
| 	} | ||||
| 	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	msg, err := server.SendMessage(ctx, &protoReq) | ||||
| 	return msg, metadata, err | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| func request_NodeService_GetTokensByAccount_0(ctx context.Context, marshaler runtime.Marshaler, client NodeServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq GetTokensByAccountRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
| 
 | ||||
| 	newReader, berr := utilities.IOReaderFactory(req.Body) | ||||
| 	if berr != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) | ||||
| 	} | ||||
| 	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	msg, err := client.GetTokensByAccount(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) | ||||
| 	return msg, metadata, err | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| func local_request_NodeService_GetTokensByAccount_0(ctx context.Context, marshaler runtime.Marshaler, server NodeServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq GetTokensByAccountRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
| 
 | ||||
| 	newReader, berr := utilities.IOReaderFactory(req.Body) | ||||
| 	if berr != nil { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) | ||||
| 	} | ||||
| 	if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { | ||||
| 		return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	msg, err := server.GetTokensByAccount(ctx, &protoReq) | ||||
| 	return msg, metadata, err | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| func request_AccountService_Allow_0(ctx context.Context, marshaler runtime.Marshaler, client AccountServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { | ||||
| 	var protoReq DecryptableAllowAccountRequest | ||||
| 	var metadata runtime.ServerMetadata | ||||
| @ -1144,6 +1212,56 @@ func RegisterNodeServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux | ||||
| 
 | ||||
| 	}) | ||||
| 
 | ||||
| 	mux.Handle("POST", pattern_NodeService_SendMessage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| 		var stream runtime.ServerTransportStream | ||||
| 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) | ||||
| 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) | ||||
| 		var err error | ||||
| 		var annotatedContext context.Context | ||||
| 		annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/quilibrium.node.node.pb.NodeService/SendMessage", runtime.WithHTTPPathPattern("/quilibrium.node.node.pb.NodeService/SendMessage")) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
| 		resp, md, err := local_request_NodeService_SendMessage_0(annotatedContext, inboundMarshaler, server, req, pathParams) | ||||
| 		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) | ||||
| 		annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
| 
 | ||||
| 		forward_NodeService_SendMessage_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
| 
 | ||||
| 	}) | ||||
| 
 | ||||
| 	mux.Handle("POST", pattern_NodeService_GetTokensByAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| 		var stream runtime.ServerTransportStream | ||||
| 		ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) | ||||
| 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) | ||||
| 		var err error | ||||
| 		var annotatedContext context.Context | ||||
| 		annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/quilibrium.node.node.pb.NodeService/GetTokensByAccount", runtime.WithHTTPPathPattern("/quilibrium.node.node.pb.NodeService/GetTokensByAccount")) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
| 		resp, md, err := local_request_NodeService_GetTokensByAccount_0(annotatedContext, inboundMarshaler, server, req, pathParams) | ||||
| 		md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) | ||||
| 		annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
| 
 | ||||
| 		forward_NodeService_GetTokensByAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
| 
 | ||||
| 	}) | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| @ -1886,6 +2004,50 @@ func RegisterNodeServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux | ||||
| 
 | ||||
| 	}) | ||||
| 
 | ||||
| 	mux.Handle("POST", pattern_NodeService_SendMessage_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) | ||||
| 		var err error | ||||
| 		var annotatedContext context.Context | ||||
| 		annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/quilibrium.node.node.pb.NodeService/SendMessage", runtime.WithHTTPPathPattern("/quilibrium.node.node.pb.NodeService/SendMessage")) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
| 		resp, md, err := request_NodeService_SendMessage_0(annotatedContext, inboundMarshaler, client, req, pathParams) | ||||
| 		annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
| 
 | ||||
| 		forward_NodeService_SendMessage_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
| 
 | ||||
| 	}) | ||||
| 
 | ||||
| 	mux.Handle("POST", pattern_NodeService_GetTokensByAccount_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { | ||||
| 		ctx, cancel := context.WithCancel(req.Context()) | ||||
| 		defer cancel() | ||||
| 		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) | ||||
| 		var err error | ||||
| 		var annotatedContext context.Context | ||||
| 		annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/quilibrium.node.node.pb.NodeService/GetTokensByAccount", runtime.WithHTTPPathPattern("/quilibrium.node.node.pb.NodeService/GetTokensByAccount")) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
| 		resp, md, err := request_NodeService_GetTokensByAccount_0(annotatedContext, inboundMarshaler, client, req, pathParams) | ||||
| 		annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) | ||||
| 		if err != nil { | ||||
| 			runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) | ||||
| 			return | ||||
| 		} | ||||
| 
 | ||||
| 		forward_NodeService_GetTokensByAccount_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) | ||||
| 
 | ||||
| 	}) | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| @ -1903,6 +2065,10 @@ var ( | ||||
| 	pattern_NodeService_GetTokenInfo_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"quilibrium.node.node.pb.NodeService", "GetTokenInfo"}, "")) | ||||
| 
 | ||||
| 	pattern_NodeService_GetPeerManifests_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"quilibrium.node.node.pb.NodeService", "GetPeerManifests"}, "")) | ||||
| 
 | ||||
| 	pattern_NodeService_SendMessage_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"quilibrium.node.node.pb.NodeService", "SendMessage"}, "")) | ||||
| 
 | ||||
| 	pattern_NodeService_GetTokensByAccount_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"quilibrium.node.node.pb.NodeService", "GetTokensByAccount"}, "")) | ||||
| ) | ||||
| 
 | ||||
| var ( | ||||
| @ -1919,6 +2085,10 @@ var ( | ||||
| 	forward_NodeService_GetTokenInfo_0 = runtime.ForwardResponseMessage | ||||
| 
 | ||||
| 	forward_NodeService_GetPeerManifests_0 = runtime.ForwardResponseMessage | ||||
| 
 | ||||
| 	forward_NodeService_SendMessage_0 = runtime.ForwardResponseMessage | ||||
| 
 | ||||
| 	forward_NodeService_GetTokensByAccount_0 = runtime.ForwardResponseMessage | ||||
| ) | ||||
| 
 | ||||
| // RegisterAccountServiceHandlerFromEndpoint is same as RegisterAccountServiceHandler but
 | ||||
|  | ||||
| @ -81,7 +81,9 @@ message NetworkInfoResponse { | ||||
|   repeated NetworkInfo network_info = 1; | ||||
| } | ||||
| 
 | ||||
| message GetTokenInfoRequest {} | ||||
| message GetTokenInfoRequest { | ||||
|   bytes address = 1; // optional, v2.0 only | ||||
| } | ||||
| 
 | ||||
| message TokenInfoResponse { | ||||
|   // Total active token supply, as a 256 bit integer representing maximum | ||||
| @ -174,6 +176,30 @@ message AnnounceProverRequest { | ||||
|   MintCoinRequest initial_proof = 2; | ||||
| } | ||||
| 
 | ||||
| message AnnounceProverJoin { | ||||
|   bytes filter = 1; | ||||
|   uint64 frame_number = 2; | ||||
|   quilibrium.node.keys.pb.Ed448Signature public_key_signature_ed448 = 3; | ||||
| } | ||||
| 
 | ||||
| message AnnounceProverLeave { | ||||
|   bytes filter = 1; | ||||
|   uint64 frame_number = 2; | ||||
|   quilibrium.node.keys.pb.Ed448Signature public_key_signature_ed448 = 3; | ||||
| } | ||||
| 
 | ||||
| message AnnounceProverPause { | ||||
|   bytes filter = 1; | ||||
|   uint64 frame_number = 2; | ||||
|   quilibrium.node.keys.pb.Ed448Signature public_key_signature_ed448 = 3; | ||||
| } | ||||
| 
 | ||||
| message AnnounceProverResume { | ||||
|   bytes filter = 1; | ||||
|   uint64 frame_number = 2; | ||||
|   quilibrium.node.keys.pb.Ed448Signature public_key_signature_ed448 = 3; | ||||
| } | ||||
| 
 | ||||
| message OriginatedAccountRef { | ||||
|   bytes address = 1; | ||||
| } | ||||
| @ -234,7 +260,7 @@ message TokenOutput { | ||||
|   oneof output { | ||||
|     Coin coin = 1; | ||||
|     PreCoinProof proof = 2; | ||||
|     Coin deleted_coin = 3; | ||||
|     CoinRef deleted_coin = 3; | ||||
|     PreCoinProof deleted_proof = 4; | ||||
|   } | ||||
| } | ||||
| @ -588,6 +614,17 @@ message RejectPendingTransactionResponse { | ||||
|   repeated DeliveryData deliveries = 2; | ||||
| } | ||||
| 
 | ||||
| message SendMessageResponse{} | ||||
| 
 | ||||
| message GetTokensByAccountRequest { | ||||
|   bytes address = 1; | ||||
| } | ||||
| 
 | ||||
| message TokensByAccountResponse { | ||||
|   repeated Coin coins = 1; | ||||
|   repeated uint64 frame_numbers = 2; | ||||
| } | ||||
| 
 | ||||
| service NodeService { | ||||
|   rpc GetFrames(GetFramesRequest) returns (FramesResponse); | ||||
|   rpc GetFrameInfo(GetFrameInfoRequest) returns (FrameInfoResponse); | ||||
| @ -596,6 +633,8 @@ service NodeService { | ||||
|   rpc GetNetworkInfo(GetNetworkInfoRequest) returns (NetworkInfoResponse); | ||||
|   rpc GetTokenInfo(GetTokenInfoRequest) returns (TokenInfoResponse); | ||||
|   rpc GetPeerManifests(GetPeerManifestsRequest) returns (PeerManifestsResponse); | ||||
|   rpc SendMessage(TokenRequest) returns (SendMessageResponse); | ||||
|   rpc GetTokensByAccount(GetTokensByAccountRequest) returns (TokensByAccountResponse); | ||||
| } | ||||
| 
 | ||||
| service AccountService { | ||||
|  | ||||
| @ -181,6 +181,8 @@ const ( | ||||
| 	NodeService_GetNetworkInfo_FullMethodName     = "/quilibrium.node.node.pb.NodeService/GetNetworkInfo" | ||||
| 	NodeService_GetTokenInfo_FullMethodName       = "/quilibrium.node.node.pb.NodeService/GetTokenInfo" | ||||
| 	NodeService_GetPeerManifests_FullMethodName   = "/quilibrium.node.node.pb.NodeService/GetPeerManifests" | ||||
| 	NodeService_SendMessage_FullMethodName        = "/quilibrium.node.node.pb.NodeService/SendMessage" | ||||
| 	NodeService_GetTokensByAccount_FullMethodName = "/quilibrium.node.node.pb.NodeService/GetTokensByAccount" | ||||
| ) | ||||
| 
 | ||||
| // NodeServiceClient is the client API for NodeService service.
 | ||||
| @ -194,6 +196,8 @@ type NodeServiceClient interface { | ||||
| 	GetNetworkInfo(ctx context.Context, in *GetNetworkInfoRequest, opts ...grpc.CallOption) (*NetworkInfoResponse, error) | ||||
| 	GetTokenInfo(ctx context.Context, in *GetTokenInfoRequest, opts ...grpc.CallOption) (*TokenInfoResponse, error) | ||||
| 	GetPeerManifests(ctx context.Context, in *GetPeerManifestsRequest, opts ...grpc.CallOption) (*PeerManifestsResponse, error) | ||||
| 	SendMessage(ctx context.Context, in *TokenRequest, opts ...grpc.CallOption) (*SendMessageResponse, error) | ||||
| 	GetTokensByAccount(ctx context.Context, in *GetTokensByAccountRequest, opts ...grpc.CallOption) (*TokensByAccountResponse, error) | ||||
| } | ||||
| 
 | ||||
| type nodeServiceClient struct { | ||||
| @ -267,6 +271,24 @@ func (c *nodeServiceClient) GetPeerManifests(ctx context.Context, in *GetPeerMan | ||||
| 	return out, nil | ||||
| } | ||||
| 
 | ||||
| func (c *nodeServiceClient) SendMessage(ctx context.Context, in *TokenRequest, opts ...grpc.CallOption) (*SendMessageResponse, error) { | ||||
| 	out := new(SendMessageResponse) | ||||
| 	err := c.cc.Invoke(ctx, NodeService_SendMessage_FullMethodName, in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return out, nil | ||||
| } | ||||
| 
 | ||||
| func (c *nodeServiceClient) GetTokensByAccount(ctx context.Context, in *GetTokensByAccountRequest, opts ...grpc.CallOption) (*TokensByAccountResponse, error) { | ||||
| 	out := new(TokensByAccountResponse) | ||||
| 	err := c.cc.Invoke(ctx, NodeService_GetTokensByAccount_FullMethodName, in, out, opts...) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return out, nil | ||||
| } | ||||
| 
 | ||||
| // NodeServiceServer is the server API for NodeService service.
 | ||||
| // All implementations must embed UnimplementedNodeServiceServer
 | ||||
| // for forward compatibility
 | ||||
| @ -278,6 +300,8 @@ type NodeServiceServer interface { | ||||
| 	GetNetworkInfo(context.Context, *GetNetworkInfoRequest) (*NetworkInfoResponse, error) | ||||
| 	GetTokenInfo(context.Context, *GetTokenInfoRequest) (*TokenInfoResponse, error) | ||||
| 	GetPeerManifests(context.Context, *GetPeerManifestsRequest) (*PeerManifestsResponse, error) | ||||
| 	SendMessage(context.Context, *TokenRequest) (*SendMessageResponse, error) | ||||
| 	GetTokensByAccount(context.Context, *GetTokensByAccountRequest) (*TokensByAccountResponse, error) | ||||
| 	mustEmbedUnimplementedNodeServiceServer() | ||||
| } | ||||
| 
 | ||||
| @ -306,6 +330,12 @@ func (UnimplementedNodeServiceServer) GetTokenInfo(context.Context, *GetTokenInf | ||||
| func (UnimplementedNodeServiceServer) GetPeerManifests(context.Context, *GetPeerManifestsRequest) (*PeerManifestsResponse, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method GetPeerManifests not implemented") | ||||
| } | ||||
| func (UnimplementedNodeServiceServer) SendMessage(context.Context, *TokenRequest) (*SendMessageResponse, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method SendMessage not implemented") | ||||
| } | ||||
| func (UnimplementedNodeServiceServer) GetTokensByAccount(context.Context, *GetTokensByAccountRequest) (*TokensByAccountResponse, error) { | ||||
| 	return nil, status.Errorf(codes.Unimplemented, "method GetTokensByAccount not implemented") | ||||
| } | ||||
| func (UnimplementedNodeServiceServer) mustEmbedUnimplementedNodeServiceServer() {} | ||||
| 
 | ||||
| // UnsafeNodeServiceServer may be embedded to opt out of forward compatibility for this service.
 | ||||
| @ -445,6 +475,42 @@ func _NodeService_GetPeerManifests_Handler(srv interface{}, ctx context.Context, | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
| 
 | ||||
| func _NodeService_SendMessage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||
| 	in := new(TokenRequest) | ||||
| 	if err := dec(in); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if interceptor == nil { | ||||
| 		return srv.(NodeServiceServer).SendMessage(ctx, in) | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: NodeService_SendMessage_FullMethodName, | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(NodeServiceServer).SendMessage(ctx, req.(*TokenRequest)) | ||||
| 	} | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
| 
 | ||||
| func _NodeService_GetTokensByAccount_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { | ||||
| 	in := new(GetTokensByAccountRequest) | ||||
| 	if err := dec(in); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if interceptor == nil { | ||||
| 		return srv.(NodeServiceServer).GetTokensByAccount(ctx, in) | ||||
| 	} | ||||
| 	info := &grpc.UnaryServerInfo{ | ||||
| 		Server:     srv, | ||||
| 		FullMethod: NodeService_GetTokensByAccount_FullMethodName, | ||||
| 	} | ||||
| 	handler := func(ctx context.Context, req interface{}) (interface{}, error) { | ||||
| 		return srv.(NodeServiceServer).GetTokensByAccount(ctx, req.(*GetTokensByAccountRequest)) | ||||
| 	} | ||||
| 	return interceptor(ctx, in, info, handler) | ||||
| } | ||||
| 
 | ||||
| // NodeService_ServiceDesc is the grpc.ServiceDesc for NodeService service.
 | ||||
| // It's only intended for direct use with grpc.RegisterService,
 | ||||
| // and not to be introspected or modified (even as a copy)
 | ||||
| @ -480,6 +546,14 @@ var NodeService_ServiceDesc = grpc.ServiceDesc{ | ||||
| 			MethodName: "GetPeerManifests", | ||||
| 			Handler:    _NodeService_GetPeerManifests_Handler, | ||||
| 		}, | ||||
| 		{ | ||||
| 			MethodName: "SendMessage", | ||||
| 			Handler:    _NodeService_SendMessage_Handler, | ||||
| 		}, | ||||
| 		{ | ||||
| 			MethodName: "GetTokensByAccount", | ||||
| 			Handler:    _NodeService_GetTokensByAccount_Handler, | ||||
| 		}, | ||||
| 	}, | ||||
| 	Streams:  []grpc.StreamDesc{}, | ||||
| 	Metadata: "node.proto", | ||||
|  | ||||
| @ -14,6 +14,10 @@ const ( | ||||
| 	TokenRequestType             = NodePrefix + "TokenRequest" | ||||
| 	DataPeerListAnnounceType     = DataPrefix + "DataPeerListAnnounce" | ||||
| 	CeremonyPeerType             = DataPrefix + "DataPeer" | ||||
| 	AnnounceProverJoinType       = DataPrefix + "AnnounceProverJoin" | ||||
| 	AnnounceProverLeaveType      = DataPrefix + "AnnounceProverLeave" | ||||
| 	AnnounceProverPauseType      = DataPrefix + "AnnounceProverPause" | ||||
| 	AnnounceProverResumeType     = DataPrefix + "AnnounceProverResume" | ||||
| 	CeremonyCompressedSyncType   = DataPrefix + "DataCompressedSync" | ||||
| 	InclusionProofsMapType       = DataPrefix + "InclusionProofsMap" | ||||
| 	InclusionSegmentsMapType     = DataPrefix + "InclusionSegmentsMap" | ||||
|  | ||||
| @ -9,6 +9,7 @@ import ( | ||||
| 	"time" | ||||
| 
 | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/crypto" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/execution/intrinsics/token" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/p2p" | ||||
| 
 | ||||
| 	"github.com/multiformats/go-multiaddr" | ||||
| @ -61,9 +62,16 @@ func (r *DataWorkerIPCServer) CalculateChallengeProof( | ||||
| 			for _, out := range outputs.Outputs { | ||||
| 				switch e := out.Output.(type) { | ||||
| 				case *protobufs.TokenOutput_Coin: | ||||
| 					addr, err := token.GetAddressOfCoin( | ||||
| 						e.Coin, | ||||
| 						req.ClockFrame.FrameNumber, | ||||
| 					) | ||||
| 					if err != nil { | ||||
| 						return nil, err | ||||
| 					} | ||||
| 					for _, idx := range p2p.GetOnesIndices( | ||||
| 						p2p.GetBloomFilter( | ||||
| 							e.Coin.Owner.GetImplicitAccount().Address, | ||||
| 							addr, | ||||
| 							1024, | ||||
| 							64, | ||||
| 						), | ||||
| @ -81,7 +89,7 @@ func (r *DataWorkerIPCServer) CalculateChallengeProof( | ||||
| 				case *protobufs.TokenOutput_DeletedCoin: | ||||
| 					for _, idx := range p2p.GetOnesIndices( | ||||
| 						p2p.GetBloomFilter( | ||||
| 							e.DeletedCoin.Owner.GetImplicitAccount().Address, | ||||
| 							e.DeletedCoin.Address, | ||||
| 							1024, | ||||
| 							64, | ||||
| 						), | ||||
| @ -174,8 +182,8 @@ func NewDataWorkerIPCServer( | ||||
| 
 | ||||
| func (r *DataWorkerIPCServer) Start() error { | ||||
| 	s := grpc.NewServer( | ||||
| 		grpc.MaxRecvMsgSize(10*1024*1024), | ||||
| 		grpc.MaxSendMsgSize(10*1024*1024), | ||||
| 		grpc.MaxRecvMsgSize(600*1024*1024), | ||||
| 		grpc.MaxSendMsgSize(600*1024*1024), | ||||
| 	) | ||||
| 	protobufs.RegisterDataIPCServiceServer(s, r) | ||||
| 	reflection.Register(s) | ||||
|  | ||||
| @ -5,8 +5,10 @@ import ( | ||||
| 	"context" | ||||
| 	"math/big" | ||||
| 	"net/http" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/config" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/execution/intrinsics/token/application" | ||||
| 
 | ||||
| 	"github.com/iden3/go-iden3-crypto/poseidon" | ||||
| 	"github.com/libp2p/go-libp2p/core/peer" | ||||
| @ -19,6 +21,8 @@ import ( | ||||
| 	"google.golang.org/grpc" | ||||
| 	"google.golang.org/grpc/credentials/insecure" | ||||
| 	"google.golang.org/grpc/reflection" | ||||
| 	"google.golang.org/protobuf/proto" | ||||
| 	"google.golang.org/protobuf/types/known/anypb" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/consensus/master" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/execution" | ||||
| 	"source.quilibrium.com/quilibrium/monorepo/node/keys" | ||||
| @ -194,10 +198,85 @@ func (r *RPCServer) GetPeerInfo( | ||||
| 	return resp, nil | ||||
| } | ||||
| 
 | ||||
| func (r *RPCServer) SendMessage( | ||||
| 	ctx context.Context, | ||||
| 	req *protobufs.TokenRequest, | ||||
| ) (*protobufs.SendMessageResponse, error) { | ||||
| 	any := &anypb.Any{} | ||||
| 	if err := any.MarshalFrom(req); err != nil { | ||||
| 		return nil, errors.Wrap(err, "publish message") | ||||
| 	} | ||||
| 
 | ||||
| 	// annoying protobuf any hack
 | ||||
| 	any.TypeUrl = strings.Replace( | ||||
| 		any.TypeUrl, | ||||
| 		"type.googleapis.com", | ||||
| 		"types.quilibrium.com", | ||||
| 		1, | ||||
| 	) | ||||
| 
 | ||||
| 	payload, err := proto.Marshal(any) | ||||
| 	if err != nil { | ||||
| 		return nil, errors.Wrap(err, "publish message") | ||||
| 	} | ||||
| 
 | ||||
| 	h, err := poseidon.HashBytes(payload) | ||||
| 	if err != nil { | ||||
| 		return nil, errors.Wrap(err, "publish message") | ||||
| 	} | ||||
| 
 | ||||
| 	intrinsicFilter := p2p.GetBloomFilter(application.TOKEN_ADDRESS, 256, 3) | ||||
| 
 | ||||
| 	msg := &protobufs.Message{ | ||||
| 		Hash:    h.Bytes(), | ||||
| 		Address: intrinsicFilter, | ||||
| 		Payload: payload, | ||||
| 	} | ||||
| 	data, err := proto.Marshal(msg) | ||||
| 	if err != nil { | ||||
| 		return nil, errors.Wrap(err, "publish message") | ||||
| 	} | ||||
| 	return &protobufs.SendMessageResponse{}, r.pubSub.PublishToBitmask( | ||||
| 		intrinsicFilter, | ||||
| 		data, | ||||
| 	) | ||||
| } | ||||
| 
 | ||||
| func (r *RPCServer) GetTokensByAccount( | ||||
| 	ctx context.Context, | ||||
| 	req *protobufs.GetTokensByAccountRequest, | ||||
| ) (*protobufs.TokensByAccountResponse, error) { | ||||
| 	frameNumbers, coins, err := r.coinStore.GetCoinsForOwner(req.Address) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	return &protobufs.TokensByAccountResponse{ | ||||
| 		Coins:        coins, | ||||
| 		FrameNumbers: frameNumbers, | ||||
| 	}, nil | ||||
| } | ||||
| 
 | ||||
| func (r *RPCServer) GetTokenInfo( | ||||
| 	ctx context.Context, | ||||
| 	req *protobufs.GetTokenInfoRequest, | ||||
| ) (*protobufs.TokenInfoResponse, error) { | ||||
| 	// 1 QUIL = 0x1DCD65000 units
 | ||||
| 	if req.Address != nil { | ||||
| 		_, coins, err := r.coinStore.GetCoinsForOwner(req.Address) | ||||
| 		if err != nil { | ||||
| 			return nil, errors.New("no coins found for address") | ||||
| 		} | ||||
| 
 | ||||
| 		total := big.NewInt(0) | ||||
| 		for _, coin := range coins { | ||||
| 			total.Add(total, new(big.Int).SetBytes(coin.Amount)) | ||||
| 		} | ||||
| 
 | ||||
| 		return &protobufs.TokenInfoResponse{ | ||||
| 			OwnedTokens: total.FillBytes(make([]byte, 32)), | ||||
| 		}, nil | ||||
| 	} else { | ||||
| 		provingKey, err := r.keyManager.GetRawKey( | ||||
| 			"default-proving-key", | ||||
| 		) | ||||
| @ -219,12 +298,6 @@ func (r *RPCServer) GetTokenInfo( | ||||
| 		addrBytes := addr.FillBytes(make([]byte, 32)) | ||||
| 		peerAddrBytes := peerAddr.FillBytes(make([]byte, 32)) | ||||
| 
 | ||||
| 	// 1 QUIL = 0x1DCD65000 units
 | ||||
| 	conversionFactor, ok := new(big.Int).SetString("1DCD65000", 16) | ||||
| 	if !ok { | ||||
| 		return nil, errors.Wrap(err, "get token info") | ||||
| 	} | ||||
| 
 | ||||
| 		_, coins, err := r.coinStore.GetCoinsForOwner(addrBytes) | ||||
| 		if err != nil { | ||||
| 			panic(err) | ||||
| @ -244,11 +317,10 @@ func (r *RPCServer) GetTokenInfo( | ||||
| 			total.Add(total, new(big.Int).SetBytes(coin.Amount)) | ||||
| 		} | ||||
| 
 | ||||
| 	total = total.Mul(total, conversionFactor) | ||||
| 
 | ||||
| 		return &protobufs.TokenInfoResponse{ | ||||
| 			OwnedTokens: total.FillBytes(make([]byte, 32)), | ||||
| 		}, nil | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (r *RPCServer) GetPeerManifests( | ||||
|  | ||||
| @ -82,3 +82,7 @@ func (h *MinHeap[I]) downheap(i int) { | ||||
| 		i = smallest | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (h *MinHeap[I]) All() []I { | ||||
| 	return h.items | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Cassandra Heart
						Cassandra Heart