From e26cc0797d9c61927a117bade2ceba86620954ed Mon Sep 17 00:00:00 2001 From: SetarehGhorshi Date: Tue, 24 Mar 2026 22:23:19 -0400 Subject: [PATCH 01/42] fix: Withdraw proofs can be replayed to withdraw on behalf of users --- x/zkp/keeper/query_proof_verification.go | 49 ++++++++++------- x/zkp/verification/commitment/commitment.go | 61 +++++++++++++++++++++ x/zkp/verification/range/range.go | 59 ++++++++++++++++++++ 3 files changed, 150 insertions(+), 19 deletions(-) diff --git a/x/zkp/keeper/query_proof_verification.go b/x/zkp/keeper/query_proof_verification.go index 2b616c1a..41df03f0 100644 --- a/x/zkp/keeper/query_proof_verification.go +++ b/x/zkp/keeper/query_proof_verification.go @@ -11,24 +11,22 @@ import ( "google.golang.org/grpc/status" ) -// VerifyWithdrawRangeProof verifies a withdraw range proof (U64) +// VerifyWithdrawRangeProof verifies a withdraw range proof (U64) with nonce binding. func (k Keeper) VerifyWithdrawRangeProof(goCtx context.Context, req *types.QueryVerifyWithdrawRangeProofRequest) (*types.QueryVerifyWithdrawRangeProofResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "invalid request") } - // Deserialize proof data - if len(req.ProofData) < 8*32+8+672 { + if len(req.ProofData) < 8*32+8+8+672 { return &types.QueryVerifyWithdrawRangeProofResponse{ Valid: false, Error: "invalid proof data length", }, nil } - var proofData rangeproof.BatchedRangeProofU64Data + var proofData rangeproof.WithdrawBatchedRangeProofU64Data offset := 0 - // Deserialize commitments for i := 0; i < 8; i++ { if offset+32 > len(req.ProofData) { return &types.QueryVerifyWithdrawRangeProofResponse{ @@ -40,7 +38,6 @@ func (k Keeper) VerifyWithdrawRangeProof(goCtx context.Context, req *types.Query offset += 32 } - // Deserialize bit lengths for i := 0; i < 8; i++ { if offset >= len(req.ProofData) { return &types.QueryVerifyWithdrawRangeProofResponse{ @@ -52,7 +49,15 @@ func (k Keeper) VerifyWithdrawRangeProof(goCtx context.Context, req *types.Query offset++ } - // Deserialize proof + if offset+8 > len(req.ProofData) { + return &types.QueryVerifyWithdrawRangeProofResponse{ + Valid: false, + Error: "invalid nonce data", + }, nil + } + copy(proofData.Context.Nonce[:], req.ProofData[offset:offset+8]) + offset += 8 + if offset+672 > len(req.ProofData) { return &types.QueryVerifyWithdrawRangeProofResponse{ Valid: false, @@ -61,8 +66,7 @@ func (k Keeper) VerifyWithdrawRangeProof(goCtx context.Context, req *types.Query } copy(proofData.Proof[:], req.ProofData[offset:offset+672]) - // Verify proof using the verification module - err := rangeproof.VerifyWithdrawRange(&proofData) + err := rangeproof.VerifyWithdrawRangeWithNonce(&proofData) if err != nil { return &types.QueryVerifyWithdrawRangeProofResponse{ Valid: false, @@ -394,17 +398,16 @@ func (k Keeper) VerifyWithdrawProofs(goCtx context.Context, req *types.QueryVeri } // Verify equality proof - if len(req.EqualityProofData) < 320 { + if len(req.EqualityProofData) < 328 { return &types.QueryVerifyWithdrawProofsResponse{ Valid: false, Error: "invalid equality proof data length", }, nil } - var equalityProofData commitment.CiphertextCommitmentEqualityProofData + var equalityProofData commitment.WithdrawCiphertextCommitmentEqualityProofData offset := 0 - // Deserialize equality proof copy(equalityProofData.Context.Pubkey.Bytes[:], req.EqualityProofData[offset:offset+32]) offset += 32 copy(equalityProofData.Context.Ciphertext.Commitment[:], req.EqualityProofData[offset:offset+32]) @@ -413,6 +416,8 @@ func (k Keeper) VerifyWithdrawProofs(goCtx context.Context, req *types.QueryVeri offset += 32 copy(equalityProofData.Context.Commitment.Bytes[:], req.EqualityProofData[offset:offset+32]) offset += 32 + copy(equalityProofData.Context.Nonce[:], req.EqualityProofData[offset:offset+8]) + offset += 8 copy(equalityProofData.Proof.Y0[:], req.EqualityProofData[offset:offset+32]) offset += 32 copy(equalityProofData.Proof.Y1[:], req.EqualityProofData[offset:offset+32]) @@ -425,7 +430,7 @@ func (k Keeper) VerifyWithdrawProofs(goCtx context.Context, req *types.QueryVeri offset += 32 copy(equalityProofData.Proof.Zr[:], req.EqualityProofData[offset:offset+32]) - err := commitment.VerifyEqualityProof(&equalityProofData) + err := commitment.VerifyWithdrawEqualityProof(&equalityProofData) if err != nil { return &types.QueryVerifyWithdrawProofsResponse{ Valid: false, @@ -434,17 +439,16 @@ func (k Keeper) VerifyWithdrawProofs(goCtx context.Context, req *types.QueryVeri } // Verify range proof - if len(req.RangeProofData) < 8*32+8+672 { + if len(req.RangeProofData) < 8*32+8+8+672 { return &types.QueryVerifyWithdrawProofsResponse{ Valid: false, Error: "invalid range proof data length", }, nil } - var rangeProofData rangeproof.BatchedRangeProofU64Data + var rangeProofData rangeproof.WithdrawBatchedRangeProofU64Data offset = 0 - // Deserialize range proof commitments for i := 0; i < 8; i++ { if offset+32 > len(req.RangeProofData) { return &types.QueryVerifyWithdrawProofsResponse{ @@ -456,7 +460,6 @@ func (k Keeper) VerifyWithdrawProofs(goCtx context.Context, req *types.QueryVeri offset += 32 } - // Deserialize bit lengths for i := 0; i < 8; i++ { if offset >= len(req.RangeProofData) { return &types.QueryVerifyWithdrawProofsResponse{ @@ -468,7 +471,15 @@ func (k Keeper) VerifyWithdrawProofs(goCtx context.Context, req *types.QueryVeri offset++ } - // Deserialize proof + if offset+8 > len(req.RangeProofData) { + return &types.QueryVerifyWithdrawProofsResponse{ + Valid: false, + Error: "invalid range proof nonce data", + }, nil + } + copy(rangeProofData.Context.Nonce[:], req.RangeProofData[offset:offset+8]) + offset += 8 + if offset+672 > len(req.RangeProofData) { return &types.QueryVerifyWithdrawProofsResponse{ Valid: false, @@ -477,7 +488,7 @@ func (k Keeper) VerifyWithdrawProofs(goCtx context.Context, req *types.QueryVeri } copy(rangeProofData.Proof[:], req.RangeProofData[offset:offset+672]) - err = rangeproof.VerifyWithdrawRange(&rangeProofData) + err = rangeproof.VerifyWithdrawRangeWithNonce(&rangeProofData) if err != nil { return &types.QueryVerifyWithdrawProofsResponse{ Valid: false, diff --git a/x/zkp/verification/commitment/commitment.go b/x/zkp/verification/commitment/commitment.go index d99d6760..55fe7a03 100644 --- a/x/zkp/verification/commitment/commitment.go +++ b/x/zkp/verification/commitment/commitment.go @@ -325,3 +325,64 @@ func newSplTranscript(ctx *CiphertextCommitmentEqualityProofContext) *merlin.Tra return t } +type PodU64 [8]byte + +type WithdrawCiphertextCommitmentEqualityProofContext struct { + Pubkey PodElGamalPubkey + Ciphertext PodElGamalCiphertext + Commitment PodPedersenCommitment + Nonce PodU64 +} + +type WithdrawCiphertextCommitmentEqualityProofData struct { + Context WithdrawCiphertextCommitmentEqualityProofContext + Proof PodCiphertextCommitmentEqualityProof +} + +func VerifyWithdrawEqualityProof(pd *WithdrawCiphertextCommitmentEqualityProofData) error { + var pk ElGamalPubkey + if err := pk.FromPod(pd.Context.Pubkey); err != nil { + return ErrProofDeserialization + } + + var ct ElGamalCiphertext + if err := ct.FromPod(pd.Context.Ciphertext); err != nil { + return ErrProofDeserialization + } + + cm, err := PedersenCommitmentFromPod(pd.Context.Commitment) + if err != nil { + return ErrProofDeserialization + } + + raw := pd.Proof.AsBytes() + proof, err := EqualityProofFromBytes(&raw) + if err != nil { + return ErrProofDeserialization + } + + t := newWithdrawSplTranscript(&pd.Context) + + if err := proof.Verify(&pk, &ct, cm, t); err != nil { + return ErrProofAlgebraic + } + return nil +} + +func newWithdrawSplTranscript(ctx *WithdrawCiphertextCommitmentEqualityProofContext) *merlin.Transcript { + t := merlin.NewTranscript("withdraw-ciphertext-commitment-equality-instruction") + + t.AppendMessage([]byte("pubkey"), ctx.Pubkey.Bytes[:]) + + var ctBytes [2 * U]byte + copy(ctBytes[0*U:1*U], ctx.Ciphertext.Commitment[:]) + copy(ctBytes[1*U:2*U], ctx.Ciphertext.Handle[:]) + t.AppendMessage([]byte("ciphertext"), ctBytes[:]) + + t.AppendMessage([]byte("commitment"), ctx.Commitment.Bytes[:]) + + t.AppendMessage([]byte("nonce"), ctx.Nonce[:]) + + return t +} + diff --git a/x/zkp/verification/range/range.go b/x/zkp/verification/range/range.go index d8f7c028..26a9c46e 100644 --- a/x/zkp/verification/range/range.go +++ b/x/zkp/verification/range/range.go @@ -851,6 +851,65 @@ func VerifyWithdrawRange(pd *BatchedRangeProofU64Data) error { return nil } +type PodU64 [8]byte + +type WithdrawBatchedRangeProofContext struct { + Commitments [8]PodPedersenCommitment + BitLengths [8]uint8 + Nonce PodU64 +} + +type WithdrawBatchedRangeProofU64Data struct { + Context WithdrawBatchedRangeProofContext + Proof PodRangeProofU64 +} + + +func VerifyWithdrawRangeWithNonce(pd *WithdrawBatchedRangeProofU64Data) error { + baseCtx := BatchedRangeProofContext{ + Commitments: pd.Context.Commitments, + BitLengths: pd.Context.BitLengths, + } + commitments, bitLengths, perr := collectRangeCtx(&baseCtx, 64) + if perr != 0 { + return perr + } + + t := newWithdrawTranscriptRange(&pd.Context) + + rp, err := RangeProofFromPodU64(pd.Proof) + if err != nil { + return ProofErrDeserialization + } + + commRefs := make([]*PedersenCommitment, len(commitments)) + for i := range commitments { + commRefs[i] = &commitments[i] + } + + if err := rp.Verify(commRefs, bitLengths, t); err != nil { + return ProofErrAlgebraic + } + return nil +} + +func newWithdrawTranscriptRange(ctx *WithdrawBatchedRangeProofContext) *merlin.Transcript { + t := merlin.NewTranscript("withdraw-batched-range-proof-instruction") + + var commitsBytes [8 * 32]byte + for i := 0; i < len(ctx.Commitments); i++ { + copy(commitsBytes[32*i:32*(i+1)], ctx.Commitments[i].Bytes[:]) + } + t.AppendMessage([]byte("commitments"), commitsBytes[:]) + + bitBytes := ctx.BitLengths + t.AppendMessage([]byte("bit-lengths"), bitBytes[:]) + + t.AppendMessage([]byte("nonce"), ctx.Nonce[:]) + + return t +} + func VerifyTransferRange(pd *BatchedRangeProofU128Data) error { commitments, bitLengths, perr := collectRangeCtx(&pd.Context, 64) if perr != 0 { From e228969451787309090236fb7a82f00f0957de9d Mon Sep 17 00:00:00 2001 From: YadlaMani Date: Thu, 2 Apr 2026 12:47:33 +0530 Subject: [PATCH 02/42] added prod-config --- Makefile | 7 +- scripts/devnet/prod-config.sh | 353 ++++++++++++++++++++++++++++++++++ 2 files changed, 359 insertions(+), 1 deletion(-) create mode 100644 scripts/devnet/prod-config.sh diff --git a/Makefile b/Makefile index d217da15..4e7c643b 100644 --- a/Makefile +++ b/Makefile @@ -189,6 +189,11 @@ integration-test-all: init-test-framework \ devnet-up: init-devnet @echo "Fairyring Devnet is now running in the background, run 'make devnet-down' to stop devnet." +prod-config: install + @echo "Configuring fairyring, fairyringclient, ShareGenerationClient and fairyport (no data reset, no processes started)..." + ./scripts/devnet/prod-config.sh + @echo "Run 'make devnet-down' if you need to stop any already-running processes." + devnet-down: @echo "Killing fairyringd, fairyport, fairyringclient, ShareGenerationClient and removing previous data" -@killall fairyringd 2>/dev/null @@ -316,4 +321,4 @@ proto-swagger-gen: @echo "Generating Protobuf Swagger" @sh ./proto/scripts/protoc-swagger-gen.sh -.PHONY: proto-gen proto-doc proto-swagger-gen +.PHONY: proto-gen proto-doc proto-swagger-gen \ No newline at end of file diff --git a/scripts/devnet/prod-config.sh b/scripts/devnet/prod-config.sh new file mode 100644 index 00000000..0845363d --- /dev/null +++ b/scripts/devnet/prod-config.sh @@ -0,0 +1,353 @@ +#!/bin/bash +# prod-config.sh +# +# Configures fairyring, fairyringclient, ShareGenerationClient, and fairyport +# for production use WITHOUT resetting existing chain data or starting any process. +# Generates systemd .service files at the end. + +set -e + +# ───────────────────────── CONFIG ───────────────────────── +if [ -f "$HOME/go/bin/fairyringd" ]; then + BINARY="$HOME/go/bin/fairyringd" +else + BINARY=fairyringd +fi + +CHAIN_DIR=$(pwd)/devnet_data +CHAINID=fairyring_devnet + +FAIRYRINGCLIENT=fairyringclient +SHAREGENERATIONCLIENT=ShareGenerationClient +FAIRYPORT=fairyport + +VE_ENABLE_HEIGHT="${VE_ENABLE_HEIGHT:-30}" +KEYSHARER_INVALID_SHARE_PAUSE_THRESHOLD="${KEYSHARER_INVALID_SHARE_PAUSE_THRESHOLD:-3}" +APP_PRIV_HEX="${APP_PRIV_HEX:-}" + +DEPS_DIR="$(pwd)/.devnet_deps" + +P2PPORT=26656 +RPCPORT=26657 +RESTPORT=1317 +ROSETTA=8080 +GRPCPORT=9090 + + +VAL_MNEMONIC_1="clock post desk civil pottery foster expand merit dash seminar song memory figure uniform spice circle try happy obvious trash crime hybrid hood cushion" + +WALLET_MNEMONIC_1="banner spread envelope side kite person disagree path silver will brother under couch edit food venture squirrel civil budget number acquire point work mass" +WALLET_MNEMONIC_2="veteran try aware erosion drink dance decade comic dawn museum release episode original list ability owner size tuition surface ceiling depth seminar capable only" +WALLET_MNEMONIC_3="vacuum burst ordinary enact leaf rabbit gather lend left chase park action dish danger green jeans lucky dish mesh language collect acquire waste load" +WALLET_MNEMONIC_4="open attitude harsh casino rent attitude midnight debris describe spare cancel crisp olive ride elite gallery leaf buffalo sheriff filter rotate path begin soldier" +WALLET_MNEMONIC_5="sleep garage unaware monster slide cruel barely blade sudden basic review mimic screen box human wing ritual use smooth ripple tuna ostrich pony eye" +WALLET_MNEMONIC_6="polar account muffin credit dice holiday honey diesel faculty maze senior curve clap hard similar club evolve wolf stable hedgehog secret used rebuild help" + +RLY_MNEMONIC_1="alley afraid soup fall idea toss can goose become valve initial strong forward bright dish figure check leopard decide warfare hub unusual join cart" + + +# ───────────────────── Helper functions ───────────────────── +backup_if_exists() { + local f="$1" + if [ -f "$f" ]; then + cp "$f" "$f.backup.$(date +%s)" + fi +} + +need_cmd() { + if ! command -v "$1" >/dev/null 2>&1; then + echo "Missing required command: $1" + MISSING=1 + fi +} + +# Ensure GOPATH/bin is in PATH +if command -v go >/dev/null 2>&1; then + export PATH="$PATH:$(go env GOPATH)/bin" +fi + +# ─────────────── Pre-flight checks ────────────────────────── +MISSING=0 +need_cmd git +need_cmd go +need_cmd jq +need_cmd make +if [ "$MISSING" -eq 1 ]; then + echo "Please install the missing prerequisites above and re-run." + exit 1 +fi + +mkdir -p "$DEPS_DIR" + +# ─────────────── Ensure client binaries exist ─────────────── +ensure_sharegenerationclient() { + if ! command -v "$SHAREGENERATIONCLIENT" >/dev/null 2>&1; then + echo "Installing $SHAREGENERATIONCLIENT..." + local repo="$DEPS_DIR/ShareGenerationClient" + if [ ! -d "$repo" ]; then + git clone https://github.com/Fairblock/ShareGenerationClient "$repo" + fi + ( cd "$repo" + git fetch --tags + git checkout "0.2.0" + go mod tidy + go install + ) + else + echo "$SHAREGENERATIONCLIENT found." + fi +} + +ensure_fairyringclient() { + if ! command -v "$FAIRYRINGCLIENT" >/dev/null 2>&1; then + echo "Installing $FAIRYRINGCLIENT..." + local repo="$DEPS_DIR/fairyringclient" + if [ ! -d "$repo" ]; then + git clone https://github.com/Fairblock/fairyringclient "$repo" + fi + ( cd "$repo" + git fetch --tags + git checkout "v0.7.0" + go mod tidy + go install + ) + else + echo "$FAIRYRINGCLIENT found." + fi +} + +ensure_fairyport() { + if ! command -v "$FAIRYPORT" >/dev/null 2>&1; then + echo "Installing $FAIRYPORT..." + local repo="$DEPS_DIR/fairyport" + if [ ! -d "$repo" ]; then + git clone https://github.com/Fairblock/fairyport "$repo" + fi + ( cd "$repo" + make install + ) + else + echo "$FAIRYPORT found." + fi +} + +ensure_sharegenerationclient +ensure_fairyringclient +ensure_fairyport + +# ─────────────── 1. Initialize fairyring (skip if exists) ─── +if [ -d "$CHAIN_DIR/$CHAINID/config" ]; then + echo "Chain data already exists at $CHAIN_DIR/$CHAINID — skipping genesis init." +else + echo "Initializing $CHAINID at $CHAIN_DIR/$CHAINID ..." + mkdir -p "$CHAIN_DIR/$CHAINID" + $BINARY init prod --home "$CHAIN_DIR/$CHAINID" --default-denom ufair --chain-id="$CHAINID" &> /dev/null + + echo "Adding genesis accounts..." + echo "$VAL_MNEMONIC_1" | $BINARY keys add val1 --home "$CHAIN_DIR/$CHAINID" --recover --keyring-backend test + echo "$WALLET_MNEMONIC_1" | $BINARY keys add wallet1 --home "$CHAIN_DIR/$CHAINID" --recover --keyring-backend test + echo "$WALLET_MNEMONIC_2" | $BINARY keys add wallet2 --home "$CHAIN_DIR/$CHAINID" --recover --keyring-backend test + echo "$WALLET_MNEMONIC_3" | $BINARY keys add wallet3 --home "$CHAIN_DIR/$CHAINID" --recover --keyring-backend test + echo "$WALLET_MNEMONIC_4" | $BINARY keys add wallet4 --home "$CHAIN_DIR/$CHAINID" --recover --keyring-backend test + echo "$WALLET_MNEMONIC_5" | $BINARY keys add wallet5 --home "$CHAIN_DIR/$CHAINID" --recover --keyring-backend test + echo "$WALLET_MNEMONIC_6" | $BINARY keys add wallet6 --home "$CHAIN_DIR/$CHAINID" --recover --keyring-backend test + echo "$RLY_MNEMONIC_1" | $BINARY keys add rly1 --home "$CHAIN_DIR/$CHAINID" --recover --keyring-backend test + + VAL1_ADDR=$($BINARY keys show val1 --home "$CHAIN_DIR/$CHAINID" -a --keyring-backend test) + WALLET1_ADDR=$($BINARY keys show wallet1 --home "$CHAIN_DIR/$CHAINID" -a --keyring-backend test) + WALLET2_ADDR=$($BINARY keys show wallet2 --home "$CHAIN_DIR/$CHAINID" -a --keyring-backend test) + WALLET3_ADDR=$($BINARY keys show wallet3 --home "$CHAIN_DIR/$CHAINID" -a --keyring-backend test) + WALLET4_ADDR=$($BINARY keys show wallet4 --home "$CHAIN_DIR/$CHAINID" -a --keyring-backend test) + WALLET5_ADDR=$($BINARY keys show wallet5 --home "$CHAIN_DIR/$CHAINID" -a --keyring-backend test) + WALLET6_ADDR=$($BINARY keys show wallet6 --home "$CHAIN_DIR/$CHAINID" -a --keyring-backend test) + RLY1_ADDR=$($BINARY keys show rly1 --home "$CHAIN_DIR/$CHAINID" -a --keyring-backend test) + + $BINARY genesis add-genesis-account "$VAL1_ADDR" 1000000000000ufair --home "$CHAIN_DIR/$CHAINID" --keyring-backend test + $BINARY genesis add-genesis-account "$WALLET1_ADDR" 10000000000000000ufair,1000000000000fusdc --home "$CHAIN_DIR/$CHAINID" --keyring-backend test + $BINARY genesis add-genesis-account "$WALLET2_ADDR" 1000000000000ufair --home "$CHAIN_DIR/$CHAINID" --keyring-backend test + $BINARY genesis add-genesis-account "$WALLET3_ADDR" 1000000000000ufair \ + --vesting-amount 1000000000000ufair \ + --vesting-start-time "$(date +%s)" \ + --vesting-end-time "$(($(date '+%s') + 100000023))" \ + --home "$CHAIN_DIR/$CHAINID" --keyring-backend test + $BINARY genesis add-genesis-account "$WALLET4_ADDR" 1000000000000ufair \ + --vesting-amount 1000000000000ufair \ + --vesting-start-time "$(date +%s)" \ + --vesting-end-time "$(($(date '+%s') + 100000023))" \ + --home "$CHAIN_DIR/$CHAINID" --keyring-backend test + $BINARY genesis add-genesis-account "$WALLET5_ADDR" 1000000000000ufair --home "$CHAIN_DIR/$CHAINID" --keyring-backend test + $BINARY genesis add-genesis-account "$WALLET6_ADDR" 100000000000000ufair --home "$CHAIN_DIR/$CHAINID" --keyring-backend test + $BINARY genesis add-genesis-account "$RLY1_ADDR" 1000000000000ufair --home "$CHAIN_DIR/$CHAINID" --keyring-backend test + + echo "Creating and collecting gentx..." + $BINARY genesis gentx val1 100000000000ufair \ + --home "$CHAIN_DIR/$CHAINID" --chain-id "$CHAINID" --keyring-backend test + $BINARY genesis collect-gentxs --home "$CHAIN_DIR/$CHAINID" &> /dev/null +fi + +# Resolve addresses (needed for genesis patches and keysharer.yaml) +VAL1_ADDR=$($BINARY keys show val1 --home "$CHAIN_DIR/$CHAINID" -a --keyring-backend test 2>/dev/null || echo "") +RLY1_ADDR=$($BINARY keys show rly1 --home "$CHAIN_DIR/$CHAINID" -a --keyring-backend test 2>/dev/null || echo "") +WALLET5_ADDR=$($BINARY keys show wallet5 --home "$CHAIN_DIR/$CHAINID" -a --keyring-backend test 2>/dev/null || echo "") + +# ─────────────── 2. config.toml ───────────────────────────── +echo "Updating config.toml..." +CFG="$CHAIN_DIR/$CHAINID/config/config.toml" + +sed -i -e 's/cors_allowed_origins = \[\]/cors_allowed_origins = \["*"\]/g' "$CFG" +sed -i -e 's#"tcp://0.0.0.0:26656"#"tcp://0.0.0.0:'"$P2PPORT"'"#g' "$CFG" +sed -i -e 's#"tcp://127.0.0.1:26657"#"tcp://0.0.0.0:'"$RPCPORT"'"#g' "$CFG" +sed -i -e 's/timeout_commit = "5s"/timeout_commit = "5s"/g' "$CFG" +sed -i -e 's/timeout_propose = "3s"/timeout_propose = "5s"/g' "$CFG" +sed -i -e 's/index_all_keys = false/index_all_keys = true/g' "$CFG" + +if ! grep -q "max_body_bytes" "$CFG"; then + sed -i '/\[rpc\]/a max_body_bytes = 52428800' "$CFG" +else + sed -i -e 's/^max_body_bytes = .*/max_body_bytes = 52428800/g' "$CFG" +fi + +if grep -q "^max_tx_bytes" "$CFG"; then + sed -i -e 's/^max_tx_bytes = .*/max_tx_bytes = 52428800/g' "$CFG" +fi + +# ─────────────── 3. app.toml ──────────────────────────────── +echo "Updating app.toml..." +APP="$CHAIN_DIR/$CHAINID/config/app.toml" + +sed -i -e 's/cors = false/cors = true/g' "$APP" +sed -i -e 's/enable = false/enable = true/g' "$APP" +sed -i -e 's/swagger = false/swagger = true/g' "$APP" +sed -i -e 's#"tcp://localhost:1317"#"tcp://localhost:'"$RESTPORT"'"#g' "$APP" +sed -i -e 's#":8080"#":'"$ROSETTA"'"#g' "$APP" +sed -i -e 's/minimum-gas-prices = ""/minimum-gas-prices = "0ufair"/g' "$APP" + +if ! grep -q "^\[mempool\]" "$APP"; then + echo "" >> "$APP" + echo "[mempool]" >> "$APP" +fi +if ! grep -q "^max_tx_bytes" "$APP"; then + sed -i '/^\[mempool\]/a max_tx_bytes = 52428800' "$APP" +else + sed -i -e 's/^max_tx_bytes = .*/max_tx_bytes = 52428800/g' "$APP" +fi + +if ! grep -q "\[wasm\]" "$APP"; then +cat >> "$APP" << 'WASM_EOF' +############################################################################### +### WASM Configuration ### +############################################################################### +[wasm] +# Maximum gas that can be consumed by a single smart contract query (0 = no limit). +query_gas_limit = 3000000 +# Number of cached modules in wasm VM. 0 = use default. +lru_size = 0 +# Capabilities the node is willing to support. Must include "stargate" to allow +# contracts to perform Stargate / gRPC queries into SDK modules. +available_capabilities = [ + "iterator", + "staking", + "stargate", + "cosmwasm_1_1", + "cosmwasm_1_2", + "cosmwasm_1_3", + "cosmwasm_1_4", + "cosmwasm_2_0", +] +WASM_EOF +fi + +# ─────────────── 4. genesis.json ──────────────────────────── +echo "Updating genesis.json..." +GEN="$CHAIN_DIR/$CHAINID/config/genesis.json" + +sed -i -e 's/"max_deposit_period": "172800s"/"max_deposit_period": "10s"/g' "$GEN" +sed -i -e 's/"voting_period": "172800s"/"voting_period": "10s"/g' "$GEN" +sed -i -e 's/"reward_delay_time": "604800s"/"reward_delay_time": "0s"/g' "$GEN" + +jq --arg veh "$VE_ENABLE_HEIGHT" ' + .consensus.params.abci |= (.consensus.params.abci // {}) | + .consensus.params.abci.vote_extensions_enable_height = $veh | + .consensus.params.block.max_tx_bytes = "52428800" | + .consensus.params.evidence.max_tx_bytes = "52428800" +' "$GEN" > "$GEN.tmp" && mv "$GEN.tmp" "$GEN" + +if [ -n "$VAL1_ADDR" ] && [ -n "$RLY1_ADDR" ] && [ -n "$WALLET5_ADDR" ]; then + sed -i -e 's/"trusted_addresses": \[\]/"trusted_addresses": \["'"$VAL1_ADDR"'","'"$RLY1_ADDR"'","'"$WALLET5_ADDR"'"\]/g' "$GEN" +fi + +TRUSTED_PARTIES='{"client_id": "07-tendermint-0", "connection_id": "connection-0", "channel_id": "channel-0"}' +sed -i -e 's/"trusted_counter_parties": \[\]/"trusted_counter_parties": \['"$TRUSTED_PARTIES"'\]/g' "$GEN" +sed -i -e 's/"key_expiry": "100"/"key_expiry": "1000000"/g' "$GEN" +sed -i -e 's/"is_source_chain": false/"is_source_chain": true/g' "$GEN" + +# ─────────────── 5. keysharer.yaml ────────────────────────── +echo "Writing keysharer.yaml..." +if [ -z "$APP_PRIV_HEX" ] && [ -n "$VAL1_ADDR" ]; then + APP_PRIV_HEX=$(echo y | $BINARY keys export val1 \ + --home "$CHAIN_DIR/$CHAINID" --unsafe --unarmored-hex --keyring-backend test \ + 2>/dev/null | tail -n 1 | tr -d '\r\n') +fi + +cat > "$CHAIN_DIR/$CHAINID/config/keysharer.yaml" << EOF +enabled: true +validator_account: "$VAL1_ADDR" +app_secp256k1_priv_hex: "$APP_PRIV_HEX" +invalid_share_pause_threshold: $KEYSHARER_INVALID_SHARE_PAUSE_THRESHOLD +EOF +echo "keysharer.yaml written to $CHAIN_DIR/$CHAINID/config/keysharer.yaml" + +# ─────────────── 6. Configure fairyringclient ─────────────── +echo "Configuring fairyringclient..." +FRCLIENT_CFGDIR="$HOME/.fairyringclient" +FRCLIENT_CFG="$FRCLIENT_CFGDIR/config.yml" +mkdir -p "$FRCLIENT_CFGDIR" +if [ ! -f "$FRCLIENT_CFG" ] && command -v "$FAIRYRINGCLIENT" >/dev/null 2>&1; then + $FAIRYRINGCLIENT config init +fi +if [ -f "$(pwd)/scripts/devnet/fairyringclient_config.yml" ]; then + backup_if_exists "$FRCLIENT_CFG" + cp -f "$(pwd)/scripts/devnet/fairyringclient_config.yml" "$FRCLIENT_CFG" + echo "fairyringclient config written to $FRCLIENT_CFG" +fi + +# ─────────────── 7. Configure ShareGenerationClient ───────── +echo "Configuring ShareGenerationClient..." +SGC_CFGDIR="$HOME/.ShareGenerationClient" +SGC_CFG="$SGC_CFGDIR/config.yml" +mkdir -p "$SGC_CFGDIR" +if [ ! -f "$SGC_CFG" ] && command -v "$SHAREGENERATIONCLIENT" >/dev/null 2>&1; then + $SHAREGENERATIONCLIENT config init +fi +if [ -f "$(pwd)/scripts/devnet/sharegenerationclient_config.yml" ]; then + backup_if_exists "$SGC_CFG" + cp -f "$(pwd)/scripts/devnet/sharegenerationclient_config.yml" "$SGC_CFG" + echo "ShareGenerationClient config written to $SGC_CFG" +fi + +# ─────────────── 8. Configure fairyport ───────────────────── +echo "Configuring fairyport..." +FP_CFGDIR="$HOME/.fairyport" +FP_CFG="$FP_CFGDIR/config.yml" +mkdir -p "$FP_CFGDIR" +if [ -f "$(pwd)/scripts/devnet/config.yml" ]; then + backup_if_exists "$FP_CFG" + cp -f "$(pwd)/scripts/devnet/config.yml" "$FP_CFG" + echo "fairyport config written to $FP_CFG" +fi + +CHAIN_HOME_ABS="$(realpath "$CHAIN_DIR/$CHAINID")" + +echo "" +echo "************************************************************" +echo "* prod-config complete — no processes were started *" +echo "************************************************************" +echo " Chain home : $CHAIN_HOME_ABS" +echo " Chain ID : $CHAINID" +echo "" +echo " Client configs:" +echo " fairyringclient -> $FRCLIENT_CFG" +echo " ShareGenerationClient -> $SGC_CFG" +echo " fairyport -> $FP_CFG" +echo "" +echo "************************************************************" \ No newline at end of file From 30e2bb6cf3d530aceb9e7d53cdc8ff0eeebfa35d Mon Sep 17 00:00:00 2001 From: SetarehGhorshi Date: Mon, 6 Apr 2026 19:36:18 -0400 Subject: [PATCH 03/42] =?UTF-8?q?fix:=20Equality,=20range=20and=20validity?= =?UTF-8?q?=20proofs=20for=20transfers=20are=20verified=20independently=20?= =?UTF-8?q?and=20each=20proof=20has=20its=20own=20context=20(public=20keys?= =?UTF-8?q?,=20commitment).=C2=A0It's=20not=20checked=20anywhere=20if=20th?= =?UTF-8?q?ey're=20consistent=20and=20they're=20for=20the=20same=20value.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/fairyring/zkp/query.pulsar.go | 804 +++++++++++++++--- go.mod | 1 + go.sum | 2 + proto/fairyring/zkp/query.proto | 17 +- wasmbinding/querier.go | 64 +- x/zkp/keeper/query_proof_verification.go | 106 ++- x/zkp/types/query.pb.go | 509 ++++++++++- x/zkp/verification/range/range.go | 1 - x/zkp/verification/transferctx/transferctx.go | 87 ++ x/zkp/verification/withdrawctx/withdrawctx.go | 45 + 10 files changed, 1443 insertions(+), 193 deletions(-) create mode 100644 x/zkp/verification/transferctx/transferctx.go create mode 100644 x/zkp/verification/withdrawctx/withdrawctx.go diff --git a/api/fairyring/zkp/query.pulsar.go b/api/fairyring/zkp/query.pulsar.go index 4b7c3d51..c69a25f0 100644 --- a/api/fairyring/zkp/query.pulsar.go +++ b/api/fairyring/zkp/query.pulsar.go @@ -3600,10 +3600,14 @@ func (x *fastReflection_QueryVerifyEqualityProofResponse) ProtoMethods() *protoi } var ( - md_QueryVerifyTransferProofsRequest protoreflect.MessageDescriptor - fd_QueryVerifyTransferProofsRequest_equality_proof_data protoreflect.FieldDescriptor - fd_QueryVerifyTransferProofsRequest_range_proof_data protoreflect.FieldDescriptor - fd_QueryVerifyTransferProofsRequest_validity_proof_data protoreflect.FieldDescriptor + md_QueryVerifyTransferProofsRequest protoreflect.MessageDescriptor + fd_QueryVerifyTransferProofsRequest_equality_proof_data protoreflect.FieldDescriptor + fd_QueryVerifyTransferProofsRequest_range_proof_data protoreflect.FieldDescriptor + fd_QueryVerifyTransferProofsRequest_validity_proof_data protoreflect.FieldDescriptor + fd_QueryVerifyTransferProofsRequest_sender_pubkey protoreflect.FieldDescriptor + fd_QueryVerifyTransferProofsRequest_recipient_pubkey protoreflect.FieldDescriptor + fd_QueryVerifyTransferProofsRequest_current_balance_commitment protoreflect.FieldDescriptor + fd_QueryVerifyTransferProofsRequest_current_balance_handle protoreflect.FieldDescriptor ) func init() { @@ -3612,6 +3616,10 @@ func init() { fd_QueryVerifyTransferProofsRequest_equality_proof_data = md_QueryVerifyTransferProofsRequest.Fields().ByName("equality_proof_data") fd_QueryVerifyTransferProofsRequest_range_proof_data = md_QueryVerifyTransferProofsRequest.Fields().ByName("range_proof_data") fd_QueryVerifyTransferProofsRequest_validity_proof_data = md_QueryVerifyTransferProofsRequest.Fields().ByName("validity_proof_data") + fd_QueryVerifyTransferProofsRequest_sender_pubkey = md_QueryVerifyTransferProofsRequest.Fields().ByName("sender_pubkey") + fd_QueryVerifyTransferProofsRequest_recipient_pubkey = md_QueryVerifyTransferProofsRequest.Fields().ByName("recipient_pubkey") + fd_QueryVerifyTransferProofsRequest_current_balance_commitment = md_QueryVerifyTransferProofsRequest.Fields().ByName("current_balance_commitment") + fd_QueryVerifyTransferProofsRequest_current_balance_handle = md_QueryVerifyTransferProofsRequest.Fields().ByName("current_balance_handle") } var _ protoreflect.Message = (*fastReflection_QueryVerifyTransferProofsRequest)(nil) @@ -3697,6 +3705,30 @@ func (x *fastReflection_QueryVerifyTransferProofsRequest) Range(f func(protorefl return } } + if len(x.SenderPubkey) != 0 { + value := protoreflect.ValueOfBytes(x.SenderPubkey) + if !f(fd_QueryVerifyTransferProofsRequest_sender_pubkey, value) { + return + } + } + if len(x.RecipientPubkey) != 0 { + value := protoreflect.ValueOfBytes(x.RecipientPubkey) + if !f(fd_QueryVerifyTransferProofsRequest_recipient_pubkey, value) { + return + } + } + if len(x.CurrentBalanceCommitment) != 0 { + value := protoreflect.ValueOfBytes(x.CurrentBalanceCommitment) + if !f(fd_QueryVerifyTransferProofsRequest_current_balance_commitment, value) { + return + } + } + if len(x.CurrentBalanceHandle) != 0 { + value := protoreflect.ValueOfBytes(x.CurrentBalanceHandle) + if !f(fd_QueryVerifyTransferProofsRequest_current_balance_handle, value) { + return + } + } } // Has reports whether a field is populated. @@ -3718,6 +3750,14 @@ func (x *fastReflection_QueryVerifyTransferProofsRequest) Has(fd protoreflect.Fi return len(x.RangeProofData) != 0 case "fairyring.zkp.QueryVerifyTransferProofsRequest.validity_proof_data": return len(x.ValidityProofData) != 0 + case "fairyring.zkp.QueryVerifyTransferProofsRequest.sender_pubkey": + return len(x.SenderPubkey) != 0 + case "fairyring.zkp.QueryVerifyTransferProofsRequest.recipient_pubkey": + return len(x.RecipientPubkey) != 0 + case "fairyring.zkp.QueryVerifyTransferProofsRequest.current_balance_commitment": + return len(x.CurrentBalanceCommitment) != 0 + case "fairyring.zkp.QueryVerifyTransferProofsRequest.current_balance_handle": + return len(x.CurrentBalanceHandle) != 0 default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryVerifyTransferProofsRequest")) @@ -3740,6 +3780,14 @@ func (x *fastReflection_QueryVerifyTransferProofsRequest) Clear(fd protoreflect. x.RangeProofData = nil case "fairyring.zkp.QueryVerifyTransferProofsRequest.validity_proof_data": x.ValidityProofData = nil + case "fairyring.zkp.QueryVerifyTransferProofsRequest.sender_pubkey": + x.SenderPubkey = nil + case "fairyring.zkp.QueryVerifyTransferProofsRequest.recipient_pubkey": + x.RecipientPubkey = nil + case "fairyring.zkp.QueryVerifyTransferProofsRequest.current_balance_commitment": + x.CurrentBalanceCommitment = nil + case "fairyring.zkp.QueryVerifyTransferProofsRequest.current_balance_handle": + x.CurrentBalanceHandle = nil default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryVerifyTransferProofsRequest")) @@ -3765,6 +3813,18 @@ func (x *fastReflection_QueryVerifyTransferProofsRequest) Get(descriptor protore case "fairyring.zkp.QueryVerifyTransferProofsRequest.validity_proof_data": value := x.ValidityProofData return protoreflect.ValueOfBytes(value) + case "fairyring.zkp.QueryVerifyTransferProofsRequest.sender_pubkey": + value := x.SenderPubkey + return protoreflect.ValueOfBytes(value) + case "fairyring.zkp.QueryVerifyTransferProofsRequest.recipient_pubkey": + value := x.RecipientPubkey + return protoreflect.ValueOfBytes(value) + case "fairyring.zkp.QueryVerifyTransferProofsRequest.current_balance_commitment": + value := x.CurrentBalanceCommitment + return protoreflect.ValueOfBytes(value) + case "fairyring.zkp.QueryVerifyTransferProofsRequest.current_balance_handle": + value := x.CurrentBalanceHandle + return protoreflect.ValueOfBytes(value) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryVerifyTransferProofsRequest")) @@ -3791,6 +3851,14 @@ func (x *fastReflection_QueryVerifyTransferProofsRequest) Set(fd protoreflect.Fi x.RangeProofData = value.Bytes() case "fairyring.zkp.QueryVerifyTransferProofsRequest.validity_proof_data": x.ValidityProofData = value.Bytes() + case "fairyring.zkp.QueryVerifyTransferProofsRequest.sender_pubkey": + x.SenderPubkey = value.Bytes() + case "fairyring.zkp.QueryVerifyTransferProofsRequest.recipient_pubkey": + x.RecipientPubkey = value.Bytes() + case "fairyring.zkp.QueryVerifyTransferProofsRequest.current_balance_commitment": + x.CurrentBalanceCommitment = value.Bytes() + case "fairyring.zkp.QueryVerifyTransferProofsRequest.current_balance_handle": + x.CurrentBalanceHandle = value.Bytes() default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryVerifyTransferProofsRequest")) @@ -3817,6 +3885,14 @@ func (x *fastReflection_QueryVerifyTransferProofsRequest) Mutable(fd protoreflec panic(fmt.Errorf("field range_proof_data of message fairyring.zkp.QueryVerifyTransferProofsRequest is not mutable")) case "fairyring.zkp.QueryVerifyTransferProofsRequest.validity_proof_data": panic(fmt.Errorf("field validity_proof_data of message fairyring.zkp.QueryVerifyTransferProofsRequest is not mutable")) + case "fairyring.zkp.QueryVerifyTransferProofsRequest.sender_pubkey": + panic(fmt.Errorf("field sender_pubkey of message fairyring.zkp.QueryVerifyTransferProofsRequest is not mutable")) + case "fairyring.zkp.QueryVerifyTransferProofsRequest.recipient_pubkey": + panic(fmt.Errorf("field recipient_pubkey of message fairyring.zkp.QueryVerifyTransferProofsRequest is not mutable")) + case "fairyring.zkp.QueryVerifyTransferProofsRequest.current_balance_commitment": + panic(fmt.Errorf("field current_balance_commitment of message fairyring.zkp.QueryVerifyTransferProofsRequest is not mutable")) + case "fairyring.zkp.QueryVerifyTransferProofsRequest.current_balance_handle": + panic(fmt.Errorf("field current_balance_handle of message fairyring.zkp.QueryVerifyTransferProofsRequest is not mutable")) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryVerifyTransferProofsRequest")) @@ -3836,6 +3912,14 @@ func (x *fastReflection_QueryVerifyTransferProofsRequest) NewField(fd protorefle return protoreflect.ValueOfBytes(nil) case "fairyring.zkp.QueryVerifyTransferProofsRequest.validity_proof_data": return protoreflect.ValueOfBytes(nil) + case "fairyring.zkp.QueryVerifyTransferProofsRequest.sender_pubkey": + return protoreflect.ValueOfBytes(nil) + case "fairyring.zkp.QueryVerifyTransferProofsRequest.recipient_pubkey": + return protoreflect.ValueOfBytes(nil) + case "fairyring.zkp.QueryVerifyTransferProofsRequest.current_balance_commitment": + return protoreflect.ValueOfBytes(nil) + case "fairyring.zkp.QueryVerifyTransferProofsRequest.current_balance_handle": + return protoreflect.ValueOfBytes(nil) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryVerifyTransferProofsRequest")) @@ -3917,6 +4001,22 @@ func (x *fastReflection_QueryVerifyTransferProofsRequest) ProtoMethods() *protoi if l > 0 { n += 1 + l + runtime.Sov(uint64(l)) } + l = len(x.SenderPubkey) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + l = len(x.RecipientPubkey) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + l = len(x.CurrentBalanceCommitment) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + l = len(x.CurrentBalanceHandle) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } if x.unknownFields != nil { n += len(x.unknownFields) } @@ -3946,6 +4046,34 @@ func (x *fastReflection_QueryVerifyTransferProofsRequest) ProtoMethods() *protoi i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } + if len(x.CurrentBalanceHandle) > 0 { + i -= len(x.CurrentBalanceHandle) + copy(dAtA[i:], x.CurrentBalanceHandle) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.CurrentBalanceHandle))) + i-- + dAtA[i] = 0x3a + } + if len(x.CurrentBalanceCommitment) > 0 { + i -= len(x.CurrentBalanceCommitment) + copy(dAtA[i:], x.CurrentBalanceCommitment) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.CurrentBalanceCommitment))) + i-- + dAtA[i] = 0x32 + } + if len(x.RecipientPubkey) > 0 { + i -= len(x.RecipientPubkey) + copy(dAtA[i:], x.RecipientPubkey) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.RecipientPubkey))) + i-- + dAtA[i] = 0x2a + } + if len(x.SenderPubkey) > 0 { + i -= len(x.SenderPubkey) + copy(dAtA[i:], x.SenderPubkey) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.SenderPubkey))) + i-- + dAtA[i] = 0x22 + } if len(x.ValidityProofData) > 0 { i -= len(x.ValidityProofData) copy(dAtA[i:], x.ValidityProofData) @@ -4118,6 +4246,142 @@ func (x *fastReflection_QueryVerifyTransferProofsRequest) ProtoMethods() *protoi x.ValidityProofData = []byte{} } iNdEx = postIndex + case 4: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field SenderPubkey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.SenderPubkey = append(x.SenderPubkey[:0], dAtA[iNdEx:postIndex]...) + if x.SenderPubkey == nil { + x.SenderPubkey = []byte{} + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field RecipientPubkey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.RecipientPubkey = append(x.RecipientPubkey[:0], dAtA[iNdEx:postIndex]...) + if x.RecipientPubkey == nil { + x.RecipientPubkey = []byte{} + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field CurrentBalanceCommitment", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.CurrentBalanceCommitment = append(x.CurrentBalanceCommitment[:0], dAtA[iNdEx:postIndex]...) + if x.CurrentBalanceCommitment == nil { + x.CurrentBalanceCommitment = []byte{} + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field CurrentBalanceHandle", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.CurrentBalanceHandle = append(x.CurrentBalanceHandle[:0], dAtA[iNdEx:postIndex]...) + if x.CurrentBalanceHandle == nil { + x.CurrentBalanceHandle = []byte{} + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := runtime.Skip(dAtA[iNdEx:]) @@ -4628,9 +4892,13 @@ func (x *fastReflection_QueryVerifyTransferProofsResponse) ProtoMethods() *proto } var ( - md_QueryVerifyWithdrawProofsRequest protoreflect.MessageDescriptor - fd_QueryVerifyWithdrawProofsRequest_equality_proof_data protoreflect.FieldDescriptor - fd_QueryVerifyWithdrawProofsRequest_range_proof_data protoreflect.FieldDescriptor + md_QueryVerifyWithdrawProofsRequest protoreflect.MessageDescriptor + fd_QueryVerifyWithdrawProofsRequest_equality_proof_data protoreflect.FieldDescriptor + fd_QueryVerifyWithdrawProofsRequest_range_proof_data protoreflect.FieldDescriptor + fd_QueryVerifyWithdrawProofsRequest_user_pubkey protoreflect.FieldDescriptor + fd_QueryVerifyWithdrawProofsRequest_ciphertext_commitment protoreflect.FieldDescriptor + fd_QueryVerifyWithdrawProofsRequest_ciphertext_handle protoreflect.FieldDescriptor + fd_QueryVerifyWithdrawProofsRequest_expected_nonce protoreflect.FieldDescriptor ) func init() { @@ -4638,6 +4906,10 @@ func init() { md_QueryVerifyWithdrawProofsRequest = File_fairyring_zkp_query_proto.Messages().ByName("QueryVerifyWithdrawProofsRequest") fd_QueryVerifyWithdrawProofsRequest_equality_proof_data = md_QueryVerifyWithdrawProofsRequest.Fields().ByName("equality_proof_data") fd_QueryVerifyWithdrawProofsRequest_range_proof_data = md_QueryVerifyWithdrawProofsRequest.Fields().ByName("range_proof_data") + fd_QueryVerifyWithdrawProofsRequest_user_pubkey = md_QueryVerifyWithdrawProofsRequest.Fields().ByName("user_pubkey") + fd_QueryVerifyWithdrawProofsRequest_ciphertext_commitment = md_QueryVerifyWithdrawProofsRequest.Fields().ByName("ciphertext_commitment") + fd_QueryVerifyWithdrawProofsRequest_ciphertext_handle = md_QueryVerifyWithdrawProofsRequest.Fields().ByName("ciphertext_handle") + fd_QueryVerifyWithdrawProofsRequest_expected_nonce = md_QueryVerifyWithdrawProofsRequest.Fields().ByName("expected_nonce") } var _ protoreflect.Message = (*fastReflection_QueryVerifyWithdrawProofsRequest)(nil) @@ -4717,6 +4989,30 @@ func (x *fastReflection_QueryVerifyWithdrawProofsRequest) Range(f func(protorefl return } } + if len(x.UserPubkey) != 0 { + value := protoreflect.ValueOfBytes(x.UserPubkey) + if !f(fd_QueryVerifyWithdrawProofsRequest_user_pubkey, value) { + return + } + } + if len(x.CiphertextCommitment) != 0 { + value := protoreflect.ValueOfBytes(x.CiphertextCommitment) + if !f(fd_QueryVerifyWithdrawProofsRequest_ciphertext_commitment, value) { + return + } + } + if len(x.CiphertextHandle) != 0 { + value := protoreflect.ValueOfBytes(x.CiphertextHandle) + if !f(fd_QueryVerifyWithdrawProofsRequest_ciphertext_handle, value) { + return + } + } + if x.ExpectedNonce != uint64(0) { + value := protoreflect.ValueOfUint64(x.ExpectedNonce) + if !f(fd_QueryVerifyWithdrawProofsRequest_expected_nonce, value) { + return + } + } } // Has reports whether a field is populated. @@ -4736,6 +5032,14 @@ func (x *fastReflection_QueryVerifyWithdrawProofsRequest) Has(fd protoreflect.Fi return len(x.EqualityProofData) != 0 case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.range_proof_data": return len(x.RangeProofData) != 0 + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.user_pubkey": + return len(x.UserPubkey) != 0 + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.ciphertext_commitment": + return len(x.CiphertextCommitment) != 0 + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.ciphertext_handle": + return len(x.CiphertextHandle) != 0 + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.expected_nonce": + return x.ExpectedNonce != uint64(0) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryVerifyWithdrawProofsRequest")) @@ -4756,6 +5060,14 @@ func (x *fastReflection_QueryVerifyWithdrawProofsRequest) Clear(fd protoreflect. x.EqualityProofData = nil case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.range_proof_data": x.RangeProofData = nil + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.user_pubkey": + x.UserPubkey = nil + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.ciphertext_commitment": + x.CiphertextCommitment = nil + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.ciphertext_handle": + x.CiphertextHandle = nil + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.expected_nonce": + x.ExpectedNonce = uint64(0) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryVerifyWithdrawProofsRequest")) @@ -4778,6 +5090,18 @@ func (x *fastReflection_QueryVerifyWithdrawProofsRequest) Get(descriptor protore case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.range_proof_data": value := x.RangeProofData return protoreflect.ValueOfBytes(value) + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.user_pubkey": + value := x.UserPubkey + return protoreflect.ValueOfBytes(value) + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.ciphertext_commitment": + value := x.CiphertextCommitment + return protoreflect.ValueOfBytes(value) + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.ciphertext_handle": + value := x.CiphertextHandle + return protoreflect.ValueOfBytes(value) + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.expected_nonce": + value := x.ExpectedNonce + return protoreflect.ValueOfUint64(value) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryVerifyWithdrawProofsRequest")) @@ -4802,6 +5126,14 @@ func (x *fastReflection_QueryVerifyWithdrawProofsRequest) Set(fd protoreflect.Fi x.EqualityProofData = value.Bytes() case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.range_proof_data": x.RangeProofData = value.Bytes() + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.user_pubkey": + x.UserPubkey = value.Bytes() + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.ciphertext_commitment": + x.CiphertextCommitment = value.Bytes() + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.ciphertext_handle": + x.CiphertextHandle = value.Bytes() + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.expected_nonce": + x.ExpectedNonce = value.Uint() default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryVerifyWithdrawProofsRequest")) @@ -4826,6 +5158,14 @@ func (x *fastReflection_QueryVerifyWithdrawProofsRequest) Mutable(fd protoreflec panic(fmt.Errorf("field equality_proof_data of message fairyring.zkp.QueryVerifyWithdrawProofsRequest is not mutable")) case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.range_proof_data": panic(fmt.Errorf("field range_proof_data of message fairyring.zkp.QueryVerifyWithdrawProofsRequest is not mutable")) + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.user_pubkey": + panic(fmt.Errorf("field user_pubkey of message fairyring.zkp.QueryVerifyWithdrawProofsRequest is not mutable")) + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.ciphertext_commitment": + panic(fmt.Errorf("field ciphertext_commitment of message fairyring.zkp.QueryVerifyWithdrawProofsRequest is not mutable")) + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.ciphertext_handle": + panic(fmt.Errorf("field ciphertext_handle of message fairyring.zkp.QueryVerifyWithdrawProofsRequest is not mutable")) + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.expected_nonce": + panic(fmt.Errorf("field expected_nonce of message fairyring.zkp.QueryVerifyWithdrawProofsRequest is not mutable")) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryVerifyWithdrawProofsRequest")) @@ -4843,6 +5183,14 @@ func (x *fastReflection_QueryVerifyWithdrawProofsRequest) NewField(fd protorefle return protoreflect.ValueOfBytes(nil) case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.range_proof_data": return protoreflect.ValueOfBytes(nil) + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.user_pubkey": + return protoreflect.ValueOfBytes(nil) + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.ciphertext_commitment": + return protoreflect.ValueOfBytes(nil) + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.ciphertext_handle": + return protoreflect.ValueOfBytes(nil) + case "fairyring.zkp.QueryVerifyWithdrawProofsRequest.expected_nonce": + return protoreflect.ValueOfUint64(uint64(0)) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryVerifyWithdrawProofsRequest")) @@ -4920,6 +5268,21 @@ func (x *fastReflection_QueryVerifyWithdrawProofsRequest) ProtoMethods() *protoi if l > 0 { n += 1 + l + runtime.Sov(uint64(l)) } + l = len(x.UserPubkey) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + l = len(x.CiphertextCommitment) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + l = len(x.CiphertextHandle) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.ExpectedNonce != 0 { + n += 1 + runtime.Sov(uint64(x.ExpectedNonce)) + } if x.unknownFields != nil { n += len(x.unknownFields) } @@ -4949,6 +5312,32 @@ func (x *fastReflection_QueryVerifyWithdrawProofsRequest) ProtoMethods() *protoi i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } + if x.ExpectedNonce != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.ExpectedNonce)) + i-- + dAtA[i] = 0x30 + } + if len(x.CiphertextHandle) > 0 { + i -= len(x.CiphertextHandle) + copy(dAtA[i:], x.CiphertextHandle) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.CiphertextHandle))) + i-- + dAtA[i] = 0x2a + } + if len(x.CiphertextCommitment) > 0 { + i -= len(x.CiphertextCommitment) + copy(dAtA[i:], x.CiphertextCommitment) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.CiphertextCommitment))) + i-- + dAtA[i] = 0x22 + } + if len(x.UserPubkey) > 0 { + i -= len(x.UserPubkey) + copy(dAtA[i:], x.UserPubkey) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.UserPubkey))) + i-- + dAtA[i] = 0x1a + } if len(x.RangeProofData) > 0 { i -= len(x.RangeProofData) copy(dAtA[i:], x.RangeProofData) @@ -5080,6 +5469,127 @@ func (x *fastReflection_QueryVerifyWithdrawProofsRequest) ProtoMethods() *protoi x.RangeProofData = []byte{} } iNdEx = postIndex + case 3: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field UserPubkey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.UserPubkey = append(x.UserPubkey[:0], dAtA[iNdEx:postIndex]...) + if x.UserPubkey == nil { + x.UserPubkey = []byte{} + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field CiphertextCommitment", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.CiphertextCommitment = append(x.CiphertextCommitment[:0], dAtA[iNdEx:postIndex]...) + if x.CiphertextCommitment == nil { + x.CiphertextCommitment = []byte{} + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field CiphertextHandle", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.CiphertextHandle = append(x.CiphertextHandle[:0], dAtA[iNdEx:postIndex]...) + if x.CiphertextHandle == nil { + x.CiphertextHandle = []byte{} + } + iNdEx = postIndex + case 6: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ExpectedNonce", wireType) + } + x.ExpectedNonce = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + x.ExpectedNonce |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := runtime.Skip(dAtA[iNdEx:]) @@ -5923,15 +6433,20 @@ func (x *QueryVerifyEqualityProofResponse) GetError() string { } // QueryVerifyTransferProofsRequest is request type for the Query/VerifyTransferProofs RPC method. -// Contains all proofs needed for transfer verification: equality, range, and validity proofs +// Contains all proofs needed for transfer verification: equality, range, and validity proofs, +// plus binding data checked after ZK verification (pubkeys, current balance ciphertext). type QueryVerifyTransferProofsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - EqualityProofData []byte `protobuf:"bytes,1,opt,name=equality_proof_data,json=equalityProofData,proto3" json:"equality_proof_data,omitempty"` // Serialized CiphertextCommitmentEqualityProofData - RangeProofData []byte `protobuf:"bytes,2,opt,name=range_proof_data,json=rangeProofData,proto3" json:"range_proof_data,omitempty"` // Serialized BatchedRangeProofU128Data - ValidityProofData []byte `protobuf:"bytes,3,opt,name=validity_proof_data,json=validityProofData,proto3" json:"validity_proof_data,omitempty"` // Serialized BatchedGroupedCiphertext2HandlesValidityProofData + EqualityProofData []byte `protobuf:"bytes,1,opt,name=equality_proof_data,json=equalityProofData,proto3" json:"equality_proof_data,omitempty"` // Serialized CiphertextCommitmentEqualityProofData + RangeProofData []byte `protobuf:"bytes,2,opt,name=range_proof_data,json=rangeProofData,proto3" json:"range_proof_data,omitempty"` // Serialized BatchedRangeProofU128Data + ValidityProofData []byte `protobuf:"bytes,3,opt,name=validity_proof_data,json=validityProofData,proto3" json:"validity_proof_data,omitempty"` // Serialized BatchedGroupedCiphertext2HandlesValidityProofData + SenderPubkey []byte `protobuf:"bytes,4,opt,name=sender_pubkey,json=senderPubkey,proto3" json:"sender_pubkey,omitempty"` // 32 bytes, expected sender ElGamal pubkey + RecipientPubkey []byte `protobuf:"bytes,5,opt,name=recipient_pubkey,json=recipientPubkey,proto3" json:"recipient_pubkey,omitempty"` // 32 bytes, expected recipient ElGamal pubkey + CurrentBalanceCommitment []byte `protobuf:"bytes,6,opt,name=current_balance_commitment,json=currentBalanceCommitment,proto3" json:"current_balance_commitment,omitempty"` // c1 of encrypted available balance (32 bytes) + CurrentBalanceHandle []byte `protobuf:"bytes,7,opt,name=current_balance_handle,json=currentBalanceHandle,proto3" json:"current_balance_handle,omitempty"` // c2 of encrypted available balance (32 bytes) } func (x *QueryVerifyTransferProofsRequest) Reset() { @@ -5975,6 +6490,34 @@ func (x *QueryVerifyTransferProofsRequest) GetValidityProofData() []byte { return nil } +func (x *QueryVerifyTransferProofsRequest) GetSenderPubkey() []byte { + if x != nil { + return x.SenderPubkey + } + return nil +} + +func (x *QueryVerifyTransferProofsRequest) GetRecipientPubkey() []byte { + if x != nil { + return x.RecipientPubkey + } + return nil +} + +func (x *QueryVerifyTransferProofsRequest) GetCurrentBalanceCommitment() []byte { + if x != nil { + return x.CurrentBalanceCommitment + } + return nil +} + +func (x *QueryVerifyTransferProofsRequest) GetCurrentBalanceHandle() []byte { + if x != nil { + return x.CurrentBalanceHandle + } + return nil +} + // QueryVerifyTransferProofsResponse is response type for the Query/VerifyTransferProofs RPC method. type QueryVerifyTransferProofsResponse struct { state protoimpl.MessageState @@ -6020,14 +6563,18 @@ func (x *QueryVerifyTransferProofsResponse) GetError() string { } // QueryVerifyWithdrawProofsRequest is request type for the Query/VerifyWithdrawProofs RPC method. -// Contains all proofs needed for withdraw verification: equality and range proofs +// Contains withdraw proofs plus binding data (user pubkey, ciphertext, expected nonce). type QueryVerifyWithdrawProofsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - EqualityProofData []byte `protobuf:"bytes,1,opt,name=equality_proof_data,json=equalityProofData,proto3" json:"equality_proof_data,omitempty"` // Serialized CiphertextCommitmentEqualityProofData - RangeProofData []byte `protobuf:"bytes,2,opt,name=range_proof_data,json=rangeProofData,proto3" json:"range_proof_data,omitempty"` // Serialized BatchedRangeProofU64Data + EqualityProofData []byte `protobuf:"bytes,1,opt,name=equality_proof_data,json=equalityProofData,proto3" json:"equality_proof_data,omitempty"` // Serialized WithdrawCiphertextCommitmentEqualityProofData + RangeProofData []byte `protobuf:"bytes,2,opt,name=range_proof_data,json=rangeProofData,proto3" json:"range_proof_data,omitempty"` // Serialized WithdrawBatchedRangeProofU64Data + UserPubkey []byte `protobuf:"bytes,3,opt,name=user_pubkey,json=userPubkey,proto3" json:"user_pubkey,omitempty"` // 32 bytes, expected user ElGamal pubkey + CiphertextCommitment []byte `protobuf:"bytes,4,opt,name=ciphertext_commitment,json=ciphertextCommitment,proto3" json:"ciphertext_commitment,omitempty"` // c1 of encrypted available balance (32 bytes) + CiphertextHandle []byte `protobuf:"bytes,5,opt,name=ciphertext_handle,json=ciphertextHandle,proto3" json:"ciphertext_handle,omitempty"` // c2 of encrypted available balance (32 bytes) + ExpectedNonce uint64 `protobuf:"varint,6,opt,name=expected_nonce,json=expectedNonce,proto3" json:"expected_nonce,omitempty"` // must match nonces embedded in both proofs } func (x *QueryVerifyWithdrawProofsRequest) Reset() { @@ -6064,6 +6611,34 @@ func (x *QueryVerifyWithdrawProofsRequest) GetRangeProofData() []byte { return nil } +func (x *QueryVerifyWithdrawProofsRequest) GetUserPubkey() []byte { + if x != nil { + return x.UserPubkey + } + return nil +} + +func (x *QueryVerifyWithdrawProofsRequest) GetCiphertextCommitment() []byte { + if x != nil { + return x.CiphertextCommitment + } + return nil +} + +func (x *QueryVerifyWithdrawProofsRequest) GetCiphertextHandle() []byte { + if x != nil { + return x.CiphertextHandle + } + return nil +} + +func (x *QueryVerifyWithdrawProofsRequest) GetExpectedNonce() uint64 { + if x != nil { + return x.ExpectedNonce + } + return 0 +} + // QueryVerifyWithdrawProofsResponse is response type for the Query/VerifyWithdrawProofs RPC method. type QueryVerifyWithdrawProofsResponse struct { state protoimpl.MessageState @@ -6155,7 +6730,7 @@ var file_fairyring_zkp_query_proto_rawDesc = []byte{ 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xac, 0x01, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xf0, 0x02, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x70, @@ -6166,103 +6741,126 @@ var file_fairyring_zkp_query_proto_rawDesc = []byte{ 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x22, 0x4f, 0x0a, 0x21, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x7c, 0x0a, - 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, - 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, - 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, - 0x65, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x72, 0x61, 0x6e, - 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x22, 0x4f, 0x0a, 0x21, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, - 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x32, 0xb5, 0x08, 0x0a, - 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0xbc, 0x01, 0x0a, 0x18, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x12, 0x33, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, - 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, - 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, - 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x61, 0x6e, 0x67, - 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x3a, 0x01, 0x2a, 0x22, 0x2a, 0x2f, 0x66, 0x61, 0x69, 0x72, - 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, - 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0xbc, 0x01, 0x0a, 0x18, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, + 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x0d, + 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, + 0x79, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x70, + 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x72, 0x65, 0x63, + 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x3c, 0x0a, 0x1a, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x18, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x68, 0x61, + 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x14, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x22, 0x4f, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0xa6, 0x02, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x69, + 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x11, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, + 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, + 0x79, 0x12, 0x33, 0x0a, 0x15, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x5f, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x14, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, + 0x74, 0x65, 0x78, 0x74, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x10, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x48, 0x61, 0x6e, + 0x64, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, + 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x65, 0x78, 0x70, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x22, 0x4f, 0x0a, 0x21, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, + 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x32, 0xb5, 0x08, 0x0a, 0x05, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0xbc, 0x01, 0x0a, 0x18, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, + 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x33, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, - 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, + 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, + 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x3a, 0x01, 0x2a, 0x22, 0x2a, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x12, 0xa7, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2e, 0x2e, 0x66, - 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x66, - 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, - 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0xa7, - 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, - 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2e, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, - 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, + 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x12, 0xbc, 0x01, 0x0a, 0x18, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x12, 0x33, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, + 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, - 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, - 0x6b, 0x70, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x69, - 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0xab, 0x01, 0x0a, 0x14, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x73, 0x12, 0x2f, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, + 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x2f, 0x3a, 0x01, 0x2a, 0x22, 0x2a, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, + 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x72, + 0x6f, 0x6f, 0x66, 0x12, 0xa7, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2e, 0x2e, 0x66, 0x61, + 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x66, 0x61, + 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, + 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0xa7, 0x01, + 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2e, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, + 0x2a, 0x22, 0x24, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, + 0x70, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, + 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0xab, 0x01, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, + 0x12, 0x2f, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x30, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, - 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x01, 0x2a, 0x22, - 0x25, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0xab, 0x01, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, - 0x2f, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x01, 0x2a, 0x22, 0x25, + 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x70, + 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0xab, 0x01, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, + 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x2f, + 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, + 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x30, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, - 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x30, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, - 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x01, 0x2a, 0x22, 0x25, 0x2f, - 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x79, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, - 0x6f, 0x6f, 0x66, 0x73, 0x42, 0x94, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x61, 0x69, - 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x42, 0x0a, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, - 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0xa2, 0x02, 0x03, 0x46, 0x5a, 0x58, 0xaa, 0x02, - 0x0d, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x5a, 0x6b, 0x70, 0xca, 0x02, - 0x0d, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x5a, 0x6b, 0x70, 0xe2, 0x02, - 0x19, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x5a, 0x6b, 0x70, 0x5c, 0x47, - 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x46, 0x61, 0x69, - 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x5a, 0x6b, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x01, 0x2a, 0x22, 0x25, 0x2f, 0x66, + 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, + 0x6f, 0x66, 0x73, 0x42, 0x94, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x61, 0x69, 0x72, + 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x42, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, + 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, + 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0xa2, 0x02, 0x03, 0x46, 0x5a, 0x58, 0xaa, 0x02, 0x0d, + 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x5a, 0x6b, 0x70, 0xca, 0x02, 0x0d, + 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x5a, 0x6b, 0x70, 0xe2, 0x02, 0x19, + 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x5a, 0x6b, 0x70, 0x5c, 0x47, 0x50, + 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x46, 0x61, 0x69, 0x72, + 0x79, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x5a, 0x6b, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( diff --git a/go.mod b/go.mod index a89dc8a7..2f665b22 100644 --- a/go.mod +++ b/go.mod @@ -68,6 +68,7 @@ require ( github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/regen-network/cosmos-proto v0.3.1 // indirect github.com/stretchr/objx v0.5.2 // indirect ) diff --git a/go.sum b/go.sum index d59e634a..6f36c9e7 100644 --- a/go.sum +++ b/go.sum @@ -1026,6 +1026,8 @@ github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoG github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/regen-network/cosmos-proto v0.3.1 h1:rV7iM4SSFAagvy8RiyhiACbWEGotmqzywPxOvwMdxcg= +github.com/regen-network/cosmos-proto v0.3.1/go.mod h1:jO0sVX6a1B36nmE8C9xBFXpNwWejXC7QqCOnH3O0+YM= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= diff --git a/proto/fairyring/zkp/query.proto b/proto/fairyring/zkp/query.proto index 6ac3f53f..cc57b7d5 100644 --- a/proto/fairyring/zkp/query.proto +++ b/proto/fairyring/zkp/query.proto @@ -92,11 +92,16 @@ message QueryVerifyEqualityProofResponse { } // QueryVerifyTransferProofsRequest is request type for the Query/VerifyTransferProofs RPC method. -// Contains all proofs needed for transfer verification: equality, range, and validity proofs +// Contains all proofs needed for transfer verification: equality, range, and validity proofs, +// plus binding data checked after ZK verification (pubkeys, current balance ciphertext). message QueryVerifyTransferProofsRequest { bytes equality_proof_data = 1; // Serialized CiphertextCommitmentEqualityProofData bytes range_proof_data = 2; // Serialized BatchedRangeProofU128Data bytes validity_proof_data = 3; // Serialized BatchedGroupedCiphertext2HandlesValidityProofData + bytes sender_pubkey = 4; // 32 bytes, expected sender ElGamal pubkey + bytes recipient_pubkey = 5; // 32 bytes, expected recipient ElGamal pubkey + bytes current_balance_commitment = 6; // c1 of encrypted available balance (32 bytes) + bytes current_balance_handle = 7; // c2 of encrypted available balance (32 bytes) } // QueryVerifyTransferProofsResponse is response type for the Query/VerifyTransferProofs RPC method. @@ -106,10 +111,14 @@ message QueryVerifyTransferProofsResponse { } // QueryVerifyWithdrawProofsRequest is request type for the Query/VerifyWithdrawProofs RPC method. -// Contains all proofs needed for withdraw verification: equality and range proofs +// Contains withdraw proofs plus binding data (user pubkey, ciphertext, expected nonce). message QueryVerifyWithdrawProofsRequest { - bytes equality_proof_data = 1; // Serialized CiphertextCommitmentEqualityProofData - bytes range_proof_data = 2; // Serialized BatchedRangeProofU64Data + bytes equality_proof_data = 1; // Serialized WithdrawCiphertextCommitmentEqualityProofData + bytes range_proof_data = 2; // Serialized WithdrawBatchedRangeProofU64Data + bytes user_pubkey = 3; // 32 bytes, expected user ElGamal pubkey + bytes ciphertext_commitment = 4; // c1 of encrypted available balance (32 bytes) + bytes ciphertext_handle = 5; // c2 of encrypted available balance (32 bytes) + uint64 expected_nonce = 6; // must match nonces embedded in both proofs } // QueryVerifyWithdrawProofsResponse is response type for the Query/VerifyWithdrawProofs RPC method. diff --git a/wasmbinding/querier.go b/wasmbinding/querier.go index c081366b..23ff89a1 100644 --- a/wasmbinding/querier.go +++ b/wasmbinding/querier.go @@ -38,11 +38,31 @@ func CustomQuerier(zkpKeeper *zkpmodulekeeper.Keeper) func(ctx sdk.Context, requ if err != nil { return nil, err } + senderPK, err := base64.StdEncoding.DecodeString(query.VerifyTransferProofs.SenderPubkey) + if err != nil { + return nil, err + } + recipientPK, err := base64.StdEncoding.DecodeString(query.VerifyTransferProofs.RecipientPubkey) + if err != nil { + return nil, err + } + curC1, err := base64.StdEncoding.DecodeString(query.VerifyTransferProofs.CurrentBalanceCommitment) + if err != nil { + return nil, err + } + curC2, err := base64.StdEncoding.DecodeString(query.VerifyTransferProofs.CurrentBalanceHandle) + if err != nil { + return nil, err + } req := &zkpmoduletypes.QueryVerifyTransferProofsRequest{ - EqualityProofData: equalityData, - RangeProofData: rangeData, - ValidityProofData: validityData, + EqualityProofData: equalityData, + RangeProofData: rangeData, + ValidityProofData: validityData, + SenderPubkey: senderPK, + RecipientPubkey: recipientPK, + CurrentBalanceCommitment: curC1, + CurrentBalanceHandle: curC2, } resp, err := zkpKeeper.VerifyTransferProofs(ctx, req) @@ -69,10 +89,26 @@ func CustomQuerier(zkpKeeper *zkpmodulekeeper.Keeper) func(ctx sdk.Context, requ if err != nil { return nil, err } + userPK, err := base64.StdEncoding.DecodeString(query.VerifyWithdrawProofs.UserPubkey) + if err != nil { + return nil, err + } + ctC1, err := base64.StdEncoding.DecodeString(query.VerifyWithdrawProofs.CiphertextCommitment) + if err != nil { + return nil, err + } + ctC2, err := base64.StdEncoding.DecodeString(query.VerifyWithdrawProofs.CiphertextHandle) + if err != nil { + return nil, err + } req := &zkpmoduletypes.QueryVerifyWithdrawProofsRequest{ - EqualityProofData: equalityData, - RangeProofData: rangeData, + EqualityProofData: equalityData, + RangeProofData: rangeData, + UserPubkey: userPK, + CiphertextCommitment: ctC1, + CiphertextHandle: ctC2, + ExpectedNonce: query.VerifyWithdrawProofs.ExpectedNonce, } resp, err := zkpKeeper.VerifyWithdrawProofs(ctx, req) @@ -95,15 +131,23 @@ func CustomQuerier(zkpKeeper *zkpmodulekeeper.Keeper) func(ctx sdk.Context, requ // TransferProofsQuery represents the CosmWasm query structure for transfer proofs // CosmWasm Binary types are serialized as base64 strings in JSON type TransferProofsQuery struct { - EqualityProofData string `json:"equality_proof_data"` - RangeProofData string `json:"range_proof_data"` - ValidityProofData string `json:"validity_proof_data"` + EqualityProofData string `json:"equality_proof_data"` + RangeProofData string `json:"range_proof_data"` + ValidityProofData string `json:"validity_proof_data"` + SenderPubkey string `json:"sender_pubkey"` + RecipientPubkey string `json:"recipient_pubkey"` + CurrentBalanceCommitment string `json:"current_balance_commitment"` + CurrentBalanceHandle string `json:"current_balance_handle"` } // WithdrawProofsQuery represents the CosmWasm query structure for withdraw proofs // CosmWasm Binary types are serialized as base64 strings in JSON type WithdrawProofsQuery struct { - EqualityProofData string `json:"equality_proof_data"` - RangeProofData string `json:"range_proof_data"` + EqualityProofData string `json:"equality_proof_data"` + RangeProofData string `json:"range_proof_data"` + UserPubkey string `json:"user_pubkey"` + CiphertextCommitment string `json:"ciphertext_commitment"` + CiphertextHandle string `json:"ciphertext_handle"` + ExpectedNonce uint64 `json:"expected_nonce"` } diff --git a/x/zkp/keeper/query_proof_verification.go b/x/zkp/keeper/query_proof_verification.go index 41df03f0..6977e644 100644 --- a/x/zkp/keeper/query_proof_verification.go +++ b/x/zkp/keeper/query_proof_verification.go @@ -6,7 +6,9 @@ import ( "github.com/Fairblock/fairyring/x/zkp/types" "github.com/Fairblock/fairyring/x/zkp/verification/commitment" rangeproof "github.com/Fairblock/fairyring/x/zkp/verification/range" + "github.com/Fairblock/fairyring/x/zkp/verification/transferctx" "github.com/Fairblock/fairyring/x/zkp/verification/validity" + "github.com/Fairblock/fairyring/x/zkp/verification/withdrawctx" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) @@ -263,7 +265,7 @@ func (k Keeper) VerifyTransferProofs(goCtx context.Context, req *types.QueryVeri return nil, status.Error(codes.InvalidArgument, "invalid request") } - // Verify equality proof + // Deserialize equality proof if len(req.EqualityProofData) < 320 { return &types.QueryVerifyTransferProofsResponse{ Valid: false, @@ -295,15 +297,7 @@ func (k Keeper) VerifyTransferProofs(goCtx context.Context, req *types.QueryVeri offset += 32 copy(equalityProofData.Proof.Zr[:], req.EqualityProofData[offset:offset+32]) - err := commitment.VerifyEqualityProof(&equalityProofData) - if err != nil { - return &types.QueryVerifyTransferProofsResponse{ - Valid: false, - Error: "equality proof verification failed: " + err.Error(), - }, nil - } - - // Verify range proof + // Deserialize range proof if len(req.RangeProofData) < 8*32+8+736 { return &types.QueryVerifyTransferProofsResponse{ Valid: false, @@ -347,15 +341,7 @@ func (k Keeper) VerifyTransferProofs(goCtx context.Context, req *types.QueryVeri } copy(rangeProofData.Proof[:], req.RangeProofData[offset:offset+736]) - err = rangeproof.VerifyTransferRange(&rangeProofData) - if err != nil { - return &types.QueryVerifyTransferProofsResponse{ - Valid: false, - Error: "range proof verification failed: " + err.Error(), - }, nil - } - - // Verify validity proof + // Deserialize validity proof if len(req.ValidityProofData) < 416 { return &types.QueryVerifyTransferProofsResponse{ Valid: false, @@ -377,6 +363,46 @@ func (k Keeper) VerifyTransferProofs(goCtx context.Context, req *types.QueryVeri offset += 96 copy(validityProofData.Proof.Bytes[:], req.ValidityProofData[offset:offset+160]) + if len(req.SenderPubkey) != 32 || len(req.RecipientPubkey) != 32 || + len(req.CurrentBalanceCommitment) != 32 || len(req.CurrentBalanceHandle) != 32 { + return &types.QueryVerifyTransferProofsResponse{ + Valid: false, + Error: "transfer binding verification failed: missing or invalid pubkey/balance fields (expected 32-byte values)", + }, nil + } + + err := transferctx.VerifyBindings( + &equalityProofData, + &rangeProofData, + &validityProofData, + req.CurrentBalanceCommitment, + req.CurrentBalanceHandle, + req.SenderPubkey, + req.RecipientPubkey, + ) + if err != nil { + return &types.QueryVerifyTransferProofsResponse{ + Valid: false, + Error: "transfer binding verification failed: " + err.Error(), + }, nil + } + + err = commitment.VerifyEqualityProof(&equalityProofData) + if err != nil { + return &types.QueryVerifyTransferProofsResponse{ + Valid: false, + Error: "equality proof verification failed: " + err.Error(), + }, nil + } + + err = rangeproof.VerifyTransferRange(&rangeProofData) + if err != nil { + return &types.QueryVerifyTransferProofsResponse{ + Valid: false, + Error: "range proof verification failed: " + err.Error(), + }, nil + } + err = validity.VerifyValidityProof(&validityProofData) if err != nil { return &types.QueryVerifyTransferProofsResponse{ @@ -397,7 +423,7 @@ func (k Keeper) VerifyWithdrawProofs(goCtx context.Context, req *types.QueryVeri return nil, status.Error(codes.InvalidArgument, "invalid request") } - // Verify equality proof + // Deserialize equality proof if len(req.EqualityProofData) < 328 { return &types.QueryVerifyWithdrawProofsResponse{ Valid: false, @@ -430,15 +456,7 @@ func (k Keeper) VerifyWithdrawProofs(goCtx context.Context, req *types.QueryVeri offset += 32 copy(equalityProofData.Proof.Zr[:], req.EqualityProofData[offset:offset+32]) - err := commitment.VerifyWithdrawEqualityProof(&equalityProofData) - if err != nil { - return &types.QueryVerifyWithdrawProofsResponse{ - Valid: false, - Error: "equality proof verification failed: " + err.Error(), - }, nil - } - - // Verify range proof + // Deserialize range proof if len(req.RangeProofData) < 8*32+8+8+672 { return &types.QueryVerifyWithdrawProofsResponse{ Valid: false, @@ -488,6 +506,36 @@ func (k Keeper) VerifyWithdrawProofs(goCtx context.Context, req *types.QueryVeri } copy(rangeProofData.Proof[:], req.RangeProofData[offset:offset+672]) + if len(req.UserPubkey) != 32 || len(req.CiphertextCommitment) != 32 || len(req.CiphertextHandle) != 32 { + return &types.QueryVerifyWithdrawProofsResponse{ + Valid: false, + Error: "withdraw binding verification failed: missing or invalid pubkey/ciphertext fields (expected 32-byte values)", + }, nil + } + + err := withdrawctx.VerifyBindings( + &equalityProofData, + &rangeProofData, + req.UserPubkey, + req.CiphertextCommitment, + req.CiphertextHandle, + req.ExpectedNonce, + ) + if err != nil { + return &types.QueryVerifyWithdrawProofsResponse{ + Valid: false, + Error: "withdraw binding verification failed: " + err.Error(), + }, nil + } + + err = commitment.VerifyWithdrawEqualityProof(&equalityProofData) + if err != nil { + return &types.QueryVerifyWithdrawProofsResponse{ + Valid: false, + Error: "equality proof verification failed: " + err.Error(), + }, nil + } + err = rangeproof.VerifyWithdrawRangeWithNonce(&rangeProofData) if err != nil { return &types.QueryVerifyWithdrawProofsResponse{ diff --git a/x/zkp/types/query.pb.go b/x/zkp/types/query.pb.go index 3239083e..be5f9b6f 100644 --- a/x/zkp/types/query.pb.go +++ b/x/zkp/types/query.pb.go @@ -423,11 +423,16 @@ func (m *QueryVerifyEqualityProofResponse) GetError() string { } // QueryVerifyTransferProofsRequest is request type for the Query/VerifyTransferProofs RPC method. -// Contains all proofs needed for transfer verification: equality, range, and validity proofs +// Contains all proofs needed for transfer verification: equality, range, and validity proofs, +// plus binding data checked after ZK verification (pubkeys, current balance ciphertext). type QueryVerifyTransferProofsRequest struct { - EqualityProofData []byte `protobuf:"bytes,1,opt,name=equality_proof_data,json=equalityProofData,proto3" json:"equality_proof_data,omitempty"` - RangeProofData []byte `protobuf:"bytes,2,opt,name=range_proof_data,json=rangeProofData,proto3" json:"range_proof_data,omitempty"` - ValidityProofData []byte `protobuf:"bytes,3,opt,name=validity_proof_data,json=validityProofData,proto3" json:"validity_proof_data,omitempty"` + EqualityProofData []byte `protobuf:"bytes,1,opt,name=equality_proof_data,json=equalityProofData,proto3" json:"equality_proof_data,omitempty"` + RangeProofData []byte `protobuf:"bytes,2,opt,name=range_proof_data,json=rangeProofData,proto3" json:"range_proof_data,omitempty"` + ValidityProofData []byte `protobuf:"bytes,3,opt,name=validity_proof_data,json=validityProofData,proto3" json:"validity_proof_data,omitempty"` + SenderPubkey []byte `protobuf:"bytes,4,opt,name=sender_pubkey,json=senderPubkey,proto3" json:"sender_pubkey,omitempty"` + RecipientPubkey []byte `protobuf:"bytes,5,opt,name=recipient_pubkey,json=recipientPubkey,proto3" json:"recipient_pubkey,omitempty"` + CurrentBalanceCommitment []byte `protobuf:"bytes,6,opt,name=current_balance_commitment,json=currentBalanceCommitment,proto3" json:"current_balance_commitment,omitempty"` + CurrentBalanceHandle []byte `protobuf:"bytes,7,opt,name=current_balance_handle,json=currentBalanceHandle,proto3" json:"current_balance_handle,omitempty"` } func (m *QueryVerifyTransferProofsRequest) Reset() { *m = QueryVerifyTransferProofsRequest{} } @@ -484,6 +489,34 @@ func (m *QueryVerifyTransferProofsRequest) GetValidityProofData() []byte { return nil } +func (m *QueryVerifyTransferProofsRequest) GetSenderPubkey() []byte { + if m != nil { + return m.SenderPubkey + } + return nil +} + +func (m *QueryVerifyTransferProofsRequest) GetRecipientPubkey() []byte { + if m != nil { + return m.RecipientPubkey + } + return nil +} + +func (m *QueryVerifyTransferProofsRequest) GetCurrentBalanceCommitment() []byte { + if m != nil { + return m.CurrentBalanceCommitment + } + return nil +} + +func (m *QueryVerifyTransferProofsRequest) GetCurrentBalanceHandle() []byte { + if m != nil { + return m.CurrentBalanceHandle + } + return nil +} + // QueryVerifyTransferProofsResponse is response type for the Query/VerifyTransferProofs RPC method. type QueryVerifyTransferProofsResponse struct { Valid bool `protobuf:"varint,1,opt,name=valid,proto3" json:"valid,omitempty"` @@ -538,10 +571,14 @@ func (m *QueryVerifyTransferProofsResponse) GetError() string { } // QueryVerifyWithdrawProofsRequest is request type for the Query/VerifyWithdrawProofs RPC method. -// Contains all proofs needed for withdraw verification: equality and range proofs +// Contains withdraw proofs plus binding data (user pubkey, ciphertext, expected nonce). type QueryVerifyWithdrawProofsRequest struct { - EqualityProofData []byte `protobuf:"bytes,1,opt,name=equality_proof_data,json=equalityProofData,proto3" json:"equality_proof_data,omitempty"` - RangeProofData []byte `protobuf:"bytes,2,opt,name=range_proof_data,json=rangeProofData,proto3" json:"range_proof_data,omitempty"` + EqualityProofData []byte `protobuf:"bytes,1,opt,name=equality_proof_data,json=equalityProofData,proto3" json:"equality_proof_data,omitempty"` + RangeProofData []byte `protobuf:"bytes,2,opt,name=range_proof_data,json=rangeProofData,proto3" json:"range_proof_data,omitempty"` + UserPubkey []byte `protobuf:"bytes,3,opt,name=user_pubkey,json=userPubkey,proto3" json:"user_pubkey,omitempty"` + CiphertextCommitment []byte `protobuf:"bytes,4,opt,name=ciphertext_commitment,json=ciphertextCommitment,proto3" json:"ciphertext_commitment,omitempty"` + CiphertextHandle []byte `protobuf:"bytes,5,opt,name=ciphertext_handle,json=ciphertextHandle,proto3" json:"ciphertext_handle,omitempty"` + ExpectedNonce uint64 `protobuf:"varint,6,opt,name=expected_nonce,json=expectedNonce,proto3" json:"expected_nonce,omitempty"` } func (m *QueryVerifyWithdrawProofsRequest) Reset() { *m = QueryVerifyWithdrawProofsRequest{} } @@ -591,6 +628,34 @@ func (m *QueryVerifyWithdrawProofsRequest) GetRangeProofData() []byte { return nil } +func (m *QueryVerifyWithdrawProofsRequest) GetUserPubkey() []byte { + if m != nil { + return m.UserPubkey + } + return nil +} + +func (m *QueryVerifyWithdrawProofsRequest) GetCiphertextCommitment() []byte { + if m != nil { + return m.CiphertextCommitment + } + return nil +} + +func (m *QueryVerifyWithdrawProofsRequest) GetCiphertextHandle() []byte { + if m != nil { + return m.CiphertextHandle + } + return nil +} + +func (m *QueryVerifyWithdrawProofsRequest) GetExpectedNonce() uint64 { + if m != nil { + return m.ExpectedNonce + } + return 0 +} + // QueryVerifyWithdrawProofsResponse is response type for the Query/VerifyWithdrawProofs RPC method. type QueryVerifyWithdrawProofsResponse struct { Valid bool `protobuf:"varint,1,opt,name=valid,proto3" json:"valid,omitempty"` @@ -662,45 +727,55 @@ func init() { func init() { proto.RegisterFile("fairyring/zkp/query.proto", fileDescriptor_d7ffffa30d808249) } var fileDescriptor_d7ffffa30d808249 = []byte{ - // 600 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x96, 0x4f, 0x6f, 0xd3, 0x30, - 0x18, 0xc6, 0xeb, 0xa2, 0xa1, 0xcd, 0x02, 0xc4, 0xd2, 0x1e, 0x4a, 0x04, 0xa1, 0x54, 0x9b, 0x54, - 0x7a, 0x88, 0x27, 0x06, 0x17, 0x4e, 0x08, 0x6d, 0x1c, 0xf9, 0x13, 0xd0, 0x90, 0xb8, 0x54, 0xee, - 0xea, 0x66, 0x56, 0xbb, 0x38, 0x75, 0xdc, 0x8e, 0x4c, 0x9c, 0xf8, 0x04, 0x48, 0x7c, 0x08, 0x0e, - 0x70, 0xe5, 0xc6, 0x07, 0xe0, 0x38, 0x89, 0x0b, 0x47, 0xd4, 0xf2, 0x41, 0x50, 0x9c, 0xb4, 0xc4, - 0x6d, 0x92, 0xa6, 0xad, 0xb4, 0x4b, 0x15, 0x3b, 0xef, 0xfb, 0xf8, 0xf7, 0xbe, 0xee, 0xfb, 0x28, - 0xf0, 0x56, 0x07, 0x53, 0xee, 0x73, 0xea, 0xd8, 0xe8, 0xbc, 0xeb, 0xa2, 0xfe, 0x80, 0x70, 0xdf, - 0x74, 0x39, 0x13, 0x4c, 0xbb, 0x3e, 0x7d, 0x65, 0x9e, 0x77, 0x5d, 0x7d, 0x1b, 0x9f, 0x52, 0x87, - 0x21, 0xf9, 0x1b, 0x46, 0xe8, 0x65, 0x9b, 0xd9, 0x4c, 0x3e, 0xa2, 0xe0, 0x29, 0xda, 0xbd, 0x6d, - 0x33, 0x66, 0xf7, 0x08, 0xc2, 0x2e, 0x45, 0xd8, 0x71, 0x98, 0xc0, 0x82, 0x32, 0xc7, 0x0b, 0xdf, - 0xd6, 0x0e, 0xe1, 0xce, 0xab, 0xe0, 0x90, 0x23, 0xc2, 0x69, 0xc7, 0x7f, 0x4b, 0xc5, 0x49, 0x9b, - 0xe3, 0x33, 0x0b, 0x3b, 0x36, 0x79, 0xc9, 0x19, 0xeb, 0x58, 0xa4, 0x3f, 0x20, 0x9e, 0xd0, 0xee, - 0x40, 0xe8, 0x06, 0xeb, 0x66, 0x1b, 0x0b, 0x5c, 0x01, 0x55, 0x50, 0xbf, 0x66, 0x6d, 0xc9, 0x9d, - 0x03, 0x2c, 0x70, 0xed, 0x35, 0xdc, 0x5d, 0x20, 0xe3, 0xb9, 0xcc, 0xf1, 0x88, 0x56, 0x86, 0x1b, - 0x43, 0xdc, 0xa3, 0x6d, 0x29, 0xb1, 0x69, 0x85, 0x8b, 0x60, 0x97, 0x70, 0xce, 0x78, 0xa5, 0x58, - 0x05, 0xf5, 0x2d, 0x2b, 0x5c, 0xcc, 0xb0, 0xbd, 0xe1, 0xd8, 0xf1, 0x3a, 0x84, 0xaf, 0xc9, 0x96, - 0x24, 0xb3, 0x02, 0xdb, 0x13, 0x78, 0x37, 0x26, 0x7a, 0x14, 0x44, 0x52, 0xe1, 0x2f, 0x83, 0xf5, - 0x1c, 0x56, 0xd3, 0x15, 0xd6, 0x26, 0x3a, 0xec, 0x0f, 0x70, 0x6f, 0x2d, 0xa2, 0x19, 0x85, 0x15, - 0x88, 0xbe, 0x01, 0x45, 0x70, 0xd2, 0x79, 0x29, 0xe8, 0x4d, 0x98, 0x4c, 0x58, 0x22, 0xd1, 0x49, - 0xcd, 0x39, 0xb8, 0x6d, 0x12, 0x87, 0x08, 0x20, 0xb5, 0x3a, 0xbc, 0xc9, 0x83, 0xab, 0x8b, 0x07, - 0x17, 0x65, 0xf0, 0x0d, 0x3e, 0xbd, 0x52, 0x19, 0x69, 0xc2, 0xd2, 0x30, 0xea, 0x6a, 0x3c, 0xf8, - 0x4a, 0xa8, 0x3c, 0x8c, 0x37, 0x5c, 0x96, 0xff, 0x02, 0xde, 0xcb, 0xa0, 0x5d, 0xa1, 0xfe, 0x0f, - 0x4a, 0xf9, 0x93, 0xa1, 0xb8, 0xa4, 0xf2, 0x67, 0xca, 0x99, 0x3d, 0x7d, 0xf9, 0x72, 0x1e, 0x7c, - 0xdf, 0x84, 0x1b, 0x52, 0x51, 0xfb, 0x01, 0x60, 0x25, 0x6d, 0xd2, 0xb5, 0x7d, 0x53, 0x31, 0x2a, - 0x33, 0x8f, 0xbd, 0xe8, 0x0f, 0x97, 0x4b, 0x0a, 0xe9, 0x6b, 0x8f, 0x3e, 0xfe, 0xfa, 0xfb, 0xb9, - 0x88, 0x1e, 0x83, 0x46, 0xad, 0x81, 0x54, 0xe7, 0x1c, 0xca, 0xdc, 0xe6, 0x59, 0x94, 0xdc, 0x8c, - 0x35, 0x2d, 0x86, 0x3f, 0x6f, 0x06, 0x59, 0xf8, 0xa9, 0x0e, 0x94, 0x85, 0x9f, 0xee, 0x37, 0x39, - 0xf0, 0x45, 0x94, 0xac, 0xe0, 0x7f, 0x01, 0xb0, 0x94, 0x60, 0x1a, 0x9a, 0x99, 0x0e, 0x91, 0xe4, - 0x4f, 0x3a, 0xca, 0x1d, 0x1f, 0xf1, 0x22, 0xc9, 0x7b, 0x3f, 0xe0, 0xdd, 0x49, 0xe6, 0x55, 0xe7, - 0x2d, 0x46, 0xaa, 0x98, 0x49, 0x16, 0x69, 0x92, 0x6f, 0x65, 0x91, 0x26, 0xba, 0x54, 0x0e, 0x52, - 0x75, 0xe8, 0xb4, 0xaf, 0x00, 0x96, 0x93, 0xe6, 0x5e, 0x43, 0x8b, 0x6f, 0x56, 0x19, 0x68, 0x7d, - 0x2f, 0x7f, 0x42, 0x04, 0xbb, 0x27, 0x61, 0x1b, 0x01, 0xec, 0xee, 0x82, 0xbf, 0x81, 0x1b, 0x42, - 0xfd, 0xa7, 0x55, 0xc7, 0x3a, 0x8b, 0x36, 0xd1, 0x7e, 0xb2, 0x68, 0x93, 0x1d, 0x23, 0x07, 0xed, - 0x74, 0xe6, 0x42, 0xda, 0xa7, 0x07, 0x3f, 0x47, 0x06, 0xb8, 0x18, 0x19, 0xe0, 0xcf, 0xc8, 0x00, - 0x9f, 0xc6, 0x46, 0xe1, 0x62, 0x6c, 0x14, 0x7e, 0x8f, 0x8d, 0xc2, 0xbb, 0x86, 0x4d, 0xc5, 0xc9, - 0xa0, 0x65, 0x1e, 0xb3, 0x53, 0xf4, 0x0c, 0x53, 0xde, 0xea, 0xb1, 0xe3, 0x6e, 0x4c, 0xf4, 0xbd, - 0x94, 0x15, 0xbe, 0x4b, 0xbc, 0xd6, 0x55, 0xf9, 0xbd, 0xb2, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, - 0x51, 0xfd, 0x4d, 0x4f, 0x22, 0x09, 0x00, 0x00, + // 768 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x96, 0xc1, 0x4e, 0x13, 0x41, + 0x18, 0xc7, 0xd9, 0x0a, 0x08, 0x23, 0x20, 0x2c, 0xd5, 0xac, 0x8d, 0x16, 0xac, 0x90, 0x40, 0x4d, + 0x76, 0x89, 0xe0, 0xc5, 0x78, 0x30, 0x08, 0xc6, 0x13, 0x62, 0x35, 0x98, 0x78, 0xd9, 0x4c, 0xb7, + 0x5f, 0xb7, 0x93, 0xb6, 0x33, 0xcb, 0xec, 0x6c, 0xa1, 0x1c, 0x7d, 0x02, 0x13, 0xdf, 0x41, 0x0f, + 0x9e, 0xbd, 0xf9, 0x00, 0x1e, 0x49, 0xbc, 0x78, 0x34, 0xe0, 0x03, 0xf8, 0x08, 0x66, 0x67, 0xb7, + 0x65, 0xb7, 0x6c, 0x97, 0x42, 0x13, 0x2f, 0xa4, 0xfb, 0xcd, 0xff, 0xfb, 0xfa, 0xcb, 0xff, 0x63, + 0xff, 0x53, 0x74, 0xa7, 0x8a, 0x09, 0x6f, 0x73, 0x42, 0x6d, 0xe3, 0xa8, 0xee, 0x18, 0xfb, 0x1e, + 0xf0, 0xb6, 0xee, 0x70, 0x26, 0x98, 0x3a, 0xdd, 0x3d, 0xd2, 0x8f, 0xea, 0x4e, 0x6e, 0x0e, 0x37, + 0x09, 0x65, 0x86, 0xfc, 0x1b, 0x28, 0x72, 0x59, 0x9b, 0xd9, 0x4c, 0x7e, 0x34, 0xfc, 0x4f, 0x61, + 0xf5, 0xae, 0xcd, 0x98, 0xdd, 0x00, 0x03, 0x3b, 0xc4, 0xc0, 0x94, 0x32, 0x81, 0x05, 0x61, 0xd4, + 0x0d, 0x4e, 0x0b, 0xdb, 0x68, 0xe9, 0xb5, 0xff, 0x25, 0x7b, 0xc0, 0x49, 0xb5, 0xfd, 0x8e, 0x88, + 0x5a, 0x85, 0xe3, 0x83, 0x12, 0xa6, 0x36, 0xec, 0x72, 0xc6, 0xaa, 0x25, 0xd8, 0xf7, 0xc0, 0x15, + 0xea, 0x3d, 0x84, 0x1c, 0xff, 0xd9, 0xac, 0x60, 0x81, 0x35, 0x65, 0x51, 0x59, 0x99, 0x2a, 0x4d, + 0xca, 0xca, 0x16, 0x16, 0xb8, 0xf0, 0x06, 0x2d, 0x5f, 0x30, 0xc6, 0x75, 0x18, 0x75, 0x41, 0xcd, + 0xa2, 0xb1, 0x16, 0x6e, 0x90, 0x8a, 0x1c, 0x31, 0x51, 0x0a, 0x1e, 0xfc, 0x2a, 0x70, 0xce, 0xb8, + 0x96, 0x59, 0x54, 0x56, 0x26, 0x4b, 0xc1, 0x43, 0x0f, 0xdb, 0x5b, 0x8e, 0xa9, 0x5b, 0x05, 0x3e, + 0x24, 0x5b, 0xd2, 0x98, 0x2b, 0xb0, 0x3d, 0x43, 0x0b, 0x91, 0xa1, 0x7b, 0xbe, 0x92, 0x88, 0xf6, + 0x65, 0xb0, 0x76, 0xd0, 0x62, 0xff, 0x09, 0x43, 0x13, 0x6d, 0xef, 0x7b, 0xb8, 0x31, 0x14, 0x51, + 0xcf, 0x84, 0x2b, 0x10, 0xfd, 0xcd, 0xc4, 0x06, 0x76, 0x9c, 0x97, 0x03, 0xdd, 0x0e, 0x93, 0x8e, + 0xe6, 0x21, 0xfc, 0x26, 0xf3, 0x1c, 0xdc, 0x1c, 0x44, 0x21, 0x7c, 0x48, 0x75, 0x05, 0xcd, 0x72, + 0x7f, 0x75, 0x51, 0x71, 0x46, 0x8a, 0x67, 0x78, 0x77, 0xa5, 0x52, 0xa9, 0xa3, 0xf9, 0x56, 0xe8, + 0x6a, 0x54, 0x7c, 0x2d, 0x98, 0xdc, 0x8a, 0x1a, 0x2e, 0xf5, 0x0f, 0xd0, 0xb4, 0x0b, 0xb4, 0x02, + 0xdc, 0x74, 0xbc, 0x72, 0x1d, 0xda, 0xda, 0xa8, 0x54, 0x4e, 0x05, 0xc5, 0x5d, 0x59, 0x53, 0x57, + 0xd1, 0x2c, 0x07, 0x8b, 0x38, 0x04, 0xa8, 0xe8, 0xe8, 0xc6, 0xa4, 0xee, 0x66, 0xb7, 0x1e, 0x4a, + 0x9f, 0xa2, 0x9c, 0xe5, 0x71, 0xee, 0x0b, 0xcb, 0xb8, 0x81, 0xa9, 0x05, 0xa6, 0xc5, 0x9a, 0x4d, + 0x22, 0x9a, 0x40, 0x85, 0x36, 0x2e, 0x9b, 0xb4, 0x50, 0xb1, 0x19, 0x08, 0x9e, 0x77, 0xcf, 0xd5, + 0x0d, 0x74, 0xbb, 0xb7, 0xbb, 0x86, 0x69, 0xa5, 0x01, 0xda, 0x75, 0xd9, 0x99, 0x8d, 0x77, 0xbe, + 0x94, 0x67, 0x85, 0x57, 0xe8, 0x7e, 0x8a, 0xe3, 0x57, 0xd8, 0xe1, 0xe7, 0xf8, 0x0e, 0x3b, 0x6f, + 0xf6, 0xff, 0xda, 0xe1, 0x02, 0xba, 0xe1, 0xb9, 0x67, 0x1b, 0x09, 0x76, 0x87, 0xfc, 0x52, 0x68, + 0xf2, 0x3a, 0xba, 0x65, 0x11, 0xa7, 0x06, 0x5c, 0xc0, 0xa1, 0x88, 0xfa, 0x3b, 0x1a, 0xba, 0xd4, + 0x3d, 0x8c, 0x78, 0xfb, 0x10, 0xcd, 0x45, 0x9a, 0x42, 0x5b, 0x83, 0x2d, 0xce, 0x9e, 0x1d, 0x04, + 0x96, 0xaa, 0xcb, 0x68, 0x06, 0x0e, 0x1d, 0xb0, 0x04, 0x54, 0x4c, 0xca, 0xa8, 0x05, 0x72, 0x75, + 0xa3, 0xa5, 0xe9, 0x4e, 0x75, 0xc7, 0x2f, 0xf6, 0x38, 0xdf, 0xeb, 0xd3, 0xe5, 0x9d, 0x7f, 0xf4, + 0x6d, 0x02, 0x8d, 0xc9, 0x89, 0xea, 0x77, 0x05, 0x69, 0xfd, 0x82, 0x55, 0x5d, 0xd7, 0x63, 0xf7, + 0x82, 0x3e, 0x48, 0x9a, 0xe7, 0x36, 0x2e, 0xd7, 0x14, 0xd0, 0x17, 0x1e, 0x7f, 0xf8, 0xf9, 0xe7, + 0x53, 0xc6, 0x78, 0xa2, 0x14, 0x0b, 0x45, 0x23, 0x7e, 0x51, 0xb5, 0x64, 0xaf, 0x79, 0x10, 0x36, + 0x9b, 0x91, 0xf5, 0x46, 0xf0, 0xcf, 0x67, 0x6f, 0x1a, 0x7e, 0xdf, 0xc0, 0x4f, 0xc3, 0xef, 0x1f, + 0xef, 0x03, 0xe0, 0x8b, 0xb0, 0x39, 0x86, 0xff, 0x45, 0x41, 0xf3, 0x09, 0x19, 0xad, 0xea, 0xfd, + 0x21, 0x92, 0xae, 0x83, 0x9c, 0x31, 0xb0, 0x3e, 0xe4, 0x35, 0x24, 0xef, 0xaa, 0xcf, 0xbb, 0x94, + 0xcc, 0x1b, 0x8f, 0xb7, 0x08, 0x69, 0x2c, 0xbb, 0xd3, 0x48, 0x93, 0xae, 0x89, 0x34, 0xd2, 0xc4, + 0x4b, 0x61, 0x00, 0xd2, 0x78, 0x3c, 0xa8, 0x5f, 0x15, 0x94, 0x4d, 0x8a, 0x28, 0xd5, 0xb8, 0x78, + 0xb3, 0xb1, 0xe8, 0xc9, 0xad, 0x0d, 0xde, 0x10, 0xc2, 0xae, 0x49, 0xd8, 0xa2, 0x0f, 0xbb, 0x7c, + 0xc1, 0xbf, 0x81, 0x13, 0x40, 0x9d, 0xd1, 0xc6, 0x5f, 0xeb, 0x34, 0xda, 0xc4, 0xa0, 0x4c, 0xa3, + 0x4d, 0x4e, 0x8c, 0x01, 0x68, 0xbb, 0xef, 0x5c, 0x40, 0xbb, 0xb9, 0xf5, 0xe3, 0x24, 0xaf, 0x1c, + 0x9f, 0xe4, 0x95, 0xdf, 0x27, 0x79, 0xe5, 0xe3, 0x69, 0x7e, 0xe4, 0xf8, 0x34, 0x3f, 0xf2, 0xeb, + 0x34, 0x3f, 0xf2, 0xbe, 0x68, 0x13, 0x51, 0xf3, 0xca, 0xba, 0xc5, 0x9a, 0xc6, 0x0b, 0x4c, 0x78, + 0xb9, 0xc1, 0xac, 0x7a, 0x64, 0xe8, 0xa1, 0x1c, 0x2b, 0xda, 0x0e, 0xb8, 0xe5, 0x71, 0xf9, 0xf3, + 0x70, 0xfd, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4c, 0x3b, 0x15, 0xb3, 0x91, 0x0a, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -1276,6 +1351,34 @@ func (m *QueryVerifyTransferProofsRequest) MarshalToSizedBuffer(dAtA []byte) (in _ = i var l int _ = l + if len(m.CurrentBalanceHandle) > 0 { + i -= len(m.CurrentBalanceHandle) + copy(dAtA[i:], m.CurrentBalanceHandle) + i = encodeVarintQuery(dAtA, i, uint64(len(m.CurrentBalanceHandle))) + i-- + dAtA[i] = 0x3a + } + if len(m.CurrentBalanceCommitment) > 0 { + i -= len(m.CurrentBalanceCommitment) + copy(dAtA[i:], m.CurrentBalanceCommitment) + i = encodeVarintQuery(dAtA, i, uint64(len(m.CurrentBalanceCommitment))) + i-- + dAtA[i] = 0x32 + } + if len(m.RecipientPubkey) > 0 { + i -= len(m.RecipientPubkey) + copy(dAtA[i:], m.RecipientPubkey) + i = encodeVarintQuery(dAtA, i, uint64(len(m.RecipientPubkey))) + i-- + dAtA[i] = 0x2a + } + if len(m.SenderPubkey) > 0 { + i -= len(m.SenderPubkey) + copy(dAtA[i:], m.SenderPubkey) + i = encodeVarintQuery(dAtA, i, uint64(len(m.SenderPubkey))) + i-- + dAtA[i] = 0x22 + } if len(m.ValidityProofData) > 0 { i -= len(m.ValidityProofData) copy(dAtA[i:], m.ValidityProofData) @@ -1360,6 +1463,32 @@ func (m *QueryVerifyWithdrawProofsRequest) MarshalToSizedBuffer(dAtA []byte) (in _ = i var l int _ = l + if m.ExpectedNonce != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.ExpectedNonce)) + i-- + dAtA[i] = 0x30 + } + if len(m.CiphertextHandle) > 0 { + i -= len(m.CiphertextHandle) + copy(dAtA[i:], m.CiphertextHandle) + i = encodeVarintQuery(dAtA, i, uint64(len(m.CiphertextHandle))) + i-- + dAtA[i] = 0x2a + } + if len(m.CiphertextCommitment) > 0 { + i -= len(m.CiphertextCommitment) + copy(dAtA[i:], m.CiphertextCommitment) + i = encodeVarintQuery(dAtA, i, uint64(len(m.CiphertextCommitment))) + i-- + dAtA[i] = 0x22 + } + if len(m.UserPubkey) > 0 { + i -= len(m.UserPubkey) + copy(dAtA[i:], m.UserPubkey) + i = encodeVarintQuery(dAtA, i, uint64(len(m.UserPubkey))) + i-- + dAtA[i] = 0x1a + } if len(m.RangeProofData) > 0 { i -= len(m.RangeProofData) copy(dAtA[i:], m.RangeProofData) @@ -1562,6 +1691,22 @@ func (m *QueryVerifyTransferProofsRequest) Size() (n int) { if l > 0 { n += 1 + l + sovQuery(uint64(l)) } + l = len(m.SenderPubkey) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.RecipientPubkey) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.CurrentBalanceCommitment) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.CurrentBalanceHandle) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } return n } @@ -1595,6 +1740,21 @@ func (m *QueryVerifyWithdrawProofsRequest) Size() (n int) { if l > 0 { n += 1 + l + sovQuery(uint64(l)) } + l = len(m.UserPubkey) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.CiphertextCommitment) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + l = len(m.CiphertextHandle) + if l > 0 { + n += 1 + l + sovQuery(uint64(l)) + } + if m.ExpectedNonce != 0 { + n += 1 + sovQuery(uint64(m.ExpectedNonce)) + } return n } @@ -2495,6 +2655,142 @@ func (m *QueryVerifyTransferProofsRequest) Unmarshal(dAtA []byte) error { m.ValidityProofData = []byte{} } iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SenderPubkey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SenderPubkey = append(m.SenderPubkey[:0], dAtA[iNdEx:postIndex]...) + if m.SenderPubkey == nil { + m.SenderPubkey = []byte{} + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RecipientPubkey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RecipientPubkey = append(m.RecipientPubkey[:0], dAtA[iNdEx:postIndex]...) + if m.RecipientPubkey == nil { + m.RecipientPubkey = []byte{} + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentBalanceCommitment", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CurrentBalanceCommitment = append(m.CurrentBalanceCommitment[:0], dAtA[iNdEx:postIndex]...) + if m.CurrentBalanceCommitment == nil { + m.CurrentBalanceCommitment = []byte{} + } + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentBalanceHandle", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CurrentBalanceHandle = append(m.CurrentBalanceHandle[:0], dAtA[iNdEx:postIndex]...) + if m.CurrentBalanceHandle == nil { + m.CurrentBalanceHandle = []byte{} + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipQuery(dAtA[iNdEx:]) @@ -2715,6 +3011,127 @@ func (m *QueryVerifyWithdrawProofsRequest) Unmarshal(dAtA []byte) error { m.RangeProofData = []byte{} } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UserPubkey", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UserPubkey = append(m.UserPubkey[:0], dAtA[iNdEx:postIndex]...) + if m.UserPubkey == nil { + m.UserPubkey = []byte{} + } + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CiphertextCommitment", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CiphertextCommitment = append(m.CiphertextCommitment[:0], dAtA[iNdEx:postIndex]...) + if m.CiphertextCommitment == nil { + m.CiphertextCommitment = []byte{} + } + iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CiphertextHandle", wireType) + } + var byteLen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + byteLen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if byteLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + byteLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CiphertextHandle = append(m.CiphertextHandle[:0], dAtA[iNdEx:postIndex]...) + if m.CiphertextHandle == nil { + m.CiphertextHandle = []byte{} + } + iNdEx = postIndex + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ExpectedNonce", wireType) + } + m.ExpectedNonce = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ExpectedNonce |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipQuery(dAtA[iNdEx:]) diff --git a/x/zkp/verification/range/range.go b/x/zkp/verification/range/range.go index 26a9c46e..06e61b4f 100644 --- a/x/zkp/verification/range/range.go +++ b/x/zkp/verification/range/range.go @@ -489,7 +489,6 @@ func (rp *RangeProof) Verify( if err != nil { return RangeErrMaximumGeneratorLengthExceeded } - // REMOVE increaseCapacity(nm) here; it's already at maxProofBits } else { bpGens, err = NewRangeProofGens(nm) if err != nil { diff --git a/x/zkp/verification/transferctx/transferctx.go b/x/zkp/verification/transferctx/transferctx.go new file mode 100644 index 00000000..a4e07f62 --- /dev/null +++ b/x/zkp/verification/transferctx/transferctx.go @@ -0,0 +1,87 @@ +// Package transferctx performs ZK binding checks for confidential transfers: +// pubkey consistency, range/equality commitment alignment, and remaining balance. +package transferctx + +import ( + "bytes" + "errors" + + "github.com/Fairblock/fairyring/x/zkp/verification/commitment" + "github.com/Fairblock/fairyring/x/zkp/verification/common" + rangeproof "github.com/Fairblock/fairyring/x/zkp/verification/range" + "github.com/Fairblock/fairyring/x/zkp/verification/validity" +) + +// VerifyBindings checks consistency between proofs and expected pubkeys / encrypted balance +func VerifyBindings( + eq *commitment.CiphertextCommitmentEqualityProofData, + rp *rangeproof.BatchedRangeProofU128Data, + vp *validity.BatchedGroupedCiphertext2HandlesValidityProofData, + currentC1, currentC2, senderPK, recipientPK []byte, +) error { + if len(senderPK) != 32 || len(recipientPK) != 32 || len(currentC1) != 32 || len(currentC2) != 32 { + return errors.New("transfer binding: invalid input lengths") + } + if !bytes.Equal(vp.Context.FirstPubkey.Bytes[:], senderPK) { + return errors.New("sender pubkey mismatch") + } + if !bytes.Equal(vp.Context.SecondPubkey.Bytes[:], recipientPK) { + return errors.New("recipient pubkey mismatch") + } + if !bytes.Equal(eq.Context.Pubkey.Bytes[:], senderPK) { + return errors.New("source pubkey mismatch") + } + if !bytes.Equal(eq.Context.Commitment.Bytes[:], rp.Context.Commitments[0].Bytes[:]) { + return errors.New("equality and range proof commitments do not match") + } + + gc, err := validity.GroupedElGamalCiphertext2FromBytes(vp.Context.GroupedCiphertextLo.Bytes[:]) + if err != nil { + return errors.New("failed to deserialize ciphertexts") + } + + senderCommit := gc.Commitment.ToBytes() + senderHandle := gc.Handles[0].ToBytes() + remC1, remC2, err := homomorphicSub( + currentC1, currentC2, + senderCommit[:], + senderHandle[:], + ) + if err != nil { + return err + } + if !bytes.Equal(remC1[:], eq.Context.Ciphertext.Commitment[:]) { + return errors.New("remaining balance commitment mismatch") + } + if !bytes.Equal(remC2[:], eq.Context.Ciphertext.Handle[:]) { + return errors.New("remaining balance handle mismatch") + } + return nil +} + +func homomorphicSub(aC1, aC2, bC1, bC2 []byte) ([32]byte, [32]byte, error) { + var zero [32]byte + ac, err := common.PedersenCommitmentFromBytes(aC1) + if err != nil { + return zero, zero, errors.New("transfer binding: invalid current balance commitment") + } + bc, err := common.PedersenCommitmentFromBytes(bC1) + if err != nil { + return zero, zero, errors.New("transfer binding: invalid transfer commitment") + } + ah, err := common.DecryptHandleFromBytes(aC2) + if err != nil { + return zero, zero, errors.New("transfer binding: invalid current balance handle") + } + bh, err := common.DecryptHandleFromBytes(bC2) + if err != nil { + return zero, zero, errors.New("transfer binding: invalid transfer handle") + } + var rc, rh common.Point + rc.Sub(ac.GetPoint(), bc.GetPoint()) + rh.Sub(ah.GetPoint(), bh.GetPoint()) + var outC, outH [32]byte + rc.BytesInto(&outC) + rh.BytesInto(&outH) + return outC, outH, nil +} diff --git a/x/zkp/verification/withdrawctx/withdrawctx.go b/x/zkp/verification/withdrawctx/withdrawctx.go new file mode 100644 index 00000000..97d1ecd2 --- /dev/null +++ b/x/zkp/verification/withdrawctx/withdrawctx.go @@ -0,0 +1,45 @@ +// Package withdrawctx performs ZK binding checks for withdrawals: nonce, pubkey, +// ciphertext, and equality/range commitment alignment. +package withdrawctx + +import ( + "bytes" + "encoding/binary" + "errors" + + "github.com/Fairblock/fairyring/x/zkp/verification/commitment" + rangeproof "github.com/Fairblock/fairyring/x/zkp/verification/range" +) + +func VerifyBindings( + eq *commitment.WithdrawCiphertextCommitmentEqualityProofData, + rp *rangeproof.WithdrawBatchedRangeProofU64Data, + userPK []byte, + ciphertextC1, ciphertextC2 []byte, + expectedNonce uint64, +) error { + if len(userPK) != 32 || len(ciphertextC1) != 32 || len(ciphertextC2) != 32 { + return errors.New("withdraw binding: invalid input lengths") + } + proofNonce := binary.LittleEndian.Uint64(eq.Context.Nonce[:]) + if proofNonce != expectedNonce { + return errors.New("withdraw equality proof nonce mismatch") + } + rangeNonce := binary.LittleEndian.Uint64(rp.Context.Nonce[:]) + if rangeNonce != expectedNonce { + return errors.New("withdraw range proof nonce mismatch") + } + if !bytes.Equal(eq.Context.Pubkey.Bytes[:], userPK) { + return errors.New("pubkey mismatch") + } + if !bytes.Equal(eq.Context.Ciphertext.Commitment[:], ciphertextC1) { + return errors.New("commitment mismatch") + } + if !bytes.Equal(eq.Context.Ciphertext.Handle[:], ciphertextC2) { + return errors.New("handle mismatch") + } + if !bytes.Equal(eq.Context.Commitment.Bytes[:], rp.Context.Commitments[0].Bytes[:]) { + return errors.New("equality and range proof commitments do not match") + } + return nil +} From c40db7c95ca885808f3f16807c80afd5b499cbaa Mon Sep 17 00:00:00 2001 From: SetarehGhorshi Date: Mon, 6 Apr 2026 19:49:18 -0400 Subject: [PATCH 04/42] fix: ProofErrDeserialization is zero --- x/zkp/verification/range/range.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x/zkp/verification/range/range.go b/x/zkp/verification/range/range.go index 06e61b4f..b70522ca 100644 --- a/x/zkp/verification/range/range.go +++ b/x/zkp/verification/range/range.go @@ -121,8 +121,8 @@ func (e RangeProofVerificationError) Error() string { type ProofError int const ( - ProofErrDeserialization ProofError = iota - ProofErrAlgebraic + ProofErrDeserialization ProofError = 1 + ProofErrAlgebraic ProofError = 2 ) func (e ProofError) Error() string { From a1bce4b5a91af2b208ce4e0984f3033910b41564 Mon Sep 17 00:00:00 2001 From: SetarehGhorshi Date: Tue, 7 Apr 2026 17:28:47 -0400 Subject: [PATCH 05/42] fix: ZKP verification performs unmetered computation callable by any CosmWasm contract --- app/ibc.go | 27 +- app/zkp.go | 8 +- proto/fairyring/zkp/genesis.proto | 3 +- proto/fairyring/zkp/tx.proto | 30 ++ wasmbinding/querier.go | 38 +- wasmbinding/query_handler.go | 45 +++ x/zkp/keeper/keeper.go | 47 ++- x/zkp/keeper/msg_server.go | 66 ++++ x/zkp/keeper/query_filtered.go | 19 +- x/zkp/keeper/query_proof_verification.go | 33 +- x/zkp/module/genesis.go | 9 +- x/zkp/module/module.go | 7 +- x/zkp/types/codec.go | 11 +- x/zkp/types/genesis.go | 20 +- x/zkp/types/genesis.pb.go | 56 ++- x/zkp/types/keys.go | 21 +- x/zkp/types/msgs.go | 433 +++++++++++++++++++++++ x/zkp/types/query_trusted.go | 157 ++++++++ 18 files changed, 949 insertions(+), 81 deletions(-) create mode 100644 proto/fairyring/zkp/tx.proto create mode 100644 wasmbinding/query_handler.go create mode 100644 x/zkp/keeper/msg_server.go create mode 100644 x/zkp/types/msgs.go create mode 100644 x/zkp/types/query_trusted.go diff --git a/app/ibc.go b/app/ibc.go index a00d2d5c..736cc605 100644 --- a/app/ibc.go +++ b/app/ibc.go @@ -1,8 +1,6 @@ package app import ( - "encoding/json" - "cosmossdk.io/core/appmodule" storetypes "cosmossdk.io/store/types" "github.com/CosmWasm/wasmd/x/wasm" @@ -12,7 +10,6 @@ import ( pepmodule "github.com/Fairblock/fairyring/x/pep/module" cdctypes "github.com/cosmos/cosmos-sdk/codec/types" servertypes "github.com/cosmos/cosmos-sdk/server/types" - sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" "github.com/cosmos/cosmos-sdk/x/gov" @@ -193,17 +190,19 @@ func (app *App) registerIBCModules(appOpts servertypes.AppOptions) error { } // Add wasmd to IBC Router - wasmStack, err := app.registerWasmModules(appOpts, wasmkeeper.WithQueryPlugins( - &wasmkeeper.QueryPlugins{ - Stargate: wasmkeeper.AcceptListStargateQuerier( - acceptList, - app.GRPCQueryRouter(), - app.AppCodec(), - ), - Custom: func(ctx sdk.Context, request json.RawMessage) ([]byte, error) { - return wasmbinding.CustomQuerier(app.ZkpKeeper)(ctx, request) - }, - })) + wasmStack, err := app.registerWasmModules(appOpts, wasmkeeper.WithQueryHandlerDecorator( + func(old wasmkeeper.WasmVMQueryHandler) wasmkeeper.WasmVMQueryHandler { + return wasmbinding.NewQueryHandler( + old, + app.ZkpKeeper, + wasmkeeper.AcceptListStargateQuerier( + acceptList, + app.GRPCQueryRouter(), + app.AppCodec(), + ), + ) + }, + )) if err != nil { return err } diff --git a/app/zkp.go b/app/zkp.go index 83a38069..0297804d 100644 --- a/app/zkp.go +++ b/app/zkp.go @@ -6,26 +6,24 @@ import ( zkpmodule "github.com/Fairblock/fairyring/x/zkp/module" zkptypes "github.com/Fairblock/fairyring/x/zkp/types" "github.com/cosmos/cosmos-sdk/runtime" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" ) -// registerZkpModule register ZKP keepers and non dependency inject modules. func (app *App) registerZkpModule() error { - // set up non depinject support modules store keys if err := app.RegisterStores( storetypes.NewKVStoreKey(zkptypes.StoreKey), ); err != nil { panic(err) } - // The last arguments can contain custom message handlers, and custom query handlers, - // if we want to allow any custom callbacks app.ZkpKeeper = zkpmodulekeeper.NewKeeper( app.AppCodec(), runtime.NewKVStoreService(app.GetKey(zkptypes.StoreKey)), app.Logger(), + authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) - // register modules if err := app.RegisterModules( zkpmodule.NewAppModule( app.AppCodec(), diff --git a/proto/fairyring/zkp/genesis.proto b/proto/fairyring/zkp/genesis.proto index cd309ab9..41eb9898 100644 --- a/proto/fairyring/zkp/genesis.proto +++ b/proto/fairyring/zkp/genesis.proto @@ -6,8 +6,7 @@ import "gogoproto/gogo.proto"; option go_package = "github.com/Fairblock/fairyring/x/zkp/types"; -// GenesisState defines the zkp module's genesis state. message GenesisState { - // this line is used by starport scaffolding # genesis/proto/state + repeated string trusted_contracts = 1; } diff --git a/proto/fairyring/zkp/tx.proto b/proto/fairyring/zkp/tx.proto new file mode 100644 index 00000000..e3948599 --- /dev/null +++ b/proto/fairyring/zkp/tx.proto @@ -0,0 +1,30 @@ +syntax = "proto3"; + +package fairyring.zkp; + +import "cosmos/msg/v1/msg.proto"; + +option go_package = "github.com/Fairblock/fairyring/x/zkp/types"; + +service Msg { + option (cosmos.msg.v1.service) = true; + + rpc AddTrustedContract(MsgAddTrustedContract) returns (MsgAddTrustedContractResponse); + rpc RemoveTrustedContract(MsgRemoveTrustedContract) returns (MsgRemoveTrustedContractResponse); +} + +message MsgAddTrustedContract { + option (cosmos.msg.v1.signer) = "authority"; + string authority = 1; + string contract_address = 2; +} + +message MsgAddTrustedContractResponse {} + +message MsgRemoveTrustedContract { + option (cosmos.msg.v1.signer) = "authority"; + string authority = 1; + string contract_address = 2; +} + +message MsgRemoveTrustedContractResponse {} diff --git a/wasmbinding/querier.go b/wasmbinding/querier.go index 23ff89a1..665a983d 100644 --- a/wasmbinding/querier.go +++ b/wasmbinding/querier.go @@ -4,16 +4,15 @@ import ( "encoding/base64" "encoding/json" "errors" + "fmt" - sdk "github.com/cosmos/cosmos-sdk/types" zkpmodulekeeper "github.com/Fairblock/fairyring/x/zkp/keeper" zkpmoduletypes "github.com/Fairblock/fairyring/x/zkp/types" + sdk "github.com/cosmos/cosmos-sdk/types" ) -// CustomQuerier returns a function that handles CosmWasm custom queries -func CustomQuerier(zkpKeeper *zkpmodulekeeper.Keeper) func(ctx sdk.Context, request json.RawMessage) ([]byte, error) { - return func(ctx sdk.Context, request json.RawMessage) ([]byte, error) { - // Parse the custom query +func CustomQuerier(zkpKeeper *zkpmodulekeeper.Keeper) func(ctx sdk.Context, caller sdk.AccAddress, request json.RawMessage) ([]byte, error) { + return func(ctx sdk.Context, caller sdk.AccAddress, request json.RawMessage) ([]byte, error) { var query struct { VerifyTransferProofs *TransferProofsQuery `json:"verify_transfer_proofs,omitempty"` VerifyWithdrawProofs *WithdrawProofsQuery `json:"verify_withdraw_proofs,omitempty"` @@ -23,9 +22,11 @@ func CustomQuerier(zkpKeeper *zkpmodulekeeper.Keeper) func(ctx sdk.Context, requ return nil, err } - // Handle VerifyTransferProofs query if query.VerifyTransferProofs != nil { - // Decode base64 strings to []byte + if err := enforceTrustedContract(ctx, zkpKeeper, caller); err != nil { + return nil, err + } + equalityData, err := base64.StdEncoding.DecodeString(query.VerifyTransferProofs.EqualityProofData) if err != nil { return nil, err @@ -70,7 +71,6 @@ func CustomQuerier(zkpKeeper *zkpmodulekeeper.Keeper) func(ctx sdk.Context, requ return nil, err } - // Return response as JSON response := map[string]interface{}{ "valid": resp.Valid, "error": resp.Error, @@ -78,9 +78,11 @@ func CustomQuerier(zkpKeeper *zkpmodulekeeper.Keeper) func(ctx sdk.Context, requ return json.Marshal(response) } - // Handle VerifyWithdrawProofs query if query.VerifyWithdrawProofs != nil { - // Decode base64 strings to []byte + if err := enforceTrustedContract(ctx, zkpKeeper, caller); err != nil { + return nil, err + } + equalityData, err := base64.StdEncoding.DecodeString(query.VerifyWithdrawProofs.EqualityProofData) if err != nil { return nil, err @@ -116,7 +118,6 @@ func CustomQuerier(zkpKeeper *zkpmodulekeeper.Keeper) func(ctx sdk.Context, requ return nil, err } - // Return response as JSON response := map[string]interface{}{ "valid": resp.Valid, "error": resp.Error, @@ -128,8 +129,17 @@ func CustomQuerier(zkpKeeper *zkpmodulekeeper.Keeper) func(ctx sdk.Context, requ } } -// TransferProofsQuery represents the CosmWasm query structure for transfer proofs -// CosmWasm Binary types are serialized as base64 strings in JSON +func enforceTrustedContract(ctx sdk.Context, zkpKeeper *zkpmodulekeeper.Keeper, caller sdk.AccAddress) error { + if len(caller) == 0 { + return fmt.Errorf("caller contract address is required for ZKP verification queries") + } + contractAddr := caller.String() + if !zkpKeeper.IsTrustedContract(ctx, contractAddr) { + return fmt.Errorf("contract %s is not authorized for ZKP verification", contractAddr) + } + return nil +} + type TransferProofsQuery struct { EqualityProofData string `json:"equality_proof_data"` RangeProofData string `json:"range_proof_data"` @@ -140,8 +150,6 @@ type TransferProofsQuery struct { CurrentBalanceHandle string `json:"current_balance_handle"` } -// WithdrawProofsQuery represents the CosmWasm query structure for withdraw proofs -// CosmWasm Binary types are serialized as base64 strings in JSON type WithdrawProofsQuery struct { EqualityProofData string `json:"equality_proof_data"` RangeProofData string `json:"range_proof_data"` diff --git a/wasmbinding/query_handler.go b/wasmbinding/query_handler.go new file mode 100644 index 00000000..1d678d49 --- /dev/null +++ b/wasmbinding/query_handler.go @@ -0,0 +1,45 @@ +package wasmbinding + +import ( + "encoding/json" + "fmt" + + wasmkeeper "github.com/CosmWasm/wasmd/x/wasm/keeper" + wasmvmtypes "github.com/CosmWasm/wasmvm/v2/types" + sdk "github.com/cosmos/cosmos-sdk/types" + + zkpmodulekeeper "github.com/Fairblock/fairyring/x/zkp/keeper" +) + +type callerAwareQueryHandler struct { + fallback wasmkeeper.WasmVMQueryHandler + custom func(ctx sdk.Context, caller sdk.AccAddress, request json.RawMessage) ([]byte, error) +} + +func NewQueryHandler( + old wasmkeeper.WasmVMQueryHandler, + zkpKeeper *zkpmodulekeeper.Keeper, + stargate func(ctx sdk.Context, request *wasmvmtypes.StargateQuery) ([]byte, error), +) wasmkeeper.WasmVMQueryHandler { + plugins, ok := old.(wasmkeeper.QueryPlugins) + if !ok { + panic(fmt.Sprintf("unsupported wasm query handler type: %T", old)) + } + + plugins = plugins.Merge(&wasmkeeper.QueryPlugins{ + Stargate: stargate, + }) + + return callerAwareQueryHandler{ + fallback: plugins, + custom: CustomQuerier(zkpKeeper), + } +} + +func (h callerAwareQueryHandler) HandleQuery(ctx sdk.Context, caller sdk.AccAddress, req wasmvmtypes.QueryRequest) ([]byte, error) { + if req.Custom != nil { + return h.custom(ctx, caller, req.Custom) + } + + return h.fallback.HandleQuery(ctx, caller, req) +} diff --git a/x/zkp/keeper/keeper.go b/x/zkp/keeper/keeper.go index 2caeefe4..6e7fb774 100644 --- a/x/zkp/keeper/keeper.go +++ b/x/zkp/keeper/keeper.go @@ -1,9 +1,14 @@ package keeper import ( + "fmt" + "cosmossdk.io/core/store" "cosmossdk.io/log" + "cosmossdk.io/store/prefix" "github.com/cosmos/cosmos-sdk/codec" + "github.com/cosmos/cosmos-sdk/runtime" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/Fairblock/fairyring/x/zkp/types" ) @@ -13,6 +18,7 @@ type ( cdc codec.BinaryCodec storeService store.KVStoreService logger log.Logger + authority string } ) @@ -20,15 +26,54 @@ func NewKeeper( cdc codec.BinaryCodec, storeService store.KVStoreService, logger log.Logger, + authority string, ) *Keeper { + if _, err := sdk.AccAddressFromBech32(authority); err != nil { + panic(fmt.Sprintf("invalid authority address: %s", authority)) + } return &Keeper{ cdc: cdc, storeService: storeService, logger: logger, + authority: authority, } } -// Logger returns a module-specific logger. +func (k Keeper) GetAuthority() string { + return k.authority +} + func (k Keeper) Logger() log.Logger { return k.logger.With("module", "x/"+types.ModuleName) } + +func (k Keeper) StoreTrustedContract(ctx sdk.Context, addr string) { + storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) + st := prefix.NewStore(storeAdapter, types.TrustedContractPrefix) + st.Set([]byte(addr), []byte{1}) +} + +func (k Keeper) DeleteTrustedContract(ctx sdk.Context, addr string) { + storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) + st := prefix.NewStore(storeAdapter, types.TrustedContractPrefix) + st.Delete([]byte(addr)) +} + +func (k Keeper) IsTrustedContract(ctx sdk.Context, addr string) bool { + storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) + st := prefix.NewStore(storeAdapter, types.TrustedContractPrefix) + return st.Has([]byte(addr)) +} + +func (k Keeper) GetAllTrustedContracts(ctx sdk.Context) []string { + storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) + st := prefix.NewStore(storeAdapter, types.TrustedContractPrefix) + iter := st.Iterator(nil, nil) + defer iter.Close() + + var contracts []string + for ; iter.Valid(); iter.Next() { + contracts = append(contracts, string(iter.Key())) + } + return contracts +} diff --git a/x/zkp/keeper/msg_server.go b/x/zkp/keeper/msg_server.go new file mode 100644 index 00000000..2f55aadc --- /dev/null +++ b/x/zkp/keeper/msg_server.go @@ -0,0 +1,66 @@ +package keeper + +import ( + "context" + + errorsmod "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + + "github.com/Fairblock/fairyring/x/zkp/types" +) + +type msgServer struct { + Keeper +} + +func NewMsgServerImpl(keeper Keeper) types.MsgServer { + return &msgServer{Keeper: keeper} +} + +var _ types.MsgServer = msgServer{} + +func (ms msgServer) AddTrustedContract(goCtx context.Context, msg *types.MsgAddTrustedContract) (*types.MsgAddTrustedContractResponse, error) { + if ms.GetAuthority() != msg.Authority { + return nil, errorsmod.Wrapf(govtypes.ErrInvalidSigner, "unauthorized: expected %s, got %s", ms.GetAuthority(), msg.Authority) + } + + ctx := sdk.UnwrapSDKContext(goCtx) + + if ms.IsTrustedContract(ctx, msg.ContractAddress) { + return nil, errorsmod.Wrapf(sdkerrors.ErrInvalidRequest, "contract %s is already trusted", msg.ContractAddress) + } + + ms.StoreTrustedContract(ctx, msg.ContractAddress) + ctx.EventManager().EmitEvent(sdk.NewEvent( + types.ModuleName, + sdk.NewAttribute(sdk.AttributeKeyAction, "add_trusted_contract"), + sdk.NewAttribute("contract_address", msg.ContractAddress), + sdk.NewAttribute("authority", msg.Authority), + )) + + return &types.MsgAddTrustedContractResponse{}, nil +} + +func (ms msgServer) RemoveTrustedContract(goCtx context.Context, msg *types.MsgRemoveTrustedContract) (*types.MsgRemoveTrustedContractResponse, error) { + if ms.GetAuthority() != msg.Authority { + return nil, errorsmod.Wrapf(govtypes.ErrInvalidSigner, "unauthorized: expected %s, got %s", ms.GetAuthority(), msg.Authority) + } + + ctx := sdk.UnwrapSDKContext(goCtx) + + if !ms.IsTrustedContract(ctx, msg.ContractAddress) { + return nil, errorsmod.Wrapf(sdkerrors.ErrNotFound, "contract %s is not in the trusted list", msg.ContractAddress) + } + + ms.DeleteTrustedContract(ctx, msg.ContractAddress) + ctx.EventManager().EmitEvent(sdk.NewEvent( + types.ModuleName, + sdk.NewAttribute(sdk.AttributeKeyAction, "remove_trusted_contract"), + sdk.NewAttribute("contract_address", msg.ContractAddress), + sdk.NewAttribute("authority", msg.Authority), + )) + + return &types.MsgRemoveTrustedContractResponse{}, nil +} diff --git a/x/zkp/keeper/query_filtered.go b/x/zkp/keeper/query_filtered.go index 328d1215..4baf7cd9 100644 --- a/x/zkp/keeper/query_filtered.go +++ b/x/zkp/keeper/query_filtered.go @@ -3,50 +3,49 @@ package keeper import ( "context" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/Fairblock/fairyring/x/zkp/types" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) -// FilteredQueryServer wraps the keeper to block ZKP verification queries via gRPC/REST -// These queries are only accessible through CosmWasm contracts type FilteredQueryServer struct { keeper Keeper } -// NewFilteredQueryServer creates a new filtered query server func NewFilteredQueryServer(keeper Keeper) types.QueryServer { return &FilteredQueryServer{keeper: keeper} } -// ZKP Verification queries are blocked via gRPC/REST +var _ types.TrustedContractsQueryServer = &FilteredQueryServer{} + +func (f *FilteredQueryServer) TrustedContracts(goCtx context.Context, req *types.QueryTrustedContractsRequest) (*types.QueryTrustedContractsResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + contracts := f.keeper.GetAllTrustedContracts(ctx) + return &types.QueryTrustedContractsResponse{ContractAddresses: contracts}, nil +} -// VerifyWithdrawRangeProof blocks access via gRPC/REST func (f *FilteredQueryServer) VerifyWithdrawRangeProof(ctx context.Context, req *types.QueryVerifyWithdrawRangeProofRequest) (*types.QueryVerifyWithdrawRangeProofResponse, error) { return nil, status.Errorf(codes.PermissionDenied, "ZKP verification queries are only accessible through CosmWasm contracts, not via gRPC or REST API") } -// VerifyTransferRangeProof blocks access via gRPC/REST func (f *FilteredQueryServer) VerifyTransferRangeProof(ctx context.Context, req *types.QueryVerifyTransferRangeProofRequest) (*types.QueryVerifyTransferRangeProofResponse, error) { return nil, status.Errorf(codes.PermissionDenied, "ZKP verification queries are only accessible through CosmWasm contracts, not via gRPC or REST API") } -// VerifyValidityProof blocks access via gRPC/REST func (f *FilteredQueryServer) VerifyValidityProof(ctx context.Context, req *types.QueryVerifyValidityProofRequest) (*types.QueryVerifyValidityProofResponse, error) { return nil, status.Errorf(codes.PermissionDenied, "ZKP verification queries are only accessible through CosmWasm contracts, not via gRPC or REST API") } -// VerifyEqualityProof blocks access via gRPC/REST func (f *FilteredQueryServer) VerifyEqualityProof(ctx context.Context, req *types.QueryVerifyEqualityProofRequest) (*types.QueryVerifyEqualityProofResponse, error) { return nil, status.Errorf(codes.PermissionDenied, "ZKP verification queries are only accessible through CosmWasm contracts, not via gRPC or REST API") } -// VerifyTransferProofs blocks access via gRPC/REST func (f *FilteredQueryServer) VerifyTransferProofs(ctx context.Context, req *types.QueryVerifyTransferProofsRequest) (*types.QueryVerifyTransferProofsResponse, error) { return nil, status.Errorf(codes.PermissionDenied, "ZKP verification queries are only accessible through CosmWasm contracts, not via gRPC or REST API") } -// VerifyWithdrawProofs blocks access via gRPC/REST func (f *FilteredQueryServer) VerifyWithdrawProofs(ctx context.Context, req *types.QueryVerifyWithdrawProofsRequest) (*types.QueryVerifyWithdrawProofsResponse, error) { return nil, status.Errorf(codes.PermissionDenied, "ZKP verification queries are only accessible through CosmWasm contracts, not via gRPC or REST API") } diff --git a/x/zkp/keeper/query_proof_verification.go b/x/zkp/keeper/query_proof_verification.go index 6977e644..22a1d43b 100644 --- a/x/zkp/keeper/query_proof_verification.go +++ b/x/zkp/keeper/query_proof_verification.go @@ -3,6 +3,8 @@ package keeper import ( "context" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/Fairblock/fairyring/x/zkp/types" "github.com/Fairblock/fairyring/x/zkp/verification/commitment" rangeproof "github.com/Fairblock/fairyring/x/zkp/verification/range" @@ -13,12 +15,14 @@ import ( "google.golang.org/grpc/status" ) -// VerifyWithdrawRangeProof verifies a withdraw range proof (U64) with nonce binding. func (k Keeper) VerifyWithdrawRangeProof(goCtx context.Context, req *types.QueryVerifyWithdrawRangeProofRequest) (*types.QueryVerifyWithdrawRangeProofResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "invalid request") } + ctx := sdk.UnwrapSDKContext(goCtx) + ctx.GasMeter().ConsumeGas(types.GasVerifyWithdrawRangeProof, "verify_withdraw_range_proof") + if len(req.ProofData) < 8*32+8+8+672 { return &types.QueryVerifyWithdrawRangeProofResponse{ Valid: false, @@ -82,13 +86,14 @@ func (k Keeper) VerifyWithdrawRangeProof(goCtx context.Context, req *types.Query }, nil } -// VerifyTransferRangeProof verifies a transfer range proof (U128) func (k Keeper) VerifyTransferRangeProof(goCtx context.Context, req *types.QueryVerifyTransferRangeProofRequest) (*types.QueryVerifyTransferRangeProofResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "invalid request") } - // Deserialize proof data + ctx := sdk.UnwrapSDKContext(goCtx) + ctx.GasMeter().ConsumeGas(types.GasVerifyTransferRangeProof, "verify_transfer_range_proof") + if len(req.ProofData) < 8*32+8+736 { return &types.QueryVerifyTransferRangeProofResponse{ Valid: false, @@ -147,14 +152,14 @@ func (k Keeper) VerifyTransferRangeProof(goCtx context.Context, req *types.Query }, nil } -// VerifyValidityProof verifies a validity proof func (k Keeper) VerifyValidityProof(goCtx context.Context, req *types.QueryVerifyValidityProofRequest) (*types.QueryVerifyValidityProofResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "invalid request") } - // Deserialize proof data - // Expected size: 32 (first_pubkey) + 32 (second_pubkey) + 96 (grouped_ciphertext_lo) + 96 (grouped_ciphertext_hi) + 160 (proof) = 416 bytes + ctx := sdk.UnwrapSDKContext(goCtx) + ctx.GasMeter().ConsumeGas(types.GasVerifyValidityProof, "verify_validity_proof") + if len(req.ProofData) < 416 { return &types.QueryVerifyValidityProofResponse{ Valid: false, @@ -199,14 +204,14 @@ func (k Keeper) VerifyValidityProof(goCtx context.Context, req *types.QueryVerif }, nil } -// VerifyEqualityProof verifies an equality proof func (k Keeper) VerifyEqualityProof(goCtx context.Context, req *types.QueryVerifyEqualityProofRequest) (*types.QueryVerifyEqualityProofResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "invalid request") } - // Deserialize proof data - // Expected size: 32 (pubkey) + 64 (ciphertext) + 32 (commitment) + 192 (proof) = 320 bytes + ctx := sdk.UnwrapSDKContext(goCtx) + ctx.GasMeter().ConsumeGas(types.GasVerifyEqualityProof, "verify_equality_proof") + if len(req.ProofData) < 320 { return &types.QueryVerifyEqualityProofResponse{ Valid: false, @@ -259,13 +264,14 @@ func (k Keeper) VerifyEqualityProof(goCtx context.Context, req *types.QueryVerif }, nil } -// VerifyTransferProofs verifies all transfer proofs together (equality, range, validity) func (k Keeper) VerifyTransferProofs(goCtx context.Context, req *types.QueryVerifyTransferProofsRequest) (*types.QueryVerifyTransferProofsResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "invalid request") } - // Deserialize equality proof + ctx := sdk.UnwrapSDKContext(goCtx) + ctx.GasMeter().ConsumeGas(types.GasVerifyTransferProofs, "verify_transfer_proofs") + if len(req.EqualityProofData) < 320 { return &types.QueryVerifyTransferProofsResponse{ Valid: false, @@ -417,13 +423,14 @@ func (k Keeper) VerifyTransferProofs(goCtx context.Context, req *types.QueryVeri }, nil } -// VerifyWithdrawProofs verifies all withdraw proofs together (equality, range) func (k Keeper) VerifyWithdrawProofs(goCtx context.Context, req *types.QueryVerifyWithdrawProofsRequest) (*types.QueryVerifyWithdrawProofsResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "invalid request") } - // Deserialize equality proof + ctx := sdk.UnwrapSDKContext(goCtx) + ctx.GasMeter().ConsumeGas(types.GasVerifyWithdrawProofs, "verify_withdraw_proofs") + if len(req.EqualityProofData) < 328 { return &types.QueryVerifyWithdrawProofsResponse{ Valid: false, diff --git a/x/zkp/module/genesis.go b/x/zkp/module/genesis.go index 8e6fe965..b72e85c2 100644 --- a/x/zkp/module/genesis.go +++ b/x/zkp/module/genesis.go @@ -7,18 +7,17 @@ import ( "github.com/Fairblock/fairyring/x/zkp/types" ) -// InitGenesis initializes the module's state from a provided genesis state. func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) { - // this line is used by starport scaffolding # genesis/module/init k.Logger().Info("Starting genesis state initialization for module", "module", types.ModuleName) + for _, addr := range genState.TrustedContracts { + k.StoreTrustedContract(ctx, addr) + } k.Logger().Info("Genesis state initialization completed for module", "module", types.ModuleName) } -// ExportGenesis returns the module's exported genesis func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { genesis := types.DefaultGenesis() - // this line is used by starport scaffolding # genesis/module/export - + genesis.TrustedContracts = k.GetAllTrustedContracts(ctx) return genesis } diff --git a/x/zkp/module/module.go b/x/zkp/module/module.go index 9275f8cf..3ad60b57 100644 --- a/x/zkp/module/module.go +++ b/x/zkp/module/module.go @@ -105,10 +105,11 @@ func NewAppModule( } } -// RegisterServices registers a gRPC query service to respond to the module-specific gRPC queries func (am AppModule) RegisterServices(cfg module.Configurator) { - // Use filtered query server to block ZKP verification queries via gRPC/REST - types.RegisterQueryServer(cfg.QueryServer(), keeper.NewFilteredQueryServer(am.keeper)) + types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) + filteredServer := keeper.NewFilteredQueryServer(am.keeper) + types.RegisterQueryServer(cfg.QueryServer(), filteredServer) + types.RegisterTrustedContractsQueryServer(cfg.QueryServer(), filteredServer.(types.TrustedContractsQueryServer)) } // RegisterInvariants registers the invariants of the module. If an invariant deviates from its predicted value, the InvariantRegistry triggers appropriate logic (most often the chain will be halted) diff --git a/x/zkp/types/codec.go b/x/zkp/types/codec.go index f11e94f5..96444a99 100644 --- a/x/zkp/types/codec.go +++ b/x/zkp/types/codec.go @@ -2,9 +2,18 @@ package types import ( cdctypes "github.com/cosmos/cosmos-sdk/codec/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/msgservice" ) func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { - // this line is used by starport scaffolding # 3 + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgAddTrustedContract{}, + ) + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgRemoveTrustedContract{}, + ) + + msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) } diff --git a/x/zkp/types/genesis.go b/x/zkp/types/genesis.go index 970b9007..521a3e98 100644 --- a/x/zkp/types/genesis.go +++ b/x/zkp/types/genesis.go @@ -1,14 +1,26 @@ package types -// DefaultGenesis returns the default genesis state +import ( + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" +) + func DefaultGenesis() *GenesisState { return &GenesisState{} } -// Validate performs basic genesis state validation returning an error upon any -// failure. func (gs GenesisState) Validate() error { - // this line is used by starport scaffolding # genesis/types/validate + seen := make(map[string]bool) + for i, addr := range gs.TrustedContracts { + if _, err := sdk.AccAddressFromBech32(addr); err != nil { + return fmt.Errorf("invalid trusted contract address at index %d: %w", i, err) + } + if seen[addr] { + return fmt.Errorf("duplicate trusted contract address at index %d: %s", i, addr) + } + seen[addr] = true + } return nil } diff --git a/x/zkp/types/genesis.pb.go b/x/zkp/types/genesis.pb.go index 67c7f6b3..b0e5d685 100644 --- a/x/zkp/types/genesis.pb.go +++ b/x/zkp/types/genesis.pb.go @@ -23,8 +23,8 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -// GenesisState defines the zkp module's genesis state. type GenesisState struct { + TrustedContracts []string `protobuf:"bytes,1,rep,name=trusted_contracts,json=trustedContracts,proto3" json:"trusted_contracts,omitempty"` } func (m *GenesisState) Reset() { *m = GenesisState{} } @@ -100,6 +100,15 @@ func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if len(m.TrustedContracts) > 0 { + for iNdEx := len(m.TrustedContracts) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.TrustedContracts[iNdEx]) + copy(dAtA[i:], m.TrustedContracts[iNdEx]) + i = encodeVarintGenesis(dAtA, i, uint64(len(m.TrustedContracts[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } return len(dAtA) - i, nil } @@ -120,9 +129,22 @@ func (m *GenesisState) Size() (n int) { } var l int _ = l + if len(m.TrustedContracts) > 0 { + for _, s := range m.TrustedContracts { + l = len(s) + n += 1 + l + sovGenesis(uint64(l)) + } + } return n } +func (m *GenesisState) GetTrustedContracts() []string { + if m != nil { + return m.TrustedContracts + } + return nil +} + func sovGenesis(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -158,6 +180,38 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error { return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TrustedContracts", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.TrustedContracts = append(m.TrustedContracts, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipGenesis(dAtA[iNdEx:]) diff --git a/x/zkp/types/keys.go b/x/zkp/types/keys.go index 70acff05..b6daad80 100644 --- a/x/zkp/types/keys.go +++ b/x/zkp/types/keys.go @@ -1,18 +1,25 @@ package types +import ( + storetypes "cosmossdk.io/store/types" +) + const ( - // ModuleName defines the module name ModuleName = "zkp" - - // StoreKey defines the primary module store key - StoreKey = ModuleName - - // MemStoreKey defines the in-memory store key + StoreKey = ModuleName MemStoreKey = "mem_zkp" + + GasVerifyEqualityProof storetypes.Gas = 50_000 + GasVerifyValidityProof storetypes.Gas = 60_000 + GasVerifyWithdrawRangeProof storetypes.Gas = 80_000 + GasVerifyTransferRangeProof storetypes.Gas = 100_000 + GasVerifyTransferProofs storetypes.Gas = 250_000 + GasVerifyWithdrawProofs storetypes.Gas = 150_000 ) var ( - ParamsKey = []byte("p_zkp") + ParamsKey = []byte("p_zkp") + TrustedContractPrefix = []byte("tc/") ) func KeyPrefix(p string) []byte { diff --git a/x/zkp/types/msgs.go b/x/zkp/types/msgs.go new file mode 100644 index 00000000..4b377332 --- /dev/null +++ b/x/zkp/types/msgs.go @@ -0,0 +1,433 @@ +package types + +import ( + "context" + "fmt" + + errorsmod "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + proto "github.com/cosmos/gogoproto/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +var ( + _ sdk.Msg = &MsgAddTrustedContract{} + _ sdk.Msg = &MsgRemoveTrustedContract{} +) + +type MsgAddTrustedContract struct { + Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"` + ContractAddress string `protobuf:"bytes,2,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` +} + +func (m *MsgAddTrustedContract) Reset() { *m = MsgAddTrustedContract{} } +func (m *MsgAddTrustedContract) String() string { return proto.CompactTextString(m) } +func (m *MsgAddTrustedContract) ProtoMessage() {} +func (*MsgAddTrustedContract) Descriptor() ([]byte, []int) { + return fileDescriptor_tx_proto, []int{0} +} + +func (m *MsgAddTrustedContract) ValidateBasic() error { + if _, err := sdk.AccAddressFromBech32(m.Authority); err != nil { + return errorsmod.Wrapf(sdkerrors.ErrInvalidAddress, "invalid authority address (%s)", err) + } + if _, err := sdk.AccAddressFromBech32(m.ContractAddress); err != nil { + return errorsmod.Wrapf(sdkerrors.ErrInvalidAddress, "invalid contract address (%s)", err) + } + return nil +} + +func (m *MsgAddTrustedContract) GetSigners() []sdk.AccAddress { + signer, _ := sdk.AccAddressFromBech32(m.Authority) + return []sdk.AccAddress{signer} +} + +func (m *MsgAddTrustedContract) Marshal() ([]byte, error) { + size := m.Size() + buf := make([]byte, size) + n, err := m.MarshalToSizedBuffer(buf) + if err != nil { + return nil, err + } + return buf[:n], nil +} + +func (m *MsgAddTrustedContract) MarshalTo(data []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(data[:size]) +} + +func (m *MsgAddTrustedContract) MarshalToSizedBuffer(data []byte) (int, error) { + i := len(data) + if len(m.ContractAddress) > 0 { + i -= len(m.ContractAddress) + copy(data[i:], m.ContractAddress) + i = encodeVarint(data, i, uint64(len(m.ContractAddress))) + i-- + data[i] = 0x12 + } + if len(m.Authority) > 0 { + i -= len(m.Authority) + copy(data[i:], m.Authority) + i = encodeVarint(data, i, uint64(len(m.Authority))) + i-- + data[i] = 0x0a + } + return len(data) - i, nil +} + +func (m *MsgAddTrustedContract) Size() int { + n := 0 + if len(m.Authority) > 0 { + n += 1 + len(m.Authority) + sovMsg(uint64(len(m.Authority))) + } + if len(m.ContractAddress) > 0 { + n += 1 + len(m.ContractAddress) + sovMsg(uint64(len(m.ContractAddress))) + } + return n +} + +func (m *MsgAddTrustedContract) Unmarshal(data []byte) error { + l := len(data) + idx := 0 + for idx < l { + preIdx := idx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if idx >= l { + return fmt.Errorf("unexpected EOF") + } + b := data[idx] + idx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType != 2 { + return fmt.Errorf("unexpected wire type %d for field %d", wireType, fieldNum) + } + var strLen uint64 + for shift := uint(0); ; shift += 7 { + if idx >= l { + return fmt.Errorf("unexpected EOF") + } + b := data[idx] + idx++ + strLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + if int(strLen) < 0 || idx+int(strLen) > l { + return fmt.Errorf("invalid string length") + } + switch fieldNum { + case 1: + m.Authority = string(data[idx : idx+int(strLen)]) + case 2: + m.ContractAddress = string(data[idx : idx+int(strLen)]) + default: + _ = preIdx + } + idx += int(strLen) + } + return nil +} + +type MsgAddTrustedContractResponse struct{} + +func (m *MsgAddTrustedContractResponse) Reset() { *m = MsgAddTrustedContractResponse{} } +func (m *MsgAddTrustedContractResponse) String() string { return proto.CompactTextString(m) } +func (m *MsgAddTrustedContractResponse) ProtoMessage() {} +func (*MsgAddTrustedContractResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_tx_proto, []int{1} +} +func (m *MsgAddTrustedContractResponse) Marshal() ([]byte, error) { + return []byte{}, nil +} +func (m *MsgAddTrustedContractResponse) MarshalTo(data []byte) (int, error) { + return 0, nil +} +func (m *MsgAddTrustedContractResponse) MarshalToSizedBuffer(data []byte) (int, error) { + return len(data), nil +} +func (m *MsgAddTrustedContractResponse) Size() int { return 0 } +func (m *MsgAddTrustedContractResponse) Unmarshal(data []byte) error { return nil } + +type MsgRemoveTrustedContract struct { + Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"` + ContractAddress string `protobuf:"bytes,2,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` +} + +func (m *MsgRemoveTrustedContract) Reset() { *m = MsgRemoveTrustedContract{} } +func (m *MsgRemoveTrustedContract) String() string { return proto.CompactTextString(m) } +func (m *MsgRemoveTrustedContract) ProtoMessage() {} +func (*MsgRemoveTrustedContract) Descriptor() ([]byte, []int) { + return fileDescriptor_tx_proto, []int{2} +} + +func (m *MsgRemoveTrustedContract) ValidateBasic() error { + if _, err := sdk.AccAddressFromBech32(m.Authority); err != nil { + return errorsmod.Wrapf(sdkerrors.ErrInvalidAddress, "invalid authority address (%s)", err) + } + if _, err := sdk.AccAddressFromBech32(m.ContractAddress); err != nil { + return errorsmod.Wrapf(sdkerrors.ErrInvalidAddress, "invalid contract address (%s)", err) + } + return nil +} + +func (m *MsgRemoveTrustedContract) GetSigners() []sdk.AccAddress { + signer, _ := sdk.AccAddressFromBech32(m.Authority) + return []sdk.AccAddress{signer} +} + +func (m *MsgRemoveTrustedContract) Marshal() ([]byte, error) { + size := m.Size() + buf := make([]byte, size) + n, err := m.MarshalToSizedBuffer(buf) + if err != nil { + return nil, err + } + return buf[:n], nil +} + +func (m *MsgRemoveTrustedContract) MarshalTo(data []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(data[:size]) +} + +func (m *MsgRemoveTrustedContract) MarshalToSizedBuffer(data []byte) (int, error) { + i := len(data) + if len(m.ContractAddress) > 0 { + i -= len(m.ContractAddress) + copy(data[i:], m.ContractAddress) + i = encodeVarint(data, i, uint64(len(m.ContractAddress))) + i-- + data[i] = 0x12 + } + if len(m.Authority) > 0 { + i -= len(m.Authority) + copy(data[i:], m.Authority) + i = encodeVarint(data, i, uint64(len(m.Authority))) + i-- + data[i] = 0x0a + } + return len(data) - i, nil +} + +func (m *MsgRemoveTrustedContract) Size() int { + n := 0 + if len(m.Authority) > 0 { + n += 1 + len(m.Authority) + sovMsg(uint64(len(m.Authority))) + } + if len(m.ContractAddress) > 0 { + n += 1 + len(m.ContractAddress) + sovMsg(uint64(len(m.ContractAddress))) + } + return n +} + +func (m *MsgRemoveTrustedContract) Unmarshal(data []byte) error { + l := len(data) + idx := 0 + for idx < l { + preIdx := idx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if idx >= l { + return fmt.Errorf("unexpected EOF") + } + b := data[idx] + idx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType != 2 { + return fmt.Errorf("unexpected wire type %d for field %d", wireType, fieldNum) + } + var strLen uint64 + for shift := uint(0); ; shift += 7 { + if idx >= l { + return fmt.Errorf("unexpected EOF") + } + b := data[idx] + idx++ + strLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + if int(strLen) < 0 || idx+int(strLen) > l { + return fmt.Errorf("invalid string length") + } + switch fieldNum { + case 1: + m.Authority = string(data[idx : idx+int(strLen)]) + case 2: + m.ContractAddress = string(data[idx : idx+int(strLen)]) + default: + _ = preIdx + } + idx += int(strLen) + } + return nil +} + +type MsgRemoveTrustedContractResponse struct{} + +func (m *MsgRemoveTrustedContractResponse) Reset() { *m = MsgRemoveTrustedContractResponse{} } +func (m *MsgRemoveTrustedContractResponse) String() string { return proto.CompactTextString(m) } +func (m *MsgRemoveTrustedContractResponse) ProtoMessage() {} +func (*MsgRemoveTrustedContractResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_tx_proto, []int{3} +} +func (m *MsgRemoveTrustedContractResponse) Marshal() ([]byte, error) { + return []byte{}, nil +} +func (m *MsgRemoveTrustedContractResponse) MarshalTo(data []byte) (int, error) { + return 0, nil +} +func (m *MsgRemoveTrustedContractResponse) MarshalToSizedBuffer(data []byte) (int, error) { + return len(data), nil +} +func (m *MsgRemoveTrustedContractResponse) Size() int { return 0 } +func (m *MsgRemoveTrustedContractResponse) Unmarshal(data []byte) error { return nil } + +func init() { + proto.RegisterType((*MsgAddTrustedContract)(nil), "fairyring.zkp.MsgAddTrustedContract") + proto.RegisterType((*MsgAddTrustedContractResponse)(nil), "fairyring.zkp.MsgAddTrustedContractResponse") + proto.RegisterType((*MsgRemoveTrustedContract)(nil), "fairyring.zkp.MsgRemoveTrustedContract") + proto.RegisterType((*MsgRemoveTrustedContractResponse)(nil), "fairyring.zkp.MsgRemoveTrustedContractResponse") + proto.RegisterType((*QueryTrustedContractsRequest)(nil), "fairyring.zkp.QueryTrustedContractsRequest") + proto.RegisterType((*QueryTrustedContractsResponse)(nil), "fairyring.zkp.QueryTrustedContractsResponse") + proto.RegisterFile("fairyring/zkp/tx.proto", fileDescriptor_tx_proto) +} + +var fileDescriptor_tx_proto = []byte{ + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x93, 0xc1, 0x4a, 0xf3, 0x40, + 0x14, 0x85, 0x99, 0xbf, 0xfc, 0x42, 0x2f, 0x28, 0x75, 0xa0, 0x1a, 0x82, 0xd5, 0x12, 0x04, 0x4b, + 0x2d, 0x19, 0xac, 0x3b, 0x5d, 0xa9, 0xe0, 0xae, 0x0b, 0x4b, 0x41, 0x70, 0x23, 0x69, 0x32, 0x4e, + 0x43, 0x4d, 0x27, 0x9d, 0x3b, 0x29, 0x4d, 0x57, 0xe2, 0xc2, 0xe7, 0xe9, 0x5b, 0x15, 0xdf, 0x42, + 0xda, 0x68, 0x8a, 0x69, 0x5a, 0xba, 0x70, 0x15, 0xc8, 0x39, 0x9c, 0x73, 0xf9, 0xee, 0x5c, 0x38, + 0x78, 0x71, 0x7c, 0x15, 0x2b, 0x7f, 0x20, 0xd8, 0xa4, 0x1f, 0x32, 0x3d, 0xb6, 0x43, 0x25, 0xb5, + 0xa4, 0xbb, 0xe9, 0x7f, 0x7b, 0xd2, 0x0f, 0xcd, 0x43, 0x57, 0x62, 0x20, 0x91, 0x05, 0x28, 0xd8, + 0xe8, 0x62, 0xfe, 0x49, 0x7c, 0x56, 0x07, 0xca, 0x2d, 0x14, 0x37, 0x9e, 0xd7, 0x51, 0x11, 0x6a, + 0xee, 0xdd, 0xc9, 0x81, 0x56, 0x8e, 0xab, 0xe9, 0x3e, 0x14, 0x9d, 0x48, 0xf7, 0xa4, 0xf2, 0x75, + 0x6c, 0x90, 0x2a, 0xa9, 0x15, 0xa9, 0x01, 0x25, 0xf7, 0x5b, 0x7e, 0x76, 0x3c, 0x4f, 0x71, 0x44, + 0xe3, 0xdf, 0x5c, 0xb9, 0xda, 0x7b, 0x9f, 0x4d, 0xeb, 0x4b, 0xbf, 0x75, 0x02, 0x95, 0xdc, 0xd4, + 0x36, 0xc7, 0x50, 0x0e, 0x90, 0x5b, 0x8f, 0x60, 0xb4, 0x50, 0xb4, 0x79, 0x20, 0x47, 0xfc, 0x4f, + 0x9b, 0x2d, 0xa8, 0xae, 0x0b, 0x4e, 0xcb, 0x8f, 0xe1, 0xe8, 0x21, 0xe2, 0x2a, 0xce, 0xe8, 0xd8, + 0xe6, 0xc3, 0x88, 0xa3, 0xb6, 0xae, 0xa1, 0xb2, 0x46, 0x4f, 0x02, 0xa8, 0x09, 0x34, 0x3b, 0x0e, + 0x47, 0x83, 0x54, 0x0b, 0xb5, 0x62, 0xf3, 0x93, 0x40, 0xa1, 0x85, 0x82, 0xf6, 0x80, 0xe6, 0x50, + 0x3d, 0xb5, 0x7f, 0xed, 0xc5, 0xce, 0xa5, 0x64, 0x36, 0xb6, 0x71, 0xa5, 0xd3, 0x0c, 0xa1, 0x9c, + 0x0f, 0xf2, 0x6c, 0x35, 0x26, 0xd7, 0x68, 0xb2, 0x2d, 0x8d, 0x3f, 0x95, 0xe6, 0xff, 0xb7, 0xd9, + 0xb4, 0x4e, 0x9a, 0x1f, 0x04, 0xca, 0x59, 0x48, 0x0b, 0x72, 0x34, 0x80, 0x52, 0x56, 0xa0, 0xe7, + 0x99, 0x96, 0x4d, 0x3b, 0x58, 0x41, 0xb0, 0x71, 0x21, 0xb7, 0x8d, 0xa7, 0xba, 0xf0, 0x75, 0x2f, + 0xea, 0xda, 0xae, 0x0c, 0xd8, 0xbd, 0xe3, 0xab, 0xee, 0xab, 0x74, 0xfb, 0x6c, 0x79, 0x1c, 0xe3, + 0xe4, 0x3c, 0xe2, 0x90, 0x63, 0x77, 0x67, 0xf1, 0xf4, 0x2f, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, + 0x07, 0x4c, 0xba, 0xf2, 0x3c, 0x03, 0x00, 0x00, +} + +type MsgServer interface { + AddTrustedContract(context.Context, *MsgAddTrustedContract) (*MsgAddTrustedContractResponse, error) + RemoveTrustedContract(context.Context, *MsgRemoveTrustedContract) (*MsgRemoveTrustedContractResponse, error) +} + +type UnimplementedMsgServer struct{} + +func (*UnimplementedMsgServer) AddTrustedContract(context.Context, *MsgAddTrustedContract) (*MsgAddTrustedContractResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddTrustedContract not implemented") +} +func (*UnimplementedMsgServer) RemoveTrustedContract(context.Context, *MsgRemoveTrustedContract) (*MsgRemoveTrustedContractResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemoveTrustedContract not implemented") +} + +func RegisterMsgServer(s grpc.ServiceRegistrar, srv MsgServer) { + s.RegisterService(&_Msg_serviceDesc, srv) +} + +func _Msg_AddTrustedContract_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgAddTrustedContract) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).AddTrustedContract(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/fairyring.zkp.Msg/AddTrustedContract", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).AddTrustedContract(ctx, req.(*MsgAddTrustedContract)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_RemoveTrustedContract_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgRemoveTrustedContract) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).RemoveTrustedContract(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/fairyring.zkp.Msg/RemoveTrustedContract", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).RemoveTrustedContract(ctx, req.(*MsgRemoveTrustedContract)) + } + return interceptor(ctx, in, info, handler) +} + +var _Msg_serviceDesc = grpc.ServiceDesc{ + ServiceName: "fairyring.zkp.Msg", + HandlerType: (*MsgServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "AddTrustedContract", + Handler: _Msg_AddTrustedContract_Handler, + }, + { + MethodName: "RemoveTrustedContract", + Handler: _Msg_RemoveTrustedContract_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "fairyring/zkp/tx.proto", +} + +func encodeVarint(data []byte, offset int, v uint64) int { + offset -= sovMsg(v) + base := offset + for v >= 1<<7 { + data[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + data[offset] = uint8(v) + return base +} + +func sovMsg(x uint64) int { + n := 0 + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} diff --git a/x/zkp/types/query_trusted.go b/x/zkp/types/query_trusted.go new file mode 100644 index 00000000..feb558f6 --- /dev/null +++ b/x/zkp/types/query_trusted.go @@ -0,0 +1,157 @@ +package types + +import ( + "context" + "fmt" + + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +type QueryTrustedContractsRequest struct{} + +func (m *QueryTrustedContractsRequest) Reset() { *m = QueryTrustedContractsRequest{} } +func (m *QueryTrustedContractsRequest) String() string { return proto.CompactTextString(m) } +func (m *QueryTrustedContractsRequest) ProtoMessage() {} +func (m *QueryTrustedContractsRequest) Marshal() ([]byte, error) { return []byte{}, nil } +func (m *QueryTrustedContractsRequest) MarshalTo(data []byte) (int, error) { return 0, nil } +func (m *QueryTrustedContractsRequest) MarshalToSizedBuffer(data []byte) (int, error) { + return len(data), nil +} +func (m *QueryTrustedContractsRequest) Size() int { return 0 } +func (m *QueryTrustedContractsRequest) Unmarshal([]byte) error { return nil } + +type QueryTrustedContractsResponse struct { + ContractAddresses []string `protobuf:"bytes,1,rep,name=contract_addresses,json=contractAddresses,proto3" json:"contract_addresses,omitempty"` +} + +func (m *QueryTrustedContractsResponse) Reset() { *m = QueryTrustedContractsResponse{} } +func (m *QueryTrustedContractsResponse) String() string { return proto.CompactTextString(m) } +func (m *QueryTrustedContractsResponse) ProtoMessage() {} + +func (m *QueryTrustedContractsResponse) Marshal() ([]byte, error) { + size := m.Size() + buf := make([]byte, size) + n, err := m.MarshalToSizedBuffer(buf) + if err != nil { + return nil, err + } + return buf[:n], nil +} + +func (m *QueryTrustedContractsResponse) MarshalTo(data []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(data[:size]) +} + +func (m *QueryTrustedContractsResponse) MarshalToSizedBuffer(data []byte) (int, error) { + i := len(data) + if len(m.ContractAddresses) > 0 { + for idx := len(m.ContractAddresses) - 1; idx >= 0; idx-- { + i -= len(m.ContractAddresses[idx]) + copy(data[i:], m.ContractAddresses[idx]) + i = encodeVarint(data, i, uint64(len(m.ContractAddresses[idx]))) + i-- + data[i] = 0x0a + } + } + return len(data) - i, nil +} + +func (m *QueryTrustedContractsResponse) Size() int { + n := 0 + for _, s := range m.ContractAddresses { + n += 1 + len(s) + sovMsg(uint64(len(s))) + } + return n +} + +func (m *QueryTrustedContractsResponse) Unmarshal(data []byte) error { + l := len(data) + idx := 0 + for idx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if idx >= l { + return fmt.Errorf("unexpected EOF") + } + b := data[idx] + idx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType != 2 || fieldNum != 1 { + return fmt.Errorf("unexpected field %d wire type %d", fieldNum, wireType) + } + var strLen uint64 + for shift := uint(0); ; shift += 7 { + if idx >= l { + return fmt.Errorf("unexpected EOF") + } + b := data[idx] + idx++ + strLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + if int(strLen) < 0 || idx+int(strLen) > l { + return fmt.Errorf("invalid string length") + } + m.ContractAddresses = append(m.ContractAddresses, string(data[idx:idx+int(strLen)])) + idx += int(strLen) + } + return nil +} + +type TrustedContractsQueryServer interface { + TrustedContracts(context.Context, *QueryTrustedContractsRequest) (*QueryTrustedContractsResponse, error) +} + +type UnimplementedTrustedContractsQueryServer struct{} + +func (*UnimplementedTrustedContractsQueryServer) TrustedContracts(context.Context, *QueryTrustedContractsRequest) (*QueryTrustedContractsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method TrustedContracts not implemented") +} + +func RegisterTrustedContractsQueryServer(s grpc1.Server, srv TrustedContractsQueryServer) { + s.RegisterService(&_TrustedContractsQuery_serviceDesc, srv) +} + +func _TrustedContractsQuery_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryTrustedContractsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TrustedContractsQueryServer).TrustedContracts(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/fairyring.zkp.TrustedContractsQuery/TrustedContracts", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TrustedContractsQueryServer).TrustedContracts(ctx, req.(*QueryTrustedContractsRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _TrustedContractsQuery_serviceDesc = grpc.ServiceDesc{ + ServiceName: "fairyring.zkp.TrustedContractsQuery", + HandlerType: (*TrustedContractsQueryServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "TrustedContracts", + Handler: _TrustedContractsQuery_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "fairyring/zkp/tx.proto", +} From 2eb73f614c9ea38f94327cf59d90e9dd329ba88c Mon Sep 17 00:00:00 2001 From: SetarehGhorshi Date: Tue, 7 Apr 2026 17:36:42 -0400 Subject: [PATCH 06/42] fix: The validate part of the function ValidateAndAppendPoint does not validate. --- x/zkp/verification/common/common.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/x/zkp/verification/common/common.go b/x/zkp/verification/common/common.go index 96ae19fc..030cc9a1 100644 --- a/x/zkp/verification/common/common.go +++ b/x/zkp/verification/common/common.go @@ -144,7 +144,13 @@ func ValidateAndAppendPoint( label []byte, p *CompressedRistretto, ) error { - if p.IsIdentity() { + pt, ok := p.Decompress() + if !ok { + return ErrDeserialization + } + var zero Point + zero.SetZero() + if pt.Equals(&zero) { return ErrDeserialization } t.AppendMessage(label, p[:]) From a0500863b9caa7649eff9cb85f6607a381ece34d Mon Sep 17 00:00:00 2001 From: SetarehGhorshi Date: Wed, 8 Apr 2026 16:39:04 -0400 Subject: [PATCH 07/42] fix: Points are decompressed twice --- x/zkp/verification/common/common.go | 19 +++++-- x/zkp/verification/range/range.go | 85 ++++++++++++----------------- 2 files changed, 48 insertions(+), 56 deletions(-) diff --git a/x/zkp/verification/common/common.go b/x/zkp/verification/common/common.go index 030cc9a1..b3b9665c 100644 --- a/x/zkp/verification/common/common.go +++ b/x/zkp/verification/common/common.go @@ -139,22 +139,31 @@ func AppendPoint(t *merlin.Transcript, label []byte, c *CompressedRistretto) { t.AppendMessage(label, c[:]) } -func ValidateAndAppendPoint( +func ValidateAndAppendPointDecoded( t *merlin.Transcript, label []byte, p *CompressedRistretto, -) error { +) (*Point, error) { pt, ok := p.Decompress() if !ok { - return ErrDeserialization + return nil, ErrDeserialization } var zero Point zero.SetZero() if pt.Equals(&zero) { - return ErrDeserialization + return nil, ErrDeserialization } t.AppendMessage(label, p[:]) - return nil + return pt, nil +} + +func ValidateAndAppendPoint( + t *merlin.Transcript, + label []byte, + p *CompressedRistretto, +) error { + _, err := ValidateAndAppendPointDecoded(t, label, p) + return err } func VartimeMultiScalarMul(scalars []*Scalar, points []*Point) Point { diff --git a/x/zkp/verification/range/range.go b/x/zkp/verification/range/range.go index b70522ca..a5ebcb5e 100644 --- a/x/zkp/verification/range/range.go +++ b/x/zkp/verification/range/range.go @@ -284,29 +284,35 @@ func (g *generatorsChain) nextPoint() Point { func (ipp *InnerProductProof) verificationScalars( n int, t *merlin.Transcript, -) ([]Scalar, []Scalar, []Scalar, error) { +) ([]Scalar, []Scalar, []Scalar, []*Point, []*Point, error) { lgN := len(ipp.LVec) if len(ipp.RVec) != lgN { - return nil, nil, nil, RangeErrVectorLengthMismatch + return nil, nil, nil, nil, nil, RangeErrVectorLengthMismatch } if lgN == 0 || lgN >= 32 { - return nil, nil, nil, RangeErrInvalidBitSize + return nil, nil, nil, nil, nil, RangeErrInvalidBitSize } if n != (1 << lgN) { - return nil, nil, nil, RangeErrInvalidBitSize + return nil, nil, nil, nil, nil, RangeErrInvalidBitSize } rangeProofInnerProductDomainSeparator(t, uint64(n)) challenges := make([]Scalar, 0, lgN) + lPoints := make([]*Point, 0, lgN) + rPoints := make([]*Point, 0, lgN) for i := 0; i < lgN; i++ { - if err := validateAndAppendPointRP(t, []byte("L"), &ipp.LVec[i]); err != nil { - return nil, nil, nil, err + lPoint, err := validateAndAppendPointRPDecoded(t, []byte("L"), &ipp.LVec[i]) + if err != nil { + return nil, nil, nil, nil, nil, err } - if err := validateAndAppendPointRP(t, []byte("R"), &ipp.RVec[i]); err != nil { - return nil, nil, nil, err + rPoint, err := validateAndAppendPointRPDecoded(t, []byte("R"), &ipp.RVec[i]) + if err != nil { + return nil, nil, nil, nil, nil, err } + lPoints = append(lPoints, lPoint) + rPoints = append(rPoints, rPoint) u := challengeScalarRP(t, []byte("u")) challenges = append(challenges, u) } @@ -316,7 +322,7 @@ func (ipp *InnerProductProof) verificationScalars( allInv, err := batchInvertScalars(chInv) if err != nil { - return nil, nil, nil, err + return nil, nil, nil, nil, nil, err } for i := 0; i < lgN; i++ { @@ -344,7 +350,7 @@ func (ipp *InnerProductProof) verificationScalars( s = append(s, prod) } - return chSq, chInvSq, s, nil + return chSq, chInvSq, s, lPoints, rPoints, nil } func canonicalScalarFrom32(b []byte) (Scalar, error) { @@ -498,10 +504,12 @@ func (rp *RangeProof) Verify( rangeProofDomainSeparator(t, uint64(nm)) - if err := validateAndAppendPointRP(t, []byte("A"), &rp.A); err != nil { + A, err := validateAndAppendPointRPDecoded(t, []byte("A"), &rp.A) + if err != nil { return err } - if err := validateAndAppendPointRP(t, []byte("S"), &rp.S); err != nil { + S, err := validateAndAppendPointRPDecoded(t, []byte("S"), &rp.S) + if err != nil { return err } @@ -513,10 +521,12 @@ func (rp *RangeProof) Verify( var minusZ Scalar minusZ.Neg(&z) - if err := validateAndAppendPointRP(t, []byte("T_1"), &rp.T1); err != nil { + T1, err := validateAndAppendPointRPDecoded(t, []byte("T_1"), &rp.T1) + if err != nil { return err } - if err := validateAndAppendPointRP(t, []byte("T_2"), &rp.T2); err != nil { + T2, err := validateAndAppendPointRPDecoded(t, []byte("T_2"), &rp.T2) + if err != nil { return err } @@ -529,7 +539,7 @@ func (rp *RangeProof) Verify( w := challengeScalarRP(t, []byte("w")) _ = challengeScalarRP(t, []byte("c")) - xSq, xInvSq, sVec, err := rp.IPPProof.verificationScalars(nm, t) + xSq, xInvSq, sVec, lPoints, rPoints, err := rp.IPPProof.verificationScalars(nm, t) if err != nil { return err } @@ -676,23 +686,6 @@ func (rp *RangeProof) Verify( points := make([]*Point, 0, len(scalars)) - A, ok := rp.A.Decompress() - if !ok { - return RangeErrMultiscalarMul - } - S, ok := rp.S.Decompress() - if !ok { - return RangeErrMultiscalarMul - } - T1, ok := rp.T1.Decompress() - if !ok { - return RangeErrMultiscalarMul - } - T2, ok := rp.T2.Decompress() - if !ok { - return RangeErrMultiscalarMul - } - points = append(points, A) points = append(points, S) points = append(points, T1) @@ -700,20 +693,8 @@ func (rp *RangeProof) Verify( points = append(points, H) points = append(points, G) - for i := range rp.IPPProof.LVec { - Li, ok := rp.IPPProof.LVec[i].Decompress() - if !ok { - return RangeErrMultiscalarMul - } - points = append(points, Li) - } - for i := range rp.IPPProof.RVec { - Ri, ok := rp.IPPProof.RVec[i].Decompress() - if !ok { - return RangeErrMultiscalarMul - } - points = append(points, Ri) - } + points = append(points, lPoints...) + points = append(points, rPoints...) Gs := bpGens.G(nm) Hs := bpGens.H(nm) @@ -951,16 +932,18 @@ func newTranscriptRange(ctx *BatchedRangeProofContext) *merlin.Transcript { return t } -func validateAndAppendPointRP( + + +func validateAndAppendPointRPDecoded( t *merlin.Transcript, label []byte, c *CompressedRistretto, -) error { - err := common.ValidateAndAppendPoint(t, label, c) +) (*Point, error) { + pt, err := common.ValidateAndAppendPointDecoded(t, label, c) if err != nil { - return RangeErrValidationError + return nil, RangeErrValidationError } - return nil + return pt, nil } func rangeProofInnerProductDomainSeparator(t *merlin.Transcript, n uint64) { From d2fbaf766d927822f989061b5d4e1e46b463490f Mon Sep 17 00:00:00 2001 From: SetarehGhorshi Date: Wed, 8 Apr 2026 18:05:50 -0400 Subject: [PATCH 08/42] fix: VartimeMultiScalarMul silently accepts all proofs on length mismatch --- x/zkp/verification/commitment/commitment.go | 5 ++++- x/zkp/verification/common/common.go | 9 ++++++--- x/zkp/verification/common/errors.go | 2 ++ x/zkp/verification/validity/validity.go | 5 ++++- 4 files changed, 16 insertions(+), 5 deletions(-) diff --git a/x/zkp/verification/commitment/commitment.go b/x/zkp/verification/commitment/commitment.go index 55fe7a03..62f5dfde 100644 --- a/x/zkp/verification/commitment/commitment.go +++ b/x/zkp/verification/commitment/commitment.go @@ -261,7 +261,10 @@ func (ep EqualityProof) Verify( y2, // Y_2 } - check := common.VartimeMultiScalarMul(scalars, points) + check, err := common.VartimeMultiScalarMul(scalars, points) + if err != nil { + return ErrProofAlgebraic + } var id Point id.SetZero() diff --git a/x/zkp/verification/common/common.go b/x/zkp/verification/common/common.go index b3b9665c..3a7e5c8b 100644 --- a/x/zkp/verification/common/common.go +++ b/x/zkp/verification/common/common.go @@ -166,19 +166,22 @@ func ValidateAndAppendPoint( return err } -func VartimeMultiScalarMul(scalars []*Scalar, points []*Point) Point { +func VartimeMultiScalarMul(scalars []*Scalar, points []*Point) (Point, error) { var acc Point acc.SetZero() n := len(scalars) if len(points) != n { - return acc + return acc, ErrVectorLengthMismatch } for i := 0; i < n; i++ { + if scalars[i] == nil || points[i] == nil { + return acc, ErrInvalidInput + } var tmp Point tmp.ScalarMult(points[i], scalars[i]) acc.Add(&acc, &tmp) } - return acc + return acc, nil } func RistrettoPointFromSlice(slice []byte) (CompressedRistretto, error) { diff --git a/x/zkp/verification/common/errors.go b/x/zkp/verification/common/errors.go index bda870d2..30add398 100644 --- a/x/zkp/verification/common/errors.go +++ b/x/zkp/verification/common/errors.go @@ -3,4 +3,6 @@ package common import "errors" var ErrDeserialization = errors.New("deserialization error") +var ErrVectorLengthMismatch = errors.New("vector length mismatch") +var ErrInvalidInput = errors.New("invalid input") diff --git a/x/zkp/verification/validity/validity.go b/x/zkp/verification/validity/validity.go index 4b9a3885..34b17ac9 100644 --- a/x/zkp/verification/validity/validity.go +++ b/x/zkp/verification/validity/validity.go @@ -246,7 +246,10 @@ func (p GroupedCiphertext2HandlesValidityProof) Verify( Y2, // Y_2 } - check := common.VartimeMultiScalarMul(scalars, points) + check, err := common.VartimeMultiScalarMul(scalars, points) + if err != nil { + return ErrValidityInvalidProof + } var id Point id.SetZero() From c62319878a29b6018aca12f61c0661ba35bfce03 Mon Sep 17 00:00:00 2001 From: SetarehGhorshi Date: Wed, 15 Apr 2026 18:03:38 -0400 Subject: [PATCH 09/42] fix: Validity Proof Y2 Not Validated for Identity Point --- x/zkp/verification/validity/validity.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/x/zkp/verification/validity/validity.go b/x/zkp/verification/validity/validity.go index 34b17ac9..5157b863 100644 --- a/x/zkp/verification/validity/validity.go +++ b/x/zkp/verification/validity/validity.go @@ -162,8 +162,9 @@ func (p GroupedCiphertext2HandlesValidityProof) Verify( if err := common.ValidateAndAppendPoint(transcript, []byte("Y_1"), &p.Y1); err != nil { return err } - - common.AppendPoint(transcript, []byte("Y_2"), &p.Y2) + if err := common.ValidateAndAppendPoint(transcript, []byte("Y_2"), &p.Y2); err != nil { + return err + } c := common.ChallengeScalar(transcript, []byte("c")) From 163444ce2d030a26aa856b27e451e707a24803b2 Mon Sep 17 00:00:00 2001 From: SetarehGhorshi Date: Thu, 16 Apr 2026 15:38:45 -0400 Subject: [PATCH 10/42] fix: No Cross-Proof context binding in proof verification --- x/zkp/verification/transferctx/transferctx.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/x/zkp/verification/transferctx/transferctx.go b/x/zkp/verification/transferctx/transferctx.go index a4e07f62..de325f49 100644 --- a/x/zkp/verification/transferctx/transferctx.go +++ b/x/zkp/verification/transferctx/transferctx.go @@ -35,6 +35,10 @@ func VerifyBindings( return errors.New("equality and range proof commitments do not match") } + if !bytes.Equal(vp.Context.GroupedCiphertextLo.Bytes[0:32], rp.Context.Commitments[1].Bytes[:]) { + return errors.New("transfer amount commitment not bound to range proof") + } + gc, err := validity.GroupedElGamalCiphertext2FromBytes(vp.Context.GroupedCiphertextLo.Bytes[:]) if err != nil { return errors.New("failed to deserialize ciphertexts") From 3caf39fa65887e46589e6ce16abf6a683daa0667 Mon Sep 17 00:00:00 2001 From: ap0calypse644 Date: Fri, 17 Apr 2026 17:26:10 +0530 Subject: [PATCH 11/42] fix: Old dependencies with multiple CVEs published --- Makefile | 2 +- go.mod | 34 +- go.sum | 1026 +++++++++++++++++++++++++++++++-- scripts/devnet/prod-config.sh | 2 +- 4 files changed, 1002 insertions(+), 62 deletions(-) mode change 100644 => 100755 scripts/devnet/prod-config.sh diff --git a/Makefile b/Makefile index 4e7c643b..f30decd4 100644 --- a/Makefile +++ b/Makefile @@ -20,7 +20,7 @@ DOCKER := $(shell which docker) BUILDDIR ?= $(CURDIR)/build GO_SYSTEM_VERSION = $(shell go version | cut -c 14- | cut -d' ' -f1 | cut -d'.' -f1-2) -REQUIRE_GO_VERSION = 1.22 +REQUIRE_GO_VERSION = 1.23 export GO111MODULE = on diff --git a/go.mod b/go.mod index 2f665b22..95523aff 100644 --- a/go.mod +++ b/go.mod @@ -1,13 +1,12 @@ module github.com/Fairblock/fairyring -go 1.22.4 +go 1.23.0 replace ( cosmossdk.io/api => github.com/Fairblock/cosmossdk-api v0.7.5 github.com/CosmWasm/wasmd => github.com/Fairblock/wasmd v0.50.6-fairyring github.com/cosmos/cosmos-sdk => github.com/Fairblock/cosmos-sdk v0.50.8-fairyring-2 - // fix upstream GHSA-h395-qcrw-5vmq vulnerability. - github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.7.0 + github.com/gin-gonic/gin => github.com/gin-gonic/gin v1.11.0 github.com/gogo/protobuf => github.com/regen-network/protobuf v1.3.3-alpha.regen.1 // replace broken goleveldb github.com/syndtr/goleveldb => github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 @@ -56,19 +55,18 @@ require ( github.com/spf13/cobra v1.8.1 github.com/spf13/pflag v1.0.5 github.com/spf13/viper v1.19.0 - github.com/stretchr/testify v1.9.0 - golang.org/x/tools v0.22.0 + github.com/stretchr/testify v1.11.1 + golang.org/x/tools v0.34.0 google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 google.golang.org/grpc v1.65.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 - google.golang.org/protobuf v1.34.2 + google.golang.org/protobuf v1.36.9 ) require ( github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/regen-network/cosmos-proto v0.3.1 // indirect github.com/stretchr/objx v0.5.2 // indirect ) @@ -86,7 +84,7 @@ require ( github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect github.com/99designs/keyring v1.2.1 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect - github.com/CosmWasm/wasmvm/v2 v2.0.3 // indirect + github.com/CosmWasm/wasmvm/v2 v2.0.3 github.com/DataDog/datadog-go v3.2.0+incompatible // indirect github.com/DataDog/zstd v1.5.5 // indirect github.com/Microsoft/go-winio v0.6.1 // indirect @@ -96,7 +94,7 @@ require ( github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d // indirect github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 // indirect github.com/bits-and-blooms/bitset v1.8.0 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.3.4 + github.com/btcsuite/btcd/btcec/v2 v2.3.6 github.com/bufbuild/protocompile v0.9.0 // indirect github.com/bufbuild/protovalidate-go v0.6.0 // indirect github.com/bufbuild/protoyaml-go v0.1.8 // indirect @@ -161,7 +159,7 @@ require ( github.com/golang/snappy v0.0.4 // indirect github.com/google/btree v1.1.2 // indirect github.com/google/cel-go v0.20.1 // indirect - github.com/google/go-cmp v0.6.0 // indirect + github.com/google/go-cmp v0.7.0 // indirect github.com/google/go-containerregistry v0.19.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/orderedcode v0.0.1 // indirect @@ -215,7 +213,7 @@ require ( github.com/oklog/run v1.1.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect - github.com/pelletier/go-toml/v2 v2.2.2 // indirect + github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect github.com/pkg/errors v0.9.1 // indirect @@ -258,15 +256,15 @@ require ( go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect - golang.org/x/crypto v0.26.0 + golang.org/x/crypto v0.40.0 golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0 // indirect - golang.org/x/mod v0.18.0 // indirect - golang.org/x/net v0.28.0 // indirect + golang.org/x/mod v0.25.0 // indirect + golang.org/x/net v0.42.0 // indirect golang.org/x/oauth2 v0.21.0 // indirect - golang.org/x/sync v0.8.0 // indirect - golang.org/x/sys v0.23.0 // indirect - golang.org/x/term v0.23.0 // indirect - golang.org/x/text v0.17.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/sys v0.35.0 // indirect + golang.org/x/term v0.33.0 // indirect + golang.org/x/text v0.27.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/api v0.171.0 // indirect google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de // indirect diff --git a/go.sum b/go.sum index 6f36c9e7..e4684472 100644 --- a/go.sum +++ b/go.sum @@ -1,10 +1,13 @@ buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.33.0-20240221180331-f05a6f4403ce.1 h1:0nWhrRcnkgw1kwJ7xibIO8bqfOA7pBzBjGCDBxIHch8= buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.33.0-20240221180331-f05a6f4403ce.1/go.mod h1:Tgn5bgL220vkFOI0KPStlcClPeOJzAv4uT+V8JXGUnw= 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= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= @@ -17,6 +20,7 @@ cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOY cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= @@ -28,28 +32,93 @@ cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+Y cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA= +cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U= cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc= cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU= cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA= +cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM= +cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= +cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= +cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= cloud.google.com/go v0.112.1 h1:uJSeirPke5UNZHIb4SxfZklVSiWWVqW4oXlETwZziwM= cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= +cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= +cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= +cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= +cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o= +cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE= +cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM= +cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ= cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw= cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY= +cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg= +cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ= +cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k= +cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw= cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI= cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4= +cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M= +cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE= +cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE= +cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk= +cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc= +cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8= +cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc= +cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04= +cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8= +cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY= +cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM= +cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc= +cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU= +cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI= +cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8= +cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno= +cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak= +cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84= +cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A= +cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E= cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4= cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0= +cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY= +cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k= cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ= cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk= +cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0= +cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc= +cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI= +cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ= +cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI= +cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08= cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o= cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s= cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0= +cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ= +cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY= +cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo= +cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg= +cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw= cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY= cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw= cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI= +cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= +cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= +cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= +cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= +cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM= +cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU= +cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc= +cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI= +cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss= +cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE= +cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE= +cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g= +cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4= +cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8= +cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM= +cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -57,12 +126,44 @@ cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUM cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA= +cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw= +cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc= +cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E= +cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac= +cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q= +cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU= cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY= cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s= +cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI= +cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y= +cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss= +cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc= cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM= cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI= +cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0= +cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk= +cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q= +cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg= +cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590= +cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8= +cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk= +cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk= +cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE= +cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU= +cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U= +cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA= +cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M= +cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg= +cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s= +cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM= +cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk= +cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA= cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY= cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI= +cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4= +cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI= +cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y= +cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs= cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow= cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM= cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M= @@ -70,120 +171,441 @@ cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU= cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U= cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU= +cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU= +cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE= +cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo= +cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= +cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= +cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= +cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= +cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= +cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY= +cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck= +cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w= +cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg= +cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo= +cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4= +cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM= +cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA= cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I= cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4= +cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI= +cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s= cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0= cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs= cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc= +cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE= +cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM= +cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M= +cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0= +cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8= cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM= cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ= +cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE= cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo= cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE= +cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0= +cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA= +cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE= +cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38= +cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w= +cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8= cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I= cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ= +cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM= +cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA= +cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A= +cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ= +cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs= +cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s= +cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI= +cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo= cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA= +cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM= +cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c= cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo= cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ= +cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g= +cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4= +cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs= +cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww= +cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c= +cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s= +cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI= +cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ= cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4= cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0= cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8= +cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek= +cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0= +cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM= +cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4= +cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE= +cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM= +cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q= +cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4= cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU= cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU= +cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k= +cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4= +cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM= +cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs= cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y= cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg= +cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE= cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk= cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w= +cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc= +cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY= +cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI= +cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8= +cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M= +cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc= +cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw= +cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw= +cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY= +cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w= +cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI= +cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs= +cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg= +cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE= cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk= cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg= +cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY= +cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08= +cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw= +cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA= +cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c= cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM= cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA= +cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w= +cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM= +cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0= +cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60= +cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo= +cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg= cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o= cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A= +cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw= cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0= cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0= +cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E= +cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw= +cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA= +cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI= +cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y= cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc= +cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM= +cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o= +cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo= +cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c= cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY= cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc= +cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc= +cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg= +cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE= +cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= +cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= +cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= cloud.google.com/go/iam v1.1.6 h1:bEa06k05IO4f4uJonbB5iAgKTPpABy1ayxaIZV/GHVc= cloud.google.com/go/iam v1.1.6/go.mod h1:O0zxdPeGBoFdWW3HWmBxJsk0pfvNM/p/qa82rWOGTwI= +cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= +cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= +cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= +cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo= +cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74= +cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM= +cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY= +cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4= +cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs= +cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g= +cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o= +cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE= +cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA= +cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg= +cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0= +cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg= +cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= +cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= +cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= +cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= +cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8= +cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY= cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8= cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08= +cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo= +cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw= +cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M= +cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= +cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= +cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= +cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= +cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= +cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= +cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI= +cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw= +cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY= cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4= cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w= +cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I= cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE= cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM= +cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA= +cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY= +cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM= cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY= cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s= +cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8= +cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI= +cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo= +cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk= +cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= +cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= +cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= +cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= +cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8= +cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E= +cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM= +cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8= +cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4= +cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY= cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ= cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU= +cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k= +cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU= cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY= cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34= +cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA= +cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0= +cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE= +cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ= +cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4= +cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs= +cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI= +cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA= +cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk= +cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ= +cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE= +cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc= +cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc= cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs= cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg= +cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo= +cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw= +cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw= cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E= cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU= +cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70= +cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo= +cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs= cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0= cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA= +cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk= +cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg= +cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE= +cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw= +cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc= cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0= cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI= +cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg= +cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI= +cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0= +cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8= +cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4= +cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg= +cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k= +cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM= cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4= cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o= cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk= cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo= +cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE= +cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U= +cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA= +cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c= cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg= cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4= +cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac= cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg= cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c= +cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs= +cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70= +cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ= cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y= cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A= +cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA= +cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM= +cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ= +cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA= +cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0= +cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots= +cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo= +cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI= +cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU= +cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg= +cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA= cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4= cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY= +cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc= +cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y= +cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14= +cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do= +cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo= +cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM= +cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg= cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s= cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI= +cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk= +cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44= +cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc= +cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc= cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA= +cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4= +cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4= +cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU= cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4= cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0= cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU= +cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q= +cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA= +cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8= +cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0= cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU= cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc= +cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk= +cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk= +cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0= +cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag= +cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU= +cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s= +cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA= +cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc= +cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk= cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs= cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg= +cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4= +cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U= +cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY= +cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s= +cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco= +cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo= +cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc= +cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4= +cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E= +cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU= +cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec= +cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA= +cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4= +cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw= +cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A= +cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= +cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= +cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= +cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= +cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco= +cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0= +cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y= cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc= cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= +cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= +cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= cloud.google.com/go/storage v1.38.0 h1:Az68ZRGlnNTpIBbLjSMIV2BDcwwXYlRlQzis0llkpJg= cloud.google.com/go/storage v1.38.0/go.mod h1:tlUADB0mAb9BgYls9lq+8MGkfzOXuLrnHXlpHmvFJoY= +cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= +cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= +cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= +cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw= cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw= cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g= +cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM= +cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA= +cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c= +cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8= +cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4= +cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc= +cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ= +cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg= +cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM= +cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28= +cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y= +cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA= +cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk= +cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs= +cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg= +cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0= +cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos= +cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk= +cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw= +cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg= +cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk= +cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= +cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ= cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU= cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4= +cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M= +cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU= +cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU= cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0= cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo= cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo= +cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY= +cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E= +cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY= +cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0= +cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE= +cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g= +cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc= +cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY= +cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208= +cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8= +cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY= +cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w= +cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8= +cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes= cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE= cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg= +cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc= +cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A= +cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg= +cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo= +cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ= +cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng= cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0= cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= +cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= +cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= +cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= connectrpc.com/connect v1.15.0 h1:lFdeCbZrVVDydAqwr4xGV2y+ULn+0Z73s5JBj2LikWo= connectrpc.com/connect v1.15.0/go.mod h1:bQmjpDY8xItMnttnurVgOkHUBMRT9cpsNi2O4AjKhmA= connectrpc.com/otelconnect v0.7.0 h1:ZH55ZZtcJOTKWWLy3qmL4Pam4RzRWBJFOqTPyAqCXkY= @@ -218,11 +640,18 @@ cosmossdk.io/x/tx v0.13.3 h1:Ha4mNaHmxBc6RMun9aKuqul8yHiL78EKJQ8g23Zf73g= cosmossdk.io/x/tx v0.13.3/go.mod h1:I8xaHv0rhUdIvIdptKIqzYy27+n2+zBVaxO6fscFhys= cosmossdk.io/x/upgrade v0.1.2 h1:O2FGb0mVSXl7P6BQm9uV3hRVKom1zBLDGhd4G8jysJg= cosmossdk.io/x/upgrade v0.1.2/go.mod h1:P+e4/ZNd8km7lTAX5hC2pXz/042YDcB7gzKTHuY53nc= +dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +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/age v1.1.1 h1:pIpO7l151hCnQ4BdyBujnGP2YlUo0uj6sAVNHGBvXHg= filippo.io/age v1.1.1/go.mod h1:l03SrzDUrBkdBx8+IILdnn2KZysqQdbEBUQ4p3sqEQE= filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= +gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8= +git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg= +git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= github.com/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o= @@ -245,6 +674,7 @@ github.com/Fairblock/cosmossdk-api v0.7.5 h1:2NON/rKYquaTpISPn5sOZTP80a2moKg7YN+ github.com/Fairblock/cosmossdk-api v0.7.5/go.mod h1:IcxpYS5fMemZGqyYtErK7OqvdM0C8kdW3dq8Q/XIG38= github.com/Fairblock/wasmd v0.50.6-fairyring h1:P5bEeEQbyLew8dD/kXP1JSjBB6ersyhORcnuYQp3+nI= github.com/Fairblock/wasmd v0.50.6-fairyring/go.mod h1:f0oj8Oy6bzleydH5ytWMqQD7DCp23b2VKkdsTVmiLrE= +github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= @@ -259,16 +689,29 @@ github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/ github.com/adlio/schema v1.3.3 h1:oBJn8I02PyTB466pZO1UZEn1TV5XLlifBSyMrmHl/1I= github.com/adlio/schema v1.3.3/go.mod h1:1EsRssiv9/Ce2CMzq5DoL7RiMshhuigQxrR4DMV9fHg= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY= +github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM= +github.com/alecthomas/kingpin/v2 v2.3.1/go.mod h1:oYL5vtsvEHZGHxU7DMp32Dvx+qL+ptGn6lWaot2vCNE= +github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= +github.com/alecthomas/kingpin/v2 v2.4.0/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI= github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= +github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0= +github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= +github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= @@ -292,10 +735,13 @@ github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816 h1:41iFGWnSlI2 github.com/bgentry/speakeasy v0.1.1-0.20220910012023-760eaf8b6816/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bits-and-blooms/bitset v1.8.0 h1:FD+XqgOZDUxxZ8hzoBFuV9+cGWY9CslN6d5MS5JVb4c= github.com/bits-and-blooms/bitset v1.8.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8= +github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/btcsuite/btcd v0.22.3 h1:kYNaWFvOw6xvqP0vR20RP1Zq1DVMBxEO8QN5d1/EfNg= github.com/btcsuite/btcd v0.22.3/go.mod h1:wqgTSL29+50LRkmOVknEdmt8ZojIzhuWvgu/iptuN7Y= -github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= -github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= +github.com/btcsuite/btcd/btcec/v2 v2.3.6 h1:IzlsEr9olcSRKB/n7c4351F3xHKxS2lma+1UFGCYd4E= +github.com/btcsuite/btcd/btcec/v2 v2.3.6/go.mod h1:m22FrOAiuxl/tht9wIqAoGHcbnCCaPWyauO8y2LGGtQ= github.com/btcsuite/btcd/btcutil v1.1.6 h1:zFL2+c3Lb9gEgqKNzowKUPQNb8jV7v5Oaodi/AYFd6c= github.com/btcsuite/btcd/btcutil v1.1.6/go.mod h1:9dFymx8HpuLqBnsPELrImQeTQfKBQqzqGbbV3jK55aE= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= @@ -308,8 +754,14 @@ github.com/bufbuild/protovalidate-go v0.6.0 h1:Jgs1kFuZ2LHvvdj8SpCLA1W/+pXS8QSM3 github.com/bufbuild/protovalidate-go v0.6.0/go.mod h1:1LamgoYHZ2NdIQH0XGczGTc6Z8YrTHjcJVmiBaar4t4= github.com/bufbuild/protoyaml-go v0.1.8 h1:X9QDLfl9uEllh4gsXUGqPanZYCOKzd92uniRtW2OnAQ= github.com/bufbuild/protoyaml-go v0.1.8/go.mod h1:R8vE2+l49bSiIExP4VJpxOXleHE+FDzZ6HVxr3cYunw= +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/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ= +github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA= +github.com/bytedance/sonic/loader v0.1.1/go.mod h1:ncP89zfokxS5LZrJxl5z0UJcsk4M4yY2JpfqGeCtNLU= +github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA= +github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= @@ -317,9 +769,13 @@ github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInq github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4= github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s= @@ -339,15 +795,23 @@ github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6D github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w= +github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= +github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= +github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd/v2 v2.0.2 h1:weh8u7Cneje73dDh+2tEVLUvyBc89iwepWCD8b8034E= github.com/cockroachdb/apd/v2 v2.0.2/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= @@ -380,6 +844,7 @@ github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosmos/btcutil v1.0.5 h1:t+ZFcX77LpKtDBhjucvnOH8C2l2ioGsBNEQ3jef8xFk= @@ -461,6 +926,7 @@ github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc= 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/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= github.com/drand/kyber v1.2.0 h1:22SbBxsKbgQnJUoyYKIfG909PhBsj0vtANeu4BX5xgE= github.com/drand/kyber v1.2.0/go.mod h1:6TqFlCc7NGOiNVTF9pF2KcDRfllPd9XOkExuG5Xtwfo= github.com/drand/kyber-bls12381 v0.3.1 h1:KWb8l/zYTP5yrvKTgvhOrk2eNPscbMiUOIeWBnmUxGo= @@ -487,7 +953,12 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.m github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= +github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= +github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= +github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= +github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -499,8 +970,12 @@ github.com/felixge/fgprof v0.9.4 h1:ocDNwMFlnA0NU0zSB3I52xkO4sFXk80VK9lXjLClu88= github.com/felixge/fgprof v0.9.4/go.mod h1:yKl+ERSa++RYOs32d8K6WEXCB4uXdLls4ZaZPpayhMM= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= +github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiDsoyrBGkyDY= github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= @@ -509,18 +984,27 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= +github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= -github.com/gin-gonic/gin v1.7.0 h1:jGB9xAJQ12AIGNB4HguylppmDK1Am9ppF7XnGXXJuoU= -github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY= +github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w= +github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM= +github.com/gin-gonic/gin v1.11.0 h1:OW/6PLjyusp2PPXtyxKHU0RbX6I/l28FTdDlae5ueWk= +github.com/gin-gonic/gin v1.11.0/go.mod h1:+iq/FyxlGzII0KHiBGjuNn4UNENUlKbGlNmc+W50Dls= +github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-chi/chi/v5 v5.0.12 h1:9euLV5sTrTNTRUU9POmDUvfxyj6LAABLUcEWO+JJb4s= github.com/go-chi/chi/v5 v5.0.12/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +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-fonts/dejavu v0.1.0/go.mod h1:4Wt4I4OU2Nq9asgDCteaAaWZOV24E+0/Pwo0gppep4g= +github.com/go-fonts/latin-modern v0.2.0/go.mod h1:rQVLdDMK+mK1xscDwsqM5J8U2jrRa3T0ecnM9pNujks= +github.com/go-fonts/liberation v0.1.1/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/liberation v0.2.0/go.mod h1:K6qoJYypsmfVjWg8KOVDQhLc8UDgIK2HYqyqAO9z7GY= +github.com/go-fonts/stix v0.1.0/go.mod h1:w/c1f0ldAUlJmLBvlbkvVXLAD+tAMqobIIQpmnUIzUY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= @@ -530,11 +1014,15 @@ github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgO github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= +github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-latex/latex v0.0.0-20210118124228-b3d85cf34e07/go.mod h1:CO1AlKB2CSIqUrmQPqA0gdRIlnLEY0gK5JGjh37zN5U= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81/go.mod h1:SX0U8uGpxhq9o2S/CELCSUxEWWAuoCUcVCQWv7G2OCk= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= +github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -542,16 +1030,15 @@ github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= github.com/go-logr/logr v1.4.1/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-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= -github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= -github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= -github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= +github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-pdf/fpdf v0.6.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4= +github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= @@ -563,6 +1050,11 @@ github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6Wezm github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= github.com/gobwas/ws v1.2.1/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= +github.com/goccy/go-json v0.9.11/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 h1:ZpnhV/YsD2/4cESfV5+Hoeu/iUR3ruzNvZ+yQfO03a0= github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= @@ -574,7 +1066,10 @@ github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFG github.com/gogo/googleapis v1.4.1-0.20201022092350-68b0159b7869/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4= github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -583,6 +1078,7 @@ github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4er 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/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= @@ -611,6 +1107,7 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -623,6 +1120,7 @@ github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/cel-go v0.20.1 h1:nDx9r8S3L4pE61eDdt8igGj8rf5kjYR3ILxWIpWNi84= github.com/google/cel-go v0.20.1/go.mod h1:kWcIzTsPX0zmQ+H3TirHstLLf9ep5QTsZBN9u4dOYLg= +github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= @@ -638,10 +1136,13 @@ github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9/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-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/go-containerregistry v0.19.0 h1:uIsMRBV7m/HDkDxE/nXMnv1q+lOOSPlQ/ywc5JbB8Ic= github.com/google/go-containerregistry v0.19.0/go.mod h1:u0qB2l7mvtWVR5kNcbFIhFY1hLbf8eeGapA+vbFDCtQ= +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/gofuzz v0.0.0-20170612174753-24818f796faf/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= @@ -664,6 +1165,7 @@ github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= @@ -673,6 +1175,9 @@ github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8I github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7 h1:y3N7Bm7Y9/CtpiVkw/ZWj6lSlDF3F74SfKwfTCer72Q= github.com/google/pprof v0.0.0-20240227163752-401108e1b7e7/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.0/go.mod h1:OJpEgntRZo8ugHpF9hkoLJbS5dSI20XZeXJ9JVywLlM= +github.com/google/s2a-go v0.1.3/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -683,8 +1188,12 @@ github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+ github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8= github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= +github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +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/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -694,9 +1203,15 @@ github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99 github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= github.com/googleapis/gax-go/v2 v2.5.1/go.mod h1:h6B0KMMFNtI2ddbGJn3T3ZbwkeT6yqEF02fYlzkUCyo= github.com/googleapis/gax-go/v2 v2.6.0/go.mod h1:1mjbznJAPHFpesgE5ucqfYEscaz5kMdcIDwU/6+DDoY= +github.com/googleapis/gax-go/v2 v2.7.0/go.mod h1:TEop28CZZQ2y+c0VxMUmu1lV+fQx57QpBWsYpwqHJx8= +github.com/googleapis/gax-go/v2 v2.7.1/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.8.0/go.mod h1:4orTrqY6hXxxaUL4LHIPl6lGo8vAE38/qKbhSAKP6QI= +github.com/googleapis/gax-go/v2 v2.10.0/go.mod h1:4UOEnMCrxsSqQ940WnTiD6qJ63le2ev3xfyagutxiPw= +github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= github.com/googleapis/gax-go/v2 v2.12.3 h1:5/zPPDvw8Q1SuXjrqrZslrqT7dL/uJT2CQii/cLCKqA= github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= @@ -709,14 +1224,18 @@ github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= 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/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= +github.com/grpc-ecosystem/grpc-gateway v1.5.0/go.mod h1:RSKVYQBd5MCa4OVpNdGskqpgL2+G+NZTnrVHpWWfpdw= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c h1:6rhixN/i8ZofjG1Y75iExal34USq5p+wiN1tpie8IrU= @@ -780,6 +1299,7 @@ github.com/huandu/go-assert v1.1.5/go.mod h1:yOLvuqZwmcHIC5rIzrBhT7D3Q9c3GFnd0Jr github.com/huandu/skiplist v1.2.0 h1:gox56QD77HzSC0w+Ws3MH3iie755GBJU1OER3h5VsYw= github.com/huandu/skiplist v1.2.0/go.mod h1:7v3iFjLcSAzO4fN5B8dvebvo/qsfumiLiDXMrPiHF9w= github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= +github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -794,6 +1314,7 @@ github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLf github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/jdx/go-netrc v1.0.0 h1:QbLMLyCZGj0NA8glAhxUpf1zDg6cxnWgMBbjq40W0gQ= github.com/jdx/go-netrc v1.0.0/go.mod h1:Gh9eFQJnoTNIRHXl2j5bJXA1u84hQWJWgGh569zF3v8= +github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jhump/protoreflect v1.15.6 h1:WMYJbw2Wo+KOWwZFvgY0jMoVHM6i4XIvRs2RcBj5VmI= github.com/jhump/protoreflect v1.15.6/go.mod h1:jCHoyYQIJnaabEYnbGwyo9hUqfyUMTbJw/tAut5t97E= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -811,6 +1332,7 @@ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= @@ -818,44 +1340,62 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/jung-kurt/gofpdf v1.0.0/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kilic/bls12-381 v0.1.0 h1:encrdjqKMEvabVQ7qYOKu1OvhqpK4s47wDYtNiPtlp4= github.com/kilic/bls12-381 v0.1.0/go.mod h1:vDTTHJONJ6G+P2R74EhnyotQDTliQDnFEwhdmfzw1ig= 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/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= +github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= github.com/klauspost/compress v1.15.11/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.9/go.mod h1:rqkxqrZ1EhYM9G+hXH7YdowN5R5RGN6NK4QwQ3WMXF8= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= 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/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w= -github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/linxGnu/grocksdb v1.8.14 h1:HTgyYalNwBSG/1qCQUIott44wU5b2Y9Kr3z7SK5OfGQ= github.com/linxGnu/grocksdb v1.8.14/go.mod h1:QYiYypR2d4v63Wj1adOOfzglnoII0gLj3PNh4fZkcFA= +github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI= +github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= +github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= @@ -874,10 +1414,16 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-sqlite3 v1.14.14/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= +github.com/microcosm-cc/bluemonday v1.0.1/go.mod h1:hsXNsILzKxV+sX77C5b8FSuKF00vh2OMYv+xgHpAMF4= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 h1:hLDRPB66XQT/8+wG9WsDpiCvZf1yKO7sz7scAjSlBa0= github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643/go.mod h1:43+3pMjjKimDBf5Kr4ZFNGbLql1zKkbImw+fZbw3geM= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/minio/highwayhash v1.0.2/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= @@ -919,6 +1465,8 @@ github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzE github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +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/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= @@ -953,6 +1501,7 @@ github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKw github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= +github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8= github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= @@ -967,14 +1516,18 @@ github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0Mw github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM= -github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs= +github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 h1:jik8PHtAIsPlCRJjJzl4udgEf7hawInF9texMeO2jrU= github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= +github.com/phpdave11/gofpdf v1.4.2/go.mod h1:zpO6xFn9yxo3YLyMvW8HcKWVdbNqgIfOOp2dXMnm1mY= +github.com/phpdave11/gofpdi v1.0.12/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= +github.com/phpdave11/gofpdi v1.0.13/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= @@ -987,16 +1540,26 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= +github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= +github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= +github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= +github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= +github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= +github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= github.com/prometheus/client_golang v1.20.1 h1:IMJXHOD6eARkQpxo8KkhgEVFlBNm+nkrFUyGlIu7Na8= github.com/prometheus/client_golang v1.20.1/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= @@ -1005,35 +1568,59 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1: github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w= +github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= 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.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.37.0/go.mod h1:phzohg0JFMnBEFGxTDbfu3QyL5GI8gTQJFhYO5B3mfA= +github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= +github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/procfs v0.0.0-20180725123919-05ee40e3a273/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= +github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0uaxHdg830/4= +github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= +github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= +github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= +github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg= +github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/regen-network/cosmos-proto v0.3.1 h1:rV7iM4SSFAagvy8RiyhiACbWEGotmqzywPxOvwMdxcg= -github.com/regen-network/cosmos-proto v0.3.1/go.mod h1:jO0sVX6a1B36nmE8C9xBFXpNwWejXC7QqCOnH3O0+YM= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= +github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= @@ -1046,6 +1633,8 @@ github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w= +github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= @@ -1055,7 +1644,30 @@ github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0 github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +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.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= @@ -1068,12 +1680,17 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1 github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= +github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= @@ -1112,25 +1729,28 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= +github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= github.com/tendermint/go-amino v0.16.0 h1:GyhmgQKvqF82e2oZeuMSp9JTN0N09emoSZlb2lyGa2E= github.com/tendermint/go-amino v0.16.0/go.mod h1:TQU0M1i/ImAo+tYpZi73AU3V/dKeCoMC9Sphe2ZwGME= github.com/tidwall/btree v1.7.0 h1:L1fkJH/AuEh5zBnnBbmTwQ5Lt+bRJ5A8EWecslvo9iI= github.com/tidwall/btree v1.7.0/go.mod h1:twD9XRA5jj9VUQGELzDO4HPQTNJsoWWfYEL+EUQ2cKY= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= -github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA= +github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4= github.com/ulikunitz/xz v0.5.10/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= @@ -1138,6 +1758,10 @@ github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijb github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/vbatts/tar-split v0.11.5 h1:3bHCTIheBm1qFTcgh9oPu+nNBtX+XJIupG/vacinCts= github.com/vbatts/tar-split v0.11.5/go.mod h1:yZbwRsSeGjusneWgA781EKej9HF8vme8okylkAeNKLk= +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/xhit/go-str2duration v1.2.0/go.mod h1:3cPSlfZlUHVlneIVfePFWcJZsuwf+P1v2SRTV4cUmp4= +github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1145,7 +1769,10 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= +github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= github.com/zondax/hid v0.9.2 h1:WCJFnEDMiqGF64nlZz28E9qLVZ0KSJ7xpc5DLEyma2U= github.com/zondax/hid v0.9.2/go.mod h1:l5wttcP0jwtdLjqjMMWFVEE7d1zO0jvSPA9OPZxWpEM= github.com/zondax/ledger-go v0.14.3 h1:wEpJt2CEcBJ428md/5MgSLsXLBos98sBOyxNmCjfUCw= @@ -1154,6 +1781,7 @@ go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.10 h1:+BqfJTcCzTItrop8mq/lbzL8wSGtj94UO/3U31shqG0= go.etcd.io/bbolt v1.3.10/go.mod h1:bK3UQLPJZly7IlNmV7uVHJDxfe5aK9Ll93e/74Y9oEQ= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= +go.opencensus.io v0.18.0/go.mod h1:vKdFvxhtzZ9onBp9VKHK8z/sRpBMnKAsufL7wlDrCOA= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= @@ -1184,6 +1812,8 @@ go.opentelemetry.io/otel/sdk/metric v1.19.0/go.mod h1:XjG0jQyFJrv2PbMvwND7LwCEhs go.opentelemetry.io/otel/trace v1.27.0 h1:IqYb813p7cmbHk0a5y6pD5JPakbVfftRXABGt5/Rscw= go.opentelemetry.io/otel/trace v1.27.0/go.mod h1:6RiD1hkAprV4/q+yd2ln1HG9GoPx39SuvvstaLBl+l4= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= +go.opentelemetry.io/proto/otlp v0.15.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= +go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= go.opentelemetry.io/proto/otlp v1.2.0 h1:pVeZGk7nXDC9O2hncA6nHldxEjm6LByfA2aN8IOkz94= go.opentelemetry.io/proto/otlp v1.2.0/go.mod h1:gGpR8txAl5M03pDhMC79G6SdqNV26naRm/KDsgaHD8A= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1195,8 +1825,8 @@ go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0 go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= 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.2.0 h1:TaP3xedm7JaAgScZO7tlvlKrqT0p7I6OsdGB5YNSMDU= -go.uber.org/mock v0.2.0/go.mod h1:J0y0rp9L3xiff1+ZBfKxlC1fz2+aO16tw0tsDOixfuM= +go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= +go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= @@ -1208,23 +1838,53 @@ go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= 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/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.20.0 h1:dx1zTU0MAE98U+TQ8BLl7XsJbgze2WnNKF/8tGp/Q6c= +golang.org/x/arch v0.20.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk= +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-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-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-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= +golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +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.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= +golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= +golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U= +golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= +golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= +golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191002040644-a1355ae1e2c3/go.mod h1:NOZ3BPKG0ec/BKJQgnvsSFpcKLM5xXVWnvZS97DWHgE= golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= @@ -1232,10 +1892,23 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= +golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0 h1:985EYyeCOxTpcgOTJpflJUwOeEz0CQOdPt73OzpE9F8= golang.org/x/exp v0.0.0-20240404231335-c0f41cb1a7a0/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI= +golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20190910094157-69e4b8554b2a/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200119044424-58c23975cae1/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200430140353-33d19683fad8/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210216034530-4410531fe030/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20210607152325-775e3b0c77b9/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20210628002857-a66eb6448b8d/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20211028202545-6944b10bf410/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +golang.org/x/image v0.0.0-20220302094943-723b81ca9867/go.mod h1:023OzeP/+EPmXeapQh35lcL3II3LrY8Ic+EFFKVhULM= +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-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -1259,13 +1932,25 @@ golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.5.0/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= +golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= +golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= 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-20181023162649-9b4f9f5ad519/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-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1273,6 +1958,7 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/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-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -1303,12 +1989,17 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= @@ -1319,11 +2010,33 @@ golang.org/x/net v0.0.0-20220617184016-355a448f1bc9/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220909164309-bea034e7d591/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20221012135044-0b7e1fb9d458/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/net v0.4.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE= +golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +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.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= +golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= +golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA= +golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= +golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= 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/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1346,10 +2059,19 @@ golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7Lm golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE= golang.org/x/oauth2 v0.0.0-20220822191816-0ebed06d0094/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20220909003341-f21342109be1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= +golang.org/x/oauth2 v0.0.0-20221006150949-b44042a4b9c1/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783/go.mod h1:h4gKUeWbJ4rQPri7E0u6Gs4e9Ri2zaLxzw5DI5XGrYg= golang.org/x/oauth2 v0.1.0/go.mod h1:G9FE4dLTsbXUu90h/Pf85g4w1D+SSAgR+q46nJZ8M4A= +golang.org/x/oauth2 v0.4.0/go.mod h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec= +golang.org/x/oauth2 v0.5.0/go.mod h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I= +golang.org/x/oauth2 v0.6.0/go.mod h1:ycmewcwgD4Rpr3eZJLSB4Kyyljb3qDh40vJ8STE5HKw= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= +golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= +golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= +golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs= golang.org/x/oauth2 v0.21.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +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= @@ -1363,14 +2085,26 @@ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220819030929-7fc1605a5dde/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/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-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/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-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1378,6 +2112,7 @@ golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-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-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1422,28 +2157,36 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210304124612-50617c2ba197/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1461,17 +2204,59 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220829200755-d48e67d00261/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.4.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.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +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.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= +golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= 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.23.0 h1:F6D4vR+EHoL9/sWAWgAR1H2DcHr4PareCbAaCo1RpuU= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= +golang.org/x/term v0.3.0/go.mod h1:q750SLmJuPmVoN1blW3UFBPREJfb1KmY3vwxfr+nFDA= +golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= +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.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= +golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ= +golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg= +golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1481,18 +2266,39 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc= +golang.org/x/text v0.5.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.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.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= +golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA= +golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= +golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= 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.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20220922220347-f3bd1da661af/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030000716-a0a13e073c7b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= @@ -1506,6 +2312,7 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190927191325-030b2cf1153e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1539,19 +2346,29 @@ golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201124115921-2c860bdd6e78/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= +golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= +golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= 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= @@ -1562,6 +2379,17 @@ golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNq golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= +gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= +gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= +gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= +gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= +gonum.org/v1/plot v0.10.1/go.mod h1:VZW5OlhkL1mysU9vaqNHnsy86inf6Ot+jB3r+BczCEo= +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/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= @@ -1610,11 +2438,25 @@ google.golang.org/api v0.95.0/go.mod h1:eADj+UBuxkh5zlrSntJghuNeg8HwQ1w5lTKkuqaE google.golang.org/api v0.96.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.97.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= google.golang.org/api v0.98.0/go.mod h1:w7wJQLTM+wvQpNf5JyEcBoxK0RH7EDrh/L4qfsuJ13s= +google.golang.org/api v0.99.0/go.mod h1:1YOf74vkVndF7pG6hIHuINsM7eWwpVTAfNMNiL91A08= google.golang.org/api v0.100.0/go.mod h1:ZE3Z2+ZOr87Rx7dqFsdRQkRBk36kDtp/h+QpHbB7a70= +google.golang.org/api v0.102.0/go.mod h1:3VFl6/fzoA+qNuS1N1/VfXY4LjoXN/wzeIp7TweWwGo= +google.golang.org/api v0.103.0/go.mod h1:hGtW6nK1AC+d9si/UBhw8Xli+QMOf6xyNAyJw4qU9w0= +google.golang.org/api v0.106.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.107.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.108.0/go.mod h1:2Ts0XTHNVWxypznxWOYUeI4g3WdP9Pk2Qk58+a/O9MY= +google.golang.org/api v0.110.0/go.mod h1:7FC4Vvx1Mooxh8C5HWjzZHcavuS2f6pmJpZx60ca7iI= +google.golang.org/api v0.111.0/go.mod h1:qtFHvU9mhgTJegR31csQ+rwxyUTHOKFqCKWp1J0fdw0= +google.golang.org/api v0.114.0/go.mod h1:ifYI2ZsFK6/uGddGfAD5BMxlnkBqCmqHSDUVi45N5Yg= +google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjYK+5E= +google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= +google.golang.org/api v0.124.0/go.mod h1:xu2HQurE5gi/3t1aFCvhPD781p0a3p11sdunTJ2BlP4= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= google.golang.org/api v0.171.0 h1:w174hnBPqut76FzW5Qaupt7zY8Kql6fiVjgys4f58sU= google.golang.org/api v0.171.0/go.mod h1:Hnq5AHm4OTMt2BUVjael2CWZFD6vksJdWCWiUAmjC9o= 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/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= @@ -1623,6 +2465,9 @@ google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180831171423-11092d34479b/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-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-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1660,8 +2505,10 @@ google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -1695,6 +2542,7 @@ google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2 google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI= google.golang.org/genproto v0.0.0-20220314164441-57ef72a4c106/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E= +google.golang.org/genproto v0.0.0-20220329172620-7be39ac1afc7/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo= @@ -1727,13 +2575,56 @@ google.golang.org/genproto v0.0.0-20220926220553-6981cbe3cfce/go.mod h1:woMGP53B google.golang.org/genproto v0.0.0-20221010155953-15ba04fc1c0e/go.mod h1:3526vdqwhZAwq4wsRUaVG555sVgsNmIjRtO7t/JH29U= google.golang.org/genproto v0.0.0-20221014173430-6e2ab493f96b/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= google.golang.org/genproto v0.0.0-20221014213838-99cd37c6964a/go.mod h1:1vXfmgAz9N9Jx0QA82PqRVauvCz1SGSz739p0f183jM= +google.golang.org/genproto v0.0.0-20221024153911-1573dae28c9c/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221024183307-1bc688fe9f3e/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= google.golang.org/genproto v0.0.0-20221025140454-527a21cfbd71/go.mod h1:9qHF0xnpdSfF6knlcsnpzUu5y+rpwgbvsyGAZPBMg4s= +google.golang.org/genproto v0.0.0-20221027153422-115e99e71e1c/go.mod h1:CGI5F/G+E5bKwmfYo09AXuVN4dD894kIKUFmVbP2/Fo= +google.golang.org/genproto v0.0.0-20221109142239-94d6d90a7d66/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221114212237-e4508ebdbee1/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221117204609-8f9c96812029/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221118155620-16455021b5e6/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201164419-0e50fba7f41c/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221201204527-e3fa12d562f3/go.mod h1:rZS5c/ZVYMaOGBfO68GWtjOw/eLaZM1X6iVtgjZ+EWg= +google.golang.org/genproto v0.0.0-20221202195650-67e5cbc046fd/go.mod h1:cTsE614GARnxrLsqKREzmNYJACSWWpAWdNMwnD7c2BE= +google.golang.org/genproto v0.0.0-20221227171554-f9683d7f8bef/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230110181048-76db0878b65f/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230112194545-e10362b5ecf9/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230113154510-dbe35b8444a5/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230123190316-2c411cf9d197/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230124163310-31e0e69b6fc2/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230125152338-dcaf20b6aeaa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230127162408-596548ed4efa/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230209215440-0dfe4f8abfcc/go.mod h1:RGgjbofJ8xD9Sq1VVhDM1Vok1vRONV+rg+CjzG4SZKM= +google.golang.org/genproto v0.0.0-20230216225411-c8e22ba71e44/go.mod h1:8B0gmkoRebU8ukX6HP+4wrVQUY1+6PkQ44BSyIlflHA= +google.golang.org/genproto v0.0.0-20230222225845-10f96fb3dbec/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230223222841-637eb2293923/go.mod h1:3Dl5ZL0q0isWJt+FVcfpQyirqemEuLAK/iFvg1UP1Hw= +google.golang.org/genproto v0.0.0-20230303212802-e74f57abe488/go.mod h1:TvhZT5f700eVlTNwND1xoEZQeWTB2RY/65kplwl/bFA= +google.golang.org/genproto v0.0.0-20230306155012-7f2fa6fef1f4/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230320184635-7606e756e683/go.mod h1:NWraEVixdDnqcqQ30jipen1STv2r/n24Wb7twVTGR4s= +google.golang.org/genproto v0.0.0-20230323212658-478b75c54725/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230330154414-c0448cd141ea/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230331144136-dcfb400f0633/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOlWu4KYeJZffbWgBkS1YFobzKbLVfK69pe0Ak= +google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= +google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= +google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de h1:F6qOa9AZTYJXOUEr4jDysRDLrm4PHePlge4v4TGAlxY= google.golang.org/genproto v0.0.0-20240227224415-6ceb2ff114de/go.mod h1:VUhTRKeHn9wwcdrk73nvdC9gF178Tzhmt/qyaFcPLSo= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= +google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= +google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 h1:7whR9kGa5LUwFtpLm2ArCEejtnxlGeLbAyjFY8sGNFw= google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234015-3fc162c6f38a/go.mod h1:xURIpW9ES5+/GZhnV6beoEtxQrnkRGIfP5VQG2tCBLc= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230525234030-28d5490b6b19/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:66JfowdXAEgad5O9NnYcsNPLCPZJD++2L9X0PCMODrA= google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 h1:Zy9XzmMEflZ/MAaA7vNcoebnRAld7FsPW1EeBB7V0m8= google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +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.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= @@ -1766,6 +2657,7 @@ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk= @@ -1775,6 +2667,11 @@ google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACu google.golang.org/grpc v1.49.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= +google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= +google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= +google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= +google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= +google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= @@ -1795,9 +2692,13 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.29.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= +google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= +google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1810,6 +2711,7 @@ gopkg.in/cheggaaa/pb.v1 v1.0.27/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS 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/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= @@ -1832,6 +2734,7 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +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= @@ -1840,14 +2743,53 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= +lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= +modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= +modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= +modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= +modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= +modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= +modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= +modernc.org/libc v0.0.0-20220428101251-2d5f3daf273b/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.16.0/go.mod h1:N4LD6DBE9cf+Dzf9buBlzVJndKr/iJHG97vGLHYnb5A= +modernc.org/libc v1.16.1/go.mod h1:JjJE0eu4yeK7tab2n4S1w8tlWd9MxXLRzheaRnAKymU= +modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= +modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= +modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= +modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= +modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= +modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= +modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= +modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= +modernc.org/sqlite v1.18.1/go.mod h1:6ho+Gow7oX5V+OiOQ6Tr4xeqbx13UZ6t+Fw9IRUG4d4= +modernc.org/strutil v1.1.1/go.mod h1:DE+MQQ/hjKBZS2zNInV5hhcipt5rLPWkmpbGeW5mmdw= +modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= +modernc.org/tcl v1.13.1/go.mod h1:XOLfOwzhkljL4itZkK6T72ckMgvj0BDsnKNdZVUOecw= +modernc.org/token v1.0.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= +modernc.org/z v1.5.1/go.mod h1:eWFB510QWW5Th9YGZT81s+LwvaAs3Q2yr4sP0rmLkv8= nhooyr.io/websocket v1.8.6 h1:s+C3xAMLwGmlI31Nyn/eAehUlZPwfYZu2JXM621Q5/k= nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= pgregory.net/rapid v1.1.0 h1:CMa0sjHSru3puNx+J0MIAuiiEV4N0qj8/cMWGBBCsjw= pgregory.net/rapid v1.1.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= +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= diff --git a/scripts/devnet/prod-config.sh b/scripts/devnet/prod-config.sh old mode 100644 new mode 100755 index 0845363d..3409f5f4 --- a/scripts/devnet/prod-config.sh +++ b/scripts/devnet/prod-config.sh @@ -350,4 +350,4 @@ echo " fairyringclient -> $FRCLIENT_CFG" echo " ShareGenerationClient -> $SGC_CFG" echo " fairyport -> $FP_CFG" echo "" -echo "************************************************************" \ No newline at end of file +echo "************************************************************" From bc437f42d5984aa2993f4833316a1fc4cee62270 Mon Sep 17 00:00:00 2001 From: SetarehGhorshi Date: Thu, 23 Apr 2026 13:57:22 -0400 Subject: [PATCH 12/42] default trusted contract added in devnet script --- scripts/devnet/start.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/scripts/devnet/start.sh b/scripts/devnet/start.sh index 2298755f..d2744368 100755 --- a/scripts/devnet/start.sh +++ b/scripts/devnet/start.sh @@ -20,6 +20,9 @@ KEYSHARER_INVALID_SHARE_PAUSE_THRESHOLD="${KEYSHARER_INVALID_SHARE_PAUSE_THRESHO # Optional override; if empty we'll derive from val1 key (recommended) APP_PRIV_HEX="${APP_PRIV_HEX:-}" +# ZKP module: genesis trusted CosmWasm contract +ZKP_GENESIS_TRUSTED_CONTRACT="${ZKP_GENESIS_TRUSTED_CONTRACT:-fairy14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9stsyf7v}" + # Where to clone/build deps if a binary is missing DEPS_DIR="$(pwd)/.devnet_deps" @@ -374,6 +377,13 @@ else fi fi +# ZKP module: trusted CosmWasm contracts at genesis +if command -v jq &> /dev/null; then + jq --arg addr "$ZKP_GENESIS_TRUSTED_CONTRACT" \ + '.app_state.zkp //= {} | .app_state.zkp.trusted_contracts = [$addr]' \ + $CHAIN_DIR/$CHAINID/config/genesis.json > $CHAIN_DIR/$CHAINID/config/genesis.json.tmp && mv $CHAIN_DIR/$CHAINID/config/genesis.json.tmp $CHAIN_DIR/$CHAINID/config/genesis.json +fi + sed -i -e 's/"trusted_addresses": \[\]/"trusted_addresses": \["'"$VAL1_ADDR"'","'"$RLY1_ADDR"'","'"$WALLET5_ADDR"'"\]/g' $CHAIN_DIR/$CHAINID/config/genesis.json TRUSTED_PARTIES='{"client_id": "07-tendermint-0", "connection_id": "connection-0", "channel_id": "channel-0"}' From a51f7b35bbdd7b999a0fbe32be273f252a328202 Mon Sep 17 00:00:00 2001 From: ap0calypse644 Date: Fri, 24 Apr 2026 07:50:42 +0530 Subject: [PATCH 13/42] enabling anonymous confidential transfer --- api/fairyring/zkp/genesis.pulsar.go | 274 +- api/fairyring/zkp/params.pulsar.go | 575 +++++ api/fairyring/zkp/query.pulsar.go | 1410 ++++++++-- api/fairyring/zkp/query_grpc.pb.go | 37 + api/fairyring/zkp/tx.pulsar.go | 2990 ++++++++++++++++++++++ api/fairyring/zkp/tx_grpc.pb.go | 185 ++ app/zkp.go | 4 - go.mod | 1 + go.sum | 2 + proto/fairyring/zkp/genesis.proto | 9 +- proto/fairyring/zkp/params.proto | 15 + proto/fairyring/zkp/query.proto | 9 + proto/fairyring/zkp/tx.proto | 23 + x/zkp/keeper/keeper.go | 12 +- x/zkp/keeper/msg_server.go | 16 +- x/zkp/keeper/msg_update_params.go | 32 + x/zkp/keeper/params.go | 40 + x/zkp/keeper/query.go | 14 + x/zkp/keeper/query_filtered.go | 7 +- x/zkp/keeper/query_proof_verification.go | 1 - x/zkp/module/autocli.go | 51 + x/zkp/module/genesis.go | 12 +- x/zkp/module/module.go | 4 +- x/zkp/types/codec.go | 4 +- x/zkp/types/genesis.go | 11 +- x/zkp/types/genesis.pb.go | 94 +- x/zkp/types/msgs.go | 433 ---- x/zkp/types/params.go | 62 + x/zkp/types/params.pb.go | 345 +++ x/zkp/types/query.pb.go | 457 +++- x/zkp/types/query.pb.gw.go | 65 + x/zkp/types/query_trusted.go | 157 -- x/zkp/types/tx.pb.go | 1353 ++++++++++ x/zkp/types/types.go | 23 + 34 files changed, 7766 insertions(+), 961 deletions(-) create mode 100644 api/fairyring/zkp/params.pulsar.go create mode 100644 api/fairyring/zkp/tx.pulsar.go create mode 100644 api/fairyring/zkp/tx_grpc.pb.go create mode 100644 proto/fairyring/zkp/params.proto create mode 100644 x/zkp/keeper/msg_update_params.go create mode 100644 x/zkp/keeper/params.go create mode 100644 x/zkp/module/autocli.go delete mode 100644 x/zkp/types/msgs.go create mode 100644 x/zkp/types/params.go create mode 100644 x/zkp/types/params.pb.go delete mode 100644 x/zkp/types/query_trusted.go create mode 100644 x/zkp/types/tx.pb.go diff --git a/api/fairyring/zkp/genesis.pulsar.go b/api/fairyring/zkp/genesis.pulsar.go index 46c95204..000768ed 100644 --- a/api/fairyring/zkp/genesis.pulsar.go +++ b/api/fairyring/zkp/genesis.pulsar.go @@ -2,6 +2,7 @@ package zkp import ( + _ "cosmossdk.io/api/amino" fmt "fmt" runtime "github.com/cosmos/cosmos-proto/runtime" _ "github.com/cosmos/gogoproto/gogoproto" @@ -13,13 +14,63 @@ import ( sync "sync" ) +var _ protoreflect.List = (*_GenesisState_2_list)(nil) + +type _GenesisState_2_list struct { + list *[]string +} + +func (x *_GenesisState_2_list) Len() int { + if x.list == nil { + return 0 + } + return len(*x.list) +} + +func (x *_GenesisState_2_list) Get(i int) protoreflect.Value { + return protoreflect.ValueOfString((*x.list)[i]) +} + +func (x *_GenesisState_2_list) Set(i int, value protoreflect.Value) { + valueUnwrapped := value.String() + concreteValue := valueUnwrapped + (*x.list)[i] = concreteValue +} + +func (x *_GenesisState_2_list) Append(value protoreflect.Value) { + valueUnwrapped := value.String() + concreteValue := valueUnwrapped + *x.list = append(*x.list, concreteValue) +} + +func (x *_GenesisState_2_list) AppendMutable() protoreflect.Value { + panic(fmt.Errorf("AppendMutable can not be called on message GenesisState at list field TrustedContracts as it is not of Message kind")) +} + +func (x *_GenesisState_2_list) Truncate(n int) { + *x.list = (*x.list)[:n] +} + +func (x *_GenesisState_2_list) NewElement() protoreflect.Value { + v := "" + return protoreflect.ValueOfString(v) +} + +func (x *_GenesisState_2_list) IsValid() bool { + return x.list != nil +} + var ( - md_GenesisState protoreflect.MessageDescriptor + md_GenesisState protoreflect.MessageDescriptor + fd_GenesisState_params protoreflect.FieldDescriptor + fd_GenesisState_trusted_contracts protoreflect.FieldDescriptor ) func init() { file_fairyring_zkp_genesis_proto_init() md_GenesisState = File_fairyring_zkp_genesis_proto.Messages().ByName("GenesisState") + fd_GenesisState_params = md_GenesisState.Fields().ByName("params") + fd_GenesisState_trusted_contracts = md_GenesisState.Fields().ByName("trusted_contracts") } var _ protoreflect.Message = (*fastReflection_GenesisState)(nil) @@ -87,6 +138,18 @@ func (x *fastReflection_GenesisState) Interface() protoreflect.ProtoMessage { // While iterating, mutating operations may only be performed // on the current field descriptor. func (x *fastReflection_GenesisState) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Params != nil { + value := protoreflect.ValueOfMessage(x.Params.ProtoReflect()) + if !f(fd_GenesisState_params, value) { + return + } + } + if len(x.TrustedContracts) != 0 { + value := protoreflect.ValueOfList(&_GenesisState_2_list{list: &x.TrustedContracts}) + if !f(fd_GenesisState_trusted_contracts, value) { + return + } + } } // Has reports whether a field is populated. @@ -102,6 +165,10 @@ func (x *fastReflection_GenesisState) Range(f func(protoreflect.FieldDescriptor, // a repeated field is populated if it is non-empty. func (x *fastReflection_GenesisState) Has(fd protoreflect.FieldDescriptor) bool { switch fd.FullName() { + case "fairyring.zkp.GenesisState.params": + return x.Params != nil + case "fairyring.zkp.GenesisState.trusted_contracts": + return len(x.TrustedContracts) != 0 default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.GenesisState")) @@ -118,6 +185,10 @@ func (x *fastReflection_GenesisState) Has(fd protoreflect.FieldDescriptor) bool // Clear is a mutating operation and unsafe for concurrent use. func (x *fastReflection_GenesisState) Clear(fd protoreflect.FieldDescriptor) { switch fd.FullName() { + case "fairyring.zkp.GenesisState.params": + x.Params = nil + case "fairyring.zkp.GenesisState.trusted_contracts": + x.TrustedContracts = nil default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.GenesisState")) @@ -134,6 +205,15 @@ func (x *fastReflection_GenesisState) Clear(fd protoreflect.FieldDescriptor) { // of the value; to obtain a mutable reference, use Mutable. func (x *fastReflection_GenesisState) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { switch descriptor.FullName() { + case "fairyring.zkp.GenesisState.params": + value := x.Params + return protoreflect.ValueOfMessage(value.ProtoReflect()) + case "fairyring.zkp.GenesisState.trusted_contracts": + if len(x.TrustedContracts) == 0 { + return protoreflect.ValueOfList(&_GenesisState_2_list{}) + } + listValue := &_GenesisState_2_list{list: &x.TrustedContracts} + return protoreflect.ValueOfList(listValue) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.GenesisState")) @@ -154,6 +234,12 @@ func (x *fastReflection_GenesisState) Get(descriptor protoreflect.FieldDescripto // Set is a mutating operation and unsafe for concurrent use. func (x *fastReflection_GenesisState) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { switch fd.FullName() { + case "fairyring.zkp.GenesisState.params": + x.Params = value.Message().Interface().(*Params) + case "fairyring.zkp.GenesisState.trusted_contracts": + lv := value.List() + clv := lv.(*_GenesisState_2_list) + x.TrustedContracts = *clv.list default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.GenesisState")) @@ -174,6 +260,17 @@ func (x *fastReflection_GenesisState) Set(fd protoreflect.FieldDescriptor, value // Mutable is a mutating operation and unsafe for concurrent use. func (x *fastReflection_GenesisState) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { switch fd.FullName() { + case "fairyring.zkp.GenesisState.params": + if x.Params == nil { + x.Params = new(Params) + } + return protoreflect.ValueOfMessage(x.Params.ProtoReflect()) + case "fairyring.zkp.GenesisState.trusted_contracts": + if x.TrustedContracts == nil { + x.TrustedContracts = []string{} + } + value := &_GenesisState_2_list{list: &x.TrustedContracts} + return protoreflect.ValueOfList(value) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.GenesisState")) @@ -187,6 +284,12 @@ func (x *fastReflection_GenesisState) Mutable(fd protoreflect.FieldDescriptor) p // For lists, maps, and messages, this returns a new, empty, mutable value. func (x *fastReflection_GenesisState) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { switch fd.FullName() { + case "fairyring.zkp.GenesisState.params": + m := new(Params) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + case "fairyring.zkp.GenesisState.trusted_contracts": + list := []string{} + return protoreflect.ValueOfList(&_GenesisState_2_list{list: &list}) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.GenesisState")) @@ -256,6 +359,16 @@ func (x *fastReflection_GenesisState) ProtoMethods() *protoiface.Methods { var n int var l int _ = l + if x.Params != nil { + l = options.Size(x.Params) + n += 1 + l + runtime.Sov(uint64(l)) + } + if len(x.TrustedContracts) > 0 { + for _, s := range x.TrustedContracts { + l = len(s) + n += 1 + l + runtime.Sov(uint64(l)) + } + } if x.unknownFields != nil { n += len(x.unknownFields) } @@ -285,6 +398,29 @@ func (x *fastReflection_GenesisState) ProtoMethods() *protoiface.Methods { i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } + if len(x.TrustedContracts) > 0 { + for iNdEx := len(x.TrustedContracts) - 1; iNdEx >= 0; iNdEx-- { + i -= len(x.TrustedContracts[iNdEx]) + copy(dAtA[i:], x.TrustedContracts[iNdEx]) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.TrustedContracts[iNdEx]))) + i-- + dAtA[i] = 0x12 + } + } + if x.Params != nil { + encoded, err := options.Marshal(x.Params) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0xa + } if input.Buf != nil { input.Buf = append(input.Buf, dAtA...) } else { @@ -334,6 +470,74 @@ func (x *fastReflection_GenesisState) ProtoMethods() *protoiface.Methods { return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if x.Params == nil { + x.Params = &Params{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Params); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + case 2: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field TrustedContracts", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.TrustedContracts = append(x.TrustedContracts, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := runtime.Skip(dAtA[iNdEx:]) @@ -382,11 +586,13 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// GenesisState defines the zkp module's genesis state. type GenesisState struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + + Params *Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params,omitempty"` + TrustedContracts []string `protobuf:"bytes,2,rep,name=trusted_contracts,json=trustedContracts,proto3" json:"trusted_contracts,omitempty"` } func (x *GenesisState) Reset() { @@ -409,25 +615,48 @@ func (*GenesisState) Descriptor() ([]byte, []int) { return file_fairyring_zkp_genesis_proto_rawDescGZIP(), []int{0} } +func (x *GenesisState) GetParams() *Params { + if x != nil { + return x.Params + } + return nil +} + +func (x *GenesisState) GetTrustedContracts() []string { + if x != nil { + return x.TrustedContracts + } + return nil +} + var File_fairyring_zkp_genesis_proto protoreflect.FileDescriptor var file_fairyring_zkp_genesis_proto_rawDesc = []byte{ 0x0a, 0x1b, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x66, - 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x1a, 0x14, 0x67, 0x6f, - 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x22, 0x0e, 0x0a, 0x0c, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x42, 0x96, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, - 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x42, 0x0c, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, - 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, - 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0xa2, 0x02, 0x03, 0x46, 0x5a, 0x58, 0xaa, 0x02, - 0x0d, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x5a, 0x6b, 0x70, 0xca, 0x02, - 0x0d, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x5a, 0x6b, 0x70, 0xe2, 0x02, - 0x19, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x5a, 0x6b, 0x70, 0x5c, 0x47, - 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x46, 0x61, 0x69, - 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x5a, 0x6b, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x1a, 0x11, 0x61, 0x6d, + 0x69, 0x6e, 0x6f, 0x2f, 0x61, 0x6d, 0x69, 0x6e, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, + 0x1a, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x14, 0x67, 0x6f, 0x67, + 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0x75, 0x0a, 0x0c, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x38, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, + 0x70, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x09, 0xc8, 0xde, 0x1f, 0x00, 0xa8, 0xe7, + 0xb0, 0x2a, 0x01, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x74, + 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x42, 0x96, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, + 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x42, 0x0c, + 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1e, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, + 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0xa2, 0x02, + 0x03, 0x46, 0x5a, 0x58, 0xaa, 0x02, 0x0d, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x5a, 0x6b, 0x70, 0xca, 0x02, 0x0d, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, + 0x5c, 0x5a, 0x6b, 0x70, 0xe2, 0x02, 0x19, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, + 0x5c, 0x5a, 0x6b, 0x70, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0xea, 0x02, 0x0e, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x5a, 0x6b, + 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -445,13 +674,15 @@ func file_fairyring_zkp_genesis_proto_rawDescGZIP() []byte { var file_fairyring_zkp_genesis_proto_msgTypes = make([]protoimpl.MessageInfo, 1) var file_fairyring_zkp_genesis_proto_goTypes = []interface{}{ (*GenesisState)(nil), // 0: fairyring.zkp.GenesisState + (*Params)(nil), // 1: fairyring.zkp.Params } var file_fairyring_zkp_genesis_proto_depIdxs = []int32{ - 0, // [0:0] is the sub-list for method output_type - 0, // [0:0] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name + 1, // 0: fairyring.zkp.GenesisState.params:type_name -> fairyring.zkp.Params + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name } func init() { file_fairyring_zkp_genesis_proto_init() } @@ -459,6 +690,7 @@ func file_fairyring_zkp_genesis_proto_init() { if File_fairyring_zkp_genesis_proto != nil { return } + file_fairyring_zkp_params_proto_init() if !protoimpl.UnsafeEnabled { file_fairyring_zkp_genesis_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GenesisState); i { diff --git a/api/fairyring/zkp/params.pulsar.go b/api/fairyring/zkp/params.pulsar.go new file mode 100644 index 00000000..a5a99e1d --- /dev/null +++ b/api/fairyring/zkp/params.pulsar.go @@ -0,0 +1,575 @@ +// Code generated by protoc-gen-go-pulsar. DO NOT EDIT. +package zkp + +import ( + _ "cosmossdk.io/api/amino" + fmt "fmt" + runtime "github.com/cosmos/cosmos-proto/runtime" + _ "github.com/cosmos/gogoproto/gogoproto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoiface "google.golang.org/protobuf/runtime/protoiface" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + io "io" + reflect "reflect" + sync "sync" +) + +var ( + md_Params protoreflect.MessageDescriptor + fd_Params_authority protoreflect.FieldDescriptor +) + +func init() { + file_fairyring_zkp_params_proto_init() + md_Params = File_fairyring_zkp_params_proto.Messages().ByName("Params") + fd_Params_authority = md_Params.Fields().ByName("authority") +} + +var _ protoreflect.Message = (*fastReflection_Params)(nil) + +type fastReflection_Params Params + +func (x *Params) ProtoReflect() protoreflect.Message { + return (*fastReflection_Params)(x) +} + +func (x *Params) slowProtoReflect() protoreflect.Message { + mi := &file_fairyring_zkp_params_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_Params_messageType fastReflection_Params_messageType +var _ protoreflect.MessageType = fastReflection_Params_messageType{} + +type fastReflection_Params_messageType struct{} + +func (x fastReflection_Params_messageType) Zero() protoreflect.Message { + return (*fastReflection_Params)(nil) +} +func (x fastReflection_Params_messageType) New() protoreflect.Message { + return new(fastReflection_Params) +} +func (x fastReflection_Params_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_Params +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_Params) Descriptor() protoreflect.MessageDescriptor { + return md_Params +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_Params) Type() protoreflect.MessageType { + return _fastReflection_Params_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_Params) New() protoreflect.Message { + return new(fastReflection_Params) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_Params) Interface() protoreflect.ProtoMessage { + return (*Params)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_Params) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Authority != "" { + value := protoreflect.ValueOfString(x.Authority) + if !f(fd_Params_authority, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_Params) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "fairyring.zkp.Params.authority": + return x.Authority != "" + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.Params")) + } + panic(fmt.Errorf("message fairyring.zkp.Params does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_Params) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "fairyring.zkp.Params.authority": + x.Authority = "" + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.Params")) + } + panic(fmt.Errorf("message fairyring.zkp.Params does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_Params) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "fairyring.zkp.Params.authority": + value := x.Authority + return protoreflect.ValueOfString(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.Params")) + } + panic(fmt.Errorf("message fairyring.zkp.Params does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_Params) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "fairyring.zkp.Params.authority": + x.Authority = value.Interface().(string) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.Params")) + } + panic(fmt.Errorf("message fairyring.zkp.Params does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_Params) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "fairyring.zkp.Params.authority": + panic(fmt.Errorf("field authority of message fairyring.zkp.Params is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.Params")) + } + panic(fmt.Errorf("message fairyring.zkp.Params does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_Params) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "fairyring.zkp.Params.authority": + return protoreflect.ValueOfString("") + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.Params")) + } + panic(fmt.Errorf("message fairyring.zkp.Params does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_Params) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in fairyring.zkp.Params", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_Params) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_Params) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_Params) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_Params) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*Params) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + l = len(x.Authority) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*Params) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if len(x.Authority) > 0 { + i -= len(x.Authority) + copy(dAtA[i:], x.Authority) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Authority))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*Params) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: Params: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Authority", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.Authority = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.0 +// protoc (unknown) +// source: fairyring/zkp/params.proto + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Params defines the parameters for the zkp module. +type Params struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"` +} + +func (x *Params) Reset() { + *x = Params{} + if protoimpl.UnsafeEnabled { + mi := &file_fairyring_zkp_params_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Params) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Params) ProtoMessage() {} + +// Deprecated: Use Params.ProtoReflect.Descriptor instead. +func (*Params) Descriptor() ([]byte, []int) { + return file_fairyring_zkp_params_proto_rawDescGZIP(), []int{0} +} + +func (x *Params) GetAuthority() string { + if x != nil { + return x.Authority + } + return "" +} + +var File_fairyring_zkp_params_proto protoreflect.FileDescriptor + +var file_fairyring_zkp_params_proto_rawDesc = []byte{ + 0x0a, 0x1a, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x66, 0x61, + 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x1a, 0x11, 0x61, 0x6d, 0x69, + 0x6e, 0x6f, 0x2f, 0x61, 0x6d, 0x69, 0x6e, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x14, + 0x67, 0x6f, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x67, 0x6f, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x72, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x32, + 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x14, 0xf2, 0xde, 0x1f, 0x10, 0x79, 0x61, 0x6d, 0x6c, 0x3a, 0x22, 0x61, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x74, 0x79, 0x3a, 0x34, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, 0x2b, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x46, 0x61, 0x69, 0x72, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x78, 0x2f, 0x7a, 0x6b, + 0x70, 0x2f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x95, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, + 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x42, 0x0b, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1e, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0xa2, 0x02, 0x03, + 0x46, 0x5a, 0x58, 0xaa, 0x02, 0x0d, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x5a, 0x6b, 0x70, 0xca, 0x02, 0x0d, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x5c, + 0x5a, 0x6b, 0x70, 0xe2, 0x02, 0x19, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x5c, + 0x5a, 0x6b, 0x70, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, + 0x02, 0x0e, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x5a, 0x6b, 0x70, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_fairyring_zkp_params_proto_rawDescOnce sync.Once + file_fairyring_zkp_params_proto_rawDescData = file_fairyring_zkp_params_proto_rawDesc +) + +func file_fairyring_zkp_params_proto_rawDescGZIP() []byte { + file_fairyring_zkp_params_proto_rawDescOnce.Do(func() { + file_fairyring_zkp_params_proto_rawDescData = protoimpl.X.CompressGZIP(file_fairyring_zkp_params_proto_rawDescData) + }) + return file_fairyring_zkp_params_proto_rawDescData +} + +var file_fairyring_zkp_params_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_fairyring_zkp_params_proto_goTypes = []interface{}{ + (*Params)(nil), // 0: fairyring.zkp.Params +} +var file_fairyring_zkp_params_proto_depIdxs = []int32{ + 0, // [0:0] is the sub-list for method output_type + 0, // [0:0] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_fairyring_zkp_params_proto_init() } +func file_fairyring_zkp_params_proto_init() { + if File_fairyring_zkp_params_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_fairyring_zkp_params_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Params); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_fairyring_zkp_params_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_fairyring_zkp_params_proto_goTypes, + DependencyIndexes: file_fairyring_zkp_params_proto_depIdxs, + MessageInfos: file_fairyring_zkp_params_proto_msgTypes, + }.Build() + File_fairyring_zkp_params_proto = out.File + file_fairyring_zkp_params_proto_rawDesc = nil + file_fairyring_zkp_params_proto_goTypes = nil + file_fairyring_zkp_params_proto_depIdxs = nil +} diff --git a/api/fairyring/zkp/query.pulsar.go b/api/fairyring/zkp/query.pulsar.go index c69a25f0..316b34f9 100644 --- a/api/fairyring/zkp/query.pulsar.go +++ b/api/fairyring/zkp/query.pulsar.go @@ -15,6 +15,842 @@ import ( sync "sync" ) +var ( + md_TrustedContractsRequest protoreflect.MessageDescriptor +) + +func init() { + file_fairyring_zkp_query_proto_init() + md_TrustedContractsRequest = File_fairyring_zkp_query_proto.Messages().ByName("TrustedContractsRequest") +} + +var _ protoreflect.Message = (*fastReflection_TrustedContractsRequest)(nil) + +type fastReflection_TrustedContractsRequest TrustedContractsRequest + +func (x *TrustedContractsRequest) ProtoReflect() protoreflect.Message { + return (*fastReflection_TrustedContractsRequest)(x) +} + +func (x *TrustedContractsRequest) slowProtoReflect() protoreflect.Message { + mi := &file_fairyring_zkp_query_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_TrustedContractsRequest_messageType fastReflection_TrustedContractsRequest_messageType +var _ protoreflect.MessageType = fastReflection_TrustedContractsRequest_messageType{} + +type fastReflection_TrustedContractsRequest_messageType struct{} + +func (x fastReflection_TrustedContractsRequest_messageType) Zero() protoreflect.Message { + return (*fastReflection_TrustedContractsRequest)(nil) +} +func (x fastReflection_TrustedContractsRequest_messageType) New() protoreflect.Message { + return new(fastReflection_TrustedContractsRequest) +} +func (x fastReflection_TrustedContractsRequest_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_TrustedContractsRequest +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_TrustedContractsRequest) Descriptor() protoreflect.MessageDescriptor { + return md_TrustedContractsRequest +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_TrustedContractsRequest) Type() protoreflect.MessageType { + return _fastReflection_TrustedContractsRequest_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_TrustedContractsRequest) New() protoreflect.Message { + return new(fastReflection_TrustedContractsRequest) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_TrustedContractsRequest) Interface() protoreflect.ProtoMessage { + return (*TrustedContractsRequest)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_TrustedContractsRequest) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_TrustedContractsRequest) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.TrustedContractsRequest")) + } + panic(fmt.Errorf("message fairyring.zkp.TrustedContractsRequest does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_TrustedContractsRequest) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.TrustedContractsRequest")) + } + panic(fmt.Errorf("message fairyring.zkp.TrustedContractsRequest does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_TrustedContractsRequest) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.TrustedContractsRequest")) + } + panic(fmt.Errorf("message fairyring.zkp.TrustedContractsRequest does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_TrustedContractsRequest) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.TrustedContractsRequest")) + } + panic(fmt.Errorf("message fairyring.zkp.TrustedContractsRequest does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_TrustedContractsRequest) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.TrustedContractsRequest")) + } + panic(fmt.Errorf("message fairyring.zkp.TrustedContractsRequest does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_TrustedContractsRequest) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.TrustedContractsRequest")) + } + panic(fmt.Errorf("message fairyring.zkp.TrustedContractsRequest does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_TrustedContractsRequest) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in fairyring.zkp.TrustedContractsRequest", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_TrustedContractsRequest) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_TrustedContractsRequest) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_TrustedContractsRequest) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_TrustedContractsRequest) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*TrustedContractsRequest) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*TrustedContractsRequest) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*TrustedContractsRequest) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: TrustedContractsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: TrustedContractsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var _ protoreflect.List = (*_TrustedContractsResponse_1_list)(nil) + +type _TrustedContractsResponse_1_list struct { + list *[]string +} + +func (x *_TrustedContractsResponse_1_list) Len() int { + if x.list == nil { + return 0 + } + return len(*x.list) +} + +func (x *_TrustedContractsResponse_1_list) Get(i int) protoreflect.Value { + return protoreflect.ValueOfString((*x.list)[i]) +} + +func (x *_TrustedContractsResponse_1_list) Set(i int, value protoreflect.Value) { + valueUnwrapped := value.String() + concreteValue := valueUnwrapped + (*x.list)[i] = concreteValue +} + +func (x *_TrustedContractsResponse_1_list) Append(value protoreflect.Value) { + valueUnwrapped := value.String() + concreteValue := valueUnwrapped + *x.list = append(*x.list, concreteValue) +} + +func (x *_TrustedContractsResponse_1_list) AppendMutable() protoreflect.Value { + panic(fmt.Errorf("AppendMutable can not be called on message TrustedContractsResponse at list field ContractAddresses as it is not of Message kind")) +} + +func (x *_TrustedContractsResponse_1_list) Truncate(n int) { + *x.list = (*x.list)[:n] +} + +func (x *_TrustedContractsResponse_1_list) NewElement() protoreflect.Value { + v := "" + return protoreflect.ValueOfString(v) +} + +func (x *_TrustedContractsResponse_1_list) IsValid() bool { + return x.list != nil +} + +var ( + md_TrustedContractsResponse protoreflect.MessageDescriptor + fd_TrustedContractsResponse_ContractAddresses protoreflect.FieldDescriptor +) + +func init() { + file_fairyring_zkp_query_proto_init() + md_TrustedContractsResponse = File_fairyring_zkp_query_proto.Messages().ByName("TrustedContractsResponse") + fd_TrustedContractsResponse_ContractAddresses = md_TrustedContractsResponse.Fields().ByName("ContractAddresses") +} + +var _ protoreflect.Message = (*fastReflection_TrustedContractsResponse)(nil) + +type fastReflection_TrustedContractsResponse TrustedContractsResponse + +func (x *TrustedContractsResponse) ProtoReflect() protoreflect.Message { + return (*fastReflection_TrustedContractsResponse)(x) +} + +func (x *TrustedContractsResponse) slowProtoReflect() protoreflect.Message { + mi := &file_fairyring_zkp_query_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_TrustedContractsResponse_messageType fastReflection_TrustedContractsResponse_messageType +var _ protoreflect.MessageType = fastReflection_TrustedContractsResponse_messageType{} + +type fastReflection_TrustedContractsResponse_messageType struct{} + +func (x fastReflection_TrustedContractsResponse_messageType) Zero() protoreflect.Message { + return (*fastReflection_TrustedContractsResponse)(nil) +} +func (x fastReflection_TrustedContractsResponse_messageType) New() protoreflect.Message { + return new(fastReflection_TrustedContractsResponse) +} +func (x fastReflection_TrustedContractsResponse_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_TrustedContractsResponse +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_TrustedContractsResponse) Descriptor() protoreflect.MessageDescriptor { + return md_TrustedContractsResponse +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_TrustedContractsResponse) Type() protoreflect.MessageType { + return _fastReflection_TrustedContractsResponse_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_TrustedContractsResponse) New() protoreflect.Message { + return new(fastReflection_TrustedContractsResponse) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_TrustedContractsResponse) Interface() protoreflect.ProtoMessage { + return (*TrustedContractsResponse)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_TrustedContractsResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if len(x.ContractAddresses) != 0 { + value := protoreflect.ValueOfList(&_TrustedContractsResponse_1_list{list: &x.ContractAddresses}) + if !f(fd_TrustedContractsResponse_ContractAddresses, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_TrustedContractsResponse) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "fairyring.zkp.TrustedContractsResponse.ContractAddresses": + return len(x.ContractAddresses) != 0 + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.TrustedContractsResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.TrustedContractsResponse does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_TrustedContractsResponse) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "fairyring.zkp.TrustedContractsResponse.ContractAddresses": + x.ContractAddresses = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.TrustedContractsResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.TrustedContractsResponse does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_TrustedContractsResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "fairyring.zkp.TrustedContractsResponse.ContractAddresses": + if len(x.ContractAddresses) == 0 { + return protoreflect.ValueOfList(&_TrustedContractsResponse_1_list{}) + } + listValue := &_TrustedContractsResponse_1_list{list: &x.ContractAddresses} + return protoreflect.ValueOfList(listValue) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.TrustedContractsResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.TrustedContractsResponse does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_TrustedContractsResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "fairyring.zkp.TrustedContractsResponse.ContractAddresses": + lv := value.List() + clv := lv.(*_TrustedContractsResponse_1_list) + x.ContractAddresses = *clv.list + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.TrustedContractsResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.TrustedContractsResponse does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_TrustedContractsResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "fairyring.zkp.TrustedContractsResponse.ContractAddresses": + if x.ContractAddresses == nil { + x.ContractAddresses = []string{} + } + value := &_TrustedContractsResponse_1_list{list: &x.ContractAddresses} + return protoreflect.ValueOfList(value) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.TrustedContractsResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.TrustedContractsResponse does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_TrustedContractsResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "fairyring.zkp.TrustedContractsResponse.ContractAddresses": + list := []string{} + return protoreflect.ValueOfList(&_TrustedContractsResponse_1_list{list: &list}) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.TrustedContractsResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.TrustedContractsResponse does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_TrustedContractsResponse) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in fairyring.zkp.TrustedContractsResponse", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_TrustedContractsResponse) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_TrustedContractsResponse) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_TrustedContractsResponse) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_TrustedContractsResponse) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*TrustedContractsResponse) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if len(x.ContractAddresses) > 0 { + for _, s := range x.ContractAddresses { + l = len(s) + n += 1 + l + runtime.Sov(uint64(l)) + } + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*TrustedContractsResponse) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if len(x.ContractAddresses) > 0 { + for iNdEx := len(x.ContractAddresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(x.ContractAddresses[iNdEx]) + copy(dAtA[i:], x.ContractAddresses[iNdEx]) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.ContractAddresses[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*TrustedContractsResponse) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: TrustedContractsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: TrustedContractsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ContractAddresses", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.ContractAddresses = append(x.ContractAddresses, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + var ( md_QueryVerifyWithdrawRangeProofRequest protoreflect.MessageDescriptor fd_QueryVerifyWithdrawRangeProofRequest_proof_data protoreflect.FieldDescriptor @@ -35,7 +871,7 @@ func (x *QueryVerifyWithdrawRangeProofRequest) ProtoReflect() protoreflect.Messa } func (x *QueryVerifyWithdrawRangeProofRequest) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[0] + mi := &file_fairyring_zkp_query_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -459,7 +1295,7 @@ func (x *QueryVerifyWithdrawRangeProofResponse) ProtoReflect() protoreflect.Mess } func (x *QueryVerifyWithdrawRangeProofResponse) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[1] + mi := &file_fairyring_zkp_query_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -931,7 +1767,7 @@ func (x *QueryVerifyTransferRangeProofRequest) ProtoReflect() protoreflect.Messa } func (x *QueryVerifyTransferRangeProofRequest) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[2] + mi := &file_fairyring_zkp_query_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1355,7 +2191,7 @@ func (x *QueryVerifyTransferRangeProofResponse) ProtoReflect() protoreflect.Mess } func (x *QueryVerifyTransferRangeProofResponse) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[3] + mi := &file_fairyring_zkp_query_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1827,7 +2663,7 @@ func (x *QueryVerifyValidityProofRequest) ProtoReflect() protoreflect.Message { } func (x *QueryVerifyValidityProofRequest) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[4] + mi := &file_fairyring_zkp_query_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2251,7 +3087,7 @@ func (x *QueryVerifyValidityProofResponse) ProtoReflect() protoreflect.Message { } func (x *QueryVerifyValidityProofResponse) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[5] + mi := &file_fairyring_zkp_query_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2723,7 +3559,7 @@ func (x *QueryVerifyEqualityProofRequest) ProtoReflect() protoreflect.Message { } func (x *QueryVerifyEqualityProofRequest) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[6] + mi := &file_fairyring_zkp_query_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3147,7 +3983,7 @@ func (x *QueryVerifyEqualityProofResponse) ProtoReflect() protoreflect.Message { } func (x *QueryVerifyEqualityProofResponse) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[7] + mi := &file_fairyring_zkp_query_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3631,7 +4467,7 @@ func (x *QueryVerifyTransferProofsRequest) ProtoReflect() protoreflect.Message { } func (x *QueryVerifyTransferProofsRequest) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[8] + mi := &file_fairyring_zkp_query_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4439,7 +5275,7 @@ func (x *QueryVerifyTransferProofsResponse) ProtoReflect() protoreflect.Message } func (x *QueryVerifyTransferProofsResponse) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[9] + mi := &file_fairyring_zkp_query_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4921,7 +5757,7 @@ func (x *QueryVerifyWithdrawProofsRequest) ProtoReflect() protoreflect.Message { } func (x *QueryVerifyWithdrawProofsRequest) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[10] + mi := &file_fairyring_zkp_query_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5647,7 +6483,7 @@ func (x *QueryVerifyWithdrawProofsResponse) ProtoReflect() protoreflect.Message } func (x *QueryVerifyWithdrawProofsResponse) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[11] + mi := &file_fairyring_zkp_query_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6112,6 +6948,67 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type TrustedContractsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *TrustedContractsRequest) Reset() { + *x = TrustedContractsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_fairyring_zkp_query_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TrustedContractsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TrustedContractsRequest) ProtoMessage() {} + +// Deprecated: Use TrustedContractsRequest.ProtoReflect.Descriptor instead. +func (*TrustedContractsRequest) Descriptor() ([]byte, []int) { + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{0} +} + +type TrustedContractsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ContractAddresses []string `protobuf:"bytes,1,rep,name=ContractAddresses,proto3" json:"ContractAddresses,omitempty"` // List of trusted contract addresses +} + +func (x *TrustedContractsResponse) Reset() { + *x = TrustedContractsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_fairyring_zkp_query_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TrustedContractsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TrustedContractsResponse) ProtoMessage() {} + +// Deprecated: Use TrustedContractsResponse.ProtoReflect.Descriptor instead. +func (*TrustedContractsResponse) Descriptor() ([]byte, []int) { + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{1} +} + +func (x *TrustedContractsResponse) GetContractAddresses() []string { + if x != nil { + return x.ContractAddresses + } + return nil +} + // QueryVerifyWithdrawRangeProofRequest is request type for the Query/VerifyWithdrawRangeProof RPC method. type QueryVerifyWithdrawRangeProofRequest struct { state protoimpl.MessageState @@ -6124,7 +7021,7 @@ type QueryVerifyWithdrawRangeProofRequest struct { func (x *QueryVerifyWithdrawRangeProofRequest) Reset() { *x = QueryVerifyWithdrawRangeProofRequest{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[0] + mi := &file_fairyring_zkp_query_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6138,7 +7035,7 @@ func (*QueryVerifyWithdrawRangeProofRequest) ProtoMessage() {} // Deprecated: Use QueryVerifyWithdrawRangeProofRequest.ProtoReflect.Descriptor instead. func (*QueryVerifyWithdrawRangeProofRequest) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{0} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{2} } func (x *QueryVerifyWithdrawRangeProofRequest) GetProofData() []byte { @@ -6161,7 +7058,7 @@ type QueryVerifyWithdrawRangeProofResponse struct { func (x *QueryVerifyWithdrawRangeProofResponse) Reset() { *x = QueryVerifyWithdrawRangeProofResponse{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[1] + mi := &file_fairyring_zkp_query_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6175,7 +7072,7 @@ func (*QueryVerifyWithdrawRangeProofResponse) ProtoMessage() {} // Deprecated: Use QueryVerifyWithdrawRangeProofResponse.ProtoReflect.Descriptor instead. func (*QueryVerifyWithdrawRangeProofResponse) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{1} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{3} } func (x *QueryVerifyWithdrawRangeProofResponse) GetValid() bool { @@ -6204,7 +7101,7 @@ type QueryVerifyTransferRangeProofRequest struct { func (x *QueryVerifyTransferRangeProofRequest) Reset() { *x = QueryVerifyTransferRangeProofRequest{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[2] + mi := &file_fairyring_zkp_query_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6218,7 +7115,7 @@ func (*QueryVerifyTransferRangeProofRequest) ProtoMessage() {} // Deprecated: Use QueryVerifyTransferRangeProofRequest.ProtoReflect.Descriptor instead. func (*QueryVerifyTransferRangeProofRequest) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{2} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{4} } func (x *QueryVerifyTransferRangeProofRequest) GetProofData() []byte { @@ -6241,7 +7138,7 @@ type QueryVerifyTransferRangeProofResponse struct { func (x *QueryVerifyTransferRangeProofResponse) Reset() { *x = QueryVerifyTransferRangeProofResponse{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[3] + mi := &file_fairyring_zkp_query_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6255,7 +7152,7 @@ func (*QueryVerifyTransferRangeProofResponse) ProtoMessage() {} // Deprecated: Use QueryVerifyTransferRangeProofResponse.ProtoReflect.Descriptor instead. func (*QueryVerifyTransferRangeProofResponse) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{3} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{5} } func (x *QueryVerifyTransferRangeProofResponse) GetValid() bool { @@ -6284,7 +7181,7 @@ type QueryVerifyValidityProofRequest struct { func (x *QueryVerifyValidityProofRequest) Reset() { *x = QueryVerifyValidityProofRequest{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[4] + mi := &file_fairyring_zkp_query_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6298,7 +7195,7 @@ func (*QueryVerifyValidityProofRequest) ProtoMessage() {} // Deprecated: Use QueryVerifyValidityProofRequest.ProtoReflect.Descriptor instead. func (*QueryVerifyValidityProofRequest) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{4} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{6} } func (x *QueryVerifyValidityProofRequest) GetProofData() []byte { @@ -6321,7 +7218,7 @@ type QueryVerifyValidityProofResponse struct { func (x *QueryVerifyValidityProofResponse) Reset() { *x = QueryVerifyValidityProofResponse{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[5] + mi := &file_fairyring_zkp_query_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6335,7 +7232,7 @@ func (*QueryVerifyValidityProofResponse) ProtoMessage() {} // Deprecated: Use QueryVerifyValidityProofResponse.ProtoReflect.Descriptor instead. func (*QueryVerifyValidityProofResponse) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{5} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{7} } func (x *QueryVerifyValidityProofResponse) GetValid() bool { @@ -6364,7 +7261,7 @@ type QueryVerifyEqualityProofRequest struct { func (x *QueryVerifyEqualityProofRequest) Reset() { *x = QueryVerifyEqualityProofRequest{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[6] + mi := &file_fairyring_zkp_query_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6378,7 +7275,7 @@ func (*QueryVerifyEqualityProofRequest) ProtoMessage() {} // Deprecated: Use QueryVerifyEqualityProofRequest.ProtoReflect.Descriptor instead. func (*QueryVerifyEqualityProofRequest) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{6} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{8} } func (x *QueryVerifyEqualityProofRequest) GetProofData() []byte { @@ -6401,7 +7298,7 @@ type QueryVerifyEqualityProofResponse struct { func (x *QueryVerifyEqualityProofResponse) Reset() { *x = QueryVerifyEqualityProofResponse{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[7] + mi := &file_fairyring_zkp_query_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6415,7 +7312,7 @@ func (*QueryVerifyEqualityProofResponse) ProtoMessage() {} // Deprecated: Use QueryVerifyEqualityProofResponse.ProtoReflect.Descriptor instead. func (*QueryVerifyEqualityProofResponse) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{7} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{9} } func (x *QueryVerifyEqualityProofResponse) GetValid() bool { @@ -6452,7 +7349,7 @@ type QueryVerifyTransferProofsRequest struct { func (x *QueryVerifyTransferProofsRequest) Reset() { *x = QueryVerifyTransferProofsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[8] + mi := &file_fairyring_zkp_query_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6466,7 +7363,7 @@ func (*QueryVerifyTransferProofsRequest) ProtoMessage() {} // Deprecated: Use QueryVerifyTransferProofsRequest.ProtoReflect.Descriptor instead. func (*QueryVerifyTransferProofsRequest) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{8} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{10} } func (x *QueryVerifyTransferProofsRequest) GetEqualityProofData() []byte { @@ -6531,7 +7428,7 @@ type QueryVerifyTransferProofsResponse struct { func (x *QueryVerifyTransferProofsResponse) Reset() { *x = QueryVerifyTransferProofsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[9] + mi := &file_fairyring_zkp_query_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6545,7 +7442,7 @@ func (*QueryVerifyTransferProofsResponse) ProtoMessage() {} // Deprecated: Use QueryVerifyTransferProofsResponse.ProtoReflect.Descriptor instead. func (*QueryVerifyTransferProofsResponse) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{9} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{11} } func (x *QueryVerifyTransferProofsResponse) GetValid() bool { @@ -6580,7 +7477,7 @@ type QueryVerifyWithdrawProofsRequest struct { func (x *QueryVerifyWithdrawProofsRequest) Reset() { *x = QueryVerifyWithdrawProofsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[10] + mi := &file_fairyring_zkp_query_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6594,7 +7491,7 @@ func (*QueryVerifyWithdrawProofsRequest) ProtoMessage() {} // Deprecated: Use QueryVerifyWithdrawProofsRequest.ProtoReflect.Descriptor instead. func (*QueryVerifyWithdrawProofsRequest) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{10} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{12} } func (x *QueryVerifyWithdrawProofsRequest) GetEqualityProofData() []byte { @@ -6652,7 +7549,7 @@ type QueryVerifyWithdrawProofsResponse struct { func (x *QueryVerifyWithdrawProofsResponse) Reset() { *x = QueryVerifyWithdrawProofsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[11] + mi := &file_fairyring_zkp_query_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6666,7 +7563,7 @@ func (*QueryVerifyWithdrawProofsResponse) ProtoMessage() {} // Deprecated: Use QueryVerifyWithdrawProofsResponse.ProtoReflect.Descriptor instead. func (*QueryVerifyWithdrawProofsResponse) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{11} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{13} } func (x *QueryVerifyWithdrawProofsResponse) GetValid() bool { @@ -6693,174 +7590,189 @@ var file_fairyring_zkp_query_proto_rawDesc = []byte{ 0x6f, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x22, 0x45, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, - 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x22, 0x53, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, - 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x45, 0x0a, - 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6f, 0x66, - 0x44, 0x61, 0x74, 0x61, 0x22, 0x53, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x40, 0x0a, 0x1f, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x22, 0x4e, 0x0a, 0x20, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x69, - 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x40, 0x0a, 0x1f, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, - 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, + 0x6f, 0x22, 0x19, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x61, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x48, 0x0a, 0x18, + 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x61, 0x63, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x11, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x45, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x22, 0x4e, 0x0a, - 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, 0x71, 0x75, 0x61, - 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xf0, 0x02, - 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x11, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6f, - 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x13, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x0d, - 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, - 0x79, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x70, - 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x72, 0x65, 0x63, - 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x3c, 0x0a, 0x1a, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x18, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x68, 0x61, - 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x14, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x22, 0x4f, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x22, 0xa6, 0x02, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x69, - 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x11, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, - 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, - 0x79, 0x12, 0x33, 0x0a, 0x15, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x5f, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x14, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, - 0x74, 0x65, 0x78, 0x74, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x10, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x48, 0x61, 0x6e, - 0x64, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, - 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x65, 0x78, 0x70, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x22, 0x4f, 0x0a, 0x21, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, - 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x32, 0xb5, 0x08, 0x0a, 0x05, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0xbc, 0x01, 0x0a, 0x18, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, - 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x12, 0x33, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, - 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, - 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, + 0x28, 0x0c, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x22, 0x53, 0x0a, + 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, + 0x64, 0x72, 0x61, 0x77, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0x45, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, + 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x22, 0x53, 0x0a, 0x25, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x40, + 0x0a, 0x1f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, + 0x22, 0x4e, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0x40, 0x0a, 0x1f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, + 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, + 0x74, 0x61, 0x22, 0x4e, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x22, 0xf0, 0x02, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x65, 0x71, 0x75, 0x61, 0x6c, + 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x2e, 0x0a, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, + 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x70, 0x75, 0x62, 0x6b, + 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, + 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0f, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6b, 0x65, + 0x79, 0x12, 0x3c, 0x0a, 0x1a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x18, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x34, 0x0a, 0x16, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x48, + 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x4f, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa6, 0x02, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x65, + 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x69, + 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x12, 0x28, 0x0a, 0x10, 0x72, + 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x70, 0x75, + 0x62, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, + 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x15, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, + 0x74, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x14, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, + 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x63, + 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, + 0x78, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0d, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x22, + 0x4f, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, + 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x32, 0xc5, 0x09, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0xbc, 0x01, 0x0a, 0x18, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x33, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x3a, 0x01, 0x2a, 0x22, 0x2a, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, - 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, - 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x12, 0xbc, 0x01, 0x0a, 0x18, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x12, 0x33, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, - 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x66, + 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x3a, 0x01, 0x2a, 0x22, 0x2a, 0x2f, + 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0xbc, 0x01, 0x0a, 0x18, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x33, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x2f, 0x3a, 0x01, 0x2a, 0x22, 0x2a, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, - 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x74, - 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x72, - 0x6f, 0x6f, 0x66, 0x12, 0xa7, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2e, 0x2e, 0x66, 0x61, - 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x66, 0x61, + 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, - 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0xa7, 0x01, - 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2e, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, - 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, + 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x3a, 0x01, 0x2a, 0x22, 0x2a, 0x2f, 0x66, + 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0xa7, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x12, 0x2e, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x2f, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x66, + 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, + 0x6f, 0x66, 0x12, 0xa7, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, 0x71, 0x75, + 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2e, 0x2e, 0x66, 0x61, 0x69, + 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x66, 0x61, 0x69, + 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, + 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x65, 0x71, + 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0xab, 0x01, 0x0a, + 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x2f, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, - 0x2a, 0x22, 0x24, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, - 0x70, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, - 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0xab, 0x01, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, + 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, + 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, - 0x12, 0x2f, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x30, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, - 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x01, 0x2a, 0x22, 0x25, - 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x70, - 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0xab, 0x01, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, - 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x2f, - 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, - 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x30, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, - 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x01, 0x2a, 0x22, 0x25, 0x2f, 0x66, - 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x73, 0x42, 0x94, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x61, 0x69, 0x72, - 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x42, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, - 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, - 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0xa2, 0x02, 0x03, 0x46, 0x5a, 0x58, 0xaa, 0x02, 0x0d, - 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x5a, 0x6b, 0x70, 0xca, 0x02, 0x0d, - 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x5a, 0x6b, 0x70, 0xe2, 0x02, 0x19, - 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x5a, 0x6b, 0x70, 0x5c, 0x47, 0x50, - 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x46, 0x61, 0x69, 0x72, - 0x79, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x5a, 0x6b, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, + 0x3a, 0x01, 0x2a, 0x22, 0x25, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, + 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0xab, 0x01, 0x0a, 0x14, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x73, 0x12, 0x2f, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, + 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, + 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x01, + 0x2a, 0x22, 0x25, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, + 0x70, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, + 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x8d, 0x01, 0x0a, 0x10, 0x54, 0x72, 0x75, + 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x12, 0x26, 0x2e, + 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x54, 0x72, + 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, + 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x42, 0x94, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, + 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x42, 0x0a, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1e, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, + 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0xa2, 0x02, 0x03, 0x46, + 0x5a, 0x58, 0xaa, 0x02, 0x0d, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x5a, + 0x6b, 0x70, 0xca, 0x02, 0x0d, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x5a, + 0x6b, 0x70, 0xe2, 0x02, 0x19, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x5a, + 0x6b, 0x70, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, + 0x0e, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x5a, 0x6b, 0x70, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -6875,36 +7787,40 @@ func file_fairyring_zkp_query_proto_rawDescGZIP() []byte { return file_fairyring_zkp_query_proto_rawDescData } -var file_fairyring_zkp_query_proto_msgTypes = make([]protoimpl.MessageInfo, 12) +var file_fairyring_zkp_query_proto_msgTypes = make([]protoimpl.MessageInfo, 14) var file_fairyring_zkp_query_proto_goTypes = []interface{}{ - (*QueryVerifyWithdrawRangeProofRequest)(nil), // 0: fairyring.zkp.QueryVerifyWithdrawRangeProofRequest - (*QueryVerifyWithdrawRangeProofResponse)(nil), // 1: fairyring.zkp.QueryVerifyWithdrawRangeProofResponse - (*QueryVerifyTransferRangeProofRequest)(nil), // 2: fairyring.zkp.QueryVerifyTransferRangeProofRequest - (*QueryVerifyTransferRangeProofResponse)(nil), // 3: fairyring.zkp.QueryVerifyTransferRangeProofResponse - (*QueryVerifyValidityProofRequest)(nil), // 4: fairyring.zkp.QueryVerifyValidityProofRequest - (*QueryVerifyValidityProofResponse)(nil), // 5: fairyring.zkp.QueryVerifyValidityProofResponse - (*QueryVerifyEqualityProofRequest)(nil), // 6: fairyring.zkp.QueryVerifyEqualityProofRequest - (*QueryVerifyEqualityProofResponse)(nil), // 7: fairyring.zkp.QueryVerifyEqualityProofResponse - (*QueryVerifyTransferProofsRequest)(nil), // 8: fairyring.zkp.QueryVerifyTransferProofsRequest - (*QueryVerifyTransferProofsResponse)(nil), // 9: fairyring.zkp.QueryVerifyTransferProofsResponse - (*QueryVerifyWithdrawProofsRequest)(nil), // 10: fairyring.zkp.QueryVerifyWithdrawProofsRequest - (*QueryVerifyWithdrawProofsResponse)(nil), // 11: fairyring.zkp.QueryVerifyWithdrawProofsResponse + (*TrustedContractsRequest)(nil), // 0: fairyring.zkp.TrustedContractsRequest + (*TrustedContractsResponse)(nil), // 1: fairyring.zkp.TrustedContractsResponse + (*QueryVerifyWithdrawRangeProofRequest)(nil), // 2: fairyring.zkp.QueryVerifyWithdrawRangeProofRequest + (*QueryVerifyWithdrawRangeProofResponse)(nil), // 3: fairyring.zkp.QueryVerifyWithdrawRangeProofResponse + (*QueryVerifyTransferRangeProofRequest)(nil), // 4: fairyring.zkp.QueryVerifyTransferRangeProofRequest + (*QueryVerifyTransferRangeProofResponse)(nil), // 5: fairyring.zkp.QueryVerifyTransferRangeProofResponse + (*QueryVerifyValidityProofRequest)(nil), // 6: fairyring.zkp.QueryVerifyValidityProofRequest + (*QueryVerifyValidityProofResponse)(nil), // 7: fairyring.zkp.QueryVerifyValidityProofResponse + (*QueryVerifyEqualityProofRequest)(nil), // 8: fairyring.zkp.QueryVerifyEqualityProofRequest + (*QueryVerifyEqualityProofResponse)(nil), // 9: fairyring.zkp.QueryVerifyEqualityProofResponse + (*QueryVerifyTransferProofsRequest)(nil), // 10: fairyring.zkp.QueryVerifyTransferProofsRequest + (*QueryVerifyTransferProofsResponse)(nil), // 11: fairyring.zkp.QueryVerifyTransferProofsResponse + (*QueryVerifyWithdrawProofsRequest)(nil), // 12: fairyring.zkp.QueryVerifyWithdrawProofsRequest + (*QueryVerifyWithdrawProofsResponse)(nil), // 13: fairyring.zkp.QueryVerifyWithdrawProofsResponse } var file_fairyring_zkp_query_proto_depIdxs = []int32{ - 0, // 0: fairyring.zkp.Query.VerifyWithdrawRangeProof:input_type -> fairyring.zkp.QueryVerifyWithdrawRangeProofRequest - 2, // 1: fairyring.zkp.Query.VerifyTransferRangeProof:input_type -> fairyring.zkp.QueryVerifyTransferRangeProofRequest - 4, // 2: fairyring.zkp.Query.VerifyValidityProof:input_type -> fairyring.zkp.QueryVerifyValidityProofRequest - 6, // 3: fairyring.zkp.Query.VerifyEqualityProof:input_type -> fairyring.zkp.QueryVerifyEqualityProofRequest - 8, // 4: fairyring.zkp.Query.VerifyTransferProofs:input_type -> fairyring.zkp.QueryVerifyTransferProofsRequest - 10, // 5: fairyring.zkp.Query.VerifyWithdrawProofs:input_type -> fairyring.zkp.QueryVerifyWithdrawProofsRequest - 1, // 6: fairyring.zkp.Query.VerifyWithdrawRangeProof:output_type -> fairyring.zkp.QueryVerifyWithdrawRangeProofResponse - 3, // 7: fairyring.zkp.Query.VerifyTransferRangeProof:output_type -> fairyring.zkp.QueryVerifyTransferRangeProofResponse - 5, // 8: fairyring.zkp.Query.VerifyValidityProof:output_type -> fairyring.zkp.QueryVerifyValidityProofResponse - 7, // 9: fairyring.zkp.Query.VerifyEqualityProof:output_type -> fairyring.zkp.QueryVerifyEqualityProofResponse - 9, // 10: fairyring.zkp.Query.VerifyTransferProofs:output_type -> fairyring.zkp.QueryVerifyTransferProofsResponse - 11, // 11: fairyring.zkp.Query.VerifyWithdrawProofs:output_type -> fairyring.zkp.QueryVerifyWithdrawProofsResponse - 6, // [6:12] is the sub-list for method output_type - 0, // [0:6] is the sub-list for method input_type + 2, // 0: fairyring.zkp.Query.VerifyWithdrawRangeProof:input_type -> fairyring.zkp.QueryVerifyWithdrawRangeProofRequest + 4, // 1: fairyring.zkp.Query.VerifyTransferRangeProof:input_type -> fairyring.zkp.QueryVerifyTransferRangeProofRequest + 6, // 2: fairyring.zkp.Query.VerifyValidityProof:input_type -> fairyring.zkp.QueryVerifyValidityProofRequest + 8, // 3: fairyring.zkp.Query.VerifyEqualityProof:input_type -> fairyring.zkp.QueryVerifyEqualityProofRequest + 10, // 4: fairyring.zkp.Query.VerifyTransferProofs:input_type -> fairyring.zkp.QueryVerifyTransferProofsRequest + 12, // 5: fairyring.zkp.Query.VerifyWithdrawProofs:input_type -> fairyring.zkp.QueryVerifyWithdrawProofsRequest + 0, // 6: fairyring.zkp.Query.TrustedContracts:input_type -> fairyring.zkp.TrustedContractsRequest + 3, // 7: fairyring.zkp.Query.VerifyWithdrawRangeProof:output_type -> fairyring.zkp.QueryVerifyWithdrawRangeProofResponse + 5, // 8: fairyring.zkp.Query.VerifyTransferRangeProof:output_type -> fairyring.zkp.QueryVerifyTransferRangeProofResponse + 7, // 9: fairyring.zkp.Query.VerifyValidityProof:output_type -> fairyring.zkp.QueryVerifyValidityProofResponse + 9, // 10: fairyring.zkp.Query.VerifyEqualityProof:output_type -> fairyring.zkp.QueryVerifyEqualityProofResponse + 11, // 11: fairyring.zkp.Query.VerifyTransferProofs:output_type -> fairyring.zkp.QueryVerifyTransferProofsResponse + 13, // 12: fairyring.zkp.Query.VerifyWithdrawProofs:output_type -> fairyring.zkp.QueryVerifyWithdrawProofsResponse + 1, // 13: fairyring.zkp.Query.TrustedContracts:output_type -> fairyring.zkp.TrustedContractsResponse + 7, // [7:14] is the sub-list for method output_type + 0, // [0:7] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name @@ -6917,7 +7833,7 @@ func file_fairyring_zkp_query_proto_init() { } if !protoimpl.UnsafeEnabled { file_fairyring_zkp_query_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryVerifyWithdrawRangeProofRequest); i { + switch v := v.(*TrustedContractsRequest); i { case 0: return &v.state case 1: @@ -6929,7 +7845,7 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryVerifyWithdrawRangeProofResponse); i { + switch v := v.(*TrustedContractsResponse); i { case 0: return &v.state case 1: @@ -6941,7 +7857,7 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryVerifyTransferRangeProofRequest); i { + switch v := v.(*QueryVerifyWithdrawRangeProofRequest); i { case 0: return &v.state case 1: @@ -6953,7 +7869,7 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryVerifyTransferRangeProofResponse); i { + switch v := v.(*QueryVerifyWithdrawRangeProofResponse); i { case 0: return &v.state case 1: @@ -6965,7 +7881,7 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryVerifyValidityProofRequest); i { + switch v := v.(*QueryVerifyTransferRangeProofRequest); i { case 0: return &v.state case 1: @@ -6977,7 +7893,7 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryVerifyValidityProofResponse); i { + switch v := v.(*QueryVerifyTransferRangeProofResponse); i { case 0: return &v.state case 1: @@ -6989,7 +7905,7 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryVerifyEqualityProofRequest); i { + switch v := v.(*QueryVerifyValidityProofRequest); i { case 0: return &v.state case 1: @@ -7001,7 +7917,7 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryVerifyEqualityProofResponse); i { + switch v := v.(*QueryVerifyValidityProofResponse); i { case 0: return &v.state case 1: @@ -7013,7 +7929,7 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryVerifyTransferProofsRequest); i { + switch v := v.(*QueryVerifyEqualityProofRequest); i { case 0: return &v.state case 1: @@ -7025,7 +7941,7 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryVerifyTransferProofsResponse); i { + switch v := v.(*QueryVerifyEqualityProofResponse); i { case 0: return &v.state case 1: @@ -7037,7 +7953,7 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryVerifyWithdrawProofsRequest); i { + switch v := v.(*QueryVerifyTransferProofsRequest); i { case 0: return &v.state case 1: @@ -7049,6 +7965,30 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryVerifyTransferProofsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fairyring_zkp_query_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryVerifyWithdrawProofsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fairyring_zkp_query_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryVerifyWithdrawProofsResponse); i { case 0: return &v.state @@ -7067,7 +8007,7 @@ func file_fairyring_zkp_query_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_fairyring_zkp_query_proto_rawDesc, NumEnums: 0, - NumMessages: 12, + NumMessages: 14, NumExtensions: 0, NumServices: 1, }, diff --git a/api/fairyring/zkp/query_grpc.pb.go b/api/fairyring/zkp/query_grpc.pb.go index 1563d9d9..3f21281d 100644 --- a/api/fairyring/zkp/query_grpc.pb.go +++ b/api/fairyring/zkp/query_grpc.pb.go @@ -25,6 +25,7 @@ const ( Query_VerifyEqualityProof_FullMethodName = "/fairyring.zkp.Query/VerifyEqualityProof" Query_VerifyTransferProofs_FullMethodName = "/fairyring.zkp.Query/VerifyTransferProofs" Query_VerifyWithdrawProofs_FullMethodName = "/fairyring.zkp.Query/VerifyWithdrawProofs" + Query_TrustedContracts_FullMethodName = "/fairyring.zkp.Query/TrustedContracts" ) // QueryClient is the client API for Query service. @@ -43,6 +44,7 @@ type QueryClient interface { VerifyTransferProofs(ctx context.Context, in *QueryVerifyTransferProofsRequest, opts ...grpc.CallOption) (*QueryVerifyTransferProofsResponse, error) // VerifyWithdrawProofs verifies all withdraw proofs together (equality, range) VerifyWithdrawProofs(ctx context.Context, in *QueryVerifyWithdrawProofsRequest, opts ...grpc.CallOption) (*QueryVerifyWithdrawProofsResponse, error) + TrustedContracts(ctx context.Context, in *TrustedContractsRequest, opts ...grpc.CallOption) (*TrustedContractsResponse, error) } type queryClient struct { @@ -107,6 +109,15 @@ func (c *queryClient) VerifyWithdrawProofs(ctx context.Context, in *QueryVerifyW return out, nil } +func (c *queryClient) TrustedContracts(ctx context.Context, in *TrustedContractsRequest, opts ...grpc.CallOption) (*TrustedContractsResponse, error) { + out := new(TrustedContractsResponse) + err := c.cc.Invoke(ctx, Query_TrustedContracts_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. // All implementations must embed UnimplementedQueryServer // for forward compatibility @@ -123,6 +134,7 @@ type QueryServer interface { VerifyTransferProofs(context.Context, *QueryVerifyTransferProofsRequest) (*QueryVerifyTransferProofsResponse, error) // VerifyWithdrawProofs verifies all withdraw proofs together (equality, range) VerifyWithdrawProofs(context.Context, *QueryVerifyWithdrawProofsRequest) (*QueryVerifyWithdrawProofsResponse, error) + TrustedContracts(context.Context, *TrustedContractsRequest) (*TrustedContractsResponse, error) mustEmbedUnimplementedQueryServer() } @@ -148,6 +160,9 @@ func (UnimplementedQueryServer) VerifyTransferProofs(context.Context, *QueryVeri func (UnimplementedQueryServer) VerifyWithdrawProofs(context.Context, *QueryVerifyWithdrawProofsRequest) (*QueryVerifyWithdrawProofsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method VerifyWithdrawProofs not implemented") } +func (UnimplementedQueryServer) TrustedContracts(context.Context, *TrustedContractsRequest) (*TrustedContractsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method TrustedContracts not implemented") +} func (UnimplementedQueryServer) mustEmbedUnimplementedQueryServer() {} // UnsafeQueryServer may be embedded to opt out of forward compatibility for this service. @@ -269,6 +284,24 @@ func _Query_VerifyWithdrawProofs_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } +func _Query_TrustedContracts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TrustedContractsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).TrustedContracts(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Query_TrustedContracts_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).TrustedContracts(ctx, req.(*TrustedContractsRequest)) + } + return interceptor(ctx, in, info, handler) +} + // Query_ServiceDesc is the grpc.ServiceDesc for Query service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -300,6 +333,10 @@ var Query_ServiceDesc = grpc.ServiceDesc{ MethodName: "VerifyWithdrawProofs", Handler: _Query_VerifyWithdrawProofs_Handler, }, + { + MethodName: "TrustedContracts", + Handler: _Query_TrustedContracts_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "fairyring/zkp/query.proto", diff --git a/api/fairyring/zkp/tx.pulsar.go b/api/fairyring/zkp/tx.pulsar.go new file mode 100644 index 00000000..efd64600 --- /dev/null +++ b/api/fairyring/zkp/tx.pulsar.go @@ -0,0 +1,2990 @@ +// Code generated by protoc-gen-go-pulsar. DO NOT EDIT. +package zkp + +import ( + _ "cosmossdk.io/api/amino" + _ "cosmossdk.io/api/cosmos/msg/v1" + fmt "fmt" + _ "github.com/cosmos/cosmos-proto" + runtime "github.com/cosmos/cosmos-proto/runtime" + _ "github.com/cosmos/gogoproto/gogoproto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoiface "google.golang.org/protobuf/runtime/protoiface" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + io "io" + reflect "reflect" + sync "sync" +) + +var ( + md_MsgUpdateParams protoreflect.MessageDescriptor + fd_MsgUpdateParams_authority protoreflect.FieldDescriptor + fd_MsgUpdateParams_params protoreflect.FieldDescriptor +) + +func init() { + file_fairyring_zkp_tx_proto_init() + md_MsgUpdateParams = File_fairyring_zkp_tx_proto.Messages().ByName("MsgUpdateParams") + fd_MsgUpdateParams_authority = md_MsgUpdateParams.Fields().ByName("authority") + fd_MsgUpdateParams_params = md_MsgUpdateParams.Fields().ByName("params") +} + +var _ protoreflect.Message = (*fastReflection_MsgUpdateParams)(nil) + +type fastReflection_MsgUpdateParams MsgUpdateParams + +func (x *MsgUpdateParams) ProtoReflect() protoreflect.Message { + return (*fastReflection_MsgUpdateParams)(x) +} + +func (x *MsgUpdateParams) slowProtoReflect() protoreflect.Message { + mi := &file_fairyring_zkp_tx_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_MsgUpdateParams_messageType fastReflection_MsgUpdateParams_messageType +var _ protoreflect.MessageType = fastReflection_MsgUpdateParams_messageType{} + +type fastReflection_MsgUpdateParams_messageType struct{} + +func (x fastReflection_MsgUpdateParams_messageType) Zero() protoreflect.Message { + return (*fastReflection_MsgUpdateParams)(nil) +} +func (x fastReflection_MsgUpdateParams_messageType) New() protoreflect.Message { + return new(fastReflection_MsgUpdateParams) +} +func (x fastReflection_MsgUpdateParams_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_MsgUpdateParams +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_MsgUpdateParams) Descriptor() protoreflect.MessageDescriptor { + return md_MsgUpdateParams +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_MsgUpdateParams) Type() protoreflect.MessageType { + return _fastReflection_MsgUpdateParams_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_MsgUpdateParams) New() protoreflect.Message { + return new(fastReflection_MsgUpdateParams) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_MsgUpdateParams) Interface() protoreflect.ProtoMessage { + return (*MsgUpdateParams)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_MsgUpdateParams) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Authority != "" { + value := protoreflect.ValueOfString(x.Authority) + if !f(fd_MsgUpdateParams_authority, value) { + return + } + } + if x.Params != nil { + value := protoreflect.ValueOfMessage(x.Params.ProtoReflect()) + if !f(fd_MsgUpdateParams_params, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_MsgUpdateParams) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "fairyring.zkp.MsgUpdateParams.authority": + return x.Authority != "" + case "fairyring.zkp.MsgUpdateParams.params": + return x.Params != nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgUpdateParams")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgUpdateParams does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgUpdateParams) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "fairyring.zkp.MsgUpdateParams.authority": + x.Authority = "" + case "fairyring.zkp.MsgUpdateParams.params": + x.Params = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgUpdateParams")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgUpdateParams does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_MsgUpdateParams) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "fairyring.zkp.MsgUpdateParams.authority": + value := x.Authority + return protoreflect.ValueOfString(value) + case "fairyring.zkp.MsgUpdateParams.params": + value := x.Params + return protoreflect.ValueOfMessage(value.ProtoReflect()) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgUpdateParams")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgUpdateParams does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgUpdateParams) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "fairyring.zkp.MsgUpdateParams.authority": + x.Authority = value.Interface().(string) + case "fairyring.zkp.MsgUpdateParams.params": + x.Params = value.Message().Interface().(*Params) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgUpdateParams")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgUpdateParams does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgUpdateParams) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "fairyring.zkp.MsgUpdateParams.params": + if x.Params == nil { + x.Params = new(Params) + } + return protoreflect.ValueOfMessage(x.Params.ProtoReflect()) + case "fairyring.zkp.MsgUpdateParams.authority": + panic(fmt.Errorf("field authority of message fairyring.zkp.MsgUpdateParams is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgUpdateParams")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgUpdateParams does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_MsgUpdateParams) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "fairyring.zkp.MsgUpdateParams.authority": + return protoreflect.ValueOfString("") + case "fairyring.zkp.MsgUpdateParams.params": + m := new(Params) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgUpdateParams")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgUpdateParams does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_MsgUpdateParams) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in fairyring.zkp.MsgUpdateParams", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_MsgUpdateParams) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgUpdateParams) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_MsgUpdateParams) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_MsgUpdateParams) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*MsgUpdateParams) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + l = len(x.Authority) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.Params != nil { + l = options.Size(x.Params) + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*MsgUpdateParams) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if x.Params != nil { + encoded, err := options.Marshal(x.Params) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0x12 + } + if len(x.Authority) > 0 { + i -= len(x.Authority) + copy(dAtA[i:], x.Authority) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Authority))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*MsgUpdateParams) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgUpdateParams: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgUpdateParams: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Authority", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.Authority = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if x.Params == nil { + x.Params = &Params{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Params); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var ( + md_MsgUpdateParamsResponse protoreflect.MessageDescriptor +) + +func init() { + file_fairyring_zkp_tx_proto_init() + md_MsgUpdateParamsResponse = File_fairyring_zkp_tx_proto.Messages().ByName("MsgUpdateParamsResponse") +} + +var _ protoreflect.Message = (*fastReflection_MsgUpdateParamsResponse)(nil) + +type fastReflection_MsgUpdateParamsResponse MsgUpdateParamsResponse + +func (x *MsgUpdateParamsResponse) ProtoReflect() protoreflect.Message { + return (*fastReflection_MsgUpdateParamsResponse)(x) +} + +func (x *MsgUpdateParamsResponse) slowProtoReflect() protoreflect.Message { + mi := &file_fairyring_zkp_tx_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_MsgUpdateParamsResponse_messageType fastReflection_MsgUpdateParamsResponse_messageType +var _ protoreflect.MessageType = fastReflection_MsgUpdateParamsResponse_messageType{} + +type fastReflection_MsgUpdateParamsResponse_messageType struct{} + +func (x fastReflection_MsgUpdateParamsResponse_messageType) Zero() protoreflect.Message { + return (*fastReflection_MsgUpdateParamsResponse)(nil) +} +func (x fastReflection_MsgUpdateParamsResponse_messageType) New() protoreflect.Message { + return new(fastReflection_MsgUpdateParamsResponse) +} +func (x fastReflection_MsgUpdateParamsResponse_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_MsgUpdateParamsResponse +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_MsgUpdateParamsResponse) Descriptor() protoreflect.MessageDescriptor { + return md_MsgUpdateParamsResponse +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_MsgUpdateParamsResponse) Type() protoreflect.MessageType { + return _fastReflection_MsgUpdateParamsResponse_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_MsgUpdateParamsResponse) New() protoreflect.Message { + return new(fastReflection_MsgUpdateParamsResponse) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_MsgUpdateParamsResponse) Interface() protoreflect.ProtoMessage { + return (*MsgUpdateParamsResponse)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_MsgUpdateParamsResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_MsgUpdateParamsResponse) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgUpdateParamsResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgUpdateParamsResponse does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgUpdateParamsResponse) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgUpdateParamsResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgUpdateParamsResponse does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_MsgUpdateParamsResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgUpdateParamsResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgUpdateParamsResponse does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgUpdateParamsResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgUpdateParamsResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgUpdateParamsResponse does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgUpdateParamsResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgUpdateParamsResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgUpdateParamsResponse does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_MsgUpdateParamsResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgUpdateParamsResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgUpdateParamsResponse does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_MsgUpdateParamsResponse) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in fairyring.zkp.MsgUpdateParamsResponse", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_MsgUpdateParamsResponse) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgUpdateParamsResponse) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_MsgUpdateParamsResponse) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_MsgUpdateParamsResponse) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*MsgUpdateParamsResponse) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*MsgUpdateParamsResponse) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*MsgUpdateParamsResponse) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgUpdateParamsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgUpdateParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var ( + md_MsgAddTrustedContract protoreflect.MessageDescriptor + fd_MsgAddTrustedContract_authority protoreflect.FieldDescriptor + fd_MsgAddTrustedContract_contract_address protoreflect.FieldDescriptor +) + +func init() { + file_fairyring_zkp_tx_proto_init() + md_MsgAddTrustedContract = File_fairyring_zkp_tx_proto.Messages().ByName("MsgAddTrustedContract") + fd_MsgAddTrustedContract_authority = md_MsgAddTrustedContract.Fields().ByName("authority") + fd_MsgAddTrustedContract_contract_address = md_MsgAddTrustedContract.Fields().ByName("contract_address") +} + +var _ protoreflect.Message = (*fastReflection_MsgAddTrustedContract)(nil) + +type fastReflection_MsgAddTrustedContract MsgAddTrustedContract + +func (x *MsgAddTrustedContract) ProtoReflect() protoreflect.Message { + return (*fastReflection_MsgAddTrustedContract)(x) +} + +func (x *MsgAddTrustedContract) slowProtoReflect() protoreflect.Message { + mi := &file_fairyring_zkp_tx_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_MsgAddTrustedContract_messageType fastReflection_MsgAddTrustedContract_messageType +var _ protoreflect.MessageType = fastReflection_MsgAddTrustedContract_messageType{} + +type fastReflection_MsgAddTrustedContract_messageType struct{} + +func (x fastReflection_MsgAddTrustedContract_messageType) Zero() protoreflect.Message { + return (*fastReflection_MsgAddTrustedContract)(nil) +} +func (x fastReflection_MsgAddTrustedContract_messageType) New() protoreflect.Message { + return new(fastReflection_MsgAddTrustedContract) +} +func (x fastReflection_MsgAddTrustedContract_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_MsgAddTrustedContract +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_MsgAddTrustedContract) Descriptor() protoreflect.MessageDescriptor { + return md_MsgAddTrustedContract +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_MsgAddTrustedContract) Type() protoreflect.MessageType { + return _fastReflection_MsgAddTrustedContract_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_MsgAddTrustedContract) New() protoreflect.Message { + return new(fastReflection_MsgAddTrustedContract) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_MsgAddTrustedContract) Interface() protoreflect.ProtoMessage { + return (*MsgAddTrustedContract)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_MsgAddTrustedContract) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Authority != "" { + value := protoreflect.ValueOfString(x.Authority) + if !f(fd_MsgAddTrustedContract_authority, value) { + return + } + } + if x.ContractAddress != "" { + value := protoreflect.ValueOfString(x.ContractAddress) + if !f(fd_MsgAddTrustedContract_contract_address, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_MsgAddTrustedContract) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "fairyring.zkp.MsgAddTrustedContract.authority": + return x.Authority != "" + case "fairyring.zkp.MsgAddTrustedContract.contract_address": + return x.ContractAddress != "" + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgAddTrustedContract")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgAddTrustedContract does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgAddTrustedContract) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "fairyring.zkp.MsgAddTrustedContract.authority": + x.Authority = "" + case "fairyring.zkp.MsgAddTrustedContract.contract_address": + x.ContractAddress = "" + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgAddTrustedContract")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgAddTrustedContract does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_MsgAddTrustedContract) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "fairyring.zkp.MsgAddTrustedContract.authority": + value := x.Authority + return protoreflect.ValueOfString(value) + case "fairyring.zkp.MsgAddTrustedContract.contract_address": + value := x.ContractAddress + return protoreflect.ValueOfString(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgAddTrustedContract")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgAddTrustedContract does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgAddTrustedContract) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "fairyring.zkp.MsgAddTrustedContract.authority": + x.Authority = value.Interface().(string) + case "fairyring.zkp.MsgAddTrustedContract.contract_address": + x.ContractAddress = value.Interface().(string) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgAddTrustedContract")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgAddTrustedContract does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgAddTrustedContract) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "fairyring.zkp.MsgAddTrustedContract.authority": + panic(fmt.Errorf("field authority of message fairyring.zkp.MsgAddTrustedContract is not mutable")) + case "fairyring.zkp.MsgAddTrustedContract.contract_address": + panic(fmt.Errorf("field contract_address of message fairyring.zkp.MsgAddTrustedContract is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgAddTrustedContract")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgAddTrustedContract does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_MsgAddTrustedContract) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "fairyring.zkp.MsgAddTrustedContract.authority": + return protoreflect.ValueOfString("") + case "fairyring.zkp.MsgAddTrustedContract.contract_address": + return protoreflect.ValueOfString("") + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgAddTrustedContract")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgAddTrustedContract does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_MsgAddTrustedContract) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in fairyring.zkp.MsgAddTrustedContract", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_MsgAddTrustedContract) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgAddTrustedContract) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_MsgAddTrustedContract) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_MsgAddTrustedContract) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*MsgAddTrustedContract) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + l = len(x.Authority) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + l = len(x.ContractAddress) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*MsgAddTrustedContract) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if len(x.ContractAddress) > 0 { + i -= len(x.ContractAddress) + copy(dAtA[i:], x.ContractAddress) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.ContractAddress))) + i-- + dAtA[i] = 0x12 + } + if len(x.Authority) > 0 { + i -= len(x.Authority) + copy(dAtA[i:], x.Authority) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Authority))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*MsgAddTrustedContract) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgAddTrustedContract: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgAddTrustedContract: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Authority", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.Authority = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ContractAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.ContractAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var ( + md_MsgAddTrustedContractResponse protoreflect.MessageDescriptor +) + +func init() { + file_fairyring_zkp_tx_proto_init() + md_MsgAddTrustedContractResponse = File_fairyring_zkp_tx_proto.Messages().ByName("MsgAddTrustedContractResponse") +} + +var _ protoreflect.Message = (*fastReflection_MsgAddTrustedContractResponse)(nil) + +type fastReflection_MsgAddTrustedContractResponse MsgAddTrustedContractResponse + +func (x *MsgAddTrustedContractResponse) ProtoReflect() protoreflect.Message { + return (*fastReflection_MsgAddTrustedContractResponse)(x) +} + +func (x *MsgAddTrustedContractResponse) slowProtoReflect() protoreflect.Message { + mi := &file_fairyring_zkp_tx_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_MsgAddTrustedContractResponse_messageType fastReflection_MsgAddTrustedContractResponse_messageType +var _ protoreflect.MessageType = fastReflection_MsgAddTrustedContractResponse_messageType{} + +type fastReflection_MsgAddTrustedContractResponse_messageType struct{} + +func (x fastReflection_MsgAddTrustedContractResponse_messageType) Zero() protoreflect.Message { + return (*fastReflection_MsgAddTrustedContractResponse)(nil) +} +func (x fastReflection_MsgAddTrustedContractResponse_messageType) New() protoreflect.Message { + return new(fastReflection_MsgAddTrustedContractResponse) +} +func (x fastReflection_MsgAddTrustedContractResponse_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_MsgAddTrustedContractResponse +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_MsgAddTrustedContractResponse) Descriptor() protoreflect.MessageDescriptor { + return md_MsgAddTrustedContractResponse +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_MsgAddTrustedContractResponse) Type() protoreflect.MessageType { + return _fastReflection_MsgAddTrustedContractResponse_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_MsgAddTrustedContractResponse) New() protoreflect.Message { + return new(fastReflection_MsgAddTrustedContractResponse) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_MsgAddTrustedContractResponse) Interface() protoreflect.ProtoMessage { + return (*MsgAddTrustedContractResponse)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_MsgAddTrustedContractResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_MsgAddTrustedContractResponse) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgAddTrustedContractResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgAddTrustedContractResponse does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgAddTrustedContractResponse) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgAddTrustedContractResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgAddTrustedContractResponse does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_MsgAddTrustedContractResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgAddTrustedContractResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgAddTrustedContractResponse does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgAddTrustedContractResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgAddTrustedContractResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgAddTrustedContractResponse does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgAddTrustedContractResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgAddTrustedContractResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgAddTrustedContractResponse does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_MsgAddTrustedContractResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgAddTrustedContractResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgAddTrustedContractResponse does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_MsgAddTrustedContractResponse) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in fairyring.zkp.MsgAddTrustedContractResponse", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_MsgAddTrustedContractResponse) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgAddTrustedContractResponse) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_MsgAddTrustedContractResponse) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_MsgAddTrustedContractResponse) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*MsgAddTrustedContractResponse) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*MsgAddTrustedContractResponse) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*MsgAddTrustedContractResponse) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgAddTrustedContractResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgAddTrustedContractResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var ( + md_MsgRemoveTrustedContract protoreflect.MessageDescriptor + fd_MsgRemoveTrustedContract_authority protoreflect.FieldDescriptor + fd_MsgRemoveTrustedContract_contract_address protoreflect.FieldDescriptor +) + +func init() { + file_fairyring_zkp_tx_proto_init() + md_MsgRemoveTrustedContract = File_fairyring_zkp_tx_proto.Messages().ByName("MsgRemoveTrustedContract") + fd_MsgRemoveTrustedContract_authority = md_MsgRemoveTrustedContract.Fields().ByName("authority") + fd_MsgRemoveTrustedContract_contract_address = md_MsgRemoveTrustedContract.Fields().ByName("contract_address") +} + +var _ protoreflect.Message = (*fastReflection_MsgRemoveTrustedContract)(nil) + +type fastReflection_MsgRemoveTrustedContract MsgRemoveTrustedContract + +func (x *MsgRemoveTrustedContract) ProtoReflect() protoreflect.Message { + return (*fastReflection_MsgRemoveTrustedContract)(x) +} + +func (x *MsgRemoveTrustedContract) slowProtoReflect() protoreflect.Message { + mi := &file_fairyring_zkp_tx_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_MsgRemoveTrustedContract_messageType fastReflection_MsgRemoveTrustedContract_messageType +var _ protoreflect.MessageType = fastReflection_MsgRemoveTrustedContract_messageType{} + +type fastReflection_MsgRemoveTrustedContract_messageType struct{} + +func (x fastReflection_MsgRemoveTrustedContract_messageType) Zero() protoreflect.Message { + return (*fastReflection_MsgRemoveTrustedContract)(nil) +} +func (x fastReflection_MsgRemoveTrustedContract_messageType) New() protoreflect.Message { + return new(fastReflection_MsgRemoveTrustedContract) +} +func (x fastReflection_MsgRemoveTrustedContract_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_MsgRemoveTrustedContract +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_MsgRemoveTrustedContract) Descriptor() protoreflect.MessageDescriptor { + return md_MsgRemoveTrustedContract +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_MsgRemoveTrustedContract) Type() protoreflect.MessageType { + return _fastReflection_MsgRemoveTrustedContract_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_MsgRemoveTrustedContract) New() protoreflect.Message { + return new(fastReflection_MsgRemoveTrustedContract) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_MsgRemoveTrustedContract) Interface() protoreflect.ProtoMessage { + return (*MsgRemoveTrustedContract)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_MsgRemoveTrustedContract) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Authority != "" { + value := protoreflect.ValueOfString(x.Authority) + if !f(fd_MsgRemoveTrustedContract_authority, value) { + return + } + } + if x.ContractAddress != "" { + value := protoreflect.ValueOfString(x.ContractAddress) + if !f(fd_MsgRemoveTrustedContract_contract_address, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_MsgRemoveTrustedContract) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "fairyring.zkp.MsgRemoveTrustedContract.authority": + return x.Authority != "" + case "fairyring.zkp.MsgRemoveTrustedContract.contract_address": + return x.ContractAddress != "" + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgRemoveTrustedContract")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgRemoveTrustedContract does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgRemoveTrustedContract) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "fairyring.zkp.MsgRemoveTrustedContract.authority": + x.Authority = "" + case "fairyring.zkp.MsgRemoveTrustedContract.contract_address": + x.ContractAddress = "" + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgRemoveTrustedContract")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgRemoveTrustedContract does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_MsgRemoveTrustedContract) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "fairyring.zkp.MsgRemoveTrustedContract.authority": + value := x.Authority + return protoreflect.ValueOfString(value) + case "fairyring.zkp.MsgRemoveTrustedContract.contract_address": + value := x.ContractAddress + return protoreflect.ValueOfString(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgRemoveTrustedContract")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgRemoveTrustedContract does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgRemoveTrustedContract) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "fairyring.zkp.MsgRemoveTrustedContract.authority": + x.Authority = value.Interface().(string) + case "fairyring.zkp.MsgRemoveTrustedContract.contract_address": + x.ContractAddress = value.Interface().(string) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgRemoveTrustedContract")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgRemoveTrustedContract does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgRemoveTrustedContract) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "fairyring.zkp.MsgRemoveTrustedContract.authority": + panic(fmt.Errorf("field authority of message fairyring.zkp.MsgRemoveTrustedContract is not mutable")) + case "fairyring.zkp.MsgRemoveTrustedContract.contract_address": + panic(fmt.Errorf("field contract_address of message fairyring.zkp.MsgRemoveTrustedContract is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgRemoveTrustedContract")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgRemoveTrustedContract does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_MsgRemoveTrustedContract) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "fairyring.zkp.MsgRemoveTrustedContract.authority": + return protoreflect.ValueOfString("") + case "fairyring.zkp.MsgRemoveTrustedContract.contract_address": + return protoreflect.ValueOfString("") + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgRemoveTrustedContract")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgRemoveTrustedContract does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_MsgRemoveTrustedContract) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in fairyring.zkp.MsgRemoveTrustedContract", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_MsgRemoveTrustedContract) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgRemoveTrustedContract) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_MsgRemoveTrustedContract) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_MsgRemoveTrustedContract) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*MsgRemoveTrustedContract) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + l = len(x.Authority) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + l = len(x.ContractAddress) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*MsgRemoveTrustedContract) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if len(x.ContractAddress) > 0 { + i -= len(x.ContractAddress) + copy(dAtA[i:], x.ContractAddress) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.ContractAddress))) + i-- + dAtA[i] = 0x12 + } + if len(x.Authority) > 0 { + i -= len(x.Authority) + copy(dAtA[i:], x.Authority) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Authority))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*MsgRemoveTrustedContract) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgRemoveTrustedContract: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgRemoveTrustedContract: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Authority", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.Authority = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ContractAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + x.ContractAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var ( + md_MsgRemoveTrustedContractResponse protoreflect.MessageDescriptor +) + +func init() { + file_fairyring_zkp_tx_proto_init() + md_MsgRemoveTrustedContractResponse = File_fairyring_zkp_tx_proto.Messages().ByName("MsgRemoveTrustedContractResponse") +} + +var _ protoreflect.Message = (*fastReflection_MsgRemoveTrustedContractResponse)(nil) + +type fastReflection_MsgRemoveTrustedContractResponse MsgRemoveTrustedContractResponse + +func (x *MsgRemoveTrustedContractResponse) ProtoReflect() protoreflect.Message { + return (*fastReflection_MsgRemoveTrustedContractResponse)(x) +} + +func (x *MsgRemoveTrustedContractResponse) slowProtoReflect() protoreflect.Message { + mi := &file_fairyring_zkp_tx_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_MsgRemoveTrustedContractResponse_messageType fastReflection_MsgRemoveTrustedContractResponse_messageType +var _ protoreflect.MessageType = fastReflection_MsgRemoveTrustedContractResponse_messageType{} + +type fastReflection_MsgRemoveTrustedContractResponse_messageType struct{} + +func (x fastReflection_MsgRemoveTrustedContractResponse_messageType) Zero() protoreflect.Message { + return (*fastReflection_MsgRemoveTrustedContractResponse)(nil) +} +func (x fastReflection_MsgRemoveTrustedContractResponse_messageType) New() protoreflect.Message { + return new(fastReflection_MsgRemoveTrustedContractResponse) +} +func (x fastReflection_MsgRemoveTrustedContractResponse_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_MsgRemoveTrustedContractResponse +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_MsgRemoveTrustedContractResponse) Descriptor() protoreflect.MessageDescriptor { + return md_MsgRemoveTrustedContractResponse +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_MsgRemoveTrustedContractResponse) Type() protoreflect.MessageType { + return _fastReflection_MsgRemoveTrustedContractResponse_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_MsgRemoveTrustedContractResponse) New() protoreflect.Message { + return new(fastReflection_MsgRemoveTrustedContractResponse) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_MsgRemoveTrustedContractResponse) Interface() protoreflect.ProtoMessage { + return (*MsgRemoveTrustedContractResponse)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_MsgRemoveTrustedContractResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_MsgRemoveTrustedContractResponse) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgRemoveTrustedContractResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgRemoveTrustedContractResponse does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgRemoveTrustedContractResponse) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgRemoveTrustedContractResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgRemoveTrustedContractResponse does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_MsgRemoveTrustedContractResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgRemoveTrustedContractResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgRemoveTrustedContractResponse does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgRemoveTrustedContractResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgRemoveTrustedContractResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgRemoveTrustedContractResponse does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgRemoveTrustedContractResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgRemoveTrustedContractResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgRemoveTrustedContractResponse does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_MsgRemoveTrustedContractResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.MsgRemoveTrustedContractResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.MsgRemoveTrustedContractResponse does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_MsgRemoveTrustedContractResponse) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in fairyring.zkp.MsgRemoveTrustedContractResponse", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_MsgRemoveTrustedContractResponse) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_MsgRemoveTrustedContractResponse) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_MsgRemoveTrustedContractResponse) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_MsgRemoveTrustedContractResponse) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*MsgRemoveTrustedContractResponse) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*MsgRemoveTrustedContractResponse) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*MsgRemoveTrustedContractResponse) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgRemoveTrustedContractResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgRemoveTrustedContractResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.0 +// protoc (unknown) +// source: fairyring/zkp/tx.proto + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type MsgUpdateParams struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // authority is the address that currently controls the module. + Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"` + // params defines the module parameters to update. + // NOTE: All parameters must be supplied. + Params *Params `protobuf:"bytes,2,opt,name=params,proto3" json:"params,omitempty"` +} + +func (x *MsgUpdateParams) Reset() { + *x = MsgUpdateParams{} + if protoimpl.UnsafeEnabled { + mi := &file_fairyring_zkp_tx_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MsgUpdateParams) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MsgUpdateParams) ProtoMessage() {} + +// Deprecated: Use MsgUpdateParams.ProtoReflect.Descriptor instead. +func (*MsgUpdateParams) Descriptor() ([]byte, []int) { + return file_fairyring_zkp_tx_proto_rawDescGZIP(), []int{0} +} + +func (x *MsgUpdateParams) GetAuthority() string { + if x != nil { + return x.Authority + } + return "" +} + +func (x *MsgUpdateParams) GetParams() *Params { + if x != nil { + return x.Params + } + return nil +} + +type MsgUpdateParamsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *MsgUpdateParamsResponse) Reset() { + *x = MsgUpdateParamsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_fairyring_zkp_tx_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MsgUpdateParamsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MsgUpdateParamsResponse) ProtoMessage() {} + +// Deprecated: Use MsgUpdateParamsResponse.ProtoReflect.Descriptor instead. +func (*MsgUpdateParamsResponse) Descriptor() ([]byte, []int) { + return file_fairyring_zkp_tx_proto_rawDescGZIP(), []int{1} +} + +type MsgAddTrustedContract struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"` + ContractAddress string `protobuf:"bytes,2,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` +} + +func (x *MsgAddTrustedContract) Reset() { + *x = MsgAddTrustedContract{} + if protoimpl.UnsafeEnabled { + mi := &file_fairyring_zkp_tx_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MsgAddTrustedContract) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MsgAddTrustedContract) ProtoMessage() {} + +// Deprecated: Use MsgAddTrustedContract.ProtoReflect.Descriptor instead. +func (*MsgAddTrustedContract) Descriptor() ([]byte, []int) { + return file_fairyring_zkp_tx_proto_rawDescGZIP(), []int{2} +} + +func (x *MsgAddTrustedContract) GetAuthority() string { + if x != nil { + return x.Authority + } + return "" +} + +func (x *MsgAddTrustedContract) GetContractAddress() string { + if x != nil { + return x.ContractAddress + } + return "" +} + +type MsgAddTrustedContractResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *MsgAddTrustedContractResponse) Reset() { + *x = MsgAddTrustedContractResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_fairyring_zkp_tx_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MsgAddTrustedContractResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MsgAddTrustedContractResponse) ProtoMessage() {} + +// Deprecated: Use MsgAddTrustedContractResponse.ProtoReflect.Descriptor instead. +func (*MsgAddTrustedContractResponse) Descriptor() ([]byte, []int) { + return file_fairyring_zkp_tx_proto_rawDescGZIP(), []int{3} +} + +type MsgRemoveTrustedContract struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"` + ContractAddress string `protobuf:"bytes,2,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` +} + +func (x *MsgRemoveTrustedContract) Reset() { + *x = MsgRemoveTrustedContract{} + if protoimpl.UnsafeEnabled { + mi := &file_fairyring_zkp_tx_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MsgRemoveTrustedContract) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MsgRemoveTrustedContract) ProtoMessage() {} + +// Deprecated: Use MsgRemoveTrustedContract.ProtoReflect.Descriptor instead. +func (*MsgRemoveTrustedContract) Descriptor() ([]byte, []int) { + return file_fairyring_zkp_tx_proto_rawDescGZIP(), []int{4} +} + +func (x *MsgRemoveTrustedContract) GetAuthority() string { + if x != nil { + return x.Authority + } + return "" +} + +func (x *MsgRemoveTrustedContract) GetContractAddress() string { + if x != nil { + return x.ContractAddress + } + return "" +} + +type MsgRemoveTrustedContractResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *MsgRemoveTrustedContractResponse) Reset() { + *x = MsgRemoveTrustedContractResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_fairyring_zkp_tx_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MsgRemoveTrustedContractResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MsgRemoveTrustedContractResponse) ProtoMessage() {} + +// Deprecated: Use MsgRemoveTrustedContractResponse.ProtoReflect.Descriptor instead. +func (*MsgRemoveTrustedContractResponse) Descriptor() ([]byte, []int) { + return file_fairyring_zkp_tx_proto_rawDescGZIP(), []int{5} +} + +var File_fairyring_zkp_tx_proto protoreflect.FileDescriptor + +var file_fairyring_zkp_tx_proto_rawDesc = []byte{ + 0x0a, 0x16, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, + 0x74, 0x78, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x1a, 0x11, 0x61, 0x6d, 0x69, 0x6e, 0x6f, 0x2f, 0x61, + 0x6d, 0x69, 0x6e, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2f, 0x6d, 0x73, 0x67, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x73, 0x67, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1a, + 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x14, 0x67, 0x6f, 0x67, 0x6f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x22, 0xb7, 0x01, 0x0a, 0x0f, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x36, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x18, 0xd2, 0xb4, 0x2d, 0x14, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x38, 0x0a, 0x06, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x66, + 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x42, 0x09, 0xc8, 0xde, 0x1f, 0x00, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x06, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, 0x32, 0x82, 0xe7, 0xb0, 0x2a, 0x09, 0x61, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x8a, 0xe7, 0xb0, 0x2a, 0x1f, 0x66, 0x61, 0x69, 0x72, 0x79, + 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x78, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x4d, 0x73, 0x67, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x4d, 0x73, + 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x70, 0x0a, 0x15, 0x4d, 0x73, 0x67, 0x41, 0x64, 0x64, 0x54, + 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x12, 0x1c, + 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x29, 0x0a, 0x10, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x3a, 0x0e, 0x82, 0xe7, 0xb0, 0x2a, 0x09, 0x61, 0x75, + 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x1f, 0x0a, 0x1d, 0x4d, 0x73, 0x67, 0x41, 0x64, + 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x73, 0x0a, 0x18, 0x4d, 0x73, 0x67, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x61, 0x63, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x74, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, + 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x3a, 0x0e, 0x82, + 0xe7, 0xb0, 0x2a, 0x09, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x22, 0x22, 0x0a, + 0x20, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, + 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x32, 0xc1, 0x02, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x56, 0x0a, 0x0c, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x1e, 0x2e, 0x66, 0x61, 0x69, 0x72, + 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x26, 0x2e, 0x66, 0x61, 0x69, 0x72, + 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x68, 0x0a, 0x12, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x12, 0x24, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x4d, 0x73, 0x67, 0x41, 0x64, 0x64, 0x54, 0x72, + 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x1a, 0x2c, 0x2e, + 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x4d, 0x73, + 0x67, 0x41, 0x64, 0x64, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x15, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x61, 0x63, 0x74, 0x12, 0x27, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, + 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x4d, 0x73, 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x72, + 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x1a, 0x2f, 0x2e, + 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x4d, 0x73, + 0x67, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x05, + 0x80, 0xe7, 0xb0, 0x2a, 0x01, 0x42, 0x91, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x61, + 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x42, 0x07, 0x54, 0x78, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, + 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, + 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0xa2, 0x02, 0x03, 0x46, 0x5a, 0x58, 0xaa, 0x02, 0x0d, 0x46, + 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x5a, 0x6b, 0x70, 0xca, 0x02, 0x0d, 0x46, + 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x5a, 0x6b, 0x70, 0xe2, 0x02, 0x19, 0x46, + 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x5a, 0x6b, 0x70, 0x5c, 0x47, 0x50, 0x42, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x46, 0x61, 0x69, 0x72, 0x79, + 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x5a, 0x6b, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var ( + file_fairyring_zkp_tx_proto_rawDescOnce sync.Once + file_fairyring_zkp_tx_proto_rawDescData = file_fairyring_zkp_tx_proto_rawDesc +) + +func file_fairyring_zkp_tx_proto_rawDescGZIP() []byte { + file_fairyring_zkp_tx_proto_rawDescOnce.Do(func() { + file_fairyring_zkp_tx_proto_rawDescData = protoimpl.X.CompressGZIP(file_fairyring_zkp_tx_proto_rawDescData) + }) + return file_fairyring_zkp_tx_proto_rawDescData +} + +var file_fairyring_zkp_tx_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_fairyring_zkp_tx_proto_goTypes = []interface{}{ + (*MsgUpdateParams)(nil), // 0: fairyring.zkp.MsgUpdateParams + (*MsgUpdateParamsResponse)(nil), // 1: fairyring.zkp.MsgUpdateParamsResponse + (*MsgAddTrustedContract)(nil), // 2: fairyring.zkp.MsgAddTrustedContract + (*MsgAddTrustedContractResponse)(nil), // 3: fairyring.zkp.MsgAddTrustedContractResponse + (*MsgRemoveTrustedContract)(nil), // 4: fairyring.zkp.MsgRemoveTrustedContract + (*MsgRemoveTrustedContractResponse)(nil), // 5: fairyring.zkp.MsgRemoveTrustedContractResponse + (*Params)(nil), // 6: fairyring.zkp.Params +} +var file_fairyring_zkp_tx_proto_depIdxs = []int32{ + 6, // 0: fairyring.zkp.MsgUpdateParams.params:type_name -> fairyring.zkp.Params + 0, // 1: fairyring.zkp.Msg.UpdateParams:input_type -> fairyring.zkp.MsgUpdateParams + 2, // 2: fairyring.zkp.Msg.AddTrustedContract:input_type -> fairyring.zkp.MsgAddTrustedContract + 4, // 3: fairyring.zkp.Msg.RemoveTrustedContract:input_type -> fairyring.zkp.MsgRemoveTrustedContract + 1, // 4: fairyring.zkp.Msg.UpdateParams:output_type -> fairyring.zkp.MsgUpdateParamsResponse + 3, // 5: fairyring.zkp.Msg.AddTrustedContract:output_type -> fairyring.zkp.MsgAddTrustedContractResponse + 5, // 6: fairyring.zkp.Msg.RemoveTrustedContract:output_type -> fairyring.zkp.MsgRemoveTrustedContractResponse + 4, // [4:7] is the sub-list for method output_type + 1, // [1:4] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_fairyring_zkp_tx_proto_init() } +func file_fairyring_zkp_tx_proto_init() { + if File_fairyring_zkp_tx_proto != nil { + return + } + file_fairyring_zkp_params_proto_init() + if !protoimpl.UnsafeEnabled { + file_fairyring_zkp_tx_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MsgUpdateParams); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fairyring_zkp_tx_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MsgUpdateParamsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fairyring_zkp_tx_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MsgAddTrustedContract); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fairyring_zkp_tx_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MsgAddTrustedContractResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fairyring_zkp_tx_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MsgRemoveTrustedContract); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fairyring_zkp_tx_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MsgRemoveTrustedContractResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_fairyring_zkp_tx_proto_rawDesc, + NumEnums: 0, + NumMessages: 6, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_fairyring_zkp_tx_proto_goTypes, + DependencyIndexes: file_fairyring_zkp_tx_proto_depIdxs, + MessageInfos: file_fairyring_zkp_tx_proto_msgTypes, + }.Build() + File_fairyring_zkp_tx_proto = out.File + file_fairyring_zkp_tx_proto_rawDesc = nil + file_fairyring_zkp_tx_proto_goTypes = nil + file_fairyring_zkp_tx_proto_depIdxs = nil +} diff --git a/api/fairyring/zkp/tx_grpc.pb.go b/api/fairyring/zkp/tx_grpc.pb.go new file mode 100644 index 00000000..3281d24d --- /dev/null +++ b/api/fairyring/zkp/tx_grpc.pb.go @@ -0,0 +1,185 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc (unknown) +// source: fairyring/zkp/tx.proto + +package zkp + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + Msg_UpdateParams_FullMethodName = "/fairyring.zkp.Msg/UpdateParams" + Msg_AddTrustedContract_FullMethodName = "/fairyring.zkp.Msg/AddTrustedContract" + Msg_RemoveTrustedContract_FullMethodName = "/fairyring.zkp.Msg/RemoveTrustedContract" +) + +// MsgClient is the client API for Msg service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type MsgClient interface { + // UpdateParams defines a governance operation for updating the module parameters. + UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) + AddTrustedContract(ctx context.Context, in *MsgAddTrustedContract, opts ...grpc.CallOption) (*MsgAddTrustedContractResponse, error) + RemoveTrustedContract(ctx context.Context, in *MsgRemoveTrustedContract, opts ...grpc.CallOption) (*MsgRemoveTrustedContractResponse, error) +} + +type msgClient struct { + cc grpc.ClientConnInterface +} + +func NewMsgClient(cc grpc.ClientConnInterface) MsgClient { + return &msgClient{cc} +} + +func (c *msgClient) UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) { + out := new(MsgUpdateParamsResponse) + err := c.cc.Invoke(ctx, Msg_UpdateParams_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) AddTrustedContract(ctx context.Context, in *MsgAddTrustedContract, opts ...grpc.CallOption) (*MsgAddTrustedContractResponse, error) { + out := new(MsgAddTrustedContractResponse) + err := c.cc.Invoke(ctx, Msg_AddTrustedContract_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) RemoveTrustedContract(ctx context.Context, in *MsgRemoveTrustedContract, opts ...grpc.CallOption) (*MsgRemoveTrustedContractResponse, error) { + out := new(MsgRemoveTrustedContractResponse) + err := c.cc.Invoke(ctx, Msg_RemoveTrustedContract_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MsgServer is the server API for Msg service. +// All implementations must embed UnimplementedMsgServer +// for forward compatibility +type MsgServer interface { + // UpdateParams defines a governance operation for updating the module parameters. + UpdateParams(context.Context, *MsgUpdateParams) (*MsgUpdateParamsResponse, error) + AddTrustedContract(context.Context, *MsgAddTrustedContract) (*MsgAddTrustedContractResponse, error) + RemoveTrustedContract(context.Context, *MsgRemoveTrustedContract) (*MsgRemoveTrustedContractResponse, error) + mustEmbedUnimplementedMsgServer() +} + +// UnimplementedMsgServer must be embedded to have forward compatible implementations. +type UnimplementedMsgServer struct { +} + +func (UnimplementedMsgServer) UpdateParams(context.Context, *MsgUpdateParams) (*MsgUpdateParamsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateParams not implemented") +} +func (UnimplementedMsgServer) AddTrustedContract(context.Context, *MsgAddTrustedContract) (*MsgAddTrustedContractResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddTrustedContract not implemented") +} +func (UnimplementedMsgServer) RemoveTrustedContract(context.Context, *MsgRemoveTrustedContract) (*MsgRemoveTrustedContractResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemoveTrustedContract not implemented") +} +func (UnimplementedMsgServer) mustEmbedUnimplementedMsgServer() {} + +// UnsafeMsgServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to MsgServer will +// result in compilation errors. +type UnsafeMsgServer interface { + mustEmbedUnimplementedMsgServer() +} + +func RegisterMsgServer(s grpc.ServiceRegistrar, srv MsgServer) { + s.RegisterService(&Msg_ServiceDesc, srv) +} + +func _Msg_UpdateParams_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgUpdateParams) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).UpdateParams(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Msg_UpdateParams_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).UpdateParams(ctx, req.(*MsgUpdateParams)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_AddTrustedContract_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgAddTrustedContract) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).AddTrustedContract(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Msg_AddTrustedContract_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).AddTrustedContract(ctx, req.(*MsgAddTrustedContract)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_RemoveTrustedContract_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgRemoveTrustedContract) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).RemoveTrustedContract(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Msg_RemoveTrustedContract_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).RemoveTrustedContract(ctx, req.(*MsgRemoveTrustedContract)) + } + return interceptor(ctx, in, info, handler) +} + +// Msg_ServiceDesc is the grpc.ServiceDesc for Msg service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Msg_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "fairyring.zkp.Msg", + HandlerType: (*MsgServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "UpdateParams", + Handler: _Msg_UpdateParams_Handler, + }, + { + MethodName: "AddTrustedContract", + Handler: _Msg_AddTrustedContract_Handler, + }, + { + MethodName: "RemoveTrustedContract", + Handler: _Msg_RemoveTrustedContract_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "fairyring/zkp/tx.proto", +} diff --git a/app/zkp.go b/app/zkp.go index 0297804d..32b15da7 100644 --- a/app/zkp.go +++ b/app/zkp.go @@ -6,8 +6,6 @@ import ( zkpmodule "github.com/Fairblock/fairyring/x/zkp/module" zkptypes "github.com/Fairblock/fairyring/x/zkp/types" "github.com/cosmos/cosmos-sdk/runtime" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" ) func (app *App) registerZkpModule() error { @@ -21,7 +19,6 @@ func (app *App) registerZkpModule() error { app.AppCodec(), runtime.NewKVStoreService(app.GetKey(zkptypes.StoreKey)), app.Logger(), - authtypes.NewModuleAddress(govtypes.ModuleName).String(), ) if err := app.RegisterModules( @@ -34,4 +31,3 @@ func (app *App) registerZkpModule() error { return nil } - diff --git a/go.mod b/go.mod index 95523aff..0e41db4e 100644 --- a/go.mod +++ b/go.mod @@ -67,6 +67,7 @@ require ( github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/regen-network/cosmos-proto v0.3.1 // indirect github.com/stretchr/objx v0.5.2 // indirect ) diff --git a/go.sum b/go.sum index e4684472..e709ed86 100644 --- a/go.sum +++ b/go.sum @@ -1612,6 +1612,8 @@ github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQ github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/regen-network/cosmos-proto v0.3.1 h1:rV7iM4SSFAagvy8RiyhiACbWEGotmqzywPxOvwMdxcg= +github.com/regen-network/cosmos-proto v0.3.1/go.mod h1:jO0sVX6a1B36nmE8C9xBFXpNwWejXC7QqCOnH3O0+YM= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= diff --git a/proto/fairyring/zkp/genesis.proto b/proto/fairyring/zkp/genesis.proto index 41eb9898..2e4a71d2 100644 --- a/proto/fairyring/zkp/genesis.proto +++ b/proto/fairyring/zkp/genesis.proto @@ -2,11 +2,16 @@ syntax = "proto3"; package fairyring.zkp; +import "amino/amino.proto"; +import "fairyring/zkp/params.proto"; import "gogoproto/gogo.proto"; option go_package = "github.com/Fairblock/fairyring/x/zkp/types"; message GenesisState { - repeated string trusted_contracts = 1; + Params params = 1 [ + (gogoproto.nullable) = false, + (amino.dont_omitempty) = true + ]; + repeated string trusted_contracts = 2; } - diff --git a/proto/fairyring/zkp/params.proto b/proto/fairyring/zkp/params.proto new file mode 100644 index 00000000..783d5156 --- /dev/null +++ b/proto/fairyring/zkp/params.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; +package fairyring.zkp; + +import "amino/amino.proto"; +import "gogoproto/gogo.proto"; + +option go_package = "github.com/Fairblock/fairyring/x/zkp/types"; + +// Params defines the parameters for the zkp module. +message Params { + option (amino.name) = "github.com/Fairblock/fairyring/x/zkp/Params"; + option (gogoproto.equal) = true; + + string authority = 1 [(gogoproto.moretags) = "yaml:\"authority\""]; +} diff --git a/proto/fairyring/zkp/query.proto b/proto/fairyring/zkp/query.proto index cc57b7d5..8f8f0bdb 100644 --- a/proto/fairyring/zkp/query.proto +++ b/proto/fairyring/zkp/query.proto @@ -45,6 +45,15 @@ service Query { option (google.api.http).post = "/fairyring/zkp/verify_withdraw_proofs"; option (google.api.http).body = "*"; } + + rpc TrustedContracts(TrustedContractsRequest) returns (TrustedContractsResponse) { + option (google.api.http).get = "/fairyring/zkp/trusted_contracts"; + } +} + +message TrustedContractsRequest {} +message TrustedContractsResponse { + repeated string ContractAddresses = 1; // List of trusted contract addresses } // QueryVerifyWithdrawRangeProofRequest is request type for the Query/VerifyWithdrawRangeProof RPC method. diff --git a/proto/fairyring/zkp/tx.proto b/proto/fairyring/zkp/tx.proto index e3948599..ef54527b 100644 --- a/proto/fairyring/zkp/tx.proto +++ b/proto/fairyring/zkp/tx.proto @@ -2,17 +2,40 @@ syntax = "proto3"; package fairyring.zkp; +import "amino/amino.proto"; import "cosmos/msg/v1/msg.proto"; +import "cosmos_proto/cosmos.proto"; +import "fairyring/zkp/params.proto"; +import "gogoproto/gogo.proto"; option go_package = "github.com/Fairblock/fairyring/x/zkp/types"; service Msg { option (cosmos.msg.v1.service) = true; + // UpdateParams defines a governance operation for updating the module parameters. + rpc UpdateParams(MsgUpdateParams) returns (MsgUpdateParamsResponse); rpc AddTrustedContract(MsgAddTrustedContract) returns (MsgAddTrustedContractResponse); rpc RemoveTrustedContract(MsgRemoveTrustedContract) returns (MsgRemoveTrustedContractResponse); } +message MsgUpdateParams { + option (cosmos.msg.v1.signer) = "authority"; + option (amino.name) = "fairyring/x/zkp/MsgUpdateParams"; + + // authority is the address that currently controls the module. + string authority = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + + // params defines the module parameters to update. + // NOTE: All parameters must be supplied. + Params params = 2 [ + (gogoproto.nullable) = false, + (amino.dont_omitempty) = true + ]; +} + +message MsgUpdateParamsResponse {} + message MsgAddTrustedContract { option (cosmos.msg.v1.signer) = "authority"; string authority = 1; diff --git a/x/zkp/keeper/keeper.go b/x/zkp/keeper/keeper.go index 6e7fb774..fa2264eb 100644 --- a/x/zkp/keeper/keeper.go +++ b/x/zkp/keeper/keeper.go @@ -1,8 +1,6 @@ package keeper import ( - "fmt" - "cosmossdk.io/core/store" "cosmossdk.io/log" "cosmossdk.io/store/prefix" @@ -18,7 +16,6 @@ type ( cdc codec.BinaryCodec storeService store.KVStoreService logger log.Logger - authority string } ) @@ -26,21 +23,16 @@ func NewKeeper( cdc codec.BinaryCodec, storeService store.KVStoreService, logger log.Logger, - authority string, ) *Keeper { - if _, err := sdk.AccAddressFromBech32(authority); err != nil { - panic(fmt.Sprintf("invalid authority address: %s", authority)) - } return &Keeper{ cdc: cdc, storeService: storeService, logger: logger, - authority: authority, } } -func (k Keeper) GetAuthority() string { - return k.authority +func (k Keeper) GetAuthority(ctx sdk.Context) string { + return k.GetParams(ctx).Authority } func (k Keeper) Logger() log.Logger { diff --git a/x/zkp/keeper/msg_server.go b/x/zkp/keeper/msg_server.go index 2f55aadc..df671078 100644 --- a/x/zkp/keeper/msg_server.go +++ b/x/zkp/keeper/msg_server.go @@ -22,11 +22,11 @@ func NewMsgServerImpl(keeper Keeper) types.MsgServer { var _ types.MsgServer = msgServer{} func (ms msgServer) AddTrustedContract(goCtx context.Context, msg *types.MsgAddTrustedContract) (*types.MsgAddTrustedContractResponse, error) { - if ms.GetAuthority() != msg.Authority { - return nil, errorsmod.Wrapf(govtypes.ErrInvalidSigner, "unauthorized: expected %s, got %s", ms.GetAuthority(), msg.Authority) - } - ctx := sdk.UnwrapSDKContext(goCtx) + authority := ms.GetAuthority(ctx) + if authority != msg.Authority { + return nil, errorsmod.Wrapf(govtypes.ErrInvalidSigner, "unauthorized: expected %s, got %s", authority, msg.Authority) + } if ms.IsTrustedContract(ctx, msg.ContractAddress) { return nil, errorsmod.Wrapf(sdkerrors.ErrInvalidRequest, "contract %s is already trusted", msg.ContractAddress) @@ -44,11 +44,11 @@ func (ms msgServer) AddTrustedContract(goCtx context.Context, msg *types.MsgAddT } func (ms msgServer) RemoveTrustedContract(goCtx context.Context, msg *types.MsgRemoveTrustedContract) (*types.MsgRemoveTrustedContractResponse, error) { - if ms.GetAuthority() != msg.Authority { - return nil, errorsmod.Wrapf(govtypes.ErrInvalidSigner, "unauthorized: expected %s, got %s", ms.GetAuthority(), msg.Authority) - } - ctx := sdk.UnwrapSDKContext(goCtx) + authority := ms.GetAuthority(ctx) + if authority != msg.Authority { + return nil, errorsmod.Wrapf(govtypes.ErrInvalidSigner, "unauthorized: expected %s, got %s", authority, msg.Authority) + } if !ms.IsTrustedContract(ctx, msg.ContractAddress) { return nil, errorsmod.Wrapf(sdkerrors.ErrNotFound, "contract %s is not in the trusted list", msg.ContractAddress) diff --git a/x/zkp/keeper/msg_update_params.go b/x/zkp/keeper/msg_update_params.go new file mode 100644 index 00000000..705b8be3 --- /dev/null +++ b/x/zkp/keeper/msg_update_params.go @@ -0,0 +1,32 @@ +package keeper + +import ( + "context" + + errorsmod "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + + "github.com/Fairblock/fairyring/x/zkp/types" +) + +func (ms msgServer) UpdateParams(goCtx context.Context, msg *types.MsgUpdateParams) (*types.MsgUpdateParamsResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + authority := ms.GetAuthority(ctx) + if authority != msg.Authority { + return nil, errorsmod.Wrapf(govtypes.ErrInvalidSigner, "unauthorized: expected %s, got %s", authority, msg.Authority) + } + + if err := ms.SetParams(ctx, msg.Params); err != nil { + return nil, err + } + + ctx.EventManager().EmitEvent(sdk.NewEvent( + types.ModuleName, + sdk.NewAttribute(sdk.AttributeKeyAction, "update_params"), + sdk.NewAttribute("authority", msg.Authority), + sdk.NewAttribute("zkp_authority", msg.Params.Authority), + )) + + return &types.MsgUpdateParamsResponse{}, nil +} diff --git a/x/zkp/keeper/params.go b/x/zkp/keeper/params.go new file mode 100644 index 00000000..db24ff4c --- /dev/null +++ b/x/zkp/keeper/params.go @@ -0,0 +1,40 @@ +package keeper + +import ( + "context" + + "github.com/cosmos/cosmos-sdk/runtime" + + "github.com/Fairblock/fairyring/x/zkp/types" +) + +// GetParams returns the current zkp module params. +func (k Keeper) GetParams(ctx context.Context) (params types.Params) { + store := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) + bz := store.Get(types.ParamsKey) + if bz == nil { + return types.DefaultParams() + } + + k.cdc.MustUnmarshal(bz, ¶ms) + if params.Authority == "" { + params.Authority = types.DefaultAuthority() + } + return params +} + +// SetParams stores the zkp module params after validating them. +func (k Keeper) SetParams(ctx context.Context, params types.Params) error { + if err := params.Validate(); err != nil { + return err + } + + store := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) + bz, err := k.cdc.Marshal(¶ms) + if err != nil { + return err + } + store.Set(types.ParamsKey, bz) + + return nil +} diff --git a/x/zkp/keeper/query.go b/x/zkp/keeper/query.go index 55ca638e..347655b6 100644 --- a/x/zkp/keeper/query.go +++ b/x/zkp/keeper/query.go @@ -1,8 +1,22 @@ package keeper import ( + "context" + "github.com/Fairblock/fairyring/x/zkp/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) var _ types.QueryServer = &Keeper{} +func (k Keeper) TrustedContracts(goCtx context.Context, req *types.TrustedContractsRequest) (*types.TrustedContractsResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + ctx := sdk.UnwrapSDKContext(goCtx) + contracts := k.GetAllTrustedContracts(ctx) + return &types.TrustedContractsResponse{ContractAddresses: contracts}, nil +} diff --git a/x/zkp/keeper/query_filtered.go b/x/zkp/keeper/query_filtered.go index 4baf7cd9..a8928de3 100644 --- a/x/zkp/keeper/query_filtered.go +++ b/x/zkp/keeper/query_filtered.go @@ -18,12 +18,10 @@ func NewFilteredQueryServer(keeper Keeper) types.QueryServer { return &FilteredQueryServer{keeper: keeper} } -var _ types.TrustedContractsQueryServer = &FilteredQueryServer{} - -func (f *FilteredQueryServer) TrustedContracts(goCtx context.Context, req *types.QueryTrustedContractsRequest) (*types.QueryTrustedContractsResponse, error) { +func (f *FilteredQueryServer) TrustedContracts(goCtx context.Context, req *types.TrustedContractsRequest) (*types.TrustedContractsResponse, error) { ctx := sdk.UnwrapSDKContext(goCtx) contracts := f.keeper.GetAllTrustedContracts(ctx) - return &types.QueryTrustedContractsResponse{ContractAddresses: contracts}, nil + return &types.TrustedContractsResponse{ContractAddresses: contracts}, nil } func (f *FilteredQueryServer) VerifyWithdrawRangeProof(ctx context.Context, req *types.QueryVerifyWithdrawRangeProofRequest) (*types.QueryVerifyWithdrawRangeProofResponse, error) { @@ -49,4 +47,3 @@ func (f *FilteredQueryServer) VerifyTransferProofs(ctx context.Context, req *typ func (f *FilteredQueryServer) VerifyWithdrawProofs(ctx context.Context, req *types.QueryVerifyWithdrawProofsRequest) (*types.QueryVerifyWithdrawProofsResponse, error) { return nil, status.Errorf(codes.PermissionDenied, "ZKP verification queries are only accessible through CosmWasm contracts, not via gRPC or REST API") } - diff --git a/x/zkp/keeper/query_proof_verification.go b/x/zkp/keeper/query_proof_verification.go index 22a1d43b..9a3afcf1 100644 --- a/x/zkp/keeper/query_proof_verification.go +++ b/x/zkp/keeper/query_proof_verification.go @@ -556,4 +556,3 @@ func (k Keeper) VerifyWithdrawProofs(goCtx context.Context, req *types.QueryVeri Error: "", }, nil } - diff --git a/x/zkp/module/autocli.go b/x/zkp/module/autocli.go new file mode 100644 index 00000000..be96dc77 --- /dev/null +++ b/x/zkp/module/autocli.go @@ -0,0 +1,51 @@ +package zkp + +import ( + autocliv1 "cosmossdk.io/api/cosmos/autocli/v1" + + modulev1 "github.com/Fairblock/fairyring/api/fairyring/zkp" +) + +// AutoCLIOptions implements the autocli.HasAutoCLIConfig interface. +// +// Only TrustedContracts is exposed as a public CLI query. The proof verification +// RPCs stay intentionally hidden from the CLI because they are meant to be +// called only through the CosmWasm trusted-contract query path. +func (am AppModule) AutoCLIOptions() *autocliv1.ModuleOptions { + return &autocliv1.ModuleOptions{ + Query: &autocliv1.ServiceCommandDescriptor{ + Service: modulev1.Query_ServiceDesc.ServiceName, + RpcCommandOptions: []*autocliv1.RpcCommandOptions{ + { + RpcMethod: "TrustedContracts", + Use: "trusted-contracts", + Short: "List trusted CosmWasm contracts allowed to use ZKP verification queries", + }, + { + RpcMethod: "VerifyWithdrawRangeProof", + Skip: true, + }, + { + RpcMethod: "VerifyTransferRangeProof", + Skip: true, + }, + { + RpcMethod: "VerifyValidityProof", + Skip: true, + }, + { + RpcMethod: "VerifyEqualityProof", + Skip: true, + }, + { + RpcMethod: "VerifyTransferProofs", + Skip: true, + }, + { + RpcMethod: "VerifyWithdrawProofs", + Skip: true, + }, + }, + }, + } +} diff --git a/x/zkp/module/genesis.go b/x/zkp/module/genesis.go index b72e85c2..f1b1525b 100644 --- a/x/zkp/module/genesis.go +++ b/x/zkp/module/genesis.go @@ -1,6 +1,8 @@ package zkp import ( + "fmt" + sdk "github.com/cosmos/cosmos-sdk/types" "github.com/Fairblock/fairyring/x/zkp/keeper" @@ -9,6 +11,14 @@ import ( func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) { k.Logger().Info("Starting genesis state initialization for module", "module", types.ModuleName) + params := genState.Params + if params.Authority == "" { + params = types.DefaultParams() + } + if err := k.SetParams(ctx, params); err != nil { + panic(fmt.Sprintf("failed to set %s params: %v", types.ModuleName, err)) + } + for _, addr := range genState.TrustedContracts { k.StoreTrustedContract(ctx, addr) } @@ -17,7 +27,7 @@ func InitGenesis(ctx sdk.Context, k keeper.Keeper, genState types.GenesisState) func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { genesis := types.DefaultGenesis() + genesis.Params = k.GetParams(ctx) genesis.TrustedContracts = k.GetAllTrustedContracts(ctx) return genesis } - diff --git a/x/zkp/module/module.go b/x/zkp/module/module.go index 3ad60b57..55976d08 100644 --- a/x/zkp/module/module.go +++ b/x/zkp/module/module.go @@ -12,9 +12,9 @@ import ( "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/spf13/cobra" + "cosmossdk.io/core/appmodule" "github.com/Fairblock/fairyring/x/zkp/keeper" "github.com/Fairblock/fairyring/x/zkp/types" - "cosmossdk.io/core/appmodule" ) var ( @@ -109,7 +109,6 @@ func (am AppModule) RegisterServices(cfg module.Configurator) { types.RegisterMsgServer(cfg.MsgServer(), keeper.NewMsgServerImpl(am.keeper)) filteredServer := keeper.NewFilteredQueryServer(am.keeper) types.RegisterQueryServer(cfg.QueryServer(), filteredServer) - types.RegisterTrustedContractsQueryServer(cfg.QueryServer(), filteredServer.(types.TrustedContractsQueryServer)) } // RegisterInvariants registers the invariants of the module. If an invariant deviates from its predicted value, the InvariantRegistry triggers appropriate logic (most often the chain will be halted) @@ -140,4 +139,3 @@ func (am AppModule) IsAppModule() {} // IsOnePerModuleType implements the appmodule.AppModule interface. func (am AppModule) IsOnePerModuleType() {} - diff --git a/x/zkp/types/codec.go b/x/zkp/types/codec.go index 96444a99..96e56e20 100644 --- a/x/zkp/types/codec.go +++ b/x/zkp/types/codec.go @@ -7,6 +7,9 @@ import ( ) func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { + registry.RegisterImplementations((*sdk.Msg)(nil), + &MsgUpdateParams{}, + ) registry.RegisterImplementations((*sdk.Msg)(nil), &MsgAddTrustedContract{}, ) @@ -16,4 +19,3 @@ func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) } - diff --git a/x/zkp/types/genesis.go b/x/zkp/types/genesis.go index 521a3e98..2ec6bb6e 100644 --- a/x/zkp/types/genesis.go +++ b/x/zkp/types/genesis.go @@ -7,10 +7,18 @@ import ( ) func DefaultGenesis() *GenesisState { - return &GenesisState{} + return &GenesisState{ + Params: DefaultParams(), + } } func (gs GenesisState) Validate() error { + if gs.Params.Authority != "" { + if err := gs.Params.Validate(); err != nil { + return fmt.Errorf("invalid params: %w", err) + } + } + seen := make(map[string]bool) for i, addr := range gs.TrustedContracts { if _, err := sdk.AccAddressFromBech32(addr); err != nil { @@ -23,4 +31,3 @@ func (gs GenesisState) Validate() error { } return nil } - diff --git a/x/zkp/types/genesis.pb.go b/x/zkp/types/genesis.pb.go index b0e5d685..73e44c37 100644 --- a/x/zkp/types/genesis.pb.go +++ b/x/zkp/types/genesis.pb.go @@ -5,6 +5,7 @@ package types import ( fmt "fmt" + _ "github.com/cosmos/cosmos-sdk/types/tx/amino" _ "github.com/cosmos/gogoproto/gogoproto" proto "github.com/cosmos/gogoproto/proto" io "io" @@ -24,7 +25,8 @@ var _ = math.Inf const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package type GenesisState struct { - TrustedContracts []string `protobuf:"bytes,1,rep,name=trusted_contracts,json=trustedContracts,proto3" json:"trusted_contracts,omitempty"` + Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` + TrustedContracts []string `protobuf:"bytes,2,rep,name=trusted_contracts,json=trustedContracts,proto3" json:"trusted_contracts,omitempty"` } func (m *GenesisState) Reset() { *m = GenesisState{} } @@ -60,6 +62,20 @@ func (m *GenesisState) XXX_DiscardUnknown() { var xxx_messageInfo_GenesisState proto.InternalMessageInfo +func (m *GenesisState) GetParams() Params { + if m != nil { + return m.Params + } + return Params{} +} + +func (m *GenesisState) GetTrustedContracts() []string { + if m != nil { + return m.TrustedContracts + } + return nil +} + func init() { proto.RegisterType((*GenesisState)(nil), "fairyring.zkp.GenesisState") } @@ -67,17 +83,23 @@ func init() { func init() { proto.RegisterFile("fairyring/zkp/genesis.proto", fileDescriptor_34f7947a365444f2) } var fileDescriptor_34f7947a365444f2 = []byte{ - // 152 bytes of a gzipped FileDescriptorProto + // 244 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4e, 0x4b, 0xcc, 0x2c, 0xaa, 0x2c, 0xca, 0xcc, 0x4b, 0xd7, 0xaf, 0xca, 0x2e, 0xd0, 0x4f, 0x4f, 0xcd, 0x4b, 0x2d, 0xce, 0x2c, 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x85, 0x4b, 0xea, 0x55, 0x65, 0x17, 0x48, - 0x89, 0xa4, 0xe7, 0xa7, 0xe7, 0x83, 0x65, 0xf4, 0x41, 0x2c, 0x88, 0x22, 0x25, 0x3e, 0x2e, 0x1e, - 0x77, 0x88, 0xae, 0xe0, 0x92, 0xc4, 0x92, 0x54, 0x27, 0x97, 0x13, 0x8f, 0xe4, 0x18, 0x2f, 0x3c, - 0x92, 0x63, 0x7c, 0xf0, 0x48, 0x8e, 0x71, 0xc2, 0x63, 0x39, 0x86, 0x0b, 0x8f, 0xe5, 0x18, 0x6e, - 0x3c, 0x96, 0x63, 0x88, 0xd2, 0x4a, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, - 0x77, 0x4b, 0xcc, 0x2c, 0x4a, 0xca, 0xc9, 0x4f, 0xce, 0xd6, 0x47, 0x38, 0xa0, 0x02, 0xec, 0x84, - 0x92, 0xca, 0x82, 0xd4, 0xe2, 0x24, 0x36, 0xb0, 0xe1, 0xc6, 0x80, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x2d, 0x67, 0x64, 0xdb, 0xa0, 0x00, 0x00, 0x00, + 0x09, 0x26, 0xe6, 0x66, 0xe6, 0xe5, 0xeb, 0x83, 0x49, 0x88, 0x0a, 0x29, 0x29, 0x54, 0xed, 0x05, + 0x89, 0x45, 0x89, 0xb9, 0x50, 0xdd, 0x52, 0x22, 0xe9, 0xf9, 0xe9, 0xf9, 0x60, 0xa6, 0x3e, 0x88, + 0x05, 0x11, 0x55, 0x2a, 0xe5, 0xe2, 0x71, 0x87, 0x58, 0x12, 0x5c, 0x92, 0x58, 0x92, 0x2a, 0x64, + 0xc1, 0xc5, 0x06, 0xd1, 0x25, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x6d, 0x24, 0xaa, 0x87, 0x62, 0xa9, + 0x5e, 0x00, 0x58, 0xd2, 0x89, 0xf3, 0xc4, 0x3d, 0x79, 0x86, 0x15, 0xcf, 0x37, 0x68, 0x31, 0x06, + 0x41, 0xd5, 0x0b, 0x69, 0x73, 0x09, 0x96, 0x14, 0x95, 0x16, 0x97, 0xa4, 0xa6, 0xc4, 0x27, 0xe7, + 0xe7, 0x95, 0x14, 0x25, 0x26, 0x97, 0x14, 0x4b, 0x30, 0x29, 0x30, 0x6b, 0x70, 0x06, 0x09, 0x40, + 0x25, 0x9c, 0x61, 0xe2, 0x4e, 0x2e, 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, + 0x91, 0x1c, 0xe3, 0x84, 0xc7, 0x72, 0x0c, 0x17, 0x1e, 0xcb, 0x31, 0xdc, 0x78, 0x2c, 0xc7, 0x10, + 0xa5, 0x95, 0x9e, 0x59, 0x92, 0x51, 0x9a, 0xa4, 0x97, 0x9c, 0x9f, 0xab, 0xef, 0x96, 0x98, 0x59, + 0x94, 0x94, 0x93, 0x9f, 0x9c, 0xad, 0x8f, 0xf0, 0x57, 0x05, 0xd8, 0x67, 0x25, 0x95, 0x05, 0xa9, + 0xc5, 0x49, 0x6c, 0x60, 0x3f, 0x18, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff, 0x2d, 0xa1, 0xcc, 0x84, + 0x36, 0x01, 0x00, 0x00, } func (m *GenesisState) Marshal() (dAtA []byte, err error) { @@ -106,9 +128,19 @@ func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.TrustedContracts[iNdEx]) i = encodeVarintGenesis(dAtA, i, uint64(len(m.TrustedContracts[iNdEx]))) i-- - dAtA[i] = 0xa + dAtA[i] = 0x12 + } + } + { + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err } + i -= size + i = encodeVarintGenesis(dAtA, i, uint64(size)) } + i-- + dAtA[i] = 0xa return len(dAtA) - i, nil } @@ -129,6 +161,8 @@ func (m *GenesisState) Size() (n int) { } var l int _ = l + l = m.Params.Size() + n += 1 + l + sovGenesis(uint64(l)) if len(m.TrustedContracts) > 0 { for _, s := range m.TrustedContracts { l = len(s) @@ -138,13 +172,6 @@ func (m *GenesisState) Size() (n int) { return n } -func (m *GenesisState) GetTrustedContracts() []string { - if m != nil { - return m.TrustedContracts - } - return nil -} - func sovGenesis(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -181,6 +208,39 @@ func (m *GenesisState) Unmarshal(dAtA []byte) error { } switch fieldNum { case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGenesis + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGenesis + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGenesis + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field TrustedContracts", wireType) } diff --git a/x/zkp/types/msgs.go b/x/zkp/types/msgs.go deleted file mode 100644 index 4b377332..00000000 --- a/x/zkp/types/msgs.go +++ /dev/null @@ -1,433 +0,0 @@ -package types - -import ( - "context" - "fmt" - - errorsmod "cosmossdk.io/errors" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - proto "github.com/cosmos/gogoproto/proto" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -var ( - _ sdk.Msg = &MsgAddTrustedContract{} - _ sdk.Msg = &MsgRemoveTrustedContract{} -) - -type MsgAddTrustedContract struct { - Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"` - ContractAddress string `protobuf:"bytes,2,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` -} - -func (m *MsgAddTrustedContract) Reset() { *m = MsgAddTrustedContract{} } -func (m *MsgAddTrustedContract) String() string { return proto.CompactTextString(m) } -func (m *MsgAddTrustedContract) ProtoMessage() {} -func (*MsgAddTrustedContract) Descriptor() ([]byte, []int) { - return fileDescriptor_tx_proto, []int{0} -} - -func (m *MsgAddTrustedContract) ValidateBasic() error { - if _, err := sdk.AccAddressFromBech32(m.Authority); err != nil { - return errorsmod.Wrapf(sdkerrors.ErrInvalidAddress, "invalid authority address (%s)", err) - } - if _, err := sdk.AccAddressFromBech32(m.ContractAddress); err != nil { - return errorsmod.Wrapf(sdkerrors.ErrInvalidAddress, "invalid contract address (%s)", err) - } - return nil -} - -func (m *MsgAddTrustedContract) GetSigners() []sdk.AccAddress { - signer, _ := sdk.AccAddressFromBech32(m.Authority) - return []sdk.AccAddress{signer} -} - -func (m *MsgAddTrustedContract) Marshal() ([]byte, error) { - size := m.Size() - buf := make([]byte, size) - n, err := m.MarshalToSizedBuffer(buf) - if err != nil { - return nil, err - } - return buf[:n], nil -} - -func (m *MsgAddTrustedContract) MarshalTo(data []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(data[:size]) -} - -func (m *MsgAddTrustedContract) MarshalToSizedBuffer(data []byte) (int, error) { - i := len(data) - if len(m.ContractAddress) > 0 { - i -= len(m.ContractAddress) - copy(data[i:], m.ContractAddress) - i = encodeVarint(data, i, uint64(len(m.ContractAddress))) - i-- - data[i] = 0x12 - } - if len(m.Authority) > 0 { - i -= len(m.Authority) - copy(data[i:], m.Authority) - i = encodeVarint(data, i, uint64(len(m.Authority))) - i-- - data[i] = 0x0a - } - return len(data) - i, nil -} - -func (m *MsgAddTrustedContract) Size() int { - n := 0 - if len(m.Authority) > 0 { - n += 1 + len(m.Authority) + sovMsg(uint64(len(m.Authority))) - } - if len(m.ContractAddress) > 0 { - n += 1 + len(m.ContractAddress) + sovMsg(uint64(len(m.ContractAddress))) - } - return n -} - -func (m *MsgAddTrustedContract) Unmarshal(data []byte) error { - l := len(data) - idx := 0 - for idx < l { - preIdx := idx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if idx >= l { - return fmt.Errorf("unexpected EOF") - } - b := data[idx] - idx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType != 2 { - return fmt.Errorf("unexpected wire type %d for field %d", wireType, fieldNum) - } - var strLen uint64 - for shift := uint(0); ; shift += 7 { - if idx >= l { - return fmt.Errorf("unexpected EOF") - } - b := data[idx] - idx++ - strLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - if int(strLen) < 0 || idx+int(strLen) > l { - return fmt.Errorf("invalid string length") - } - switch fieldNum { - case 1: - m.Authority = string(data[idx : idx+int(strLen)]) - case 2: - m.ContractAddress = string(data[idx : idx+int(strLen)]) - default: - _ = preIdx - } - idx += int(strLen) - } - return nil -} - -type MsgAddTrustedContractResponse struct{} - -func (m *MsgAddTrustedContractResponse) Reset() { *m = MsgAddTrustedContractResponse{} } -func (m *MsgAddTrustedContractResponse) String() string { return proto.CompactTextString(m) } -func (m *MsgAddTrustedContractResponse) ProtoMessage() {} -func (*MsgAddTrustedContractResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tx_proto, []int{1} -} -func (m *MsgAddTrustedContractResponse) Marshal() ([]byte, error) { - return []byte{}, nil -} -func (m *MsgAddTrustedContractResponse) MarshalTo(data []byte) (int, error) { - return 0, nil -} -func (m *MsgAddTrustedContractResponse) MarshalToSizedBuffer(data []byte) (int, error) { - return len(data), nil -} -func (m *MsgAddTrustedContractResponse) Size() int { return 0 } -func (m *MsgAddTrustedContractResponse) Unmarshal(data []byte) error { return nil } - -type MsgRemoveTrustedContract struct { - Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"` - ContractAddress string `protobuf:"bytes,2,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` -} - -func (m *MsgRemoveTrustedContract) Reset() { *m = MsgRemoveTrustedContract{} } -func (m *MsgRemoveTrustedContract) String() string { return proto.CompactTextString(m) } -func (m *MsgRemoveTrustedContract) ProtoMessage() {} -func (*MsgRemoveTrustedContract) Descriptor() ([]byte, []int) { - return fileDescriptor_tx_proto, []int{2} -} - -func (m *MsgRemoveTrustedContract) ValidateBasic() error { - if _, err := sdk.AccAddressFromBech32(m.Authority); err != nil { - return errorsmod.Wrapf(sdkerrors.ErrInvalidAddress, "invalid authority address (%s)", err) - } - if _, err := sdk.AccAddressFromBech32(m.ContractAddress); err != nil { - return errorsmod.Wrapf(sdkerrors.ErrInvalidAddress, "invalid contract address (%s)", err) - } - return nil -} - -func (m *MsgRemoveTrustedContract) GetSigners() []sdk.AccAddress { - signer, _ := sdk.AccAddressFromBech32(m.Authority) - return []sdk.AccAddress{signer} -} - -func (m *MsgRemoveTrustedContract) Marshal() ([]byte, error) { - size := m.Size() - buf := make([]byte, size) - n, err := m.MarshalToSizedBuffer(buf) - if err != nil { - return nil, err - } - return buf[:n], nil -} - -func (m *MsgRemoveTrustedContract) MarshalTo(data []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(data[:size]) -} - -func (m *MsgRemoveTrustedContract) MarshalToSizedBuffer(data []byte) (int, error) { - i := len(data) - if len(m.ContractAddress) > 0 { - i -= len(m.ContractAddress) - copy(data[i:], m.ContractAddress) - i = encodeVarint(data, i, uint64(len(m.ContractAddress))) - i-- - data[i] = 0x12 - } - if len(m.Authority) > 0 { - i -= len(m.Authority) - copy(data[i:], m.Authority) - i = encodeVarint(data, i, uint64(len(m.Authority))) - i-- - data[i] = 0x0a - } - return len(data) - i, nil -} - -func (m *MsgRemoveTrustedContract) Size() int { - n := 0 - if len(m.Authority) > 0 { - n += 1 + len(m.Authority) + sovMsg(uint64(len(m.Authority))) - } - if len(m.ContractAddress) > 0 { - n += 1 + len(m.ContractAddress) + sovMsg(uint64(len(m.ContractAddress))) - } - return n -} - -func (m *MsgRemoveTrustedContract) Unmarshal(data []byte) error { - l := len(data) - idx := 0 - for idx < l { - preIdx := idx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if idx >= l { - return fmt.Errorf("unexpected EOF") - } - b := data[idx] - idx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType != 2 { - return fmt.Errorf("unexpected wire type %d for field %d", wireType, fieldNum) - } - var strLen uint64 - for shift := uint(0); ; shift += 7 { - if idx >= l { - return fmt.Errorf("unexpected EOF") - } - b := data[idx] - idx++ - strLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - if int(strLen) < 0 || idx+int(strLen) > l { - return fmt.Errorf("invalid string length") - } - switch fieldNum { - case 1: - m.Authority = string(data[idx : idx+int(strLen)]) - case 2: - m.ContractAddress = string(data[idx : idx+int(strLen)]) - default: - _ = preIdx - } - idx += int(strLen) - } - return nil -} - -type MsgRemoveTrustedContractResponse struct{} - -func (m *MsgRemoveTrustedContractResponse) Reset() { *m = MsgRemoveTrustedContractResponse{} } -func (m *MsgRemoveTrustedContractResponse) String() string { return proto.CompactTextString(m) } -func (m *MsgRemoveTrustedContractResponse) ProtoMessage() {} -func (*MsgRemoveTrustedContractResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_tx_proto, []int{3} -} -func (m *MsgRemoveTrustedContractResponse) Marshal() ([]byte, error) { - return []byte{}, nil -} -func (m *MsgRemoveTrustedContractResponse) MarshalTo(data []byte) (int, error) { - return 0, nil -} -func (m *MsgRemoveTrustedContractResponse) MarshalToSizedBuffer(data []byte) (int, error) { - return len(data), nil -} -func (m *MsgRemoveTrustedContractResponse) Size() int { return 0 } -func (m *MsgRemoveTrustedContractResponse) Unmarshal(data []byte) error { return nil } - -func init() { - proto.RegisterType((*MsgAddTrustedContract)(nil), "fairyring.zkp.MsgAddTrustedContract") - proto.RegisterType((*MsgAddTrustedContractResponse)(nil), "fairyring.zkp.MsgAddTrustedContractResponse") - proto.RegisterType((*MsgRemoveTrustedContract)(nil), "fairyring.zkp.MsgRemoveTrustedContract") - proto.RegisterType((*MsgRemoveTrustedContractResponse)(nil), "fairyring.zkp.MsgRemoveTrustedContractResponse") - proto.RegisterType((*QueryTrustedContractsRequest)(nil), "fairyring.zkp.QueryTrustedContractsRequest") - proto.RegisterType((*QueryTrustedContractsResponse)(nil), "fairyring.zkp.QueryTrustedContractsResponse") - proto.RegisterFile("fairyring/zkp/tx.proto", fileDescriptor_tx_proto) -} - -var fileDescriptor_tx_proto = []byte{ - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x93, 0xc1, 0x4a, 0xf3, 0x40, - 0x14, 0x85, 0x99, 0xbf, 0xfc, 0x42, 0x2f, 0x28, 0x75, 0xa0, 0x1a, 0x82, 0xd5, 0x12, 0x04, 0x4b, - 0x2d, 0x19, 0xac, 0x3b, 0x5d, 0xa9, 0xe0, 0xae, 0x0b, 0x4b, 0x41, 0x70, 0x23, 0x69, 0x32, 0x4e, - 0x43, 0x4d, 0x27, 0x9d, 0x3b, 0x29, 0x4d, 0x57, 0xe2, 0xc2, 0xe7, 0xe9, 0x5b, 0x15, 0xdf, 0x42, - 0xda, 0x68, 0x8a, 0x69, 0x5a, 0xba, 0x70, 0x15, 0xc8, 0x39, 0x9c, 0x73, 0xf9, 0xee, 0x5c, 0x38, - 0x78, 0x71, 0x7c, 0x15, 0x2b, 0x7f, 0x20, 0xd8, 0xa4, 0x1f, 0x32, 0x3d, 0xb6, 0x43, 0x25, 0xb5, - 0xa4, 0xbb, 0xe9, 0x7f, 0x7b, 0xd2, 0x0f, 0xcd, 0x43, 0x57, 0x62, 0x20, 0x91, 0x05, 0x28, 0xd8, - 0xe8, 0x62, 0xfe, 0x49, 0x7c, 0x56, 0x07, 0xca, 0x2d, 0x14, 0x37, 0x9e, 0xd7, 0x51, 0x11, 0x6a, - 0xee, 0xdd, 0xc9, 0x81, 0x56, 0x8e, 0xab, 0xe9, 0x3e, 0x14, 0x9d, 0x48, 0xf7, 0xa4, 0xf2, 0x75, - 0x6c, 0x90, 0x2a, 0xa9, 0x15, 0xa9, 0x01, 0x25, 0xf7, 0x5b, 0x7e, 0x76, 0x3c, 0x4f, 0x71, 0x44, - 0xe3, 0xdf, 0x5c, 0xb9, 0xda, 0x7b, 0x9f, 0x4d, 0xeb, 0x4b, 0xbf, 0x75, 0x02, 0x95, 0xdc, 0xd4, - 0x36, 0xc7, 0x50, 0x0e, 0x90, 0x5b, 0x8f, 0x60, 0xb4, 0x50, 0xb4, 0x79, 0x20, 0x47, 0xfc, 0x4f, - 0x9b, 0x2d, 0xa8, 0xae, 0x0b, 0x4e, 0xcb, 0x8f, 0xe1, 0xe8, 0x21, 0xe2, 0x2a, 0xce, 0xe8, 0xd8, - 0xe6, 0xc3, 0x88, 0xa3, 0xb6, 0xae, 0xa1, 0xb2, 0x46, 0x4f, 0x02, 0xa8, 0x09, 0x34, 0x3b, 0x0e, - 0x47, 0x83, 0x54, 0x0b, 0xb5, 0x62, 0xf3, 0x93, 0x40, 0xa1, 0x85, 0x82, 0xf6, 0x80, 0xe6, 0x50, - 0x3d, 0xb5, 0x7f, 0xed, 0xc5, 0xce, 0xa5, 0x64, 0x36, 0xb6, 0x71, 0xa5, 0xd3, 0x0c, 0xa1, 0x9c, - 0x0f, 0xf2, 0x6c, 0x35, 0x26, 0xd7, 0x68, 0xb2, 0x2d, 0x8d, 0x3f, 0x95, 0xe6, 0xff, 0xb7, 0xd9, - 0xb4, 0x4e, 0x9a, 0x1f, 0x04, 0xca, 0x59, 0x48, 0x0b, 0x72, 0x34, 0x80, 0x52, 0x56, 0xa0, 0xe7, - 0x99, 0x96, 0x4d, 0x3b, 0x58, 0x41, 0xb0, 0x71, 0x21, 0xb7, 0x8d, 0xa7, 0xba, 0xf0, 0x75, 0x2f, - 0xea, 0xda, 0xae, 0x0c, 0xd8, 0xbd, 0xe3, 0xab, 0xee, 0xab, 0x74, 0xfb, 0x6c, 0x79, 0x1c, 0xe3, - 0xe4, 0x3c, 0xe2, 0x90, 0x63, 0x77, 0x67, 0xf1, 0xf4, 0x2f, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, - 0x07, 0x4c, 0xba, 0xf2, 0x3c, 0x03, 0x00, 0x00, -} - -type MsgServer interface { - AddTrustedContract(context.Context, *MsgAddTrustedContract) (*MsgAddTrustedContractResponse, error) - RemoveTrustedContract(context.Context, *MsgRemoveTrustedContract) (*MsgRemoveTrustedContractResponse, error) -} - -type UnimplementedMsgServer struct{} - -func (*UnimplementedMsgServer) AddTrustedContract(context.Context, *MsgAddTrustedContract) (*MsgAddTrustedContractResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method AddTrustedContract not implemented") -} -func (*UnimplementedMsgServer) RemoveTrustedContract(context.Context, *MsgRemoveTrustedContract) (*MsgRemoveTrustedContractResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method RemoveTrustedContract not implemented") -} - -func RegisterMsgServer(s grpc.ServiceRegistrar, srv MsgServer) { - s.RegisterService(&_Msg_serviceDesc, srv) -} - -func _Msg_AddTrustedContract_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgAddTrustedContract) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).AddTrustedContract(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/fairyring.zkp.Msg/AddTrustedContract", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).AddTrustedContract(ctx, req.(*MsgAddTrustedContract)) - } - return interceptor(ctx, in, info, handler) -} - -func _Msg_RemoveTrustedContract_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MsgRemoveTrustedContract) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MsgServer).RemoveTrustedContract(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/fairyring.zkp.Msg/RemoveTrustedContract", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MsgServer).RemoveTrustedContract(ctx, req.(*MsgRemoveTrustedContract)) - } - return interceptor(ctx, in, info, handler) -} - -var _Msg_serviceDesc = grpc.ServiceDesc{ - ServiceName: "fairyring.zkp.Msg", - HandlerType: (*MsgServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "AddTrustedContract", - Handler: _Msg_AddTrustedContract_Handler, - }, - { - MethodName: "RemoveTrustedContract", - Handler: _Msg_RemoveTrustedContract_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "fairyring/zkp/tx.proto", -} - -func encodeVarint(data []byte, offset int, v uint64) int { - offset -= sovMsg(v) - base := offset - for v >= 1<<7 { - data[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - data[offset] = uint8(v) - return base -} - -func sovMsg(x uint64) int { - n := 0 - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n -} diff --git a/x/zkp/types/params.go b/x/zkp/types/params.go new file mode 100644 index 00000000..f1aefb38 --- /dev/null +++ b/x/zkp/types/params.go @@ -0,0 +1,62 @@ +package types + +import ( + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" +) + +var _ paramtypes.ParamSet = (*Params)(nil) + +var KeyAuthority = []byte("Authority") + +// DefaultAuthority returns the default authority for the zkp module. +// +// Keep this as a function instead of a package-level string so the bech32 +// address is derived after the application config has set the chain prefix. +func DefaultAuthority() string { + return authtypes.NewModuleAddress(govtypes.ModuleName).String() +} + +// ParamKeyTable returns the zkp module param key table. +func ParamKeyTable() paramtypes.KeyTable { + return paramtypes.NewKeyTable().RegisterParamSet(&Params{}) +} + +// NewParams creates a new Params instance. +func NewParams(authority string) Params { + return Params{Authority: authority} +} + +// DefaultParams returns a default set of parameters. +func DefaultParams() Params { + return NewParams(DefaultAuthority()) +} + +// ParamSetPairs implements params.ParamSet. +func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { + return paramtypes.ParamSetPairs{ + paramtypes.NewParamSetPair(KeyAuthority, &p.Authority, validateAuthority), + } +} + +// Validate validates the zkp module params. +func (p Params) Validate() error { + return validateAuthority(p.Authority) +} + +func validateAuthority(v interface{}) error { + authority, ok := v.(string) + if !ok { + return fmt.Errorf("invalid parameter type: %T", v) + } + + if _, err := sdk.AccAddressFromBech32(authority); err != nil { + return fmt.Errorf("invalid authority address: %w", err) + } + + return nil +} diff --git a/x/zkp/types/params.pb.go b/x/zkp/types/params.pb.go new file mode 100644 index 00000000..e8080a43 --- /dev/null +++ b/x/zkp/types/params.pb.go @@ -0,0 +1,345 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: fairyring/zkp/params.proto + +package types + +import ( + fmt "fmt" + _ "github.com/cosmos/cosmos-sdk/types/tx/amino" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// Params defines the parameters for the zkp module. +type Params struct { + Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty" yaml:"authority"` +} + +func (m *Params) Reset() { *m = Params{} } +func (m *Params) String() string { return proto.CompactTextString(m) } +func (*Params) ProtoMessage() {} +func (*Params) Descriptor() ([]byte, []int) { + return fileDescriptor_e7311bf5bf18527b, []int{0} +} +func (m *Params) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_Params.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *Params) XXX_Merge(src proto.Message) { + xxx_messageInfo_Params.Merge(m, src) +} +func (m *Params) XXX_Size() int { + return m.Size() +} +func (m *Params) XXX_DiscardUnknown() { + xxx_messageInfo_Params.DiscardUnknown(m) +} + +var xxx_messageInfo_Params proto.InternalMessageInfo + +func (m *Params) GetAuthority() string { + if m != nil { + return m.Authority + } + return "" +} + +func init() { + proto.RegisterType((*Params)(nil), "fairyring.zkp.Params") +} + +func init() { proto.RegisterFile("fairyring/zkp/params.proto", fileDescriptor_e7311bf5bf18527b) } + +var fileDescriptor_e7311bf5bf18527b = []byte{ + // 211 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4a, 0x4b, 0xcc, 0x2c, + 0xaa, 0x2c, 0xca, 0xcc, 0x4b, 0xd7, 0xaf, 0xca, 0x2e, 0xd0, 0x2f, 0x48, 0x2c, 0x4a, 0xcc, 0x2d, + 0xd6, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x85, 0xcb, 0xe9, 0x55, 0x65, 0x17, 0x48, 0x09, + 0x26, 0xe6, 0x66, 0xe6, 0xe5, 0xeb, 0x83, 0x49, 0x88, 0x0a, 0x29, 0x91, 0xf4, 0xfc, 0xf4, 0x7c, + 0x30, 0x53, 0x1f, 0xc4, 0x82, 0x88, 0x2a, 0x15, 0x71, 0xb1, 0x05, 0x80, 0xcd, 0x11, 0x32, 0xe2, + 0xe2, 0x4c, 0x2c, 0x2d, 0xc9, 0xc8, 0x2f, 0xca, 0x2c, 0xa9, 0x94, 0x60, 0x54, 0x60, 0xd4, 0xe0, + 0x74, 0x12, 0xf9, 0x74, 0x4f, 0x5e, 0xa0, 0x32, 0x31, 0x37, 0xc7, 0x4a, 0x09, 0x2e, 0xa5, 0x14, + 0x84, 0x50, 0x66, 0x65, 0xf2, 0x62, 0x81, 0x3c, 0x63, 0xd7, 0xf3, 0x0d, 0x5a, 0xda, 0xe9, 0x99, + 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0x6e, 0x89, 0x99, 0x45, 0x49, 0x39, 0xf9, + 0xc9, 0xd9, 0xfa, 0x08, 0xf7, 0x56, 0x80, 0x5d, 0x0c, 0xb1, 0xc9, 0xc9, 0xe5, 0xc4, 0x23, 0x39, + 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, 0xe1, 0xc2, 0x63, + 0x39, 0x86, 0x1b, 0x8f, 0xe5, 0x18, 0xa2, 0xb4, 0x88, 0x32, 0xa6, 0xa4, 0xb2, 0x20, 0xb5, 0x38, + 0x89, 0x0d, 0xec, 0x01, 0x63, 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8c, 0x68, 0x5b, 0x98, 0x16, + 0x01, 0x00, 0x00, +} + +func (this *Params) Equal(that interface{}) bool { + if that == nil { + return this == nil + } + + that1, ok := that.(*Params) + if !ok { + that2, ok := that.(Params) + if ok { + that1 = &that2 + } else { + return false + } + } + if that1 == nil { + return this == nil + } else if this == nil { + return false + } + if this.Authority != that1.Authority { + return false + } + return true +} +func (m *Params) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *Params) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Authority) > 0 { + i -= len(m.Authority) + copy(dAtA[i:], m.Authority) + i = encodeVarintParams(dAtA, i, uint64(len(m.Authority))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintParams(dAtA []byte, offset int, v uint64) int { + offset -= sovParams(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *Params) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Authority) + if l > 0 { + n += 1 + l + sovParams(uint64(l)) + } + return n +} + +func sovParams(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozParams(x uint64) (n int) { + return sovParams(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *Params) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: Params: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Authority", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthParams + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthParams + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Authority = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipParams(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthParams + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipParams(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowParams + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowParams + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowParams + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthParams + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupParams + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthParams + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthParams = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowParams = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupParams = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/zkp/types/query.pb.go b/x/zkp/types/query.pb.go index be5f9b6f..453ba032 100644 --- a/x/zkp/types/query.pb.go +++ b/x/zkp/types/query.pb.go @@ -30,6 +30,86 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +type TrustedContractsRequest struct { +} + +func (m *TrustedContractsRequest) Reset() { *m = TrustedContractsRequest{} } +func (m *TrustedContractsRequest) String() string { return proto.CompactTextString(m) } +func (*TrustedContractsRequest) ProtoMessage() {} +func (*TrustedContractsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d7ffffa30d808249, []int{0} +} +func (m *TrustedContractsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TrustedContractsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TrustedContractsRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *TrustedContractsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_TrustedContractsRequest.Merge(m, src) +} +func (m *TrustedContractsRequest) XXX_Size() int { + return m.Size() +} +func (m *TrustedContractsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_TrustedContractsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_TrustedContractsRequest proto.InternalMessageInfo + +type TrustedContractsResponse struct { + ContractAddresses []string `protobuf:"bytes,1,rep,name=ContractAddresses,proto3" json:"ContractAddresses,omitempty"` +} + +func (m *TrustedContractsResponse) Reset() { *m = TrustedContractsResponse{} } +func (m *TrustedContractsResponse) String() string { return proto.CompactTextString(m) } +func (*TrustedContractsResponse) ProtoMessage() {} +func (*TrustedContractsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d7ffffa30d808249, []int{1} +} +func (m *TrustedContractsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *TrustedContractsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_TrustedContractsResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *TrustedContractsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_TrustedContractsResponse.Merge(m, src) +} +func (m *TrustedContractsResponse) XXX_Size() int { + return m.Size() +} +func (m *TrustedContractsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_TrustedContractsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_TrustedContractsResponse proto.InternalMessageInfo + +func (m *TrustedContractsResponse) GetContractAddresses() []string { + if m != nil { + return m.ContractAddresses + } + return nil +} + // QueryVerifyWithdrawRangeProofRequest is request type for the Query/VerifyWithdrawRangeProof RPC method. type QueryVerifyWithdrawRangeProofRequest struct { ProofData []byte `protobuf:"bytes,1,opt,name=proof_data,json=proofData,proto3" json:"proof_data,omitempty"` @@ -39,7 +119,7 @@ func (m *QueryVerifyWithdrawRangeProofRequest) Reset() { *m = QueryVerif func (m *QueryVerifyWithdrawRangeProofRequest) String() string { return proto.CompactTextString(m) } func (*QueryVerifyWithdrawRangeProofRequest) ProtoMessage() {} func (*QueryVerifyWithdrawRangeProofRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{0} + return fileDescriptor_d7ffffa30d808249, []int{2} } func (m *QueryVerifyWithdrawRangeProofRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -85,7 +165,7 @@ func (m *QueryVerifyWithdrawRangeProofResponse) Reset() { *m = QueryVeri func (m *QueryVerifyWithdrawRangeProofResponse) String() string { return proto.CompactTextString(m) } func (*QueryVerifyWithdrawRangeProofResponse) ProtoMessage() {} func (*QueryVerifyWithdrawRangeProofResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{1} + return fileDescriptor_d7ffffa30d808249, []int{3} } func (m *QueryVerifyWithdrawRangeProofResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -137,7 +217,7 @@ func (m *QueryVerifyTransferRangeProofRequest) Reset() { *m = QueryVerif func (m *QueryVerifyTransferRangeProofRequest) String() string { return proto.CompactTextString(m) } func (*QueryVerifyTransferRangeProofRequest) ProtoMessage() {} func (*QueryVerifyTransferRangeProofRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{2} + return fileDescriptor_d7ffffa30d808249, []int{4} } func (m *QueryVerifyTransferRangeProofRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -183,7 +263,7 @@ func (m *QueryVerifyTransferRangeProofResponse) Reset() { *m = QueryVeri func (m *QueryVerifyTransferRangeProofResponse) String() string { return proto.CompactTextString(m) } func (*QueryVerifyTransferRangeProofResponse) ProtoMessage() {} func (*QueryVerifyTransferRangeProofResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{3} + return fileDescriptor_d7ffffa30d808249, []int{5} } func (m *QueryVerifyTransferRangeProofResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -235,7 +315,7 @@ func (m *QueryVerifyValidityProofRequest) Reset() { *m = QueryVerifyVali func (m *QueryVerifyValidityProofRequest) String() string { return proto.CompactTextString(m) } func (*QueryVerifyValidityProofRequest) ProtoMessage() {} func (*QueryVerifyValidityProofRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{4} + return fileDescriptor_d7ffffa30d808249, []int{6} } func (m *QueryVerifyValidityProofRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -281,7 +361,7 @@ func (m *QueryVerifyValidityProofResponse) Reset() { *m = QueryVerifyVal func (m *QueryVerifyValidityProofResponse) String() string { return proto.CompactTextString(m) } func (*QueryVerifyValidityProofResponse) ProtoMessage() {} func (*QueryVerifyValidityProofResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{5} + return fileDescriptor_d7ffffa30d808249, []int{7} } func (m *QueryVerifyValidityProofResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -333,7 +413,7 @@ func (m *QueryVerifyEqualityProofRequest) Reset() { *m = QueryVerifyEqua func (m *QueryVerifyEqualityProofRequest) String() string { return proto.CompactTextString(m) } func (*QueryVerifyEqualityProofRequest) ProtoMessage() {} func (*QueryVerifyEqualityProofRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{6} + return fileDescriptor_d7ffffa30d808249, []int{8} } func (m *QueryVerifyEqualityProofRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -379,7 +459,7 @@ func (m *QueryVerifyEqualityProofResponse) Reset() { *m = QueryVerifyEqu func (m *QueryVerifyEqualityProofResponse) String() string { return proto.CompactTextString(m) } func (*QueryVerifyEqualityProofResponse) ProtoMessage() {} func (*QueryVerifyEqualityProofResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{7} + return fileDescriptor_d7ffffa30d808249, []int{9} } func (m *QueryVerifyEqualityProofResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -439,7 +519,7 @@ func (m *QueryVerifyTransferProofsRequest) Reset() { *m = QueryVerifyTra func (m *QueryVerifyTransferProofsRequest) String() string { return proto.CompactTextString(m) } func (*QueryVerifyTransferProofsRequest) ProtoMessage() {} func (*QueryVerifyTransferProofsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{8} + return fileDescriptor_d7ffffa30d808249, []int{10} } func (m *QueryVerifyTransferProofsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -527,7 +607,7 @@ func (m *QueryVerifyTransferProofsResponse) Reset() { *m = QueryVerifyTr func (m *QueryVerifyTransferProofsResponse) String() string { return proto.CompactTextString(m) } func (*QueryVerifyTransferProofsResponse) ProtoMessage() {} func (*QueryVerifyTransferProofsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{9} + return fileDescriptor_d7ffffa30d808249, []int{11} } func (m *QueryVerifyTransferProofsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -585,7 +665,7 @@ func (m *QueryVerifyWithdrawProofsRequest) Reset() { *m = QueryVerifyWit func (m *QueryVerifyWithdrawProofsRequest) String() string { return proto.CompactTextString(m) } func (*QueryVerifyWithdrawProofsRequest) ProtoMessage() {} func (*QueryVerifyWithdrawProofsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{10} + return fileDescriptor_d7ffffa30d808249, []int{12} } func (m *QueryVerifyWithdrawProofsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -666,7 +746,7 @@ func (m *QueryVerifyWithdrawProofsResponse) Reset() { *m = QueryVerifyWi func (m *QueryVerifyWithdrawProofsResponse) String() string { return proto.CompactTextString(m) } func (*QueryVerifyWithdrawProofsResponse) ProtoMessage() {} func (*QueryVerifyWithdrawProofsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{11} + return fileDescriptor_d7ffffa30d808249, []int{13} } func (m *QueryVerifyWithdrawProofsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -710,6 +790,8 @@ func (m *QueryVerifyWithdrawProofsResponse) GetError() string { } func init() { + proto.RegisterType((*TrustedContractsRequest)(nil), "fairyring.zkp.TrustedContractsRequest") + proto.RegisterType((*TrustedContractsResponse)(nil), "fairyring.zkp.TrustedContractsResponse") proto.RegisterType((*QueryVerifyWithdrawRangeProofRequest)(nil), "fairyring.zkp.QueryVerifyWithdrawRangeProofRequest") proto.RegisterType((*QueryVerifyWithdrawRangeProofResponse)(nil), "fairyring.zkp.QueryVerifyWithdrawRangeProofResponse") proto.RegisterType((*QueryVerifyTransferRangeProofRequest)(nil), "fairyring.zkp.QueryVerifyTransferRangeProofRequest") @@ -727,55 +809,61 @@ func init() { func init() { proto.RegisterFile("fairyring/zkp/query.proto", fileDescriptor_d7ffffa30d808249) } var fileDescriptor_d7ffffa30d808249 = []byte{ - // 768 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x96, 0xc1, 0x4e, 0x13, 0x41, - 0x18, 0xc7, 0xd9, 0x0a, 0x08, 0x23, 0x20, 0x2c, 0xd5, 0xac, 0x8d, 0x16, 0xac, 0x90, 0x40, 0x4d, - 0x76, 0x89, 0xe0, 0xc5, 0x78, 0x30, 0x08, 0xc6, 0x13, 0x62, 0x35, 0x98, 0x78, 0xd9, 0x4c, 0xb7, - 0x5f, 0xb7, 0x93, 0xb6, 0x33, 0xcb, 0xec, 0x6c, 0xa1, 0x1c, 0x7d, 0x02, 0x13, 0xdf, 0x41, 0x0f, - 0x9e, 0xbd, 0xf9, 0x00, 0x1e, 0x49, 0xbc, 0x78, 0x34, 0xe0, 0x03, 0xf8, 0x08, 0x66, 0x67, 0xb7, - 0x65, 0xb7, 0x6c, 0x97, 0x42, 0x13, 0x2f, 0xa4, 0xfb, 0xcd, 0xff, 0xfb, 0xfa, 0xcb, 0xff, 0x63, - 0xff, 0x53, 0x74, 0xa7, 0x8a, 0x09, 0x6f, 0x73, 0x42, 0x6d, 0xe3, 0xa8, 0xee, 0x18, 0xfb, 0x1e, - 0xf0, 0xb6, 0xee, 0x70, 0x26, 0x98, 0x3a, 0xdd, 0x3d, 0xd2, 0x8f, 0xea, 0x4e, 0x6e, 0x0e, 0x37, - 0x09, 0x65, 0x86, 0xfc, 0x1b, 0x28, 0x72, 0x59, 0x9b, 0xd9, 0x4c, 0x7e, 0x34, 0xfc, 0x4f, 0x61, - 0xf5, 0xae, 0xcd, 0x98, 0xdd, 0x00, 0x03, 0x3b, 0xc4, 0xc0, 0x94, 0x32, 0x81, 0x05, 0x61, 0xd4, - 0x0d, 0x4e, 0x0b, 0xdb, 0x68, 0xe9, 0xb5, 0xff, 0x25, 0x7b, 0xc0, 0x49, 0xb5, 0xfd, 0x8e, 0x88, - 0x5a, 0x85, 0xe3, 0x83, 0x12, 0xa6, 0x36, 0xec, 0x72, 0xc6, 0xaa, 0x25, 0xd8, 0xf7, 0xc0, 0x15, - 0xea, 0x3d, 0x84, 0x1c, 0xff, 0xd9, 0xac, 0x60, 0x81, 0x35, 0x65, 0x51, 0x59, 0x99, 0x2a, 0x4d, - 0xca, 0xca, 0x16, 0x16, 0xb8, 0xf0, 0x06, 0x2d, 0x5f, 0x30, 0xc6, 0x75, 0x18, 0x75, 0x41, 0xcd, - 0xa2, 0xb1, 0x16, 0x6e, 0x90, 0x8a, 0x1c, 0x31, 0x51, 0x0a, 0x1e, 0xfc, 0x2a, 0x70, 0xce, 0xb8, - 0x96, 0x59, 0x54, 0x56, 0x26, 0x4b, 0xc1, 0x43, 0x0f, 0xdb, 0x5b, 0x8e, 0xa9, 0x5b, 0x05, 0x3e, - 0x24, 0x5b, 0xd2, 0x98, 0x2b, 0xb0, 0x3d, 0x43, 0x0b, 0x91, 0xa1, 0x7b, 0xbe, 0x92, 0x88, 0xf6, - 0x65, 0xb0, 0x76, 0xd0, 0x62, 0xff, 0x09, 0x43, 0x13, 0x6d, 0xef, 0x7b, 0xb8, 0x31, 0x14, 0x51, - 0xcf, 0x84, 0x2b, 0x10, 0xfd, 0xcd, 0xc4, 0x06, 0x76, 0x9c, 0x97, 0x03, 0xdd, 0x0e, 0x93, 0x8e, - 0xe6, 0x21, 0xfc, 0x26, 0xf3, 0x1c, 0xdc, 0x1c, 0x44, 0x21, 0x7c, 0x48, 0x75, 0x05, 0xcd, 0x72, - 0x7f, 0x75, 0x51, 0x71, 0x46, 0x8a, 0x67, 0x78, 0x77, 0xa5, 0x52, 0xa9, 0xa3, 0xf9, 0x56, 0xe8, - 0x6a, 0x54, 0x7c, 0x2d, 0x98, 0xdc, 0x8a, 0x1a, 0x2e, 0xf5, 0x0f, 0xd0, 0xb4, 0x0b, 0xb4, 0x02, - 0xdc, 0x74, 0xbc, 0x72, 0x1d, 0xda, 0xda, 0xa8, 0x54, 0x4e, 0x05, 0xc5, 0x5d, 0x59, 0x53, 0x57, - 0xd1, 0x2c, 0x07, 0x8b, 0x38, 0x04, 0xa8, 0xe8, 0xe8, 0xc6, 0xa4, 0xee, 0x66, 0xb7, 0x1e, 0x4a, - 0x9f, 0xa2, 0x9c, 0xe5, 0x71, 0xee, 0x0b, 0xcb, 0xb8, 0x81, 0xa9, 0x05, 0xa6, 0xc5, 0x9a, 0x4d, - 0x22, 0x9a, 0x40, 0x85, 0x36, 0x2e, 0x9b, 0xb4, 0x50, 0xb1, 0x19, 0x08, 0x9e, 0x77, 0xcf, 0xd5, - 0x0d, 0x74, 0xbb, 0xb7, 0xbb, 0x86, 0x69, 0xa5, 0x01, 0xda, 0x75, 0xd9, 0x99, 0x8d, 0x77, 0xbe, - 0x94, 0x67, 0x85, 0x57, 0xe8, 0x7e, 0x8a, 0xe3, 0x57, 0xd8, 0xe1, 0xe7, 0xf8, 0x0e, 0x3b, 0x6f, - 0xf6, 0xff, 0xda, 0xe1, 0x02, 0xba, 0xe1, 0xb9, 0x67, 0x1b, 0x09, 0x76, 0x87, 0xfc, 0x52, 0x68, - 0xf2, 0x3a, 0xba, 0x65, 0x11, 0xa7, 0x06, 0x5c, 0xc0, 0xa1, 0x88, 0xfa, 0x3b, 0x1a, 0xba, 0xd4, - 0x3d, 0x8c, 0x78, 0xfb, 0x10, 0xcd, 0x45, 0x9a, 0x42, 0x5b, 0x83, 0x2d, 0xce, 0x9e, 0x1d, 0x04, - 0x96, 0xaa, 0xcb, 0x68, 0x06, 0x0e, 0x1d, 0xb0, 0x04, 0x54, 0x4c, 0xca, 0xa8, 0x05, 0x72, 0x75, - 0xa3, 0xa5, 0xe9, 0x4e, 0x75, 0xc7, 0x2f, 0xf6, 0x38, 0xdf, 0xeb, 0xd3, 0xe5, 0x9d, 0x7f, 0xf4, - 0x6d, 0x02, 0x8d, 0xc9, 0x89, 0xea, 0x77, 0x05, 0x69, 0xfd, 0x82, 0x55, 0x5d, 0xd7, 0x63, 0xf7, - 0x82, 0x3e, 0x48, 0x9a, 0xe7, 0x36, 0x2e, 0xd7, 0x14, 0xd0, 0x17, 0x1e, 0x7f, 0xf8, 0xf9, 0xe7, - 0x53, 0xc6, 0x78, 0xa2, 0x14, 0x0b, 0x45, 0x23, 0x7e, 0x51, 0xb5, 0x64, 0xaf, 0x79, 0x10, 0x36, - 0x9b, 0x91, 0xf5, 0x46, 0xf0, 0xcf, 0x67, 0x6f, 0x1a, 0x7e, 0xdf, 0xc0, 0x4f, 0xc3, 0xef, 0x1f, - 0xef, 0x03, 0xe0, 0x8b, 0xb0, 0x39, 0x86, 0xff, 0x45, 0x41, 0xf3, 0x09, 0x19, 0xad, 0xea, 0xfd, - 0x21, 0x92, 0xae, 0x83, 0x9c, 0x31, 0xb0, 0x3e, 0xe4, 0x35, 0x24, 0xef, 0xaa, 0xcf, 0xbb, 0x94, - 0xcc, 0x1b, 0x8f, 0xb7, 0x08, 0x69, 0x2c, 0xbb, 0xd3, 0x48, 0x93, 0xae, 0x89, 0x34, 0xd2, 0xc4, - 0x4b, 0x61, 0x00, 0xd2, 0x78, 0x3c, 0xa8, 0x5f, 0x15, 0x94, 0x4d, 0x8a, 0x28, 0xd5, 0xb8, 0x78, - 0xb3, 0xb1, 0xe8, 0xc9, 0xad, 0x0d, 0xde, 0x10, 0xc2, 0xae, 0x49, 0xd8, 0xa2, 0x0f, 0xbb, 0x7c, - 0xc1, 0xbf, 0x81, 0x13, 0x40, 0x9d, 0xd1, 0xc6, 0x5f, 0xeb, 0x34, 0xda, 0xc4, 0xa0, 0x4c, 0xa3, - 0x4d, 0x4e, 0x8c, 0x01, 0x68, 0xbb, 0xef, 0x5c, 0x40, 0xbb, 0xb9, 0xf5, 0xe3, 0x24, 0xaf, 0x1c, - 0x9f, 0xe4, 0x95, 0xdf, 0x27, 0x79, 0xe5, 0xe3, 0x69, 0x7e, 0xe4, 0xf8, 0x34, 0x3f, 0xf2, 0xeb, - 0x34, 0x3f, 0xf2, 0xbe, 0x68, 0x13, 0x51, 0xf3, 0xca, 0xba, 0xc5, 0x9a, 0xc6, 0x0b, 0x4c, 0x78, - 0xb9, 0xc1, 0xac, 0x7a, 0x64, 0xe8, 0xa1, 0x1c, 0x2b, 0xda, 0x0e, 0xb8, 0xe5, 0x71, 0xf9, 0xf3, - 0x70, 0xfd, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4c, 0x3b, 0x15, 0xb3, 0x91, 0x0a, 0x00, 0x00, + // 852 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x96, 0xcd, 0x6e, 0xdb, 0x46, + 0x10, 0xc7, 0x4d, 0xf9, 0xa3, 0xd5, 0xd6, 0x76, 0x25, 0x5a, 0x6d, 0x69, 0xa1, 0x95, 0x55, 0xd6, + 0x6e, 0x65, 0xb5, 0x20, 0x8d, 0xda, 0xbd, 0x14, 0x3d, 0x34, 0xfe, 0x08, 0x7c, 0x72, 0x1c, 0xc5, + 0x70, 0x80, 0x5c, 0x88, 0x15, 0xb9, 0x92, 0x08, 0x49, 0xbb, 0xf4, 0x72, 0x29, 0x5b, 0x3e, 0xe6, + 0x1e, 0x20, 0x40, 0xde, 0x21, 0x39, 0xe4, 0x15, 0x72, 0x0d, 0x90, 0xa3, 0x81, 0x5c, 0x72, 0x0c, + 0xec, 0x3c, 0x40, 0x1e, 0x21, 0xe0, 0x72, 0x25, 0x93, 0x14, 0xf5, 0x61, 0x1b, 0xc8, 0xc5, 0x10, + 0x67, 0xfe, 0x33, 0xfc, 0x79, 0x86, 0xfc, 0x2f, 0xc1, 0x72, 0x0d, 0xda, 0xb4, 0x4b, 0x6d, 0x5c, + 0xd7, 0xcf, 0x9b, 0x8e, 0x7e, 0xe2, 0x21, 0xda, 0xd5, 0x1c, 0x4a, 0x18, 0x91, 0x17, 0xfa, 0x29, + 0xed, 0xbc, 0xe9, 0xe4, 0xb3, 0xb0, 0x6d, 0x63, 0xa2, 0xf3, 0xbf, 0x81, 0x22, 0x9f, 0xab, 0x93, + 0x3a, 0xe1, 0x3f, 0x75, 0xff, 0x97, 0x88, 0xfe, 0x5c, 0x27, 0xa4, 0xde, 0x42, 0x3a, 0x74, 0x6c, + 0x1d, 0x62, 0x4c, 0x18, 0x64, 0x36, 0xc1, 0x6e, 0x90, 0x55, 0x97, 0xc1, 0x4f, 0x47, 0xd4, 0x73, + 0x19, 0xb2, 0x76, 0x08, 0x66, 0x14, 0x9a, 0xcc, 0xad, 0xa0, 0x13, 0x0f, 0xb9, 0x4c, 0xdd, 0x07, + 0xca, 0x60, 0xca, 0x75, 0x08, 0x76, 0x91, 0xfc, 0x17, 0xc8, 0xf6, 0x82, 0xf7, 0x2c, 0x8b, 0x22, + 0xd7, 0x45, 0xae, 0x22, 0x15, 0xa7, 0x4b, 0xe9, 0xca, 0x60, 0x42, 0xdd, 0x03, 0xab, 0x0f, 0xfd, + 0xff, 0xe4, 0x18, 0x51, 0xbb, 0xd6, 0x7d, 0x6c, 0xb3, 0x86, 0x45, 0xe1, 0x69, 0x05, 0xe2, 0x3a, + 0x3a, 0xa4, 0x84, 0xd4, 0xc4, 0x1d, 0xe5, 0x5f, 0x00, 0x70, 0xfc, 0x6b, 0xc3, 0x82, 0x0c, 0x2a, + 0x52, 0x51, 0x2a, 0xcd, 0x57, 0xd2, 0x3c, 0xb2, 0x0b, 0x19, 0x54, 0x1f, 0x81, 0xb5, 0x31, 0x6d, + 0x04, 0x5d, 0x0e, 0xcc, 0x76, 0x60, 0xcb, 0xb6, 0x78, 0x8b, 0x6f, 0x2b, 0xc1, 0x85, 0x1f, 0x45, + 0x94, 0x12, 0xaa, 0xa4, 0x8a, 0x52, 0x29, 0x5d, 0x09, 0x2e, 0x62, 0x6c, 0x47, 0x14, 0x62, 0xb7, + 0x86, 0xe8, 0x1d, 0xd9, 0x92, 0xda, 0xdc, 0x82, 0xed, 0x7f, 0xb0, 0x12, 0x6a, 0x7a, 0xec, 0x2b, + 0x6d, 0xd6, 0xbd, 0x09, 0xd6, 0x01, 0x28, 0x0e, 0xef, 0x70, 0x67, 0xa2, 0xbd, 0x13, 0x0f, 0xb6, + 0xee, 0x44, 0x14, 0xeb, 0x70, 0x0b, 0xa2, 0xcf, 0xa9, 0x48, 0xc3, 0xde, 0xe4, 0x79, 0xc3, 0xde, + 0xa3, 0x2c, 0x6b, 0x60, 0x09, 0x89, 0x3b, 0x19, 0x03, 0x70, 0x59, 0x14, 0x86, 0xf0, 0x21, 0xe5, + 0x12, 0xc8, 0x50, 0x7f, 0x75, 0x61, 0x71, 0x8a, 0x8b, 0x17, 0x69, 0x7f, 0xa5, 0x5c, 0xa9, 0x81, + 0xa5, 0x8e, 0x98, 0x6a, 0x58, 0x3c, 0x1d, 0x74, 0xee, 0x84, 0x07, 0xce, 0xf5, 0xbf, 0x81, 0x05, + 0x17, 0x61, 0x0b, 0x51, 0xc3, 0xf1, 0xaa, 0x4d, 0xd4, 0x55, 0x66, 0xb8, 0x72, 0x3e, 0x08, 0x1e, + 0xf2, 0x98, 0xbc, 0x0e, 0x32, 0x14, 0x99, 0xb6, 0x63, 0x23, 0xcc, 0x7a, 0xba, 0x59, 0xae, 0xfb, + 0xbe, 0x1f, 0x17, 0xd2, 0xff, 0x40, 0xde, 0xf4, 0x28, 0xf5, 0x85, 0x55, 0xd8, 0x82, 0xd8, 0x44, + 0x86, 0x49, 0xda, 0x6d, 0x9b, 0xb5, 0x11, 0x66, 0xca, 0x1c, 0x2f, 0x52, 0x84, 0x62, 0x3b, 0x10, + 0xec, 0xf4, 0xf3, 0xf2, 0x16, 0xf8, 0x31, 0x5e, 0xdd, 0x80, 0xd8, 0x6a, 0x21, 0xe5, 0x1b, 0x5e, + 0x99, 0x8b, 0x56, 0xee, 0xf3, 0x9c, 0xfa, 0x00, 0xfc, 0x3a, 0x62, 0xe2, 0xb7, 0xd8, 0xe1, 0xcb, + 0xe8, 0x0e, 0x7b, 0x6f, 0xf6, 0xd7, 0xda, 0xe1, 0x0a, 0xf8, 0xce, 0x73, 0xaf, 0x37, 0x12, 0xec, + 0x0e, 0xf8, 0x21, 0x31, 0xe4, 0x4d, 0xf0, 0x83, 0x69, 0x3b, 0x0d, 0x44, 0x19, 0x3a, 0x63, 0xe1, + 0xf9, 0xce, 0x88, 0x29, 0xf5, 0x93, 0xa1, 0xd9, 0xfe, 0x09, 0xb2, 0xa1, 0x22, 0x31, 0xd6, 0x60, + 0x8b, 0x99, 0xeb, 0x44, 0x30, 0x52, 0x79, 0x0d, 0x2c, 0xa2, 0x33, 0x07, 0x99, 0x0c, 0x59, 0x06, + 0x26, 0xd8, 0x44, 0x7c, 0x75, 0x33, 0x95, 0x85, 0x5e, 0xf4, 0xc0, 0x0f, 0xc6, 0x26, 0x1f, 0x9f, + 0xd3, 0xcd, 0x27, 0xff, 0xf7, 0xdb, 0x34, 0x98, 0xe5, 0x1d, 0xe5, 0x37, 0x12, 0x50, 0x86, 0x19, + 0xab, 0xbc, 0xa9, 0x45, 0x0e, 0x1f, 0x6d, 0x12, 0x37, 0xcf, 0x6f, 0xdd, 0xac, 0x28, 0xa0, 0x57, + 0xff, 0x79, 0xfa, 0xfe, 0xd3, 0x8b, 0x94, 0xfe, 0xaf, 0x54, 0x56, 0xcb, 0x7a, 0xf4, 0x34, 0xec, + 0xf0, 0x5a, 0xe3, 0x54, 0x14, 0x1b, 0xa1, 0xf5, 0x86, 0xf0, 0x07, 0xbd, 0x77, 0x14, 0xfe, 0x50, + 0xc3, 0x1f, 0x85, 0x3f, 0xdc, 0xde, 0x27, 0xc0, 0x67, 0xa2, 0x38, 0x82, 0xff, 0x4a, 0x02, 0x4b, + 0x09, 0x1e, 0x2d, 0x6b, 0xc3, 0x21, 0x92, 0x8e, 0x83, 0xbc, 0x3e, 0xb1, 0x5e, 0xf0, 0xea, 0x9c, + 0x77, 0xdd, 0xe7, 0x5d, 0x4d, 0xe6, 0x8d, 0xda, 0x5b, 0x88, 0x34, 0xe2, 0xdd, 0xa3, 0x48, 0x93, + 0x8e, 0x89, 0x51, 0xa4, 0x89, 0x87, 0xc2, 0x04, 0xa4, 0x51, 0x7b, 0x90, 0x5f, 0x4b, 0x20, 0x97, + 0x64, 0x51, 0xb2, 0x3e, 0x7e, 0xb3, 0x11, 0xeb, 0xc9, 0x6f, 0x4c, 0x5e, 0x20, 0x60, 0x37, 0x38, + 0x6c, 0xd9, 0x87, 0x5d, 0x1b, 0xf3, 0x18, 0x38, 0x01, 0xd4, 0x35, 0x6d, 0xf4, 0xb5, 0x1e, 0x45, + 0x9b, 0x68, 0x94, 0xa3, 0x68, 0x93, 0x1d, 0x63, 0x02, 0xda, 0xfe, 0x3b, 0x27, 0x68, 0x9f, 0x49, + 0x20, 0x13, 0xff, 0x38, 0x94, 0x7f, 0x8f, 0xdd, 0x78, 0xc8, 0x87, 0x65, 0xfe, 0x8f, 0xb1, 0x3a, + 0xc1, 0x55, 0xe2, 0x5c, 0xaa, 0x5c, 0x8c, 0x41, 0xb1, 0xa0, 0xc0, 0x30, 0x7b, 0x15, 0xdb, 0xbb, + 0xef, 0x2e, 0x0b, 0xd2, 0xc5, 0x65, 0x41, 0xfa, 0x78, 0x59, 0x90, 0x9e, 0x5f, 0x15, 0xa6, 0x2e, + 0xae, 0x0a, 0x53, 0x1f, 0xae, 0x0a, 0x53, 0x4f, 0xca, 0x75, 0x9b, 0x35, 0xbc, 0xaa, 0x66, 0x92, + 0xb6, 0x7e, 0x1f, 0xda, 0xb4, 0xda, 0x22, 0x66, 0x33, 0xd4, 0xef, 0x2c, 0xe8, 0xd8, 0x75, 0x90, + 0x5b, 0x9d, 0xe3, 0xdf, 0xc4, 0x9b, 0x5f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x30, 0x98, 0x98, 0x2b, + 0x86, 0x0b, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -802,6 +890,7 @@ type QueryClient interface { VerifyTransferProofs(ctx context.Context, in *QueryVerifyTransferProofsRequest, opts ...grpc.CallOption) (*QueryVerifyTransferProofsResponse, error) // VerifyWithdrawProofs verifies all withdraw proofs together (equality, range) VerifyWithdrawProofs(ctx context.Context, in *QueryVerifyWithdrawProofsRequest, opts ...grpc.CallOption) (*QueryVerifyWithdrawProofsResponse, error) + TrustedContracts(ctx context.Context, in *TrustedContractsRequest, opts ...grpc.CallOption) (*TrustedContractsResponse, error) } type queryClient struct { @@ -866,6 +955,15 @@ func (c *queryClient) VerifyWithdrawProofs(ctx context.Context, in *QueryVerifyW return out, nil } +func (c *queryClient) TrustedContracts(ctx context.Context, in *TrustedContractsRequest, opts ...grpc.CallOption) (*TrustedContractsResponse, error) { + out := new(TrustedContractsResponse) + err := c.cc.Invoke(ctx, "/fairyring.zkp.Query/TrustedContracts", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. type QueryServer interface { // VerifyWithdrawRangeProof verifies a withdraw range proof (U64) @@ -880,6 +978,7 @@ type QueryServer interface { VerifyTransferProofs(context.Context, *QueryVerifyTransferProofsRequest) (*QueryVerifyTransferProofsResponse, error) // VerifyWithdrawProofs verifies all withdraw proofs together (equality, range) VerifyWithdrawProofs(context.Context, *QueryVerifyWithdrawProofsRequest) (*QueryVerifyWithdrawProofsResponse, error) + TrustedContracts(context.Context, *TrustedContractsRequest) (*TrustedContractsResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -904,6 +1003,9 @@ func (*UnimplementedQueryServer) VerifyTransferProofs(ctx context.Context, req * func (*UnimplementedQueryServer) VerifyWithdrawProofs(ctx context.Context, req *QueryVerifyWithdrawProofsRequest) (*QueryVerifyWithdrawProofsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method VerifyWithdrawProofs not implemented") } +func (*UnimplementedQueryServer) TrustedContracts(ctx context.Context, req *TrustedContractsRequest) (*TrustedContractsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method TrustedContracts not implemented") +} func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) @@ -1017,6 +1119,24 @@ func _Query_VerifyWithdrawProofs_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } +func _Query_TrustedContracts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(TrustedContractsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).TrustedContracts(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/fairyring.zkp.Query/TrustedContracts", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).TrustedContracts(ctx, req.(*TrustedContractsRequest)) + } + return interceptor(ctx, in, info, handler) +} + var Query_serviceDesc = _Query_serviceDesc var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "fairyring.zkp.Query", @@ -1046,11 +1166,70 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "VerifyWithdrawProofs", Handler: _Query_VerifyWithdrawProofs_Handler, }, + { + MethodName: "TrustedContracts", + Handler: _Query_TrustedContracts_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "fairyring/zkp/query.proto", } +func (m *TrustedContractsRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TrustedContractsRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TrustedContractsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *TrustedContractsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *TrustedContractsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *TrustedContractsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ContractAddresses) > 0 { + for iNdEx := len(m.ContractAddresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.ContractAddresses[iNdEx]) + copy(dAtA[i:], m.ContractAddresses[iNdEx]) + i = encodeVarintQuery(dAtA, i, uint64(len(m.ContractAddresses[iNdEx]))) + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func (m *QueryVerifyWithdrawRangeProofRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1557,6 +1736,30 @@ func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } +func (m *TrustedContractsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *TrustedContractsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.ContractAddresses) > 0 { + for _, s := range m.ContractAddresses { + l = len(s) + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + func (m *QueryVerifyWithdrawRangeProofRequest) Size() (n int) { if m == nil { return 0 @@ -1780,6 +1983,138 @@ func sovQuery(x uint64) (n int) { func sozQuery(x uint64) (n int) { return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } +func (m *TrustedContractsRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TrustedContractsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TrustedContractsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *TrustedContractsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: TrustedContractsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: TrustedContractsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContractAddresses", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ContractAddresses = append(m.ContractAddresses, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *QueryVerifyWithdrawRangeProofRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/x/zkp/types/query.pb.gw.go b/x/zkp/types/query.pb.gw.go index 3744d872..ee9191bb 100644 --- a/x/zkp/types/query.pb.gw.go +++ b/x/zkp/types/query.pb.gw.go @@ -237,6 +237,24 @@ func local_request_Query_VerifyWithdrawProofs_0(ctx context.Context, marshaler r } +func request_Query_TrustedContracts_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq TrustedContractsRequest + var metadata runtime.ServerMetadata + + msg, err := client.TrustedContracts(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_TrustedContracts_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq TrustedContractsRequest + var metadata runtime.ServerMetadata + + msg, err := server.TrustedContracts(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -381,6 +399,29 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("GET", pattern_Query_TrustedContracts_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) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_TrustedContracts_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_TrustedContracts_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -542,6 +583,26 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("GET", pattern_Query_TrustedContracts_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) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_TrustedContracts_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_TrustedContracts_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -557,6 +618,8 @@ var ( pattern_Query_VerifyTransferProofs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"fairyring", "zkp", "verify_transfer_proofs"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_VerifyWithdrawProofs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"fairyring", "zkp", "verify_withdraw_proofs"}, "", runtime.AssumeColonVerbOpt(false))) + + pattern_Query_TrustedContracts_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"fairyring", "zkp", "trusted_contracts"}, "", runtime.AssumeColonVerbOpt(false))) ) var ( @@ -571,4 +634,6 @@ var ( forward_Query_VerifyTransferProofs_0 = runtime.ForwardResponseMessage forward_Query_VerifyWithdrawProofs_0 = runtime.ForwardResponseMessage + + forward_Query_TrustedContracts_0 = runtime.ForwardResponseMessage ) diff --git a/x/zkp/types/query_trusted.go b/x/zkp/types/query_trusted.go deleted file mode 100644 index feb558f6..00000000 --- a/x/zkp/types/query_trusted.go +++ /dev/null @@ -1,157 +0,0 @@ -package types - -import ( - "context" - "fmt" - - grpc1 "github.com/cosmos/gogoproto/grpc" - proto "github.com/cosmos/gogoproto/proto" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -type QueryTrustedContractsRequest struct{} - -func (m *QueryTrustedContractsRequest) Reset() { *m = QueryTrustedContractsRequest{} } -func (m *QueryTrustedContractsRequest) String() string { return proto.CompactTextString(m) } -func (m *QueryTrustedContractsRequest) ProtoMessage() {} -func (m *QueryTrustedContractsRequest) Marshal() ([]byte, error) { return []byte{}, nil } -func (m *QueryTrustedContractsRequest) MarshalTo(data []byte) (int, error) { return 0, nil } -func (m *QueryTrustedContractsRequest) MarshalToSizedBuffer(data []byte) (int, error) { - return len(data), nil -} -func (m *QueryTrustedContractsRequest) Size() int { return 0 } -func (m *QueryTrustedContractsRequest) Unmarshal([]byte) error { return nil } - -type QueryTrustedContractsResponse struct { - ContractAddresses []string `protobuf:"bytes,1,rep,name=contract_addresses,json=contractAddresses,proto3" json:"contract_addresses,omitempty"` -} - -func (m *QueryTrustedContractsResponse) Reset() { *m = QueryTrustedContractsResponse{} } -func (m *QueryTrustedContractsResponse) String() string { return proto.CompactTextString(m) } -func (m *QueryTrustedContractsResponse) ProtoMessage() {} - -func (m *QueryTrustedContractsResponse) Marshal() ([]byte, error) { - size := m.Size() - buf := make([]byte, size) - n, err := m.MarshalToSizedBuffer(buf) - if err != nil { - return nil, err - } - return buf[:n], nil -} - -func (m *QueryTrustedContractsResponse) MarshalTo(data []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(data[:size]) -} - -func (m *QueryTrustedContractsResponse) MarshalToSizedBuffer(data []byte) (int, error) { - i := len(data) - if len(m.ContractAddresses) > 0 { - for idx := len(m.ContractAddresses) - 1; idx >= 0; idx-- { - i -= len(m.ContractAddresses[idx]) - copy(data[i:], m.ContractAddresses[idx]) - i = encodeVarint(data, i, uint64(len(m.ContractAddresses[idx]))) - i-- - data[i] = 0x0a - } - } - return len(data) - i, nil -} - -func (m *QueryTrustedContractsResponse) Size() int { - n := 0 - for _, s := range m.ContractAddresses { - n += 1 + len(s) + sovMsg(uint64(len(s))) - } - return n -} - -func (m *QueryTrustedContractsResponse) Unmarshal(data []byte) error { - l := len(data) - idx := 0 - for idx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if idx >= l { - return fmt.Errorf("unexpected EOF") - } - b := data[idx] - idx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType != 2 || fieldNum != 1 { - return fmt.Errorf("unexpected field %d wire type %d", fieldNum, wireType) - } - var strLen uint64 - for shift := uint(0); ; shift += 7 { - if idx >= l { - return fmt.Errorf("unexpected EOF") - } - b := data[idx] - idx++ - strLen |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - if int(strLen) < 0 || idx+int(strLen) > l { - return fmt.Errorf("invalid string length") - } - m.ContractAddresses = append(m.ContractAddresses, string(data[idx:idx+int(strLen)])) - idx += int(strLen) - } - return nil -} - -type TrustedContractsQueryServer interface { - TrustedContracts(context.Context, *QueryTrustedContractsRequest) (*QueryTrustedContractsResponse, error) -} - -type UnimplementedTrustedContractsQueryServer struct{} - -func (*UnimplementedTrustedContractsQueryServer) TrustedContracts(context.Context, *QueryTrustedContractsRequest) (*QueryTrustedContractsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method TrustedContracts not implemented") -} - -func RegisterTrustedContractsQueryServer(s grpc1.Server, srv TrustedContractsQueryServer) { - s.RegisterService(&_TrustedContractsQuery_serviceDesc, srv) -} - -func _TrustedContractsQuery_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryTrustedContractsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(TrustedContractsQueryServer).TrustedContracts(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/fairyring.zkp.TrustedContractsQuery/TrustedContracts", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TrustedContractsQueryServer).TrustedContracts(ctx, req.(*QueryTrustedContractsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _TrustedContractsQuery_serviceDesc = grpc.ServiceDesc{ - ServiceName: "fairyring.zkp.TrustedContractsQuery", - HandlerType: (*TrustedContractsQueryServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "TrustedContracts", - Handler: _TrustedContractsQuery_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "fairyring/zkp/tx.proto", -} diff --git a/x/zkp/types/tx.pb.go b/x/zkp/types/tx.pb.go new file mode 100644 index 00000000..5342c4d8 --- /dev/null +++ b/x/zkp/types/tx.pb.go @@ -0,0 +1,1353 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: fairyring/zkp/tx.proto + +package types + +import ( + context "context" + fmt "fmt" + _ "github.com/cosmos/cosmos-proto" + _ "github.com/cosmos/cosmos-sdk/types/msgservice" + _ "github.com/cosmos/cosmos-sdk/types/tx/amino" + _ "github.com/cosmos/gogoproto/gogoproto" + grpc1 "github.com/cosmos/gogoproto/grpc" + proto "github.com/cosmos/gogoproto/proto" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type MsgUpdateParams struct { + // authority is the address that currently controls the module. + Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"` + // params defines the module parameters to update. + // NOTE: All parameters must be supplied. + Params Params `protobuf:"bytes,2,opt,name=params,proto3" json:"params"` +} + +func (m *MsgUpdateParams) Reset() { *m = MsgUpdateParams{} } +func (m *MsgUpdateParams) String() string { return proto.CompactTextString(m) } +func (*MsgUpdateParams) ProtoMessage() {} +func (*MsgUpdateParams) Descriptor() ([]byte, []int) { + return fileDescriptor_1147cc8e54c6ddbe, []int{0} +} +func (m *MsgUpdateParams) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgUpdateParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgUpdateParams.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgUpdateParams) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgUpdateParams.Merge(m, src) +} +func (m *MsgUpdateParams) XXX_Size() int { + return m.Size() +} +func (m *MsgUpdateParams) XXX_DiscardUnknown() { + xxx_messageInfo_MsgUpdateParams.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgUpdateParams proto.InternalMessageInfo + +func (m *MsgUpdateParams) GetAuthority() string { + if m != nil { + return m.Authority + } + return "" +} + +func (m *MsgUpdateParams) GetParams() Params { + if m != nil { + return m.Params + } + return Params{} +} + +type MsgUpdateParamsResponse struct { +} + +func (m *MsgUpdateParamsResponse) Reset() { *m = MsgUpdateParamsResponse{} } +func (m *MsgUpdateParamsResponse) String() string { return proto.CompactTextString(m) } +func (*MsgUpdateParamsResponse) ProtoMessage() {} +func (*MsgUpdateParamsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_1147cc8e54c6ddbe, []int{1} +} +func (m *MsgUpdateParamsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgUpdateParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgUpdateParamsResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgUpdateParamsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgUpdateParamsResponse.Merge(m, src) +} +func (m *MsgUpdateParamsResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgUpdateParamsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgUpdateParamsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgUpdateParamsResponse proto.InternalMessageInfo + +type MsgAddTrustedContract struct { + Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"` + ContractAddress string `protobuf:"bytes,2,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` +} + +func (m *MsgAddTrustedContract) Reset() { *m = MsgAddTrustedContract{} } +func (m *MsgAddTrustedContract) String() string { return proto.CompactTextString(m) } +func (*MsgAddTrustedContract) ProtoMessage() {} +func (*MsgAddTrustedContract) Descriptor() ([]byte, []int) { + return fileDescriptor_1147cc8e54c6ddbe, []int{2} +} +func (m *MsgAddTrustedContract) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgAddTrustedContract) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgAddTrustedContract.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgAddTrustedContract) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgAddTrustedContract.Merge(m, src) +} +func (m *MsgAddTrustedContract) XXX_Size() int { + return m.Size() +} +func (m *MsgAddTrustedContract) XXX_DiscardUnknown() { + xxx_messageInfo_MsgAddTrustedContract.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgAddTrustedContract proto.InternalMessageInfo + +func (m *MsgAddTrustedContract) GetAuthority() string { + if m != nil { + return m.Authority + } + return "" +} + +func (m *MsgAddTrustedContract) GetContractAddress() string { + if m != nil { + return m.ContractAddress + } + return "" +} + +type MsgAddTrustedContractResponse struct { +} + +func (m *MsgAddTrustedContractResponse) Reset() { *m = MsgAddTrustedContractResponse{} } +func (m *MsgAddTrustedContractResponse) String() string { return proto.CompactTextString(m) } +func (*MsgAddTrustedContractResponse) ProtoMessage() {} +func (*MsgAddTrustedContractResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_1147cc8e54c6ddbe, []int{3} +} +func (m *MsgAddTrustedContractResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgAddTrustedContractResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgAddTrustedContractResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgAddTrustedContractResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgAddTrustedContractResponse.Merge(m, src) +} +func (m *MsgAddTrustedContractResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgAddTrustedContractResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgAddTrustedContractResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgAddTrustedContractResponse proto.InternalMessageInfo + +type MsgRemoveTrustedContract struct { + Authority string `protobuf:"bytes,1,opt,name=authority,proto3" json:"authority,omitempty"` + ContractAddress string `protobuf:"bytes,2,opt,name=contract_address,json=contractAddress,proto3" json:"contract_address,omitempty"` +} + +func (m *MsgRemoveTrustedContract) Reset() { *m = MsgRemoveTrustedContract{} } +func (m *MsgRemoveTrustedContract) String() string { return proto.CompactTextString(m) } +func (*MsgRemoveTrustedContract) ProtoMessage() {} +func (*MsgRemoveTrustedContract) Descriptor() ([]byte, []int) { + return fileDescriptor_1147cc8e54c6ddbe, []int{4} +} +func (m *MsgRemoveTrustedContract) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRemoveTrustedContract) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRemoveTrustedContract.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgRemoveTrustedContract) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRemoveTrustedContract.Merge(m, src) +} +func (m *MsgRemoveTrustedContract) XXX_Size() int { + return m.Size() +} +func (m *MsgRemoveTrustedContract) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRemoveTrustedContract.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRemoveTrustedContract proto.InternalMessageInfo + +func (m *MsgRemoveTrustedContract) GetAuthority() string { + if m != nil { + return m.Authority + } + return "" +} + +func (m *MsgRemoveTrustedContract) GetContractAddress() string { + if m != nil { + return m.ContractAddress + } + return "" +} + +type MsgRemoveTrustedContractResponse struct { +} + +func (m *MsgRemoveTrustedContractResponse) Reset() { *m = MsgRemoveTrustedContractResponse{} } +func (m *MsgRemoveTrustedContractResponse) String() string { return proto.CompactTextString(m) } +func (*MsgRemoveTrustedContractResponse) ProtoMessage() {} +func (*MsgRemoveTrustedContractResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_1147cc8e54c6ddbe, []int{5} +} +func (m *MsgRemoveTrustedContractResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgRemoveTrustedContractResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgRemoveTrustedContractResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *MsgRemoveTrustedContractResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgRemoveTrustedContractResponse.Merge(m, src) +} +func (m *MsgRemoveTrustedContractResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgRemoveTrustedContractResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgRemoveTrustedContractResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgRemoveTrustedContractResponse proto.InternalMessageInfo + +func init() { + proto.RegisterType((*MsgUpdateParams)(nil), "fairyring.zkp.MsgUpdateParams") + proto.RegisterType((*MsgUpdateParamsResponse)(nil), "fairyring.zkp.MsgUpdateParamsResponse") + proto.RegisterType((*MsgAddTrustedContract)(nil), "fairyring.zkp.MsgAddTrustedContract") + proto.RegisterType((*MsgAddTrustedContractResponse)(nil), "fairyring.zkp.MsgAddTrustedContractResponse") + proto.RegisterType((*MsgRemoveTrustedContract)(nil), "fairyring.zkp.MsgRemoveTrustedContract") + proto.RegisterType((*MsgRemoveTrustedContractResponse)(nil), "fairyring.zkp.MsgRemoveTrustedContractResponse") +} + +func init() { proto.RegisterFile("fairyring/zkp/tx.proto", fileDescriptor_1147cc8e54c6ddbe) } + +var fileDescriptor_1147cc8e54c6ddbe = []byte{ + // 465 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4b, 0x4b, 0xcc, 0x2c, + 0xaa, 0x2c, 0xca, 0xcc, 0x4b, 0xd7, 0xaf, 0xca, 0x2e, 0xd0, 0x2f, 0xa9, 0xd0, 0x2b, 0x28, 0xca, + 0x2f, 0xc9, 0x17, 0xe2, 0x85, 0x8b, 0xeb, 0x55, 0x65, 0x17, 0x48, 0x09, 0x26, 0xe6, 0x66, 0xe6, + 0xe5, 0xeb, 0x83, 0x49, 0x88, 0x0a, 0x29, 0xf1, 0xe4, 0xfc, 0xe2, 0xdc, 0xfc, 0x62, 0xfd, 0xdc, + 0xe2, 0x74, 0xfd, 0x32, 0x43, 0x10, 0x05, 0x95, 0x90, 0x84, 0x48, 0xc4, 0x83, 0x79, 0xfa, 0x10, + 0x0e, 0x54, 0x4a, 0x0a, 0xd5, 0xb6, 0x82, 0xc4, 0xa2, 0xc4, 0x5c, 0x98, 0x9c, 0x48, 0x7a, 0x7e, + 0x7a, 0x3e, 0x44, 0x0f, 0x88, 0x05, 0x11, 0x55, 0xda, 0xce, 0xc8, 0xc5, 0xef, 0x5b, 0x9c, 0x1e, + 0x5a, 0x90, 0x92, 0x58, 0x92, 0x1a, 0x00, 0x56, 0x2f, 0x64, 0xc6, 0xc5, 0x99, 0x58, 0x5a, 0x92, + 0x91, 0x5f, 0x94, 0x59, 0x52, 0x29, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0xe9, 0x24, 0x71, 0x69, 0x8b, + 0xae, 0x08, 0xd4, 0x2a, 0xc7, 0x94, 0x94, 0xa2, 0xd4, 0xe2, 0xe2, 0xe0, 0x12, 0x90, 0x3d, 0x41, + 0x08, 0xa5, 0x42, 0x16, 0x5c, 0x6c, 0x10, 0x1b, 0x25, 0x98, 0x14, 0x18, 0x35, 0xb8, 0x8d, 0x44, + 0xf5, 0x50, 0x3c, 0xa9, 0x07, 0x31, 0xde, 0x89, 0xf3, 0xc4, 0x3d, 0x79, 0x86, 0x15, 0xcf, 0x37, + 0x68, 0x31, 0x06, 0x41, 0xd5, 0x5b, 0x19, 0x35, 0x3d, 0xdf, 0xa0, 0x85, 0x30, 0xa9, 0xeb, 0xf9, + 0x06, 0x2d, 0x79, 0x84, 0x57, 0x2a, 0xc0, 0x9e, 0x41, 0x73, 0xa5, 0x92, 0x24, 0x97, 0x38, 0x9a, + 0x50, 0x50, 0x6a, 0x71, 0x41, 0x7e, 0x5e, 0x71, 0xaa, 0x52, 0x01, 0x97, 0xa8, 0x6f, 0x71, 0xba, + 0x63, 0x4a, 0x4a, 0x48, 0x51, 0x69, 0x71, 0x49, 0x6a, 0x8a, 0x73, 0x7e, 0x5e, 0x49, 0x51, 0x62, + 0x72, 0x89, 0x90, 0x0c, 0x86, 0xcf, 0x90, 0xdd, 0xaf, 0xc9, 0x25, 0x90, 0x0c, 0x55, 0x19, 0x9f, + 0x08, 0xf1, 0x24, 0xd8, 0x27, 0x9c, 0x41, 0xfc, 0x30, 0x71, 0xa8, 0xdf, 0xad, 0xf8, 0x50, 0x1d, + 0xac, 0x24, 0xcf, 0x25, 0x8b, 0xd5, 0x46, 0xb8, 0x93, 0x8a, 0xb9, 0x24, 0x7c, 0x8b, 0xd3, 0x83, + 0x52, 0x73, 0xf3, 0xcb, 0x52, 0xe9, 0xe6, 0x2a, 0x25, 0x2e, 0x05, 0x5c, 0x96, 0xc2, 0x1c, 0x66, + 0x74, 0x90, 0x89, 0x8b, 0xd9, 0xb7, 0x38, 0x5d, 0x28, 0x8c, 0x8b, 0x07, 0x25, 0x11, 0xc8, 0xa1, + 0x45, 0x1e, 0x5a, 0x58, 0x4b, 0xa9, 0xe1, 0x97, 0x87, 0x99, 0x2f, 0x94, 0xc1, 0x25, 0x84, 0x25, + 0x22, 0x54, 0x30, 0x75, 0x63, 0xaa, 0x92, 0xd2, 0x21, 0x46, 0x15, 0xdc, 0xa6, 0x42, 0x2e, 0x51, + 0xec, 0xe1, 0xab, 0x8e, 0x69, 0x0c, 0x56, 0x85, 0x52, 0xfa, 0x44, 0x2a, 0x84, 0x59, 0x29, 0xc5, + 0xda, 0x00, 0x4a, 0xc6, 0x4e, 0x2e, 0x27, 0x1e, 0xc9, 0x31, 0x5e, 0x78, 0x24, 0xc7, 0xf8, 0xe0, + 0x91, 0x1c, 0xe3, 0x84, 0xc7, 0x72, 0x0c, 0x17, 0x1e, 0xcb, 0x31, 0xdc, 0x78, 0x2c, 0xc7, 0x10, + 0xa5, 0x95, 0x9e, 0x59, 0x92, 0x51, 0x9a, 0xa4, 0x97, 0x9c, 0x9f, 0xab, 0xef, 0x96, 0x98, 0x59, + 0x94, 0x94, 0x93, 0x9f, 0x9c, 0xad, 0x8f, 0x9e, 0xb4, 0x4b, 0x2a, 0x0b, 0x52, 0x8b, 0x93, 0xd8, + 0xc0, 0x39, 0xd2, 0x18, 0x10, 0x00, 0x00, 0xff, 0xff, 0x9b, 0x39, 0x09, 0x4a, 0x33, 0x04, 0x00, + 0x00, +} + +// Reference imports to suppress errors if they are not otherwise used. +var _ context.Context +var _ grpc.ClientConn + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +const _ = grpc.SupportPackageIsVersion4 + +// MsgClient is the client API for Msg service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type MsgClient interface { + // UpdateParams defines a governance operation for updating the module parameters. + UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) + AddTrustedContract(ctx context.Context, in *MsgAddTrustedContract, opts ...grpc.CallOption) (*MsgAddTrustedContractResponse, error) + RemoveTrustedContract(ctx context.Context, in *MsgRemoveTrustedContract, opts ...grpc.CallOption) (*MsgRemoveTrustedContractResponse, error) +} + +type msgClient struct { + cc grpc1.ClientConn +} + +func NewMsgClient(cc grpc1.ClientConn) MsgClient { + return &msgClient{cc} +} + +func (c *msgClient) UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) { + out := new(MsgUpdateParamsResponse) + err := c.cc.Invoke(ctx, "/fairyring.zkp.Msg/UpdateParams", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) AddTrustedContract(ctx context.Context, in *MsgAddTrustedContract, opts ...grpc.CallOption) (*MsgAddTrustedContractResponse, error) { + out := new(MsgAddTrustedContractResponse) + err := c.cc.Invoke(ctx, "/fairyring.zkp.Msg/AddTrustedContract", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *msgClient) RemoveTrustedContract(ctx context.Context, in *MsgRemoveTrustedContract, opts ...grpc.CallOption) (*MsgRemoveTrustedContractResponse, error) { + out := new(MsgRemoveTrustedContractResponse) + err := c.cc.Invoke(ctx, "/fairyring.zkp.Msg/RemoveTrustedContract", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// MsgServer is the server API for Msg service. +type MsgServer interface { + // UpdateParams defines a governance operation for updating the module parameters. + UpdateParams(context.Context, *MsgUpdateParams) (*MsgUpdateParamsResponse, error) + AddTrustedContract(context.Context, *MsgAddTrustedContract) (*MsgAddTrustedContractResponse, error) + RemoveTrustedContract(context.Context, *MsgRemoveTrustedContract) (*MsgRemoveTrustedContractResponse, error) +} + +// UnimplementedMsgServer can be embedded to have forward compatible implementations. +type UnimplementedMsgServer struct { +} + +func (*UnimplementedMsgServer) UpdateParams(ctx context.Context, req *MsgUpdateParams) (*MsgUpdateParamsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateParams not implemented") +} +func (*UnimplementedMsgServer) AddTrustedContract(ctx context.Context, req *MsgAddTrustedContract) (*MsgAddTrustedContractResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AddTrustedContract not implemented") +} +func (*UnimplementedMsgServer) RemoveTrustedContract(ctx context.Context, req *MsgRemoveTrustedContract) (*MsgRemoveTrustedContractResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method RemoveTrustedContract not implemented") +} + +func RegisterMsgServer(s grpc1.Server, srv MsgServer) { + s.RegisterService(&_Msg_serviceDesc, srv) +} + +func _Msg_UpdateParams_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgUpdateParams) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).UpdateParams(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/fairyring.zkp.Msg/UpdateParams", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).UpdateParams(ctx, req.(*MsgUpdateParams)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_AddTrustedContract_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgAddTrustedContract) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).AddTrustedContract(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/fairyring.zkp.Msg/AddTrustedContract", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).AddTrustedContract(ctx, req.(*MsgAddTrustedContract)) + } + return interceptor(ctx, in, info, handler) +} + +func _Msg_RemoveTrustedContract_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgRemoveTrustedContract) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).RemoveTrustedContract(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/fairyring.zkp.Msg/RemoveTrustedContract", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).RemoveTrustedContract(ctx, req.(*MsgRemoveTrustedContract)) + } + return interceptor(ctx, in, info, handler) +} + +var Msg_serviceDesc = _Msg_serviceDesc +var _Msg_serviceDesc = grpc.ServiceDesc{ + ServiceName: "fairyring.zkp.Msg", + HandlerType: (*MsgServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "UpdateParams", + Handler: _Msg_UpdateParams_Handler, + }, + { + MethodName: "AddTrustedContract", + Handler: _Msg_AddTrustedContract_Handler, + }, + { + MethodName: "RemoveTrustedContract", + Handler: _Msg_RemoveTrustedContract_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "fairyring/zkp/tx.proto", +} + +func (m *MsgUpdateParams) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgUpdateParams) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpdateParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + if len(m.Authority) > 0 { + i -= len(m.Authority) + copy(dAtA[i:], m.Authority) + i = encodeVarintTx(dAtA, i, uint64(len(m.Authority))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgUpdateParamsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgUpdateParamsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgUpdateParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgAddTrustedContract) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgAddTrustedContract) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgAddTrustedContract) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ContractAddress) > 0 { + i -= len(m.ContractAddress) + copy(dAtA[i:], m.ContractAddress) + i = encodeVarintTx(dAtA, i, uint64(len(m.ContractAddress))) + i-- + dAtA[i] = 0x12 + } + if len(m.Authority) > 0 { + i -= len(m.Authority) + copy(dAtA[i:], m.Authority) + i = encodeVarintTx(dAtA, i, uint64(len(m.Authority))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgAddTrustedContractResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgAddTrustedContractResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgAddTrustedContractResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *MsgRemoveTrustedContract) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgRemoveTrustedContract) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRemoveTrustedContract) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.ContractAddress) > 0 { + i -= len(m.ContractAddress) + copy(dAtA[i:], m.ContractAddress) + i = encodeVarintTx(dAtA, i, uint64(len(m.ContractAddress))) + i-- + dAtA[i] = 0x12 + } + if len(m.Authority) > 0 { + i -= len(m.Authority) + copy(dAtA[i:], m.Authority) + i = encodeVarintTx(dAtA, i, uint64(len(m.Authority))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgRemoveTrustedContractResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *MsgRemoveTrustedContractResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgRemoveTrustedContractResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func encodeVarintTx(dAtA []byte, offset int, v uint64) int { + offset -= sovTx(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *MsgUpdateParams) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Authority) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = m.Params.Size() + n += 1 + l + sovTx(uint64(l)) + return n +} + +func (m *MsgUpdateParamsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgAddTrustedContract) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Authority) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.ContractAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgAddTrustedContractResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *MsgRemoveTrustedContract) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Authority) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.ContractAddress) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + return n +} + +func (m *MsgRemoveTrustedContractResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func sovTx(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozTx(x uint64) (n int) { + return sovTx(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *MsgUpdateParams) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgUpdateParams: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUpdateParams: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Authority", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Authority = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgUpdateParamsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgUpdateParamsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgUpdateParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgAddTrustedContract) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgAddTrustedContract: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgAddTrustedContract: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Authority", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Authority = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContractAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ContractAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgAddTrustedContractResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgAddTrustedContractResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgAddTrustedContractResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgRemoveTrustedContract) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgRemoveTrustedContract: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRemoveTrustedContract: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Authority", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Authority = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ContractAddress", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTx + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTx + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ContractAddress = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *MsgRemoveTrustedContractResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: MsgRemoveTrustedContractResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgRemoveTrustedContractResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipTx(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTx + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipTx(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowTx + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthTx + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupTx + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthTx + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthTx = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowTx = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupTx = fmt.Errorf("proto: unexpected end of group") +) diff --git a/x/zkp/types/types.go b/x/zkp/types/types.go index 5bb13ecf..5393e6a2 100644 --- a/x/zkp/types/types.go +++ b/x/zkp/types/types.go @@ -1,2 +1,25 @@ package types +func encodeVarint(data []byte, offset int, v uint64) int { + offset -= sovMsg(v) + base := offset + for v >= 1<<7 { + data[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + data[offset] = uint8(v) + return base +} + +func sovMsg(x uint64) int { + n := 0 + for { + n++ + x >>= 7 + if x == 0 { + break + } + } + return n +} From c51448f6ebfb9ed0d753c926ddd6d20564c4f7d3 Mon Sep 17 00:00:00 2001 From: ap0calypse644 Date: Fri, 24 Apr 2026 13:14:09 +0530 Subject: [PATCH 14/42] enabling anonymous confidential transfer --- api/fairyring/zkp/query.pulsar.go | 1435 ++++++++++++++++++++++------ api/fairyring/zkp/query_grpc.pb.go | 39 + proto/fairyring/zkp/query.proto | 19 + x/zkp/keeper/query.go | 10 + x/zkp/keeper/query_filtered.go | 8 + x/zkp/module/autocli.go | 11 +- x/zkp/types/query.pb.go | 474 +++++++-- x/zkp/types/query.pb.gw.go | 65 ++ 8 files changed, 1722 insertions(+), 339 deletions(-) diff --git a/api/fairyring/zkp/query.pulsar.go b/api/fairyring/zkp/query.pulsar.go index 316b34f9..a83ae2f3 100644 --- a/api/fairyring/zkp/query.pulsar.go +++ b/api/fairyring/zkp/query.pulsar.go @@ -15,6 +15,797 @@ import ( sync "sync" ) +var ( + md_QueryParamsRequest protoreflect.MessageDescriptor +) + +func init() { + file_fairyring_zkp_query_proto_init() + md_QueryParamsRequest = File_fairyring_zkp_query_proto.Messages().ByName("QueryParamsRequest") +} + +var _ protoreflect.Message = (*fastReflection_QueryParamsRequest)(nil) + +type fastReflection_QueryParamsRequest QueryParamsRequest + +func (x *QueryParamsRequest) ProtoReflect() protoreflect.Message { + return (*fastReflection_QueryParamsRequest)(x) +} + +func (x *QueryParamsRequest) slowProtoReflect() protoreflect.Message { + mi := &file_fairyring_zkp_query_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_QueryParamsRequest_messageType fastReflection_QueryParamsRequest_messageType +var _ protoreflect.MessageType = fastReflection_QueryParamsRequest_messageType{} + +type fastReflection_QueryParamsRequest_messageType struct{} + +func (x fastReflection_QueryParamsRequest_messageType) Zero() protoreflect.Message { + return (*fastReflection_QueryParamsRequest)(nil) +} +func (x fastReflection_QueryParamsRequest_messageType) New() protoreflect.Message { + return new(fastReflection_QueryParamsRequest) +} +func (x fastReflection_QueryParamsRequest_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_QueryParamsRequest +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_QueryParamsRequest) Descriptor() protoreflect.MessageDescriptor { + return md_QueryParamsRequest +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_QueryParamsRequest) Type() protoreflect.MessageType { + return _fastReflection_QueryParamsRequest_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_QueryParamsRequest) New() protoreflect.Message { + return new(fastReflection_QueryParamsRequest) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_QueryParamsRequest) Interface() protoreflect.ProtoMessage { + return (*QueryParamsRequest)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_QueryParamsRequest) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_QueryParamsRequest) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryParamsRequest")) + } + panic(fmt.Errorf("message fairyring.zkp.QueryParamsRequest does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryParamsRequest) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryParamsRequest")) + } + panic(fmt.Errorf("message fairyring.zkp.QueryParamsRequest does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_QueryParamsRequest) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryParamsRequest")) + } + panic(fmt.Errorf("message fairyring.zkp.QueryParamsRequest does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryParamsRequest) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryParamsRequest")) + } + panic(fmt.Errorf("message fairyring.zkp.QueryParamsRequest does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryParamsRequest) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryParamsRequest")) + } + panic(fmt.Errorf("message fairyring.zkp.QueryParamsRequest does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_QueryParamsRequest) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryParamsRequest")) + } + panic(fmt.Errorf("message fairyring.zkp.QueryParamsRequest does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_QueryParamsRequest) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in fairyring.zkp.QueryParamsRequest", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_QueryParamsRequest) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryParamsRequest) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_QueryParamsRequest) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_QueryParamsRequest) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*QueryParamsRequest) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*QueryParamsRequest) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*QueryParamsRequest) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryParamsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryParamsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + +var ( + md_QueryParamsResponse protoreflect.MessageDescriptor + fd_QueryParamsResponse_params protoreflect.FieldDescriptor +) + +func init() { + file_fairyring_zkp_query_proto_init() + md_QueryParamsResponse = File_fairyring_zkp_query_proto.Messages().ByName("QueryParamsResponse") + fd_QueryParamsResponse_params = md_QueryParamsResponse.Fields().ByName("params") +} + +var _ protoreflect.Message = (*fastReflection_QueryParamsResponse)(nil) + +type fastReflection_QueryParamsResponse QueryParamsResponse + +func (x *QueryParamsResponse) ProtoReflect() protoreflect.Message { + return (*fastReflection_QueryParamsResponse)(x) +} + +func (x *QueryParamsResponse) slowProtoReflect() protoreflect.Message { + mi := &file_fairyring_zkp_query_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +var _fastReflection_QueryParamsResponse_messageType fastReflection_QueryParamsResponse_messageType +var _ protoreflect.MessageType = fastReflection_QueryParamsResponse_messageType{} + +type fastReflection_QueryParamsResponse_messageType struct{} + +func (x fastReflection_QueryParamsResponse_messageType) Zero() protoreflect.Message { + return (*fastReflection_QueryParamsResponse)(nil) +} +func (x fastReflection_QueryParamsResponse_messageType) New() protoreflect.Message { + return new(fastReflection_QueryParamsResponse) +} +func (x fastReflection_QueryParamsResponse_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_QueryParamsResponse +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_QueryParamsResponse) Descriptor() protoreflect.MessageDescriptor { + return md_QueryParamsResponse +} + +// Type returns the message type, which encapsulates both Go and protobuf +// type information. If the Go type information is not needed, +// it is recommended that the message descriptor be used instead. +func (x *fastReflection_QueryParamsResponse) Type() protoreflect.MessageType { + return _fastReflection_QueryParamsResponse_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_QueryParamsResponse) New() protoreflect.Message { + return new(fastReflection_QueryParamsResponse) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_QueryParamsResponse) Interface() protoreflect.ProtoMessage { + return (*QueryParamsResponse)(x) +} + +// Range iterates over every populated field in an undefined order, +// calling f for each field descriptor and value encountered. +// Range returns immediately if f returns false. +// While iterating, mutating operations may only be performed +// on the current field descriptor. +func (x *fastReflection_QueryParamsResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Params != nil { + value := protoreflect.ValueOfMessage(x.Params.ProtoReflect()) + if !f(fd_QueryParamsResponse_params, value) { + return + } + } +} + +// Has reports whether a field is populated. +// +// Some fields have the property of nullability where it is possible to +// distinguish between the default value of a field and whether the field +// was explicitly populated with the default value. Singular message fields, +// member fields of a oneof, and proto2 scalar fields are nullable. Such +// fields are populated only if explicitly set. +// +// In other cases (aside from the nullable cases above), +// a proto3 scalar field is populated if it contains a non-zero value, and +// a repeated field is populated if it is non-empty. +func (x *fastReflection_QueryParamsResponse) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "fairyring.zkp.QueryParamsResponse.params": + return x.Params != nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryParamsResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.QueryParamsResponse does not contain field %s", fd.FullName())) + } +} + +// Clear clears the field such that a subsequent Has call reports false. +// +// Clearing an extension field clears both the extension type and value +// associated with the given field number. +// +// Clear is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryParamsResponse) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "fairyring.zkp.QueryParamsResponse.params": + x.Params = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryParamsResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.QueryParamsResponse does not contain field %s", fd.FullName())) + } +} + +// Get retrieves the value for a field. +// +// For unpopulated scalars, it returns the default value, where +// the default value of a bytes scalar is guaranteed to be a copy. +// For unpopulated composite types, it returns an empty, read-only view +// of the value; to obtain a mutable reference, use Mutable. +func (x *fastReflection_QueryParamsResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "fairyring.zkp.QueryParamsResponse.params": + value := x.Params + return protoreflect.ValueOfMessage(value.ProtoReflect()) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryParamsResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.QueryParamsResponse does not contain field %s", descriptor.FullName())) + } +} + +// Set stores the value for a field. +// +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType. +// When setting a composite type, it is unspecified whether the stored value +// aliases the source's memory in any way. If the composite value is an +// empty, read-only value, then it panics. +// +// Set is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryParamsResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "fairyring.zkp.QueryParamsResponse.params": + x.Params = value.Message().Interface().(*Params) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryParamsResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.QueryParamsResponse does not contain field %s", fd.FullName())) + } +} + +// Mutable returns a mutable reference to a composite type. +// +// If the field is unpopulated, it may allocate a composite value. +// For a field belonging to a oneof, it implicitly clears any other field +// that may be currently set within the same oneof. +// For extension fields, it implicitly stores the provided ExtensionType +// if not already stored. +// It panics if the field does not contain a composite type. +// +// Mutable is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryParamsResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "fairyring.zkp.QueryParamsResponse.params": + if x.Params == nil { + x.Params = new(Params) + } + return protoreflect.ValueOfMessage(x.Params.ProtoReflect()) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryParamsResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.QueryParamsResponse does not contain field %s", fd.FullName())) + } +} + +// NewField returns a new value that is assignable to the field +// for the given descriptor. For scalars, this returns the default value. +// For lists, maps, and messages, this returns a new, empty, mutable value. +func (x *fastReflection_QueryParamsResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "fairyring.zkp.QueryParamsResponse.params": + m := new(Params) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.zkp.QueryParamsResponse")) + } + panic(fmt.Errorf("message fairyring.zkp.QueryParamsResponse does not contain field %s", fd.FullName())) + } +} + +// WhichOneof reports which field within the oneof is populated, +// returning nil if none are populated. +// It panics if the oneof descriptor does not belong to this message. +func (x *fastReflection_QueryParamsResponse) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in fairyring.zkp.QueryParamsResponse", d.FullName())) + } + panic("unreachable") +} + +// GetUnknown retrieves the entire list of unknown fields. +// The caller may only mutate the contents of the RawFields +// if the mutated bytes are stored back into the message with SetUnknown. +func (x *fastReflection_QueryParamsResponse) GetUnknown() protoreflect.RawFields { + return x.unknownFields +} + +// SetUnknown stores an entire list of unknown fields. +// The raw fields must be syntactically valid according to the wire format. +// An implementation may panic if this is not the case. +// Once stored, the caller must not mutate the content of the RawFields. +// An empty RawFields may be passed to clear the fields. +// +// SetUnknown is a mutating operation and unsafe for concurrent use. +func (x *fastReflection_QueryParamsResponse) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} + +// IsValid reports whether the message is valid. +// +// An invalid message is an empty, read-only value. +// +// An invalid message often corresponds to a nil pointer of the concrete +// message type, but the details are implementation dependent. +// Validity is not part of the protobuf data model, and may not +// be preserved in marshaling or other operations. +func (x *fastReflection_QueryParamsResponse) IsValid() bool { + return x != nil +} + +// ProtoMethods returns optional fastReflectionFeature-path implementations of various operations. +// This method may return nil. +// +// The returned methods type is identical to +// "google.golang.org/protobuf/runtime/protoiface".Methods. +// Consult the protoiface package documentation for details. +func (x *fastReflection_QueryParamsResponse) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*QueryParamsResponse) + if x == nil { + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: 0, + } + } + options := runtime.SizeInputToOptions(input) + _ = options + var n int + var l int + _ = l + if x.Params != nil { + l = options.Size(x.Params) + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } + + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*QueryParamsResponse) + if x == nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + options := runtime.MarshalInputToOptions(input) + _ = options + size := options.Size(x) + dAtA := make([]byte, size) + i := len(dAtA) + _ = i + var l int + _ = l + if x.unknownFields != nil { + i -= len(x.unknownFields) + copy(dAtA[i:], x.unknownFields) + } + if x.Params != nil { + encoded, err := options.Marshal(x.Params) + if err != nil { + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, err + } + i -= len(encoded) + copy(dAtA[i:], encoded) + i = runtime.EncodeVarint(dAtA, i, uint64(len(encoded))) + i-- + dAtA[i] = 0xa + } + if input.Buf != nil { + input.Buf = append(input.Buf, dAtA...) + } else { + input.Buf = dAtA + } + return protoiface.MarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Buf: input.Buf, + }, nil + } + unmarshal := func(input protoiface.UnmarshalInput) (protoiface.UnmarshalOutput, error) { + x := input.Message.Interface().(*QueryParamsResponse) + if x == nil { + return protoiface.UnmarshalOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Flags: input.Flags, + }, nil + } + options := runtime.UnmarshalInputToOptions(input) + _ = options + dAtA := input.Buf + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryParamsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrIntOverflow + } + if iNdEx >= l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if postIndex > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if x.Params == nil { + x.Params = &Params{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Params); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := runtime.Skip(dAtA[iNdEx:]) + if err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, runtime.ErrInvalidLength + } + if (iNdEx + skippy) > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + if !options.DiscardUnknown { + x.unknownFields = append(x.unknownFields, dAtA[iNdEx:iNdEx+skippy]...) + } + iNdEx += skippy + } + } + + if iNdEx > l { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF + } + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, nil + } + return &protoiface.Methods{ + NoUnkeyedLiterals: struct{}{}, + Flags: protoiface.SupportMarshalDeterministic | protoiface.SupportUnmarshalDiscardUnknown, + Size: size, + Marshal: marshal, + Unmarshal: unmarshal, + Merge: nil, + CheckInitialized: nil, + } +} + var ( md_TrustedContractsRequest protoreflect.MessageDescriptor ) @@ -33,7 +824,7 @@ func (x *TrustedContractsRequest) ProtoReflect() protoreflect.Message { } func (x *TrustedContractsRequest) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[0] + mi := &file_fairyring_zkp_query_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -437,7 +1228,7 @@ func (x *TrustedContractsResponse) ProtoReflect() protoreflect.Message { } func (x *TrustedContractsResponse) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[1] + mi := &file_fairyring_zkp_query_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -871,7 +1662,7 @@ func (x *QueryVerifyWithdrawRangeProofRequest) ProtoReflect() protoreflect.Messa } func (x *QueryVerifyWithdrawRangeProofRequest) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[2] + mi := &file_fairyring_zkp_query_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1295,7 +2086,7 @@ func (x *QueryVerifyWithdrawRangeProofResponse) ProtoReflect() protoreflect.Mess } func (x *QueryVerifyWithdrawRangeProofResponse) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[3] + mi := &file_fairyring_zkp_query_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1767,7 +2558,7 @@ func (x *QueryVerifyTransferRangeProofRequest) ProtoReflect() protoreflect.Messa } func (x *QueryVerifyTransferRangeProofRequest) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[4] + mi := &file_fairyring_zkp_query_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2191,7 +2982,7 @@ func (x *QueryVerifyTransferRangeProofResponse) ProtoReflect() protoreflect.Mess } func (x *QueryVerifyTransferRangeProofResponse) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[5] + mi := &file_fairyring_zkp_query_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2663,7 +3454,7 @@ func (x *QueryVerifyValidityProofRequest) ProtoReflect() protoreflect.Message { } func (x *QueryVerifyValidityProofRequest) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[6] + mi := &file_fairyring_zkp_query_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3087,7 +3878,7 @@ func (x *QueryVerifyValidityProofResponse) ProtoReflect() protoreflect.Message { } func (x *QueryVerifyValidityProofResponse) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[7] + mi := &file_fairyring_zkp_query_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3559,7 +4350,7 @@ func (x *QueryVerifyEqualityProofRequest) ProtoReflect() protoreflect.Message { } func (x *QueryVerifyEqualityProofRequest) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[8] + mi := &file_fairyring_zkp_query_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3983,7 +4774,7 @@ func (x *QueryVerifyEqualityProofResponse) ProtoReflect() protoreflect.Message { } func (x *QueryVerifyEqualityProofResponse) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[9] + mi := &file_fairyring_zkp_query_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4467,7 +5258,7 @@ func (x *QueryVerifyTransferProofsRequest) ProtoReflect() protoreflect.Message { } func (x *QueryVerifyTransferProofsRequest) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[10] + mi := &file_fairyring_zkp_query_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5275,7 +6066,7 @@ func (x *QueryVerifyTransferProofsResponse) ProtoReflect() protoreflect.Message } func (x *QueryVerifyTransferProofsResponse) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[11] + mi := &file_fairyring_zkp_query_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5757,7 +6548,7 @@ func (x *QueryVerifyWithdrawProofsRequest) ProtoReflect() protoreflect.Message { } func (x *QueryVerifyWithdrawProofsRequest) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[12] + mi := &file_fairyring_zkp_query_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6483,7 +7274,7 @@ func (x *QueryVerifyWithdrawProofsResponse) ProtoReflect() protoreflect.Message } func (x *QueryVerifyWithdrawProofsResponse) slowProtoReflect() protoreflect.Message { - mi := &file_fairyring_zkp_query_proto_msgTypes[13] + mi := &file_fairyring_zkp_query_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6948,6 +7739,70 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// QueryParamsRequest is request type for the Query/Params RPC method. +type QueryParamsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *QueryParamsRequest) Reset() { + *x = QueryParamsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_fairyring_zkp_query_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryParamsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryParamsRequest) ProtoMessage() {} + +// Deprecated: Use QueryParamsRequest.ProtoReflect.Descriptor instead. +func (*QueryParamsRequest) Descriptor() ([]byte, []int) { + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{0} +} + +// QueryParamsResponse is response type for the Query/Params RPC method. +type QueryParamsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // params holds all the parameters of this module. + Params *Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params,omitempty"` +} + +func (x *QueryParamsResponse) Reset() { + *x = QueryParamsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_fairyring_zkp_query_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryParamsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryParamsResponse) ProtoMessage() {} + +// Deprecated: Use QueryParamsResponse.ProtoReflect.Descriptor instead. +func (*QueryParamsResponse) Descriptor() ([]byte, []int) { + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{1} +} + +func (x *QueryParamsResponse) GetParams() *Params { + if x != nil { + return x.Params + } + return nil +} + type TrustedContractsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6957,7 +7812,7 @@ type TrustedContractsRequest struct { func (x *TrustedContractsRequest) Reset() { *x = TrustedContractsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[0] + mi := &file_fairyring_zkp_query_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6971,7 +7826,7 @@ func (*TrustedContractsRequest) ProtoMessage() {} // Deprecated: Use TrustedContractsRequest.ProtoReflect.Descriptor instead. func (*TrustedContractsRequest) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{0} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{2} } type TrustedContractsResponse struct { @@ -6985,7 +7840,7 @@ type TrustedContractsResponse struct { func (x *TrustedContractsResponse) Reset() { *x = TrustedContractsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[1] + mi := &file_fairyring_zkp_query_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6999,7 +7854,7 @@ func (*TrustedContractsResponse) ProtoMessage() {} // Deprecated: Use TrustedContractsResponse.ProtoReflect.Descriptor instead. func (*TrustedContractsResponse) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{1} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{3} } func (x *TrustedContractsResponse) GetContractAddresses() []string { @@ -7021,7 +7876,7 @@ type QueryVerifyWithdrawRangeProofRequest struct { func (x *QueryVerifyWithdrawRangeProofRequest) Reset() { *x = QueryVerifyWithdrawRangeProofRequest{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[2] + mi := &file_fairyring_zkp_query_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7035,7 +7890,7 @@ func (*QueryVerifyWithdrawRangeProofRequest) ProtoMessage() {} // Deprecated: Use QueryVerifyWithdrawRangeProofRequest.ProtoReflect.Descriptor instead. func (*QueryVerifyWithdrawRangeProofRequest) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{2} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{4} } func (x *QueryVerifyWithdrawRangeProofRequest) GetProofData() []byte { @@ -7058,7 +7913,7 @@ type QueryVerifyWithdrawRangeProofResponse struct { func (x *QueryVerifyWithdrawRangeProofResponse) Reset() { *x = QueryVerifyWithdrawRangeProofResponse{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[3] + mi := &file_fairyring_zkp_query_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7072,7 +7927,7 @@ func (*QueryVerifyWithdrawRangeProofResponse) ProtoMessage() {} // Deprecated: Use QueryVerifyWithdrawRangeProofResponse.ProtoReflect.Descriptor instead. func (*QueryVerifyWithdrawRangeProofResponse) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{3} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{5} } func (x *QueryVerifyWithdrawRangeProofResponse) GetValid() bool { @@ -7101,7 +7956,7 @@ type QueryVerifyTransferRangeProofRequest struct { func (x *QueryVerifyTransferRangeProofRequest) Reset() { *x = QueryVerifyTransferRangeProofRequest{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[4] + mi := &file_fairyring_zkp_query_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7115,7 +7970,7 @@ func (*QueryVerifyTransferRangeProofRequest) ProtoMessage() {} // Deprecated: Use QueryVerifyTransferRangeProofRequest.ProtoReflect.Descriptor instead. func (*QueryVerifyTransferRangeProofRequest) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{4} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{6} } func (x *QueryVerifyTransferRangeProofRequest) GetProofData() []byte { @@ -7138,7 +7993,7 @@ type QueryVerifyTransferRangeProofResponse struct { func (x *QueryVerifyTransferRangeProofResponse) Reset() { *x = QueryVerifyTransferRangeProofResponse{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[5] + mi := &file_fairyring_zkp_query_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7152,7 +8007,7 @@ func (*QueryVerifyTransferRangeProofResponse) ProtoMessage() {} // Deprecated: Use QueryVerifyTransferRangeProofResponse.ProtoReflect.Descriptor instead. func (*QueryVerifyTransferRangeProofResponse) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{5} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{7} } func (x *QueryVerifyTransferRangeProofResponse) GetValid() bool { @@ -7181,7 +8036,7 @@ type QueryVerifyValidityProofRequest struct { func (x *QueryVerifyValidityProofRequest) Reset() { *x = QueryVerifyValidityProofRequest{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[6] + mi := &file_fairyring_zkp_query_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7195,7 +8050,7 @@ func (*QueryVerifyValidityProofRequest) ProtoMessage() {} // Deprecated: Use QueryVerifyValidityProofRequest.ProtoReflect.Descriptor instead. func (*QueryVerifyValidityProofRequest) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{6} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{8} } func (x *QueryVerifyValidityProofRequest) GetProofData() []byte { @@ -7218,7 +8073,7 @@ type QueryVerifyValidityProofResponse struct { func (x *QueryVerifyValidityProofResponse) Reset() { *x = QueryVerifyValidityProofResponse{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[7] + mi := &file_fairyring_zkp_query_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7232,7 +8087,7 @@ func (*QueryVerifyValidityProofResponse) ProtoMessage() {} // Deprecated: Use QueryVerifyValidityProofResponse.ProtoReflect.Descriptor instead. func (*QueryVerifyValidityProofResponse) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{7} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{9} } func (x *QueryVerifyValidityProofResponse) GetValid() bool { @@ -7261,7 +8116,7 @@ type QueryVerifyEqualityProofRequest struct { func (x *QueryVerifyEqualityProofRequest) Reset() { *x = QueryVerifyEqualityProofRequest{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[8] + mi := &file_fairyring_zkp_query_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7275,7 +8130,7 @@ func (*QueryVerifyEqualityProofRequest) ProtoMessage() {} // Deprecated: Use QueryVerifyEqualityProofRequest.ProtoReflect.Descriptor instead. func (*QueryVerifyEqualityProofRequest) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{8} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{10} } func (x *QueryVerifyEqualityProofRequest) GetProofData() []byte { @@ -7298,7 +8153,7 @@ type QueryVerifyEqualityProofResponse struct { func (x *QueryVerifyEqualityProofResponse) Reset() { *x = QueryVerifyEqualityProofResponse{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[9] + mi := &file_fairyring_zkp_query_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7312,7 +8167,7 @@ func (*QueryVerifyEqualityProofResponse) ProtoMessage() {} // Deprecated: Use QueryVerifyEqualityProofResponse.ProtoReflect.Descriptor instead. func (*QueryVerifyEqualityProofResponse) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{9} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{11} } func (x *QueryVerifyEqualityProofResponse) GetValid() bool { @@ -7349,7 +8204,7 @@ type QueryVerifyTransferProofsRequest struct { func (x *QueryVerifyTransferProofsRequest) Reset() { *x = QueryVerifyTransferProofsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[10] + mi := &file_fairyring_zkp_query_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7363,7 +8218,7 @@ func (*QueryVerifyTransferProofsRequest) ProtoMessage() {} // Deprecated: Use QueryVerifyTransferProofsRequest.ProtoReflect.Descriptor instead. func (*QueryVerifyTransferProofsRequest) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{10} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{12} } func (x *QueryVerifyTransferProofsRequest) GetEqualityProofData() []byte { @@ -7428,7 +8283,7 @@ type QueryVerifyTransferProofsResponse struct { func (x *QueryVerifyTransferProofsResponse) Reset() { *x = QueryVerifyTransferProofsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[11] + mi := &file_fairyring_zkp_query_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7442,7 +8297,7 @@ func (*QueryVerifyTransferProofsResponse) ProtoMessage() {} // Deprecated: Use QueryVerifyTransferProofsResponse.ProtoReflect.Descriptor instead. func (*QueryVerifyTransferProofsResponse) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{11} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{13} } func (x *QueryVerifyTransferProofsResponse) GetValid() bool { @@ -7477,7 +8332,7 @@ type QueryVerifyWithdrawProofsRequest struct { func (x *QueryVerifyWithdrawProofsRequest) Reset() { *x = QueryVerifyWithdrawProofsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[12] + mi := &file_fairyring_zkp_query_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7491,7 +8346,7 @@ func (*QueryVerifyWithdrawProofsRequest) ProtoMessage() {} // Deprecated: Use QueryVerifyWithdrawProofsRequest.ProtoReflect.Descriptor instead. func (*QueryVerifyWithdrawProofsRequest) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{12} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{14} } func (x *QueryVerifyWithdrawProofsRequest) GetEqualityProofData() []byte { @@ -7549,7 +8404,7 @@ type QueryVerifyWithdrawProofsResponse struct { func (x *QueryVerifyWithdrawProofsResponse) Reset() { *x = QueryVerifyWithdrawProofsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_fairyring_zkp_query_proto_msgTypes[13] + mi := &file_fairyring_zkp_query_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7563,7 +8418,7 @@ func (*QueryVerifyWithdrawProofsResponse) ProtoMessage() {} // Deprecated: Use QueryVerifyWithdrawProofsResponse.ProtoReflect.Descriptor instead. func (*QueryVerifyWithdrawProofsResponse) Descriptor() ([]byte, []int) { - return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{13} + return file_fairyring_zkp_query_proto_rawDescGZIP(), []int{15} } func (x *QueryVerifyWithdrawProofsResponse) GetValid() bool { @@ -7590,189 +8445,204 @@ var file_fairyring_zkp_query_proto_rawDesc = []byte{ 0x6f, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x22, 0x19, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x61, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x48, 0x0a, 0x18, - 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x61, 0x63, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x11, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x45, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, - 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x22, 0x53, 0x0a, - 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, - 0x64, 0x72, 0x61, 0x77, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x22, 0x45, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, - 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, - 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x22, 0x53, 0x0a, 0x25, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x40, - 0x0a, 0x1f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x6f, 0x1a, 0x1a, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, + 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x14, 0x0a, + 0x12, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x4f, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x66, 0x61, 0x69, + 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x42, 0x09, 0xc8, 0xde, 0x1f, 0x00, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x06, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x48, 0x0a, 0x18, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, + 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x45, 0x0a, 0x24, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, - 0x22, 0x4e, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x22, 0x40, 0x0a, 0x1f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, - 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, - 0x74, 0x61, 0x22, 0x4e, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x22, 0xf0, 0x02, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x65, 0x71, 0x75, 0x61, 0x6c, - 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x61, 0x6e, 0x67, 0x65, - 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x2e, 0x0a, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, - 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x70, 0x75, 0x62, 0x6b, - 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, - 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, - 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0f, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6b, 0x65, - 0x79, 0x12, 0x3c, 0x0a, 0x1a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x18, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x34, 0x0a, 0x16, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x48, - 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x4f, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa6, 0x02, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x65, - 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x69, - 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x12, 0x28, 0x0a, 0x10, 0x72, - 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, - 0x66, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x70, 0x75, - 0x62, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x75, 0x73, 0x65, 0x72, - 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x15, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, - 0x74, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x14, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, - 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x63, - 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, - 0x78, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x70, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0d, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x22, - 0x4f, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, - 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x32, 0xc5, 0x09, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0xbc, 0x01, 0x0a, 0x18, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x33, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, - 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x66, - 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, - 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x3a, 0x01, 0x2a, 0x22, 0x2a, 0x2f, - 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, - 0x72, 0x69, 0x66, 0x79, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x5f, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0xbc, 0x01, 0x0a, 0x18, 0x56, 0x65, + 0x22, 0x53, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, + 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x45, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, - 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x33, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, - 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x66, 0x61, - 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, - 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x3a, 0x01, 0x2a, 0x22, 0x2a, 0x2f, 0x66, - 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x72, 0x61, 0x6e, - 0x67, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0xa7, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x12, 0x2e, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2f, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x66, - 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x12, 0xa7, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, 0x71, 0x75, - 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2e, 0x2e, 0x66, 0x61, 0x69, + 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x22, 0x53, 0x0a, 0x25, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0x40, 0x0a, 0x1f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x44, + 0x61, 0x74, 0x61, 0x22, 0x4e, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0x40, 0x0a, 0x1f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x79, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6f, + 0x66, 0x44, 0x61, 0x74, 0x61, 0x22, 0x4e, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xf0, 0x02, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x65, 0x71, + 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, + 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x13, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, + 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x5f, 0x70, + 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x73, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x72, 0x65, 0x63, + 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, + 0x62, 0x6b, 0x65, 0x79, 0x12, 0x3c, 0x0a, 0x1a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x18, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x62, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x14, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x42, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x22, 0x4f, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xa6, 0x02, 0x0a, 0x20, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, + 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, + 0x0a, 0x13, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x11, 0x65, 0x71, 0x75, + 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x12, 0x28, + 0x0a, 0x10, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x72, 0x6f, 0x6f, 0x66, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0a, 0x75, + 0x73, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x15, 0x63, 0x69, 0x70, + 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x14, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, + 0x74, 0x65, 0x78, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2b, + 0x0a, 0x11, 0x63, 0x69, 0x70, 0x68, 0x65, 0x72, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x68, 0x61, 0x6e, + 0x64, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x10, 0x63, 0x69, 0x70, 0x68, 0x65, + 0x72, 0x74, 0x65, 0x78, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0d, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x6e, + 0x63, 0x65, 0x22, 0x4f, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x32, 0xb5, 0x0a, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x6e, 0x0a, + 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x21, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x66, 0x61, 0x69, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x12, 0x15, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, + 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0xbc, 0x01, + 0x0a, 0x18, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x33, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, - 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, - 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x65, 0x71, - 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0xab, 0x01, 0x0a, - 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x2f, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, - 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x52, 0x61, + 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x34, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, + 0x72, 0x61, 0x77, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x3a, 0x01, 0x2a, + 0x22, 0x2a, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, + 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0xbc, 0x01, 0x0a, + 0x18, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x33, 0x2e, 0x66, 0x61, 0x69, 0x72, + 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x61, 0x6e, + 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, + 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x3a, 0x01, 0x2a, 0x22, + 0x2a, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0xa7, 0x01, 0x0a, 0x13, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x12, 0x2e, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, + 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, + 0x24, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0xa7, 0x01, 0x0a, 0x13, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, + 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2e, 0x2e, + 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, + 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, + 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x45, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, + 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x66, 0x61, 0x69, 0x72, + 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, + 0x5f, 0x65, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x12, + 0xab, 0x01, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x2f, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x66, 0x61, 0x69, 0x72, + 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x2a, 0x3a, 0x01, 0x2a, 0x22, 0x25, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, + 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0xab, 0x01, + 0x0a, 0x14, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x2f, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, - 0x3a, 0x01, 0x2a, 0x22, 0x25, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, - 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0xab, 0x01, 0x0a, 0x14, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x73, 0x12, 0x2f, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, - 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x57, - 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, - 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, - 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2a, 0x3a, 0x01, - 0x2a, 0x22, 0x25, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, - 0x70, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, - 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x8d, 0x01, 0x0a, 0x10, 0x54, 0x72, 0x75, - 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x12, 0x26, 0x2e, - 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x54, 0x72, - 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, - 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x28, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, - 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x42, 0x94, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, - 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x42, 0x0a, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x1e, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, - 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0xa2, 0x02, 0x03, 0x46, - 0x5a, 0x58, 0xaa, 0x02, 0x0d, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x5a, - 0x6b, 0x70, 0xca, 0x02, 0x0d, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x5a, - 0x6b, 0x70, 0xe2, 0x02, 0x19, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x5c, 0x5a, - 0x6b, 0x70, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, - 0x0e, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x5a, 0x6b, 0x70, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x57, 0x69, 0x74, 0x68, 0x64, 0x72, 0x61, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x2a, 0x3a, 0x01, 0x2a, 0x22, 0x25, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, + 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x5f, 0x77, 0x69, 0x74, 0x68, + 0x64, 0x72, 0x61, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x12, 0x8d, 0x01, 0x0a, 0x10, + 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, + 0x12, 0x26, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, + 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, 0x70, 0x2e, 0x54, 0x72, 0x75, 0x73, 0x74, 0x65, 0x64, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x28, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x66, 0x61, 0x69, 0x72, + 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0x2f, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65, + 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x73, 0x42, 0x94, 0x01, 0x0a, 0x11, + 0x63, 0x6f, 0x6d, 0x2e, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x7a, 0x6b, + 0x70, 0x42, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x1e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x66, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x2f, 0x7a, 0x6b, 0x70, 0xa2, + 0x02, 0x03, 0x46, 0x5a, 0x58, 0xaa, 0x02, 0x0d, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, + 0x67, 0x2e, 0x5a, 0x6b, 0x70, 0xca, 0x02, 0x0d, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, + 0x67, 0x5c, 0x5a, 0x6b, 0x70, 0xe2, 0x02, 0x19, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, + 0x67, 0x5c, 0x5a, 0x6b, 0x70, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0xea, 0x02, 0x0e, 0x46, 0x61, 0x69, 0x72, 0x79, 0x72, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x5a, + 0x6b, 0x70, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -7787,43 +8657,49 @@ func file_fairyring_zkp_query_proto_rawDescGZIP() []byte { return file_fairyring_zkp_query_proto_rawDescData } -var file_fairyring_zkp_query_proto_msgTypes = make([]protoimpl.MessageInfo, 14) +var file_fairyring_zkp_query_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_fairyring_zkp_query_proto_goTypes = []interface{}{ - (*TrustedContractsRequest)(nil), // 0: fairyring.zkp.TrustedContractsRequest - (*TrustedContractsResponse)(nil), // 1: fairyring.zkp.TrustedContractsResponse - (*QueryVerifyWithdrawRangeProofRequest)(nil), // 2: fairyring.zkp.QueryVerifyWithdrawRangeProofRequest - (*QueryVerifyWithdrawRangeProofResponse)(nil), // 3: fairyring.zkp.QueryVerifyWithdrawRangeProofResponse - (*QueryVerifyTransferRangeProofRequest)(nil), // 4: fairyring.zkp.QueryVerifyTransferRangeProofRequest - (*QueryVerifyTransferRangeProofResponse)(nil), // 5: fairyring.zkp.QueryVerifyTransferRangeProofResponse - (*QueryVerifyValidityProofRequest)(nil), // 6: fairyring.zkp.QueryVerifyValidityProofRequest - (*QueryVerifyValidityProofResponse)(nil), // 7: fairyring.zkp.QueryVerifyValidityProofResponse - (*QueryVerifyEqualityProofRequest)(nil), // 8: fairyring.zkp.QueryVerifyEqualityProofRequest - (*QueryVerifyEqualityProofResponse)(nil), // 9: fairyring.zkp.QueryVerifyEqualityProofResponse - (*QueryVerifyTransferProofsRequest)(nil), // 10: fairyring.zkp.QueryVerifyTransferProofsRequest - (*QueryVerifyTransferProofsResponse)(nil), // 11: fairyring.zkp.QueryVerifyTransferProofsResponse - (*QueryVerifyWithdrawProofsRequest)(nil), // 12: fairyring.zkp.QueryVerifyWithdrawProofsRequest - (*QueryVerifyWithdrawProofsResponse)(nil), // 13: fairyring.zkp.QueryVerifyWithdrawProofsResponse + (*QueryParamsRequest)(nil), // 0: fairyring.zkp.QueryParamsRequest + (*QueryParamsResponse)(nil), // 1: fairyring.zkp.QueryParamsResponse + (*TrustedContractsRequest)(nil), // 2: fairyring.zkp.TrustedContractsRequest + (*TrustedContractsResponse)(nil), // 3: fairyring.zkp.TrustedContractsResponse + (*QueryVerifyWithdrawRangeProofRequest)(nil), // 4: fairyring.zkp.QueryVerifyWithdrawRangeProofRequest + (*QueryVerifyWithdrawRangeProofResponse)(nil), // 5: fairyring.zkp.QueryVerifyWithdrawRangeProofResponse + (*QueryVerifyTransferRangeProofRequest)(nil), // 6: fairyring.zkp.QueryVerifyTransferRangeProofRequest + (*QueryVerifyTransferRangeProofResponse)(nil), // 7: fairyring.zkp.QueryVerifyTransferRangeProofResponse + (*QueryVerifyValidityProofRequest)(nil), // 8: fairyring.zkp.QueryVerifyValidityProofRequest + (*QueryVerifyValidityProofResponse)(nil), // 9: fairyring.zkp.QueryVerifyValidityProofResponse + (*QueryVerifyEqualityProofRequest)(nil), // 10: fairyring.zkp.QueryVerifyEqualityProofRequest + (*QueryVerifyEqualityProofResponse)(nil), // 11: fairyring.zkp.QueryVerifyEqualityProofResponse + (*QueryVerifyTransferProofsRequest)(nil), // 12: fairyring.zkp.QueryVerifyTransferProofsRequest + (*QueryVerifyTransferProofsResponse)(nil), // 13: fairyring.zkp.QueryVerifyTransferProofsResponse + (*QueryVerifyWithdrawProofsRequest)(nil), // 14: fairyring.zkp.QueryVerifyWithdrawProofsRequest + (*QueryVerifyWithdrawProofsResponse)(nil), // 15: fairyring.zkp.QueryVerifyWithdrawProofsResponse + (*Params)(nil), // 16: fairyring.zkp.Params } var file_fairyring_zkp_query_proto_depIdxs = []int32{ - 2, // 0: fairyring.zkp.Query.VerifyWithdrawRangeProof:input_type -> fairyring.zkp.QueryVerifyWithdrawRangeProofRequest - 4, // 1: fairyring.zkp.Query.VerifyTransferRangeProof:input_type -> fairyring.zkp.QueryVerifyTransferRangeProofRequest - 6, // 2: fairyring.zkp.Query.VerifyValidityProof:input_type -> fairyring.zkp.QueryVerifyValidityProofRequest - 8, // 3: fairyring.zkp.Query.VerifyEqualityProof:input_type -> fairyring.zkp.QueryVerifyEqualityProofRequest - 10, // 4: fairyring.zkp.Query.VerifyTransferProofs:input_type -> fairyring.zkp.QueryVerifyTransferProofsRequest - 12, // 5: fairyring.zkp.Query.VerifyWithdrawProofs:input_type -> fairyring.zkp.QueryVerifyWithdrawProofsRequest - 0, // 6: fairyring.zkp.Query.TrustedContracts:input_type -> fairyring.zkp.TrustedContractsRequest - 3, // 7: fairyring.zkp.Query.VerifyWithdrawRangeProof:output_type -> fairyring.zkp.QueryVerifyWithdrawRangeProofResponse - 5, // 8: fairyring.zkp.Query.VerifyTransferRangeProof:output_type -> fairyring.zkp.QueryVerifyTransferRangeProofResponse - 7, // 9: fairyring.zkp.Query.VerifyValidityProof:output_type -> fairyring.zkp.QueryVerifyValidityProofResponse - 9, // 10: fairyring.zkp.Query.VerifyEqualityProof:output_type -> fairyring.zkp.QueryVerifyEqualityProofResponse - 11, // 11: fairyring.zkp.Query.VerifyTransferProofs:output_type -> fairyring.zkp.QueryVerifyTransferProofsResponse - 13, // 12: fairyring.zkp.Query.VerifyWithdrawProofs:output_type -> fairyring.zkp.QueryVerifyWithdrawProofsResponse - 1, // 13: fairyring.zkp.Query.TrustedContracts:output_type -> fairyring.zkp.TrustedContractsResponse - 7, // [7:14] is the sub-list for method output_type - 0, // [0:7] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name + 16, // 0: fairyring.zkp.QueryParamsResponse.params:type_name -> fairyring.zkp.Params + 0, // 1: fairyring.zkp.Query.Params:input_type -> fairyring.zkp.QueryParamsRequest + 4, // 2: fairyring.zkp.Query.VerifyWithdrawRangeProof:input_type -> fairyring.zkp.QueryVerifyWithdrawRangeProofRequest + 6, // 3: fairyring.zkp.Query.VerifyTransferRangeProof:input_type -> fairyring.zkp.QueryVerifyTransferRangeProofRequest + 8, // 4: fairyring.zkp.Query.VerifyValidityProof:input_type -> fairyring.zkp.QueryVerifyValidityProofRequest + 10, // 5: fairyring.zkp.Query.VerifyEqualityProof:input_type -> fairyring.zkp.QueryVerifyEqualityProofRequest + 12, // 6: fairyring.zkp.Query.VerifyTransferProofs:input_type -> fairyring.zkp.QueryVerifyTransferProofsRequest + 14, // 7: fairyring.zkp.Query.VerifyWithdrawProofs:input_type -> fairyring.zkp.QueryVerifyWithdrawProofsRequest + 2, // 8: fairyring.zkp.Query.TrustedContracts:input_type -> fairyring.zkp.TrustedContractsRequest + 1, // 9: fairyring.zkp.Query.Params:output_type -> fairyring.zkp.QueryParamsResponse + 5, // 10: fairyring.zkp.Query.VerifyWithdrawRangeProof:output_type -> fairyring.zkp.QueryVerifyWithdrawRangeProofResponse + 7, // 11: fairyring.zkp.Query.VerifyTransferRangeProof:output_type -> fairyring.zkp.QueryVerifyTransferRangeProofResponse + 9, // 12: fairyring.zkp.Query.VerifyValidityProof:output_type -> fairyring.zkp.QueryVerifyValidityProofResponse + 11, // 13: fairyring.zkp.Query.VerifyEqualityProof:output_type -> fairyring.zkp.QueryVerifyEqualityProofResponse + 13, // 14: fairyring.zkp.Query.VerifyTransferProofs:output_type -> fairyring.zkp.QueryVerifyTransferProofsResponse + 15, // 15: fairyring.zkp.Query.VerifyWithdrawProofs:output_type -> fairyring.zkp.QueryVerifyWithdrawProofsResponse + 3, // 16: fairyring.zkp.Query.TrustedContracts:output_type -> fairyring.zkp.TrustedContractsResponse + 9, // [9:17] is the sub-list for method output_type + 1, // [1:9] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name } func init() { file_fairyring_zkp_query_proto_init() } @@ -7831,9 +8707,10 @@ func file_fairyring_zkp_query_proto_init() { if File_fairyring_zkp_query_proto != nil { return } + file_fairyring_zkp_params_proto_init() if !protoimpl.UnsafeEnabled { file_fairyring_zkp_query_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrustedContractsRequest); i { + switch v := v.(*QueryParamsRequest); i { case 0: return &v.state case 1: @@ -7845,7 +8722,7 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrustedContractsResponse); i { + switch v := v.(*QueryParamsResponse); i { case 0: return &v.state case 1: @@ -7857,7 +8734,7 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryVerifyWithdrawRangeProofRequest); i { + switch v := v.(*TrustedContractsRequest); i { case 0: return &v.state case 1: @@ -7869,7 +8746,7 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryVerifyWithdrawRangeProofResponse); i { + switch v := v.(*TrustedContractsResponse); i { case 0: return &v.state case 1: @@ -7881,7 +8758,7 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryVerifyTransferRangeProofRequest); i { + switch v := v.(*QueryVerifyWithdrawRangeProofRequest); i { case 0: return &v.state case 1: @@ -7893,7 +8770,7 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryVerifyTransferRangeProofResponse); i { + switch v := v.(*QueryVerifyWithdrawRangeProofResponse); i { case 0: return &v.state case 1: @@ -7905,7 +8782,7 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryVerifyValidityProofRequest); i { + switch v := v.(*QueryVerifyTransferRangeProofRequest); i { case 0: return &v.state case 1: @@ -7917,7 +8794,7 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryVerifyValidityProofResponse); i { + switch v := v.(*QueryVerifyTransferRangeProofResponse); i { case 0: return &v.state case 1: @@ -7929,7 +8806,7 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryVerifyEqualityProofRequest); i { + switch v := v.(*QueryVerifyValidityProofRequest); i { case 0: return &v.state case 1: @@ -7941,7 +8818,7 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryVerifyEqualityProofResponse); i { + switch v := v.(*QueryVerifyValidityProofResponse); i { case 0: return &v.state case 1: @@ -7953,7 +8830,7 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryVerifyTransferProofsRequest); i { + switch v := v.(*QueryVerifyEqualityProofRequest); i { case 0: return &v.state case 1: @@ -7965,7 +8842,7 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryVerifyTransferProofsResponse); i { + switch v := v.(*QueryVerifyEqualityProofResponse); i { case 0: return &v.state case 1: @@ -7977,7 +8854,7 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryVerifyWithdrawProofsRequest); i { + switch v := v.(*QueryVerifyTransferProofsRequest); i { case 0: return &v.state case 1: @@ -7989,6 +8866,30 @@ func file_fairyring_zkp_query_proto_init() { } } file_fairyring_zkp_query_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryVerifyTransferProofsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fairyring_zkp_query_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryVerifyWithdrawProofsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_fairyring_zkp_query_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryVerifyWithdrawProofsResponse); i { case 0: return &v.state @@ -8007,7 +8908,7 @@ func file_fairyring_zkp_query_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_fairyring_zkp_query_proto_rawDesc, NumEnums: 0, - NumMessages: 14, + NumMessages: 16, NumExtensions: 0, NumServices: 1, }, diff --git a/api/fairyring/zkp/query_grpc.pb.go b/api/fairyring/zkp/query_grpc.pb.go index 3f21281d..82848207 100644 --- a/api/fairyring/zkp/query_grpc.pb.go +++ b/api/fairyring/zkp/query_grpc.pb.go @@ -19,6 +19,7 @@ import ( const _ = grpc.SupportPackageIsVersion7 const ( + Query_Params_FullMethodName = "/fairyring.zkp.Query/Params" Query_VerifyWithdrawRangeProof_FullMethodName = "/fairyring.zkp.Query/VerifyWithdrawRangeProof" Query_VerifyTransferRangeProof_FullMethodName = "/fairyring.zkp.Query/VerifyTransferRangeProof" Query_VerifyValidityProof_FullMethodName = "/fairyring.zkp.Query/VerifyValidityProof" @@ -32,6 +33,8 @@ const ( // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type QueryClient interface { + // Params queries the parameters of the module. + Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) // VerifyWithdrawRangeProof verifies a withdraw range proof (U64) VerifyWithdrawRangeProof(ctx context.Context, in *QueryVerifyWithdrawRangeProofRequest, opts ...grpc.CallOption) (*QueryVerifyWithdrawRangeProofResponse, error) // VerifyTransferRangeProof verifies a transfer range proof (U128) @@ -55,6 +58,15 @@ func NewQueryClient(cc grpc.ClientConnInterface) QueryClient { return &queryClient{cc} } +func (c *queryClient) Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) { + out := new(QueryParamsResponse) + err := c.cc.Invoke(ctx, Query_Params_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *queryClient) VerifyWithdrawRangeProof(ctx context.Context, in *QueryVerifyWithdrawRangeProofRequest, opts ...grpc.CallOption) (*QueryVerifyWithdrawRangeProofResponse, error) { out := new(QueryVerifyWithdrawRangeProofResponse) err := c.cc.Invoke(ctx, Query_VerifyWithdrawRangeProof_FullMethodName, in, out, opts...) @@ -122,6 +134,8 @@ func (c *queryClient) TrustedContracts(ctx context.Context, in *TrustedContracts // All implementations must embed UnimplementedQueryServer // for forward compatibility type QueryServer interface { + // Params queries the parameters of the module. + Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) // VerifyWithdrawRangeProof verifies a withdraw range proof (U64) VerifyWithdrawRangeProof(context.Context, *QueryVerifyWithdrawRangeProofRequest) (*QueryVerifyWithdrawRangeProofResponse, error) // VerifyTransferRangeProof verifies a transfer range proof (U128) @@ -142,6 +156,9 @@ type QueryServer interface { type UnimplementedQueryServer struct { } +func (UnimplementedQueryServer) Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Params not implemented") +} func (UnimplementedQueryServer) VerifyWithdrawRangeProof(context.Context, *QueryVerifyWithdrawRangeProofRequest) (*QueryVerifyWithdrawRangeProofResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method VerifyWithdrawRangeProof not implemented") } @@ -176,6 +193,24 @@ func RegisterQueryServer(s grpc.ServiceRegistrar, srv QueryServer) { s.RegisterService(&Query_ServiceDesc, srv) } +func _Query_Params_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryParamsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).Params(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Query_Params_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).Params(ctx, req.(*QueryParamsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Query_VerifyWithdrawRangeProof_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(QueryVerifyWithdrawRangeProofRequest) if err := dec(in); err != nil { @@ -309,6 +344,10 @@ var Query_ServiceDesc = grpc.ServiceDesc{ ServiceName: "fairyring.zkp.Query", HandlerType: (*QueryServer)(nil), Methods: []grpc.MethodDesc{ + { + MethodName: "Params", + Handler: _Query_Params_Handler, + }, { MethodName: "VerifyWithdrawRangeProof", Handler: _Query_VerifyWithdrawRangeProof_Handler, diff --git a/proto/fairyring/zkp/query.proto b/proto/fairyring/zkp/query.proto index 8f8f0bdb..7ace17a3 100644 --- a/proto/fairyring/zkp/query.proto +++ b/proto/fairyring/zkp/query.proto @@ -5,11 +5,17 @@ package fairyring.zkp; import "amino/amino.proto"; import "gogoproto/gogo.proto"; import "google/api/annotations.proto"; +import "fairyring/zkp/params.proto"; option go_package = "github.com/Fairblock/fairyring/x/zkp/types"; // Query defines the gRPC querier service. service Query { + // Params queries the parameters of the module. + rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { + option (google.api.http).get = "/fairyring/zkp/params"; + } + // VerifyWithdrawRangeProof verifies a withdraw range proof (U64) rpc VerifyWithdrawRangeProof(QueryVerifyWithdrawRangeProofRequest) returns (QueryVerifyWithdrawRangeProofResponse) { option (google.api.http).post = "/fairyring/zkp/verify_withdraw_range_proof"; @@ -51,7 +57,20 @@ service Query { } } +// QueryParamsRequest is request type for the Query/Params RPC method. +message QueryParamsRequest {} + +// QueryParamsResponse is response type for the Query/Params RPC method. +message QueryParamsResponse { + // params holds all the parameters of this module. + Params params = 1 [ + (gogoproto.nullable) = false, + (amino.dont_omitempty) = true + ]; +} + message TrustedContractsRequest {} + message TrustedContractsResponse { repeated string ContractAddresses = 1; // List of trusted contract addresses } diff --git a/x/zkp/keeper/query.go b/x/zkp/keeper/query.go index 347655b6..ebc66e2a 100644 --- a/x/zkp/keeper/query.go +++ b/x/zkp/keeper/query.go @@ -20,3 +20,13 @@ func (k Keeper) TrustedContracts(goCtx context.Context, req *types.TrustedContra contracts := k.GetAllTrustedContracts(ctx) return &types.TrustedContractsResponse{ContractAddresses: contracts}, nil } + +// Params returns the current zkp module params. +func (k Keeper) Params(goCtx context.Context, req *types.QueryParamsRequest) (*types.QueryParamsResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + ctx := sdk.UnwrapSDKContext(goCtx) + + return &types.QueryParamsResponse{Params: k.GetParams(ctx)}, nil +} diff --git a/x/zkp/keeper/query_filtered.go b/x/zkp/keeper/query_filtered.go index a8928de3..cbe04eed 100644 --- a/x/zkp/keeper/query_filtered.go +++ b/x/zkp/keeper/query_filtered.go @@ -24,6 +24,14 @@ func (f *FilteredQueryServer) TrustedContracts(goCtx context.Context, req *types return &types.TrustedContractsResponse{ContractAddresses: contracts}, nil } +func (f *FilteredQueryServer) Params(goCtx context.Context, req *types.QueryParamsRequest) (*types.QueryParamsResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + ctx := sdk.UnwrapSDKContext(goCtx) + return &types.QueryParamsResponse{Params: f.keeper.GetParams(ctx)}, nil +} + func (f *FilteredQueryServer) VerifyWithdrawRangeProof(ctx context.Context, req *types.QueryVerifyWithdrawRangeProofRequest) (*types.QueryVerifyWithdrawRangeProofResponse, error) { return nil, status.Errorf(codes.PermissionDenied, "ZKP verification queries are only accessible through CosmWasm contracts, not via gRPC or REST API") } diff --git a/x/zkp/module/autocli.go b/x/zkp/module/autocli.go index be96dc77..01be37ca 100644 --- a/x/zkp/module/autocli.go +++ b/x/zkp/module/autocli.go @@ -8,14 +8,19 @@ import ( // AutoCLIOptions implements the autocli.HasAutoCLIConfig interface. // -// Only TrustedContracts is exposed as a public CLI query. The proof verification -// RPCs stay intentionally hidden from the CLI because they are meant to be -// called only through the CosmWasm trusted-contract query path. +// Only Params and TrustedContracts are exposed as public CLI queries. +// The proof verification RPCs stay intentionally hidden from the CLI +// because they are meant to be called only through the CosmWasm trusted-contract query path. func (am AppModule) AutoCLIOptions() *autocliv1.ModuleOptions { return &autocliv1.ModuleOptions{ Query: &autocliv1.ServiceCommandDescriptor{ Service: modulev1.Query_ServiceDesc.ServiceName, RpcCommandOptions: []*autocliv1.RpcCommandOptions{ + { + RpcMethod: "Params", + Use: "params", + Short: "Shows the parameters of the module", + }, { RpcMethod: "TrustedContracts", Use: "trusted-contracts", diff --git a/x/zkp/types/query.pb.go b/x/zkp/types/query.pb.go index 453ba032..c5784e6f 100644 --- a/x/zkp/types/query.pb.go +++ b/x/zkp/types/query.pb.go @@ -30,6 +30,89 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package +// QueryParamsRequest is request type for the Query/Params RPC method. +type QueryParamsRequest struct { +} + +func (m *QueryParamsRequest) Reset() { *m = QueryParamsRequest{} } +func (m *QueryParamsRequest) String() string { return proto.CompactTextString(m) } +func (*QueryParamsRequest) ProtoMessage() {} +func (*QueryParamsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_d7ffffa30d808249, []int{0} +} +func (m *QueryParamsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryParamsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryParamsRequest.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryParamsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryParamsRequest.Merge(m, src) +} +func (m *QueryParamsRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryParamsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryParamsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryParamsRequest proto.InternalMessageInfo + +// QueryParamsResponse is response type for the Query/Params RPC method. +type QueryParamsResponse struct { + // params holds all the parameters of this module. + Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` +} + +func (m *QueryParamsResponse) Reset() { *m = QueryParamsResponse{} } +func (m *QueryParamsResponse) String() string { return proto.CompactTextString(m) } +func (*QueryParamsResponse) ProtoMessage() {} +func (*QueryParamsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_d7ffffa30d808249, []int{1} +} +func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryParamsResponse.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *QueryParamsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryParamsResponse.Merge(m, src) +} +func (m *QueryParamsResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryParamsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryParamsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryParamsResponse proto.InternalMessageInfo + +func (m *QueryParamsResponse) GetParams() Params { + if m != nil { + return m.Params + } + return Params{} +} + type TrustedContractsRequest struct { } @@ -37,7 +120,7 @@ func (m *TrustedContractsRequest) Reset() { *m = TrustedContractsRequest func (m *TrustedContractsRequest) String() string { return proto.CompactTextString(m) } func (*TrustedContractsRequest) ProtoMessage() {} func (*TrustedContractsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{0} + return fileDescriptor_d7ffffa30d808249, []int{2} } func (m *TrustedContractsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -74,7 +157,7 @@ func (m *TrustedContractsResponse) Reset() { *m = TrustedContractsRespon func (m *TrustedContractsResponse) String() string { return proto.CompactTextString(m) } func (*TrustedContractsResponse) ProtoMessage() {} func (*TrustedContractsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{1} + return fileDescriptor_d7ffffa30d808249, []int{3} } func (m *TrustedContractsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -119,7 +202,7 @@ func (m *QueryVerifyWithdrawRangeProofRequest) Reset() { *m = QueryVerif func (m *QueryVerifyWithdrawRangeProofRequest) String() string { return proto.CompactTextString(m) } func (*QueryVerifyWithdrawRangeProofRequest) ProtoMessage() {} func (*QueryVerifyWithdrawRangeProofRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{2} + return fileDescriptor_d7ffffa30d808249, []int{4} } func (m *QueryVerifyWithdrawRangeProofRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -165,7 +248,7 @@ func (m *QueryVerifyWithdrawRangeProofResponse) Reset() { *m = QueryVeri func (m *QueryVerifyWithdrawRangeProofResponse) String() string { return proto.CompactTextString(m) } func (*QueryVerifyWithdrawRangeProofResponse) ProtoMessage() {} func (*QueryVerifyWithdrawRangeProofResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{3} + return fileDescriptor_d7ffffa30d808249, []int{5} } func (m *QueryVerifyWithdrawRangeProofResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -217,7 +300,7 @@ func (m *QueryVerifyTransferRangeProofRequest) Reset() { *m = QueryVerif func (m *QueryVerifyTransferRangeProofRequest) String() string { return proto.CompactTextString(m) } func (*QueryVerifyTransferRangeProofRequest) ProtoMessage() {} func (*QueryVerifyTransferRangeProofRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{4} + return fileDescriptor_d7ffffa30d808249, []int{6} } func (m *QueryVerifyTransferRangeProofRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -263,7 +346,7 @@ func (m *QueryVerifyTransferRangeProofResponse) Reset() { *m = QueryVeri func (m *QueryVerifyTransferRangeProofResponse) String() string { return proto.CompactTextString(m) } func (*QueryVerifyTransferRangeProofResponse) ProtoMessage() {} func (*QueryVerifyTransferRangeProofResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{5} + return fileDescriptor_d7ffffa30d808249, []int{7} } func (m *QueryVerifyTransferRangeProofResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -315,7 +398,7 @@ func (m *QueryVerifyValidityProofRequest) Reset() { *m = QueryVerifyVali func (m *QueryVerifyValidityProofRequest) String() string { return proto.CompactTextString(m) } func (*QueryVerifyValidityProofRequest) ProtoMessage() {} func (*QueryVerifyValidityProofRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{6} + return fileDescriptor_d7ffffa30d808249, []int{8} } func (m *QueryVerifyValidityProofRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -361,7 +444,7 @@ func (m *QueryVerifyValidityProofResponse) Reset() { *m = QueryVerifyVal func (m *QueryVerifyValidityProofResponse) String() string { return proto.CompactTextString(m) } func (*QueryVerifyValidityProofResponse) ProtoMessage() {} func (*QueryVerifyValidityProofResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{7} + return fileDescriptor_d7ffffa30d808249, []int{9} } func (m *QueryVerifyValidityProofResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -413,7 +496,7 @@ func (m *QueryVerifyEqualityProofRequest) Reset() { *m = QueryVerifyEqua func (m *QueryVerifyEqualityProofRequest) String() string { return proto.CompactTextString(m) } func (*QueryVerifyEqualityProofRequest) ProtoMessage() {} func (*QueryVerifyEqualityProofRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{8} + return fileDescriptor_d7ffffa30d808249, []int{10} } func (m *QueryVerifyEqualityProofRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -459,7 +542,7 @@ func (m *QueryVerifyEqualityProofResponse) Reset() { *m = QueryVerifyEqu func (m *QueryVerifyEqualityProofResponse) String() string { return proto.CompactTextString(m) } func (*QueryVerifyEqualityProofResponse) ProtoMessage() {} func (*QueryVerifyEqualityProofResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{9} + return fileDescriptor_d7ffffa30d808249, []int{11} } func (m *QueryVerifyEqualityProofResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -519,7 +602,7 @@ func (m *QueryVerifyTransferProofsRequest) Reset() { *m = QueryVerifyTra func (m *QueryVerifyTransferProofsRequest) String() string { return proto.CompactTextString(m) } func (*QueryVerifyTransferProofsRequest) ProtoMessage() {} func (*QueryVerifyTransferProofsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{10} + return fileDescriptor_d7ffffa30d808249, []int{12} } func (m *QueryVerifyTransferProofsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -607,7 +690,7 @@ func (m *QueryVerifyTransferProofsResponse) Reset() { *m = QueryVerifyTr func (m *QueryVerifyTransferProofsResponse) String() string { return proto.CompactTextString(m) } func (*QueryVerifyTransferProofsResponse) ProtoMessage() {} func (*QueryVerifyTransferProofsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{11} + return fileDescriptor_d7ffffa30d808249, []int{13} } func (m *QueryVerifyTransferProofsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -665,7 +748,7 @@ func (m *QueryVerifyWithdrawProofsRequest) Reset() { *m = QueryVerifyWit func (m *QueryVerifyWithdrawProofsRequest) String() string { return proto.CompactTextString(m) } func (*QueryVerifyWithdrawProofsRequest) ProtoMessage() {} func (*QueryVerifyWithdrawProofsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{12} + return fileDescriptor_d7ffffa30d808249, []int{14} } func (m *QueryVerifyWithdrawProofsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -746,7 +829,7 @@ func (m *QueryVerifyWithdrawProofsResponse) Reset() { *m = QueryVerifyWi func (m *QueryVerifyWithdrawProofsResponse) String() string { return proto.CompactTextString(m) } func (*QueryVerifyWithdrawProofsResponse) ProtoMessage() {} func (*QueryVerifyWithdrawProofsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_d7ffffa30d808249, []int{13} + return fileDescriptor_d7ffffa30d808249, []int{15} } func (m *QueryVerifyWithdrawProofsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -790,6 +873,8 @@ func (m *QueryVerifyWithdrawProofsResponse) GetError() string { } func init() { + proto.RegisterType((*QueryParamsRequest)(nil), "fairyring.zkp.QueryParamsRequest") + proto.RegisterType((*QueryParamsResponse)(nil), "fairyring.zkp.QueryParamsResponse") proto.RegisterType((*TrustedContractsRequest)(nil), "fairyring.zkp.TrustedContractsRequest") proto.RegisterType((*TrustedContractsResponse)(nil), "fairyring.zkp.TrustedContractsResponse") proto.RegisterType((*QueryVerifyWithdrawRangeProofRequest)(nil), "fairyring.zkp.QueryVerifyWithdrawRangeProofRequest") @@ -809,61 +894,65 @@ func init() { func init() { proto.RegisterFile("fairyring/zkp/query.proto", fileDescriptor_d7ffffa30d808249) } var fileDescriptor_d7ffffa30d808249 = []byte{ - // 852 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x96, 0xcd, 0x6e, 0xdb, 0x46, - 0x10, 0xc7, 0x4d, 0xf9, 0xa3, 0xd5, 0xd6, 0x76, 0x25, 0x5a, 0x6d, 0x69, 0xa1, 0x95, 0x55, 0xd6, - 0x6e, 0x65, 0xb5, 0x20, 0x8d, 0xda, 0xbd, 0x14, 0x3d, 0x34, 0xfe, 0x08, 0x7c, 0x72, 0x1c, 0xc5, - 0x70, 0x80, 0x5c, 0x88, 0x15, 0xb9, 0x92, 0x08, 0x49, 0xbb, 0xf4, 0x72, 0x29, 0x5b, 0x3e, 0xe6, - 0x1e, 0x20, 0x40, 0xde, 0x21, 0x39, 0xe4, 0x15, 0x72, 0x0d, 0x90, 0xa3, 0x81, 0x5c, 0x72, 0x0c, - 0xec, 0x3c, 0x40, 0x1e, 0x21, 0xe0, 0x72, 0x25, 0x93, 0x14, 0xf5, 0x61, 0x1b, 0xc8, 0xc5, 0x10, - 0x67, 0xfe, 0x33, 0xfc, 0x79, 0x86, 0xfc, 0x2f, 0xc1, 0x72, 0x0d, 0xda, 0xb4, 0x4b, 0x6d, 0x5c, - 0xd7, 0xcf, 0x9b, 0x8e, 0x7e, 0xe2, 0x21, 0xda, 0xd5, 0x1c, 0x4a, 0x18, 0x91, 0x17, 0xfa, 0x29, - 0xed, 0xbc, 0xe9, 0xe4, 0xb3, 0xb0, 0x6d, 0x63, 0xa2, 0xf3, 0xbf, 0x81, 0x22, 0x9f, 0xab, 0x93, - 0x3a, 0xe1, 0x3f, 0x75, 0xff, 0x97, 0x88, 0xfe, 0x5c, 0x27, 0xa4, 0xde, 0x42, 0x3a, 0x74, 0x6c, - 0x1d, 0x62, 0x4c, 0x18, 0x64, 0x36, 0xc1, 0x6e, 0x90, 0x55, 0x97, 0xc1, 0x4f, 0x47, 0xd4, 0x73, - 0x19, 0xb2, 0x76, 0x08, 0x66, 0x14, 0x9a, 0xcc, 0xad, 0xa0, 0x13, 0x0f, 0xb9, 0x4c, 0xdd, 0x07, - 0xca, 0x60, 0xca, 0x75, 0x08, 0x76, 0x91, 0xfc, 0x17, 0xc8, 0xf6, 0x82, 0xf7, 0x2c, 0x8b, 0x22, - 0xd7, 0x45, 0xae, 0x22, 0x15, 0xa7, 0x4b, 0xe9, 0xca, 0x60, 0x42, 0xdd, 0x03, 0xab, 0x0f, 0xfd, - 0xff, 0xe4, 0x18, 0x51, 0xbb, 0xd6, 0x7d, 0x6c, 0xb3, 0x86, 0x45, 0xe1, 0x69, 0x05, 0xe2, 0x3a, - 0x3a, 0xa4, 0x84, 0xd4, 0xc4, 0x1d, 0xe5, 0x5f, 0x00, 0x70, 0xfc, 0x6b, 0xc3, 0x82, 0x0c, 0x2a, - 0x52, 0x51, 0x2a, 0xcd, 0x57, 0xd2, 0x3c, 0xb2, 0x0b, 0x19, 0x54, 0x1f, 0x81, 0xb5, 0x31, 0x6d, - 0x04, 0x5d, 0x0e, 0xcc, 0x76, 0x60, 0xcb, 0xb6, 0x78, 0x8b, 0x6f, 0x2b, 0xc1, 0x85, 0x1f, 0x45, - 0x94, 0x12, 0xaa, 0xa4, 0x8a, 0x52, 0x29, 0x5d, 0x09, 0x2e, 0x62, 0x6c, 0x47, 0x14, 0x62, 0xb7, - 0x86, 0xe8, 0x1d, 0xd9, 0x92, 0xda, 0xdc, 0x82, 0xed, 0x7f, 0xb0, 0x12, 0x6a, 0x7a, 0xec, 0x2b, - 0x6d, 0xd6, 0xbd, 0x09, 0xd6, 0x01, 0x28, 0x0e, 0xef, 0x70, 0x67, 0xa2, 0xbd, 0x13, 0x0f, 0xb6, - 0xee, 0x44, 0x14, 0xeb, 0x70, 0x0b, 0xa2, 0xcf, 0xa9, 0x48, 0xc3, 0xde, 0xe4, 0x79, 0xc3, 0xde, - 0xa3, 0x2c, 0x6b, 0x60, 0x09, 0x89, 0x3b, 0x19, 0x03, 0x70, 0x59, 0x14, 0x86, 0xf0, 0x21, 0xe5, - 0x12, 0xc8, 0x50, 0x7f, 0x75, 0x61, 0x71, 0x8a, 0x8b, 0x17, 0x69, 0x7f, 0xa5, 0x5c, 0xa9, 0x81, - 0xa5, 0x8e, 0x98, 0x6a, 0x58, 0x3c, 0x1d, 0x74, 0xee, 0x84, 0x07, 0xce, 0xf5, 0xbf, 0x81, 0x05, - 0x17, 0x61, 0x0b, 0x51, 0xc3, 0xf1, 0xaa, 0x4d, 0xd4, 0x55, 0x66, 0xb8, 0x72, 0x3e, 0x08, 0x1e, - 0xf2, 0x98, 0xbc, 0x0e, 0x32, 0x14, 0x99, 0xb6, 0x63, 0x23, 0xcc, 0x7a, 0xba, 0x59, 0xae, 0xfb, - 0xbe, 0x1f, 0x17, 0xd2, 0xff, 0x40, 0xde, 0xf4, 0x28, 0xf5, 0x85, 0x55, 0xd8, 0x82, 0xd8, 0x44, - 0x86, 0x49, 0xda, 0x6d, 0x9b, 0xb5, 0x11, 0x66, 0xca, 0x1c, 0x2f, 0x52, 0x84, 0x62, 0x3b, 0x10, - 0xec, 0xf4, 0xf3, 0xf2, 0x16, 0xf8, 0x31, 0x5e, 0xdd, 0x80, 0xd8, 0x6a, 0x21, 0xe5, 0x1b, 0x5e, - 0x99, 0x8b, 0x56, 0xee, 0xf3, 0x9c, 0xfa, 0x00, 0xfc, 0x3a, 0x62, 0xe2, 0xb7, 0xd8, 0xe1, 0xcb, - 0xe8, 0x0e, 0x7b, 0x6f, 0xf6, 0xd7, 0xda, 0xe1, 0x0a, 0xf8, 0xce, 0x73, 0xaf, 0x37, 0x12, 0xec, - 0x0e, 0xf8, 0x21, 0x31, 0xe4, 0x4d, 0xf0, 0x83, 0x69, 0x3b, 0x0d, 0x44, 0x19, 0x3a, 0x63, 0xe1, - 0xf9, 0xce, 0x88, 0x29, 0xf5, 0x93, 0xa1, 0xd9, 0xfe, 0x09, 0xb2, 0xa1, 0x22, 0x31, 0xd6, 0x60, - 0x8b, 0x99, 0xeb, 0x44, 0x30, 0x52, 0x79, 0x0d, 0x2c, 0xa2, 0x33, 0x07, 0x99, 0x0c, 0x59, 0x06, - 0x26, 0xd8, 0x44, 0x7c, 0x75, 0x33, 0x95, 0x85, 0x5e, 0xf4, 0xc0, 0x0f, 0xc6, 0x26, 0x1f, 0x9f, - 0xd3, 0xcd, 0x27, 0xff, 0xf7, 0xdb, 0x34, 0x98, 0xe5, 0x1d, 0xe5, 0x37, 0x12, 0x50, 0x86, 0x19, - 0xab, 0xbc, 0xa9, 0x45, 0x0e, 0x1f, 0x6d, 0x12, 0x37, 0xcf, 0x6f, 0xdd, 0xac, 0x28, 0xa0, 0x57, - 0xff, 0x79, 0xfa, 0xfe, 0xd3, 0x8b, 0x94, 0xfe, 0xaf, 0x54, 0x56, 0xcb, 0x7a, 0xf4, 0x34, 0xec, - 0xf0, 0x5a, 0xe3, 0x54, 0x14, 0x1b, 0xa1, 0xf5, 0x86, 0xf0, 0x07, 0xbd, 0x77, 0x14, 0xfe, 0x50, - 0xc3, 0x1f, 0x85, 0x3f, 0xdc, 0xde, 0x27, 0xc0, 0x67, 0xa2, 0x38, 0x82, 0xff, 0x4a, 0x02, 0x4b, - 0x09, 0x1e, 0x2d, 0x6b, 0xc3, 0x21, 0x92, 0x8e, 0x83, 0xbc, 0x3e, 0xb1, 0x5e, 0xf0, 0xea, 0x9c, - 0x77, 0xdd, 0xe7, 0x5d, 0x4d, 0xe6, 0x8d, 0xda, 0x5b, 0x88, 0x34, 0xe2, 0xdd, 0xa3, 0x48, 0x93, - 0x8e, 0x89, 0x51, 0xa4, 0x89, 0x87, 0xc2, 0x04, 0xa4, 0x51, 0x7b, 0x90, 0x5f, 0x4b, 0x20, 0x97, - 0x64, 0x51, 0xb2, 0x3e, 0x7e, 0xb3, 0x11, 0xeb, 0xc9, 0x6f, 0x4c, 0x5e, 0x20, 0x60, 0x37, 0x38, - 0x6c, 0xd9, 0x87, 0x5d, 0x1b, 0xf3, 0x18, 0x38, 0x01, 0xd4, 0x35, 0x6d, 0xf4, 0xb5, 0x1e, 0x45, - 0x9b, 0x68, 0x94, 0xa3, 0x68, 0x93, 0x1d, 0x63, 0x02, 0xda, 0xfe, 0x3b, 0x27, 0x68, 0x9f, 0x49, - 0x20, 0x13, 0xff, 0x38, 0x94, 0x7f, 0x8f, 0xdd, 0x78, 0xc8, 0x87, 0x65, 0xfe, 0x8f, 0xb1, 0x3a, - 0xc1, 0x55, 0xe2, 0x5c, 0xaa, 0x5c, 0x8c, 0x41, 0xb1, 0xa0, 0xc0, 0x30, 0x7b, 0x15, 0xdb, 0xbb, - 0xef, 0x2e, 0x0b, 0xd2, 0xc5, 0x65, 0x41, 0xfa, 0x78, 0x59, 0x90, 0x9e, 0x5f, 0x15, 0xa6, 0x2e, - 0xae, 0x0a, 0x53, 0x1f, 0xae, 0x0a, 0x53, 0x4f, 0xca, 0x75, 0x9b, 0x35, 0xbc, 0xaa, 0x66, 0x92, - 0xb6, 0x7e, 0x1f, 0xda, 0xb4, 0xda, 0x22, 0x66, 0x33, 0xd4, 0xef, 0x2c, 0xe8, 0xd8, 0x75, 0x90, - 0x5b, 0x9d, 0xe3, 0xdf, 0xc4, 0x9b, 0x5f, 0x02, 0x00, 0x00, 0xff, 0xff, 0x30, 0x98, 0x98, 0x2b, - 0x86, 0x0b, 0x00, 0x00, + // 928 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x96, 0x41, 0x6f, 0xdc, 0x44, + 0x14, 0xc7, 0xe3, 0x34, 0x09, 0xe4, 0xb5, 0x29, 0xc9, 0x64, 0x43, 0xb7, 0x16, 0xdd, 0xa4, 0xa6, + 0x81, 0xed, 0x82, 0xec, 0xaa, 0x29, 0x12, 0x42, 0x1c, 0x20, 0x6d, 0x51, 0x4f, 0x6d, 0x30, 0x55, + 0x91, 0xb8, 0x58, 0xb3, 0xf6, 0x64, 0x63, 0x65, 0x77, 0xc6, 0x19, 0x8f, 0xd3, 0x6c, 0x8f, 0xdc, + 0x91, 0x90, 0xf8, 0x0e, 0x80, 0xc4, 0x85, 0x0b, 0x37, 0x3e, 0x40, 0x8f, 0x95, 0xb8, 0x70, 0x42, + 0x28, 0x41, 0xe2, 0xca, 0x47, 0x40, 0x9e, 0x99, 0xdd, 0xd8, 0x5e, 0xaf, 0x77, 0x93, 0x48, 0xbd, + 0xac, 0xec, 0xf7, 0xfe, 0xef, 0xcd, 0x6f, 0xdf, 0xb3, 0xdf, 0x33, 0x5c, 0xdf, 0xc5, 0x21, 0xef, + 0xf3, 0x90, 0x76, 0x9c, 0x17, 0xfb, 0x91, 0x73, 0x90, 0x10, 0xde, 0xb7, 0x23, 0xce, 0x04, 0x43, + 0x4b, 0x43, 0x97, 0xfd, 0x62, 0x3f, 0x32, 0x57, 0x70, 0x2f, 0xa4, 0xcc, 0x91, 0xbf, 0x4a, 0x61, + 0xd6, 0x3a, 0xac, 0xc3, 0xe4, 0xa5, 0x93, 0x5e, 0x69, 0xeb, 0x3b, 0x1d, 0xc6, 0x3a, 0x5d, 0xe2, + 0xe0, 0x28, 0x74, 0x30, 0xa5, 0x4c, 0x60, 0x11, 0x32, 0x1a, 0x6b, 0xaf, 0x99, 0x3f, 0x30, 0xc2, + 0x1c, 0xf7, 0xb4, 0xcf, 0xaa, 0x01, 0xfa, 0x32, 0x05, 0xd8, 0x91, 0x46, 0x97, 0x1c, 0x24, 0x24, + 0x16, 0xd6, 0x13, 0x58, 0xcd, 0x59, 0xe3, 0x88, 0xd1, 0x98, 0xa0, 0x8f, 0x61, 0x41, 0x05, 0xd7, + 0x8d, 0x0d, 0xa3, 0x79, 0xf9, 0xee, 0x9a, 0x9d, 0xe3, 0xb5, 0x95, 0x7c, 0x7b, 0xf1, 0xe5, 0x5f, + 0xeb, 0x33, 0x3f, 0xff, 0xfb, 0x6b, 0xcb, 0x70, 0xb5, 0xde, 0xba, 0x0e, 0xd7, 0x9e, 0xf2, 0x24, + 0x16, 0x24, 0xb8, 0xcf, 0xa8, 0xe0, 0xd8, 0x17, 0xc3, 0xb3, 0x1e, 0x41, 0x7d, 0xd4, 0xa5, 0x0f, + 0xfc, 0x10, 0x56, 0x06, 0xc6, 0xcf, 0x83, 0x80, 0x93, 0x38, 0x26, 0xe9, 0xd9, 0x97, 0x9a, 0x8b, + 0xee, 0xa8, 0xc3, 0x7a, 0x08, 0xb7, 0x24, 0xf5, 0x33, 0xc2, 0xc3, 0xdd, 0xfe, 0xd7, 0xa1, 0xd8, + 0x0b, 0x38, 0x7e, 0xee, 0x62, 0xda, 0x21, 0x3b, 0x9c, 0xb1, 0x5d, 0x7d, 0x22, 0xba, 0x01, 0x10, + 0xa5, 0xf7, 0x5e, 0x80, 0x05, 0x96, 0x7f, 0xe5, 0x8a, 0xbb, 0x28, 0x2d, 0x0f, 0xb0, 0xc0, 0xd6, + 0x57, 0xb0, 0x39, 0x21, 0x8d, 0xa6, 0xab, 0xc1, 0xfc, 0x21, 0xee, 0x86, 0x81, 0x4c, 0xf1, 0xa6, + 0xab, 0x6e, 0x52, 0x2b, 0xe1, 0x9c, 0xf1, 0xfa, 0xec, 0x86, 0xd1, 0x5c, 0x74, 0xd5, 0x4d, 0x81, + 0xed, 0x29, 0xc7, 0x34, 0xde, 0x25, 0xfc, 0x82, 0x6c, 0x65, 0x69, 0xce, 0xc1, 0xf6, 0x19, 0xac, + 0x67, 0x92, 0x3e, 0x4b, 0x95, 0xa1, 0xe8, 0x9f, 0x05, 0xeb, 0x31, 0x6c, 0x8c, 0xcf, 0x70, 0x61, + 0xa2, 0x87, 0x07, 0x09, 0xee, 0x5e, 0x88, 0xa8, 0x90, 0xe1, 0x1c, 0x44, 0xff, 0xcd, 0xe6, 0x12, + 0x0e, 0x2a, 0x2f, 0x13, 0x0e, 0x1e, 0x65, 0x64, 0xc3, 0x2a, 0xd1, 0x27, 0x79, 0x23, 0x70, 0x2b, + 0x24, 0x0b, 0x91, 0x42, 0xa2, 0x26, 0x2c, 0xf3, 0xb4, 0x75, 0x59, 0xf1, 0xac, 0x14, 0x5f, 0xe5, + 0xc3, 0x96, 0x4a, 0xa5, 0x0d, 0xab, 0x87, 0xba, 0xaa, 0x59, 0xf1, 0x25, 0x95, 0xf9, 0x30, 0x5b, + 0x70, 0xa9, 0x7f, 0x17, 0x96, 0x62, 0x42, 0x03, 0xc2, 0xbd, 0x28, 0x69, 0xef, 0x93, 0x7e, 0x7d, + 0x4e, 0x2a, 0xaf, 0x28, 0xe3, 0x8e, 0xb4, 0xa1, 0xdb, 0xb0, 0xcc, 0x89, 0x1f, 0x46, 0x21, 0xa1, + 0x62, 0xa0, 0x9b, 0x97, 0xba, 0xb7, 0x86, 0x76, 0x2d, 0xfd, 0x14, 0x4c, 0x3f, 0xe1, 0x3c, 0x15, + 0xb6, 0x71, 0x17, 0x53, 0x9f, 0x78, 0x3e, 0xeb, 0xf5, 0x42, 0xd1, 0x23, 0x54, 0xd4, 0x17, 0x64, + 0x50, 0x5d, 0x2b, 0xb6, 0x95, 0xe0, 0xfe, 0xd0, 0x8f, 0xee, 0xc1, 0xdb, 0xc5, 0xe8, 0x3d, 0x4c, + 0x83, 0x2e, 0xa9, 0xbf, 0x21, 0x23, 0x6b, 0xf9, 0xc8, 0x47, 0xd2, 0x67, 0x3d, 0x81, 0x9b, 0x15, + 0x15, 0x3f, 0x47, 0x0f, 0x7f, 0xcc, 0xf7, 0x70, 0xf0, 0x66, 0xbf, 0xae, 0x1e, 0xae, 0xc3, 0xe5, + 0x24, 0x3e, 0xed, 0x88, 0xea, 0x1d, 0xa4, 0x26, 0x5d, 0xe4, 0x2d, 0x58, 0xf3, 0xc3, 0x68, 0x8f, + 0x70, 0x41, 0x8e, 0x44, 0xb6, 0xbe, 0x73, 0xba, 0x4a, 0x43, 0x67, 0xa6, 0xb6, 0x1f, 0xc0, 0x4a, + 0x26, 0x48, 0x97, 0x55, 0x75, 0x71, 0xf9, 0xd4, 0xa1, 0x4a, 0x8a, 0x36, 0xe1, 0x2a, 0x39, 0x8a, + 0x88, 0x2f, 0x48, 0xe0, 0x51, 0x46, 0x7d, 0x22, 0x5b, 0x37, 0xe7, 0x2e, 0x0d, 0xac, 0x8f, 0x53, + 0x63, 0xa1, 0xf2, 0xc5, 0x3a, 0x9d, 0xbd, 0xf2, 0x77, 0x7f, 0x03, 0x98, 0x97, 0x19, 0x11, 0x85, + 0x05, 0xb5, 0x25, 0xd0, 0xcd, 0xc2, 0xf2, 0x18, 0x5d, 0x43, 0xa6, 0x55, 0x25, 0x51, 0x18, 0xd6, + 0x8d, 0x6f, 0xff, 0xf8, 0xe7, 0x87, 0xd9, 0x6b, 0x68, 0xcd, 0x29, 0xdb, 0x72, 0xe8, 0x77, 0x03, + 0xea, 0xe3, 0x06, 0x39, 0xda, 0x2a, 0xcb, 0x3f, 0x61, 0x7b, 0x98, 0xf7, 0xce, 0x16, 0xa4, 0x31, + 0x3f, 0x92, 0x98, 0xce, 0x27, 0x46, 0xcb, 0x6a, 0x15, 0x48, 0x0f, 0x65, 0xac, 0xf7, 0x5c, 0x07, + 0x7b, 0x99, 0xc7, 0x29, 0x83, 0x3f, 0x3a, 0xeb, 0xab, 0xf0, 0xc7, 0x2e, 0x98, 0x2a, 0xfc, 0xf1, + 0xeb, 0x64, 0x0a, 0x7c, 0xa1, 0x83, 0x73, 0xf8, 0x3f, 0x19, 0xb0, 0x5a, 0xb2, 0x13, 0x90, 0x3d, + 0x1e, 0xa2, 0x6c, 0xfd, 0x98, 0xce, 0xd4, 0x7a, 0xcd, 0xeb, 0x48, 0xde, 0xdb, 0x29, 0xef, 0xad, + 0x72, 0xde, 0xfc, 0x38, 0xcd, 0x90, 0xe6, 0x76, 0x45, 0x15, 0x69, 0xd9, 0x5a, 0xaa, 0x22, 0x2d, + 0x5d, 0x42, 0x53, 0x90, 0xe6, 0xc7, 0x11, 0xfa, 0xc5, 0x80, 0x5a, 0xd9, 0x48, 0x44, 0xce, 0xe4, + 0xce, 0xe6, 0x46, 0x9d, 0x79, 0x67, 0xfa, 0x00, 0x0d, 0x7b, 0x47, 0xc2, 0xb6, 0x52, 0xd8, 0xcd, + 0x09, 0x8f, 0x41, 0xa4, 0xa0, 0x4e, 0x69, 0xf3, 0x63, 0xa4, 0x8a, 0xb6, 0x74, 0x30, 0x57, 0xd1, + 0x96, 0x4f, 0xa8, 0x29, 0x68, 0x87, 0xef, 0x9c, 0xa6, 0xfd, 0xce, 0x80, 0xe5, 0xe2, 0xc7, 0x28, + 0x7a, 0xaf, 0x70, 0xf0, 0x98, 0x0f, 0x59, 0xf3, 0xfd, 0x89, 0x3a, 0xcd, 0xd5, 0x94, 0x5c, 0x16, + 0xda, 0x28, 0x40, 0x09, 0x15, 0xe0, 0xf9, 0x83, 0x88, 0xed, 0x07, 0x2f, 0x8f, 0x1b, 0xc6, 0xab, + 0xe3, 0x86, 0xf1, 0xf7, 0x71, 0xc3, 0xf8, 0xfe, 0xa4, 0x31, 0xf3, 0xea, 0xa4, 0x31, 0xf3, 0xe7, + 0x49, 0x63, 0xe6, 0x9b, 0x56, 0x27, 0x14, 0x7b, 0x49, 0xdb, 0xf6, 0x59, 0xcf, 0xf9, 0x02, 0x87, + 0xbc, 0xdd, 0x65, 0xfe, 0x7e, 0x26, 0xdf, 0x91, 0xca, 0xd8, 0x8f, 0x48, 0xdc, 0x5e, 0x90, 0x9f, + 0xfa, 0x5b, 0xff, 0x07, 0x00, 0x00, 0xff, 0xff, 0xb5, 0x63, 0xdc, 0x53, 0x79, 0x0c, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -878,6 +967,8 @@ const _ = grpc.SupportPackageIsVersion4 // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. type QueryClient interface { + // Params queries the parameters of the module. + Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) // VerifyWithdrawRangeProof verifies a withdraw range proof (U64) VerifyWithdrawRangeProof(ctx context.Context, in *QueryVerifyWithdrawRangeProofRequest, opts ...grpc.CallOption) (*QueryVerifyWithdrawRangeProofResponse, error) // VerifyTransferRangeProof verifies a transfer range proof (U128) @@ -901,6 +992,15 @@ func NewQueryClient(cc grpc1.ClientConn) QueryClient { return &queryClient{cc} } +func (c *queryClient) Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) { + out := new(QueryParamsResponse) + err := c.cc.Invoke(ctx, "/fairyring.zkp.Query/Params", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *queryClient) VerifyWithdrawRangeProof(ctx context.Context, in *QueryVerifyWithdrawRangeProofRequest, opts ...grpc.CallOption) (*QueryVerifyWithdrawRangeProofResponse, error) { out := new(QueryVerifyWithdrawRangeProofResponse) err := c.cc.Invoke(ctx, "/fairyring.zkp.Query/VerifyWithdrawRangeProof", in, out, opts...) @@ -966,6 +1066,8 @@ func (c *queryClient) TrustedContracts(ctx context.Context, in *TrustedContracts // QueryServer is the server API for Query service. type QueryServer interface { + // Params queries the parameters of the module. + Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) // VerifyWithdrawRangeProof verifies a withdraw range proof (U64) VerifyWithdrawRangeProof(context.Context, *QueryVerifyWithdrawRangeProofRequest) (*QueryVerifyWithdrawRangeProofResponse, error) // VerifyTransferRangeProof verifies a transfer range proof (U128) @@ -985,6 +1087,9 @@ type QueryServer interface { type UnimplementedQueryServer struct { } +func (*UnimplementedQueryServer) Params(ctx context.Context, req *QueryParamsRequest) (*QueryParamsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Params not implemented") +} func (*UnimplementedQueryServer) VerifyWithdrawRangeProof(ctx context.Context, req *QueryVerifyWithdrawRangeProofRequest) (*QueryVerifyWithdrawRangeProofResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method VerifyWithdrawRangeProof not implemented") } @@ -1011,6 +1116,24 @@ func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) } +func _Query_Params_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryParamsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).Params(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/fairyring.zkp.Query/Params", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).Params(ctx, req.(*QueryParamsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Query_VerifyWithdrawRangeProof_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(QueryVerifyWithdrawRangeProofRequest) if err := dec(in); err != nil { @@ -1142,6 +1265,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "fairyring.zkp.Query", HandlerType: (*QueryServer)(nil), Methods: []grpc.MethodDesc{ + { + MethodName: "Params", + Handler: _Query_Params_Handler, + }, { MethodName: "VerifyWithdrawRangeProof", Handler: _Query_VerifyWithdrawRangeProof_Handler, @@ -1175,6 +1302,62 @@ var _Query_serviceDesc = grpc.ServiceDesc{ Metadata: "fairyring/zkp/query.proto", } +func (m *QueryParamsRequest) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryParamsRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryParamsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + return len(dAtA) - i, nil +} + +func (m *QueryParamsResponse) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *QueryParamsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + { + size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} + func (m *TrustedContractsRequest) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -1736,6 +1919,26 @@ func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { dAtA[offset] = uint8(v) return base } +func (m *QueryParamsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + return n +} + +func (m *QueryParamsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = m.Params.Size() + n += 1 + l + sovQuery(uint64(l)) + return n +} + func (m *TrustedContractsRequest) Size() (n int) { if m == nil { return 0 @@ -1983,6 +2186,139 @@ func sovQuery(x uint64) (n int) { func sozQuery(x uint64) (n int) { return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) } +func (m *QueryParamsRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryParamsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryParamsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryParamsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryParamsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func (m *TrustedContractsRequest) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 diff --git a/x/zkp/types/query.pb.gw.go b/x/zkp/types/query.pb.gw.go index ee9191bb..1185c511 100644 --- a/x/zkp/types/query.pb.gw.go +++ b/x/zkp/types/query.pb.gw.go @@ -33,6 +33,24 @@ var _ = utilities.NewDoubleArray var _ = descriptor.ForMessage var _ = metadata.Join +func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryParamsRequest + var metadata runtime.ServerMetadata + + msg, err := client.Params(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryParamsRequest + var metadata runtime.ServerMetadata + + msg, err := server.Params(ctx, &protoReq) + return msg, metadata, err + +} + func request_Query_VerifyWithdrawRangeProof_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq QueryVerifyWithdrawRangeProofRequest var metadata runtime.ServerMetadata @@ -261,6 +279,29 @@ func local_request_Query_TrustedContracts_0(ctx context.Context, marshaler runti // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { + mux.Handle("GET", pattern_Query_Params_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) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_Query_VerifyWithdrawRangeProof_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -463,6 +504,26 @@ func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc // "QueryClient" to call the correct interceptors. func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { + mux.Handle("GET", pattern_Query_Params_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) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_Params_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_Query_VerifyWithdrawRangeProof_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -607,6 +668,8 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie } var ( + pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"fairyring", "zkp", "params"}, "", runtime.AssumeColonVerbOpt(false))) + pattern_Query_VerifyWithdrawRangeProof_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"fairyring", "zkp", "verify_withdraw_range_proof"}, "", runtime.AssumeColonVerbOpt(false))) pattern_Query_VerifyTransferRangeProof_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"fairyring", "zkp", "verify_transfer_range_proof"}, "", runtime.AssumeColonVerbOpt(false))) @@ -623,6 +686,8 @@ var ( ) var ( + forward_Query_Params_0 = runtime.ForwardResponseMessage + forward_Query_VerifyWithdrawRangeProof_0 = runtime.ForwardResponseMessage forward_Query_VerifyTransferRangeProof_0 = runtime.ForwardResponseMessage From 5411cd2d832b9860313d63e81a1f2a313ccfef8d Mon Sep 17 00:00:00 2001 From: ap0calypse644 Date: Fri, 24 Apr 2026 14:00:03 +0530 Subject: [PATCH 15/42] enabling anonymous confidential transfer --- scripts/devnet/start.sh | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/scripts/devnet/start.sh b/scripts/devnet/start.sh index d2744368..ff65f932 100755 --- a/scripts/devnet/start.sh +++ b/scripts/devnet/start.sh @@ -377,10 +377,15 @@ else fi fi -# ZKP module: trusted CosmWasm contracts at genesis +# ZKP module: trusted CosmWasm contracts and authority at genesis if command -v jq &> /dev/null; then - jq --arg addr "$ZKP_GENESIS_TRUSTED_CONTRACT" \ - '.app_state.zkp //= {} | .app_state.zkp.trusted_contracts = [$addr]' \ + jq \ + --arg addr "$ZKP_GENESIS_TRUSTED_CONTRACT" \ + --arg authority "$WALLET1_ADDR" \ + '.app_state.zkp //= {} | + .app_state.zkp.trusted_contracts = [$addr] | + .app_state.zkp.params //= {} | + .app_state.zkp.params.authority = $authority' \ $CHAIN_DIR/$CHAINID/config/genesis.json > $CHAIN_DIR/$CHAINID/config/genesis.json.tmp && mv $CHAIN_DIR/$CHAINID/config/genesis.json.tmp $CHAIN_DIR/$CHAINID/config/genesis.json fi From 859a4c57ce472f9ef27ac4d24a6998a9b3a48237 Mon Sep 17 00:00:00 2001 From: ap0calypse644 Date: Fri, 24 Apr 2026 14:31:21 +0530 Subject: [PATCH 16/42] enabling anonymous confidential transfer --- x/zkp/client/cli/tx.go | 24 +++++++++++++ x/zkp/client/cli/tx_add_trusted_contract.go | 36 +++++++++++++++++++ .../client/cli/tx_remove_trusted_contract.go | 36 +++++++++++++++++++ x/zkp/module/module.go | 3 +- x/zkp/types/msg_add_trusted_contract copy.go | 32 +++++++++++++++++ x/zkp/types/msg_remove_trusted_contract.go | 32 +++++++++++++++++ 6 files changed, 162 insertions(+), 1 deletion(-) create mode 100644 x/zkp/client/cli/tx.go create mode 100644 x/zkp/client/cli/tx_add_trusted_contract.go create mode 100644 x/zkp/client/cli/tx_remove_trusted_contract.go create mode 100644 x/zkp/types/msg_add_trusted_contract copy.go create mode 100644 x/zkp/types/msg_remove_trusted_contract.go diff --git a/x/zkp/client/cli/tx.go b/x/zkp/client/cli/tx.go new file mode 100644 index 00000000..a1c179e1 --- /dev/null +++ b/x/zkp/client/cli/tx.go @@ -0,0 +1,24 @@ +package cli + +import ( + "fmt" + + "github.com/Fairblock/fairyring/x/zkp/types" + "github.com/cosmos/cosmos-sdk/client" + "github.com/spf13/cobra" +) + +// GetTxCmd returns the transaction commands for this module. +func GetTxCmd() *cobra.Command { + cmd := &cobra.Command{ + Use: types.ModuleName, + Short: fmt.Sprintf("%s transactions subcommands", types.ModuleName), + DisableFlagParsing: true, + SuggestionsMinimumDistance: 2, + RunE: client.ValidateCmd, + } + + cmd.AddCommand(CmdAddTrustedContract()) + cmd.AddCommand(CmdRemoveTrustedContract()) + return cmd +} diff --git a/x/zkp/client/cli/tx_add_trusted_contract.go b/x/zkp/client/cli/tx_add_trusted_contract.go new file mode 100644 index 00000000..0a71b69b --- /dev/null +++ b/x/zkp/client/cli/tx_add_trusted_contract.go @@ -0,0 +1,36 @@ +package cli + +import ( + "github.com/Fairblock/fairyring/x/zkp/types" + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/spf13/cobra" +) + +func CmdAddTrustedContract() *cobra.Command { + cmd := &cobra.Command{ + Use: "add-trusted-contract [contract-address]", + Short: "Broadcast message add-trusted-contract", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgAddTrustedContract( + clientCtx.GetFromAddress().String(), + args[0], + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/zkp/client/cli/tx_remove_trusted_contract.go b/x/zkp/client/cli/tx_remove_trusted_contract.go new file mode 100644 index 00000000..aa1f0be2 --- /dev/null +++ b/x/zkp/client/cli/tx_remove_trusted_contract.go @@ -0,0 +1,36 @@ +package cli + +import ( + "github.com/Fairblock/fairyring/x/zkp/types" + "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/flags" + "github.com/cosmos/cosmos-sdk/client/tx" + "github.com/spf13/cobra" +) + +func CmdRemoveTrustedContract() *cobra.Command { + cmd := &cobra.Command{ + Use: "remove-trusted-contract [contract-address]", + Short: "Broadcast message remove-trusted-contract", + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) (err error) { + clientCtx, err := client.GetClientTxContext(cmd) + if err != nil { + return err + } + + msg := types.NewMsgRemoveTrustedContract( + clientCtx.GetFromAddress().String(), + args[0], + ) + if err := msg.ValidateBasic(); err != nil { + return err + } + return tx.GenerateOrBroadcastTxCLI(clientCtx, cmd.Flags(), msg) + }, + } + + flags.AddTxFlagsToCmd(cmd) + + return cmd +} diff --git a/x/zkp/module/module.go b/x/zkp/module/module.go index 55976d08..6622f894 100644 --- a/x/zkp/module/module.go +++ b/x/zkp/module/module.go @@ -13,6 +13,7 @@ import ( "github.com/spf13/cobra" "cosmossdk.io/core/appmodule" + "github.com/Fairblock/fairyring/x/zkp/client/cli" "github.com/Fairblock/fairyring/x/zkp/keeper" "github.com/Fairblock/fairyring/x/zkp/types" ) @@ -81,7 +82,7 @@ func (AppModuleBasic) RegisterGRPCGatewayRoutes(clientCtx client.Context, mux *r // GetTxCmd returns the root Tx command for the module. // These commands enrich the AutoCLI tx commands. func (a AppModuleBasic) GetTxCmd() *cobra.Command { - return nil // ZKP module has no transactions + return cli.GetTxCmd() } // ---------------------------------------------------------------------------- diff --git a/x/zkp/types/msg_add_trusted_contract copy.go b/x/zkp/types/msg_add_trusted_contract copy.go new file mode 100644 index 00000000..0a97001d --- /dev/null +++ b/x/zkp/types/msg_add_trusted_contract copy.go @@ -0,0 +1,32 @@ +package types + +import ( + sdkioerrors "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +const TypeMsgAddTrustedContract = "add_trusted_contract" + +var _ sdk.Msg = &MsgAddTrustedContract{} + +func NewMsgAddTrustedContract(authority string, contractAddr string) *MsgAddTrustedContract { + return &MsgAddTrustedContract{ + Authority: authority, + ContractAddress: contractAddr, + } +} + +func (msg *MsgAddTrustedContract) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Authority) + if err != nil { + return sdkioerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid authority address (%s)", err) + } + + _, err = sdk.AccAddressFromBech32(msg.ContractAddress) + if err != nil { + return sdkioerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid contract address (%s)", err) + } + + return nil +} diff --git a/x/zkp/types/msg_remove_trusted_contract.go b/x/zkp/types/msg_remove_trusted_contract.go new file mode 100644 index 00000000..a0cbcdd1 --- /dev/null +++ b/x/zkp/types/msg_remove_trusted_contract.go @@ -0,0 +1,32 @@ +package types + +import ( + sdkioerrors "cosmossdk.io/errors" + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" +) + +const TypeMsgRemoveTrustedContract = "remove_trusted_contract" + +var _ sdk.Msg = &MsgRemoveTrustedContract{} + +func NewMsgRemoveTrustedContract(authority string, contractAddr string) *MsgRemoveTrustedContract { + return &MsgRemoveTrustedContract{ + Authority: authority, + ContractAddress: contractAddr, + } +} + +func (msg *MsgRemoveTrustedContract) ValidateBasic() error { + _, err := sdk.AccAddressFromBech32(msg.Authority) + if err != nil { + return sdkioerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid authority address (%s)", err) + } + + _, err = sdk.AccAddressFromBech32(msg.ContractAddress) + if err != nil { + return sdkioerrors.Wrapf(sdkerrors.ErrInvalidAddress, "invalid contract address (%s)", err) + } + + return nil +} From ede664a3212bfb441d0b2b339dea4d87485c8860 Mon Sep 17 00:00:00 2001 From: ap0calypse644 Date: Tue, 28 Apr 2026 10:48:09 +0530 Subject: [PATCH 17/42] adding unit tests --- go.mod | 1 - go.sum | 2 - .../query_proof_verification_nil_test.go | 50 ++ x/zkp/types/zkp_types_test.go | 147 +++++ .../commitment/commitment_test.go | 337 ++++++++++++ x/zkp/verification/common/common_test.go | 282 ++++++++++ x/zkp/verification/range/range_test.go | 500 ++++++++++++++++++ .../transferctx/transferctx_test.go | 328 ++++++++++++ x/zkp/verification/validity/validity_test.go | 299 +++++++++++ .../withdrawctx/withdrawctx_test.go | 144 +++++ 10 files changed, 2087 insertions(+), 3 deletions(-) create mode 100644 x/zkp/keeper/query_proof_verification_nil_test.go create mode 100644 x/zkp/types/zkp_types_test.go create mode 100644 x/zkp/verification/commitment/commitment_test.go create mode 100644 x/zkp/verification/common/common_test.go create mode 100644 x/zkp/verification/range/range_test.go create mode 100644 x/zkp/verification/transferctx/transferctx_test.go create mode 100644 x/zkp/verification/validity/validity_test.go create mode 100644 x/zkp/verification/withdrawctx/withdrawctx_test.go diff --git a/go.mod b/go.mod index 0e41db4e..95523aff 100644 --- a/go.mod +++ b/go.mod @@ -67,7 +67,6 @@ require ( github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce // indirect github.com/mimoo/StrobeGo v0.0.0-20181016162300-f8f6d4d2b643 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/regen-network/cosmos-proto v0.3.1 // indirect github.com/stretchr/objx v0.5.2 // indirect ) diff --git a/go.sum b/go.sum index e709ed86..e4684472 100644 --- a/go.sum +++ b/go.sum @@ -1612,8 +1612,6 @@ github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQ github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= -github.com/regen-network/cosmos-proto v0.3.1 h1:rV7iM4SSFAagvy8RiyhiACbWEGotmqzywPxOvwMdxcg= -github.com/regen-network/cosmos-proto v0.3.1/go.mod h1:jO0sVX6a1B36nmE8C9xBFXpNwWejXC7QqCOnH3O0+YM= github.com/regen-network/protobuf v1.3.3-alpha.regen.1 h1:OHEc+q5iIAXpqiqFKeLpu5NwTIkVXUs48vFMwzqpqY4= github.com/regen-network/protobuf v1.3.3-alpha.regen.1/go.mod h1:2DjTFR1HhMQhiWC5sZ4OhQ3+NtdbZ6oBDKQwq5Ou+FI= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= diff --git a/x/zkp/keeper/query_proof_verification_nil_test.go b/x/zkp/keeper/query_proof_verification_nil_test.go new file mode 100644 index 00000000..fa260fcc --- /dev/null +++ b/x/zkp/keeper/query_proof_verification_nil_test.go @@ -0,0 +1,50 @@ +package keeper + +import ( + "context" + "testing" + + "github.com/Fairblock/fairyring/x/zkp/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func requireInvalidArgument(t *testing.T, err error) { + t.Helper() + if err == nil { + t.Fatal("expected error") + } + st, ok := status.FromError(err) + if !ok { + t.Fatalf("expected gRPC status error, got %T: %v", err, err) + } + if st.Code() != codes.InvalidArgument { + t.Fatalf("expected InvalidArgument, got %s", st.Code()) + } + if st.Message() != "invalid request" { + t.Fatalf("unexpected error message: %q", st.Message()) + } +} + +func TestProofVerificationQueriesRejectNilRequests(t *testing.T) { + k := Keeper{} + ctx := context.Background() + + _, err := k.VerifyWithdrawRangeProof(ctx, (*types.QueryVerifyWithdrawRangeProofRequest)(nil)) + requireInvalidArgument(t, err) + + _, err = k.VerifyTransferRangeProof(ctx, (*types.QueryVerifyTransferRangeProofRequest)(nil)) + requireInvalidArgument(t, err) + + _, err = k.VerifyValidityProof(ctx, (*types.QueryVerifyValidityProofRequest)(nil)) + requireInvalidArgument(t, err) + + _, err = k.VerifyEqualityProof(ctx, (*types.QueryVerifyEqualityProofRequest)(nil)) + requireInvalidArgument(t, err) + + _, err = k.VerifyTransferProofs(ctx, (*types.QueryVerifyTransferProofsRequest)(nil)) + requireInvalidArgument(t, err) + + _, err = k.VerifyWithdrawProofs(ctx, (*types.QueryVerifyWithdrawProofsRequest)(nil)) + requireInvalidArgument(t, err) +} diff --git a/x/zkp/types/zkp_types_test.go b/x/zkp/types/zkp_types_test.go new file mode 100644 index 00000000..a6950d45 --- /dev/null +++ b/x/zkp/types/zkp_types_test.go @@ -0,0 +1,147 @@ +package types + +import ( + "bytes" + "strings" + "testing" + + sdk "github.com/cosmos/cosmos-sdk/types" +) + +func init() { + // Tests run outside the app wiring, so set a deterministic bech32 prefix if + // no other package has configured it first. Cosmos SDK config panics on + // duplicate prefix assignment; the recover keeps the suite composable. + defer func() { _ = recover() }() + sdk.GetConfig().SetBech32PrefixForAccount("fairy", "fairypub") +} + +func zkpAddr(seed byte) string { + return sdk.AccAddress(bytes.Repeat([]byte{seed}, 20)).String() +} + +func TestKeyPrefix(t *testing.T) { + got := KeyPrefix("abc") + if string(got) != "abc" { + t.Fatalf("KeyPrefix returned %q", got) + } + got[0] = 'z' + if string(KeyPrefix("abc")) != "abc" { + t.Fatal("KeyPrefix should return a fresh byte slice") + } +} + +func TestGasConstantsAreNonZeroAndOrdered(t *testing.T) { + if GasVerifyEqualityProof == 0 || GasVerifyValidityProof == 0 || GasVerifyWithdrawRangeProof == 0 || + GasVerifyTransferRangeProof == 0 || GasVerifyTransferProofs == 0 || GasVerifyWithdrawProofs == 0 { + t.Fatal("all ZKP gas constants must be non-zero") + } + if GasVerifyTransferProofs <= GasVerifyTransferRangeProof { + t.Fatal("combined transfer proof gas should exceed standalone transfer range proof gas") + } + if GasVerifyWithdrawProofs <= GasVerifyWithdrawRangeProof { + t.Fatal("combined withdraw proof gas should exceed standalone withdraw range proof gas") + } +} + +func TestDefaultGenesisValidate(t *testing.T) { + gs := DefaultGenesis() + if gs == nil { + t.Fatal("DefaultGenesis returned nil") + } + if gs.Params.Authority == "" { + t.Fatal("DefaultGenesis authority must be populated") + } + if err := gs.Validate(); err != nil { + t.Fatalf("default genesis should validate: %v", err) + } +} + +func TestGenesisValidateTrustedContracts(t *testing.T) { + validA := zkpAddr(1) + validB := zkpAddr(2) + + gs := GenesisState{ + Params: NewParams(zkpAddr(9)), + TrustedContracts: []string{validA, validB}, + } + if err := gs.Validate(); err != nil { + t.Fatalf("valid genesis rejected: %v", err) + } + + duplicate := gs + duplicate.TrustedContracts = []string{validA, validA} + if err := duplicate.Validate(); err == nil || !strings.Contains(err.Error(), "duplicate trusted contract address") { + t.Fatalf("expected duplicate trusted contract error, got %v", err) + } + + invalidContract := gs + invalidContract.TrustedContracts = []string{validA, "not-a-bech32-address"} + if err := invalidContract.Validate(); err == nil || !strings.Contains(err.Error(), "invalid trusted contract address at index 1") { + t.Fatalf("expected invalid trusted contract error, got %v", err) + } +} + +func TestGenesisValidateAllowsEmptyAuthorityButStillValidatesContracts(t *testing.T) { + gs := GenesisState{ + Params: NewParams(""), + TrustedContracts: []string{zkpAddr(3)}, + } + if err := gs.Validate(); err != nil { + t.Fatalf("empty authority should be allowed at genesis validation layer: %v", err) + } + + gs.TrustedContracts = []string{"bad"} + if err := gs.Validate(); err == nil || !strings.Contains(err.Error(), "invalid trusted contract address") { + t.Fatalf("trusted contracts must still be validated with empty authority, got %v", err) + } +} + +func TestParamsValidate(t *testing.T) { + if err := NewParams(zkpAddr(4)).Validate(); err != nil { + t.Fatalf("valid params rejected: %v", err) + } + if err := NewParams("bad-authority").Validate(); err == nil || !strings.Contains(err.Error(), "invalid authority address") { + t.Fatalf("expected invalid authority error, got %v", err) + } +} + +func TestValidateAuthorityRejectsNonString(t *testing.T) { + if err := validateAuthority(123); err == nil || !strings.Contains(err.Error(), "invalid parameter type") { + t.Fatalf("expected invalid parameter type error, got %v", err) + } +} + +func TestNewMsgAddTrustedContractValidateBasic(t *testing.T) { + msg := NewMsgAddTrustedContract(zkpAddr(1), zkpAddr(2)) + if msg.Authority != zkpAddr(1) || msg.ContractAddress != zkpAddr(2) { + t.Fatalf("constructor did not populate fields") + } + if err := msg.ValidateBasic(); err != nil { + t.Fatalf("valid add trusted contract msg rejected: %v", err) + } + + if err := NewMsgAddTrustedContract("bad", zkpAddr(2)).ValidateBasic(); err == nil || !strings.Contains(err.Error(), "invalid authority address") { + t.Fatalf("expected invalid authority error, got %v", err) + } + if err := NewMsgAddTrustedContract(zkpAddr(1), "bad").ValidateBasic(); err == nil || !strings.Contains(err.Error(), "invalid contract address") { + t.Fatalf("expected invalid contract error, got %v", err) + } +} + +func TestNewMsgRemoveTrustedContractValidateBasic(t *testing.T) { + msg := NewMsgRemoveTrustedContract(zkpAddr(1), zkpAddr(2)) + if msg.Authority != zkpAddr(1) || msg.ContractAddress != zkpAddr(2) { + t.Fatalf("constructor did not populate fields") + } + if err := msg.ValidateBasic(); err != nil { + t.Fatalf("valid remove trusted contract msg rejected: %v", err) + } + + if err := NewMsgRemoveTrustedContract("bad", zkpAddr(2)).ValidateBasic(); err == nil || !strings.Contains(err.Error(), "invalid authority address") { + t.Fatalf("expected invalid authority error, got %v", err) + } + if err := NewMsgRemoveTrustedContract(zkpAddr(1), "bad").ValidateBasic(); err == nil || !strings.Contains(err.Error(), "invalid contract address") { + t.Fatalf("expected invalid contract error, got %v", err) + } +} diff --git a/x/zkp/verification/commitment/commitment_test.go b/x/zkp/verification/commitment/commitment_test.go new file mode 100644 index 00000000..19f802e6 --- /dev/null +++ b/x/zkp/verification/commitment/commitment_test.go @@ -0,0 +1,337 @@ +package commitment + +import ( + "bytes" + "errors" + "testing" + + "github.com/Fairblock/fairyring/x/zkp/verification/common" +) + +func cScalar(t *testing.T, v uint64) Scalar { + t.Helper() + var s Scalar + s.SetUint64(v) + return s +} + +func cScalarBytes(t *testing.T, v uint64) [32]byte { + t.Helper() + s := cScalar(t, v) + var out [32]byte + s.BytesInto(&out) + return out +} + +func cScalarBytesFromScalar(t *testing.T, s Scalar) [32]byte { + t.Helper() + var out [32]byte + s.BytesInto(&out) + return out +} + +func cPoint(t *testing.T, v uint64) Point { + t.Helper() + s := cScalar(t, v) + var p Point + p.ScalarMult(&common.G, &s) + return p +} + +func cPointBytes(t *testing.T, v uint64) [32]byte { + t.Helper() + p := cPoint(t, v) + var out [32]byte + p.BytesInto(&out) + return out +} + +func cInvalidPointBytes() [32]byte { + var out [32]byte + for i := range out { + out[i] = 0xff + } + return out +} + +func cBaseEqualityData(t *testing.T) CiphertextCommitmentEqualityProofData { + t.Helper() + return CiphertextCommitmentEqualityProofData{ + Context: CiphertextCommitmentEqualityProofContext{ + Pubkey: PodElGamalPubkey{Bytes: cPointBytes(t, 2)}, + Ciphertext: PodElGamalCiphertext{Commitment: cPointBytes(t, 3), Handle: cPointBytes(t, 4)}, + Commitment: PodPedersenCommitment{Bytes: cPointBytes(t, 5)}, + }, + Proof: PodCiphertextCommitmentEqualityProof{ + Y0: cPointBytes(t, 6), + Y1: cPointBytes(t, 7), + Y2: cPointBytes(t, 8), + Zs: cScalarBytes(t, 9), + Zx: cScalarBytes(t, 10), + Zr: cScalarBytes(t, 11), + }, + } +} + +func cBaseWithdrawData(t *testing.T) WithdrawCiphertextCommitmentEqualityProofData { + t.Helper() + base := cBaseEqualityData(t) + return WithdrawCiphertextCommitmentEqualityProofData{ + Context: WithdrawCiphertextCommitmentEqualityProofContext{ + Pubkey: base.Context.Pubkey, + Ciphertext: base.Context.Ciphertext, + Commitment: base.Context.Commitment, + Nonce: PodU64{1, 2, 3, 4, 5, 6, 7, 8}, + }, + Proof: base.Proof, + } +} + +func TestPodCiphertextCommitmentEqualityProofAsBytesLayout(t *testing.T) { + proof := PodCiphertextCommitmentEqualityProof{ + Y0: cScalarBytes(t, 1), + Y1: cScalarBytes(t, 2), + Y2: cScalarBytes(t, 3), + Zs: cScalarBytes(t, 4), + Zx: cScalarBytes(t, 5), + Zr: cScalarBytes(t, 6), + } + got := proof.AsBytes() + fields := [][32]byte{proof.Y0, proof.Y1, proof.Y2, proof.Zs, proof.Zx, proof.Zr} + for i, want := range fields { + start := i * U + if !bytes.Equal(got[start:start+U], want[:]) { + t.Fatalf("field %d not copied at expected offset", i) + } + } +} + +func TestElGamalPubkeyFromPod(t *testing.T) { + var pk ElGamalPubkey + valid := PodElGamalPubkey{Bytes: cPointBytes(t, 7)} + if err := pk.FromPod(valid); err != nil { + t.Fatalf("valid pubkey rejected: %v", err) + } + var got [32]byte + pk.P.BytesInto(&got) + if got != valid.Bytes { + t.Fatalf("pubkey round-trip mismatch") + } + + invalid := PodElGamalPubkey{Bytes: cInvalidPointBytes()} + if err := pk.FromPod(invalid); err == nil { + t.Fatal("expected invalid pubkey encoding to fail") + } +} + +func TestElGamalCiphertextFromPod(t *testing.T) { + valid := PodElGamalCiphertext{Commitment: cPointBytes(t, 3), Handle: cPointBytes(t, 4)} + var ct ElGamalCiphertext + if err := ct.FromPod(valid); err != nil { + t.Fatalf("valid ciphertext rejected: %v", err) + } + if ct.Commitment.ToBytes() != valid.Commitment || ct.Handle.ToBytes() != valid.Handle { + t.Fatalf("ciphertext round-trip mismatch") + } + + badCommit := valid + badCommit.Commitment = cInvalidPointBytes() + if err := ct.FromPod(badCommit); err == nil || err.Error() != "bad C" { + t.Fatalf("expected bad C error, got %v", err) + } + + badHandle := valid + badHandle.Handle = cInvalidPointBytes() + if err := ct.FromPod(badHandle); err == nil || err.Error() != "bad D" { + t.Fatalf("expected bad D error, got %v", err) + } +} + +func TestPedersenCommitmentFromPod(t *testing.T) { + pod := PodPedersenCommitment{Bytes: cPointBytes(t, 11)} + pc, err := PedersenCommitmentFromPod(pod) + if err != nil { + t.Fatalf("valid commitment rejected: %v", err) + } + if pc.ToBytes() != pod.Bytes { + t.Fatalf("commitment round-trip mismatch") + } + + bad := PodPedersenCommitment{Bytes: cInvalidPointBytes()} + if _, err := PedersenCommitmentFromPod(bad); err == nil || err.Error() != "bad commit" { + t.Fatalf("expected bad commit error, got %v", err) + } +} + +func TestEqualityProofFromBytes(t *testing.T) { + base := cBaseEqualityData(t) + raw := base.Proof.AsBytes() + proof, err := EqualityProofFromBytes(&raw) + if err != nil { + t.Fatalf("validly encoded proof rejected: %v", err) + } + if proof.Y0 != common.CompressedRistretto(base.Proof.Y0) || + proof.Y1 != common.CompressedRistretto(base.Proof.Y1) || + proof.Y2 != common.CompressedRistretto(base.Proof.Y2) { + t.Fatalf("proof points decoded in wrong order") + } + if cScalarBytesFromScalar(t, proof.Zs) != base.Proof.Zs || + cScalarBytesFromScalar(t, proof.Zx) != base.Proof.Zx || + cScalarBytesFromScalar(t, proof.Zr) != base.Proof.Zr { + t.Fatalf("proof scalars decoded in wrong order") + } +} + +func TestEqualityProofFromBytesRejectsNonCanonicalScalars(t *testing.T) { + base := cBaseEqualityData(t) + raw := base.Proof.AsBytes() + for _, off := range []int{3 * U, 4 * U, 5 * U} { + mutated := raw + for i := off; i < off+U; i++ { + mutated[i] = 0xff + } + if _, err := EqualityProofFromBytes(&mutated); !errors.Is(err, common.ErrDeserialization) { + t.Fatalf("expected scalar at offset %d to fail canonical check, got %v", off, err) + } + } +} + +func TestVerifyEqualityProofRejectsMalformedContext(t *testing.T) { + cases := []struct { + name string + mut func(*CiphertextCommitmentEqualityProofData) + }{ + {"bad pubkey", func(pd *CiphertextCommitmentEqualityProofData) { pd.Context.Pubkey.Bytes = cInvalidPointBytes() }}, + {"bad ciphertext commitment", func(pd *CiphertextCommitmentEqualityProofData) { + pd.Context.Ciphertext.Commitment = cInvalidPointBytes() + }}, + {"bad ciphertext handle", func(pd *CiphertextCommitmentEqualityProofData) { pd.Context.Ciphertext.Handle = cInvalidPointBytes() }}, + {"bad pedersen commitment", func(pd *CiphertextCommitmentEqualityProofData) { pd.Context.Commitment.Bytes = cInvalidPointBytes() }}, + } + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + pd := cBaseEqualityData(t) + tt.mut(&pd) + if err := VerifyEqualityProof(&pd); !errors.Is(err, ErrProofDeserialization) { + t.Fatalf("expected deserialization error, got %v", err) + } + }) + } +} + +func TestVerifyEqualityProofRejectsMalformedProofScalars(t *testing.T) { + cases := []struct { + name string + mut func(*CiphertextCommitmentEqualityProofData) + }{ + {"bad Zs", func(pd *CiphertextCommitmentEqualityProofData) { pd.Proof.Zs = cInvalidPointBytes() }}, + {"bad Zx", func(pd *CiphertextCommitmentEqualityProofData) { pd.Proof.Zx = cInvalidPointBytes() }}, + {"bad Zr", func(pd *CiphertextCommitmentEqualityProofData) { pd.Proof.Zr = cInvalidPointBytes() }}, + } + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + pd := cBaseEqualityData(t) + tt.mut(&pd) + if err := VerifyEqualityProof(&pd); !errors.Is(err, ErrProofDeserialization) { + t.Fatalf("expected proof deserialization error, got %v", err) + } + }) + } +} + +func TestVerifyEqualityProofRejectsMalformedProofPoints(t *testing.T) { + cases := []struct { + name string + mut func(*CiphertextCommitmentEqualityProofData) + }{ + {"bad Y0", func(pd *CiphertextCommitmentEqualityProofData) { pd.Proof.Y0 = cInvalidPointBytes() }}, + {"bad Y1", func(pd *CiphertextCommitmentEqualityProofData) { pd.Proof.Y1 = cInvalidPointBytes() }}, + {"bad Y2", func(pd *CiphertextCommitmentEqualityProofData) { pd.Proof.Y2 = cInvalidPointBytes() }}, + } + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + pd := cBaseEqualityData(t) + tt.mut(&pd) + if err := VerifyEqualityProof(&pd); !errors.Is(err, ErrProofAlgebraic) { + t.Fatalf("expected proof algebraic error for malformed point, got %v", err) + } + }) + } +} + +func TestVerifyEqualityProofRejectsAlgebraicallyInvalidButWellFormedProof(t *testing.T) { + pd := cBaseEqualityData(t) + if err := VerifyEqualityProof(&pd); !errors.Is(err, ErrProofAlgebraic) { + t.Fatalf("expected algebraic failure for random well-formed proof, got %v", err) + } +} + +func TestWithdrawTranscriptBindsNonce(t *testing.T) { + pd := cBaseWithdrawData(t) + normalCtx := CiphertextCommitmentEqualityProofContext{ + Pubkey: pd.Context.Pubkey, + Ciphertext: pd.Context.Ciphertext, + Commitment: pd.Context.Commitment, + } + + normal := newSplTranscript(&normalCtx) + withdraw := newWithdrawSplTranscript(&pd.Context) + cNormal := common.ChallengeScalar(normal, []byte("c")) + cWithdraw := common.ChallengeScalar(withdraw, []byte("c")) + if cScalarBytesFromScalar(t, cNormal) == cScalarBytesFromScalar(t, cWithdraw) { + t.Fatal("withdraw transcript must differ from non-withdraw transcript because it includes nonce/domain") + } + + pd2 := pd + pd2.Context.Nonce[0] ^= 0xff + withdraw2 := newWithdrawSplTranscript(&pd2.Context) + cWithdraw2 := common.ChallengeScalar(withdraw2, []byte("c")) + if cScalarBytesFromScalar(t, cWithdraw) == cScalarBytesFromScalar(t, cWithdraw2) { + t.Fatal("nonce change must change withdraw transcript challenge") + } +} + +func TestVerifyWithdrawEqualityProofRejectsMalformedContextAndProof(t *testing.T) { + cases := []struct { + name string + mut func(*WithdrawCiphertextCommitmentEqualityProofData) + }{ + {"bad pubkey", func(pd *WithdrawCiphertextCommitmentEqualityProofData) { + pd.Context.Pubkey.Bytes = cInvalidPointBytes() + }}, + {"bad ciphertext commitment", func(pd *WithdrawCiphertextCommitmentEqualityProofData) { + pd.Context.Ciphertext.Commitment = cInvalidPointBytes() + }}, + {"bad ciphertext handle", func(pd *WithdrawCiphertextCommitmentEqualityProofData) { + pd.Context.Ciphertext.Handle = cInvalidPointBytes() + }}, + {"bad pedersen commitment", func(pd *WithdrawCiphertextCommitmentEqualityProofData) { + pd.Context.Commitment.Bytes = cInvalidPointBytes() + }}, + {"bad Zs", func(pd *WithdrawCiphertextCommitmentEqualityProofData) { pd.Proof.Zs = cInvalidPointBytes() }}, + } + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + pd := cBaseWithdrawData(t) + tt.mut(&pd) + if err := VerifyWithdrawEqualityProof(&pd); !errors.Is(err, ErrProofDeserialization) { + t.Fatalf("expected deserialization error, got %v", err) + } + }) + } +} + +func TestVerifyWithdrawEqualityProofRejectsMalformedPointProof(t *testing.T) { + pd := cBaseWithdrawData(t) + pd.Proof.Y0 = cInvalidPointBytes() + if err := VerifyWithdrawEqualityProof(&pd); !errors.Is(err, ErrProofAlgebraic) { + t.Fatalf("expected proof algebraic error for malformed point, got %v", err) + } +} + +func TestVerifyWithdrawEqualityProofRejectsAlgebraicallyInvalidButWellFormedProof(t *testing.T) { + pd := cBaseWithdrawData(t) + if err := VerifyWithdrawEqualityProof(&pd); !errors.Is(err, ErrProofAlgebraic) { + t.Fatalf("expected algebraic failure for random well-formed withdraw proof, got %v", err) + } +} diff --git a/x/zkp/verification/common/common_test.go b/x/zkp/verification/common/common_test.go new file mode 100644 index 00000000..eecfccae --- /dev/null +++ b/x/zkp/verification/common/common_test.go @@ -0,0 +1,282 @@ +package common + +import ( + "bytes" + "errors" + "testing" + + "github.com/gtank/merlin" +) + +func testScalar(t *testing.T, v uint64) Scalar { + t.Helper() + var s Scalar + s.SetUint64(v) + return s +} + +func testPoint(t *testing.T, v uint64) Point { + t.Helper() + s := testScalar(t, v) + var p Point + p.ScalarMult(&G, &s) + return p +} + +func testPointBytes(t *testing.T, v uint64) [32]byte { + t.Helper() + p := testPoint(t, v) + var out [32]byte + p.BytesInto(&out) + return out +} + +func testScalarBytes(t *testing.T, v uint64) [32]byte { + t.Helper() + s := testScalar(t, v) + var out [32]byte + s.BytesInto(&out) + return out +} + +func testScalarBytesFromScalar(t *testing.T, s Scalar) [32]byte { + t.Helper() + var out [32]byte + s.BytesInto(&out) + return out +} + +func TestCompressedRistrettoRoundTrip(t *testing.T) { + encoded := testPointBytes(t, 7) + comp := CompressedRistretto(encoded) + + decoded, ok := comp.Decompress() + if !ok { + t.Fatal("expected valid compressed point to decompress") + } + + var roundTrip [32]byte + decoded.BytesInto(&roundTrip) + if roundTrip != encoded { + t.Fatalf("round-trip mismatch: got %x want %x", roundTrip, encoded) + } + if comp.Bytes() != encoded { + t.Fatalf("Bytes returned different encoding") + } + if comp.IsIdentity() { + t.Fatalf("non-identity point reported as identity") + } +} + +func TestCompressedRistrettoRejectsInvalidEncoding(t *testing.T) { + invalid := CompressedRistretto{} + for i := range invalid { + invalid[i] = 0xff + } + + if _, ok := invalid.Decompress(); ok { + t.Fatal("expected all-0xff encoding to fail decompression") + } + if invalid.IsIdentity() { + t.Fatal("invalid encoding must not be reported as identity") + } +} + +func TestIdentityRejectedByValidateAndAppendPoint(t *testing.T) { + var zero Point + zero.SetZero() + var encoded [32]byte + zero.BytesInto(&encoded) + comp := CompressedRistretto(encoded) + + if !comp.IsIdentity() { + t.Fatal("test setup expected encoded zero point to be identity") + } + + err := ValidateAndAppendPoint(merlin.NewTranscript("identity-reject"), []byte("P"), &comp) + if !errors.Is(err, ErrDeserialization) { + t.Fatalf("expected ErrDeserialization for identity point, got %v", err) + } +} + +func TestValidateAndAppendPointTranscriptSensitivity(t *testing.T) { + p := CompressedRistretto(testPointBytes(t, 11)) + + t1 := merlin.NewTranscript("same") + t2 := merlin.NewTranscript("same") + if err := ValidateAndAppendPoint(t1, []byte("A"), &p); err != nil { + t.Fatalf("append point to t1: %v", err) + } + if err := ValidateAndAppendPoint(t2, []byte("B"), &p); err != nil { + t.Fatalf("append point to t2: %v", err) + } + + c1 := ChallengeScalar(t1, []byte("challenge")) + c2 := ChallengeScalar(t2, []byte("challenge")) + if testScalarBytesFromScalar(t, c1) == testScalarBytesFromScalar(t, c2) { + t.Fatal("different transcript labels unexpectedly produced same challenge") + } +} + +func TestRistrettoPointFromSlice(t *testing.T) { + valid := testPointBytes(t, 3) + got, err := RistrettoPointFromSlice(valid[:]) + if err != nil { + t.Fatalf("valid point rejected: %v", err) + } + if got != CompressedRistretto(valid) { + t.Fatalf("unexpected compressed point: got %x want %x", got, valid) + } + + if _, err := RistrettoPointFromSlice(valid[:31]); !errors.Is(err, ErrDeserialization) { + t.Fatalf("expected short point to fail deserialization, got %v", err) + } + + invalid := bytes.Repeat([]byte{0xff}, 32) + if _, err := RistrettoPointFromSlice(invalid); !errors.Is(err, ErrDeserialization) { + t.Fatalf("expected invalid point to fail deserialization, got %v", err) + } +} + +func TestCanonicalScalarFromSlice(t *testing.T) { + valid := testScalarBytes(t, 42) + s, err := CanonicalScalarFromSlice(valid[:]) + if err != nil { + t.Fatalf("valid scalar rejected: %v", err) + } + if testScalarBytesFromScalar(t, s) != valid { + t.Fatalf("scalar round-trip mismatch") + } + + if _, err := CanonicalScalarFromSlice(valid[:31]); !errors.Is(err, ErrDeserialization) { + t.Fatalf("expected short scalar to fail deserialization, got %v", err) + } + + invalid := bytes.Repeat([]byte{0xff}, 32) + if _, err := CanonicalScalarFromSlice(invalid); !errors.Is(err, ErrDeserialization) { + t.Fatalf("expected non-canonical scalar to fail deserialization, got %v", err) + } +} + +func TestPedersenCommitmentAndDecryptHandleFromBytes(t *testing.T) { + encoded := testPointBytes(t, 17) + + pc, err := PedersenCommitmentFromBytes(encoded[:]) + if err != nil { + t.Fatalf("commitment decode failed: %v", err) + } + if pc.ToBytes() != encoded { + t.Fatalf("commitment round-trip mismatch") + } + + dh, err := DecryptHandleFromBytes(encoded[:]) + if err != nil { + t.Fatalf("handle decode failed: %v", err) + } + if dh.ToBytes() != encoded { + t.Fatalf("handle round-trip mismatch") + } + + if _, err := PedersenCommitmentFromBytes(encoded[:31]); !errors.Is(err, ErrDeserialization) { + t.Fatalf("expected short commitment to fail, got %v", err) + } + if _, err := DecryptHandleFromBytes(encoded[:31]); !errors.Is(err, ErrDeserialization) { + t.Fatalf("expected short handle to fail, got %v", err) + } + + invalid := bytes.Repeat([]byte{0xff}, 32) + if _, err := PedersenCommitmentFromBytes(invalid); !errors.Is(err, ErrDeserialization) { + t.Fatalf("expected invalid commitment to fail, got %v", err) + } + if _, err := DecryptHandleFromBytes(invalid); !errors.Is(err, ErrDeserialization) { + t.Fatalf("expected invalid handle to fail, got %v", err) + } +} + +func TestPedersenAndDecryptHandleOperations(t *testing.T) { + p1 := testPoint(t, 5) + p2 := testPoint(t, 9) + pc1 := NewPedersenCommitment(&p1) + pc2 := NewPedersenCommitment(&p2) + + gotAdd := pc1.Add(&pc2) + var wantPoint Point + wantPoint.Add(&p1, &p2) + want := NewPedersenCommitment(&wantPoint) + if gotAdd.ToBytes() != want.ToBytes() { + t.Fatalf("commitment Add mismatch") + } + + s := testScalar(t, 13) + gotMul := pc1.ScalarMul(&s) + var wantMulPoint Point + wantMulPoint.ScalarMult(&p1, &s) + wantMul := NewPedersenCommitment(&wantMulPoint) + if gotMul.ToBytes() != wantMul.ToBytes() { + t.Fatalf("commitment ScalarMul mismatch") + } + + dh1 := DecryptHandle{P: p1} + dh2 := DecryptHandle{P: p2} + gotDHAdd := dh1.Add(&dh2) + wantDH := DecryptHandle{P: wantPoint} + if gotDHAdd.ToBytes() != wantDH.ToBytes() { + t.Fatalf("decrypt handle Add mismatch") + } + gotDHMul := dh1.ScalarMul(&s) + wantDHMul := DecryptHandle{P: wantMulPoint} + if gotDHMul.ToBytes() != wantDHMul.ToBytes() { + t.Fatalf("decrypt handle ScalarMul mismatch") + } +} + +func TestVartimeMultiScalarMul(t *testing.T) { + s1 := testScalar(t, 2) + s2 := testScalar(t, 3) + p1 := testPoint(t, 5) + p2 := testPoint(t, 7) + + got, err := VartimeMultiScalarMul([]*Scalar{&s1, &s2}, []*Point{&p1, &p2}) + if err != nil { + t.Fatalf("multiscalar failed: %v", err) + } + + var part1, part2, want Point + part1.ScalarMult(&p1, &s1) + part2.ScalarMult(&p2, &s2) + want.Add(&part1, &part2) + if !got.Equals(&want) { + t.Fatalf("multiscalar result mismatch") + } +} + +func TestVartimeMultiScalarMulRejectsBadInputs(t *testing.T) { + s := testScalar(t, 1) + p := testPoint(t, 1) + + if _, err := VartimeMultiScalarMul([]*Scalar{&s}, []*Point{}); !errors.Is(err, ErrVectorLengthMismatch) { + t.Fatalf("expected vector length error, got %v", err) + } + if _, err := VartimeMultiScalarMul([]*Scalar{nil}, []*Point{&p}); !errors.Is(err, ErrInvalidInput) { + t.Fatalf("expected invalid scalar error, got %v", err) + } + if _, err := VartimeMultiScalarMul([]*Scalar{&s}, []*Point{nil}); !errors.Is(err, ErrInvalidInput) { + t.Fatalf("expected invalid point error, got %v", err) + } +} + +func TestChallengeScalarDeterminism(t *testing.T) { + build := func(extra []byte) [32]byte { + tr := merlin.NewTranscript("challenge-test") + tr.AppendMessage([]byte("extra"), extra) + s := ChallengeScalar(tr, []byte("c")) + return testScalarBytesFromScalar(t, s) + } + + if build([]byte("same")) != build([]byte("same")) { + t.Fatal("same transcript did not produce deterministic challenge") + } + if build([]byte("same")) == build([]byte("different")) { + t.Fatal("different transcript unexpectedly produced same challenge") + } +} diff --git a/x/zkp/verification/range/range_test.go b/x/zkp/verification/range/range_test.go new file mode 100644 index 00000000..c79a251b --- /dev/null +++ b/x/zkp/verification/range/range_test.go @@ -0,0 +1,500 @@ +package rangeproof + +import ( + "bytes" + "errors" + "testing" + + "github.com/Fairblock/fairyring/x/zkp/verification/common" + "github.com/gtank/merlin" +) + +func rpScalar(t *testing.T, v uint64) Scalar { + t.Helper() + var s Scalar + s.SetUint64(v) + return s +} + +func rpScalarBytes(t *testing.T, v uint64) [32]byte { + t.Helper() + s := rpScalar(t, v) + var out [32]byte + s.BytesInto(&out) + return out +} + +func rpScalarBytesFromScalar(t *testing.T, s Scalar) [32]byte { + t.Helper() + var out [32]byte + s.BytesInto(&out) + return out +} + +func rpPoint(t *testing.T, v uint64) Point { + t.Helper() + s := rpScalar(t, v) + var p Point + p.ScalarMult(G, &s) + return p +} + +func rpPointBytes(t *testing.T, v uint64) [32]byte { + t.Helper() + p := rpPoint(t, v) + var out [32]byte + p.BytesInto(&out) + return out +} + +func rpPodCommit(t *testing.T, v uint64) PodPedersenCommitment { + t.Helper() + return PodPedersenCommitment{Bytes: rpPointBytes(t, v)} +} + +func rpValidProofBytes(t *testing.T, lgN int) []byte { + t.Helper() + if lgN <= 0 { + lgN = 1 + } + buf := make([]byte, 0, (7+2*lgN+2)*32) + for i := uint64(1); i <= 4; i++ { + b := rpPointBytes(t, i) + buf = append(buf, b[:]...) + } + for i := uint64(1); i <= 3; i++ { + b := rpScalarBytes(t, i) + buf = append(buf, b[:]...) + } + for i := 0; i < lgN; i++ { + l := rpPointBytes(t, uint64(10+i)) + r := rpPointBytes(t, uint64(20+i)) + buf = append(buf, l[:]...) + buf = append(buf, r[:]...) + } + a := rpScalarBytes(t, 31) + b := rpScalarBytes(t, 32) + buf = append(buf, a[:]...) + buf = append(buf, b[:]...) + return buf +} + +func TestRangeProofErrorStrings(t *testing.T) { + tests := []struct { + err error + want string + }{ + {RangeErrDeserialization, "deserialization error"}, + {RangeErrAlgebraicRelation, "algebraic relation failed"}, + {RangeErrVectorLengthMismatch, "vector length mismatch"}, + {RangeErrMaximumGeneratorLengthExceeded, "maximum generator length exceeded"}, + {RangeErrInvalidBitSize, "invalid bit size"}, + {RangeErrMultiscalarMul, "multiscalar multiplication failed"}, + {RangeErrValidationError, "point validation failed"}, + {RangeProofVerificationError(999), "unknown range proof error"}, + {ProofErrDeserialization, "deserialization error"}, + {ProofErrAlgebraic, "algebraic relation failed"}, + {ProofError(999), "unknown proof error"}, + } + + for _, tt := range tests { + if got := tt.err.Error(); got != tt.want { + t.Fatalf("%T(%v).Error() = %q, want %q", tt.err, tt.err, got, tt.want) + } + } +} + +func TestSumOfPowersFastMatchesSlow(t *testing.T) { + xs := []uint64{0, 1, 2, 7, 19} + for _, xVal := range xs { + x := rpScalar(t, xVal) + for n := 0; n <= 130; n++ { + fast := sumOfPowers(&x, n) + slow := sumOfPowersSlow(&x, n) + if rpScalarBytesFromScalar(t, fast) != rpScalarBytesFromScalar(t, slow) { + t.Fatalf("sumOfPowers mismatch for x=%d n=%d", xVal, n) + } + } + } +} + +func TestIsPowerOfTwo(t *testing.T) { + for _, n := range []int{-1, 0, 3, 5, 6, 7, 9, 12} { + if isPowerOfTwo(n) { + t.Fatalf("%d must not be a power of two", n) + } + } + for _, n := range []int{1, 2, 4, 8, 16, 64, 1024} { + if !isPowerOfTwo(n) { + t.Fatalf("%d must be a power of two", n) + } + } +} + +func TestRangeProofGeneratorsDeterministicAndResizable(t *testing.T) { + g1, err := NewRangeProofGens(16) + if err != nil { + t.Fatalf("NewRangeProofGens(16): %v", err) + } + g2, err := NewRangeProofGens(16) + if err != nil { + t.Fatalf("second NewRangeProofGens(16): %v", err) + } + if g1.GensCapacity != 16 || len(g1.GVec) != 16 || len(g1.HVec) != 16 { + t.Fatalf("unexpected generator capacity/lengths: %+v", g1) + } + + for i := 0; i < 16; i++ { + if !g1.GVec[i].Equals(&g2.GVec[i]) || !g1.HVec[i].Equals(&g2.HVec[i]) { + t.Fatalf("generator %d is not deterministic", i) + } + } + + firstG := g1.GVec[15] + firstH := g1.HVec[15] + if err := g1.increaseCapacity(8); err != nil { + t.Fatalf("shrinking increaseCapacity returned error: %v", err) + } + if g1.GensCapacity != 16 || len(g1.GVec) != 16 || len(g1.HVec) != 16 { + t.Fatalf("capacity changed on no-op resize") + } + if err := g1.increaseCapacity(32); err != nil { + t.Fatalf("increaseCapacity(32): %v", err) + } + if g1.GensCapacity != 32 || len(g1.GVec) != 32 || len(g1.HVec) != 32 { + t.Fatalf("unexpected grown capacity/lengths: %+v", g1) + } + if !g1.GVec[15].Equals(&firstG) || !g1.HVec[15].Equals(&firstH) { + t.Fatalf("existing generators changed after resize") + } +} + +func TestRangeProofGensAccessors(t *testing.T) { + gens, err := NewRangeProofGens(4) + if err != nil { + t.Fatalf("NewRangeProofGens: %v", err) + } + gs := gens.G(3) + hs := gens.H(3) + if len(gs) != 3 || len(hs) != 3 { + t.Fatalf("unexpected accessor lengths") + } + if gs[0] != &gens.GVec[0] || hs[2] != &gens.HVec[2] { + t.Fatal("accessors must return pointers to underlying generators") + } +} + +func TestCollectRangeCtxAcceptsDenseCommitmentsAndPadding(t *testing.T) { + ctx := BatchedRangeProofContext{} + ctx.Commitments[0] = rpPodCommit(t, 1) + ctx.Commitments[1] = rpPodCommit(t, 2) + ctx.BitLengths[0] = 32 + ctx.BitLengths[1] = 64 + + comms, bits, perr := collectRangeCtx(&ctx, 64) + if perr != 0 { + t.Fatalf("collectRangeCtx returned error: %v", perr) + } + if len(comms) != 2 || len(bits) != 2 || bits[0] != 32 || bits[1] != 64 { + t.Fatalf("unexpected commitments/bits: %d %v", len(comms), bits) + } +} + +func TestCollectRangeCtxRejectsHoles(t *testing.T) { + ctx := BatchedRangeProofContext{} + ctx.Commitments[0] = rpPodCommit(t, 1) + ctx.BitLengths[0] = 32 + ctx.Commitments[2] = rpPodCommit(t, 2) + ctx.BitLengths[2] = 32 + + _, _, perr := collectRangeCtx(&ctx, 64) + if perr != ProofErrAlgebraic { + t.Fatalf("expected algebraic error for non-zero commitment after padding, got %v", perr) + } +} + +func TestCollectRangeCtxRejectsPaddingWithBitLength(t *testing.T) { + ctx := BatchedRangeProofContext{} + ctx.Commitments[0] = rpPodCommit(t, 1) + ctx.BitLengths[0] = 32 + ctx.BitLengths[1] = 1 + + _, _, perr := collectRangeCtx(&ctx, 64) + if perr != ProofErrAlgebraic { + t.Fatalf("expected algebraic error for padded bit length, got %v", perr) + } +} + +func TestCollectRangeCtxRejectsInvalidBitLengths(t *testing.T) { + for _, bl := range []uint8{0, 65} { + ctx := BatchedRangeProofContext{} + ctx.Commitments[0] = rpPodCommit(t, 1) + ctx.BitLengths[0] = bl + + _, _, perr := collectRangeCtx(&ctx, 64) + if perr != ProofErrAlgebraic { + t.Fatalf("expected algebraic error for bit length %d, got %v", bl, perr) + } + } +} + +func TestCollectRangeCtxRejectsEmptyContext(t *testing.T) { + _, _, perr := collectRangeCtx(&BatchedRangeProofContext{}, 64) + if perr != ProofErrAlgebraic { + t.Fatalf("expected algebraic error for empty context, got %v", perr) + } +} + +func TestCollectRangeCtxRejectsInvalidCommitmentEncoding(t *testing.T) { + ctx := BatchedRangeProofContext{} + for i := range ctx.Commitments[0].Bytes { + ctx.Commitments[0].Bytes[i] = 0xff + } + ctx.BitLengths[0] = 32 + + _, _, perr := collectRangeCtx(&ctx, 64) + if perr != ProofErrDeserialization { + t.Fatalf("expected deserialization error for invalid commitment, got %v", perr) + } +} + +func TestInnerProductProofFromBytes(t *testing.T) { + buf := make([]byte, 0, 4*32) + l := rpPointBytes(t, 3) + r := rpPointBytes(t, 4) + a := rpScalarBytes(t, 5) + b := rpScalarBytes(t, 6) + buf = append(buf, l[:]...) + buf = append(buf, r[:]...) + buf = append(buf, a[:]...) + buf = append(buf, b[:]...) + + ipp, err := InnerProductProofFromBytes(buf) + if err != nil { + t.Fatalf("valid IPP bytes rejected: %v", err) + } + if len(ipp.LVec) != 1 || len(ipp.RVec) != 1 { + t.Fatalf("unexpected IPP vector lengths") + } + if ipp.LVec[0] != CompressedRistretto(l) || ipp.RVec[0] != CompressedRistretto(r) { + t.Fatal("IPP points not decoded in expected order") + } +} + +func TestInnerProductProofFromBytesRejectsMalformedInput(t *testing.T) { + if _, err := InnerProductProofFromBytes([]byte{1, 2, 3}); !errors.Is(err, RangeErrDeserialization) { + t.Fatalf("expected non-multiple length to fail, got %v", err) + } + if _, err := InnerProductProofFromBytes(make([]byte, 32)); !errors.Is(err, RangeErrDeserialization) { + t.Fatalf("expected too-short IPP to fail, got %v", err) + } + if _, err := InnerProductProofFromBytes(make([]byte, 3*32)); !errors.Is(err, RangeErrDeserialization) { + t.Fatalf("expected odd L/R vector layout to fail, got %v", err) + } + + buf := make([]byte, 4*32) + p3 := rpPointBytes(t, 3) + p4 := rpPointBytes(t, 4) + copy(buf[0:32], p3[:]) + copy(buf[32:64], p4[:]) + for i := 64; i < 96; i++ { + buf[i] = 0xff + } + if _, err := InnerProductProofFromBytes(buf); !errors.Is(err, RangeErrDeserialization) { + t.Fatalf("expected non-canonical scalar to fail, got %v", err) + } +} + +func TestRangeProofFromBytes(t *testing.T) { + buf := rpValidProofBytes(t, 1) + rp, err := RangeProofFromBytes(buf) + if err != nil { + t.Fatalf("validly-encoded proof rejected: %v", err) + } + if len(rp.IPPProof.LVec) != 1 || len(rp.IPPProof.RVec) != 1 { + t.Fatalf("unexpected IPP vectors in range proof") + } +} + +func TestRangeProofFromBytesRejectsMalformedInput(t *testing.T) { + if _, err := RangeProofFromBytes([]byte{1, 2, 3}); !errors.Is(err, RangeErrDeserialization) { + t.Fatalf("expected non-multiple length to fail, got %v", err) + } + if _, err := RangeProofFromBytes(make([]byte, 6*32)); !errors.Is(err, RangeErrDeserialization) { + t.Fatalf("expected too-short range proof to fail, got %v", err) + } + + buf := rpValidProofBytes(t, 1) + for i := 128; i < 160; i++ { + buf[i] = 0xff + } + if _, err := RangeProofFromBytes(buf); !errors.Is(err, RangeErrDeserialization) { + t.Fatalf("expected non-canonical tx scalar to fail, got %v", err) + } +} + +func TestRangeProofVerifyRejectsInvalidBitSizeAndVectorLength(t *testing.T) { + buf := rpValidProofBytes(t, 1) + rp, err := RangeProofFromBytes(buf) + if err != nil { + t.Fatalf("proof parse failed: %v", err) + } + pc := PedersenCommitment{PedersenCommitment: *mustCommonCommitment(t, rpPointBytes(t, 9))} + + if err := rp.Verify([]*PedersenCommitment{&pc}, []int{} /* mismatch */, merlin.NewTranscript("range")); !errors.Is(err, RangeErrVectorLengthMismatch) { + t.Fatalf("expected vector length mismatch, got %v", err) + } + if err := rp.Verify([]*PedersenCommitment{&pc}, []int{3}, merlin.NewTranscript("range")); !errors.Is(err, RangeErrInvalidBitSize) { + t.Fatalf("expected invalid non-power-of-two bit size, got %v", err) + } +} + +func mustCommonCommitment(t *testing.T, b [32]byte) *common.PedersenCommitment { + t.Helper() + pc, err := common.PedersenCommitmentFromBytes(b[:]) + if err != nil { + t.Fatalf("commitment decode failed: %v", err) + } + return pc +} + +func TestBatchInvertScalars(t *testing.T) { + vals := []Scalar{rpScalar(t, 2), rpScalar(t, 3), rpScalar(t, 5)} + allInv, err := batchInvertScalars(vals) + if err != nil { + t.Fatalf("batchInvertScalars: %v", err) + } + one := rpScalar(t, 1) + for i, original := range []Scalar{rpScalar(t, 2), rpScalar(t, 3), rpScalar(t, 5)} { + var product Scalar + product.Mul(&original, &vals[i]) + if rpScalarBytesFromScalar(t, product) != rpScalarBytesFromScalar(t, one) { + t.Fatalf("inverse %d is incorrect", i) + } + } + two := rpScalar(t, 2) + three := rpScalar(t, 3) + five := rpScalar(t, 5) + var originalProduct Scalar + originalProduct.Mul(&two, &three) + originalProduct.Mul(&originalProduct, &five) + var wantAllInv Scalar + wantAllInv.Inverse(&originalProduct) + if rpScalarBytesFromScalar(t, allInv) != rpScalarBytesFromScalar(t, wantAllInv) { + t.Fatalf("all inverse mismatch") + } +} + +func TestBatchInvertScalarsWithZero(t *testing.T) { + var zero Scalar + zero.SetZero() + vals := []Scalar{rpScalar(t, 2), zero, rpScalar(t, 5)} + allInv, err := batchInvertScalars(vals) + if err != nil { + t.Fatalf("batchInvertScalars with zero: %v", err) + } + if rpScalarBytesFromScalar(t, vals[1]) != rpScalarBytesFromScalar(t, zero) { + t.Fatalf("zero input must stay zero") + } + var product Scalar + two := rpScalar(t, 2) + five := rpScalar(t, 5) + product.Mul(&two, &five) + var want Scalar + want.Inverse(&product) + if rpScalarBytesFromScalar(t, allInv) != rpScalarBytesFromScalar(t, want) { + t.Fatalf("all inverse with zero mismatch") + } +} + +func TestMultiscalarMulParallelMatchesSerial(t *testing.T) { + scalars := []Scalar{rpScalar(t, 2), rpScalar(t, 3), rpScalar(t, 5), rpScalar(t, 7), rpScalar(t, 11)} + points := []*Point{} + for i := range scalars { + p := rpPoint(t, uint64(i+2)) + points = append(points, &p) + } + + serial, ok := multiscalarMul(scalars, points) + if !ok { + t.Fatal("serial multiscalar failed") + } + for workers := 1; workers <= 8; workers++ { + parallel, ok := multiscalarMulParallel(scalars, points, workers) + if !ok { + t.Fatalf("parallel multiscalar failed for workers=%d", workers) + } + if !parallel.Equals(&serial) { + t.Fatalf("parallel mismatch for workers=%d", workers) + } + } +} + +func TestMultiscalarMulRejectsBadInputs(t *testing.T) { + s := []Scalar{rpScalar(t, 1)} + p := rpPoint(t, 1) + if _, ok := multiscalarMul(s, []*Point{}); ok { + t.Fatal("expected serial length mismatch to fail") + } + if _, ok := multiscalarMul(s, []*Point{nil}); ok { + t.Fatal("expected serial nil point to fail") + } + if _, ok := multiscalarMulParallel(s, []*Point{&p, &p}, 2); ok { + t.Fatal("expected parallel length mismatch to fail") + } + if _, ok := multiscalarMulParallel(s, []*Point{nil}, 2); ok { + t.Fatal("expected parallel nil point to fail") + } +} + +func TestHashAndGeneratorHelpersAreDeterministic(t *testing.T) { + p1 := hashToPointSha3512([]byte("fairblock")) + p2 := hashToPointSha3512([]byte("fairblock")) + p3 := hashToPointSha3512([]byte("other")) + if !p1.Equals(&p2) { + t.Fatal("hashToPointSha3512 not deterministic") + } + if p1.Equals(&p3) { + t.Fatal("different hash input produced same point") + } + + gc1 := newGeneratorsChain([]byte("G")) + gc2 := newGeneratorsChain([]byte("G")) + got1 := gc1.nextPoint() + got2 := gc2.nextPoint() + if !got1.Equals(&got2) { + t.Fatal("generators chain not deterministic") + } + gc1.fastForward(2) + gc2.nextPoint() + gc2.nextPoint() + fastForwardPoint := gc1.nextPoint() + manualPoint := gc2.nextPoint() + if !fastForwardPoint.Equals(&manualPoint) { + t.Fatal("fastForward did not match manual advancement") + } +} + +func TestPutU64LE(t *testing.T) { + var out [8]byte + putU64LE(out[:], 0x0102030405060708) + want := []byte{0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01} + if !bytes.Equal(out[:], want) { + t.Fatalf("putU64LE got %x want %x", out, want) + } +} + +func TestLeadingZeros32(t *testing.T) { + tests := map[uint32]int{ + 0: 32, + 1: 31, + 2: 30, + 0x80000000: 0, + 0x40000000: 1, + } + for in, want := range tests { + if got := leadingZeros32(in); got != want { + t.Fatalf("leadingZeros32(%#x) = %d, want %d", in, got, want) + } + } +} diff --git a/x/zkp/verification/transferctx/transferctx_test.go b/x/zkp/verification/transferctx/transferctx_test.go new file mode 100644 index 00000000..e3e4f207 --- /dev/null +++ b/x/zkp/verification/transferctx/transferctx_test.go @@ -0,0 +1,328 @@ +package transferctx + +import ( + "errors" + "strings" + "testing" + + "github.com/Fairblock/fairyring/x/zkp/verification/commitment" + "github.com/Fairblock/fairyring/x/zkp/verification/common" + rangeproof "github.com/Fairblock/fairyring/x/zkp/verification/range" + "github.com/Fairblock/fairyring/x/zkp/verification/validity" +) + +type transferBindingFixture struct { + eq commitment.CiphertextCommitmentEqualityProofData + rp rangeproof.BatchedRangeProofU128Data + vp validity.BatchedGroupedCiphertext2HandlesValidityProofData + currentC1 [32]byte + currentC2 [32]byte + senderPK [32]byte + recipientPK [32]byte + transferC1 [32]byte + transferC2 [32]byte + remainingC1 [32]byte + remainingC2 [32]byte +} + +func tcScalar(t *testing.T, n uint64) common.Scalar { + t.Helper() + var s common.Scalar + s.SetUint64(n) + return s +} + +func tcPoint(t *testing.T, n uint64) common.Point { + t.Helper() + s := tcScalar(t, n) + var p common.Point + p.ScalarMult(&common.G, &s) + return p +} + +func tcPointBytes(t *testing.T, n uint64) [32]byte { + t.Helper() + p := tcPoint(t, n) + var out [32]byte + p.BytesInto(&out) + return out +} + +func tcAddPointBytes(t *testing.T, a, b [32]byte) [32]byte { + t.Helper() + ap, err := common.PedersenCommitmentFromBytes(a[:]) + if err != nil { + t.Fatalf("decode a: %v", err) + } + bp, err := common.PedersenCommitmentFromBytes(b[:]) + if err != nil { + t.Fatalf("decode b: %v", err) + } + var out common.Point + out.Add(ap.GetPoint(), bp.GetPoint()) + var encoded [32]byte + out.BytesInto(&encoded) + return encoded +} + +func tcInvalidBytes() [32]byte { + var out [32]byte + for i := range out { + out[i] = 0xff + } + return out +} + +func tcFixture(t *testing.T) transferBindingFixture { + t.Helper() + senderPK := tcPointBytes(t, 1) + recipientPK := tcPointBytes(t, 2) + transferC1 := tcPointBytes(t, 3) + transferC2 := tcPointBytes(t, 4) + transferRecipientHandle := tcPointBytes(t, 5) + remainingC1 := tcPointBytes(t, 6) + remainingC2 := tcPointBytes(t, 7) + currentC1 := tcAddPointBytes(t, transferC1, remainingC1) + currentC2 := tcAddPointBytes(t, transferC2, remainingC2) + eqCommitment := tcPointBytes(t, 8) + + var groupedLo [96]byte + copy(groupedLo[0:32], transferC1[:]) + copy(groupedLo[32:64], transferC2[:]) + copy(groupedLo[64:96], transferRecipientHandle[:]) + + var groupedHi [96]byte + hiCommitment := tcPointBytes(t, 9) + hiSenderHandle := tcPointBytes(t, 10) + hiRecipientHandle := tcPointBytes(t, 11) + copy(groupedHi[0:32], hiCommitment[:]) + copy(groupedHi[32:64], hiSenderHandle[:]) + copy(groupedHi[64:96], hiRecipientHandle[:]) + + fx := transferBindingFixture{ + currentC1: currentC1, + currentC2: currentC2, + senderPK: senderPK, + recipientPK: recipientPK, + transferC1: transferC1, + transferC2: transferC2, + remainingC1: remainingC1, + remainingC2: remainingC2, + } + + fx.eq.Context.Pubkey.Bytes = senderPK + fx.eq.Context.Ciphertext.Commitment = remainingC1 + fx.eq.Context.Ciphertext.Handle = remainingC2 + fx.eq.Context.Commitment.Bytes = eqCommitment + + fx.rp.Context.Commitments[0].Bytes = eqCommitment + fx.rp.Context.Commitments[1].Bytes = transferC1 + fx.rp.Context.BitLengths[0] = 64 + fx.rp.Context.BitLengths[1] = 64 + + fx.vp.Context.FirstPubkey.Bytes = senderPK + fx.vp.Context.SecondPubkey.Bytes = recipientPK + fx.vp.Context.GroupedCiphertextLo.Bytes = groupedLo + fx.vp.Context.GroupedCiphertextHi.Bytes = groupedHi + + return fx +} + +func TestVerifyBindingsSuccess(t *testing.T) { + fx := tcFixture(t) + if err := VerifyBindings( + &fx.eq, + &fx.rp, + &fx.vp, + fx.currentC1[:], + fx.currentC2[:], + fx.senderPK[:], + fx.recipientPK[:], + ); err != nil { + t.Fatalf("expected bindings to verify, got %v", err) + } +} + +func TestVerifyBindingsRejectsInvalidInputLengths(t *testing.T) { + fx := tcFixture(t) + cases := []struct { + name string + currentC1 []byte + currentC2 []byte + senderPK []byte + recipientPK []byte + }{ + {"current C1", fx.currentC1[:31], fx.currentC2[:], fx.senderPK[:], fx.recipientPK[:]}, + {"current C2", fx.currentC1[:], fx.currentC2[:31], fx.senderPK[:], fx.recipientPK[:]}, + {"sender pubkey", fx.currentC1[:], fx.currentC2[:], fx.senderPK[:31], fx.recipientPK[:]}, + {"recipient pubkey", fx.currentC1[:], fx.currentC2[:], fx.senderPK[:], fx.recipientPK[:31]}, + } + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + err := VerifyBindings(&fx.eq, &fx.rp, &fx.vp, tt.currentC1, tt.currentC2, tt.senderPK, tt.recipientPK) + if err == nil || err.Error() != "transfer binding: invalid input lengths" { + t.Fatalf("expected invalid length error, got %v", err) + } + }) + } +} + +func TestVerifyBindingsRejectsPubkeyMismatches(t *testing.T) { + cases := []struct { + name string + mut func(*transferBindingFixture) + want string + }{ + {"sender in validity", func(fx *transferBindingFixture) { fx.vp.Context.FirstPubkey.Bytes = tcPointBytes(t, 21) }, "sender pubkey mismatch"}, + {"recipient in validity", func(fx *transferBindingFixture) { fx.vp.Context.SecondPubkey.Bytes = tcPointBytes(t, 22) }, "recipient pubkey mismatch"}, + {"source in equality", func(fx *transferBindingFixture) { fx.eq.Context.Pubkey.Bytes = tcPointBytes(t, 23) }, "source pubkey mismatch"}, + } + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + fx := tcFixture(t) + tt.mut(&fx) + err := VerifyBindings(&fx.eq, &fx.rp, &fx.vp, fx.currentC1[:], fx.currentC2[:], fx.senderPK[:], fx.recipientPK[:]) + if err == nil || err.Error() != tt.want { + t.Fatalf("expected %q, got %v", tt.want, err) + } + }) + } +} + +func TestVerifyBindingsRejectsCommitmentMismatches(t *testing.T) { + cases := []struct { + name string + mut func(*transferBindingFixture) + want string + }{ + {"equality range mismatch", func(fx *transferBindingFixture) { fx.rp.Context.Commitments[0].Bytes = tcPointBytes(t, 24) }, "equality and range proof commitments do not match"}, + {"transfer amount range mismatch", func(fx *transferBindingFixture) { fx.rp.Context.Commitments[1].Bytes = tcPointBytes(t, 25) }, "transfer amount commitment not bound to range proof"}, + {"remaining commitment mismatch", func(fx *transferBindingFixture) { fx.eq.Context.Ciphertext.Commitment = tcPointBytes(t, 26) }, "remaining balance commitment mismatch"}, + {"remaining handle mismatch", func(fx *transferBindingFixture) { fx.eq.Context.Ciphertext.Handle = tcPointBytes(t, 27) }, "remaining balance handle mismatch"}, + } + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + fx := tcFixture(t) + tt.mut(&fx) + err := VerifyBindings(&fx.eq, &fx.rp, &fx.vp, fx.currentC1[:], fx.currentC2[:], fx.senderPK[:], fx.recipientPK[:]) + if err == nil || err.Error() != tt.want { + t.Fatalf("expected %q, got %v", tt.want, err) + } + }) + } +} + +func TestVerifyBindingsRejectsInvalidGroupedCiphertext(t *testing.T) { + fx := tcFixture(t) + bad := tcInvalidBytes() + copy(fx.vp.Context.GroupedCiphertextLo.Bytes[0:32], bad[:]) + fx.rp.Context.Commitments[1].Bytes = bad + + err := VerifyBindings(&fx.eq, &fx.rp, &fx.vp, fx.currentC1[:], fx.currentC2[:], fx.senderPK[:], fx.recipientPK[:]) + if err == nil || err.Error() != "failed to deserialize ciphertexts" { + t.Fatalf("expected grouped ciphertext deserialization error, got %v", err) + } +} + +func TestVerifyBindingsRejectsInvalidCurrentOrTransferCiphertextEncoding(t *testing.T) { + cases := []struct { + name string + mut func(*transferBindingFixture) ([]byte, []byte) + want string + }{ + {"current commitment", func(fx *transferBindingFixture) ([]byte, []byte) { + bad := tcInvalidBytes() + return bad[:], fx.currentC2[:] + }, "transfer binding: invalid current balance commitment"}, + {"current handle", func(fx *transferBindingFixture) ([]byte, []byte) { + bad := tcInvalidBytes() + return fx.currentC1[:], bad[:] + }, "transfer binding: invalid current balance handle"}, + {"transfer commitment", func(fx *transferBindingFixture) ([]byte, []byte) { + bad := tcInvalidBytes() + copy(fx.vp.Context.GroupedCiphertextLo.Bytes[0:32], bad[:]) + fx.rp.Context.Commitments[1].Bytes = bad + return fx.currentC1[:], fx.currentC2[:] + }, "failed to deserialize ciphertexts"}, + } + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + fx := tcFixture(t) + currentC1, currentC2 := tt.mut(&fx) + err := VerifyBindings(&fx.eq, &fx.rp, &fx.vp, currentC1, currentC2, fx.senderPK[:], fx.recipientPK[:]) + if err == nil || err.Error() != tt.want { + t.Fatalf("expected %q, got %v", tt.want, err) + } + }) + } +} + +func TestHomomorphicSubMatchesPointSubtraction(t *testing.T) { + aC1 := tcPointBytes(t, 31) + aC2 := tcPointBytes(t, 32) + bC1 := tcPointBytes(t, 33) + bC2 := tcPointBytes(t, 34) + + gotC1, gotC2, err := homomorphicSub(aC1[:], aC2[:], bC1[:], bC2[:]) + if err != nil { + t.Fatalf("homomorphicSub: %v", err) + } + + decodePoint := func(label string, b [32]byte) *common.Point { + pc, err := common.PedersenCommitmentFromBytes(b[:]) + if err != nil { + t.Fatalf("decode %s: %v", label, err) + } + return pc.GetPoint() + } + var wantC1, wantC2 common.Point + wantC1.Sub(decodePoint("aC1", aC1), decodePoint("bC1", bC1)) + wantC2.Sub(decodePoint("aC2", aC2), decodePoint("bC2", bC2)) + var wantC1Bytes, wantC2Bytes [32]byte + wantC1.BytesInto(&wantC1Bytes) + wantC2.BytesInto(&wantC2Bytes) + if gotC1 != wantC1Bytes || gotC2 != wantC2Bytes { + t.Fatalf("homomorphicSub mismatch") + } +} + +func TestHomomorphicSubRejectsMalformedInputs(t *testing.T) { + valid := tcPointBytes(t, 1) + bad := tcInvalidBytes() + cases := []struct { + name string + aC1 []byte + aC2 []byte + bC1 []byte + bC2 []byte + want string + }{ + {"current commitment", bad[:], valid[:], valid[:], valid[:], "transfer binding: invalid current balance commitment"}, + {"transfer commitment", valid[:], valid[:], bad[:], valid[:], "transfer binding: invalid transfer commitment"}, + {"current handle", valid[:], bad[:], valid[:], valid[:], "transfer binding: invalid current balance handle"}, + {"transfer handle", valid[:], valid[:], valid[:], bad[:], "transfer binding: invalid transfer handle"}, + } + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + _, _, err := homomorphicSub(tt.aC1, tt.aC2, tt.bC1, tt.bC2) + if err == nil || err.Error() != tt.want { + t.Fatalf("expected %q, got %v", tt.want, err) + } + }) + } +} + +func TestVerifyBindingsErrorsAreSpecific(t *testing.T) { + fx := tcFixture(t) + fx.eq.Context.Ciphertext.Commitment[0] ^= 0x01 + err := VerifyBindings(&fx.eq, &fx.rp, &fx.vp, fx.currentC1[:], fx.currentC2[:], fx.senderPK[:], fx.recipientPK[:]) + if err == nil { + t.Fatal("expected error") + } + if errors.Is(err, common.ErrDeserialization) { + t.Fatalf("binding errors should be contextualized strings, got sentinel: %v", err) + } + if !strings.Contains(err.Error(), "remaining balance commitment") { + t.Fatalf("unexpected error: %v", err) + } +} diff --git a/x/zkp/verification/validity/validity_test.go b/x/zkp/verification/validity/validity_test.go new file mode 100644 index 00000000..403ae4d9 --- /dev/null +++ b/x/zkp/verification/validity/validity_test.go @@ -0,0 +1,299 @@ +package validity + +import ( + "bytes" + "errors" + "testing" + + "github.com/Fairblock/fairyring/x/zkp/verification/common" +) + +func vScalar(t *testing.T, n uint64) Scalar { + t.Helper() + var s Scalar + s.SetUint64(n) + return s +} + +func vScalarBytes(t *testing.T, n uint64) [32]byte { + t.Helper() + s := vScalar(t, n) + var out [32]byte + s.BytesInto(&out) + return out +} + +func vScalarBytesFromScalar(t *testing.T, s Scalar) [32]byte { + t.Helper() + var out [32]byte + s.BytesInto(&out) + return out +} + +func vPoint(t *testing.T, n uint64) Point { + t.Helper() + s := vScalar(t, n) + var p Point + p.ScalarMult(&common.G, &s) + return p +} + +func vPointBytes(t *testing.T, n uint64) [32]byte { + t.Helper() + p := vPoint(t, n) + var out [32]byte + p.BytesInto(&out) + return out +} + +func vInvalidPointBytes() [32]byte { + var out [32]byte + for i := range out { + out[i] = 0xff + } + return out +} + +func vGroupedCiphertextBytes(t *testing.T, commit, handle0, handle1 uint64) [96]byte { + t.Helper() + var out [96]byte + c := vPointBytes(t, commit) + h0 := vPointBytes(t, handle0) + h1 := vPointBytes(t, handle1) + copy(out[0:32], c[:]) + copy(out[32:64], h0[:]) + copy(out[64:96], h1[:]) + return out +} + +func vBaseProofBytes(t *testing.T) [160]byte { + t.Helper() + var out [160]byte + y0 := vPointBytes(t, 10) + y1 := vPointBytes(t, 11) + y2 := vPointBytes(t, 12) + zr := vScalarBytes(t, 13) + zx := vScalarBytes(t, 14) + copy(out[0:32], y0[:]) + copy(out[32:64], y1[:]) + copy(out[64:96], y2[:]) + copy(out[96:128], zr[:]) + copy(out[128:160], zx[:]) + return out +} + +func vBaseData(t *testing.T) BatchedGroupedCiphertext2HandlesValidityProofData { + t.Helper() + return BatchedGroupedCiphertext2HandlesValidityProofData{ + Context: BatchedGroupedCiphertext2HandlesValidityProofContext{ + FirstPubkey: PodElGamalPubkey{Bytes: vPointBytes(t, 1)}, + SecondPubkey: PodElGamalPubkey{Bytes: vPointBytes(t, 2)}, + GroupedCiphertextLo: PodGroupedElGamalCiphertext2Handles{Bytes: vGroupedCiphertextBytes(t, 3, 4, 5)}, + GroupedCiphertextHi: PodGroupedElGamalCiphertext2Handles{Bytes: vGroupedCiphertextBytes(t, 6, 7, 8)}, + }, + Proof: PodBatchedGroupedCiphertext2HandlesValidityProof{Bytes: vBaseProofBytes(t)}, + } +} + +func TestElGamalPubkeyFromPod(t *testing.T) { + pod := PodElGamalPubkey{Bytes: vPointBytes(t, 7)} + var pk ElGamalPubkey + if err := pk.FromPod(pod); err != nil { + t.Fatalf("valid pubkey rejected: %v", err) + } + var got [32]byte + pk.P.BytesInto(&got) + if got != pod.Bytes { + t.Fatalf("pubkey round-trip mismatch") + } + + bad := PodElGamalPubkey{Bytes: vInvalidPointBytes()} + if err := pk.FromPod(bad); !errors.Is(err, ErrElGamalPubkeyDeserialization) { + t.Fatalf("expected pubkey deserialization error, got %v", err) + } +} + +func TestGroupedElGamalCiphertext2RoundTrip(t *testing.T) { + encoded := vGroupedCiphertextBytes(t, 3, 4, 5) + ct, err := GroupedElGamalCiphertext2FromBytes(encoded[:]) + if err != nil { + t.Fatalf("valid grouped ciphertext rejected: %v", err) + } + if ct.expectedByteLength() != 96 { + t.Fatalf("unexpected byte length: %d", ct.expectedByteLength()) + } + if got := ct.ToBytes(); !bytes.Equal(got, encoded[:]) { + t.Fatalf("grouped ciphertext round-trip mismatch") + } + + fromPod, err := GroupedElGamalCiphertext2FromPod(PodGroupedElGamalCiphertext2Handles{Bytes: encoded}) + if err != nil { + t.Fatalf("valid pod grouped ciphertext rejected: %v", err) + } + if !bytes.Equal(fromPod.ToBytes(), encoded[:]) { + t.Fatalf("pod grouped ciphertext round-trip mismatch") + } +} + +func TestGroupedElGamalCiphertext2RejectsMalformedInput(t *testing.T) { + if _, err := GroupedElGamalCiphertext2FromBytes(make([]byte, 95)); !errors.Is(err, ErrElGamalCiphertextDeserialization) { + t.Fatalf("expected grouped ciphertext length error, got %v", err) + } + + cases := []struct { + name string + from int + to int + }{ + {"bad commitment", 0, 32}, + {"bad handle 0", 32, 64}, + {"bad handle 1", 64, 96}, + } + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + encoded := vGroupedCiphertextBytes(t, 3, 4, 5) + for i := tt.from; i < tt.to; i++ { + encoded[i] = 0xff + } + if _, err := GroupedElGamalCiphertext2FromBytes(encoded[:]); err == nil { + t.Fatal("expected invalid point encoding to fail") + } + }) + } +} + +func TestGroupedCiphertext2HandlesValidityProofFromBytes(t *testing.T) { + raw := vBaseProofBytes(t) + proof, err := GroupedCiphertext2HandlesValidityProofFromBytes(raw[:]) + if err != nil { + t.Fatalf("validly encoded proof rejected: %v", err) + } + if proof.Y0 != common.CompressedRistretto(vPointBytes(t, 10)) || + proof.Y1 != common.CompressedRistretto(vPointBytes(t, 11)) || + proof.Y2 != common.CompressedRistretto(vPointBytes(t, 12)) { + t.Fatalf("proof points decoded in wrong order") + } + if vScalarBytesFromScalar(t, proof.Zr) != vScalarBytes(t, 13) || + vScalarBytesFromScalar(t, proof.Zx) != vScalarBytes(t, 14) { + t.Fatalf("proof scalars decoded in wrong order") + } +} + +func TestGroupedCiphertext2HandlesValidityProofFromBytesRejectsMalformedInput(t *testing.T) { + if _, err := GroupedCiphertext2HandlesValidityProofFromBytes(make([]byte, 159)); !errors.Is(err, ErrValidityDeserialization) { + t.Fatalf("expected proof length error, got %v", err) + } + + cases := []struct { + name string + from int + to int + }{ + {"bad Y0", 0, 32}, + {"bad Y1", 32, 64}, + {"bad Y2", 64, 96}, + {"bad Zr", 96, 128}, + {"bad Zx", 128, 160}, + } + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + raw := vBaseProofBytes(t) + for i := tt.from; i < tt.to; i++ { + raw[i] = 0xff + } + if _, err := GroupedCiphertext2HandlesValidityProofFromBytes(raw[:]); err == nil { + t.Fatal("expected malformed proof field to fail") + } + }) + } +} + +func TestBatchedGroupedCiphertext2HandlesValidityProofFromBytes(t *testing.T) { + raw := vBaseProofBytes(t) + proof, err := BatchedGroupedCiphertext2HandlesValidityProofFromBytes(raw[:]) + if err != nil { + t.Fatalf("validly encoded batched proof rejected: %v", err) + } + if proof.Inner.Y0 != common.CompressedRistretto(vPointBytes(t, 10)) { + t.Fatalf("inner proof not populated") + } + + pod := PodBatchedGroupedCiphertext2HandlesValidityProof{Bytes: raw} + fromPod, err := pod.ToProof() + if err != nil { + t.Fatalf("pod.ToProof rejected valid encoding: %v", err) + } + if fromPod.Inner.Y1 != proof.Inner.Y1 { + t.Fatalf("pod proof mismatch") + } +} + +func TestValidityTranscriptDeterministicAndContextSensitive(t *testing.T) { + pd := vBaseData(t) + challenge := func(ctx BatchedGroupedCiphertext2HandlesValidityProofContext) [32]byte { + tr := ctx.NewTranscript() + s := common.ChallengeScalar(tr, []byte("t")) + return vScalarBytesFromScalar(t, s) + } + + if challenge(pd.Context) != challenge(pd.Context) { + t.Fatal("same validity context did not produce deterministic challenge") + } + mutated := pd.Context + mutated.SecondPubkey.Bytes[0] ^= 0x01 + if challenge(pd.Context) == challenge(mutated) { + t.Fatal("mutating context did not change transcript challenge") + } +} + +func TestVerifyValidityProofRejectsMalformedContext(t *testing.T) { + cases := []struct { + name string + mut func(*BatchedGroupedCiphertext2HandlesValidityProofData) + }{ + {"bad first pubkey", func(pd *BatchedGroupedCiphertext2HandlesValidityProofData) { + pd.Context.FirstPubkey.Bytes = vInvalidPointBytes() + }}, + {"bad second pubkey", func(pd *BatchedGroupedCiphertext2HandlesValidityProofData) { + pd.Context.SecondPubkey.Bytes = vInvalidPointBytes() + }}, + {"bad grouped lo", func(pd *BatchedGroupedCiphertext2HandlesValidityProofData) { + for i := 0; i < 32; i++ { + pd.Context.GroupedCiphertextLo.Bytes[i] = 0xff + } + }}, + {"bad grouped hi", func(pd *BatchedGroupedCiphertext2HandlesValidityProofData) { + for i := 0; i < 32; i++ { + pd.Context.GroupedCiphertextHi.Bytes[i] = 0xff + } + }}, + } + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + pd := vBaseData(t) + tt.mut(&pd) + if err := VerifyValidityProof(&pd); !errors.Is(err, ErrValidityInvalidProof) { + t.Fatalf("expected invalid proof error, got %v", err) + } + }) + } +} + +func TestVerifyValidityProofRejectsMalformedProof(t *testing.T) { + for _, off := range []int{0, 32, 64, 96, 128} { + pd := vBaseData(t) + for i := off; i < off+32; i++ { + pd.Proof.Bytes[i] = 0xff + } + if err := VerifyValidityProof(&pd); !errors.Is(err, ErrValidityInvalidProof) { + t.Fatalf("expected invalid proof error for field offset %d, got %v", off, err) + } + } +} + +func TestVerifyValidityProofRejectsAlgebraicallyInvalidButWellFormedProof(t *testing.T) { + pd := vBaseData(t) + if err := VerifyValidityProof(&pd); !errors.Is(err, ErrValidityInvalidProof) { + t.Fatalf("expected random well-formed validity proof to fail, got %v", err) + } +} diff --git a/x/zkp/verification/withdrawctx/withdrawctx_test.go b/x/zkp/verification/withdrawctx/withdrawctx_test.go new file mode 100644 index 00000000..53504fcb --- /dev/null +++ b/x/zkp/verification/withdrawctx/withdrawctx_test.go @@ -0,0 +1,144 @@ +package withdrawctx + +import ( + "encoding/binary" + "testing" + + "github.com/Fairblock/fairyring/x/zkp/verification/commitment" + "github.com/Fairblock/fairyring/x/zkp/verification/common" + rangeproof "github.com/Fairblock/fairyring/x/zkp/verification/range" +) + +type withdrawBindingFixture struct { + eq commitment.WithdrawCiphertextCommitmentEqualityProofData + rp rangeproof.WithdrawBatchedRangeProofU64Data + userPK [32]byte + cipherC1 [32]byte + cipherC2 [32]byte + proofComm [32]byte + nonce uint64 +} + +func wcScalar(t *testing.T, n uint64) common.Scalar { + t.Helper() + var s common.Scalar + s.SetUint64(n) + return s +} + +func wcPointBytes(t *testing.T, n uint64) [32]byte { + t.Helper() + s := wcScalar(t, n) + var p common.Point + p.ScalarMult(&common.G, &s) + var out [32]byte + p.BytesInto(&out) + return out +} + +func wcFixture(t *testing.T) withdrawBindingFixture { + t.Helper() + fx := withdrawBindingFixture{ + userPK: wcPointBytes(t, 1), + cipherC1: wcPointBytes(t, 2), + cipherC2: wcPointBytes(t, 3), + proofComm: wcPointBytes(t, 4), + nonce: 0x0102030405060708, + } + fx.eq.Context.Pubkey.Bytes = fx.userPK + fx.eq.Context.Ciphertext.Commitment = fx.cipherC1 + fx.eq.Context.Ciphertext.Handle = fx.cipherC2 + fx.eq.Context.Commitment.Bytes = fx.proofComm + binary.LittleEndian.PutUint64(fx.eq.Context.Nonce[:], fx.nonce) + fx.rp.Context.Commitments[0].Bytes = fx.proofComm + fx.rp.Context.BitLengths[0] = 64 + binary.LittleEndian.PutUint64(fx.rp.Context.Nonce[:], fx.nonce) + return fx +} + +func TestVerifyBindingsSuccess(t *testing.T) { + fx := wcFixture(t) + if err := VerifyBindings(&fx.eq, &fx.rp, fx.userPK[:], fx.cipherC1[:], fx.cipherC2[:], fx.nonce); err != nil { + t.Fatalf("expected withdraw bindings to verify, got %v", err) + } +} + +func TestVerifyBindingsRejectsInvalidInputLengths(t *testing.T) { + fx := wcFixture(t) + cases := []struct { + name string + userPK []byte + cipherC1 []byte + cipherC2 []byte + }{ + {"user pubkey", fx.userPK[:31], fx.cipherC1[:], fx.cipherC2[:]}, + {"cipher commitment", fx.userPK[:], fx.cipherC1[:31], fx.cipherC2[:]}, + {"cipher handle", fx.userPK[:], fx.cipherC1[:], fx.cipherC2[:31]}, + } + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + err := VerifyBindings(&fx.eq, &fx.rp, tt.userPK, tt.cipherC1, tt.cipherC2, fx.nonce) + if err == nil || err.Error() != "withdraw binding: invalid input lengths" { + t.Fatalf("expected invalid length error, got %v", err) + } + }) + } +} + +func TestVerifyBindingsRejectsNonceMismatches(t *testing.T) { + cases := []struct { + name string + mut func(*withdrawBindingFixture) + want string + }{ + {"equality nonce", func(fx *withdrawBindingFixture) { binary.LittleEndian.PutUint64(fx.eq.Context.Nonce[:], fx.nonce+1) }, "withdraw equality proof nonce mismatch"}, + {"range nonce", func(fx *withdrawBindingFixture) { binary.LittleEndian.PutUint64(fx.rp.Context.Nonce[:], fx.nonce+1) }, "withdraw range proof nonce mismatch"}, + {"expected nonce", func(fx *withdrawBindingFixture) { fx.nonce++ }, "withdraw equality proof nonce mismatch"}, + } + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + fx := wcFixture(t) + tt.mut(&fx) + err := VerifyBindings(&fx.eq, &fx.rp, fx.userPK[:], fx.cipherC1[:], fx.cipherC2[:], fx.nonce) + if err == nil || err.Error() != tt.want { + t.Fatalf("expected %q, got %v", tt.want, err) + } + }) + } +} + +func TestVerifyBindingsRejectsFieldMismatches(t *testing.T) { + cases := []struct { + name string + mut func(*withdrawBindingFixture) + want string + }{ + {"pubkey", func(fx *withdrawBindingFixture) { fx.eq.Context.Pubkey.Bytes = wcPointBytes(t, 11) }, "pubkey mismatch"}, + {"commitment", func(fx *withdrawBindingFixture) { fx.eq.Context.Ciphertext.Commitment = wcPointBytes(t, 12) }, "commitment mismatch"}, + {"handle", func(fx *withdrawBindingFixture) { fx.eq.Context.Ciphertext.Handle = wcPointBytes(t, 13) }, "handle mismatch"}, + {"range commitment", func(fx *withdrawBindingFixture) { fx.rp.Context.Commitments[0].Bytes = wcPointBytes(t, 14) }, "equality and range proof commitments do not match"}, + } + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + fx := wcFixture(t) + tt.mut(&fx) + err := VerifyBindings(&fx.eq, &fx.rp, fx.userPK[:], fx.cipherC1[:], fx.cipherC2[:], fx.nonce) + if err == nil || err.Error() != tt.want { + t.Fatalf("expected %q, got %v", tt.want, err) + } + }) + } +} + +func TestVerifyBindingsDoesNotInspectProofBytes(t *testing.T) { + fx := wcFixture(t) + for i := range fx.eq.Proof.Y0 { + fx.eq.Proof.Y0[i] = 0xff + } + for i := range fx.rp.Proof { + fx.rp.Proof[i] = 0xff + } + if err := VerifyBindings(&fx.eq, &fx.rp, fx.userPK[:], fx.cipherC1[:], fx.cipherC2[:], fx.nonce); err != nil { + t.Fatalf("binding layer should only check binding context, got %v", err) + } +} From 30c424f5fffcc8ff4d613d2f5204bb976d7c3781 Mon Sep 17 00:00:00 2001 From: ap0calypse644 Date: Tue, 28 Apr 2026 12:25:16 +0530 Subject: [PATCH 18/42] adding e2e tests --- scripts/tests/zkp_e2e/README.md | 24 + scripts/tests/zkp_e2e/multi_val_zkp_cw_e2e.sh | 883 ++++++++++++++++++ ve_tests.zip | Bin 0 -> 18321 bytes x/zkp/keeper/query_filtered.go | 3 + x/zkp/keeper/query_grpc_test.go | 272 ++++++ .../transferctx/transferctx_test.go | 3 + 6 files changed, 1185 insertions(+) create mode 100644 scripts/tests/zkp_e2e/README.md create mode 100755 scripts/tests/zkp_e2e/multi_val_zkp_cw_e2e.sh create mode 100644 ve_tests.zip create mode 100644 x/zkp/keeper/query_grpc_test.go diff --git a/scripts/tests/zkp_e2e/README.md b/scripts/tests/zkp_e2e/README.md new file mode 100644 index 00000000..b0c771c6 --- /dev/null +++ b/scripts/tests/zkp_e2e/README.md @@ -0,0 +1,24 @@ +# ZKP multi-validator CosmWasm e2e + +Run from the Fairyring repo after installing `fairyringd`: + +```bash +./scripts/tests/zkp_e2e/multi_val_zkp_cw_e2e.sh +``` + +Useful overrides: + +```bash +CW_DEPLOY_SCRIPT=/path/to/fairyport/scripts/deploy_cw.py \ +CW_CONTRACT_DIR=/path/to/fairyring-contract/examples/elgamal_evm \ +USE_DOCKER_OPTIMIZER=1 \ +./scripts/tests/zkp_e2e/multi_val_zkp_cw_e2e.sh +``` + +To run only the Fairyring ZKP/wasmbinding tester and skip the existing confidential-transfer CW deployment: + +```bash +RUN_EXISTING_CW_DEPLOY=0 ./scripts/tests/zkp_e2e/multi_val_zkp_cw_e2e.sh +``` + +The script creates a fresh four-validator chain, sets `wallet1` as the `x/zkp` authority at genesis, deploys contracts, exercises trusted-contract enforcement, and validates malformed transfer/withdraw proof query handling through a real CosmWasm contract. diff --git a/scripts/tests/zkp_e2e/multi_val_zkp_cw_e2e.sh b/scripts/tests/zkp_e2e/multi_val_zkp_cw_e2e.sh new file mode 100755 index 00000000..6227c106 --- /dev/null +++ b/scripts/tests/zkp_e2e/multi_val_zkp_cw_e2e.sh @@ -0,0 +1,883 @@ +#!/usr/bin/env bash +set -euo pipefail + +# ----------------------------------------------------------------------------- +# Multi-validator ZKP + CosmWasm e2e test for Fairyring. +# +# This script intentionally does NOT build any CosmWasm contract. +# It stores/instantiates a prebuilt wasm artifact, registers it as an x/zkp +# trusted contract, and exercises the trusted-contract authority path on a +# 4-validator local Fairyring network. +# +# Default prebuilt artifact: +# /home/grider644/go/src/github.com/FairBlock/fairyring-contract/examples/elgamal_evm/artifacts/elgamal_evm.wasm +# +# Optional: set RUN_ZKP_QUERY_TESTER=1 and ZKP_QUERY_TESTER_WASM=/path/to/prebuilt.wasm +# to also run the wasm-binding malformed-proof query checks through a prebuilt +# tester contract. No build step is performed for that contract either. +# ----------------------------------------------------------------------------- + +# ---- Local network config ---------------------------------------------------- +BASE_HOME="${BASE_HOME:-$HOME/.fairyring-zkp-e2e-4vals}" +CHAIN_ID="${CHAIN_ID:-fairy-zkp-e2e-1}" +KEYRING_BACKEND="${KEYRING_BACKEND:-test}" +DENOM="${DENOM:-ufairy}" +STAKE_AMOUNT="${STAKE_AMOUNT:-1000000000000${DENOM}}" +GENTX_AMOUNT="${GENTX_AMOUNT:-500000000000${DENOM}}" +GAS_PRICE="${GAS_PRICE:-0${DENOM}}" +CLEAN="${CLEAN:-1}" +STARTUP_TIMEOUT="${STARTUP_TIMEOUT:-90}" +BLOCK_TIMEOUT="${BLOCK_TIMEOUT:-240}" +TARGET_START_HEIGHT="${TARGET_START_HEIGHT:-5}" + +NODE_COUNT=4 +MONIKERS=(node1 node2 node3 node4) +KEY_NAMES=(validator validator2 validator3 validator4) +HOME_DIRS=( + "$BASE_HOME/node1" + "$BASE_HOME/node2" + "$BASE_HOME/node3" + "$BASE_HOME/node4" +) +RPC_PORTS=(26657 26667 26677 26687) +P2P_PORTS=(26656 26666 26676 26686) +GRPC_PORTS=(9090 9093 9094 9095) +API_PORTS=(1317 1318 1319 1320) +RPC_LADDRS=( + "tcp://127.0.0.1:${RPC_PORTS[0]}" + "tcp://127.0.0.1:${RPC_PORTS[1]}" + "tcp://127.0.0.1:${RPC_PORTS[2]}" + "tcp://127.0.0.1:${RPC_PORTS[3]}" +) +P2P_LADDRS=( + "tcp://127.0.0.1:${P2P_PORTS[0]}" + "tcp://127.0.0.1:${P2P_PORTS[1]}" + "tcp://127.0.0.1:${P2P_PORTS[2]}" + "tcp://127.0.0.1:${P2P_PORTS[3]}" +) + +NODE1_HOME="${HOME_DIRS[0]}" +NODE1_RPC_TCP="${RPC_LADDRS[0]}" +NODE1_RPC_HTTP="http://${NODE1_RPC_TCP#tcp://}" + +# ---- Prebuilt confidential-transfer CW deployment --------------------------- +RUN_EXISTING_CW_DEPLOY="${RUN_EXISTING_CW_DEPLOY:-1}" +PREBUILT_CW_WASM="${PREBUILT_CW_WASM:-/home/grider644/go/src/github.com/FairBlock/fairyring-contract/examples/elgamal_evm/artifacts/elgamal_evm.wasm}" +CW_DEPLOY_OUT="${CW_DEPLOY_OUT:-$BASE_HOME/existing_cw_deploy_output.json}" +EXISTING_CW_LABEL="${EXISTING_CW_LABEL:-elgamal-prebuilt-zkp-e2e}" +WASM_STORE_GAS="${WASM_STORE_GAS:-15000000}" +WASM_INSTANTIATE_GAS="${WASM_INSTANTIATE_GAS:-1500000}" +TX_GAS="${TX_GAS:-500000}" + +# ---- Optional prebuilt tester contract -------------------------------------- +# Disabled by default because this script must not build contracts. Enable only +# if a prebuilt tester wasm exists with the same query API used below. +RUN_ZKP_QUERY_TESTER="${RUN_ZKP_QUERY_TESTER:-0}" +ZKP_QUERY_TESTER_WASM="${ZKP_QUERY_TESTER_WASM:-}" +TESTER_LABEL="${TESTER_LABEL:-zkp-query-tester-e2e}" + +# ---- Deterministic local mnemonics ------------------------------------------ +VALIDATOR_MNEMONIC_1="clock post desk civil pottery foster expand merit dash seminar song memory figure uniform spice circle try happy obvious trash crime hybrid hood cushion" +VALIDATOR_MNEMONIC_2="banner spread envelope side kite person disagree path silver will brother under couch edit food venture squirrel civil budget number acquire point work mass" +VALIDATOR_MNEMONIC_3="veteran try aware erosion drink dance decade comic dawn museum release episode original list ability owner size tuition surface ceiling depth seminar capable only" +VALIDATOR_MNEMONIC_4="vacuum burst ordinary enact leaf rabbit gather lend left chase park action dish danger green jeans lucky dish mesh language collect acquire waste load" +WALLET_MNEMONIC_1="sleep garage unaware monster slide cruel barely blade sudden basic review mimic screen box human wing ritual use smooth ripple tuna ostrich pony eye" + +VAL_ADDRS=("" "" "" "") +WALLET1_ADDR="" +NODE_PIDS=("" "" "" "") +EXISTING_CW_CONTRACT_ADDR="" +TESTER_CONTRACT_ADDR="" + +# ---- Utilities --------------------------------------------------------------- +need() { + command -v "$1" >/dev/null 2>&1 || { + echo "ERROR: '$1' is required." >&2 + exit 1 + } +} + +log() { printf '\n>> %s\n' "$*"; } +pass() { printf ' ✅ %s\n' "$*"; } +fail() { printf 'ERROR: %s\n' "$*" >&2; exit 1; } + +require_tools() { + need fairyringd + need jq + need curl + need python3 +} + +kill_existing() { + local pids + pids="$(pgrep -x fairyringd || true)" + if [[ -n "$pids" ]]; then + log "Found running fairyringd instance(s): ${pids}; stopping them" + kill ${pids} || true + for _ in $(seq 1 20); do + sleep 0.5 + pgrep -x fairyringd >/dev/null 2>&1 || break + done + pgrep -x fairyringd >/dev/null 2>&1 && pkill -9 -x fairyringd || true + fi +} + +prep_home() { + if [[ "$CLEAN" == "1" ]]; then + log "Removing $BASE_HOME" + rm -rf "$BASE_HOME" + fi + mkdir -p "$BASE_HOME" + for h in "${HOME_DIRS[@]}"; do + mkdir -p "$h" + done +} + +mnemonic_for_node() { + case "$1" in + 1) echo "$VALIDATOR_MNEMONIC_1" ;; + 2) echo "$VALIDATOR_MNEMONIC_2" ;; + 3) echo "$VALIDATOR_MNEMONIC_3" ;; + 4) echo "$VALIDATOR_MNEMONIC_4" ;; + *) fail "unknown validator index $1" ;; + esac +} + +init_nodes_and_keys() { + log "Initializing ${NODE_COUNT} validators" + for i in $(seq 1 "$NODE_COUNT"); do + local idx=$((i-1)) + local home="${HOME_DIRS[$idx]}" + local moniker="${MONIKERS[$idx]}" + local keyname="${KEY_NAMES[$idx]}" + local mnemonic + mnemonic="$(mnemonic_for_node "$i")" + + fairyringd init "$moniker" \ + --chain-id "$CHAIN_ID" \ + --home "$home" \ + -o \ + --default-denom "$DENOM" >/dev/null + + printf "%s\n" "$mnemonic" | \ + fairyringd keys add "$keyname" \ + --recover \ + --keyring-backend "$KEYRING_BACKEND" \ + --home "$home" \ + --output json > "$home/key.$keyname.json" + + VAL_ADDRS[$idx]="$(fairyringd keys show "$keyname" -a --keyring-backend "$KEYRING_BACKEND" --home "$home")" + pass "${moniker}: ${VAL_ADDRS[$idx]}" + done + + printf "%s\n" "$WALLET_MNEMONIC_1" | \ + fairyringd keys add wallet1 \ + --recover \ + --keyring-backend "$KEYRING_BACKEND" \ + --home "$NODE1_HOME" \ + --output json > "$NODE1_HOME/key.wallet1.json" + WALLET1_ADDR="$(fairyringd keys show wallet1 -a --keyring-backend "$KEYRING_BACKEND" --home "$NODE1_HOME")" + pass "wallet1/zkp-authority: $WALLET1_ADDR" +} + +jq_set_vote_extensions_disabled=' + if .consensus_params? != null then + .consensus_params.abci |= (.consensus_params.abci // {}) | + .consensus_params.abci.vote_extensions_enable_height = "0" + elif .consensus?.params? != null then + .consensus.params.abci |= (.consensus.params.abci // {}) | + .consensus.params.abci.vote_extensions_enable_height = "0" + else . end +' + +build_shared_genesis() { + local genesis="$NODE1_HOME/config/genesis.json" + log "Building shared genesis" + + for addr in "${VAL_ADDRS[@]}"; do + fairyringd genesis add-genesis-account "$addr" "$STAKE_AMOUNT" \ + --home "$NODE1_HOME" --keyring-backend "$KEYRING_BACKEND" >/dev/null + done + fairyringd genesis add-genesis-account "$WALLET1_ADDR" "$STAKE_AMOUNT" \ + --home "$NODE1_HOME" --keyring-backend "$KEYRING_BACKEND" >/dev/null + + # Local genesis balances are needed so gentx can be created on node2..node4. + for i in $(seq 2 "$NODE_COUNT"); do + local idx=$((i-1)) + fairyringd genesis add-genesis-account "${VAL_ADDRS[$idx]}" "$STAKE_AMOUNT" \ + --home "${HOME_DIRS[$idx]}" --keyring-backend "$KEYRING_BACKEND" >/dev/null + done + + for i in $(seq 1 "$NODE_COUNT"); do + local idx=$((i-1)) + fairyringd genesis gentx "${KEY_NAMES[$idx]}" "$GENTX_AMOUNT" \ + --chain-id "$CHAIN_ID" \ + --home "${HOME_DIRS[$idx]}" \ + --keyring-backend "$KEYRING_BACKEND" >/dev/null + done + + mkdir -p "$NODE1_HOME/config/gentx" + for i in $(seq 2 "$NODE_COUNT"); do + local idx=$((i-1)) + cp -f "${HOME_DIRS[$idx]}/config/gentx/"*.json "$NODE1_HOME/config/gentx/" + done + fairyringd genesis collect-gentxs --home "$NODE1_HOME" >/dev/null + + # x/zkp trusted-contract updates are authority-gated. For e2e we make wallet1 + # the genesis authority so deploy/test scripts can register contracts directly. + local tmp jq_filter authority + tmp="$(mktemp)" + jq_filter="$jq_set_vote_extensions_disabled + | .app_state.zkp.params.authority = \$authority + | .app_state.zkp.trusted_contracts = (.app_state.zkp.trusted_contracts // []) + | if .app_state.wasm?.params?.code_upload_access? then + .app_state.wasm.params.code_upload_access.permission = \"Everybody\" + else . end + " + jq --arg authority "$WALLET1_ADDR" "$jq_filter" "$genesis" > "$tmp" && mv "$tmp" "$genesis" + + # Keep old Fairyring devnet defaults generous when these fields exist. + sed -i -e 's/"key_expiry": "100"/"key_expiry": "1000000"/g' "$genesis" || true + sed -i -e 's/"is_source_chain": false/"is_source_chain": true/g' "$genesis" || true + + for i in $(seq 2 "$NODE_COUNT"); do + local idx=$((i-1)) + cp -f "$genesis" "${HOME_DIRS[$idx]}/config/genesis.json" + done + + authority="$(jq -r '.app_state.zkp.params.authority' "$genesis")" + [[ "$authority" == "$WALLET1_ADDR" ]] || fail "genesis zkp authority mismatch: $authority" + pass "genesis x/zkp authority set to wallet1" +} + +configure_nodes() { + log "Configuring node ports, peers, and fast local timeouts" + local node_ids=("" "" "" "") + for i in $(seq 1 "$NODE_COUNT"); do + local idx=$((i-1)) + node_ids[$idx]="$(fairyringd tendermint show-node-id --home "${HOME_DIRS[$idx]}")" + done + + for i in $(seq 1 "$NODE_COUNT"); do + local idx=$((i-1)) + local home="${HOME_DIRS[$idx]}" + local cfg="$home/config/config.toml" + local app="$home/config/app.toml" + local rpc_laddr="${RPC_LADDRS[$idx]}" + local p2p_laddr="${P2P_LADDRS[$idx]}" + local grpc_port="${GRPC_PORTS[$idx]}" + local api_port="${API_PORTS[$idx]}" + local pprof_port=$((6060 + idx)) + + sed -i.bak -E 's|^pprof_laddr = ".*"|pprof_laddr = "localhost:'"$pprof_port"'"|g' "$cfg" || true + sed -i.bak -E 's/^addr_book_strict *= .*/addr_book_strict = false/' "$cfg" || true + sed -i.bak -E 's/^allow_duplicate_ip *= .*/allow_duplicate_ip = true/' "$cfg" || true + sed -i.bak -E "s|^laddr = \".*26657\"|laddr = \"${rpc_laddr}\"|g" "$cfg" + + awk -v val="$p2p_laddr" ' + BEGIN{in_p2p=0} + /^\[p2p\]/{in_p2p=1} + /^\[.*\]/{if ($0 !~ /^\[p2p\]/) in_p2p=0} + { if(in_p2p && $0 ~ /^laddr = /){ sub(/=.*/, "= \"" val "\"") } print } + ' "$cfg" > "$cfg.tmp" && mv "$cfg.tmp" "$cfg" + + local peers="" + for j in $(seq 1 "$NODE_COUNT"); do + [[ "$j" == "$i" ]] && continue + local jdx=$((j-1)) + peers+="${node_ids[$jdx]}@127.0.0.1:${P2P_PORTS[$jdx]}," + done + peers="${peers%,}" + sed -i.bak -E "s|^persistent_peers = \".*\"|persistent_peers = \"${peers}\"|g" "$cfg" + + sed -i \ + -e 's/^timeout_propose = .*/timeout_propose = "1s"/' \ + -e 's/^timeout_propose_delta = .*/timeout_propose_delta = "500ms"/' \ + -e 's/^timeout_prevote = .*/timeout_prevote = "1s"/' \ + -e 's/^timeout_prevote_delta = .*/timeout_prevote_delta = "500ms"/' \ + -e 's/^timeout_precommit = .*/timeout_precommit = "1s"/' \ + -e 's/^timeout_precommit_delta = .*/timeout_precommit_delta = "500ms"/' \ + -e 's/^timeout_commit = .*/timeout_commit = "1s"/' \ + "$cfg" + + sed -i.bak -E "s|^minimum-gas-prices = \".*\"|minimum-gas-prices = \"${GAS_PRICE}\"|g" "$app" || true + sed -i.bak -E "s|^address = \".*:9090\"|address = \"0.0.0.0:${grpc_port}\"|g" "$app" || true + sed -i.bak -E "s|^address = \"tcp://.*:1317\"|address = \"tcp://0.0.0.0:${api_port}\"|g" "$app" || true + done +} + +start_nodes() { + log "Starting ${NODE_COUNT} validators" + for i in $(seq 1 "$NODE_COUNT"); do + local idx=$((i-1)) + local home="${HOME_DIRS[$idx]}" + mkdir -p "$home/logs" + ( nohup fairyringd start --home "$home" --log_level "info" > "$home/logs/node.log" 2>&1 & echo $! > "$home/logs/node.pid" ) || true + NODE_PIDS[$idx]="$(cat "$home/logs/node.pid")" + pass "${MONIKERS[$idx]} PID ${NODE_PIDS[$idx]} logs=$home/logs/node.log" + done + trap 'shutdown_nodes' EXIT +} + +shutdown_nodes() { + log "Shutting down nodes" + for pid in "${NODE_PIDS[@]}"; do + [[ -z "${pid:-}" ]] && continue + if ps -p "$pid" >/dev/null 2>&1; then + kill "$pid" || true + fi + done +} + +wait_for_all_status() { + log "Waiting for all RPC endpoints" + local end=$(( $(date +%s) + STARTUP_TIMEOUT )) + for i in $(seq 1 "$NODE_COUNT"); do + local idx=$((i-1)) + local url="http://${RPC_LADDRS[$idx]#tcp://}/status" + until curl -fsS "$url" >/dev/null 2>&1; do + if (( $(date +%s) > end )); then + fail "RPC for ${MONIKERS[$idx]} did not come up. See ${HOME_DIRS[$idx]}/logs/node.log" + fi + sleep 1 + done + pass "${MONIKERS[$idx]} RPC up" + done +} + +current_height() { + curl -fsS "$NODE1_RPC_HTTP/status" | jq -r '.result.sync_info.latest_block_height | tonumber' +} + +wait_until_height() { + local target="$1" + local timeout="$2" + log "Waiting until height >= $target" + local end=$(( $(date +%s) + timeout )) + while true; do + local h + h="$(current_height || echo 0)" + if (( h >= target )); then + pass "height $h reached" + return 0 + fi + if (( $(date +%s) > end )); then + fail "timed out waiting for height $target; last height=$h" + fi + sleep 1 + done +} + +# ---- TX/query helpers -------------------------------------------------------- +base_tx_flags() { + printf '%s' "--home $NODE1_HOME --keyring-backend $KEYRING_BACKEND --chain-id $CHAIN_ID --node $NODE1_RPC_TCP" +} + +base_query_flags() { + printf '%s' "--chain-id $CHAIN_ID --node $NODE1_RPC_TCP -o json" +} + +check_tx_code() { + local txjson="$1" + local code + code="$(echo "$txjson" | jq -r '.code // 0')" + if [[ "$code" != "0" ]]; then + echo "$txjson" | jq . >&2 || echo "$txjson" >&2 + fail "broadcast failed with code=$code" + fi +} + +wait_for_tx_result() { + local txhash="$1" + local end=$(( $(date +%s) + 60 )) + local out="" + while true; do + set +e + out="$(fairyringd q tx --type=hash "$txhash" --home "$NODE1_HOME" --chain-id "$CHAIN_ID" --node "$NODE1_RPC_TCP" -o json 2>&1)" + local rc=$? + set -e + if [[ "$rc" == "0" ]]; then + echo "$out" + return 0 + fi + if (( $(date +%s) > end )); then + echo "$out" >&2 + fail "timed out waiting for tx $txhash" + fi + sleep 1 + done +} + +wait_for_tx() { + local txhash="$1" + local out code + out="$(wait_for_tx_result "$txhash")" + code="$(echo "$out" | jq -r '.code // 0')" + if [[ "$code" != "0" ]]; then + echo "$out" | jq . >&2 || echo "$out" >&2 + fail "on-chain tx failed code=$code" + fi + echo "$out" +} + +broadcast_tx() { + local cmd="$1" + local res txhash + res="$(eval "$cmd --broadcast-mode sync -o json -y")" + check_tx_code "$res" + txhash="$(echo "$res" | jq -r '.txhash')" + wait_for_tx "$txhash" >/dev/null + echo "$txhash" +} + +expect_tx_fail_contains() { + local cmd="$1" + local needle="$2" + local out rc code raw txhash qtx qcode qraw + set +e + out="$(eval "$cmd --broadcast-mode sync -o json -y" 2>&1)" + rc=$? + set -e + + if [[ "$rc" == "0" ]] && echo "$out" | jq . >/dev/null 2>&1; then + code="$(echo "$out" | jq -r '.code // 0')" + raw="$(echo "$out" | jq -r '.raw_log // .logs // empty')" + if [[ "$code" != "0" ]] && grep -qi "$needle" <<<"$raw"; then + pass "expected tx failure observed at CheckTx: $needle" + return 0 + fi + + txhash="$(echo "$out" | jq -r '.txhash // empty')" + if [[ -n "$txhash" ]]; then + qtx="$(wait_for_tx_result "$txhash")" + qcode="$(echo "$qtx" | jq -r '.code // 0')" + qraw="$(echo "$qtx" | jq -r '.raw_log // .logs // empty')" + if [[ "$qcode" != "0" ]] && grep -qi "$needle" <<<"$qraw"; then + pass "expected tx failure observed at DeliverTx: $needle" + return 0 + fi + if [[ "$qcode" == "0" ]]; then + echo "$qtx" | jq . >&2 || echo "$qtx" >&2 + fail "expected tx to fail with '$needle', but it succeeded on-chain" + fi + fi + fi + + if grep -qi "$needle" <<<"$out"; then + pass "expected tx failure observed: $needle" + return 0 + fi + + echo "$out" >&2 + fail "expected tx to fail with '$needle'" +} + +extract_event_value() { + local txjson="$1" + local event_regex="$2" + local key_regex="$3" + echo "$txjson" | jq -r --arg et "$event_regex" --arg kt "$key_regex" ' + .events[]? | select(.type | test($et)) | .attributes[]? | select(.key | test($kt)) | .value + ' | tail -n1 +} + +query_trusted_contracts_json() { + fairyringd q zkp trusted-contracts $(base_query_flags) +} + +is_trusted_contract() { + local addr="$1" + query_trusted_contracts_json | jq -e --arg addr "$addr" '(.ContractAddresses // .contract_addresses // []) | index($addr)' >/dev/null +} + +assert_trusted_contains() { + local addr="$1" + is_trusted_contract "$addr" || { + query_trusted_contracts_json | jq . >&2 || true + fail "trusted contract list does not contain $addr" + } + pass "trusted contract present: $addr" +} + +assert_trusted_not_contains() { + local addr="$1" + if query_trusted_contracts_json | jq -e --arg addr "$addr" '(.ContractAddresses // .contract_addresses // []) | index($addr)' >/dev/null; then + query_trusted_contracts_json | jq . >&2 || true + fail "trusted contract list unexpectedly contains $addr" + fi + pass "trusted contract absent: $addr" +} + +assert_zkp_authority() { + local got + got="$(fairyringd q zkp params $(base_query_flags) | jq -r '.params.authority')" + [[ "$got" == "$WALLET1_ADDR" ]] || fail "x/zkp authority mismatch. expected=$WALLET1_ADDR got=$got" + pass "x/zkp params authority is wallet1" +} + +# ---- Prebuilt contract deployment ------------------------------------------- +deploy_prebuilt_confidential_transfer_contract() { + if [[ "$RUN_EXISTING_CW_DEPLOY" != "1" ]]; then + log "Skipping prebuilt CW deploy because RUN_EXISTING_CW_DEPLOY=$RUN_EXISTING_CW_DEPLOY" + return 0 + fi + + [[ -f "$PREBUILT_CW_WASM" ]] || fail "PREBUILT_CW_WASM not found: $PREBUILT_CW_WASM" + + log "Storing prebuilt confidential-transfer CosmWasm contract" + local res qtx code_id txhash init_msg + res="$(fairyringd tx wasm store "$PREBUILT_CW_WASM" \ + --from wallet1 \ + $(base_tx_flags) \ + --gas "$WASM_STORE_GAS" \ + --broadcast-mode sync \ + -o json -y)" + check_tx_code "$res" + txhash="$(echo "$res" | jq -r '.txhash')" + qtx="$(wait_for_tx "$txhash")" + code_id="$(extract_event_value "$qtx" 'store[_-]?code' '^code_id$')" + [[ -n "$code_id" && "$code_id" != "null" ]] || fail "failed to extract code_id from store_code event" + pass "prebuilt CW code_id=$code_id" + + init_msg="$(jq -cn --arg addr "$WALLET1_ADDR" '{allowed_addresses:[$addr]}')" + + log "Instantiating prebuilt confidential-transfer CosmWasm contract" + res="$(fairyringd tx wasm instantiate "$code_id" "$init_msg" \ + --no-admin \ + --from wallet1 \ + $(base_tx_flags) \ + --gas "$WASM_INSTANTIATE_GAS" \ + --label "$EXISTING_CW_LABEL" \ + --broadcast-mode sync \ + -o json -y)" + check_tx_code "$res" + txhash="$(echo "$res" | jq -r '.txhash')" + qtx="$(wait_for_tx "$txhash")" + EXISTING_CW_CONTRACT_ADDR="$(extract_event_value "$qtx" 'instantiate|instantiate_contract' '_contract_address|contract_address')" + [[ -n "$EXISTING_CW_CONTRACT_ADDR" && "$EXISTING_CW_CONTRACT_ADDR" != "null" ]] || fail "failed to extract contract address" + + jq -n \ + --arg code_id "$code_id" \ + --arg contract_address "$EXISTING_CW_CONTRACT_ADDR" \ + --arg artifact "$PREBUILT_CW_WASM" \ + --arg chain_id "$CHAIN_ID" \ + --arg payer "wallet1" \ + --arg payer_address "$WALLET1_ADDR" \ + --arg contract_label "$EXISTING_CW_LABEL" \ + '{code_id:$code_id, contract_address:$contract_address, artifact:$artifact, chain_id:$chain_id, payer:$payer, payer_address:$payer_address, allowed_addresses:[$payer_address], label:$contract_label, no_admin:true}' \ + > "$CW_DEPLOY_OUT" + + fairyringd q wasm contract "$EXISTING_CW_CONTRACT_ADDR" $(base_query_flags) >/dev/null + pass "prebuilt CW contract is queryable: $EXISTING_CW_CONTRACT_ADDR" + pass "wrote deploy metadata: $CW_DEPLOY_OUT" +} + +register_trusted_contract() { + local addr="$1" + local out rc code raw txhash qtx qcode qraw + + if is_trusted_contract "$addr"; then + pass "trusted contract already present; continuing: $addr" + return 0 + fi + + log "Registering trusted contract: $addr" + set +e + out="$(eval "fairyringd tx zkp add-trusted-contract '$addr' --from wallet1 $(base_tx_flags) --gas $TX_GAS --broadcast-mode sync -o json -y" 2>&1)" + rc=$? + set -e + + if [[ "$rc" != "0" ]]; then + if grep -qi "already trusted" <<<"$out"; then + pass "add-trusted-contract reported already trusted; continuing: $addr" + assert_trusted_contains "$addr" + return 0 + fi + echo "$out" >&2 + fail "failed to broadcast add-trusted-contract for $addr" + fi + + if ! echo "$out" | jq . >/dev/null 2>&1; then + echo "$out" >&2 + fail "add-trusted-contract returned non-json output" + fi + + code="$(echo "$out" | jq -r '.code // 0')" + raw="$(echo "$out" | jq -r '.raw_log // .logs // empty')" + if [[ "$code" != "0" ]]; then + if grep -qi "already trusted" <<<"$raw"; then + pass "add-trusted-contract reported already trusted at CheckTx; continuing: $addr" + assert_trusted_contains "$addr" + return 0 + fi + echo "$out" | jq . >&2 || echo "$out" >&2 + fail "add-trusted-contract failed at CheckTx code=$code" + fi + + txhash="$(echo "$out" | jq -r '.txhash // empty')" + [[ -n "$txhash" ]] || fail "add-trusted-contract did not return txhash" + qtx="$(wait_for_tx_result "$txhash")" + qcode="$(echo "$qtx" | jq -r '.code // 0')" + qraw="$(echo "$qtx" | jq -r '.raw_log // .logs // empty')" + if [[ "$qcode" != "0" ]]; then + if grep -qi "already trusted" <<<"$qraw"; then + pass "add-trusted-contract reported already trusted at DeliverTx; continuing: $addr" + assert_trusted_contains "$addr" + return 0 + fi + echo "$qtx" | jq . >&2 || echo "$qtx" >&2 + fail "add-trusted-contract failed on-chain code=$qcode" + fi + + assert_trusted_contains "$addr" +} + +remove_trusted_contract() { + local addr="$1" + log "Removing trusted contract: $addr" + broadcast_tx "fairyringd tx zkp remove-trusted-contract '$addr' --from wallet1 $(base_tx_flags) --gas $TX_GAS" >/dev/null + assert_trusted_not_contains "$addr" +} + +run_existing_contract_trust_cases() { + [[ "$RUN_EXISTING_CW_DEPLOY" == "1" ]] || return 0 + [[ -n "$EXISTING_CW_CONTRACT_ADDR" ]] || fail "existing CW contract address missing" + + log "Case 1: authority can add deployed CW contract to x/zkp trusted list" + register_trusted_contract "$EXISTING_CW_CONTRACT_ADDR" + + log "Case 2: duplicate trusted-contract registration is harmless" + register_trusted_contract "$EXISTING_CW_CONTRACT_ADDR" + + log "Case 3: non-authority cannot remove trusted contract" + expect_tx_fail_contains \ + "fairyringd tx zkp remove-trusted-contract '$EXISTING_CW_CONTRACT_ADDR' --from validator2 --home '${HOME_DIRS[1]}' --keyring-backend '$KEYRING_BACKEND' --chain-id '$CHAIN_ID' --node '$NODE1_RPC_TCP' --gas '$TX_GAS'" \ + "unauthorized" + assert_trusted_contains "$EXISTING_CW_CONTRACT_ADDR" + + log "Case 4: authority can remove trusted contract" + remove_trusted_contract "$EXISTING_CW_CONTRACT_ADDR" + + log "Case 5: removing a missing trusted contract is rejected" + expect_tx_fail_contains \ + "fairyringd tx zkp remove-trusted-contract '$EXISTING_CW_CONTRACT_ADDR' --from wallet1 $(base_tx_flags) --gas $TX_GAS" \ + "not in the trusted list" + + log "Case 6: authority can re-add trusted contract after removal" + register_trusted_contract "$EXISTING_CW_CONTRACT_ADDR" +} + +# ---- Optional prebuilt ZKP query tester -------------------------------------- +store_and_instantiate_tester_contract() { + local wasm="$1" + [[ -f "$wasm" ]] || fail "ZKP_QUERY_TESTER_WASM not found: $wasm" + + log "Storing prebuilt ZKP query tester contract" + local res qtx code_id txhash + res="$(fairyringd tx wasm store "$wasm" \ + --from wallet1 \ + $(base_tx_flags) \ + --gas "$WASM_STORE_GAS" \ + --broadcast-mode sync \ + -o json -y)" + check_tx_code "$res" + txhash="$(echo "$res" | jq -r '.txhash')" + qtx="$(wait_for_tx "$txhash")" + code_id="$(extract_event_value "$qtx" 'store[_-]?code' '^code_id$')" + [[ -n "$code_id" && "$code_id" != "null" ]] || fail "failed to extract tester code_id" + pass "tester code_id=$code_id" + + log "Instantiating prebuilt ZKP query tester contract" + res="$(fairyringd tx wasm instantiate "$code_id" '{}' \ + --no-admin \ + --from wallet1 \ + $(base_tx_flags) \ + --gas "$WASM_INSTANTIATE_GAS" \ + --label "$TESTER_LABEL" \ + --broadcast-mode sync \ + -o json -y)" + check_tx_code "$res" + txhash="$(echo "$res" | jq -r '.txhash')" + qtx="$(wait_for_tx "$txhash")" + TESTER_CONTRACT_ADDR="$(extract_event_value "$qtx" 'instantiate|instantiate_contract' '_contract_address|contract_address')" + [[ -n "$TESTER_CONTRACT_ADDR" && "$TESTER_CONTRACT_ADDR" != "null" ]] || fail "failed to extract tester contract address" + pass "tester contract=$TESTER_CONTRACT_ADDR" + + fairyringd q wasm contract-state smart "$TESTER_CONTRACT_ADDR" '{"ping":{}}' $(base_query_flags) >/dev/null + pass "tester ping query works" +} + +wasm_smart_query() { + local contract="$1" + local msg="$2" + fairyringd q wasm contract-state smart "$contract" "$msg" $(base_query_flags) +} + +expect_wasm_query_fail_contains() { + local contract="$1" + local msg="$2" + local needle="$3" + local out rc + set +e + out="$(wasm_smart_query "$contract" "$msg" 2>&1)" + rc=$? + set -e + if [[ "$rc" == "0" ]]; then + echo "$out" >&2 + fail "expected wasm smart query to fail with '$needle', but it succeeded" + fi + if ! grep -qi "$needle" <<<"$out"; then + echo "$out" >&2 + fail "expected wasm smart query failure to contain '$needle'" + fi + pass "expected wasm query failure observed: $needle" +} + +extract_query_valid() { + jq -r 'if (.data? | type) == "object" then .data.valid else .valid end' +} + +extract_query_error() { + jq -r 'if (.data? | type) == "object" then (.data.error // "") else (.error // "") end' +} + +expect_wasm_query_valid_false_contains() { + local contract="$1" + local msg="$2" + local needle="$3" + local out valid err + out="$(wasm_smart_query "$contract" "$msg")" + valid="$(echo "$out" | extract_query_valid)" + err="$(echo "$out" | extract_query_error)" + [[ "$valid" == "false" ]] || { + echo "$out" | jq . >&2 || echo "$out" >&2 + fail "expected valid=false, got valid=$valid" + } + if ! grep -qi "$needle" <<<"$err"; then + echo "$out" | jq . >&2 || echo "$out" >&2 + fail "expected query error to contain '$needle', got '$err'" + fi + pass "trusted ZKP query returned valid=false: $needle" +} + +short_b64() { + python3 - <<'PY' +import base64 +print(base64.b64encode(b"\x01\x02\x03").decode()) +PY +} + +zero32_b64() { + python3 - <<'PY' +import base64 +print(base64.b64encode(bytes(32)).decode()) +PY +} + +make_withdraw_query_short() { + local short="$1" + local zero32="$2" + jq -cn \ + --arg short "$short" \ + --arg zero32 "$zero32" \ + '{verify_withdraw_proofs:{equality_proof_data:$short,range_proof_data:$short,user_pubkey:$zero32,ciphertext_commitment:$zero32,ciphertext_handle:$zero32,expected_nonce:0}}' +} + +make_withdraw_query_bad_base64() { + local short="$1" + local zero32="$2" + jq -cn \ + --arg short "$short" \ + --arg zero32 "$zero32" \ + '{verify_withdraw_proofs:{equality_proof_data:"%%%not-base64%%%",range_proof_data:$short,user_pubkey:$zero32,ciphertext_commitment:$zero32,ciphertext_handle:$zero32,expected_nonce:0}}' +} + +make_transfer_query_short() { + local short="$1" + local zero32="$2" + jq -cn \ + --arg short "$short" \ + --arg zero32 "$zero32" \ + '{verify_transfer_proofs:{equality_proof_data:$short,range_proof_data:$short,validity_proof_data:$short,sender_pubkey:$zero32,recipient_pubkey:$zero32,current_balance_commitment:$zero32,current_balance_handle:$zero32}}' +} + +run_prebuilt_zkp_query_tester_cases() { + if [[ "$RUN_ZKP_QUERY_TESTER" != "1" ]]; then + log "Skipping prebuilt ZKP query tester because RUN_ZKP_QUERY_TESTER=$RUN_ZKP_QUERY_TESTER" + return 0 + fi + [[ -n "$ZKP_QUERY_TESTER_WASM" ]] || fail "RUN_ZKP_QUERY_TESTER=1 requires ZKP_QUERY_TESTER_WASM=/path/to/prebuilt_tester.wasm" + + local short zero32 withdraw_short withdraw_bad64 transfer_short + store_and_instantiate_tester_contract "$ZKP_QUERY_TESTER_WASM" + + short="$(short_b64)" + zero32="$(zero32_b64)" + withdraw_short="$(make_withdraw_query_short "$short" "$zero32")" + withdraw_bad64="$(make_withdraw_query_bad_base64 "$short" "$zero32")" + transfer_short="$(make_transfer_query_short "$short" "$zero32")" + + assert_trusted_not_contains "$TESTER_CONTRACT_ADDR" + + log "Tester Case 1: untrusted contract cannot call custom ZKP query path" + expect_wasm_query_fail_contains "$TESTER_CONTRACT_ADDR" "$withdraw_short" "not authorized" + + log "Tester Case 2: authority can trust contract" + register_trusted_contract "$TESTER_CONTRACT_ADDR" + + log "Tester Case 3: trusted withdraw query reaches keeper and rejects malformed proof cleanly" + expect_wasm_query_valid_false_contains "$TESTER_CONTRACT_ADDR" "$withdraw_short" "invalid equality proof data length" + + log "Tester Case 4: trusted transfer query reaches keeper and rejects malformed proof cleanly" + expect_wasm_query_valid_false_contains "$TESTER_CONTRACT_ADDR" "$transfer_short" "invalid equality proof data length" + + log "Tester Case 5: malformed base64 is rejected in wasm binding before keeper verification" + expect_wasm_query_fail_contains "$TESTER_CONTRACT_ADDR" "$withdraw_bad64" "base64" + + log "Tester Case 6: removing trust blocks the custom ZKP query path again" + remove_trusted_contract "$TESTER_CONTRACT_ADDR" + expect_wasm_query_fail_contains "$TESTER_CONTRACT_ADDR" "$withdraw_short" "not authorized" +} + +print_log_hints_on_failure() { + local rc="$1" + [[ "$rc" == "0" ]] && return 0 + echo "" >&2 + echo "==== node log tails ====" >&2 + for i in $(seq 1 "$NODE_COUNT"); do + local idx=$((i-1)) + local log_path="${HOME_DIRS[$idx]}/logs/node.log" + echo "---- ${MONIKERS[$idx]}: $log_path ----" >&2 + [[ -f "$log_path" ]] && tail -n 80 "$log_path" >&2 || true + done +} + +main() { + require_tools + kill_existing + prep_home + init_nodes_and_keys + build_shared_genesis + configure_nodes + start_nodes + wait_for_all_status + wait_until_height "$TARGET_START_HEIGHT" "$BLOCK_TIMEOUT" + + assert_zkp_authority + deploy_prebuilt_confidential_transfer_contract + run_existing_contract_trust_cases + run_prebuilt_zkp_query_tester_cases + + log "✅ ZKP multi-validator CosmWasm e2e completed successfully" + echo "BASE_HOME=$BASE_HOME" + echo "PREBUILT_CW_WASM=$PREBUILT_CW_WASM" + [[ -n "$EXISTING_CW_CONTRACT_ADDR" ]] && echo "EXISTING_CW_CONTRACT_ADDR=$EXISTING_CW_CONTRACT_ADDR" + [[ -n "$TESTER_CONTRACT_ADDR" ]] && echo "TESTER_CONTRACT_ADDR=$TESTER_CONTRACT_ADDR" +} + +set +e +main "$@" +rc=$? +set -e +print_log_hints_on_failure "$rc" +exit "$rc" diff --git a/ve_tests.zip b/ve_tests.zip new file mode 100644 index 0000000000000000000000000000000000000000..2a1a3bc6e34976c525e4092799e9422ae7a99796 GIT binary patch literal 18321 zcma&NQ;;rTv!z+KZQHhO+qS>5ZQI5!+ctOEwr%d3|D2hah|>`r-S0(4Uah=cPp&tW zWI@4Tfd1TYiM|2FDs&_JNKb!OIp*gI=C zPgo#euyar#p#LsP{}Dv{j|9|z3u>>37OBGm0j-k&0WtpX1p%(cF0O_a#?~%gF4hi~ zh7OK~?&b^ttN(w{DA)b}I_NKsK47ckLBHSRZ%3mmGxY{w@-KDT9h$B)+dsT5>ADm| z1bPt+(`Yj&rT96G3dSEuziU8%LcqvR@+}CMxK!#*>4jV#B=UesWB0n_@q!HNk@XW_ zWHw#)KrMcaGmaQ0adXMK<^3Y;;uRVt(Q}g(lL<9Q zPZW5_F6JN!!3eVBu)=T4mq~wnh^-?ib1<3tt2t8mJ=pB9r&APaV*xyv2#JI*3qbYv&?B3>yWILZCczDIZf7Fyo{-(_=7I1iyLkFqrvalL!SvOwUtd zCn<(rEST$njkZ%*Qxq#O$t(mZ4+jR75*87k!!#F}!DU>h1Z@u*GAY!2(v{N*I2XYf zwem<^s?`UNu-JekHUk96_d89pUjOMXxGEj5yu!qGusmn<4m3bX5~?Wz231ij8$zH- zHvzSaiqY=R-}-n2?^}gmGyFC~x336?084y?c!Vz>{@l$Ad;V817muxUCk}&P%uQUVG}y4f$GJ8&44tj3pHcp6f@dq`fc6_`o6Nf?E^#PoX`OUJ zd)}0D=OQ{?9ma&MR|(nQ6W)pr^L7u?1 z+PXB1XyGl4kkTDH2fKgAE%$p8K2ICX6@mxhhqusuSZc$9C7|;=4QyBtpo(3H)+BNb zscWaMlo|3~RrZ3m#0a7lP&1iA5**M|O6_@YsB&O(AzCEhMcO<>oI=Iy>duq1!AhE<9^-w>{$%$-Di$}xQ38wS2s zF?wQI(N>EEHGCyOHO}HVtjJDxRWUwVu3GwiR(ZMKj~sthfLOpzblKF|J4FvU$9eCZflqE}8bY>>1z2gP&AJZm+8-SS!PSO^c;7ZV62 zxr;m>*Yb5yta&Czo7VRB7)OHJDalQL_57S$gHbSCETTV|>bgkb?m)-5OU^^rsIpRU zDqn8O;0jATXHxx*gA+U0a<$>AqTK2Kkm1K>;!eAsgvK2~CoutbJ7r2u8VdjQIH&6=X9aU%A?U|77Gxzxl2JM(xfrJnYLHbT#)=j?a~r49j6;yI@nc3<@P85ySgw)89vX+%xGRY@_zWBD%a+PE zRX3hxa*QC(Gu(%?RN!oUTW!wbW3vE9rzm&mU}t6dv!g7G3KcFuAYnAZm--b!BFQr+jE=DraO`ZOga-h{C-ZXLU`y$x9m{r zbzLKfe;2v`(7OHhX8UjOQ1kSRng+5ZT{CFZo6Y9qE20=nnNG+|HoJZ(?QDIi*SV~BFZBffKCK2A2`S6|w9 zQieHt;u%P5DluEIMDB1xrU5mx;IXEHSO&Nn$}&rq zBI4LgPhgDvuI@Cpn)+DCvCQH=aM+f^bfJ9oRK7yS`<9xSNvGk}eo1m!5df?*asVB} z^#J!9Lu-nJ<)ouvI97~G&(K@?)3A^2i#rDcdi2uU>P^_|?OT^<=wls2W$Dn=1{IMq zmW;mPv-?*Br|>aFj&uck8sKlj-QL0dPei%FdL})QGn?QD(rR#8e|jLUQE?}ARZy2s z;CKQs=K{fBy=G_CKYVkuSAXN5L;?78CR-#`gF^`t2&^j~To6RcORTnUFeU;?+F;J} zNOZ-DS))INh)KO&7aR2T52uog)GZ*GvVmk{EUlmu_lKpegSDrddAj-qVMEnoN_5(a zy0s7bnVGRZ0Iuib9WkjtHY77;Ur~jdf=IAh(HA~Y%1*LUS-L$DnKUw0lb(?vbfrM1 zHM(OP>wWhfaWb*uM8)*%iRA!PKC)Y*=g)G_urHyEJU31HGWoGZd;?{)Q4sL`Ey%Oj6pxR5JAh6CpjC4$k!Fm-Lq;B+TM6 zPVlG_F`VV7K@PgK>SL`^gWx`sRA_IOM4d*6-n~!DQk}7ug;M2SK0l2u4Ur+KCwdYR zO%eFUPJb1@_@eNQMb6e^bm8`Hyu zmAc`Q!iY&K!(0|Xji#CfA%8-{bJa!yjg`S}Y?gjPd(^ws#QLh5aH3f4(F4xWoLeA8|t` zuPwIpNaTw6`wx;joL~#Ww`8F~F2_2}{xqld6Rvd}aKDTQ>E3b8TP0TDfPi8sfPh&4@7?={JpPx1e>bW8kAq(- zRc&>tUUw;uqW7_*ypd0FvO-4DRwWY+bkWnz^XUw5o_ibqly$%a>L;6u_sPp?CKN-8 z8ND^>AEd;+Nu|7z6|`%1LdZaP!^wqa(#8?K9=AJu7cO}Ko00q`e(xky0JR8Dn%+6xuI6ST}_R>4^ag8MGV}xs@co8!}oB@M7Zvk_-ejWjv$9CJPxnT1LZ!eyV0b6a zePuMbiZT=oLhWKwNCC3!a0(9WMENUw$_)^dVL@|DG>9MIOe{5)Vxda3Ni;r(-Glz# z!vYy1Gu{R@K-pUdd@Bv-vkn@^7dLA&@Z^Nenh)5K)141?2mN?6`M!LDWP6s=7yC_# zjQQmoBP#@ZhK>iiuZP=?k2~YQ2+p%a^s?kz&I|TnzL zF^5qD2C*rTHF*!Lxw-f~pu|e7Ubz)5C*JTrJn)gp_W@XWdWA%F>+o;6p+T7746=Qq zDn&*(RuJl9EiU=R9Y)gmqq?_pSv*kHf1@mUG5h%Ez$}W!P@jQT1hbpT9`wonV2_Gb zpthg|uThSJei?bT!GG0%4JYyQt%o0_EZqMEGQ@|Ipd8BK zdhf(~nY&qPKKKWOj0gWo8ufhbx+ic+h({E?w6k=LypXHk!{5pnJ|2?N-k~AGk2@9i zF=@w0I8*X$FkGFIOEQ=3m-&StwUT6neaCP5#Nl(Bo%6ij<`R_+u#h+yvN8i9xxenT zmEl5VABCR54_zE0CHh%UyHo%;LIku+{u}|zTg>URt|5meqEuLa%(JUT5l~K93O$`T zuWetL1$du;WTYZSr>BnVKY8s$Uo(+=a-3(IV|h)ffIZKr@o_$aRz&&EvyXD!wr%lt z?`h$G?_J#Xc|LsO>LuEO51xg1zhkxxMjO&^>D94^(i0}CVL+VsQx^6_v1taqhQ9vk zb<$pf67`C8N#?TRR$O3nwjaQ&W1g7+mf;KnlLwQ9>XndXYaS_hH%YuqOnjFZ6@jXGEVjM%-%(yny7a#-9Pd>w3Z_Lz#0KQhci02Hqpk}fa^xgM zaGn|2-C{MYxo`B~mt*<5zvbWhO2$*zB@SSP(=b6;T2fl-uWxQ|kRYc2F*?+7l2I|z zP6RU4ioCw4)A`)MYzRp}?QcvZOAQIZ`~8&uQ7N6gsK`_yR6%1!BV`tN$IH7{1CYZb zf_6>+7e$m=@X2ezou0WAc6Wm&mDZS3DSto0W)e^Br?2iK2fQ~7eeDw9Nl?SsvJX-B z4Kv$5YGAUEt+bxexmvG$+@oJEJrMrBw}T`m88A-%Nk&DDMd1K%{Yzn4UHIP^t|Du<0;EA+WisP*QmZ+IXFSb(Z;9{v3(iQH7Azo;MXb3iEH~ zBE!s(NltiJZ(*`oJc4@Z8mOsdUU_b#HX9{Mv{ErTNmfvn+<;bg;>=8)o**!*K{kD4 zDV_|uOtci?cpIKA4FE(YQ7}C!(1M^nx}kL<#Fr6K71kOD9bYn597`0sCj&04e0%I! zpGtgau_e_yti+CH%2-csU`c4-5$i7ztmpBJ4Bt%&Msls{EZAQX3kDY2U8*J7D0C;r zu5cC4(O!8}OEa>5*D+12G$JgXdmWwv3>`h5lM{KowI9Y;roU9^&NTa)@y5pWEL#$6 z8qm$+Or2dlSA-ipHXQw-&S%W7tyN8TqzOFTV_LitxG2XLEGQU8x5Di3+H@C+eVcCb zKXx{9Er9q*AXDrGzbdskl`!{hd0&b!>I%M?^eTIj8tbv4R3=~eNf=@EY+3B(;nRDl zOWE1x{6d%x31!8a0|&k; zDz1$4xK;z-zx(+E{C@6X=3ZlVMS|aW@wxo=1>2?5*uN3{yUbyk+Y~RYw24TP@jlx z)y`tTo${A(AW~&+>Wc=mnF=5Bz*A`~Yw}%5Ko(%v$QPN~AcGg8MClBei2FUnQPnyu zJMJ}$=hq&h3IQ578F{XiJ);3!of~}Yj02Tu21CB@HuQNr+U=qrsT6g4I&RB1d)^m< zic_6^M$0hOeA9wE)zvUU)`yqq3bq{WbgXGlc-$o11q>d1A>P=TRAdSrp8tS_7(jCP zGXksT)Wn{0FcN0l1TQ0CE@a1cx?gcJHH&3v5!f6*L z^=^18Ax&4#(L{!YE3w2x2=|MYtq4OcV9;XAan-|E|R z(;+F)2m4NW?q1B?4v$Ra(H%_~>?($aR#6u7yf7gz)83E5q<_DFhEjE~m(s}#2+84- zznJ+(fuz#75?9AyYw$F?S}5Q<6r-4KND*{f1=6SEg>om>6}e|UqI%e#PD!QB75b+r zRLp-i+hn->3|{S8q#Wv~q`3J?FAuK2R1~Av4bMn!tAVOl({+9!qxpGF4XV#;O$b1< ztg!c2NDXAISF3e3c`*8Hx8x@uS(B86JztfigarA?^lFwA@$7VXnY+Gg623bkX| z(B8Ns$(Ox39*!B{X!?+d&1K^etZe}2u)2o&b46+BVISC|hG7U`HxULS%Pw|yHWF~X z>VxW(vFfUqc8)`WZ#wky5bbWR(_Jz=tY> zy{+Yl9d!?(9Z2-%|4<~O*sM@O^tEU;CmW@5vHZd^U@%!xD$#YB-n~49tJJ;pt*`#< z8n$V!sr?sPSc-|&h4NU*;{Q2C5v{d>ZRi^BjT@-9#SQ9SQP?kmsz(ZNq+~KCk#7>8 zt{q70BXHI*U;1{ZuSj#>R*YvPJIhp`6xjh*i>IEZWxs$-_Oz>zHd0KsvY2))TZBw^ z^j_YWHS|KpbWVkmX*qsIb(nh$u4c@iewP=`PUN|X=L)-XMMskuCmxxd(tCGRZ zppiKO-$%l#Uxq|eS>)C4n}U zKyjHUi~ic&|A4`#+ZPgo(dp(UNWTd&0@g?L$B7|JYTCkoZLio+#1m+&J(6L%!mCz z16i!g%m%n}`#U>Cbx|xCYOP?4j`Z#yi%i}-F)d< zu<7|$`2!w3368StHrW8cd2YivW#j{R@RQusvj-2Y<)1qObx}RzVlN#<^0-J?8fGoyWb@Ot5iG|ohSrB30ShD7W5(TY`y z`hSSL2<3+*LuiVI*%&oN6nP9)bC{sqds4#!1*+S5Mo^9tQS+QranhmSn@>N{n>DSf&V8#1=m1i1!DmL z1t|gnk^b)q%HGY+)!NYA*zW&8Of!5pE?aF)zb|N1N2s#)R8h&_Wop*?lJb1gb_qx2 z{HWb{iJ@d;Xp=~#c5ACyUuS)zKYoPQe3Lui1B%M=IY;hwTS;O@z;v%ZLFW0sOVXap zje7mV-{6f@1?*fgQM1W`q5oNIEWhByQHlk`3T9dsegzFr%q_<`kgOG;Fg8@44JQ-G z`}&NLESBa=Vk`sjaUhWcBm`oipDIt7E5b4p{l1GTJb#znoSiz3W!X`Scfdxl1s2WPW0|fae!xp0-an=##rAkuH5$( z`PSl{35|h>Kt5CD^$D6I>uV(S3iO(A8$q%l6%Lu14>d1`o{3MGZ{5bWFX$+iJto*p zh$Gq*IBZToU9uz(BC;d#1|+trts!7B#2M}_4^#?2ipjfh1#kKZbLtcJ;v_f6>|dFd zIq$2N@=IryG35vc+&@%o@p^Uz`B)GQ4-=o?lrRgs_B$PbmUA8i6%i8*vIK7kd$0+i z_hpupAPL5RHa)ooc>E)f4#$-gN6hA*{@MNhUEdDy_?}+Ce#I<^=vtuvt{jxbda?0! zebqHqd+_?>Sc~2AyUWMT&xe#cK@jeZe7b+*`733I8vr*d5a8|Odq2j<3x@KVcu5$X zne^Z`<9iDsAO!=p5IlC@{Q&%jSHSm0hbWC7?!_PTbmRBK&etY-W7jm`0Xs>82Rc8Q zRE<^XgluGdY~f+L(TnJn$Et@{fXA0rz)#QyCJWPK2erWOf!m7Mbf)CT!!&U6m^0(p z;9qmWZ>TYRD%8^n@$3$f*w#d88EN{W4UUgn+)vk7(5ltJKLw>VDX2CPtP~1;usTxL z4fJC>b_GR*nUtd?R-uyi-riQxeSog-ZRFfep2ktBhf3%M2Gb!x()ZS(9j6`!^~UY3 z3ryhiop~UkR>So7nCXV|a||IULH~O_B*6f)VHA4zw%<2Pg{*DZxWe?=eN+E^4$EQN zLe}@%fUcEs5DPKzf*+_nfhig4tt2Dqg5cRD^X2@6>1tux7|k197Bb;3evGOQ@~&E+ z@O6)%Z(ER8fL#@73Co&eJzJJ()<|d2)evP%zk`5p+^EoTfV!}V;+jXyme(=~)@UD8 z*!i?hk#q=@=?37$4t1@7+At7x7tEN2O3=j-@E zVUWnilyL?>u$@>_*j4&8^+_l9i`0HFFmf4FtWfj3Obe}$1O>8Zh+JtIQigk`yaAdw zvzvoW|HCZbDSZaoXpkyGxM*5AFJvMQinA=Z zlmL|aVV#WP6^yPMeoiKNhJQ?CfNW?miV+%~IWf`bwkU9283eDjaJZW|J>vK@>IjGd zX&rclw9RP)J*#^H!~vGBc0YS2nY-Z*#u^GI5$Ga_HFOR%k<1EOG}TEfIj~ENVL}z_ zU8o$FqUWzaRx*>w+bC04(7U*VuJsH`tK<1LsH|7;?jtBy%bt_qevb^js9*b9#q27B zmew>A+-f_dM1ap+`4+E4yQ8kFM}qP2Zu*JVEW^%DTYD}37zNPcUTfEoAV$S?E!`sS zWlMW6Yh#yR^;{c%cfYNjy&Lw;Yn!`J>gQM?BJH(8?9HyxT5(`FYomJ`PkyT10L)fsa=JD82zp-44nC)V}>=M>_OeB9S9IplE_2MH+BW)kX ze4OK3guqOG*hmfmetrS`RP)VY)A03%YEMIUig$@=-2kPSk>4G283w^w{&GF$OcR4`d8AbdIlW}4WxTARmpF2_c0c%G#r9GT1 zPb^lPY$@GUc_FB6azxFpWOBpO1SxVUAC(d*FI0+m%igi_tc!mcDhwRqO9jpu#E{`R zF-fr?S;?sCZe~pBR9WjP(sPW&HI78THm`8U;jCr& zxD}%+cB5$_P>Y<+axj-#IZ;m@m1zIMN{r1E-&T>hONU4%Y+0odshEyG8>w~^bQ*=F z-*r3k+*qEI$uk@-JfDv6uonmx^huGLAQ7e_4$2=Y^NH`zo71 zP2c{n!<0jl1)({n=EmSr)`TcwEbCM|-`od6O?#XqA&Hq+i(4Rd`BV*CTP|Wq{uq4)LS3*Ij&_mHc<||bQFbmu^sFGEE-t8K z$fs2fSnW9CxaO&GsXVzfm+LYp`h*5F>bgO*X>@Dlav5S!O$vmIy?*F!ajjj6*7iJt zFZZcbE6_ywi&4u3J5U1VU5&-qZeUaDr3%7}X@JVwrC7mQ%xW~M*A<#D;#Lvj)XLC( z*^S{k<*-<3!%FaQl@Rqhst-mJ;HHm1$TPHFyzFRlMQ!jG$T;F&E8w1HoVuei^co!o z-fVg`BQJQWc+XtrU2L>r=~r&*uhq;Yx%F)wahHD(MmI^y-tZyI^nlI2D4i3tlOEAY z#5|+9>C+DRk^*x!_z4Ll#*P;u2MaNv@PJQGSdn79GtDt9R0c6vbjxr$duhvXzz?R8 z-0}2(R?#21fM;9LqP2Slb#Ozm5Z&7<4}MrDQp-H(RSe@)-~~l7CbtgIT4OJztf{x; zv76pDZ&c87pVWh?EAQMs^MKDmAqS0S4#4iTWlbVjSO=TIuc7O{bI(jT+=SC{HnG!G zsYaC4FyPo|iSX(pC&_{v=I~#1s*61D7-2@0tt52v+J9`z?i67SlMXJDg4GV+b+-F0 zp|cK8_EM*}bIR0)@ziAl?HER;u2|z!PhIq=Kdbb(1r=BxnIzLCG2Ldkp@womELlpT zD~hM8jiQOO)cC@*nfD&t;0b?oN!E!MC`-e`%FKB-+lS<928&D3XKPkE6@qTuKb9(ANbI$@66$hExiRkFIX3_H|&P}x#W_Z zRPh#{2q!p6ga6o(gxkPQvr7hYMJbd}Yd2so$Xq4Mlk?Kjwp5yTA3KO;+jjBbyL8(n zb^B0SF&h0+Ousr#sSv0x7>RKJQ8J6Vk-kHb4LZG3XE8pGlVnCZUQIlUelb?4`tav% zA{MKDIhLnPftJSp>k9B@BkO<1dU_`tmfi&p$|z0r8l4k!N^~7U|cDXMQNgR2(9}QArygbcdarep=4Rvz>!Un!_AV1<3~l z!AJa@Gc1gY9pwS&@ssTz^l+1(63#HMzN)VDT+7k>(9(fFPVnLBxFUt2R-rBCV;wZB zt%n6`S$Aq4JNVM3UG8C`>!5NoUjjX9eO3~D(;D#2x#c?I1sCs^zNocs2c zF;RlI0h5zu-UF0$LEd;PSbrm|aICI0t*K&BE5OZh+M)#x{y_(ZFR|5bb%e#iz1%5( z5jpxitbdfyy$_2d(w$>~#}<|nn~G>ts;Oa&+~x)md-j+*^Xlsmcxftjsm?TIPg$ar zSd#n`DpffuLXu7BGnbJ>Fcj(9m*ATP1I>}|Nu(nj{*3^(;IX|4!gX3l&aiLfvPA+L zb7DZG)*xBb`0$h~T`@TWvt{_E#{8-_(2)|ga#wWcHTtkHm#dC+(5eB=lOrRi=?znQ@OYH zqw}LKZl5PR{!<5XOuAHS-zci(wVqOll{O}dm-Se*K5-HX8?kYh5L&eq8`ih!04>gw zMWz2u-(YkO-Jxp3u=+>xvl0H@js$-uk3EQ{+mMN3`!c8iOG#?F>JpezNeD7QrH-?$ zXvo$fwkqtKjE>}4>F*q56;uR_FTIFM%l%7fogrxMo;5+9hW`GK413*nS=0TqQfh`T4wLo{q%Kaf>ow&DUI778W~tES-Sm#B-ViT zH%{|(GP^%AHdHS}q3kIJYQ?x2A+3r@i0pVag*!_np2m)~PXY|R5FxM&Y$nV}-td4w zRu643q8`Wiq>A|vXb$=yG}>$B3pAY;L~bo)J$3CvO-$*;1E!j|4;3f|L$_Omxw|k^ z+o~C%o{^DQ_Sl%%x3jP*@p?K#_NatWsYow9r&nCL#Wkrrv+*jNrQ;piFyKxAXVbUbJ_NeCe;m>4Ur*96#OJx3yISEWje7xAsO>v>1pA+9-?w zsIxCqVOLDJDaeX?;1}i3wx;yfm$?0VS!I`;bW)t-C9vq)f>d>l4tC>HDpIS--}5e%Xc>C+ph*>u<0l4b zR7;#>oo88VGrR>PyLY;%y#1++?_IK^J%l+W-{~7#7oc7d1f=7}4MZ@ZTTKrN>Esnh zpyehGvmq6&x?@og^(h-!aIxYZju1L^knVse4p9_Yi<#lVD7FWA7`K2S=8VBEjLTL6 zd+ulEW-bKzp44RGfRoR>aqCq(z9a$DtTp<5B`aa=WT(ecXl~QY%(w#lT(u@YXP*Ml z9syp_NDFupGdCiQJALIy-ubA&!I0-4&?Hx;%I{mk9&m=f#~~2wpYaNTCT!Z*2k1V+wx{RV3Q~`15ZBhQh45|A8Az7f zC`^z6(T6uK=I1M`ww7adl#P#;oz)D=u6Ivx#Utpcevo4K=&xPH2_)s3~= zBK=2gx({>k&9wEvNHr90_M&!r&&%EK=brDYcM{`00a3k0ohLW5G5TOSr!?z9iOjRu z7uEfBTT`~8mRb0@^l_C++Rf$O@6+BfTEZAn@m~in%MMI#hONBpti;Gs>EjfK5+X7; zkT}eZ)@mAQ0Z$+Vf)1{2vI2+Y_w(6-Fd{b$}xpI;f;W@v#v;xhstoJfm{Anf=XimL~w5 z#OK42be|5Xpfm*bzT&GtxqZC8u-W}1(jd!7hC}xSJ!3lfZa{~qQ*^Q{?z^>Ff_#eZ zkC|^=hGeBkd5c%?@4r?e_HuynDGA{;~h!koEPN-U9v zI-O0V^w$FxX$ooEb>Xcik-)b(`l3vh;})g=oS{!M!=9-{jin{b9Kr-Y3DL`?_r zE!KFFb!mY~^c;Zj7mU9grCJ_V0XaHtlsBCao#wO!z}{lZZP19UzMML5afiHS0cbXv z1K}r#p3mX=%_?7CWxb`{>%CMYd%cN~$L)T#HJ56CLs4U}Xw1`~0FO)dtnyUV%!;3P z;e|g{dU^H#x`}`HY)V-+fb|Cy*L~gR;pa*oU)J6F@=|5I4eYWsS))X%H;a9HJ>g1! z4CytOmWYtV?takE!K()8%bEGDOys;-cI6ny*yzcvR7TL2m!HRZ9bZwk#8G?FK)PMm z{hk)yD41np_MA$+H`D`67{?#HHS0L2Khit)%W=`vxh#Klw~`W=oT+yc%7}A_W?@zP zpxbCQYG8wKw2s|$a7tq5rn?b2vCfwNPW|FYm*YsX$l{DkYVNAU8BUXAQRHL(eZrhm zZ>(CPM32Eq0_|c!;z?AzP(V8-$LsbYShMCFk``TP?*9#-;fmq55AxlA<@Z7e(sRhXj z)jcFv4(pD%6yuMGgq)zxz3Hh%U+S4|RsYx9sD}KMIv*|S>)z?=Z%@#PRFeQLlBK}B zV@b_?{AFT^B_54Ge~Zo{4=bFs+{&=_?wIcDzB^dN^PSe zXgg}E%)g$JG^_H_F{drI7N`%Yll9v)>K^;epGlGo0&W5!|4ngTM&&VJFKCb26*h z+;I+cWK`A^`JTzhaGr$Wlp&gu!=eo+@6J|z`0=|vdHX%0=?&{1pc#~P@_|Me5d!bPPs0PP zhJlXYl_!Jy*E4*$3H~E#f&u(2$cveN3Okt}bW)y#d%&)l)WP^ppj^0eyHi1X0wL&J zMiq?_q<9Aps+Y zG6)6Dp~EN}R!zBa6tFdw<1^rZvzXAtVf5H;y*lp5tTZOQbXm%?^MsI+g##lO9*zXX z@bL=D5>P8};t?su$nDb}dgE`jZZMHaHV%#SJK?FQ@Fp~(=;5*}CdhJHr}bnn;}MfE zUz5>Dfyz13jut&%1ranpshR$e!K+CpyFMNseoqeu%-$&NkwMrqJd4P#d4dSE$|nU9 zQ6N1uw3hN%N}im99x-D7KB<%R{m_gcq-h_AzuFY2CBx9vtQjGlW~XI2baLWVl`XSE zSH&wON6kwQW=<>@m@Jj1$7t65p%{lVbtEHD6A~F3+hfQhiPZQ^WSPxOGW=+2X$7IM zWUvtKSmQGafvmineqA05q8i<@*@}yL4Yb6ax9VH(Ht9sbgTh!d+uX@bX3nugVP&?+ z?Dovto<81uY>1Lae)eZE-nUo0&+E)CW0$h!mihY<|H+8(V-;o=i0PH*{Pbs5dgt5t zdLx=66Yj!6>U^(Z_e4$a!uvBRLym~ytIqoJt35eP`FOlc`*84jaP#q|qD~b3@ZER@ zE8~U_CNG%(A|d+mqyO2T_%OS7utJDe+$)f?>iOPX^VwMx?0kpN?8VNP^Jl1~>3@5v z(8YkCmA-}yF8wa6&p5-wgNLLHwtk++)I(V{QIMF3sfZhUzaHSj!6SgFJ7JWn#DC$< z+r530!2G>>@pya9_fM#vbDxX;_>lei<~Lah$Ap|#kV1awOyYG8PVawy8Q0g-;c&oV z>_^okd)}6%9u8Ucd>6cvJUTG$M(kGHXNkp+cSq7@uIj&M<7={$_;;JZ1il56I!O)- zCx+3fXYMy7$~qn71To``>SAPOz`ABCVY(Fi#*T~r2vVF#c|QLRzJ9y-a?d}A73P4} z&uV;#2I?E`kAep`5=jWbw4D&q5t5KPZ|0F-d{7Y-gD@ajqmK)}6=$Cy9DD>z8?Aw) zz-&=^j%ylhI$oE+?8+`aJ*fC^0z_uD2Ul7iQ0DU>z*6N1t&ZDWG|ArU6B>5lv*JM48zq@Q zNt}hY5Ran8sK(3wFo}7fcPopb9i#_dN9p?neGmN^*N{tze1)0m4-!VR_iWb2sF*q^ zPlH6eS5>HEs_YnJGCF>hq|z3Y(MX_bxp%$n=2KNO6w4wi#j^IH4g<3ouZ~QWx*j$p zLR8wsqkiHWxCZ@oi~zQgj^0#upAiX?z4QCoxHX;j`mFi-erQ>{Y8-z}**)q#YioV; ztN&Wh*O|*_{k;FaSkB^^tFiQX-F@~Mv*0>;Xtvg@6ttP2X$|8Bw(d~uM52^r%kL3H zb@%@?_$Yp?=<8dn?EvMjeGHOQz8<+2hvJ>mr&SDaFrI20dJaKG4fR080_fPkF9JDP z-UDqMe3f2)qO|1YLoo7Er70wmRJa=oT=x=1fpK9A*%iT$A1yf(X7lz^n1?y1YjZ>7 zdd-OBC1Im>L@jaJSyv6(Ts;Lj5$Bers!1$<(&C*t7z^K>R`kzD4YuIKH1P!e7%F z_dIe*+Bp{n5*|j)7?Snnfof~{rsbm5vyzVUssz73a{<#7Na!|ELo#rQe=}2oZdG}Cwq#qI1t*0#$#k7G5ZhZ-j>OaF{al#R2_uR?%1{=kmM2`8*dz>-O-Et#Ff z2_@U$srJay0l;Kff7K*Fbi7`*$Pzdcgv?{SnmkGAT1{M_8l@ESn!3f(sU{<8(Jr+lfL?3M7cB$+%I%6{+kY8> z4ir=``I6o{*-c=64UzHTe{>UxGYKlUBVpczLe=1299sU8YASC^@i~lInZB+GQ4Rkg zvzEbQDmDF4r$Izw)E`Gyj+3MR0@l?A7Db*0+1sIC)Lq6aGl2x8S;{s|wgv|-6Yywln4&$g3ocyKKgC#y7|1rF;@Xd-Qi9I~>KG2=Nq^%8uw6QZ<-&ut!r%#E}Z#c@?rNc1h4MkcfotrU4pH|{a zrY-eFk_{wpVK;dSw}vi$-kk|`XqJB+ysLV?GnUA7dQ-7dc_lLOBLBHWCbyyL&m8DZ zOaQ6L8`lE6d2BxM{-G}GeSy-b{IgdD1{y?kJN&fp;XkUlUQE7`qy*4(cJhAoejfYJ zHjZ#*cJ3dR^tlgP9?W|!pq45b75BKd`7=|e*Q;NroPvuPVF6$DjpUIoC#syDhg)iB z*+2;j3YCWt`J{)g`U%g5;zX3qp_U|K`G8Ugx3^u4SoN}fl8^s^)J6QCc<_h1u4>wv zV}Y>cJX@k%ypf87h35}4!8IszulDF44v=7=65R*9bUR=ja}TT2S$|W^;p|NYy*p9c zX{8EKL#3noJ0Rn2f2bxz-pGv5Mg^o^5&%_?AXtEQPkO~m_7BW)^{y4FUpZ5YCP(#x|k7-jie70d6Zz9ic-}BCv zw8l(RIF%bxMf43&~t3&;U8?2JE%Z z`-kCi#Vv`J^0ty<8UexLHy5=b4?RA|p?EPfQ_1Hoss$*0W{_p?ojQ%DxPR8|!OoqN z!)$HZ8g)lqSz$9(xP|_*;2H)lGI}xAr@<#a9FXXgME>XY^4MZ-$-27P(Ra%W3@51;dA0CBRCl&h`G$>#3FlJw zNkO8f;xR`R&J~jU%;|0U>)wFIn!#Lc#ZbCp9y1dyLv%I~Tx;c2z3e7I+% z3Oo_fTCrRImqRKx_mT(h<-wh7q{f@9O4Nf?IL?Q2BQQCj4>ZYc7ej3o;!da>A;p{R zwgjlm-HXKAR!!!svVM-ft^{T4+~BpywbZ-$l<2w03BGljMbNp|yatZ#3HwnkGFgVE z-~39uL(nLxUxK%pT4zC(O$l72f~-AY<@BnN$`rcjkoi@yLUfae{{37*y4qwST~9F^SLu zL(^}RBaCU*6%=@8=GI6I1I3&I_R=YWz~QZfxJ^=xG)u%$vQ;5!^;GTo56`ORrU=e9 zGD4Tvm4C4|vu}6*Qn4OG-DJyMinVdytD?D8hk~nW^`y4A3snv|O1 zZ%`BAY;s0gU0=sW%1)E>#rb+)<~WHcit_jIvy)Z+f<0nwl74$p*458HQs=lDZwOLF zkIR>|Td)NySWbgdNKHoB*z(0f1RM@JAXxuoVY2+<8 zweY{6tb(CoMq!AgSmeuv;$W}Fw1(iL(strjnlWre-TztVXES|!u@SFS`PShXn~&Go z)c55xLqA0ago~qbo!`6M+}F2CD0O>(>g*h?vaVCMS~hgAh^_}fJ-|G+6AX>fNt?D> z{h+xYNu^O$CszvY$ylG9KhQssU|4cKGsVr$2*lg5#_^|gZIn-l(^B3ZP7CZ1PYBYB zjP6tQ3DXtu8I}c&z0*dRw?$EJF8HN@f^Pk*aRKE1? z-@w*Aeobuj)oBLQ{yQx9^!&N_b`LC#r)z+waz4}p*ap~q4 zTP}#XGDUY}%K0o-sQ#3QD2 z*Mg^}v`}llMOyLnce^g7>|%-e#maKa@853``;wsklXqYL=!rR}eq1Q6@T$yA?Q^eB z%X`%}#g$F}v(M!V^^R-gK+laU)X}Y{GCe)Qa`@-B?@&4rGb2e{2 z+<159V)oMDFLib8b(_9+6;1YAcW3UKIML-#3==%vHGbOMKPhHCbJNpppKN>P?_|5~ zul8Rz`&ra+^{T|f4VPVic<*YETa;q3Zfc#YLQKyImrs}VFKnEY$wITPxPm|lyozRveav$k?-tZMl8 zW-!NZ4y7`Br|;Bc#*e#Hfx^f>d+N=V%%1~krw&< zyDHbXR)`jFAQj*O zU@#D1`0EH_;5=4^6>_W!#*r!@!*Ly|0x_HsXzbs{K-`9-kHI01SRu|*)V-j{mhuC4 zh~n@Ox}~T)Ly5B(bqO`H#etGIEk<2XO`JujgPF({85rTT2#XIfhc Date: Tue, 28 Apr 2026 10:44:56 -0400 Subject: [PATCH 19/42] fix: No point validation or check for identity is done on pubkey, ciphertext and commitment --- x/zkp/verification/commitment/commitment.go | 17 +++++++++++++++-- x/zkp/verification/range/range.go | 9 +++++++-- x/zkp/verification/validity/validity.go | 20 ++++++++++++++++++-- 3 files changed, 40 insertions(+), 6 deletions(-) diff --git a/x/zkp/verification/commitment/commitment.go b/x/zkp/verification/commitment/commitment.go index 62f5dfde..f6bff08d 100644 --- a/x/zkp/verification/commitment/commitment.go +++ b/x/zkp/verification/commitment/commitment.go @@ -159,6 +159,21 @@ func (ep EqualityProof) Verify( commitment *PedersenCommitment, transcript *merlin.Transcript, ) error { + var id Point + id.SetZero() + if pubkey.P.Equals(&id) { + return ErrProofAlgebraic + } + if ciphertext.Commitment.P.Equals(&id) { + return ErrProofAlgebraic + } + if ciphertext.Handle.P.Equals(&id) { + return ErrProofAlgebraic + } + if commitment.P.Equals(&id) { + return ErrProofAlgebraic + } + ciphertextCommitmentEqualityProofDomainSeparator(transcript) if err := common.ValidateAndAppendPoint(transcript, []byte("Y_0"), &ep.Y0); err != nil { @@ -266,8 +281,6 @@ func (ep EqualityProof) Verify( return ErrProofAlgebraic } - var id Point - id.SetZero() if check.Equals(&id) { return nil } diff --git a/x/zkp/verification/range/range.go b/x/zkp/verification/range/range.go index a5ebcb5e..fe6764db 100644 --- a/x/zkp/verification/range/range.go +++ b/x/zkp/verification/range/range.go @@ -487,6 +487,13 @@ func (rp *RangeProof) Verify( if nm <= 0 || !isPowerOfTwo(nm) { return RangeErrInvalidBitSize } + var id Point + id.SetZero() + for _, V := range comms { + if V == nil || V.P.Equals(&id) { + return RangeErrValidationError + } + } var bpGens *RangeProofGens var err error @@ -721,8 +728,6 @@ func (rp *RangeProof) Verify( return RangeErrMultiscalarMul } - var id Point - id.SetZero() if res.Equals(&id) { return nil } diff --git a/x/zkp/verification/validity/validity.go b/x/zkp/verification/validity/validity.go index 5157b863..c4132612 100644 --- a/x/zkp/verification/validity/validity.go +++ b/x/zkp/verification/validity/validity.go @@ -154,6 +154,24 @@ func (p GroupedCiphertext2HandlesValidityProof) Verify( secondHandle *DecryptHandle, transcript *merlin.Transcript, ) error { + var id Point + id.SetZero() + if firstPubkey.P.Equals(&id) { + return ErrValidityInvalidProof + } + if secondPubkey.P.Equals(&id) { + return ErrValidityInvalidProof + } + if commitment.P.Equals(&id) { + return ErrValidityInvalidProof + } + if firstHandle.P.Equals(&id) { + return ErrValidityInvalidProof + } + if secondHandle.P.Equals(&id) { + return ErrValidityInvalidProof + } + groupedCiphertextValidityProofDomainSeparator(transcript, 2) if err := common.ValidateAndAppendPoint(transcript, []byte("Y_0"), &p.Y0); err != nil { @@ -252,8 +270,6 @@ func (p GroupedCiphertext2HandlesValidityProof) Verify( return ErrValidityInvalidProof } - var id Point - id.SetZero() if check.Equals(&id) { return nil } From 7592f0b776fa4286a6b2ac1b59ce71538014dd3e Mon Sep 17 00:00:00 2001 From: SetarehGhorshi Date: Tue, 28 Apr 2026 10:59:24 -0400 Subject: [PATCH 20/42] fix: Fixed-size proof endpoints accept oversized payloads and ignore trailing bytes --- x/zkp/keeper/query_proof_verification.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/x/zkp/keeper/query_proof_verification.go b/x/zkp/keeper/query_proof_verification.go index 9a3afcf1..e9779271 100644 --- a/x/zkp/keeper/query_proof_verification.go +++ b/x/zkp/keeper/query_proof_verification.go @@ -23,7 +23,7 @@ func (k Keeper) VerifyWithdrawRangeProof(goCtx context.Context, req *types.Query ctx := sdk.UnwrapSDKContext(goCtx) ctx.GasMeter().ConsumeGas(types.GasVerifyWithdrawRangeProof, "verify_withdraw_range_proof") - if len(req.ProofData) < 8*32+8+8+672 { + if len(req.ProofData) != 8*32+8+8+672 { return &types.QueryVerifyWithdrawRangeProofResponse{ Valid: false, Error: "invalid proof data length", @@ -94,7 +94,7 @@ func (k Keeper) VerifyTransferRangeProof(goCtx context.Context, req *types.Query ctx := sdk.UnwrapSDKContext(goCtx) ctx.GasMeter().ConsumeGas(types.GasVerifyTransferRangeProof, "verify_transfer_range_proof") - if len(req.ProofData) < 8*32+8+736 { + if len(req.ProofData) != 8*32+8+736 { return &types.QueryVerifyTransferRangeProofResponse{ Valid: false, Error: "invalid proof data length", @@ -160,7 +160,7 @@ func (k Keeper) VerifyValidityProof(goCtx context.Context, req *types.QueryVerif ctx := sdk.UnwrapSDKContext(goCtx) ctx.GasMeter().ConsumeGas(types.GasVerifyValidityProof, "verify_validity_proof") - if len(req.ProofData) < 416 { + if len(req.ProofData) != 416 { return &types.QueryVerifyValidityProofResponse{ Valid: false, Error: "invalid proof data length", @@ -212,7 +212,7 @@ func (k Keeper) VerifyEqualityProof(goCtx context.Context, req *types.QueryVerif ctx := sdk.UnwrapSDKContext(goCtx) ctx.GasMeter().ConsumeGas(types.GasVerifyEqualityProof, "verify_equality_proof") - if len(req.ProofData) < 320 { + if len(req.ProofData) != 320 { return &types.QueryVerifyEqualityProofResponse{ Valid: false, Error: "invalid proof data length", @@ -272,7 +272,7 @@ func (k Keeper) VerifyTransferProofs(goCtx context.Context, req *types.QueryVeri ctx := sdk.UnwrapSDKContext(goCtx) ctx.GasMeter().ConsumeGas(types.GasVerifyTransferProofs, "verify_transfer_proofs") - if len(req.EqualityProofData) < 320 { + if len(req.EqualityProofData) != 320 { return &types.QueryVerifyTransferProofsResponse{ Valid: false, Error: "invalid equality proof data length", @@ -304,7 +304,7 @@ func (k Keeper) VerifyTransferProofs(goCtx context.Context, req *types.QueryVeri copy(equalityProofData.Proof.Zr[:], req.EqualityProofData[offset:offset+32]) // Deserialize range proof - if len(req.RangeProofData) < 8*32+8+736 { + if len(req.RangeProofData) != 8*32+8+736 { return &types.QueryVerifyTransferProofsResponse{ Valid: false, Error: "invalid range proof data length", @@ -348,7 +348,7 @@ func (k Keeper) VerifyTransferProofs(goCtx context.Context, req *types.QueryVeri copy(rangeProofData.Proof[:], req.RangeProofData[offset:offset+736]) // Deserialize validity proof - if len(req.ValidityProofData) < 416 { + if len(req.ValidityProofData) != 416 { return &types.QueryVerifyTransferProofsResponse{ Valid: false, Error: "invalid validity proof data length", @@ -431,7 +431,7 @@ func (k Keeper) VerifyWithdrawProofs(goCtx context.Context, req *types.QueryVeri ctx := sdk.UnwrapSDKContext(goCtx) ctx.GasMeter().ConsumeGas(types.GasVerifyWithdrawProofs, "verify_withdraw_proofs") - if len(req.EqualityProofData) < 328 { + if len(req.EqualityProofData) != 328 { return &types.QueryVerifyWithdrawProofsResponse{ Valid: false, Error: "invalid equality proof data length", @@ -464,7 +464,7 @@ func (k Keeper) VerifyWithdrawProofs(goCtx context.Context, req *types.QueryVeri copy(equalityProofData.Proof.Zr[:], req.EqualityProofData[offset:offset+32]) // Deserialize range proof - if len(req.RangeProofData) < 8*32+8+8+672 { + if len(req.RangeProofData) != 8*32+8+8+672 { return &types.QueryVerifyWithdrawProofsResponse{ Valid: false, Error: "invalid range proof data length", From af9808304992abef85af191c30e27ff39712246f Mon Sep 17 00:00:00 2001 From: SetarehGhorshi Date: Tue, 28 Apr 2026 13:16:01 -0400 Subject: [PATCH 21/42] fix: Proof Transcripts Contain Unnecessary Operations and Porting Artifacts --- x/zkp/verification/range/range.go | 1 - 1 file changed, 1 deletion(-) diff --git a/x/zkp/verification/range/range.go b/x/zkp/verification/range/range.go index fe6764db..d7808920 100644 --- a/x/zkp/verification/range/range.go +++ b/x/zkp/verification/range/range.go @@ -544,7 +544,6 @@ func (rp *RangeProof) Verify( appendScalarRP(t, []byte("e_blinding"), &rp.EBlinding) w := challengeScalarRP(t, []byte("w")) - _ = challengeScalarRP(t, []byte("c")) xSq, xInvSq, sVec, lPoints, rPoints, err := rp.IPPProof.verificationScalars(nm, t) if err != nil { From 28d39e6976a6ed7870577721c228a2ac84e1e535 Mon Sep 17 00:00:00 2001 From: SetarehGhorshi Date: Tue, 28 Apr 2026 15:16:06 -0400 Subject: [PATCH 22/42] fix: Generator H is not explicitly aligned with the Rust reference --- test-vectors/generator_vectors.json | 25 ++++++ x/zkp/verification/common/common_test.go | 62 +++++++++++++++ x/zkp/verification/range/range_test.go | 98 ++++++++++++++++++++++++ 3 files changed, 185 insertions(+) create mode 100644 test-vectors/generator_vectors.json diff --git a/test-vectors/generator_vectors.json b/test-vectors/generator_vectors.json new file mode 100644 index 00000000..02788dda --- /dev/null +++ b/test-vectors/generator_vectors.json @@ -0,0 +1,25 @@ +{ + "h": "8c9240b456a9e6dc65c377a1048d745f94a08cdb7f44cbcd7b46f34048871134", + "g_chain": { + "0": "e4d549716460013e71c032240c93ea1b1969cbc9e89c5d6b43adbf6c1df10724", + "1": "d6728b558a7b439c64bc077828560391e30b589314a999648d5f8cb471725f04", + "128": "0e0be53fbfb782a69419dda05d4357d1f955fef0a6c3e855a3c2e5c99bb2577d", + "2": "76c764f6854b782e38c65391d9cbdc5b6393b951ec450ddf75d05aab183e855c", + "3": "ee2b3649b4a4b5e3a7c0cb8abd1efd953e4b568a9beec95fcd52c67ff4cc6d2e", + "4": "3ecd9d5e21619fa3f6635a3313dbaa7c659936f7f4f1bffb851c69cce050814e", + "5": "6ab5462e04402818e844d97269bd93756ad748240f61ec27762a21f832e9e139", + "6": "7095d49d127a723ae98dc2a6abb14a37581a3dcfea3b726e76920d17b88f5531", + "7": "ca7561b6545ed5d4c0ca72458447da616fba1e714d0256e0fc0859a293f3133d" + }, + "h_chain": { + "0": "5a85e8485fcd463d97c976bcfdbf269206e49565b3ffc872defbea4f50b61b5c", + "1": "427d0c0cc30af031cea0d8044846743cc34aa45e2c4a78f029371d25f4145368", + "128": "0cf1e0d34b449f966fe91d08c13d85e3e620c58dfed327f88fcc4b21dad2a02c", + "2": "ba351f4df7cac755da7799e436db1d131a2803995f708697bc328b7731e08064", + "3": "eeb43382ef69a5e079acaae1b271f22b2ffc253c86e362fe9e1f768eab16a362", + "4": "98c4e87a3b4659cd80dd3cc390b86b936559b8d2aae6850377241fe740735173", + "5": "185a9a8f4438f9ee8bde340c1664b496fae9d276aa0773ee7c029efa2f66c06c", + "6": "683c58bc4927ee6c7be2d82b02ba6e1b64a88f274dfaf2363545466a7ec3db0f", + "7": "e096f1dbe20f142c4ab67b550689da51466aefbc56b5d20e26506eda7799f75c" + } +} diff --git a/x/zkp/verification/common/common_test.go b/x/zkp/verification/common/common_test.go index eecfccae..8bda1e82 100644 --- a/x/zkp/verification/common/common_test.go +++ b/x/zkp/verification/common/common_test.go @@ -2,12 +2,22 @@ package common import ( "bytes" + "encoding/json" "errors" + "os" + "path/filepath" + "runtime" "testing" "github.com/gtank/merlin" ) +type sharedGeneratorVectors struct { + H string `json:"h"` + GChain map[string]string `json:"g_chain"` + HChain map[string]string `json:"h_chain"` +} + func testScalar(t *testing.T, v uint64) Scalar { t.Helper() var s Scalar @@ -280,3 +290,55 @@ func TestChallengeScalarDeterminism(t *testing.T) { t.Fatal("different transcript unexpectedly produced same challenge") } } + +func mustDecodeHex32Common(t *testing.T, s string) [32]byte { + t.Helper() + b, err := os.ReadFile(s) + if err != nil { + t.Fatalf("read file: %v", err) + } + var out sharedGeneratorVectors + if err := json.Unmarshal(b, &out); err != nil { + t.Fatalf("unmarshal vectors: %v", err) + } + return decodeHex32Common(t, out.H) +} + +func decodeHex32Common(t *testing.T, s string) [32]byte { + t.Helper() + if len(s) != 64 { + t.Fatalf("hex length = %d, want 64", len(s)) + } + var out [32]byte + for i := 0; i < 32; i++ { + var v byte + for j := 0; j < 2; j++ { + c := s[i*2+j] + v <<= 4 + switch { + case c >= '0' && c <= '9': + v |= c - '0' + case c >= 'a' && c <= 'f': + v |= c - 'a' + 10 + default: + t.Fatalf("invalid hex char %q", c) + } + } + out[i] = v + } + return out +} + +func TestGeneratorHMatchesRustReferenceVector(t *testing.T) { + _, file, _, ok := runtime.Caller(0) + if !ok { + t.Fatal("runtime.Caller failed") + } + vectorsPath := filepath.Join(filepath.Dir(file), "../../../../test-vectors/generator_vectors.json") + want := mustDecodeHex32Common(t, vectorsPath) + var got [32]byte + H.BytesInto(&got) + if got != want { + t.Fatalf("H mismatch: got %x want %x", got, want) + } +} diff --git a/x/zkp/verification/range/range_test.go b/x/zkp/verification/range/range_test.go index c79a251b..27554c63 100644 --- a/x/zkp/verification/range/range_test.go +++ b/x/zkp/verification/range/range_test.go @@ -2,7 +2,11 @@ package rangeproof import ( "bytes" + "encoding/json" "errors" + "os" + "path/filepath" + "runtime" "testing" "github.com/Fairblock/fairyring/x/zkp/verification/common" @@ -498,3 +502,97 @@ func TestLeadingZeros32(t *testing.T) { } } } + +type sharedGeneratorVectorsRange struct { + H string `json:"h"` + GChain map[string]string `json:"g_chain"` + HChain map[string]string `json:"h_chain"` +} + +func decodeHex32Range(t *testing.T, s string) [32]byte { + t.Helper() + if len(s) != 64 { + t.Fatalf("hex length = %d, want 64", len(s)) + } + var out [32]byte + for i := 0; i < 32; i++ { + var v byte + for j := 0; j < 2; j++ { + c := s[i*2+j] + v <<= 4 + switch { + case c >= '0' && c <= '9': + v |= c - '0' + case c >= 'a' && c <= 'f': + v |= c - 'a' + 10 + default: + t.Fatalf("invalid hex char %q", c) + } + } + out[i] = v + } + return out +} + +func TestRangeGeneratorChainMatchesRustReferenceVectors(t *testing.T) { + _, file, _, ok := runtime.Caller(0) + if !ok { + t.Fatal("runtime.Caller failed") + } + vectorsPath := filepath.Join(filepath.Dir(file), "../../../../test-vectors/generator_vectors.json") + raw, err := os.ReadFile(vectorsPath) + if err != nil { + t.Fatalf("read vectors: %v", err) + } + var vectors sharedGeneratorVectorsRange + if err := json.Unmarshal(raw, &vectors); err != nil { + t.Fatalf("unmarshal vectors: %v", err) + } + gcG := newGeneratorsChain([]byte("G")) + for i := 0; i <= 128; i++ { + p := gcG.nextPoint() + if i == 0 || i == 1 || i == 2 || i == 3 || i == 4 || i == 5 || i == 6 || i == 7 || i == 128 { + wantHex, exists := vectors.GChain[itoaRange(i)] + if !exists { + t.Fatalf("missing G checkpoint %d", i) + } + want := decodeHex32Range(t, wantHex) + var got [32]byte + p.BytesInto(&got) + if got != want { + t.Fatalf("G[%d] mismatch: got %x want %x", i, got, want) + } + } + } + + gcH := newGeneratorsChain([]byte("H")) + for i := 0; i <= 128; i++ { + p := gcH.nextPoint() + if i == 0 || i == 1 || i == 2 || i == 3 || i == 4 || i == 5 || i == 6 || i == 7 || i == 128 { + wantHex, exists := vectors.HChain[itoaRange(i)] + if !exists { + t.Fatalf("missing H checkpoint %d", i) + } + want := decodeHex32Range(t, wantHex) + var got [32]byte + p.BytesInto(&got) + if got != want { + t.Fatalf("H[%d] mismatch: got %x want %x", i, got, want) + } + } + } +} + +func itoaRange(v int) string { + if v == 0 { + return "0" + } + var buf [20]byte + i := len(buf) + for v > 0 { + i-- + buf[i] = byte('0' + (v % 10)) + v /= 10 + } + return string(buf[i:]) +} From 08ff5e1e73fcbabe549f96a8ab310eee389c3cfd Mon Sep 17 00:00:00 2001 From: SetarehGhorshi Date: Tue, 28 Apr 2026 23:00:11 -0400 Subject: [PATCH 23/42] adding more tests --- test-vectors/zkp_verification_vectors.json | 3159 +++++++++++++++++ x/zkp/keeper/query_grpc_test.go | 108 + x/zkp/keeper/zkp_verification_vectors_test.go | 446 +++ .../commitment/commitment_test.go | 60 + x/zkp/verification/common/common_test.go | 64 + x/zkp/verification/range/range_test.go | 62 + x/zkp/verification/validity/validity_test.go | 64 + 7 files changed, 3963 insertions(+) create mode 100644 test-vectors/zkp_verification_vectors.json create mode 100644 x/zkp/keeper/zkp_verification_vectors_test.go diff --git a/test-vectors/zkp_verification_vectors.json b/test-vectors/zkp_verification_vectors.json new file mode 100644 index 00000000..f038868e --- /dev/null +++ b/test-vectors/zkp_verification_vectors.json @@ -0,0 +1,3159 @@ +{ + "version": "1", + "repo": { + "pkg": "confidential-transfer-proof-generation", + "version": "0.4.0" + }, + "verification_vectors": [ + { + "id": "equality-00", + "family": "equality", + "expected_valid": true, + "payload": { + "proof_data_hex": "5e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870bd6e05fcbcb7077aa122301f052243c301644a332e4ab2a3ff45e456c9d38086a027f723e8302c8301bf58c162a48b4f171b9a75350957b5998566aabf9355246140466839b6c89f2a698caf5825425d70a49d5d9ea201ae8dffae5b0ac6b3b204201d7f563a5c837e7861d75980a46cec4ec82d6d007673db2b9b254ed1181330efc7b041d17987fe21175cbca66485cf85b5a64c1eb98ec42ada426c9520e3ed07de086f2cfd2def4fa1773e65dd132ba109c05fcdfcfa0161f1fc8800df515311c3695c0bd19213ba3f97157b4afc95bd1412269e62cb322890dc5e6aa91000259f92022fcf29baf40b876e0acb3ff0db214442a4a8b5a9d444a22c6be990d847e201b5cb26cc31a75008ea1a6ac302b5062458b8d37050fa94d428e34e70a" + }, + "mutations": [ + { + "id": "equality-00-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "5f06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870bd6e05fcbcb7077aa122301f052243c301644a332e4ab2a3ff45e456c9d38086a027f723e8302c8301bf58c162a48b4f171b9a75350957b5998566aabf9355246140466839b6c89f2a698caf5825425d70a49d5d9ea201ae8dffae5b0ac6b3b204201d7f563a5c837e7861d75980a46cec4ec82d6d007673db2b9b254ed1181330efc7b041d17987fe21175cbca66485cf85b5a64c1eb98ec42ada426c9520e3ed07de086f2cfd2def4fa1773e65dd132ba109c05fcdfcfa0161f1fc8800df515311c3695c0bd19213ba3f97157b4afc95bd1412269e62cb322890dc5e6aa91000259f92022fcf29baf40b876e0acb3ff0db214442a4a8b5a9d444a22c6be990d847e201b5cb26cc31a75008ea1a6ac302b5062458b8d37050fa94d428e34e70a" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "equality-00-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "5e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870bd6e05fcbcb7077aa122301f052243c301644a332e4ab2a3ff45e456c9d38086a027f723e8302c8301bf58c162a48b4f171b9a75350957b5998566aabf9355246140466839b6c89f2a698caf5825425d70a49d5d9ea201ae8dffae5b0ac6b3b204201d7f563a5c837e7861d75980a46cec4ec82d6d007673db2b9b254ed1181330efc7b041d17987fe21175cbca66485cf85b5a64c1eb98ec42ada426c9520e3ed07de086f2cfd2def4fa1773e65dd132ba109c05fcdfcfa0161f1fc8800df515311c3695c0bd19213ba3f97157b4afc95bd1412269e62cb322890dc5e6aa91000259f92022fcf29baf40b876e0acb3ff0db214442a4a8b5a9d444a22c6be990d847e201b5cb26cc31a75008ea1a6ac302b5062458b8d37050fa94d428e34" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "equality-00-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + } + ] + }, + { + "id": "validity-00", + "family": "validity", + "expected_valid": true, + "payload": { + "proof_data_hex": "5e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870bccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c726cc8d72b7ebef5ef05526821199c2b5018f1bdbbd53f8f2c72a477f52e8a77c235b763b917f2b8a7994b3e6e6c592904874028992dfa7f7abd0a6ca393d27c12a8eacffaf1045ace8a2a83950a8404638107fa371e4c48dcad45cd8955845d62d9fd0e651e4b857cee3329e4ce468442da84e55359a6bfd92f8bd82b7e620234cd97580e1a7a2e785716c6ba79b304e8e3e9b0cc76d1a7414be49d2432495b7c321c4bd0f118a9ae5daa9785ad1c42c28b3a619bc6b943ea83fad6e56afd6d3a9b5e7a27f364a3a894bab4921c2b419028c088634832677be8e35a029b475764bc05f573011ef336950446586adb86941318de26cca565234a4c86ec49873ff872427cb9bf326a6112ad10d70740455662a50e882ab9ff17d27578432e3d25450e14a7b53aebc9624175bf52e535bdf0bd68eb532397666de4aba3accde204713bddc60190ee1e310e10178c7c6deddd46ebb6ed9f5214234fa0e1bb181e03" + }, + "mutations": [ + { + "id": "validity-00-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "5f06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870bccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c726cc8d72b7ebef5ef05526821199c2b5018f1bdbbd53f8f2c72a477f52e8a77c235b763b917f2b8a7994b3e6e6c592904874028992dfa7f7abd0a6ca393d27c12a8eacffaf1045ace8a2a83950a8404638107fa371e4c48dcad45cd8955845d62d9fd0e651e4b857cee3329e4ce468442da84e55359a6bfd92f8bd82b7e620234cd97580e1a7a2e785716c6ba79b304e8e3e9b0cc76d1a7414be49d2432495b7c321c4bd0f118a9ae5daa9785ad1c42c28b3a619bc6b943ea83fad6e56afd6d3a9b5e7a27f364a3a894bab4921c2b419028c088634832677be8e35a029b475764bc05f573011ef336950446586adb86941318de26cca565234a4c86ec49873ff872427cb9bf326a6112ad10d70740455662a50e882ab9ff17d27578432e3d25450e14a7b53aebc9624175bf52e535bdf0bd68eb532397666de4aba3accde204713bddc60190ee1e310e10178c7c6deddd46ebb6ed9f5214234fa0e1bb181e03" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "validity-00-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "5e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870bccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c726cc8d72b7ebef5ef05526821199c2b5018f1bdbbd53f8f2c72a477f52e8a77c235b763b917f2b8a7994b3e6e6c592904874028992dfa7f7abd0a6ca393d27c12a8eacffaf1045ace8a2a83950a8404638107fa371e4c48dcad45cd8955845d62d9fd0e651e4b857cee3329e4ce468442da84e55359a6bfd92f8bd82b7e620234cd97580e1a7a2e785716c6ba79b304e8e3e9b0cc76d1a7414be49d2432495b7c321c4bd0f118a9ae5daa9785ad1c42c28b3a619bc6b943ea83fad6e56afd6d3a9b5e7a27f364a3a894bab4921c2b419028c088634832677be8e35a029b475764bc05f573011ef336950446586adb86941318de26cca565234a4c86ec49873ff872427cb9bf326a6112ad10d70740455662a50e882ab9ff17d27578432e3d25450e14a7b53aebc9624175bf52e535bdf0bd68eb532397666de4aba3accde204713bddc60190ee1e310e10178c7c6deddd46ebb6ed9f5214234fa0e1bb18" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "validity-00-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + } + ] + }, + { + "id": "transfer-range-00", + "family": "transfer_range", + "expected_valid": true, + "payload": { + "proof_data_hex": "140466839b6c89f2a698caf5825425d70a49d5d9ea201ae8dffae5b0ac6b3b20726cc8d72b7ebef5ef05526821199c2b5018f1bdbbd53f8f2c72a477f52e8a770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000662b4a0066aae6cdf571e9d0d369ca879450e699c100243520b4e061a0d55b7efe9bd7f72f7a305ab7bb83d3efcfa3afda3a5ebe298dafc8a07f6161c26cf3723051fcf7a8b8a0aeec8dccd4bca499c6f420540e6850ae5775003ea10d13a5711e4ec199287b2f7c36690570e1def856085c873b6867e36f3a66087fdd24ab12d086e935833deb94f9339f57254125295df66273fd12d622de7b61362b69480ce018fea21c115fee011c18c496be8ea0ae8fd73811ed5a84ba0cc3ddea0c8808eec46107460b058dea7452b6581ffa62407cea6d391c8d621a0baeef2f5e230822e79fc29f03ac1c25fa82493191daa057523368d69136624926502dddef2030e2e3eece55a67a00d9005b961f6ee20d4a15362320fe8d54fcf6c13f09a212339a0fabcf2d251a29f0bdfd824df263fd0710d29bcb346c3a7e1d68ecbb15336476e03c757a31f3ddeb796a4475c9cc1e294a659d0e0430f2a4d9a8f8bf67f55668704d5034b06ef03b6262528a2125a5e839bbd3ad0da842de6370b7f990ed7de8f81d7f17370dee9cdfe58dfe5cfab750f9053fc9bb6361a8d67506189baa28aeb8ab5434da80c03b96e773d2228e2b7becf31c9f61b3a93182567a0b68b003d65a49bd074fb8a98a4d772e7c1c6c4f635b4cff4582af78eb38b0a02ccc157d7ef8151be6ad4fb219b3cd2bfb8af739abf462aaa8dd3d2b0e2a41c783c3cb6016d94bced42164ea577a32a5c8c3d44f4afe530da78c1645a7ae9083c2366d001ead708620aeedc012a726ffd4f93f71a5b01c835594417718c0ec0a1512c0182069c857559a20ad7ef34aaea1a49489083e46f7a41b40cb42726c6ed20de366fa24f6f560ebef1799b74a8775e43fbfe489785c6ddd73c02b436274ebca4f59723f00cb9f1f63c6be15ef5f5f8c30ec652842ae895c952ef83395bfec05a24c2509496b22efc3dd9459637bd1631d00024c012a26c1a997f61af381368b93015be83b1b9493ef34acb3ea835c0c30189ee76bc5d5dbbb1193625ea1ad6ee801" + }, + "mutations": [ + { + "id": "transfer-range-00-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "150466839b6c89f2a698caf5825425d70a49d5d9ea201ae8dffae5b0ac6b3b20726cc8d72b7ebef5ef05526821199c2b5018f1bdbbd53f8f2c72a477f52e8a770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000662b4a0066aae6cdf571e9d0d369ca879450e699c100243520b4e061a0d55b7efe9bd7f72f7a305ab7bb83d3efcfa3afda3a5ebe298dafc8a07f6161c26cf3723051fcf7a8b8a0aeec8dccd4bca499c6f420540e6850ae5775003ea10d13a5711e4ec199287b2f7c36690570e1def856085c873b6867e36f3a66087fdd24ab12d086e935833deb94f9339f57254125295df66273fd12d622de7b61362b69480ce018fea21c115fee011c18c496be8ea0ae8fd73811ed5a84ba0cc3ddea0c8808eec46107460b058dea7452b6581ffa62407cea6d391c8d621a0baeef2f5e230822e79fc29f03ac1c25fa82493191daa057523368d69136624926502dddef2030e2e3eece55a67a00d9005b961f6ee20d4a15362320fe8d54fcf6c13f09a212339a0fabcf2d251a29f0bdfd824df263fd0710d29bcb346c3a7e1d68ecbb15336476e03c757a31f3ddeb796a4475c9cc1e294a659d0e0430f2a4d9a8f8bf67f55668704d5034b06ef03b6262528a2125a5e839bbd3ad0da842de6370b7f990ed7de8f81d7f17370dee9cdfe58dfe5cfab750f9053fc9bb6361a8d67506189baa28aeb8ab5434da80c03b96e773d2228e2b7becf31c9f61b3a93182567a0b68b003d65a49bd074fb8a98a4d772e7c1c6c4f635b4cff4582af78eb38b0a02ccc157d7ef8151be6ad4fb219b3cd2bfb8af739abf462aaa8dd3d2b0e2a41c783c3cb6016d94bced42164ea577a32a5c8c3d44f4afe530da78c1645a7ae9083c2366d001ead708620aeedc012a726ffd4f93f71a5b01c835594417718c0ec0a1512c0182069c857559a20ad7ef34aaea1a49489083e46f7a41b40cb42726c6ed20de366fa24f6f560ebef1799b74a8775e43fbfe489785c6ddd73c02b436274ebca4f59723f00cb9f1f63c6be15ef5f5f8c30ec652842ae895c952ef83395bfec05a24c2509496b22efc3dd9459637bd1631d00024c012a26c1a997f61af381368b93015be83b1b9493ef34acb3ea835c0c30189ee76bc5d5dbbb1193625ea1ad6ee801" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "transfer-range-00-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "140466839b6c89f2a698caf5825425d70a49d5d9ea201ae8dffae5b0ac6b3b20726cc8d72b7ebef5ef05526821199c2b5018f1bdbbd53f8f2c72a477f52e8a770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000662b4a0066aae6cdf571e9d0d369ca879450e699c100243520b4e061a0d55b7efe9bd7f72f7a305ab7bb83d3efcfa3afda3a5ebe298dafc8a07f6161c26cf3723051fcf7a8b8a0aeec8dccd4bca499c6f420540e6850ae5775003ea10d13a5711e4ec199287b2f7c36690570e1def856085c873b6867e36f3a66087fdd24ab12d086e935833deb94f9339f57254125295df66273fd12d622de7b61362b69480ce018fea21c115fee011c18c496be8ea0ae8fd73811ed5a84ba0cc3ddea0c8808eec46107460b058dea7452b6581ffa62407cea6d391c8d621a0baeef2f5e230822e79fc29f03ac1c25fa82493191daa057523368d69136624926502dddef2030e2e3eece55a67a00d9005b961f6ee20d4a15362320fe8d54fcf6c13f09a212339a0fabcf2d251a29f0bdfd824df263fd0710d29bcb346c3a7e1d68ecbb15336476e03c757a31f3ddeb796a4475c9cc1e294a659d0e0430f2a4d9a8f8bf67f55668704d5034b06ef03b6262528a2125a5e839bbd3ad0da842de6370b7f990ed7de8f81d7f17370dee9cdfe58dfe5cfab750f9053fc9bb6361a8d67506189baa28aeb8ab5434da80c03b96e773d2228e2b7becf31c9f61b3a93182567a0b68b003d65a49bd074fb8a98a4d772e7c1c6c4f635b4cff4582af78eb38b0a02ccc157d7ef8151be6ad4fb219b3cd2bfb8af739abf462aaa8dd3d2b0e2a41c783c3cb6016d94bced42164ea577a32a5c8c3d44f4afe530da78c1645a7ae9083c2366d001ead708620aeedc012a726ffd4f93f71a5b01c835594417718c0ec0a1512c0182069c857559a20ad7ef34aaea1a49489083e46f7a41b40cb42726c6ed20de366fa24f6f560ebef1799b74a8775e43fbfe489785c6ddd73c02b436274ebca4f59723f00cb9f1f63c6be15ef5f5f8c30ec652842ae895c952ef83395bfec05a24c2509496b22efc3dd9459637bd1631d00024c012a26c1a997f61af381368b93015be83b1b9493ef34acb3ea835c0c30189ee76bc5d5dbbb1193625ea1ad6e" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "transfer-range-00-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + }, + { + "id": "transfer-range-00-bfN", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "140466839b6c89f2a698caf5825425d70a49d5d9ea201ae8dffae5b0ac6b3b20726cc8d72b7ebef5ef05526821199c2b5018f1bdbbd53f8f2c72a477f52e8a770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000662b4a0066aae6cdf571e9d0d369ca879450e699c100243520b4e061a0d55b7efe9bd7f72f7a305ab7bb83d3efcfa3afda3a5ebe298dafc8a07f6161c26cf3723051fcf7a8b8a0aeec8dccd4bca499c6f420540e6850ae5775003ea10d13a5711e4ec199287b2f7c36690570e1def856085c873b6867e36f3a66087fdd24ab12d086e935833deb94f9339f57254125295df66273fd12d622de7b61362b69480ce018fea21c115fee011c18c496be8ea0ae8fd73811ed5a84ba0cc3ddea0c8808eec46107460b058dea7452b6581ffa62407cea6d391c8d621a0baeef2f5e230822e79fc29f03ac1c25fa82493191daa057523368d69136624926502dddef2030e2e3eece55a67a00d9005b961f6ee20d4a15362320fe8d54fcf6c13f09a212339a0fabcf2d251a29f0bdfd824df263fd0710d29bcb346c3a7e1d68ecbb15336476e03c757a31f3ddeb796a4475c9cc1e294a659d0e0430f2a4d9a8f8bf67f55668704d5034b06ef03b6262528a2125a5e839bbd3ad0da842de6370b7f990ed7de8f81d7f17370dee9cdfe58dfe5cfab750f9053fc9bb6361a8d67506189baa28aeb8ab5434da80c03b96e773d2228e2b7becf31c9f61b3a93182567a0b68b003d65a49bd074fb8a98a4d772e7c1c6c4f635b4cff4582af78eb38b0a02ccc157d7ef8151be6ad4fb219b3cd2bfb8af739abf462aaa8dd3d2b0e2a41c783c3cb6016d94bced42164ea577a32a5c8c3d44f4afe530da78c1645a7ae9083c2366d001ead708620aeedc012a726ffd4f93f71a5b01c835594417718c0ec0a1512c0182069c857559a20ad7ef34aaea1a49489083e46f7a41b40cb42726c6ed20de366fa24f6f560ebef1799b74a8775e43fbfe489785c6ddd73c02b436274ebca4f59723f00cb9f1f63c6be15ef5f5f8c30ec652842ae895c952ef83395bfec05a24c2509496b22efc3dd9459637bd1631d00024c012a26c1a997f61af381368b93015be83b1b9493ef34acb3ea835c0c30189ee76bc5d5dbbb1193625ea1ad6ee800" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + } + ] + }, + { + "id": "transfer-composite-00", + "family": "transfer_composite", + "expected_valid": true, + "payload": { + "equality_proof_data_hex": "5e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870bd6e05fcbcb7077aa122301f052243c301644a332e4ab2a3ff45e456c9d38086a027f723e8302c8301bf58c162a48b4f171b9a75350957b5998566aabf9355246140466839b6c89f2a698caf5825425d70a49d5d9ea201ae8dffae5b0ac6b3b204201d7f563a5c837e7861d75980a46cec4ec82d6d007673db2b9b254ed1181330efc7b041d17987fe21175cbca66485cf85b5a64c1eb98ec42ada426c9520e3ed07de086f2cfd2def4fa1773e65dd132ba109c05fcdfcfa0161f1fc8800df515311c3695c0bd19213ba3f97157b4afc95bd1412269e62cb322890dc5e6aa91000259f92022fcf29baf40b876e0acb3ff0db214442a4a8b5a9d444a22c6be990d847e201b5cb26cc31a75008ea1a6ac302b5062458b8d37050fa94d428e34e70a", + "range_proof_data_hex": "140466839b6c89f2a698caf5825425d70a49d5d9ea201ae8dffae5b0ac6b3b20726cc8d72b7ebef5ef05526821199c2b5018f1bdbbd53f8f2c72a477f52e8a770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000662b4a0066aae6cdf571e9d0d369ca879450e699c100243520b4e061a0d55b7efe9bd7f72f7a305ab7bb83d3efcfa3afda3a5ebe298dafc8a07f6161c26cf3723051fcf7a8b8a0aeec8dccd4bca499c6f420540e6850ae5775003ea10d13a5711e4ec199287b2f7c36690570e1def856085c873b6867e36f3a66087fdd24ab12d086e935833deb94f9339f57254125295df66273fd12d622de7b61362b69480ce018fea21c115fee011c18c496be8ea0ae8fd73811ed5a84ba0cc3ddea0c8808eec46107460b058dea7452b6581ffa62407cea6d391c8d621a0baeef2f5e230822e79fc29f03ac1c25fa82493191daa057523368d69136624926502dddef2030e2e3eece55a67a00d9005b961f6ee20d4a15362320fe8d54fcf6c13f09a212339a0fabcf2d251a29f0bdfd824df263fd0710d29bcb346c3a7e1d68ecbb15336476e03c757a31f3ddeb796a4475c9cc1e294a659d0e0430f2a4d9a8f8bf67f55668704d5034b06ef03b6262528a2125a5e839bbd3ad0da842de6370b7f990ed7de8f81d7f17370dee9cdfe58dfe5cfab750f9053fc9bb6361a8d67506189baa28aeb8ab5434da80c03b96e773d2228e2b7becf31c9f61b3a93182567a0b68b003d65a49bd074fb8a98a4d772e7c1c6c4f635b4cff4582af78eb38b0a02ccc157d7ef8151be6ad4fb219b3cd2bfb8af739abf462aaa8dd3d2b0e2a41c783c3cb6016d94bced42164ea577a32a5c8c3d44f4afe530da78c1645a7ae9083c2366d001ead708620aeedc012a726ffd4f93f71a5b01c835594417718c0ec0a1512c0182069c857559a20ad7ef34aaea1a49489083e46f7a41b40cb42726c6ed20de366fa24f6f560ebef1799b74a8775e43fbfe489785c6ddd73c02b436274ebca4f59723f00cb9f1f63c6be15ef5f5f8c30ec652842ae895c952ef83395bfec05a24c2509496b22efc3dd9459637bd1631d00024c012a26c1a997f61af381368b93015be83b1b9493ef34acb3ea835c0c30189ee76bc5d5dbbb1193625ea1ad6ee801", + "validity_proof_data_hex": "5e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870bccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c726cc8d72b7ebef5ef05526821199c2b5018f1bdbbd53f8f2c72a477f52e8a77c235b763b917f2b8a7994b3e6e6c592904874028992dfa7f7abd0a6ca393d27c12a8eacffaf1045ace8a2a83950a8404638107fa371e4c48dcad45cd8955845d62d9fd0e651e4b857cee3329e4ce468442da84e55359a6bfd92f8bd82b7e620234cd97580e1a7a2e785716c6ba79b304e8e3e9b0cc76d1a7414be49d2432495b7c321c4bd0f118a9ae5daa9785ad1c42c28b3a619bc6b943ea83fad6e56afd6d3a9b5e7a27f364a3a894bab4921c2b419028c088634832677be8e35a029b475764bc05f573011ef336950446586adb86941318de26cca565234a4c86ec49873ff872427cb9bf326a6112ad10d70740455662a50e882ab9ff17d27578432e3d25450e14a7b53aebc9624175bf52e535bdf0bd68eb532397666de4aba3accde204713bddc60190ee1e310e10178c7c6deddd46ebb6ed9f5214234fa0e1bb181e03" + }, + "binding": { + "current_balance_commitment_hex": "d2aac024a9c16f6b065395effc4502fbe91a1f080feff51b579aeec25326aa1d", + "current_balance_handle_hex": "0e267a3fc27f17f182d155055a5d99faf8cb31b065b7d85675d96ae041e25e0b", + "recipient_pubkey_hex": "ccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c", + "sender_pubkey_hex": "5e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b" + }, + "mutations": [ + { + "id": "transfer-composite-00-swap-eq-val", + "op": "swap_fields", + "target": "payload.equality_proof_data_hex", + "params": { + "with": "payload.validity_proof_data_hex" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "transfer-composite-00-pk-s", + "op": "bitflip", + "target": "binding.sender_pubkey_hex", + "params": { + "value_hex": "5f06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "transfer-composite-00-pk-r", + "op": "bitflip", + "target": "binding.recipient_pubkey_hex", + "params": { + "value_hex": "cdab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "transfer-composite-00-bal-c1", + "op": "replace_field", + "target": "binding.current_balance_commitment_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "remaining balance commitment mismatch" + }, + { + "id": "transfer-composite-00-rng-trunc", + "op": "truncate", + "target": "payload.range_proof_data_hex", + "params": { + "value_hex": "140466839b6c89f2a698caf5825425d70a49d5d9ea201ae8dffae5b0ac6b3b20726cc8d72b7ebef5ef05526821199c2b5018f1bdbbd53f8f2c72a477f52e8a770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000662b4a0066aae6cdf571e9d0d369ca879450e699c100243520b4e061a0d55b7efe9bd7f72f7a305ab7bb83d3efcfa3afda3a5ebe298dafc8a07f6161c26cf3723051fcf7a8b8a0aeec8dccd4bca499c6f420540e6850ae5775003ea10d13a5711e4ec199287b2f7c36690570e1def856085c873b6867e36f3a66087fdd24ab12d086e935833deb94f9339f57254125295df66273fd12d622de7b61362b69480ce018fea21c115fee011c18c496be8ea0ae8fd73811ed5a84ba0cc3ddea0c8808eec46107460b058dea7452b6581ffa62407cea6d391c8d621a0baeef2f5e230822e79fc29f03ac1c25fa82493191daa057523368d69136624926502dddef2030e2e3eece55a67a00d9005b961f6ee20d4a15362320fe8d54fcf6c13f09a212339a0fabcf2d251a29f0bdfd824df263fd0710d29bcb346c3a7e1d68ecbb15336476e03c757a31f3ddeb796a4475c9cc1e294a659d0e0430f2a4d9a8f8bf67f55668704d5034b06ef03b6262528a2125a5e839bbd3ad0da842de6370b7f990ed7de8f81d7f17370dee9cdfe58dfe5cfab750f9053fc9bb6361a8d67506189baa28aeb8ab5434da80c03b96e773d2228e2b7becf31c9f61b3a93182567a0b68b003d65a49bd074fb8a98a4d772e7c1c6c4f635b4cff4582af78eb38b0a02ccc157d7ef8151be6ad4fb219b3cd2bfb8af739abf462aaa8dd3d2b0e2a41c783c3cb6016d94bced42164ea577a32a5c8c3d44f4afe530da78c1645a7ae9083c2366d001ead708620aeedc012a726ffd4f93f71a5b01c835594417718c0ec0a1512c0182069c857559a20ad7ef34aaea1a49489083e46f7a41b40cb42726c6ed20de366fa24f6f560ebef1799b74a8775e43fbfe489785c6ddd73c02b436274ebca4f59723f00cb9f1f63c6be15ef5f5f8c30ec652842ae895c952ef83395bfec05a24c2509496b22efc3dd9459637bd1631d00024c012a26c1a997f61af381368b93015be83b1b9493ef34acb3ea835c0c30189ee76bc5d5dbbb1193625ea1ad6e" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + } + ] + }, + { + "id": "equality-01", + "family": "equality", + "expected_valid": true, + "payload": { + "proof_data_hex": "ccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c240fbf582f058b6f65c20fd91705d1ab420ede8aef1386885443260bb932570244a14962c8b9a3b7abde4d5a9b9055691c29c300bd07b4ccbf282d7541613300a0f18c69cb0e4187daa25c76ffde09a9b7b50aa9837e7da8c0126564b4ed314fce8812b4819919cded524a4ea5ca39c39ac900d633828ae3367112a735b75657f85d10244d06d82abba3cf607cc30a54cf2be89efa205a51b86818167f5f0d0622a19e1ba98e1304e880de4232b305be89b0a3212aebd6a3cb0b0658dd3e0405361e4c69bbe5b2cc6fc21831ae794d58574759b1d4cb64f99be3031e5e48ae0654d889ff612d4c22f59d9fb715ca8e719cebedd3bc6f2ad4f1a837d031859d03d3d8e05887a7759c9834690ad367e0298dea0746bdd9d8d80af0f8e1ddbeac07" + }, + "mutations": [ + { + "id": "equality-01-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "cdab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c240fbf582f058b6f65c20fd91705d1ab420ede8aef1386885443260bb932570244a14962c8b9a3b7abde4d5a9b9055691c29c300bd07b4ccbf282d7541613300a0f18c69cb0e4187daa25c76ffde09a9b7b50aa9837e7da8c0126564b4ed314fce8812b4819919cded524a4ea5ca39c39ac900d633828ae3367112a735b75657f85d10244d06d82abba3cf607cc30a54cf2be89efa205a51b86818167f5f0d0622a19e1ba98e1304e880de4232b305be89b0a3212aebd6a3cb0b0658dd3e0405361e4c69bbe5b2cc6fc21831ae794d58574759b1d4cb64f99be3031e5e48ae0654d889ff612d4c22f59d9fb715ca8e719cebedd3bc6f2ad4f1a837d031859d03d3d8e05887a7759c9834690ad367e0298dea0746bdd9d8d80af0f8e1ddbeac07" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "equality-01-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "ccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c240fbf582f058b6f65c20fd91705d1ab420ede8aef1386885443260bb932570244a14962c8b9a3b7abde4d5a9b9055691c29c300bd07b4ccbf282d7541613300a0f18c69cb0e4187daa25c76ffde09a9b7b50aa9837e7da8c0126564b4ed314fce8812b4819919cded524a4ea5ca39c39ac900d633828ae3367112a735b75657f85d10244d06d82abba3cf607cc30a54cf2be89efa205a51b86818167f5f0d0622a19e1ba98e1304e880de4232b305be89b0a3212aebd6a3cb0b0658dd3e0405361e4c69bbe5b2cc6fc21831ae794d58574759b1d4cb64f99be3031e5e48ae0654d889ff612d4c22f59d9fb715ca8e719cebedd3bc6f2ad4f1a837d031859d03d3d8e05887a7759c9834690ad367e0298dea0746bdd9d8d80af0f8e1ddbe" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "equality-01-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + } + ] + }, + { + "id": "validity-01", + "family": "validity", + "expected_valid": true, + "payload": { + "proof_data_hex": "ccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d5275319e4b10e38f49d4def6ba1d3ebe8612b24c80c87653a61d865ec51bef288a6cacff5aff7e2740d4df71f9a17fa3470632c2fcd5541737572a33dcc88f74284a741e476c791ae088fe75b29088e3d5ac2b93cea1ca2ba1639ecbf60f814d5c909af844b3d08cdeb8e8bf52ebf5e9139f81989560a79645f668d02cdf7452e6fb3eade0eb0bb21de06712827e8203de7e02b1b60fb068ae8a8f5101f4381984546006c9c6f023899e5d40581e01ed3ede8c72c6ec98e859b42c4a124fd24d2817815cb6dd36e967029164e5bd96ceb03699749d7c65d01394189a416294649e3d31b861e15d4610b0907dfd65f8030d48ca0459bc9d0701806b345c765b5178bb9bbb420226337190a2db284f78a3d0b4aad459307ec6dc7e3c2c3fdd5c54cffdd1d8a0526002f97dc0516e6408162adf46d89476bbfacec4f897cacedd0b208f8d22a4c1a03c27e1841106fedf1222541944bbdd562fc33bb8521bde380f" + }, + "mutations": [ + { + "id": "validity-01-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "cdab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d5275319e4b10e38f49d4def6ba1d3ebe8612b24c80c87653a61d865ec51bef288a6cacff5aff7e2740d4df71f9a17fa3470632c2fcd5541737572a33dcc88f74284a741e476c791ae088fe75b29088e3d5ac2b93cea1ca2ba1639ecbf60f814d5c909af844b3d08cdeb8e8bf52ebf5e9139f81989560a79645f668d02cdf7452e6fb3eade0eb0bb21de06712827e8203de7e02b1b60fb068ae8a8f5101f4381984546006c9c6f023899e5d40581e01ed3ede8c72c6ec98e859b42c4a124fd24d2817815cb6dd36e967029164e5bd96ceb03699749d7c65d01394189a416294649e3d31b861e15d4610b0907dfd65f8030d48ca0459bc9d0701806b345c765b5178bb9bbb420226337190a2db284f78a3d0b4aad459307ec6dc7e3c2c3fdd5c54cffdd1d8a0526002f97dc0516e6408162adf46d89476bbfacec4f897cacedd0b208f8d22a4c1a03c27e1841106fedf1222541944bbdd562fc33bb8521bde380f" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "validity-01-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "ccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d5275319e4b10e38f49d4def6ba1d3ebe8612b24c80c87653a61d865ec51bef288a6cacff5aff7e2740d4df71f9a17fa3470632c2fcd5541737572a33dcc88f74284a741e476c791ae088fe75b29088e3d5ac2b93cea1ca2ba1639ecbf60f814d5c909af844b3d08cdeb8e8bf52ebf5e9139f81989560a79645f668d02cdf7452e6fb3eade0eb0bb21de06712827e8203de7e02b1b60fb068ae8a8f5101f4381984546006c9c6f023899e5d40581e01ed3ede8c72c6ec98e859b42c4a124fd24d2817815cb6dd36e967029164e5bd96ceb03699749d7c65d01394189a416294649e3d31b861e15d4610b0907dfd65f8030d48ca0459bc9d0701806b345c765b5178bb9bbb420226337190a2db284f78a3d0b4aad459307ec6dc7e3c2c3fdd5c54cffdd1d8a0526002f97dc0516e6408162adf46d89476bbfacec4f897cacedd0b208f8d22a4c1a03c27e1841106fedf1222541944bbdd562fc33bb8521bde" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "validity-01-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + } + ] + }, + { + "id": "transfer-range-01", + "family": "transfer_range", + "expected_valid": true, + "payload": { + "proof_data_hex": "a0f18c69cb0e4187daa25c76ffde09a9b7b50aa9837e7da8c0126564b4ed314f5275319e4b10e38f49d4def6ba1d3ebe8612b24c80c87653a61d865ec51bef28000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404000000000000020d40fed717097b9d86c50dda34e93ad87a18feb0dda1f9319da2be6b6fba54cfa878652001e53ca67b160bf22d8cda01b9d6194572559fc02d9be61d971382f101dcac52d8b7cb548c397209b31070975e3148b3f07ff51a224a309b32294354a7d5049d8ca494078d584c8e2594958eb907fd96754101aef484f4a948ec94495dbdadf0e21dfa033d089cf6ef845e380dad5f4d43e67d20274beecbe101a06dcecdd981bca3c60a419c9a3e65038e35d867c94418a2d02726400bfdf85a60c4d12fd18a045d5c105d5a9d0ae763d4670dceabb78d4dbe9b7fa3e2358b93b077ce20e741812595118ccc577ca3aa5574fdb77035563f6c05f5e3ec58be1df4b2a986a1c88a0fa7bc856cc67123d522f2d6429546daad6e31055cebe92ce5e64b04df3e716fb3935bbe157c069c0c4825e0bed1a8725851a11a17a14714e2f6d4c90e222fd1437b7eba9298729e3a1d30309723e23fcefd5a269247233683a21c6fc18b00345f64ec2acbc8dc34c26c2d22df36db765f2c585e92cbdd6d71a1d5ec079d12d12116ec8e2e041dc694eb1890dfa3c3e3837f42056c85758e2127206f1fcca42f071467a16607d828a2c0dba0761b070dc338cf5bc8280d325a601be890d915b6be3eca4dadcff6987a74dfea4281736fb33e66382a4194627fa5fc81f62d913afe249f7d2d4edbfade729ef836bffb5d2ed77b21aa65317f8c6139c0d48b806834c37acfc7982cf1a3ffe64cb760f3a11f0da7d9cd7ac8467a059026e50e493e5ce6082fed39e30ec148b716e636917fd198bf1e66d9ff519dc354eed5ec34f95989d8c87ef9028226367e8cca7e73bdec74db7a9b1bcb9125a2ea251a262fe539218a85ce98bdfc25cd53bdab604fc101320302ea28de49f5349b20790914ab23a85b80711b93a11047a72d928bb9c7115996d34f48c675ede140ca205038ca94beb9a007d746efb18bd39c55ec9b941aae1a692dabed2bc0e00572656fe76c2dc7adc1b62610dc3051c2e09a500fad71de3b5e31ac3e66d520c" + }, + "mutations": [ + { + "id": "transfer-range-01-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "a1f18c69cb0e4187daa25c76ffde09a9b7b50aa9837e7da8c0126564b4ed314f5275319e4b10e38f49d4def6ba1d3ebe8612b24c80c87653a61d865ec51bef28000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404000000000000020d40fed717097b9d86c50dda34e93ad87a18feb0dda1f9319da2be6b6fba54cfa878652001e53ca67b160bf22d8cda01b9d6194572559fc02d9be61d971382f101dcac52d8b7cb548c397209b31070975e3148b3f07ff51a224a309b32294354a7d5049d8ca494078d584c8e2594958eb907fd96754101aef484f4a948ec94495dbdadf0e21dfa033d089cf6ef845e380dad5f4d43e67d20274beecbe101a06dcecdd981bca3c60a419c9a3e65038e35d867c94418a2d02726400bfdf85a60c4d12fd18a045d5c105d5a9d0ae763d4670dceabb78d4dbe9b7fa3e2358b93b077ce20e741812595118ccc577ca3aa5574fdb77035563f6c05f5e3ec58be1df4b2a986a1c88a0fa7bc856cc67123d522f2d6429546daad6e31055cebe92ce5e64b04df3e716fb3935bbe157c069c0c4825e0bed1a8725851a11a17a14714e2f6d4c90e222fd1437b7eba9298729e3a1d30309723e23fcefd5a269247233683a21c6fc18b00345f64ec2acbc8dc34c26c2d22df36db765f2c585e92cbdd6d71a1d5ec079d12d12116ec8e2e041dc694eb1890dfa3c3e3837f42056c85758e2127206f1fcca42f071467a16607d828a2c0dba0761b070dc338cf5bc8280d325a601be890d915b6be3eca4dadcff6987a74dfea4281736fb33e66382a4194627fa5fc81f62d913afe249f7d2d4edbfade729ef836bffb5d2ed77b21aa65317f8c6139c0d48b806834c37acfc7982cf1a3ffe64cb760f3a11f0da7d9cd7ac8467a059026e50e493e5ce6082fed39e30ec148b716e636917fd198bf1e66d9ff519dc354eed5ec34f95989d8c87ef9028226367e8cca7e73bdec74db7a9b1bcb9125a2ea251a262fe539218a85ce98bdfc25cd53bdab604fc101320302ea28de49f5349b20790914ab23a85b80711b93a11047a72d928bb9c7115996d34f48c675ede140ca205038ca94beb9a007d746efb18bd39c55ec9b941aae1a692dabed2bc0e00572656fe76c2dc7adc1b62610dc3051c2e09a500fad71de3b5e31ac3e66d520c" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "transfer-range-01-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "a0f18c69cb0e4187daa25c76ffde09a9b7b50aa9837e7da8c0126564b4ed314f5275319e4b10e38f49d4def6ba1d3ebe8612b24c80c87653a61d865ec51bef28000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404000000000000020d40fed717097b9d86c50dda34e93ad87a18feb0dda1f9319da2be6b6fba54cfa878652001e53ca67b160bf22d8cda01b9d6194572559fc02d9be61d971382f101dcac52d8b7cb548c397209b31070975e3148b3f07ff51a224a309b32294354a7d5049d8ca494078d584c8e2594958eb907fd96754101aef484f4a948ec94495dbdadf0e21dfa033d089cf6ef845e380dad5f4d43e67d20274beecbe101a06dcecdd981bca3c60a419c9a3e65038e35d867c94418a2d02726400bfdf85a60c4d12fd18a045d5c105d5a9d0ae763d4670dceabb78d4dbe9b7fa3e2358b93b077ce20e741812595118ccc577ca3aa5574fdb77035563f6c05f5e3ec58be1df4b2a986a1c88a0fa7bc856cc67123d522f2d6429546daad6e31055cebe92ce5e64b04df3e716fb3935bbe157c069c0c4825e0bed1a8725851a11a17a14714e2f6d4c90e222fd1437b7eba9298729e3a1d30309723e23fcefd5a269247233683a21c6fc18b00345f64ec2acbc8dc34c26c2d22df36db765f2c585e92cbdd6d71a1d5ec079d12d12116ec8e2e041dc694eb1890dfa3c3e3837f42056c85758e2127206f1fcca42f071467a16607d828a2c0dba0761b070dc338cf5bc8280d325a601be890d915b6be3eca4dadcff6987a74dfea4281736fb33e66382a4194627fa5fc81f62d913afe249f7d2d4edbfade729ef836bffb5d2ed77b21aa65317f8c6139c0d48b806834c37acfc7982cf1a3ffe64cb760f3a11f0da7d9cd7ac8467a059026e50e493e5ce6082fed39e30ec148b716e636917fd198bf1e66d9ff519dc354eed5ec34f95989d8c87ef9028226367e8cca7e73bdec74db7a9b1bcb9125a2ea251a262fe539218a85ce98bdfc25cd53bdab604fc101320302ea28de49f5349b20790914ab23a85b80711b93a11047a72d928bb9c7115996d34f48c675ede140ca205038ca94beb9a007d746efb18bd39c55ec9b941aae1a692dabed2bc0e00572656fe76c2dc7adc1b62610dc3051c2e09a500fad71de3b5e31ac3e66d" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "transfer-range-01-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + }, + { + "id": "transfer-range-01-bfN", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "a0f18c69cb0e4187daa25c76ffde09a9b7b50aa9837e7da8c0126564b4ed314f5275319e4b10e38f49d4def6ba1d3ebe8612b24c80c87653a61d865ec51bef28000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404000000000000020d40fed717097b9d86c50dda34e93ad87a18feb0dda1f9319da2be6b6fba54cfa878652001e53ca67b160bf22d8cda01b9d6194572559fc02d9be61d971382f101dcac52d8b7cb548c397209b31070975e3148b3f07ff51a224a309b32294354a7d5049d8ca494078d584c8e2594958eb907fd96754101aef484f4a948ec94495dbdadf0e21dfa033d089cf6ef845e380dad5f4d43e67d20274beecbe101a06dcecdd981bca3c60a419c9a3e65038e35d867c94418a2d02726400bfdf85a60c4d12fd18a045d5c105d5a9d0ae763d4670dceabb78d4dbe9b7fa3e2358b93b077ce20e741812595118ccc577ca3aa5574fdb77035563f6c05f5e3ec58be1df4b2a986a1c88a0fa7bc856cc67123d522f2d6429546daad6e31055cebe92ce5e64b04df3e716fb3935bbe157c069c0c4825e0bed1a8725851a11a17a14714e2f6d4c90e222fd1437b7eba9298729e3a1d30309723e23fcefd5a269247233683a21c6fc18b00345f64ec2acbc8dc34c26c2d22df36db765f2c585e92cbdd6d71a1d5ec079d12d12116ec8e2e041dc694eb1890dfa3c3e3837f42056c85758e2127206f1fcca42f071467a16607d828a2c0dba0761b070dc338cf5bc8280d325a601be890d915b6be3eca4dadcff6987a74dfea4281736fb33e66382a4194627fa5fc81f62d913afe249f7d2d4edbfade729ef836bffb5d2ed77b21aa65317f8c6139c0d48b806834c37acfc7982cf1a3ffe64cb760f3a11f0da7d9cd7ac8467a059026e50e493e5ce6082fed39e30ec148b716e636917fd198bf1e66d9ff519dc354eed5ec34f95989d8c87ef9028226367e8cca7e73bdec74db7a9b1bcb9125a2ea251a262fe539218a85ce98bdfc25cd53bdab604fc101320302ea28de49f5349b20790914ab23a85b80711b93a11047a72d928bb9c7115996d34f48c675ede140ca205038ca94beb9a007d746efb18bd39c55ec9b941aae1a692dabed2bc0e00572656fe76c2dc7adc1b62610dc3051c2e09a500fad71de3b5e31ac3e66d520d" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + } + ] + }, + { + "id": "transfer-composite-01", + "family": "transfer_composite", + "expected_valid": true, + "payload": { + "equality_proof_data_hex": "ccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c240fbf582f058b6f65c20fd91705d1ab420ede8aef1386885443260bb932570244a14962c8b9a3b7abde4d5a9b9055691c29c300bd07b4ccbf282d7541613300a0f18c69cb0e4187daa25c76ffde09a9b7b50aa9837e7da8c0126564b4ed314fce8812b4819919cded524a4ea5ca39c39ac900d633828ae3367112a735b75657f85d10244d06d82abba3cf607cc30a54cf2be89efa205a51b86818167f5f0d0622a19e1ba98e1304e880de4232b305be89b0a3212aebd6a3cb0b0658dd3e0405361e4c69bbe5b2cc6fc21831ae794d58574759b1d4cb64f99be3031e5e48ae0654d889ff612d4c22f59d9fb715ca8e719cebedd3bc6f2ad4f1a837d031859d03d3d8e05887a7759c9834690ad367e0298dea0746bdd9d8d80af0f8e1ddbeac07", + "range_proof_data_hex": "a0f18c69cb0e4187daa25c76ffde09a9b7b50aa9837e7da8c0126564b4ed314f5275319e4b10e38f49d4def6ba1d3ebe8612b24c80c87653a61d865ec51bef28000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404000000000000020d40fed717097b9d86c50dda34e93ad87a18feb0dda1f9319da2be6b6fba54cfa878652001e53ca67b160bf22d8cda01b9d6194572559fc02d9be61d971382f101dcac52d8b7cb548c397209b31070975e3148b3f07ff51a224a309b32294354a7d5049d8ca494078d584c8e2594958eb907fd96754101aef484f4a948ec94495dbdadf0e21dfa033d089cf6ef845e380dad5f4d43e67d20274beecbe101a06dcecdd981bca3c60a419c9a3e65038e35d867c94418a2d02726400bfdf85a60c4d12fd18a045d5c105d5a9d0ae763d4670dceabb78d4dbe9b7fa3e2358b93b077ce20e741812595118ccc577ca3aa5574fdb77035563f6c05f5e3ec58be1df4b2a986a1c88a0fa7bc856cc67123d522f2d6429546daad6e31055cebe92ce5e64b04df3e716fb3935bbe157c069c0c4825e0bed1a8725851a11a17a14714e2f6d4c90e222fd1437b7eba9298729e3a1d30309723e23fcefd5a269247233683a21c6fc18b00345f64ec2acbc8dc34c26c2d22df36db765f2c585e92cbdd6d71a1d5ec079d12d12116ec8e2e041dc694eb1890dfa3c3e3837f42056c85758e2127206f1fcca42f071467a16607d828a2c0dba0761b070dc338cf5bc8280d325a601be890d915b6be3eca4dadcff6987a74dfea4281736fb33e66382a4194627fa5fc81f62d913afe249f7d2d4edbfade729ef836bffb5d2ed77b21aa65317f8c6139c0d48b806834c37acfc7982cf1a3ffe64cb760f3a11f0da7d9cd7ac8467a059026e50e493e5ce6082fed39e30ec148b716e636917fd198bf1e66d9ff519dc354eed5ec34f95989d8c87ef9028226367e8cca7e73bdec74db7a9b1bcb9125a2ea251a262fe539218a85ce98bdfc25cd53bdab604fc101320302ea28de49f5349b20790914ab23a85b80711b93a11047a72d928bb9c7115996d34f48c675ede140ca205038ca94beb9a007d746efb18bd39c55ec9b941aae1a692dabed2bc0e00572656fe76c2dc7adc1b62610dc3051c2e09a500fad71de3b5e31ac3e66d520c", + "validity_proof_data_hex": "ccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d5275319e4b10e38f49d4def6ba1d3ebe8612b24c80c87653a61d865ec51bef288a6cacff5aff7e2740d4df71f9a17fa3470632c2fcd5541737572a33dcc88f74284a741e476c791ae088fe75b29088e3d5ac2b93cea1ca2ba1639ecbf60f814d5c909af844b3d08cdeb8e8bf52ebf5e9139f81989560a79645f668d02cdf7452e6fb3eade0eb0bb21de06712827e8203de7e02b1b60fb068ae8a8f5101f4381984546006c9c6f023899e5d40581e01ed3ede8c72c6ec98e859b42c4a124fd24d2817815cb6dd36e967029164e5bd96ceb03699749d7c65d01394189a416294649e3d31b861e15d4610b0907dfd65f8030d48ca0459bc9d0701806b345c765b5178bb9bbb420226337190a2db284f78a3d0b4aad459307ec6dc7e3c2c3fdd5c54cffdd1d8a0526002f97dc0516e6408162adf46d89476bbfacec4f897cacedd0b208f8d22a4c1a03c27e1841106fedf1222541944bbdd562fc33bb8521bde380f" + }, + "binding": { + "current_balance_commitment_hex": "04e54a371e512b55c5b1b79e48b46cb1cec3810ba62bee392a2ea228fd3ae443", + "current_balance_handle_hex": "aa1090265370114fd841117fcc89e2c31746d923da0ccef0025940c751147113", + "recipient_pubkey_hex": "9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d", + "sender_pubkey_hex": "ccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c" + }, + "mutations": [ + { + "id": "transfer-composite-01-swap-eq-val", + "op": "swap_fields", + "target": "payload.equality_proof_data_hex", + "params": { + "with": "payload.validity_proof_data_hex" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "transfer-composite-01-pk-s", + "op": "bitflip", + "target": "binding.sender_pubkey_hex", + "params": { + "value_hex": "cdab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "transfer-composite-01-pk-r", + "op": "bitflip", + "target": "binding.recipient_pubkey_hex", + "params": { + "value_hex": "9b8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "transfer-composite-01-bal-c1", + "op": "replace_field", + "target": "binding.current_balance_commitment_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "remaining balance commitment mismatch" + }, + { + "id": "transfer-composite-01-rng-trunc", + "op": "truncate", + "target": "payload.range_proof_data_hex", + "params": { + "value_hex": "a0f18c69cb0e4187daa25c76ffde09a9b7b50aa9837e7da8c0126564b4ed314f5275319e4b10e38f49d4def6ba1d3ebe8612b24c80c87653a61d865ec51bef28000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404000000000000020d40fed717097b9d86c50dda34e93ad87a18feb0dda1f9319da2be6b6fba54cfa878652001e53ca67b160bf22d8cda01b9d6194572559fc02d9be61d971382f101dcac52d8b7cb548c397209b31070975e3148b3f07ff51a224a309b32294354a7d5049d8ca494078d584c8e2594958eb907fd96754101aef484f4a948ec94495dbdadf0e21dfa033d089cf6ef845e380dad5f4d43e67d20274beecbe101a06dcecdd981bca3c60a419c9a3e65038e35d867c94418a2d02726400bfdf85a60c4d12fd18a045d5c105d5a9d0ae763d4670dceabb78d4dbe9b7fa3e2358b93b077ce20e741812595118ccc577ca3aa5574fdb77035563f6c05f5e3ec58be1df4b2a986a1c88a0fa7bc856cc67123d522f2d6429546daad6e31055cebe92ce5e64b04df3e716fb3935bbe157c069c0c4825e0bed1a8725851a11a17a14714e2f6d4c90e222fd1437b7eba9298729e3a1d30309723e23fcefd5a269247233683a21c6fc18b00345f64ec2acbc8dc34c26c2d22df36db765f2c585e92cbdd6d71a1d5ec079d12d12116ec8e2e041dc694eb1890dfa3c3e3837f42056c85758e2127206f1fcca42f071467a16607d828a2c0dba0761b070dc338cf5bc8280d325a601be890d915b6be3eca4dadcff6987a74dfea4281736fb33e66382a4194627fa5fc81f62d913afe249f7d2d4edbfade729ef836bffb5d2ed77b21aa65317f8c6139c0d48b806834c37acfc7982cf1a3ffe64cb760f3a11f0da7d9cd7ac8467a059026e50e493e5ce6082fed39e30ec148b716e636917fd198bf1e66d9ff519dc354eed5ec34f95989d8c87ef9028226367e8cca7e73bdec74db7a9b1bcb9125a2ea251a262fe539218a85ce98bdfc25cd53bdab604fc101320302ea28de49f5349b20790914ab23a85b80711b93a11047a72d928bb9c7115996d34f48c675ede140ca205038ca94beb9a007d746efb18bd39c55ec9b941aae1a692dabed2bc0e00572656fe76c2dc7adc1b62610dc3051c2e09a500fad71de3b5e31ac3e66d" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + } + ] + }, + { + "id": "equality-02", + "family": "equality", + "expected_valid": true, + "payload": { + "proof_data_hex": "9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d54d45a813c57eb36ce6f624bec32a33260941f2c154732bf73627bf2c1051f23228346c3c56c2c73c96c2e77c00957cf6d64879363e53cb53a1b7cacecf77318e2d1d2f655c55c71a98053558f178da1bd3f295224e99fe427622bbd3122696cae5422445ac7da4d245a0c01f5243d8aa1b34d8d9dc44a27c57bfcd30d89b925102f54bd4536ed6022ea188e5d777aef807e22908d56ac6495c13fd2761efa0024a685e99b776e94af0afe360f91c4131f05a09559103854d7697d3ca0a29331ebc27771ce873b9bad3296525a457af7adbd73a5d3876ee991bccd6febc0c60ecbde414296cd49fb1d2512e6b4c918666cdb9ff9855fc922a00933acc027590ca67334a122fce4a20fa0e06a607f6f1908b2d2d087f079558faec88ef92a5402" + }, + "mutations": [ + { + "id": "equality-02-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "9b8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d54d45a813c57eb36ce6f624bec32a33260941f2c154732bf73627bf2c1051f23228346c3c56c2c73c96c2e77c00957cf6d64879363e53cb53a1b7cacecf77318e2d1d2f655c55c71a98053558f178da1bd3f295224e99fe427622bbd3122696cae5422445ac7da4d245a0c01f5243d8aa1b34d8d9dc44a27c57bfcd30d89b925102f54bd4536ed6022ea188e5d777aef807e22908d56ac6495c13fd2761efa0024a685e99b776e94af0afe360f91c4131f05a09559103854d7697d3ca0a29331ebc27771ce873b9bad3296525a457af7adbd73a5d3876ee991bccd6febc0c60ecbde414296cd49fb1d2512e6b4c918666cdb9ff9855fc922a00933acc027590ca67334a122fce4a20fa0e06a607f6f1908b2d2d087f079558faec88ef92a5402" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "equality-02-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d54d45a813c57eb36ce6f624bec32a33260941f2c154732bf73627bf2c1051f23228346c3c56c2c73c96c2e77c00957cf6d64879363e53cb53a1b7cacecf77318e2d1d2f655c55c71a98053558f178da1bd3f295224e99fe427622bbd3122696cae5422445ac7da4d245a0c01f5243d8aa1b34d8d9dc44a27c57bfcd30d89b925102f54bd4536ed6022ea188e5d777aef807e22908d56ac6495c13fd2761efa0024a685e99b776e94af0afe360f91c4131f05a09559103854d7697d3ca0a29331ebc27771ce873b9bad3296525a457af7adbd73a5d3876ee991bccd6febc0c60ecbde414296cd49fb1d2512e6b4c918666cdb9ff9855fc922a00933acc027590ca67334a122fce4a20fa0e06a607f6f1908b2d2d087f079558faec88ef92a" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "equality-02-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + } + ] + }, + { + "id": "validity-02", + "family": "validity", + "expected_valid": true, + "payload": { + "proof_data_hex": "9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c2201ea7ec093a4a4b72267f737a93ccb67745975ce5970c0a56bb5c1e3797769ef67d82d0f687310b824dd854de4cc5db78f433cb1851a9292f35043cb2d6aeea13e604a19c5cbba67fa85352bf1a05c0f582c9f72d34606e8892245e390e050af2cba7dda34936875fde95d84909baa346fa6aea9901c1ae8c499f97b6ce0f5904dfa2f58e84be4d398579b13a3b588ec11236567d872d49de1ca2c63cae1b1670d3cd1b5b80c894792d7ec9c7851038dc75fe3ae10779f0fcd882b7ee02a69ba6a94dea3d472e41811210d5c9fc4e0dcc32ae226cf15befb372647423a26edb7498c83f9e20ac0f061f36d48696c4117c54d14621d76df51cd865b2efd4171ae6dec82b4dbe7fcb293efb79e73d0f5f089603c0ba035e3e89eabe7c43cadd8ed48592435fbaaba0e7f80093d08b28c4fe0339206ea0511c7fc3b9da6281d1834011a2eaecb844829c3ec410d7aded445a69521632373adeeaf08d994d771989a07" + }, + "mutations": [ + { + "id": "validity-02-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "9b8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c2201ea7ec093a4a4b72267f737a93ccb67745975ce5970c0a56bb5c1e3797769ef67d82d0f687310b824dd854de4cc5db78f433cb1851a9292f35043cb2d6aeea13e604a19c5cbba67fa85352bf1a05c0f582c9f72d34606e8892245e390e050af2cba7dda34936875fde95d84909baa346fa6aea9901c1ae8c499f97b6ce0f5904dfa2f58e84be4d398579b13a3b588ec11236567d872d49de1ca2c63cae1b1670d3cd1b5b80c894792d7ec9c7851038dc75fe3ae10779f0fcd882b7ee02a69ba6a94dea3d472e41811210d5c9fc4e0dcc32ae226cf15befb372647423a26edb7498c83f9e20ac0f061f36d48696c4117c54d14621d76df51cd865b2efd4171ae6dec82b4dbe7fcb293efb79e73d0f5f089603c0ba035e3e89eabe7c43cadd8ed48592435fbaaba0e7f80093d08b28c4fe0339206ea0511c7fc3b9da6281d1834011a2eaecb844829c3ec410d7aded445a69521632373adeeaf08d994d771989a07" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "validity-02-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c2201ea7ec093a4a4b72267f737a93ccb67745975ce5970c0a56bb5c1e3797769ef67d82d0f687310b824dd854de4cc5db78f433cb1851a9292f35043cb2d6aeea13e604a19c5cbba67fa85352bf1a05c0f582c9f72d34606e8892245e390e050af2cba7dda34936875fde95d84909baa346fa6aea9901c1ae8c499f97b6ce0f5904dfa2f58e84be4d398579b13a3b588ec11236567d872d49de1ca2c63cae1b1670d3cd1b5b80c894792d7ec9c7851038dc75fe3ae10779f0fcd882b7ee02a69ba6a94dea3d472e41811210d5c9fc4e0dcc32ae226cf15befb372647423a26edb7498c83f9e20ac0f061f36d48696c4117c54d14621d76df51cd865b2efd4171ae6dec82b4dbe7fcb293efb79e73d0f5f089603c0ba035e3e89eabe7c43cadd8ed48592435fbaaba0e7f80093d08b28c4fe0339206ea0511c7fc3b9da6281d1834011a2eaecb844829c3ec410d7aded445a69521632373adeeaf08d994d77198" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "validity-02-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + } + ] + }, + { + "id": "transfer-range-02", + "family": "transfer_range", + "expected_valid": true, + "payload": { + "proof_data_hex": "e2d1d2f655c55c71a98053558f178da1bd3f295224e99fe427622bbd3122696cea7ec093a4a4b72267f737a93ccb67745975ce5970c0a56bb5c1e3797769ef670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000364955db83e37d5696afaeed21e0c7ced9a951a78d0af7ad1468ee3654940d71527b0059940db9ed8ccf47e201dce6a8e04741246bef1d6490326cb9a62a0244e417bee2a407f3dcd1b05a1bfb390e6c8b368820b9b9903c6023d4bce36f1a3be8c972c16c2ac5fe8ce41fe5715fb9570d66de2ee127d14bf4db36708f917058bc3f387157d5f235d8dbe0a1efec6355366294dac73ea6b269ab0a1a26c84a055385649f0108409eaa6d7169db0a71540f998c4737b1f9796d46d7d0d6a75c0ab0a1b8609f7e61ee9be22f7f576117e506805efdff4eee6167d70f3d7c1518024272206754dcc2749e491fe10cd966301808949880e04960f3753c6e277632012ce51ac6d4b8bf5ee66ff08be9eef19cbdf978ffd9d4176ed15f88fdeae3f247321b373b63330a844fd640d007c1abd6e8012445fd4f21501817f3de863c414c9aecb76e2b8245fab58bad799b9f95534a3a6cfedef821e1cb4efed59f8b73504e561708968fa216039c712832211acd5b29f337bd85498d2b7ab6e94f28bf6ffc7a16e4480d90ae9ea7fb241172a44200895dfebf2e310c6c44bd2e3a52fd4e5cf3ec8671724b6e8fc7cc8c37985efa8b454fcf0392525736e8d32227c2e509864862dd40ac7a1ba06ff803d92854baf8392ef197e44d49b04b41b8ff35bf01708ea776a1bb42154ae9b6f961eec68c9eedd9453ab9a769b1165a20d9d54f1eaa8232394cb5c3ce19ab0c36bcb575ab1c178cbfa4a03e13ae0efa6271c9412e30861f247a317ceba38d03dd2ef1ca4ecc22662c0a2540a0dd5c8c6d4756e0524074183d9a8b478997004f3d656dcba9c070559404eccd60e60b731f31f4a31b002f5545f1d7b858c0a9e4010ccb77c0d703b957ae8096fe6aae1a75d81961020ec022e16f143be85fe24309641d038f0cb2f65c7d4a9403269f261ef276f136a44e57d6055c30aba527a361bf3d6d82065f1b4772121b7276888bad201de200a7f13d698df04f400abc40eee9f7ab812679000b96dc125ae977092670877a0e" + }, + "mutations": [ + { + "id": "transfer-range-02-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "e3d1d2f655c55c71a98053558f178da1bd3f295224e99fe427622bbd3122696cea7ec093a4a4b72267f737a93ccb67745975ce5970c0a56bb5c1e3797769ef670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000364955db83e37d5696afaeed21e0c7ced9a951a78d0af7ad1468ee3654940d71527b0059940db9ed8ccf47e201dce6a8e04741246bef1d6490326cb9a62a0244e417bee2a407f3dcd1b05a1bfb390e6c8b368820b9b9903c6023d4bce36f1a3be8c972c16c2ac5fe8ce41fe5715fb9570d66de2ee127d14bf4db36708f917058bc3f387157d5f235d8dbe0a1efec6355366294dac73ea6b269ab0a1a26c84a055385649f0108409eaa6d7169db0a71540f998c4737b1f9796d46d7d0d6a75c0ab0a1b8609f7e61ee9be22f7f576117e506805efdff4eee6167d70f3d7c1518024272206754dcc2749e491fe10cd966301808949880e04960f3753c6e277632012ce51ac6d4b8bf5ee66ff08be9eef19cbdf978ffd9d4176ed15f88fdeae3f247321b373b63330a844fd640d007c1abd6e8012445fd4f21501817f3de863c414c9aecb76e2b8245fab58bad799b9f95534a3a6cfedef821e1cb4efed59f8b73504e561708968fa216039c712832211acd5b29f337bd85498d2b7ab6e94f28bf6ffc7a16e4480d90ae9ea7fb241172a44200895dfebf2e310c6c44bd2e3a52fd4e5cf3ec8671724b6e8fc7cc8c37985efa8b454fcf0392525736e8d32227c2e509864862dd40ac7a1ba06ff803d92854baf8392ef197e44d49b04b41b8ff35bf01708ea776a1bb42154ae9b6f961eec68c9eedd9453ab9a769b1165a20d9d54f1eaa8232394cb5c3ce19ab0c36bcb575ab1c178cbfa4a03e13ae0efa6271c9412e30861f247a317ceba38d03dd2ef1ca4ecc22662c0a2540a0dd5c8c6d4756e0524074183d9a8b478997004f3d656dcba9c070559404eccd60e60b731f31f4a31b002f5545f1d7b858c0a9e4010ccb77c0d703b957ae8096fe6aae1a75d81961020ec022e16f143be85fe24309641d038f0cb2f65c7d4a9403269f261ef276f136a44e57d6055c30aba527a361bf3d6d82065f1b4772121b7276888bad201de200a7f13d698df04f400abc40eee9f7ab812679000b96dc125ae977092670877a0e" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "transfer-range-02-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "e2d1d2f655c55c71a98053558f178da1bd3f295224e99fe427622bbd3122696cea7ec093a4a4b72267f737a93ccb67745975ce5970c0a56bb5c1e3797769ef670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000364955db83e37d5696afaeed21e0c7ced9a951a78d0af7ad1468ee3654940d71527b0059940db9ed8ccf47e201dce6a8e04741246bef1d6490326cb9a62a0244e417bee2a407f3dcd1b05a1bfb390e6c8b368820b9b9903c6023d4bce36f1a3be8c972c16c2ac5fe8ce41fe5715fb9570d66de2ee127d14bf4db36708f917058bc3f387157d5f235d8dbe0a1efec6355366294dac73ea6b269ab0a1a26c84a055385649f0108409eaa6d7169db0a71540f998c4737b1f9796d46d7d0d6a75c0ab0a1b8609f7e61ee9be22f7f576117e506805efdff4eee6167d70f3d7c1518024272206754dcc2749e491fe10cd966301808949880e04960f3753c6e277632012ce51ac6d4b8bf5ee66ff08be9eef19cbdf978ffd9d4176ed15f88fdeae3f247321b373b63330a844fd640d007c1abd6e8012445fd4f21501817f3de863c414c9aecb76e2b8245fab58bad799b9f95534a3a6cfedef821e1cb4efed59f8b73504e561708968fa216039c712832211acd5b29f337bd85498d2b7ab6e94f28bf6ffc7a16e4480d90ae9ea7fb241172a44200895dfebf2e310c6c44bd2e3a52fd4e5cf3ec8671724b6e8fc7cc8c37985efa8b454fcf0392525736e8d32227c2e509864862dd40ac7a1ba06ff803d92854baf8392ef197e44d49b04b41b8ff35bf01708ea776a1bb42154ae9b6f961eec68c9eedd9453ab9a769b1165a20d9d54f1eaa8232394cb5c3ce19ab0c36bcb575ab1c178cbfa4a03e13ae0efa6271c9412e30861f247a317ceba38d03dd2ef1ca4ecc22662c0a2540a0dd5c8c6d4756e0524074183d9a8b478997004f3d656dcba9c070559404eccd60e60b731f31f4a31b002f5545f1d7b858c0a9e4010ccb77c0d703b957ae8096fe6aae1a75d81961020ec022e16f143be85fe24309641d038f0cb2f65c7d4a9403269f261ef276f136a44e57d6055c30aba527a361bf3d6d82065f1b4772121b7276888bad201de200a7f13d698df04f400abc40eee9f7ab812679000b96dc125ae97709267087" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "transfer-range-02-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + }, + { + "id": "transfer-range-02-bfN", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "e2d1d2f655c55c71a98053558f178da1bd3f295224e99fe427622bbd3122696cea7ec093a4a4b72267f737a93ccb67745975ce5970c0a56bb5c1e3797769ef670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000364955db83e37d5696afaeed21e0c7ced9a951a78d0af7ad1468ee3654940d71527b0059940db9ed8ccf47e201dce6a8e04741246bef1d6490326cb9a62a0244e417bee2a407f3dcd1b05a1bfb390e6c8b368820b9b9903c6023d4bce36f1a3be8c972c16c2ac5fe8ce41fe5715fb9570d66de2ee127d14bf4db36708f917058bc3f387157d5f235d8dbe0a1efec6355366294dac73ea6b269ab0a1a26c84a055385649f0108409eaa6d7169db0a71540f998c4737b1f9796d46d7d0d6a75c0ab0a1b8609f7e61ee9be22f7f576117e506805efdff4eee6167d70f3d7c1518024272206754dcc2749e491fe10cd966301808949880e04960f3753c6e277632012ce51ac6d4b8bf5ee66ff08be9eef19cbdf978ffd9d4176ed15f88fdeae3f247321b373b63330a844fd640d007c1abd6e8012445fd4f21501817f3de863c414c9aecb76e2b8245fab58bad799b9f95534a3a6cfedef821e1cb4efed59f8b73504e561708968fa216039c712832211acd5b29f337bd85498d2b7ab6e94f28bf6ffc7a16e4480d90ae9ea7fb241172a44200895dfebf2e310c6c44bd2e3a52fd4e5cf3ec8671724b6e8fc7cc8c37985efa8b454fcf0392525736e8d32227c2e509864862dd40ac7a1ba06ff803d92854baf8392ef197e44d49b04b41b8ff35bf01708ea776a1bb42154ae9b6f961eec68c9eedd9453ab9a769b1165a20d9d54f1eaa8232394cb5c3ce19ab0c36bcb575ab1c178cbfa4a03e13ae0efa6271c9412e30861f247a317ceba38d03dd2ef1ca4ecc22662c0a2540a0dd5c8c6d4756e0524074183d9a8b478997004f3d656dcba9c070559404eccd60e60b731f31f4a31b002f5545f1d7b858c0a9e4010ccb77c0d703b957ae8096fe6aae1a75d81961020ec022e16f143be85fe24309641d038f0cb2f65c7d4a9403269f261ef276f136a44e57d6055c30aba527a361bf3d6d82065f1b4772121b7276888bad201de200a7f13d698df04f400abc40eee9f7ab812679000b96dc125ae977092670877a0f" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + } + ] + }, + { + "id": "transfer-composite-02", + "family": "transfer_composite", + "expected_valid": true, + "payload": { + "equality_proof_data_hex": "9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d54d45a813c57eb36ce6f624bec32a33260941f2c154732bf73627bf2c1051f23228346c3c56c2c73c96c2e77c00957cf6d64879363e53cb53a1b7cacecf77318e2d1d2f655c55c71a98053558f178da1bd3f295224e99fe427622bbd3122696cae5422445ac7da4d245a0c01f5243d8aa1b34d8d9dc44a27c57bfcd30d89b925102f54bd4536ed6022ea188e5d777aef807e22908d56ac6495c13fd2761efa0024a685e99b776e94af0afe360f91c4131f05a09559103854d7697d3ca0a29331ebc27771ce873b9bad3296525a457af7adbd73a5d3876ee991bccd6febc0c60ecbde414296cd49fb1d2512e6b4c918666cdb9ff9855fc922a00933acc027590ca67334a122fce4a20fa0e06a607f6f1908b2d2d087f079558faec88ef92a5402", + "range_proof_data_hex": "e2d1d2f655c55c71a98053558f178da1bd3f295224e99fe427622bbd3122696cea7ec093a4a4b72267f737a93ccb67745975ce5970c0a56bb5c1e3797769ef670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000364955db83e37d5696afaeed21e0c7ced9a951a78d0af7ad1468ee3654940d71527b0059940db9ed8ccf47e201dce6a8e04741246bef1d6490326cb9a62a0244e417bee2a407f3dcd1b05a1bfb390e6c8b368820b9b9903c6023d4bce36f1a3be8c972c16c2ac5fe8ce41fe5715fb9570d66de2ee127d14bf4db36708f917058bc3f387157d5f235d8dbe0a1efec6355366294dac73ea6b269ab0a1a26c84a055385649f0108409eaa6d7169db0a71540f998c4737b1f9796d46d7d0d6a75c0ab0a1b8609f7e61ee9be22f7f576117e506805efdff4eee6167d70f3d7c1518024272206754dcc2749e491fe10cd966301808949880e04960f3753c6e277632012ce51ac6d4b8bf5ee66ff08be9eef19cbdf978ffd9d4176ed15f88fdeae3f247321b373b63330a844fd640d007c1abd6e8012445fd4f21501817f3de863c414c9aecb76e2b8245fab58bad799b9f95534a3a6cfedef821e1cb4efed59f8b73504e561708968fa216039c712832211acd5b29f337bd85498d2b7ab6e94f28bf6ffc7a16e4480d90ae9ea7fb241172a44200895dfebf2e310c6c44bd2e3a52fd4e5cf3ec8671724b6e8fc7cc8c37985efa8b454fcf0392525736e8d32227c2e509864862dd40ac7a1ba06ff803d92854baf8392ef197e44d49b04b41b8ff35bf01708ea776a1bb42154ae9b6f961eec68c9eedd9453ab9a769b1165a20d9d54f1eaa8232394cb5c3ce19ab0c36bcb575ab1c178cbfa4a03e13ae0efa6271c9412e30861f247a317ceba38d03dd2ef1ca4ecc22662c0a2540a0dd5c8c6d4756e0524074183d9a8b478997004f3d656dcba9c070559404eccd60e60b731f31f4a31b002f5545f1d7b858c0a9e4010ccb77c0d703b957ae8096fe6aae1a75d81961020ec022e16f143be85fe24309641d038f0cb2f65c7d4a9403269f261ef276f136a44e57d6055c30aba527a361bf3d6d82065f1b4772121b7276888bad201de200a7f13d698df04f400abc40eee9f7ab812679000b96dc125ae977092670877a0e", + "validity_proof_data_hex": "9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c2201ea7ec093a4a4b72267f737a93ccb67745975ce5970c0a56bb5c1e3797769ef67d82d0f687310b824dd854de4cc5db78f433cb1851a9292f35043cb2d6aeea13e604a19c5cbba67fa85352bf1a05c0f582c9f72d34606e8892245e390e050af2cba7dda34936875fde95d84909baa346fa6aea9901c1ae8c499f97b6ce0f5904dfa2f58e84be4d398579b13a3b588ec11236567d872d49de1ca2c63cae1b1670d3cd1b5b80c894792d7ec9c7851038dc75fe3ae10779f0fcd882b7ee02a69ba6a94dea3d472e41811210d5c9fc4e0dcc32ae226cf15befb372647423a26edb7498c83f9e20ac0f061f36d48696c4117c54d14621d76df51cd865b2efd4171ae6dec82b4dbe7fcb293efb79e73d0f5f089603c0ba035e3e89eabe7c43cadd8ed48592435fbaaba0e7f80093d08b28c4fe0339206ea0511c7fc3b9da6281d1834011a2eaecb844829c3ec410d7aded445a69521632373adeeaf08d994d771989a07" + }, + "binding": { + "current_balance_commitment_hex": "decf0746f26374837048e22787dc319e5dfc76e3ac41ec8ef8da3f1543a5ee22", + "current_balance_handle_hex": "0e880114b417f34e2d40aa9a54d6454d472b047db3049069eae4190fecbcb31c", + "recipient_pubkey_hex": "40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c2201", + "sender_pubkey_hex": "9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d" + }, + "mutations": [ + { + "id": "transfer-composite-02-swap-eq-val", + "op": "swap_fields", + "target": "payload.equality_proof_data_hex", + "params": { + "with": "payload.validity_proof_data_hex" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "transfer-composite-02-pk-s", + "op": "bitflip", + "target": "binding.sender_pubkey_hex", + "params": { + "value_hex": "9b8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "transfer-composite-02-pk-r", + "op": "bitflip", + "target": "binding.recipient_pubkey_hex", + "params": { + "value_hex": "41b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c2201" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "transfer-composite-02-bal-c1", + "op": "replace_field", + "target": "binding.current_balance_commitment_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "remaining balance commitment mismatch" + }, + { + "id": "transfer-composite-02-rng-trunc", + "op": "truncate", + "target": "payload.range_proof_data_hex", + "params": { + "value_hex": "e2d1d2f655c55c71a98053558f178da1bd3f295224e99fe427622bbd3122696cea7ec093a4a4b72267f737a93ccb67745975ce5970c0a56bb5c1e3797769ef670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000364955db83e37d5696afaeed21e0c7ced9a951a78d0af7ad1468ee3654940d71527b0059940db9ed8ccf47e201dce6a8e04741246bef1d6490326cb9a62a0244e417bee2a407f3dcd1b05a1bfb390e6c8b368820b9b9903c6023d4bce36f1a3be8c972c16c2ac5fe8ce41fe5715fb9570d66de2ee127d14bf4db36708f917058bc3f387157d5f235d8dbe0a1efec6355366294dac73ea6b269ab0a1a26c84a055385649f0108409eaa6d7169db0a71540f998c4737b1f9796d46d7d0d6a75c0ab0a1b8609f7e61ee9be22f7f576117e506805efdff4eee6167d70f3d7c1518024272206754dcc2749e491fe10cd966301808949880e04960f3753c6e277632012ce51ac6d4b8bf5ee66ff08be9eef19cbdf978ffd9d4176ed15f88fdeae3f247321b373b63330a844fd640d007c1abd6e8012445fd4f21501817f3de863c414c9aecb76e2b8245fab58bad799b9f95534a3a6cfedef821e1cb4efed59f8b73504e561708968fa216039c712832211acd5b29f337bd85498d2b7ab6e94f28bf6ffc7a16e4480d90ae9ea7fb241172a44200895dfebf2e310c6c44bd2e3a52fd4e5cf3ec8671724b6e8fc7cc8c37985efa8b454fcf0392525736e8d32227c2e509864862dd40ac7a1ba06ff803d92854baf8392ef197e44d49b04b41b8ff35bf01708ea776a1bb42154ae9b6f961eec68c9eedd9453ab9a769b1165a20d9d54f1eaa8232394cb5c3ce19ab0c36bcb575ab1c178cbfa4a03e13ae0efa6271c9412e30861f247a317ceba38d03dd2ef1ca4ecc22662c0a2540a0dd5c8c6d4756e0524074183d9a8b478997004f3d656dcba9c070559404eccd60e60b731f31f4a31b002f5545f1d7b858c0a9e4010ccb77c0d703b957ae8096fe6aae1a75d81961020ec022e16f143be85fe24309641d038f0cb2f65c7d4a9403269f261ef276f136a44e57d6055c30aba527a361bf3d6d82065f1b4772121b7276888bad201de200a7f13d698df04f400abc40eee9f7ab812679000b96dc125ae97709267087" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + } + ] + }, + { + "id": "equality-03", + "family": "equality", + "expected_valid": true, + "payload": { + "proof_data_hex": "40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c22011236a299cf39e9b97c79547ecbc358dd5411d8d75e14a827a5b98125adf62a41c6b7bfaccf40f04df0f78492907d4c17f5516326c77c6ba2d963ea734fa75c0550c243075006fa553e02b29605b8716b952c3dbc832d510cc0a668928de6653fb2d012282a376ec1041c1a34a2e2c512e5595f110e514951b0119b1cbe6f152232e02db0049566adc25a573cfddcc1444c0e52a219a08a0366784fd6d2a5234b5e0e44952de1f99911ae5ed5f7d54e95ecf89ae82c06d7e23033097c093f784da22f2f1fee5a336c85e7cfc5b0ac907c12b020c7f0b29e4e85e005bccaf8890a89ffccba39c6cd16e2b7c88e4166bbe4f99f0996d29b18fe6e494f8660f77006670a56c03dfcfb8e1368eede259be91feadec1d54bd1dcc04b9e5208fea3e60f" + }, + "mutations": [ + { + "id": "equality-03-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "41b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c22011236a299cf39e9b97c79547ecbc358dd5411d8d75e14a827a5b98125adf62a41c6b7bfaccf40f04df0f78492907d4c17f5516326c77c6ba2d963ea734fa75c0550c243075006fa553e02b29605b8716b952c3dbc832d510cc0a668928de6653fb2d012282a376ec1041c1a34a2e2c512e5595f110e514951b0119b1cbe6f152232e02db0049566adc25a573cfddcc1444c0e52a219a08a0366784fd6d2a5234b5e0e44952de1f99911ae5ed5f7d54e95ecf89ae82c06d7e23033097c093f784da22f2f1fee5a336c85e7cfc5b0ac907c12b020c7f0b29e4e85e005bccaf8890a89ffccba39c6cd16e2b7c88e4166bbe4f99f0996d29b18fe6e494f8660f77006670a56c03dfcfb8e1368eede259be91feadec1d54bd1dcc04b9e5208fea3e60f" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "equality-03-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c22011236a299cf39e9b97c79547ecbc358dd5411d8d75e14a827a5b98125adf62a41c6b7bfaccf40f04df0f78492907d4c17f5516326c77c6ba2d963ea734fa75c0550c243075006fa553e02b29605b8716b952c3dbc832d510cc0a668928de6653fb2d012282a376ec1041c1a34a2e2c512e5595f110e514951b0119b1cbe6f152232e02db0049566adc25a573cfddcc1444c0e52a219a08a0366784fd6d2a5234b5e0e44952de1f99911ae5ed5f7d54e95ecf89ae82c06d7e23033097c093f784da22f2f1fee5a336c85e7cfc5b0ac907c12b020c7f0b29e4e85e005bccaf8890a89ffccba39c6cd16e2b7c88e4166bbe4f99f0996d29b18fe6e494f8660f77006670a56c03dfcfb8e1368eede259be91feadec1d54bd1dcc04b9e5208fea3" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "equality-03-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + } + ] + }, + { + "id": "validity-03", + "family": "validity", + "expected_valid": true, + "payload": { + "proof_data_hex": "40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c22011ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c667842452cfe4069472ca9a2aaeb42b42076e5a43768ace50e2cff5d7f65385d4a1012a4cbe10e2d5f095c834e6351618aa702f3956f08022b92269d7464406e8bcd01f0059d8a86b0090a51e9a3899cd9de70147cdd2722f8d34b76c9215e79fc7d70fde69abdf3d5e237631a4eb99bad52df5d58a910a080de48ba01c0237274e8e321893a874646d2fa987cbcaf3853873533ebeaa80c5d2fc829d896805b1fe3c62b4d3e22dd3712dddc9c015f084f55ae7b6065d7661024646e126805a1ef9173f340d09f755e86c9b7b9d14ef5f043f73d93f13ae49f424d6bf86f22283e995074abf7ee0182eacb5cae95578982e938e95cb561ed692b3f1bb3c239d41b2437cd21314e84600da1c52483aa4efa1f5951cbcb0f35e7234acc0d08cb9b51f1f382c1c1d432f49959cd585fb8b54bec2b5b2c6dceb71e3ad6807de38bb56f4a20e5c27cb82c7002e7b95d8a9d406d175fe6570f3b315955a9e6e105b9e8ab5880e" + }, + "mutations": [ + { + "id": "validity-03-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "41b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c22011ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c667842452cfe4069472ca9a2aaeb42b42076e5a43768ace50e2cff5d7f65385d4a1012a4cbe10e2d5f095c834e6351618aa702f3956f08022b92269d7464406e8bcd01f0059d8a86b0090a51e9a3899cd9de70147cdd2722f8d34b76c9215e79fc7d70fde69abdf3d5e237631a4eb99bad52df5d58a910a080de48ba01c0237274e8e321893a874646d2fa987cbcaf3853873533ebeaa80c5d2fc829d896805b1fe3c62b4d3e22dd3712dddc9c015f084f55ae7b6065d7661024646e126805a1ef9173f340d09f755e86c9b7b9d14ef5f043f73d93f13ae49f424d6bf86f22283e995074abf7ee0182eacb5cae95578982e938e95cb561ed692b3f1bb3c239d41b2437cd21314e84600da1c52483aa4efa1f5951cbcb0f35e7234acc0d08cb9b51f1f382c1c1d432f49959cd585fb8b54bec2b5b2c6dceb71e3ad6807de38bb56f4a20e5c27cb82c7002e7b95d8a9d406d175fe6570f3b315955a9e6e105b9e8ab5880e" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "validity-03-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c22011ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c667842452cfe4069472ca9a2aaeb42b42076e5a43768ace50e2cff5d7f65385d4a1012a4cbe10e2d5f095c834e6351618aa702f3956f08022b92269d7464406e8bcd01f0059d8a86b0090a51e9a3899cd9de70147cdd2722f8d34b76c9215e79fc7d70fde69abdf3d5e237631a4eb99bad52df5d58a910a080de48ba01c0237274e8e321893a874646d2fa987cbcaf3853873533ebeaa80c5d2fc829d896805b1fe3c62b4d3e22dd3712dddc9c015f084f55ae7b6065d7661024646e126805a1ef9173f340d09f755e86c9b7b9d14ef5f043f73d93f13ae49f424d6bf86f22283e995074abf7ee0182eacb5cae95578982e938e95cb561ed692b3f1bb3c239d41b2437cd21314e84600da1c52483aa4efa1f5951cbcb0f35e7234acc0d08cb9b51f1f382c1c1d432f49959cd585fb8b54bec2b5b2c6dceb71e3ad6807de38bb56f4a20e5c27cb82c7002e7b95d8a9d406d175fe6570f3b315955a9e6e105b9e8ab5" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "validity-03-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + } + ] + }, + { + "id": "transfer-range-03", + "family": "transfer_range", + "expected_valid": true, + "payload": { + "proof_data_hex": "50c243075006fa553e02b29605b8716b952c3dbc832d510cc0a668928de6653f52cfe4069472ca9a2aaeb42b42076e5a43768ace50e2cff5d7f65385d4a1012a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000005ac1c0dec5266e5b39a17c8deebfa34d56adc0c69d58794eb9ecfefe2705f67bee015b045396902d3012c863854ed3c1e223eca6605110616e8c9bead911db525203cb997f2cf259daf2c4bbc32e3f34ee788023b3d4b13b3b2926840de4d7170ebdcd854ce2ca95ac9b5d546e6caafb551c603842b367a5d5347a28f1f8707cedc3b59431d94180324b2cc5a93369e80dbd9e434736afed962df2a0a950700d476b9d5ca1175dbe1f955cf847fb16367c17690ed3d28447949006c32799460d69fd6f04ce3e46324ca39f2d463ca17f9a0be5302d228d83a9f9d2a77de98e084aa2474da38c74f755018a9b5f9da84bdb78b1c755b48e7b27e3216ca1551104764d45139e8aaeabfc6e7b49c330b8493603695170d2a7d94c1f055684305b335ea52b7d4ebeaed1477668d542d2e16a5c7c020a1c406d9c281541890e357a48aa498aa46d187b4d63719103cb7b29496661d3eac593e0c45965bae02262bf6d1a5b80655a05a10b8c756423b3bad79b367eaa775d6603c1f328fcdf7f37b05490e719d0b15d1bd1738855444e17036b38462c1e27ee5b7d888b4420717d8b3afca450b7a94d42f6f3cebf2dcfbf681b65aa7b5467cf4900eaf79d7f1152df5514fed1cf4ee41c3a2ee019303ef8da4b9ca0255bd05a5be311b71669c49d110a7026ae60b227a007e08fddc24db1dd2b00da84904185e9c5e524f25ec4ccab1e2828dbd9c9ab92afc166f62ef6d6a97a256c5babb805123cb8314af1718fd77e5a3228f0170cefdd7f0a595555144c51960c0532473db09a756e3e1bb2c1054b3a900da56a76b9e5a26eb8b4cc17d663ca6ab8946bcf42104705b4b1cbba4a165aa3a072b1ab06729f3afd124289a942c351ca980da5752eb48dcd8609937a72989a9bd2dee57117ad230c1346a4d52a89636a0a65db0dffb8746a8496ccef16d57bb564af1d768158156da58fefdcfe3626c131672cb3f0264b886ef923ed06c1f07b3a1d8b23b977a72d145a33367d7bd765013eb15ef36eeb0b7ac483cc08" + }, + "mutations": [ + { + "id": "transfer-range-03-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "51c243075006fa553e02b29605b8716b952c3dbc832d510cc0a668928de6653f52cfe4069472ca9a2aaeb42b42076e5a43768ace50e2cff5d7f65385d4a1012a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000005ac1c0dec5266e5b39a17c8deebfa34d56adc0c69d58794eb9ecfefe2705f67bee015b045396902d3012c863854ed3c1e223eca6605110616e8c9bead911db525203cb997f2cf259daf2c4bbc32e3f34ee788023b3d4b13b3b2926840de4d7170ebdcd854ce2ca95ac9b5d546e6caafb551c603842b367a5d5347a28f1f8707cedc3b59431d94180324b2cc5a93369e80dbd9e434736afed962df2a0a950700d476b9d5ca1175dbe1f955cf847fb16367c17690ed3d28447949006c32799460d69fd6f04ce3e46324ca39f2d463ca17f9a0be5302d228d83a9f9d2a77de98e084aa2474da38c74f755018a9b5f9da84bdb78b1c755b48e7b27e3216ca1551104764d45139e8aaeabfc6e7b49c330b8493603695170d2a7d94c1f055684305b335ea52b7d4ebeaed1477668d542d2e16a5c7c020a1c406d9c281541890e357a48aa498aa46d187b4d63719103cb7b29496661d3eac593e0c45965bae02262bf6d1a5b80655a05a10b8c756423b3bad79b367eaa775d6603c1f328fcdf7f37b05490e719d0b15d1bd1738855444e17036b38462c1e27ee5b7d888b4420717d8b3afca450b7a94d42f6f3cebf2dcfbf681b65aa7b5467cf4900eaf79d7f1152df5514fed1cf4ee41c3a2ee019303ef8da4b9ca0255bd05a5be311b71669c49d110a7026ae60b227a007e08fddc24db1dd2b00da84904185e9c5e524f25ec4ccab1e2828dbd9c9ab92afc166f62ef6d6a97a256c5babb805123cb8314af1718fd77e5a3228f0170cefdd7f0a595555144c51960c0532473db09a756e3e1bb2c1054b3a900da56a76b9e5a26eb8b4cc17d663ca6ab8946bcf42104705b4b1cbba4a165aa3a072b1ab06729f3afd124289a942c351ca980da5752eb48dcd8609937a72989a9bd2dee57117ad230c1346a4d52a89636a0a65db0dffb8746a8496ccef16d57bb564af1d768158156da58fefdcfe3626c131672cb3f0264b886ef923ed06c1f07b3a1d8b23b977a72d145a33367d7bd765013eb15ef36eeb0b7ac483cc08" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "transfer-range-03-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "50c243075006fa553e02b29605b8716b952c3dbc832d510cc0a668928de6653f52cfe4069472ca9a2aaeb42b42076e5a43768ace50e2cff5d7f65385d4a1012a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000005ac1c0dec5266e5b39a17c8deebfa34d56adc0c69d58794eb9ecfefe2705f67bee015b045396902d3012c863854ed3c1e223eca6605110616e8c9bead911db525203cb997f2cf259daf2c4bbc32e3f34ee788023b3d4b13b3b2926840de4d7170ebdcd854ce2ca95ac9b5d546e6caafb551c603842b367a5d5347a28f1f8707cedc3b59431d94180324b2cc5a93369e80dbd9e434736afed962df2a0a950700d476b9d5ca1175dbe1f955cf847fb16367c17690ed3d28447949006c32799460d69fd6f04ce3e46324ca39f2d463ca17f9a0be5302d228d83a9f9d2a77de98e084aa2474da38c74f755018a9b5f9da84bdb78b1c755b48e7b27e3216ca1551104764d45139e8aaeabfc6e7b49c330b8493603695170d2a7d94c1f055684305b335ea52b7d4ebeaed1477668d542d2e16a5c7c020a1c406d9c281541890e357a48aa498aa46d187b4d63719103cb7b29496661d3eac593e0c45965bae02262bf6d1a5b80655a05a10b8c756423b3bad79b367eaa775d6603c1f328fcdf7f37b05490e719d0b15d1bd1738855444e17036b38462c1e27ee5b7d888b4420717d8b3afca450b7a94d42f6f3cebf2dcfbf681b65aa7b5467cf4900eaf79d7f1152df5514fed1cf4ee41c3a2ee019303ef8da4b9ca0255bd05a5be311b71669c49d110a7026ae60b227a007e08fddc24db1dd2b00da84904185e9c5e524f25ec4ccab1e2828dbd9c9ab92afc166f62ef6d6a97a256c5babb805123cb8314af1718fd77e5a3228f0170cefdd7f0a595555144c51960c0532473db09a756e3e1bb2c1054b3a900da56a76b9e5a26eb8b4cc17d663ca6ab8946bcf42104705b4b1cbba4a165aa3a072b1ab06729f3afd124289a942c351ca980da5752eb48dcd8609937a72989a9bd2dee57117ad230c1346a4d52a89636a0a65db0dffb8746a8496ccef16d57bb564af1d768158156da58fefdcfe3626c131672cb3f0264b886ef923ed06c1f07b3a1d8b23b977a72d145a33367d7bd765013eb15ef36eeb0b7ac483" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "transfer-range-03-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + }, + { + "id": "transfer-range-03-bfN", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "50c243075006fa553e02b29605b8716b952c3dbc832d510cc0a668928de6653f52cfe4069472ca9a2aaeb42b42076e5a43768ace50e2cff5d7f65385d4a1012a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000005ac1c0dec5266e5b39a17c8deebfa34d56adc0c69d58794eb9ecfefe2705f67bee015b045396902d3012c863854ed3c1e223eca6605110616e8c9bead911db525203cb997f2cf259daf2c4bbc32e3f34ee788023b3d4b13b3b2926840de4d7170ebdcd854ce2ca95ac9b5d546e6caafb551c603842b367a5d5347a28f1f8707cedc3b59431d94180324b2cc5a93369e80dbd9e434736afed962df2a0a950700d476b9d5ca1175dbe1f955cf847fb16367c17690ed3d28447949006c32799460d69fd6f04ce3e46324ca39f2d463ca17f9a0be5302d228d83a9f9d2a77de98e084aa2474da38c74f755018a9b5f9da84bdb78b1c755b48e7b27e3216ca1551104764d45139e8aaeabfc6e7b49c330b8493603695170d2a7d94c1f055684305b335ea52b7d4ebeaed1477668d542d2e16a5c7c020a1c406d9c281541890e357a48aa498aa46d187b4d63719103cb7b29496661d3eac593e0c45965bae02262bf6d1a5b80655a05a10b8c756423b3bad79b367eaa775d6603c1f328fcdf7f37b05490e719d0b15d1bd1738855444e17036b38462c1e27ee5b7d888b4420717d8b3afca450b7a94d42f6f3cebf2dcfbf681b65aa7b5467cf4900eaf79d7f1152df5514fed1cf4ee41c3a2ee019303ef8da4b9ca0255bd05a5be311b71669c49d110a7026ae60b227a007e08fddc24db1dd2b00da84904185e9c5e524f25ec4ccab1e2828dbd9c9ab92afc166f62ef6d6a97a256c5babb805123cb8314af1718fd77e5a3228f0170cefdd7f0a595555144c51960c0532473db09a756e3e1bb2c1054b3a900da56a76b9e5a26eb8b4cc17d663ca6ab8946bcf42104705b4b1cbba4a165aa3a072b1ab06729f3afd124289a942c351ca980da5752eb48dcd8609937a72989a9bd2dee57117ad230c1346a4d52a89636a0a65db0dffb8746a8496ccef16d57bb564af1d768158156da58fefdcfe3626c131672cb3f0264b886ef923ed06c1f07b3a1d8b23b977a72d145a33367d7bd765013eb15ef36eeb0b7ac483cc09" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + } + ] + }, + { + "id": "transfer-composite-03", + "family": "transfer_composite", + "expected_valid": true, + "payload": { + "equality_proof_data_hex": "40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c22011236a299cf39e9b97c79547ecbc358dd5411d8d75e14a827a5b98125adf62a41c6b7bfaccf40f04df0f78492907d4c17f5516326c77c6ba2d963ea734fa75c0550c243075006fa553e02b29605b8716b952c3dbc832d510cc0a668928de6653fb2d012282a376ec1041c1a34a2e2c512e5595f110e514951b0119b1cbe6f152232e02db0049566adc25a573cfddcc1444c0e52a219a08a0366784fd6d2a5234b5e0e44952de1f99911ae5ed5f7d54e95ecf89ae82c06d7e23033097c093f784da22f2f1fee5a336c85e7cfc5b0ac907c12b020c7f0b29e4e85e005bccaf8890a89ffccba39c6cd16e2b7c88e4166bbe4f99f0996d29b18fe6e494f8660f77006670a56c03dfcfb8e1368eede259be91feadec1d54bd1dcc04b9e5208fea3e60f", + "range_proof_data_hex": "50c243075006fa553e02b29605b8716b952c3dbc832d510cc0a668928de6653f52cfe4069472ca9a2aaeb42b42076e5a43768ace50e2cff5d7f65385d4a1012a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000005ac1c0dec5266e5b39a17c8deebfa34d56adc0c69d58794eb9ecfefe2705f67bee015b045396902d3012c863854ed3c1e223eca6605110616e8c9bead911db525203cb997f2cf259daf2c4bbc32e3f34ee788023b3d4b13b3b2926840de4d7170ebdcd854ce2ca95ac9b5d546e6caafb551c603842b367a5d5347a28f1f8707cedc3b59431d94180324b2cc5a93369e80dbd9e434736afed962df2a0a950700d476b9d5ca1175dbe1f955cf847fb16367c17690ed3d28447949006c32799460d69fd6f04ce3e46324ca39f2d463ca17f9a0be5302d228d83a9f9d2a77de98e084aa2474da38c74f755018a9b5f9da84bdb78b1c755b48e7b27e3216ca1551104764d45139e8aaeabfc6e7b49c330b8493603695170d2a7d94c1f055684305b335ea52b7d4ebeaed1477668d542d2e16a5c7c020a1c406d9c281541890e357a48aa498aa46d187b4d63719103cb7b29496661d3eac593e0c45965bae02262bf6d1a5b80655a05a10b8c756423b3bad79b367eaa775d6603c1f328fcdf7f37b05490e719d0b15d1bd1738855444e17036b38462c1e27ee5b7d888b4420717d8b3afca450b7a94d42f6f3cebf2dcfbf681b65aa7b5467cf4900eaf79d7f1152df5514fed1cf4ee41c3a2ee019303ef8da4b9ca0255bd05a5be311b71669c49d110a7026ae60b227a007e08fddc24db1dd2b00da84904185e9c5e524f25ec4ccab1e2828dbd9c9ab92afc166f62ef6d6a97a256c5babb805123cb8314af1718fd77e5a3228f0170cefdd7f0a595555144c51960c0532473db09a756e3e1bb2c1054b3a900da56a76b9e5a26eb8b4cc17d663ca6ab8946bcf42104705b4b1cbba4a165aa3a072b1ab06729f3afd124289a942c351ca980da5752eb48dcd8609937a72989a9bd2dee57117ad230c1346a4d52a89636a0a65db0dffb8746a8496ccef16d57bb564af1d768158156da58fefdcfe3626c131672cb3f0264b886ef923ed06c1f07b3a1d8b23b977a72d145a33367d7bd765013eb15ef36eeb0b7ac483cc08", + "validity_proof_data_hex": "40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c22011ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c667842452cfe4069472ca9a2aaeb42b42076e5a43768ace50e2cff5d7f65385d4a1012a4cbe10e2d5f095c834e6351618aa702f3956f08022b92269d7464406e8bcd01f0059d8a86b0090a51e9a3899cd9de70147cdd2722f8d34b76c9215e79fc7d70fde69abdf3d5e237631a4eb99bad52df5d58a910a080de48ba01c0237274e8e321893a874646d2fa987cbcaf3853873533ebeaa80c5d2fc829d896805b1fe3c62b4d3e22dd3712dddc9c015f084f55ae7b6065d7661024646e126805a1ef9173f340d09f755e86c9b7b9d14ef5f043f73d93f13ae49f424d6bf86f22283e995074abf7ee0182eacb5cae95578982e938e95cb561ed692b3f1bb3c239d41b2437cd21314e84600da1c52483aa4efa1f5951cbcb0f35e7234acc0d08cb9b51f1f382c1c1d432f49959cd585fb8b54bec2b5b2c6dceb71e3ad6807de38bb56f4a20e5c27cb82c7002e7b95d8a9d406d175fe6570f3b315955a9e6e105b9e8ab5880e" + }, + "binding": { + "current_balance_commitment_hex": "02a6581c395c5927de61ac07a370d015aa92f54d7f0724be7b9902bb9def0816", + "current_balance_handle_hex": "3ebad8cc2883c8ef5302472c0ab192ea2da8f02a984ca69fa88592b8ae27fe6e", + "recipient_pubkey_hex": "1ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c6678424", + "sender_pubkey_hex": "40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c2201" + }, + "mutations": [ + { + "id": "transfer-composite-03-swap-eq-val", + "op": "swap_fields", + "target": "payload.equality_proof_data_hex", + "params": { + "with": "payload.validity_proof_data_hex" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "transfer-composite-03-pk-s", + "op": "bitflip", + "target": "binding.sender_pubkey_hex", + "params": { + "value_hex": "41b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c2201" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "transfer-composite-03-pk-r", + "op": "bitflip", + "target": "binding.recipient_pubkey_hex", + "params": { + "value_hex": "1bda8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c6678424" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "transfer-composite-03-bal-c1", + "op": "replace_field", + "target": "binding.current_balance_commitment_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "remaining balance commitment mismatch" + }, + { + "id": "transfer-composite-03-rng-trunc", + "op": "truncate", + "target": "payload.range_proof_data_hex", + "params": { + "value_hex": "50c243075006fa553e02b29605b8716b952c3dbc832d510cc0a668928de6653f52cfe4069472ca9a2aaeb42b42076e5a43768ace50e2cff5d7f65385d4a1012a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000005ac1c0dec5266e5b39a17c8deebfa34d56adc0c69d58794eb9ecfefe2705f67bee015b045396902d3012c863854ed3c1e223eca6605110616e8c9bead911db525203cb997f2cf259daf2c4bbc32e3f34ee788023b3d4b13b3b2926840de4d7170ebdcd854ce2ca95ac9b5d546e6caafb551c603842b367a5d5347a28f1f8707cedc3b59431d94180324b2cc5a93369e80dbd9e434736afed962df2a0a950700d476b9d5ca1175dbe1f955cf847fb16367c17690ed3d28447949006c32799460d69fd6f04ce3e46324ca39f2d463ca17f9a0be5302d228d83a9f9d2a77de98e084aa2474da38c74f755018a9b5f9da84bdb78b1c755b48e7b27e3216ca1551104764d45139e8aaeabfc6e7b49c330b8493603695170d2a7d94c1f055684305b335ea52b7d4ebeaed1477668d542d2e16a5c7c020a1c406d9c281541890e357a48aa498aa46d187b4d63719103cb7b29496661d3eac593e0c45965bae02262bf6d1a5b80655a05a10b8c756423b3bad79b367eaa775d6603c1f328fcdf7f37b05490e719d0b15d1bd1738855444e17036b38462c1e27ee5b7d888b4420717d8b3afca450b7a94d42f6f3cebf2dcfbf681b65aa7b5467cf4900eaf79d7f1152df5514fed1cf4ee41c3a2ee019303ef8da4b9ca0255bd05a5be311b71669c49d110a7026ae60b227a007e08fddc24db1dd2b00da84904185e9c5e524f25ec4ccab1e2828dbd9c9ab92afc166f62ef6d6a97a256c5babb805123cb8314af1718fd77e5a3228f0170cefdd7f0a595555144c51960c0532473db09a756e3e1bb2c1054b3a900da56a76b9e5a26eb8b4cc17d663ca6ab8946bcf42104705b4b1cbba4a165aa3a072b1ab06729f3afd124289a942c351ca980da5752eb48dcd8609937a72989a9bd2dee57117ad230c1346a4d52a89636a0a65db0dffb8746a8496ccef16d57bb564af1d768158156da58fefdcfe3626c131672cb3f0264b886ef923ed06c1f07b3a1d8b23b977a72d145a33367d7bd765013eb15ef36eeb0b7ac483" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + } + ] + }, + { + "id": "equality-04", + "family": "equality", + "expected_valid": true, + "payload": { + "proof_data_hex": "1ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c6678424f849a1a283866adfa29de0a9129357d99819e49271d8e5bf5d10c5cdc6211065de9e14e599f38716d66b5fc846e1d80f2052d34501e46bf5835890aadda99848c2bf90b0a1fa2a1fa6f61a2537b869e18268422f6a768c5e645b05d58792260b8acb23f53bc3efae4befae5f8179651fbf7e8e47a7cb1b17fa292947d1594f372029db7fffbefacc923802936bf76f3a9e7b4f1023109f24fd47370eb5485d3dd4fd48f967799e461b05aa95d8c57a6fa0aa6e4356e2aaa8f4ee36110899a168be350a2a62deef1e46f9437bfd88b48f7f28dea75d97fc5ed0ebe5088ecc2108b383f78e10dc2789aecfcffdafdc622dac8be78167c69e9736393ee095968c074dd956cf31198737620b03a4cf0ffdc0d7390263fab922827c281eff83fff908" + }, + "mutations": [ + { + "id": "equality-04-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "1bda8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c6678424f849a1a283866adfa29de0a9129357d99819e49271d8e5bf5d10c5cdc6211065de9e14e599f38716d66b5fc846e1d80f2052d34501e46bf5835890aadda99848c2bf90b0a1fa2a1fa6f61a2537b869e18268422f6a768c5e645b05d58792260b8acb23f53bc3efae4befae5f8179651fbf7e8e47a7cb1b17fa292947d1594f372029db7fffbefacc923802936bf76f3a9e7b4f1023109f24fd47370eb5485d3dd4fd48f967799e461b05aa95d8c57a6fa0aa6e4356e2aaa8f4ee36110899a168be350a2a62deef1e46f9437bfd88b48f7f28dea75d97fc5ed0ebe5088ecc2108b383f78e10dc2789aecfcffdafdc622dac8be78167c69e9736393ee095968c074dd956cf31198737620b03a4cf0ffdc0d7390263fab922827c281eff83fff908" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "equality-04-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "1ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c6678424f849a1a283866adfa29de0a9129357d99819e49271d8e5bf5d10c5cdc6211065de9e14e599f38716d66b5fc846e1d80f2052d34501e46bf5835890aadda99848c2bf90b0a1fa2a1fa6f61a2537b869e18268422f6a768c5e645b05d58792260b8acb23f53bc3efae4befae5f8179651fbf7e8e47a7cb1b17fa292947d1594f372029db7fffbefacc923802936bf76f3a9e7b4f1023109f24fd47370eb5485d3dd4fd48f967799e461b05aa95d8c57a6fa0aa6e4356e2aaa8f4ee36110899a168be350a2a62deef1e46f9437bfd88b48f7f28dea75d97fc5ed0ebe5088ecc2108b383f78e10dc2789aecfcffdafdc622dac8be78167c69e9736393ee095968c074dd956cf31198737620b03a4cf0ffdc0d7390263fab922827c281eff83ff" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "equality-04-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + } + ] + }, + { + "id": "validity-04", + "family": "validity", + "expected_valid": true, + "payload": { + "proof_data_hex": "1ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c667842436d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317988684c294aa7c4af9bafe5088e97dc98eaac87fa2c82baddbfe2d677c70b03636ff1659ec34d2e304ba028056b9b681b89bb1b6a48cfbdb3f4383e97f5a0f09dcb5366e9ec6d108e6153206c5fa1a69adc7e3cf1bac32c48633bed114e44128947fee79800d128c84543d639a5156dbc8d58b1d781f4340d4eb8e98dfef3f369c409a5f5956e7774b3ade6375fbc4beef593c65e6e35f254a4e8f6c82bbf0656c4444ce46ec59fc44b42dd1d71d2b4f4126fc848a79f5237f0e87cb34c8ec0ae216f3a3b6a6ea216c42386aefabcb804c1f2bf1854743519c194b15f17426787ce14053b539dd3f908113cf2bce8c8a6e8c56abf62a56152ea4f13bccf0bc36f2e312bd3dbc17a2b8051f5813b91872f5c81bd03be718d4bd18393af89a775f82304e5faf82ac22c4b35357d1ef8ad42586e9b2533db9f173e1adaee27c030dbfc34ac8026b78ec2605977d9eb0969b85e54c835695a68562778d1aaa9de602" + }, + "mutations": [ + { + "id": "validity-04-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "1bda8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c667842436d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317988684c294aa7c4af9bafe5088e97dc98eaac87fa2c82baddbfe2d677c70b03636ff1659ec34d2e304ba028056b9b681b89bb1b6a48cfbdb3f4383e97f5a0f09dcb5366e9ec6d108e6153206c5fa1a69adc7e3cf1bac32c48633bed114e44128947fee79800d128c84543d639a5156dbc8d58b1d781f4340d4eb8e98dfef3f369c409a5f5956e7774b3ade6375fbc4beef593c65e6e35f254a4e8f6c82bbf0656c4444ce46ec59fc44b42dd1d71d2b4f4126fc848a79f5237f0e87cb34c8ec0ae216f3a3b6a6ea216c42386aefabcb804c1f2bf1854743519c194b15f17426787ce14053b539dd3f908113cf2bce8c8a6e8c56abf62a56152ea4f13bccf0bc36f2e312bd3dbc17a2b8051f5813b91872f5c81bd03be718d4bd18393af89a775f82304e5faf82ac22c4b35357d1ef8ad42586e9b2533db9f173e1adaee27c030dbfc34ac8026b78ec2605977d9eb0969b85e54c835695a68562778d1aaa9de602" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "validity-04-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "1ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c667842436d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317988684c294aa7c4af9bafe5088e97dc98eaac87fa2c82baddbfe2d677c70b03636ff1659ec34d2e304ba028056b9b681b89bb1b6a48cfbdb3f4383e97f5a0f09dcb5366e9ec6d108e6153206c5fa1a69adc7e3cf1bac32c48633bed114e44128947fee79800d128c84543d639a5156dbc8d58b1d781f4340d4eb8e98dfef3f369c409a5f5956e7774b3ade6375fbc4beef593c65e6e35f254a4e8f6c82bbf0656c4444ce46ec59fc44b42dd1d71d2b4f4126fc848a79f5237f0e87cb34c8ec0ae216f3a3b6a6ea216c42386aefabcb804c1f2bf1854743519c194b15f17426787ce14053b539dd3f908113cf2bce8c8a6e8c56abf62a56152ea4f13bccf0bc36f2e312bd3dbc17a2b8051f5813b91872f5c81bd03be718d4bd18393af89a775f82304e5faf82ac22c4b35357d1ef8ad42586e9b2533db9f173e1adaee27c030dbfc34ac8026b78ec2605977d9eb0969b85e54c835695a68562778d1aaa9d" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "validity-04-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + } + ] + }, + { + "id": "transfer-range-04", + "family": "transfer_range", + "expected_valid": true, + "payload": { + "proof_data_hex": "c2bf90b0a1fa2a1fa6f61a2537b869e18268422f6a768c5e645b05d58792260b988684c294aa7c4af9bafe5088e97dc98eaac87fa2c82baddbfe2d677c70b0360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000b06e188034e39e920bdf01d484a52ea0a6ef3d0ed16b7dd50309b93c77c6fb0d90e293abdf7638041e311d9cf8244b537750e4cb5f9ba623403193057797cd4ce0e24a6cad35fd8d4bc002ee1dfcb00ddd177a2b657eae7bb05039ad055a4c42906e761896d4fc7953a5738be310967b0e45986d178cdcda22383b8a6e1d20617f479f37a705c8f1fd50388a2c72c70efdd0094c15e50af81febe8e998e48704d2b69dd075d0ace9a5b8e00595dafd2738b70e1694846d782c8922d1edde5e063c59b5a33701e6fab289051b37a1fd5a192cc095a3ad3539a640bbdb5fbe0302985ba0b4308e9a9dfcdd0194e6a62f02b7fdc953eda5f50c2054f3b4a031604ae43d490dce122289b9870cd75b5b5a6e296df222fed4b619e8a68ed1bea28d3378fa058c60ac6dac636def72b26874c8c727dbbc8688b105aa4b1be4eb01e76f084dd7d532e3abd1ec620215119101ddcc004a16b0ac4e70dd9d8ecb556b4141cc8a9a045af6f2de18e345b698cfb751204aa8503a77944a233395f344b0bb7c38567735c56a47f98484191eebce1fd9526e9d7904832dbbcdeb008152b28c2a7e3a6ee4348eb35d81398eaa23ee04ef5f1c07244262c91a55e05950ef64152848a4057af9bff6a2c5a0118ba683e90a76df520e24e7cc3469090c058b03ab467e7f07af7f4c4938920a781f4e138de05c1f48af7489d4929e95176e3833d37246c096fce49b3a043b1774b8eb1b8add2520f9c1105a52dfc150c38923681d15fe71bd50917069920b6ba0758d89744cfd7ff7ba27ebffc8053bad5b7e9d8436c2676f6349a5dde752af834ed7a158c12681b8779b04a4ca81f35520742ffe73c0f23a9b995dc447a79942231ada8294e48a2e5d896f7284f601c73cc865601fb056c0745cba34017297aa49682028ab357e67215f64bd4904ffa3fc4bf89975f587f0c4d77df562a6b6e1a2aa8645b2984485d70715a5fde7a85756beac9c08e8f6561539c27fce055f492f91fecc5b876400406ad36b0306395ab2cf77440e" + }, + "mutations": [ + { + "id": "transfer-range-04-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "c3bf90b0a1fa2a1fa6f61a2537b869e18268422f6a768c5e645b05d58792260b988684c294aa7c4af9bafe5088e97dc98eaac87fa2c82baddbfe2d677c70b0360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000b06e188034e39e920bdf01d484a52ea0a6ef3d0ed16b7dd50309b93c77c6fb0d90e293abdf7638041e311d9cf8244b537750e4cb5f9ba623403193057797cd4ce0e24a6cad35fd8d4bc002ee1dfcb00ddd177a2b657eae7bb05039ad055a4c42906e761896d4fc7953a5738be310967b0e45986d178cdcda22383b8a6e1d20617f479f37a705c8f1fd50388a2c72c70efdd0094c15e50af81febe8e998e48704d2b69dd075d0ace9a5b8e00595dafd2738b70e1694846d782c8922d1edde5e063c59b5a33701e6fab289051b37a1fd5a192cc095a3ad3539a640bbdb5fbe0302985ba0b4308e9a9dfcdd0194e6a62f02b7fdc953eda5f50c2054f3b4a031604ae43d490dce122289b9870cd75b5b5a6e296df222fed4b619e8a68ed1bea28d3378fa058c60ac6dac636def72b26874c8c727dbbc8688b105aa4b1be4eb01e76f084dd7d532e3abd1ec620215119101ddcc004a16b0ac4e70dd9d8ecb556b4141cc8a9a045af6f2de18e345b698cfb751204aa8503a77944a233395f344b0bb7c38567735c56a47f98484191eebce1fd9526e9d7904832dbbcdeb008152b28c2a7e3a6ee4348eb35d81398eaa23ee04ef5f1c07244262c91a55e05950ef64152848a4057af9bff6a2c5a0118ba683e90a76df520e24e7cc3469090c058b03ab467e7f07af7f4c4938920a781f4e138de05c1f48af7489d4929e95176e3833d37246c096fce49b3a043b1774b8eb1b8add2520f9c1105a52dfc150c38923681d15fe71bd50917069920b6ba0758d89744cfd7ff7ba27ebffc8053bad5b7e9d8436c2676f6349a5dde752af834ed7a158c12681b8779b04a4ca81f35520742ffe73c0f23a9b995dc447a79942231ada8294e48a2e5d896f7284f601c73cc865601fb056c0745cba34017297aa49682028ab357e67215f64bd4904ffa3fc4bf89975f587f0c4d77df562a6b6e1a2aa8645b2984485d70715a5fde7a85756beac9c08e8f6561539c27fce055f492f91fecc5b876400406ad36b0306395ab2cf77440e" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "transfer-range-04-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "c2bf90b0a1fa2a1fa6f61a2537b869e18268422f6a768c5e645b05d58792260b988684c294aa7c4af9bafe5088e97dc98eaac87fa2c82baddbfe2d677c70b0360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000b06e188034e39e920bdf01d484a52ea0a6ef3d0ed16b7dd50309b93c77c6fb0d90e293abdf7638041e311d9cf8244b537750e4cb5f9ba623403193057797cd4ce0e24a6cad35fd8d4bc002ee1dfcb00ddd177a2b657eae7bb05039ad055a4c42906e761896d4fc7953a5738be310967b0e45986d178cdcda22383b8a6e1d20617f479f37a705c8f1fd50388a2c72c70efdd0094c15e50af81febe8e998e48704d2b69dd075d0ace9a5b8e00595dafd2738b70e1694846d782c8922d1edde5e063c59b5a33701e6fab289051b37a1fd5a192cc095a3ad3539a640bbdb5fbe0302985ba0b4308e9a9dfcdd0194e6a62f02b7fdc953eda5f50c2054f3b4a031604ae43d490dce122289b9870cd75b5b5a6e296df222fed4b619e8a68ed1bea28d3378fa058c60ac6dac636def72b26874c8c727dbbc8688b105aa4b1be4eb01e76f084dd7d532e3abd1ec620215119101ddcc004a16b0ac4e70dd9d8ecb556b4141cc8a9a045af6f2de18e345b698cfb751204aa8503a77944a233395f344b0bb7c38567735c56a47f98484191eebce1fd9526e9d7904832dbbcdeb008152b28c2a7e3a6ee4348eb35d81398eaa23ee04ef5f1c07244262c91a55e05950ef64152848a4057af9bff6a2c5a0118ba683e90a76df520e24e7cc3469090c058b03ab467e7f07af7f4c4938920a781f4e138de05c1f48af7489d4929e95176e3833d37246c096fce49b3a043b1774b8eb1b8add2520f9c1105a52dfc150c38923681d15fe71bd50917069920b6ba0758d89744cfd7ff7ba27ebffc8053bad5b7e9d8436c2676f6349a5dde752af834ed7a158c12681b8779b04a4ca81f35520742ffe73c0f23a9b995dc447a79942231ada8294e48a2e5d896f7284f601c73cc865601fb056c0745cba34017297aa49682028ab357e67215f64bd4904ffa3fc4bf89975f587f0c4d77df562a6b6e1a2aa8645b2984485d70715a5fde7a85756beac9c08e8f6561539c27fce055f492f91fecc5b876400406ad36b0306395ab2cf77" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "transfer-range-04-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + }, + { + "id": "transfer-range-04-bfN", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "c2bf90b0a1fa2a1fa6f61a2537b869e18268422f6a768c5e645b05d58792260b988684c294aa7c4af9bafe5088e97dc98eaac87fa2c82baddbfe2d677c70b0360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000b06e188034e39e920bdf01d484a52ea0a6ef3d0ed16b7dd50309b93c77c6fb0d90e293abdf7638041e311d9cf8244b537750e4cb5f9ba623403193057797cd4ce0e24a6cad35fd8d4bc002ee1dfcb00ddd177a2b657eae7bb05039ad055a4c42906e761896d4fc7953a5738be310967b0e45986d178cdcda22383b8a6e1d20617f479f37a705c8f1fd50388a2c72c70efdd0094c15e50af81febe8e998e48704d2b69dd075d0ace9a5b8e00595dafd2738b70e1694846d782c8922d1edde5e063c59b5a33701e6fab289051b37a1fd5a192cc095a3ad3539a640bbdb5fbe0302985ba0b4308e9a9dfcdd0194e6a62f02b7fdc953eda5f50c2054f3b4a031604ae43d490dce122289b9870cd75b5b5a6e296df222fed4b619e8a68ed1bea28d3378fa058c60ac6dac636def72b26874c8c727dbbc8688b105aa4b1be4eb01e76f084dd7d532e3abd1ec620215119101ddcc004a16b0ac4e70dd9d8ecb556b4141cc8a9a045af6f2de18e345b698cfb751204aa8503a77944a233395f344b0bb7c38567735c56a47f98484191eebce1fd9526e9d7904832dbbcdeb008152b28c2a7e3a6ee4348eb35d81398eaa23ee04ef5f1c07244262c91a55e05950ef64152848a4057af9bff6a2c5a0118ba683e90a76df520e24e7cc3469090c058b03ab467e7f07af7f4c4938920a781f4e138de05c1f48af7489d4929e95176e3833d37246c096fce49b3a043b1774b8eb1b8add2520f9c1105a52dfc150c38923681d15fe71bd50917069920b6ba0758d89744cfd7ff7ba27ebffc8053bad5b7e9d8436c2676f6349a5dde752af834ed7a158c12681b8779b04a4ca81f35520742ffe73c0f23a9b995dc447a79942231ada8294e48a2e5d896f7284f601c73cc865601fb056c0745cba34017297aa49682028ab357e67215f64bd4904ffa3fc4bf89975f587f0c4d77df562a6b6e1a2aa8645b2984485d70715a5fde7a85756beac9c08e8f6561539c27fce055f492f91fecc5b876400406ad36b0306395ab2cf77440f" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + } + ] + }, + { + "id": "transfer-composite-04", + "family": "transfer_composite", + "expected_valid": true, + "payload": { + "equality_proof_data_hex": "1ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c6678424f849a1a283866adfa29de0a9129357d99819e49271d8e5bf5d10c5cdc6211065de9e14e599f38716d66b5fc846e1d80f2052d34501e46bf5835890aadda99848c2bf90b0a1fa2a1fa6f61a2537b869e18268422f6a768c5e645b05d58792260b8acb23f53bc3efae4befae5f8179651fbf7e8e47a7cb1b17fa292947d1594f372029db7fffbefacc923802936bf76f3a9e7b4f1023109f24fd47370eb5485d3dd4fd48f967799e461b05aa95d8c57a6fa0aa6e4356e2aaa8f4ee36110899a168be350a2a62deef1e46f9437bfd88b48f7f28dea75d97fc5ed0ebe5088ecc2108b383f78e10dc2789aecfcffdafdc622dac8be78167c69e9736393ee095968c074dd956cf31198737620b03a4cf0ffdc0d7390263fab922827c281eff83fff908", + "range_proof_data_hex": "c2bf90b0a1fa2a1fa6f61a2537b869e18268422f6a768c5e645b05d58792260b988684c294aa7c4af9bafe5088e97dc98eaac87fa2c82baddbfe2d677c70b0360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000b06e188034e39e920bdf01d484a52ea0a6ef3d0ed16b7dd50309b93c77c6fb0d90e293abdf7638041e311d9cf8244b537750e4cb5f9ba623403193057797cd4ce0e24a6cad35fd8d4bc002ee1dfcb00ddd177a2b657eae7bb05039ad055a4c42906e761896d4fc7953a5738be310967b0e45986d178cdcda22383b8a6e1d20617f479f37a705c8f1fd50388a2c72c70efdd0094c15e50af81febe8e998e48704d2b69dd075d0ace9a5b8e00595dafd2738b70e1694846d782c8922d1edde5e063c59b5a33701e6fab289051b37a1fd5a192cc095a3ad3539a640bbdb5fbe0302985ba0b4308e9a9dfcdd0194e6a62f02b7fdc953eda5f50c2054f3b4a031604ae43d490dce122289b9870cd75b5b5a6e296df222fed4b619e8a68ed1bea28d3378fa058c60ac6dac636def72b26874c8c727dbbc8688b105aa4b1be4eb01e76f084dd7d532e3abd1ec620215119101ddcc004a16b0ac4e70dd9d8ecb556b4141cc8a9a045af6f2de18e345b698cfb751204aa8503a77944a233395f344b0bb7c38567735c56a47f98484191eebce1fd9526e9d7904832dbbcdeb008152b28c2a7e3a6ee4348eb35d81398eaa23ee04ef5f1c07244262c91a55e05950ef64152848a4057af9bff6a2c5a0118ba683e90a76df520e24e7cc3469090c058b03ab467e7f07af7f4c4938920a781f4e138de05c1f48af7489d4929e95176e3833d37246c096fce49b3a043b1774b8eb1b8add2520f9c1105a52dfc150c38923681d15fe71bd50917069920b6ba0758d89744cfd7ff7ba27ebffc8053bad5b7e9d8436c2676f6349a5dde752af834ed7a158c12681b8779b04a4ca81f35520742ffe73c0f23a9b995dc447a79942231ada8294e48a2e5d896f7284f601c73cc865601fb056c0745cba34017297aa49682028ab357e67215f64bd4904ffa3fc4bf89975f587f0c4d77df562a6b6e1a2aa8645b2984485d70715a5fde7a85756beac9c08e8f6561539c27fce055f492f91fecc5b876400406ad36b0306395ab2cf77440e", + "validity_proof_data_hex": "1ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c667842436d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317988684c294aa7c4af9bafe5088e97dc98eaac87fa2c82baddbfe2d677c70b03636ff1659ec34d2e304ba028056b9b681b89bb1b6a48cfbdb3f4383e97f5a0f09dcb5366e9ec6d108e6153206c5fa1a69adc7e3cf1bac32c48633bed114e44128947fee79800d128c84543d639a5156dbc8d58b1d781f4340d4eb8e98dfef3f369c409a5f5956e7774b3ade6375fbc4beef593c65e6e35f254a4e8f6c82bbf0656c4444ce46ec59fc44b42dd1d71d2b4f4126fc848a79f5237f0e87cb34c8ec0ae216f3a3b6a6ea216c42386aefabcb804c1f2bf1854743519c194b15f17426787ce14053b539dd3f908113cf2bce8c8a6e8c56abf62a56152ea4f13bccf0bc36f2e312bd3dbc17a2b8051f5813b91872f5c81bd03be718d4bd18393af89a775f82304e5faf82ac22c4b35357d1ef8ad42586e9b2533db9f173e1adaee27c030dbfc34ac8026b78ec2605977d9eb0969b85e54c835695a68562778d1aaa9de602" + }, + "binding": { + "current_balance_commitment_hex": "86d31a09866d908cc07246863bc8c3bc9fc24fabb35e6570f53bd0d5d7d8236c", + "current_balance_handle_hex": "08fa97fc89d5fe372080fbb7911fb9ffa6791e272ae5dc7c3deb375350eb622e", + "recipient_pubkey_hex": "36d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317", + "sender_pubkey_hex": "1ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c6678424" + }, + "mutations": [ + { + "id": "transfer-composite-04-swap-eq-val", + "op": "swap_fields", + "target": "payload.equality_proof_data_hex", + "params": { + "with": "payload.validity_proof_data_hex" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "transfer-composite-04-pk-s", + "op": "bitflip", + "target": "binding.sender_pubkey_hex", + "params": { + "value_hex": "1bda8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c6678424" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "transfer-composite-04-pk-r", + "op": "bitflip", + "target": "binding.recipient_pubkey_hex", + "params": { + "value_hex": "37d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "transfer-composite-04-bal-c1", + "op": "replace_field", + "target": "binding.current_balance_commitment_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "remaining balance commitment mismatch" + }, + { + "id": "transfer-composite-04-rng-trunc", + "op": "truncate", + "target": "payload.range_proof_data_hex", + "params": { + "value_hex": "c2bf90b0a1fa2a1fa6f61a2537b869e18268422f6a768c5e645b05d58792260b988684c294aa7c4af9bafe5088e97dc98eaac87fa2c82baddbfe2d677c70b0360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000b06e188034e39e920bdf01d484a52ea0a6ef3d0ed16b7dd50309b93c77c6fb0d90e293abdf7638041e311d9cf8244b537750e4cb5f9ba623403193057797cd4ce0e24a6cad35fd8d4bc002ee1dfcb00ddd177a2b657eae7bb05039ad055a4c42906e761896d4fc7953a5738be310967b0e45986d178cdcda22383b8a6e1d20617f479f37a705c8f1fd50388a2c72c70efdd0094c15e50af81febe8e998e48704d2b69dd075d0ace9a5b8e00595dafd2738b70e1694846d782c8922d1edde5e063c59b5a33701e6fab289051b37a1fd5a192cc095a3ad3539a640bbdb5fbe0302985ba0b4308e9a9dfcdd0194e6a62f02b7fdc953eda5f50c2054f3b4a031604ae43d490dce122289b9870cd75b5b5a6e296df222fed4b619e8a68ed1bea28d3378fa058c60ac6dac636def72b26874c8c727dbbc8688b105aa4b1be4eb01e76f084dd7d532e3abd1ec620215119101ddcc004a16b0ac4e70dd9d8ecb556b4141cc8a9a045af6f2de18e345b698cfb751204aa8503a77944a233395f344b0bb7c38567735c56a47f98484191eebce1fd9526e9d7904832dbbcdeb008152b28c2a7e3a6ee4348eb35d81398eaa23ee04ef5f1c07244262c91a55e05950ef64152848a4057af9bff6a2c5a0118ba683e90a76df520e24e7cc3469090c058b03ab467e7f07af7f4c4938920a781f4e138de05c1f48af7489d4929e95176e3833d37246c096fce49b3a043b1774b8eb1b8add2520f9c1105a52dfc150c38923681d15fe71bd50917069920b6ba0758d89744cfd7ff7ba27ebffc8053bad5b7e9d8436c2676f6349a5dde752af834ed7a158c12681b8779b04a4ca81f35520742ffe73c0f23a9b995dc447a79942231ada8294e48a2e5d896f7284f601c73cc865601fb056c0745cba34017297aa49682028ab357e67215f64bd4904ffa3fc4bf89975f587f0c4d77df562a6b6e1a2aa8645b2984485d70715a5fde7a85756beac9c08e8f6561539c27fce055f492f91fecc5b876400406ad36b0306395ab2cf77" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + } + ] + }, + { + "id": "equality-05", + "family": "equality", + "expected_valid": true, + "payload": { + "proof_data_hex": "36d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317fce55fefc1b5d10d83081881b4bb51fc1857334ae14926d2d631ac3c9767485b9426cd109f794bf4bc5c90475a2695737bc1ca20c6790dfb4e16423a03a1634330c0c25a7168d2882ecbbeacc9e713ee6a7c2a9dc3696264a850a61c5c98df6222e72a480d6d46ea85ff5eec59378b82863be4ced933c8af470e177a11304c1c9e0710c463a28e70556a026246bc794027777a4c83b0f9fc2d68e0adc67a22128ed5bab98386cab5d3a6e6d3545813903e7990914dc0b24d461d572ca090515ebe75c3f9bdc5888c326566e805fb2c9a1b370f128c1241d06e87bfedfda01408a32f84368dd25c82bc6de2082a0b99a9ddbe53602c5eef1a9c801fbf73739f0cccf04297ff6f56cde8b6074dff9a2d3f047a6fe57b622c11ebba3d7abf7baf07" + }, + "mutations": [ + { + "id": "equality-05-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "37d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317fce55fefc1b5d10d83081881b4bb51fc1857334ae14926d2d631ac3c9767485b9426cd109f794bf4bc5c90475a2695737bc1ca20c6790dfb4e16423a03a1634330c0c25a7168d2882ecbbeacc9e713ee6a7c2a9dc3696264a850a61c5c98df6222e72a480d6d46ea85ff5eec59378b82863be4ced933c8af470e177a11304c1c9e0710c463a28e70556a026246bc794027777a4c83b0f9fc2d68e0adc67a22128ed5bab98386cab5d3a6e6d3545813903e7990914dc0b24d461d572ca090515ebe75c3f9bdc5888c326566e805fb2c9a1b370f128c1241d06e87bfedfda01408a32f84368dd25c82bc6de2082a0b99a9ddbe53602c5eef1a9c801fbf73739f0cccf04297ff6f56cde8b6074dff9a2d3f047a6fe57b622c11ebba3d7abf7baf07" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "equality-05-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "36d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317fce55fefc1b5d10d83081881b4bb51fc1857334ae14926d2d631ac3c9767485b9426cd109f794bf4bc5c90475a2695737bc1ca20c6790dfb4e16423a03a1634330c0c25a7168d2882ecbbeacc9e713ee6a7c2a9dc3696264a850a61c5c98df6222e72a480d6d46ea85ff5eec59378b82863be4ced933c8af470e177a11304c1c9e0710c463a28e70556a026246bc794027777a4c83b0f9fc2d68e0adc67a22128ed5bab98386cab5d3a6e6d3545813903e7990914dc0b24d461d572ca090515ebe75c3f9bdc5888c326566e805fb2c9a1b370f128c1241d06e87bfedfda01408a32f84368dd25c82bc6de2082a0b99a9ddbe53602c5eef1a9c801fbf73739f0cccf04297ff6f56cde8b6074dff9a2d3f047a6fe57b622c11ebba3d7abf7b" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "equality-05-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + } + ] + }, + { + "id": "validity-05", + "family": "validity", + "expected_valid": true, + "payload": { + "proof_data_hex": "36d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7624588418ad89f5b16d98d3365845085c9ca5fe922bd0911be2137d860489ef60bcffdcb053f5ebafec6719393a03de9cdb825214f0965f851845b4ed1119160bb4c725f60304a9612d458ddffc40570a0681021172f11d36e43ae2e2704da94bd8a170e25269e28320d887eedc3d88f896061c0bd790cf169785597c90471f429a142ca709fb84da1311bf009b5fb1bf6f9eb4278c12d39f2d4475a1c7eb7d269694ad76358fb66b0066686eafdffd3cc1198530553ed2330731fd4130d363115636097663d6a2731c71c60dad6f7a1b3ae601596a7dade081144acb3e71f3142691fbb553ea99a0e69ecea77100596816abed10ab72c4c96151e63964d6dd33a6875441da529d68078e2255ca2cfb1a7000a5afe03ef626c6b0a24730f93d63cb31349d2e6f8113746b585e36dfcf45b749abc78ffa0e4d129d602c11b7a5015680a56c32f0bfb9d081090f80f1d97b2a364051c162006d1c48d310452eb60f" + }, + "mutations": [ + { + "id": "validity-05-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "37d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7624588418ad89f5b16d98d3365845085c9ca5fe922bd0911be2137d860489ef60bcffdcb053f5ebafec6719393a03de9cdb825214f0965f851845b4ed1119160bb4c725f60304a9612d458ddffc40570a0681021172f11d36e43ae2e2704da94bd8a170e25269e28320d887eedc3d88f896061c0bd790cf169785597c90471f429a142ca709fb84da1311bf009b5fb1bf6f9eb4278c12d39f2d4475a1c7eb7d269694ad76358fb66b0066686eafdffd3cc1198530553ed2330731fd4130d363115636097663d6a2731c71c60dad6f7a1b3ae601596a7dade081144acb3e71f3142691fbb553ea99a0e69ecea77100596816abed10ab72c4c96151e63964d6dd33a6875441da529d68078e2255ca2cfb1a7000a5afe03ef626c6b0a24730f93d63cb31349d2e6f8113746b585e36dfcf45b749abc78ffa0e4d129d602c11b7a5015680a56c32f0bfb9d081090f80f1d97b2a364051c162006d1c48d310452eb60f" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "validity-05-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "36d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7624588418ad89f5b16d98d3365845085c9ca5fe922bd0911be2137d860489ef60bcffdcb053f5ebafec6719393a03de9cdb825214f0965f851845b4ed1119160bb4c725f60304a9612d458ddffc40570a0681021172f11d36e43ae2e2704da94bd8a170e25269e28320d887eedc3d88f896061c0bd790cf169785597c90471f429a142ca709fb84da1311bf009b5fb1bf6f9eb4278c12d39f2d4475a1c7eb7d269694ad76358fb66b0066686eafdffd3cc1198530553ed2330731fd4130d363115636097663d6a2731c71c60dad6f7a1b3ae601596a7dade081144acb3e71f3142691fbb553ea99a0e69ecea77100596816abed10ab72c4c96151e63964d6dd33a6875441da529d68078e2255ca2cfb1a7000a5afe03ef626c6b0a24730f93d63cb31349d2e6f8113746b585e36dfcf45b749abc78ffa0e4d129d602c11b7a5015680a56c32f0bfb9d081090f80f1d97b2a364051c162006d1c48d310452e" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "validity-05-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + } + ] + }, + { + "id": "transfer-range-05", + "family": "transfer_range", + "expected_valid": true, + "payload": { + "proof_data_hex": "30c0c25a7168d2882ecbbeacc9e713ee6a7c2a9dc3696264a850a61c5c98df6224588418ad89f5b16d98d3365845085c9ca5fe922bd0911be2137d860489ef600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a2d8b9b8a7a1eca41a37c2dd138cb5d1807da6157b6b8e8dabfe78cdf6bddc58cabac8699fefc87a9d5f96a197ba6929ad8c941f3947bf7177ec2cb93e50324eceb15e54d879a6e73413469a0dc682515f7941665f53fe3b068e8605173257445ee61d2baefc1f6c2ffbea0bf9aa70bf29d066346ce401f344563195e588f042c21461c22565ac0463a15bc50cd3726d9fe2f97f70ed75ccd30b2569921b550b431a96b4c002ba704b8af5ab5dd5ba78cb4ea810d4b220538c326788a231f90667e216464e8d7d612c6e1e2a07287fa83ca63a4aab7e58764365c160ab1b380e52ec1311b121670dde79071883cb2549acc78d5293b4b65596603465fa8ad87dd690db2ac6b2d64ca11236059de84d867fe593ecbdc5c09d4e0037fb0fdc4219b884a855341b1326216cd710abdf76980d9721283a5d02d9514537a1d4312e5150edbbf425583855c753b353985e2766ac68ae6c5447c862c0eb80317e93ba32ca79984b0502d1575284e428e2830db208be8c672c5a69bc05c967440fda6349b295fc62829138611b12eac6596850461494251ce94e84b093105b415c1a52159cb7d748981375c773199eb640adfe4e4fdfa49106bc04668df4dcaccd604b10c672eff411c3ed0b1ab127059b6f7818ea90bcce2a91acf262802876c160cd740a026b940d88439611b0b27b2587b613af70fb1b2d508b1f307ea82b8d04ff5224765efa342e68cd82210c46c0d634e84cf3f324f10d3d60c65ada66e9772f375c81f519d8b8426f67ac285d7239e07dddf23e1bff1dd8c11a705c36853ea8219c728804c18dd8177b589fb9e78a1fb14bdb5bc9a8d3bff3e4ba799ea61db7209e6602a5023ab55c2fc0f7b57a0830cb359c9c9963aecae2ea5495269c26bc0cce908e6bca91ba089c02428fc6a3ac2a619f500c54cc4c39597ce045a2d2865c1781ac044c9c8522fc90a732e3757e90be7d5c70dc2d3ffa7ae5a94d351096099576333f01d09d640450255965975d299f8b5a9412fda2eab053d38586a2500e" + }, + "mutations": [ + { + "id": "transfer-range-05-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "31c0c25a7168d2882ecbbeacc9e713ee6a7c2a9dc3696264a850a61c5c98df6224588418ad89f5b16d98d3365845085c9ca5fe922bd0911be2137d860489ef600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a2d8b9b8a7a1eca41a37c2dd138cb5d1807da6157b6b8e8dabfe78cdf6bddc58cabac8699fefc87a9d5f96a197ba6929ad8c941f3947bf7177ec2cb93e50324eceb15e54d879a6e73413469a0dc682515f7941665f53fe3b068e8605173257445ee61d2baefc1f6c2ffbea0bf9aa70bf29d066346ce401f344563195e588f042c21461c22565ac0463a15bc50cd3726d9fe2f97f70ed75ccd30b2569921b550b431a96b4c002ba704b8af5ab5dd5ba78cb4ea810d4b220538c326788a231f90667e216464e8d7d612c6e1e2a07287fa83ca63a4aab7e58764365c160ab1b380e52ec1311b121670dde79071883cb2549acc78d5293b4b65596603465fa8ad87dd690db2ac6b2d64ca11236059de84d867fe593ecbdc5c09d4e0037fb0fdc4219b884a855341b1326216cd710abdf76980d9721283a5d02d9514537a1d4312e5150edbbf425583855c753b353985e2766ac68ae6c5447c862c0eb80317e93ba32ca79984b0502d1575284e428e2830db208be8c672c5a69bc05c967440fda6349b295fc62829138611b12eac6596850461494251ce94e84b093105b415c1a52159cb7d748981375c773199eb640adfe4e4fdfa49106bc04668df4dcaccd604b10c672eff411c3ed0b1ab127059b6f7818ea90bcce2a91acf262802876c160cd740a026b940d88439611b0b27b2587b613af70fb1b2d508b1f307ea82b8d04ff5224765efa342e68cd82210c46c0d634e84cf3f324f10d3d60c65ada66e9772f375c81f519d8b8426f67ac285d7239e07dddf23e1bff1dd8c11a705c36853ea8219c728804c18dd8177b589fb9e78a1fb14bdb5bc9a8d3bff3e4ba799ea61db7209e6602a5023ab55c2fc0f7b57a0830cb359c9c9963aecae2ea5495269c26bc0cce908e6bca91ba089c02428fc6a3ac2a619f500c54cc4c39597ce045a2d2865c1781ac044c9c8522fc90a732e3757e90be7d5c70dc2d3ffa7ae5a94d351096099576333f01d09d640450255965975d299f8b5a9412fda2eab053d38586a2500e" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "transfer-range-05-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "30c0c25a7168d2882ecbbeacc9e713ee6a7c2a9dc3696264a850a61c5c98df6224588418ad89f5b16d98d3365845085c9ca5fe922bd0911be2137d860489ef600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a2d8b9b8a7a1eca41a37c2dd138cb5d1807da6157b6b8e8dabfe78cdf6bddc58cabac8699fefc87a9d5f96a197ba6929ad8c941f3947bf7177ec2cb93e50324eceb15e54d879a6e73413469a0dc682515f7941665f53fe3b068e8605173257445ee61d2baefc1f6c2ffbea0bf9aa70bf29d066346ce401f344563195e588f042c21461c22565ac0463a15bc50cd3726d9fe2f97f70ed75ccd30b2569921b550b431a96b4c002ba704b8af5ab5dd5ba78cb4ea810d4b220538c326788a231f90667e216464e8d7d612c6e1e2a07287fa83ca63a4aab7e58764365c160ab1b380e52ec1311b121670dde79071883cb2549acc78d5293b4b65596603465fa8ad87dd690db2ac6b2d64ca11236059de84d867fe593ecbdc5c09d4e0037fb0fdc4219b884a855341b1326216cd710abdf76980d9721283a5d02d9514537a1d4312e5150edbbf425583855c753b353985e2766ac68ae6c5447c862c0eb80317e93ba32ca79984b0502d1575284e428e2830db208be8c672c5a69bc05c967440fda6349b295fc62829138611b12eac6596850461494251ce94e84b093105b415c1a52159cb7d748981375c773199eb640adfe4e4fdfa49106bc04668df4dcaccd604b10c672eff411c3ed0b1ab127059b6f7818ea90bcce2a91acf262802876c160cd740a026b940d88439611b0b27b2587b613af70fb1b2d508b1f307ea82b8d04ff5224765efa342e68cd82210c46c0d634e84cf3f324f10d3d60c65ada66e9772f375c81f519d8b8426f67ac285d7239e07dddf23e1bff1dd8c11a705c36853ea8219c728804c18dd8177b589fb9e78a1fb14bdb5bc9a8d3bff3e4ba799ea61db7209e6602a5023ab55c2fc0f7b57a0830cb359c9c9963aecae2ea5495269c26bc0cce908e6bca91ba089c02428fc6a3ac2a619f500c54cc4c39597ce045a2d2865c1781ac044c9c8522fc90a732e3757e90be7d5c70dc2d3ffa7ae5a94d351096099576333f01d09d640450255965975d299f8b5a9412fda2eab053d38586a2" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "transfer-range-05-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + }, + { + "id": "transfer-range-05-bfN", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "30c0c25a7168d2882ecbbeacc9e713ee6a7c2a9dc3696264a850a61c5c98df6224588418ad89f5b16d98d3365845085c9ca5fe922bd0911be2137d860489ef600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a2d8b9b8a7a1eca41a37c2dd138cb5d1807da6157b6b8e8dabfe78cdf6bddc58cabac8699fefc87a9d5f96a197ba6929ad8c941f3947bf7177ec2cb93e50324eceb15e54d879a6e73413469a0dc682515f7941665f53fe3b068e8605173257445ee61d2baefc1f6c2ffbea0bf9aa70bf29d066346ce401f344563195e588f042c21461c22565ac0463a15bc50cd3726d9fe2f97f70ed75ccd30b2569921b550b431a96b4c002ba704b8af5ab5dd5ba78cb4ea810d4b220538c326788a231f90667e216464e8d7d612c6e1e2a07287fa83ca63a4aab7e58764365c160ab1b380e52ec1311b121670dde79071883cb2549acc78d5293b4b65596603465fa8ad87dd690db2ac6b2d64ca11236059de84d867fe593ecbdc5c09d4e0037fb0fdc4219b884a855341b1326216cd710abdf76980d9721283a5d02d9514537a1d4312e5150edbbf425583855c753b353985e2766ac68ae6c5447c862c0eb80317e93ba32ca79984b0502d1575284e428e2830db208be8c672c5a69bc05c967440fda6349b295fc62829138611b12eac6596850461494251ce94e84b093105b415c1a52159cb7d748981375c773199eb640adfe4e4fdfa49106bc04668df4dcaccd604b10c672eff411c3ed0b1ab127059b6f7818ea90bcce2a91acf262802876c160cd740a026b940d88439611b0b27b2587b613af70fb1b2d508b1f307ea82b8d04ff5224765efa342e68cd82210c46c0d634e84cf3f324f10d3d60c65ada66e9772f375c81f519d8b8426f67ac285d7239e07dddf23e1bff1dd8c11a705c36853ea8219c728804c18dd8177b589fb9e78a1fb14bdb5bc9a8d3bff3e4ba799ea61db7209e6602a5023ab55c2fc0f7b57a0830cb359c9c9963aecae2ea5495269c26bc0cce908e6bca91ba089c02428fc6a3ac2a619f500c54cc4c39597ce045a2d2865c1781ac044c9c8522fc90a732e3757e90be7d5c70dc2d3ffa7ae5a94d351096099576333f01d09d640450255965975d299f8b5a9412fda2eab053d38586a2500f" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + } + ] + }, + { + "id": "transfer-composite-05", + "family": "transfer_composite", + "expected_valid": true, + "payload": { + "equality_proof_data_hex": "36d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317fce55fefc1b5d10d83081881b4bb51fc1857334ae14926d2d631ac3c9767485b9426cd109f794bf4bc5c90475a2695737bc1ca20c6790dfb4e16423a03a1634330c0c25a7168d2882ecbbeacc9e713ee6a7c2a9dc3696264a850a61c5c98df6222e72a480d6d46ea85ff5eec59378b82863be4ced933c8af470e177a11304c1c9e0710c463a28e70556a026246bc794027777a4c83b0f9fc2d68e0adc67a22128ed5bab98386cab5d3a6e6d3545813903e7990914dc0b24d461d572ca090515ebe75c3f9bdc5888c326566e805fb2c9a1b370f128c1241d06e87bfedfda01408a32f84368dd25c82bc6de2082a0b99a9ddbe53602c5eef1a9c801fbf73739f0cccf04297ff6f56cde8b6074dff9a2d3f047a6fe57b622c11ebba3d7abf7baf07", + "range_proof_data_hex": "30c0c25a7168d2882ecbbeacc9e713ee6a7c2a9dc3696264a850a61c5c98df6224588418ad89f5b16d98d3365845085c9ca5fe922bd0911be2137d860489ef600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a2d8b9b8a7a1eca41a37c2dd138cb5d1807da6157b6b8e8dabfe78cdf6bddc58cabac8699fefc87a9d5f96a197ba6929ad8c941f3947bf7177ec2cb93e50324eceb15e54d879a6e73413469a0dc682515f7941665f53fe3b068e8605173257445ee61d2baefc1f6c2ffbea0bf9aa70bf29d066346ce401f344563195e588f042c21461c22565ac0463a15bc50cd3726d9fe2f97f70ed75ccd30b2569921b550b431a96b4c002ba704b8af5ab5dd5ba78cb4ea810d4b220538c326788a231f90667e216464e8d7d612c6e1e2a07287fa83ca63a4aab7e58764365c160ab1b380e52ec1311b121670dde79071883cb2549acc78d5293b4b65596603465fa8ad87dd690db2ac6b2d64ca11236059de84d867fe593ecbdc5c09d4e0037fb0fdc4219b884a855341b1326216cd710abdf76980d9721283a5d02d9514537a1d4312e5150edbbf425583855c753b353985e2766ac68ae6c5447c862c0eb80317e93ba32ca79984b0502d1575284e428e2830db208be8c672c5a69bc05c967440fda6349b295fc62829138611b12eac6596850461494251ce94e84b093105b415c1a52159cb7d748981375c773199eb640adfe4e4fdfa49106bc04668df4dcaccd604b10c672eff411c3ed0b1ab127059b6f7818ea90bcce2a91acf262802876c160cd740a026b940d88439611b0b27b2587b613af70fb1b2d508b1f307ea82b8d04ff5224765efa342e68cd82210c46c0d634e84cf3f324f10d3d60c65ada66e9772f375c81f519d8b8426f67ac285d7239e07dddf23e1bff1dd8c11a705c36853ea8219c728804c18dd8177b589fb9e78a1fb14bdb5bc9a8d3bff3e4ba799ea61db7209e6602a5023ab55c2fc0f7b57a0830cb359c9c9963aecae2ea5495269c26bc0cce908e6bca91ba089c02428fc6a3ac2a619f500c54cc4c39597ce045a2d2865c1781ac044c9c8522fc90a732e3757e90be7d5c70dc2d3ffa7ae5a94d351096099576333f01d09d640450255965975d299f8b5a9412fda2eab053d38586a2500e", + "validity_proof_data_hex": "36d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7624588418ad89f5b16d98d3365845085c9ca5fe922bd0911be2137d860489ef60bcffdcb053f5ebafec6719393a03de9cdb825214f0965f851845b4ed1119160bb4c725f60304a9612d458ddffc40570a0681021172f11d36e43ae2e2704da94bd8a170e25269e28320d887eedc3d88f896061c0bd790cf169785597c90471f429a142ca709fb84da1311bf009b5fb1bf6f9eb4278c12d39f2d4475a1c7eb7d269694ad76358fb66b0066686eafdffd3cc1198530553ed2330731fd4130d363115636097663d6a2731c71c60dad6f7a1b3ae601596a7dade081144acb3e71f3142691fbb553ea99a0e69ecea77100596816abed10ab72c4c96151e63964d6dd33a6875441da529d68078e2255ca2cfb1a7000a5afe03ef626c6b0a24730f93d63cb31349d2e6f8113746b585e36dfcf45b749abc78ffa0e4d129d602c11b7a5015680a56c32f0bfb9d081090f80f1d97b2a364051c162006d1c48d310452eb60f" + }, + "binding": { + "current_balance_commitment_hex": "4651ac354851bf6db7345197988f90aa6fe6e455a2d38982793fe3f899773d32", + "current_balance_handle_hex": "c2d94d97912e21eea2b85b38977124049a4352ee83b2dc3ab65bca1b3370af29", + "recipient_pubkey_hex": "f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a76", + "sender_pubkey_hex": "36d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317" + }, + "mutations": [ + { + "id": "transfer-composite-05-swap-eq-val", + "op": "swap_fields", + "target": "payload.equality_proof_data_hex", + "params": { + "with": "payload.validity_proof_data_hex" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "transfer-composite-05-pk-s", + "op": "bitflip", + "target": "binding.sender_pubkey_hex", + "params": { + "value_hex": "37d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "transfer-composite-05-pk-r", + "op": "bitflip", + "target": "binding.recipient_pubkey_hex", + "params": { + "value_hex": "f95e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a76" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "transfer-composite-05-bal-c1", + "op": "replace_field", + "target": "binding.current_balance_commitment_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "remaining balance commitment mismatch" + }, + { + "id": "transfer-composite-05-rng-trunc", + "op": "truncate", + "target": "payload.range_proof_data_hex", + "params": { + "value_hex": "30c0c25a7168d2882ecbbeacc9e713ee6a7c2a9dc3696264a850a61c5c98df6224588418ad89f5b16d98d3365845085c9ca5fe922bd0911be2137d860489ef600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a2d8b9b8a7a1eca41a37c2dd138cb5d1807da6157b6b8e8dabfe78cdf6bddc58cabac8699fefc87a9d5f96a197ba6929ad8c941f3947bf7177ec2cb93e50324eceb15e54d879a6e73413469a0dc682515f7941665f53fe3b068e8605173257445ee61d2baefc1f6c2ffbea0bf9aa70bf29d066346ce401f344563195e588f042c21461c22565ac0463a15bc50cd3726d9fe2f97f70ed75ccd30b2569921b550b431a96b4c002ba704b8af5ab5dd5ba78cb4ea810d4b220538c326788a231f90667e216464e8d7d612c6e1e2a07287fa83ca63a4aab7e58764365c160ab1b380e52ec1311b121670dde79071883cb2549acc78d5293b4b65596603465fa8ad87dd690db2ac6b2d64ca11236059de84d867fe593ecbdc5c09d4e0037fb0fdc4219b884a855341b1326216cd710abdf76980d9721283a5d02d9514537a1d4312e5150edbbf425583855c753b353985e2766ac68ae6c5447c862c0eb80317e93ba32ca79984b0502d1575284e428e2830db208be8c672c5a69bc05c967440fda6349b295fc62829138611b12eac6596850461494251ce94e84b093105b415c1a52159cb7d748981375c773199eb640adfe4e4fdfa49106bc04668df4dcaccd604b10c672eff411c3ed0b1ab127059b6f7818ea90bcce2a91acf262802876c160cd740a026b940d88439611b0b27b2587b613af70fb1b2d508b1f307ea82b8d04ff5224765efa342e68cd82210c46c0d634e84cf3f324f10d3d60c65ada66e9772f375c81f519d8b8426f67ac285d7239e07dddf23e1bff1dd8c11a705c36853ea8219c728804c18dd8177b589fb9e78a1fb14bdb5bc9a8d3bff3e4ba799ea61db7209e6602a5023ab55c2fc0f7b57a0830cb359c9c9963aecae2ea5495269c26bc0cce908e6bca91ba089c02428fc6a3ac2a619f500c54cc4c39597ce045a2d2865c1781ac044c9c8522fc90a732e3757e90be7d5c70dc2d3ffa7ae5a94d351096099576333f01d09d640450255965975d299f8b5a9412fda2eab053d38586a2" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + } + ] + }, + { + "id": "equality-06", + "family": "equality", + "expected_valid": true, + "payload": { + "proof_data_hex": "f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7616cee89858876c6db2c389bfa93cbda033281ce2c20c9636a29b0fd4e9db1d31c404df3215035706cd538f45b2bf340d6af3e106e7bfa6955067dc5c141d2442fed7eef0f734800b63277b8420bf111dcb6ba2508e9635fb35bdc9a37e45b2408a7ca7bf9843bc0c1f75ec770aea06eeff42ea96ff714aaab4c3fab7db25d32c9e940a14facebfacd56c1dd72482a1f5b0b2c344967dc02de1a731319393c861ccb4a842c97703c4646d1a31bafa6cf114015277329a0272c2a072dc59dc2b6d0e712d30abc35b39cbbecb48c2fa1786ca75fff4ac30d0a21f264c43a1f4ee03164719d14fac448c036ab20aa95c26a35f4dae519090ff5a2f52e47c8ce71a09ab2f3e9d3f6f0ff5428f6e5b817ff1b7c64547372b52df564832584df3c5f103" + }, + "mutations": [ + { + "id": "equality-06-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "f95e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7616cee89858876c6db2c389bfa93cbda033281ce2c20c9636a29b0fd4e9db1d31c404df3215035706cd538f45b2bf340d6af3e106e7bfa6955067dc5c141d2442fed7eef0f734800b63277b8420bf111dcb6ba2508e9635fb35bdc9a37e45b2408a7ca7bf9843bc0c1f75ec770aea06eeff42ea96ff714aaab4c3fab7db25d32c9e940a14facebfacd56c1dd72482a1f5b0b2c344967dc02de1a731319393c861ccb4a842c97703c4646d1a31bafa6cf114015277329a0272c2a072dc59dc2b6d0e712d30abc35b39cbbecb48c2fa1786ca75fff4ac30d0a21f264c43a1f4ee03164719d14fac448c036ab20aa95c26a35f4dae519090ff5a2f52e47c8ce71a09ab2f3e9d3f6f0ff5428f6e5b817ff1b7c64547372b52df564832584df3c5f103" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "equality-06-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7616cee89858876c6db2c389bfa93cbda033281ce2c20c9636a29b0fd4e9db1d31c404df3215035706cd538f45b2bf340d6af3e106e7bfa6955067dc5c141d2442fed7eef0f734800b63277b8420bf111dcb6ba2508e9635fb35bdc9a37e45b2408a7ca7bf9843bc0c1f75ec770aea06eeff42ea96ff714aaab4c3fab7db25d32c9e940a14facebfacd56c1dd72482a1f5b0b2c344967dc02de1a731319393c861ccb4a842c97703c4646d1a31bafa6cf114015277329a0272c2a072dc59dc2b6d0e712d30abc35b39cbbecb48c2fa1786ca75fff4ac30d0a21f264c43a1f4ee03164719d14fac448c036ab20aa95c26a35f4dae519090ff5a2f52e47c8ce71a09ab2f3e9d3f6f0ff5428f6e5b817ff1b7c64547372b52df564832584df3c5" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "equality-06-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + } + ] + }, + { + "id": "validity-06", + "family": "validity", + "expected_valid": true, + "payload": { + "proof_data_hex": "f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7630943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de62141acb171db8e9f6aabcb4affd4abfd1eac9a982cf04af96017e57bb9b89024568fc0acca3f5e811bd1d54aada7d71f57e8a47aa21fed86f9bb53dee27723ca9767a668df2ce76caf0c519679121fca658185afefb91ed8c52945960e18afa622f3eaa1b02e2fc51d5855e538a849284cd12f4db794ce26b7e981efcaac99aa5603ae61fa7ea08af973a9118a2c48bf285320b79e24ed8883302cf8f7df060a8004c5c0938fed54f8fff48e9ac6b489e847f0c3677ef77be14126dcf6327a8191c1ad83e1793bfdfc22e69b40984c05e0c1954e248339bf9e1bd29804656307b365ad72759fa216f0e810f6781e130fe2db2095ddb1a07efb03b7056c81a1d02268cf9bed68ced0bbec9049f107dca9f1584fa61fbb7ade874b1759cc03db19c6b5d282e2d70f820a30e4a12489678ed9d48df09806efeb06e779750ba2fa85e090723934eed1daf31448a79e0d453d1ce8d8851941bd9d3017f667d60959e700c" + }, + "mutations": [ + { + "id": "validity-06-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "f95e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7630943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de62141acb171db8e9f6aabcb4affd4abfd1eac9a982cf04af96017e57bb9b89024568fc0acca3f5e811bd1d54aada7d71f57e8a47aa21fed86f9bb53dee27723ca9767a668df2ce76caf0c519679121fca658185afefb91ed8c52945960e18afa622f3eaa1b02e2fc51d5855e538a849284cd12f4db794ce26b7e981efcaac99aa5603ae61fa7ea08af973a9118a2c48bf285320b79e24ed8883302cf8f7df060a8004c5c0938fed54f8fff48e9ac6b489e847f0c3677ef77be14126dcf6327a8191c1ad83e1793bfdfc22e69b40984c05e0c1954e248339bf9e1bd29804656307b365ad72759fa216f0e810f6781e130fe2db2095ddb1a07efb03b7056c81a1d02268cf9bed68ced0bbec9049f107dca9f1584fa61fbb7ade874b1759cc03db19c6b5d282e2d70f820a30e4a12489678ed9d48df09806efeb06e779750ba2fa85e090723934eed1daf31448a79e0d453d1ce8d8851941bd9d3017f667d60959e700c" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "validity-06-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7630943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de62141acb171db8e9f6aabcb4affd4abfd1eac9a982cf04af96017e57bb9b89024568fc0acca3f5e811bd1d54aada7d71f57e8a47aa21fed86f9bb53dee27723ca9767a668df2ce76caf0c519679121fca658185afefb91ed8c52945960e18afa622f3eaa1b02e2fc51d5855e538a849284cd12f4db794ce26b7e981efcaac99aa5603ae61fa7ea08af973a9118a2c48bf285320b79e24ed8883302cf8f7df060a8004c5c0938fed54f8fff48e9ac6b489e847f0c3677ef77be14126dcf6327a8191c1ad83e1793bfdfc22e69b40984c05e0c1954e248339bf9e1bd29804656307b365ad72759fa216f0e810f6781e130fe2db2095ddb1a07efb03b7056c81a1d02268cf9bed68ced0bbec9049f107dca9f1584fa61fbb7ade874b1759cc03db19c6b5d282e2d70f820a30e4a12489678ed9d48df09806efeb06e779750ba2fa85e090723934eed1daf31448a79e0d453d1ce8d8851941bd9d3017f667d60959e" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "validity-06-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + } + ] + }, + { + "id": "transfer-range-06", + "family": "transfer_range", + "expected_valid": true, + "payload": { + "proof_data_hex": "fed7eef0f734800b63277b8420bf111dcb6ba2508e9635fb35bdc9a37e45b2401acb171db8e9f6aabcb4affd4abfd1eac9a982cf04af96017e57bb9b890245680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000ca7280619ee0ca599127393f3a0beaa5e696112177168a2c431dba199f5d1902c8d65f55fabfb9384aa4e5b027514e469f100dc5005c8aeac10b074ef365a857ba826694ae9a5a287820db647c70a954adf14458cb09430ffaed00d42c978911a235151add0cbe42f717926f3725693dad09c05b641a70c97cb2b71aea104c3fba2bf581f081151443845eaa06a9c3e1738b521493d1854be45f62df64e75e0261559a59eec76969259d888e362989cd4793bea53cd8ca8f8788e15fe40f1d08a742e7ad81c33b5d3d0ad4e61b1a48054a00005393862765c5981492de1456013ae35e17204041227efadf84f43d2ba3caa678a1811275e3fe8814d5ad6ea769fea3347ffdaa560957ff6278417c9368d19df599f757f6c4c3391154d8152356c8f8c0794fa3bfdf04e350dd2efd3175892b88b76c97a5507106055f30ecf4713632d74d949d1e204e1727092f33a9746cfed47a4ac715f7299c23c38db95925fc8bf13045c5acc9ae54fc5041b5dbf52b0e87f23c233c853254fb2e58a53d043616ee147d73a3cb3a75add5e26d1e40a82735688dd61e9a319bcb7e737324044edda301e7bc765b072d7d28610c430127cf5362770bffa3dd04b3c61e34412ba2238943083b323ab3c558f1e685f766fa07948ef090cf14da3d8fff533aa03b42ad969fcc0c74a4a70ce1a9e4d070455693e42d9b974bb1c2340422a64ae870b68eda2044107a0347bb47a74f8c82cdc683e9d900e93bb24b43b872c8305451b4a2034e60bc4b06a4c319394902b43a7ed7ee9ef2a228194a0786aedecd2070049450fa3c177e9f3d585071245572875ebc80026bd6a738d8f5cf869b72181376a012418d7287b7c7c8674a2f13b765a1782b4758ba2bd58d66e56163bcf44cfc3a99e5626de2760c8c3e7ba04edeaf5853df677060c7e80a02d829d567d45389b5aec9fb6a88b53091b25d6175faa8135a6d8c70bd8e18fd5388a49b4d3a029c82826233dc39a3260fbeb6656814826e8de6772b51d4b8b6a7581b0729f10e" + }, + "mutations": [ + { + "id": "transfer-range-06-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "ffd7eef0f734800b63277b8420bf111dcb6ba2508e9635fb35bdc9a37e45b2401acb171db8e9f6aabcb4affd4abfd1eac9a982cf04af96017e57bb9b890245680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000ca7280619ee0ca599127393f3a0beaa5e696112177168a2c431dba199f5d1902c8d65f55fabfb9384aa4e5b027514e469f100dc5005c8aeac10b074ef365a857ba826694ae9a5a287820db647c70a954adf14458cb09430ffaed00d42c978911a235151add0cbe42f717926f3725693dad09c05b641a70c97cb2b71aea104c3fba2bf581f081151443845eaa06a9c3e1738b521493d1854be45f62df64e75e0261559a59eec76969259d888e362989cd4793bea53cd8ca8f8788e15fe40f1d08a742e7ad81c33b5d3d0ad4e61b1a48054a00005393862765c5981492de1456013ae35e17204041227efadf84f43d2ba3caa678a1811275e3fe8814d5ad6ea769fea3347ffdaa560957ff6278417c9368d19df599f757f6c4c3391154d8152356c8f8c0794fa3bfdf04e350dd2efd3175892b88b76c97a5507106055f30ecf4713632d74d949d1e204e1727092f33a9746cfed47a4ac715f7299c23c38db95925fc8bf13045c5acc9ae54fc5041b5dbf52b0e87f23c233c853254fb2e58a53d043616ee147d73a3cb3a75add5e26d1e40a82735688dd61e9a319bcb7e737324044edda301e7bc765b072d7d28610c430127cf5362770bffa3dd04b3c61e34412ba2238943083b323ab3c558f1e685f766fa07948ef090cf14da3d8fff533aa03b42ad969fcc0c74a4a70ce1a9e4d070455693e42d9b974bb1c2340422a64ae870b68eda2044107a0347bb47a74f8c82cdc683e9d900e93bb24b43b872c8305451b4a2034e60bc4b06a4c319394902b43a7ed7ee9ef2a228194a0786aedecd2070049450fa3c177e9f3d585071245572875ebc80026bd6a738d8f5cf869b72181376a012418d7287b7c7c8674a2f13b765a1782b4758ba2bd58d66e56163bcf44cfc3a99e5626de2760c8c3e7ba04edeaf5853df677060c7e80a02d829d567d45389b5aec9fb6a88b53091b25d6175faa8135a6d8c70bd8e18fd5388a49b4d3a029c82826233dc39a3260fbeb6656814826e8de6772b51d4b8b6a7581b0729f10e" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "transfer-range-06-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "fed7eef0f734800b63277b8420bf111dcb6ba2508e9635fb35bdc9a37e45b2401acb171db8e9f6aabcb4affd4abfd1eac9a982cf04af96017e57bb9b890245680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000ca7280619ee0ca599127393f3a0beaa5e696112177168a2c431dba199f5d1902c8d65f55fabfb9384aa4e5b027514e469f100dc5005c8aeac10b074ef365a857ba826694ae9a5a287820db647c70a954adf14458cb09430ffaed00d42c978911a235151add0cbe42f717926f3725693dad09c05b641a70c97cb2b71aea104c3fba2bf581f081151443845eaa06a9c3e1738b521493d1854be45f62df64e75e0261559a59eec76969259d888e362989cd4793bea53cd8ca8f8788e15fe40f1d08a742e7ad81c33b5d3d0ad4e61b1a48054a00005393862765c5981492de1456013ae35e17204041227efadf84f43d2ba3caa678a1811275e3fe8814d5ad6ea769fea3347ffdaa560957ff6278417c9368d19df599f757f6c4c3391154d8152356c8f8c0794fa3bfdf04e350dd2efd3175892b88b76c97a5507106055f30ecf4713632d74d949d1e204e1727092f33a9746cfed47a4ac715f7299c23c38db95925fc8bf13045c5acc9ae54fc5041b5dbf52b0e87f23c233c853254fb2e58a53d043616ee147d73a3cb3a75add5e26d1e40a82735688dd61e9a319bcb7e737324044edda301e7bc765b072d7d28610c430127cf5362770bffa3dd04b3c61e34412ba2238943083b323ab3c558f1e685f766fa07948ef090cf14da3d8fff533aa03b42ad969fcc0c74a4a70ce1a9e4d070455693e42d9b974bb1c2340422a64ae870b68eda2044107a0347bb47a74f8c82cdc683e9d900e93bb24b43b872c8305451b4a2034e60bc4b06a4c319394902b43a7ed7ee9ef2a228194a0786aedecd2070049450fa3c177e9f3d585071245572875ebc80026bd6a738d8f5cf869b72181376a012418d7287b7c7c8674a2f13b765a1782b4758ba2bd58d66e56163bcf44cfc3a99e5626de2760c8c3e7ba04edeaf5853df677060c7e80a02d829d567d45389b5aec9fb6a88b53091b25d6175faa8135a6d8c70bd8e18fd5388a49b4d3a029c82826233dc39a3260fbeb6656814826e8de6772b51d4b8b6a7581b0729" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "transfer-range-06-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + }, + { + "id": "transfer-range-06-bfN", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "fed7eef0f734800b63277b8420bf111dcb6ba2508e9635fb35bdc9a37e45b2401acb171db8e9f6aabcb4affd4abfd1eac9a982cf04af96017e57bb9b890245680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000ca7280619ee0ca599127393f3a0beaa5e696112177168a2c431dba199f5d1902c8d65f55fabfb9384aa4e5b027514e469f100dc5005c8aeac10b074ef365a857ba826694ae9a5a287820db647c70a954adf14458cb09430ffaed00d42c978911a235151add0cbe42f717926f3725693dad09c05b641a70c97cb2b71aea104c3fba2bf581f081151443845eaa06a9c3e1738b521493d1854be45f62df64e75e0261559a59eec76969259d888e362989cd4793bea53cd8ca8f8788e15fe40f1d08a742e7ad81c33b5d3d0ad4e61b1a48054a00005393862765c5981492de1456013ae35e17204041227efadf84f43d2ba3caa678a1811275e3fe8814d5ad6ea769fea3347ffdaa560957ff6278417c9368d19df599f757f6c4c3391154d8152356c8f8c0794fa3bfdf04e350dd2efd3175892b88b76c97a5507106055f30ecf4713632d74d949d1e204e1727092f33a9746cfed47a4ac715f7299c23c38db95925fc8bf13045c5acc9ae54fc5041b5dbf52b0e87f23c233c853254fb2e58a53d043616ee147d73a3cb3a75add5e26d1e40a82735688dd61e9a319bcb7e737324044edda301e7bc765b072d7d28610c430127cf5362770bffa3dd04b3c61e34412ba2238943083b323ab3c558f1e685f766fa07948ef090cf14da3d8fff533aa03b42ad969fcc0c74a4a70ce1a9e4d070455693e42d9b974bb1c2340422a64ae870b68eda2044107a0347bb47a74f8c82cdc683e9d900e93bb24b43b872c8305451b4a2034e60bc4b06a4c319394902b43a7ed7ee9ef2a228194a0786aedecd2070049450fa3c177e9f3d585071245572875ebc80026bd6a738d8f5cf869b72181376a012418d7287b7c7c8674a2f13b765a1782b4758ba2bd58d66e56163bcf44cfc3a99e5626de2760c8c3e7ba04edeaf5853df677060c7e80a02d829d567d45389b5aec9fb6a88b53091b25d6175faa8135a6d8c70bd8e18fd5388a49b4d3a029c82826233dc39a3260fbeb6656814826e8de6772b51d4b8b6a7581b0729f10f" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + } + ] + }, + { + "id": "transfer-composite-06", + "family": "transfer_composite", + "expected_valid": true, + "payload": { + "equality_proof_data_hex": "f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7616cee89858876c6db2c389bfa93cbda033281ce2c20c9636a29b0fd4e9db1d31c404df3215035706cd538f45b2bf340d6af3e106e7bfa6955067dc5c141d2442fed7eef0f734800b63277b8420bf111dcb6ba2508e9635fb35bdc9a37e45b2408a7ca7bf9843bc0c1f75ec770aea06eeff42ea96ff714aaab4c3fab7db25d32c9e940a14facebfacd56c1dd72482a1f5b0b2c344967dc02de1a731319393c861ccb4a842c97703c4646d1a31bafa6cf114015277329a0272c2a072dc59dc2b6d0e712d30abc35b39cbbecb48c2fa1786ca75fff4ac30d0a21f264c43a1f4ee03164719d14fac448c036ab20aa95c26a35f4dae519090ff5a2f52e47c8ce71a09ab2f3e9d3f6f0ff5428f6e5b817ff1b7c64547372b52df564832584df3c5f103", + "range_proof_data_hex": "fed7eef0f734800b63277b8420bf111dcb6ba2508e9635fb35bdc9a37e45b2401acb171db8e9f6aabcb4affd4abfd1eac9a982cf04af96017e57bb9b890245680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000ca7280619ee0ca599127393f3a0beaa5e696112177168a2c431dba199f5d1902c8d65f55fabfb9384aa4e5b027514e469f100dc5005c8aeac10b074ef365a857ba826694ae9a5a287820db647c70a954adf14458cb09430ffaed00d42c978911a235151add0cbe42f717926f3725693dad09c05b641a70c97cb2b71aea104c3fba2bf581f081151443845eaa06a9c3e1738b521493d1854be45f62df64e75e0261559a59eec76969259d888e362989cd4793bea53cd8ca8f8788e15fe40f1d08a742e7ad81c33b5d3d0ad4e61b1a48054a00005393862765c5981492de1456013ae35e17204041227efadf84f43d2ba3caa678a1811275e3fe8814d5ad6ea769fea3347ffdaa560957ff6278417c9368d19df599f757f6c4c3391154d8152356c8f8c0794fa3bfdf04e350dd2efd3175892b88b76c97a5507106055f30ecf4713632d74d949d1e204e1727092f33a9746cfed47a4ac715f7299c23c38db95925fc8bf13045c5acc9ae54fc5041b5dbf52b0e87f23c233c853254fb2e58a53d043616ee147d73a3cb3a75add5e26d1e40a82735688dd61e9a319bcb7e737324044edda301e7bc765b072d7d28610c430127cf5362770bffa3dd04b3c61e34412ba2238943083b323ab3c558f1e685f766fa07948ef090cf14da3d8fff533aa03b42ad969fcc0c74a4a70ce1a9e4d070455693e42d9b974bb1c2340422a64ae870b68eda2044107a0347bb47a74f8c82cdc683e9d900e93bb24b43b872c8305451b4a2034e60bc4b06a4c319394902b43a7ed7ee9ef2a228194a0786aedecd2070049450fa3c177e9f3d585071245572875ebc80026bd6a738d8f5cf869b72181376a012418d7287b7c7c8674a2f13b765a1782b4758ba2bd58d66e56163bcf44cfc3a99e5626de2760c8c3e7ba04edeaf5853df677060c7e80a02d829d567d45389b5aec9fb6a88b53091b25d6175faa8135a6d8c70bd8e18fd5388a49b4d3a029c82826233dc39a3260fbeb6656814826e8de6772b51d4b8b6a7581b0729f10e", + "validity_proof_data_hex": "f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7630943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de62141acb171db8e9f6aabcb4affd4abfd1eac9a982cf04af96017e57bb9b89024568fc0acca3f5e811bd1d54aada7d71f57e8a47aa21fed86f9bb53dee27723ca9767a668df2ce76caf0c519679121fca658185afefb91ed8c52945960e18afa622f3eaa1b02e2fc51d5855e538a849284cd12f4db794ce26b7e981efcaac99aa5603ae61fa7ea08af973a9118a2c48bf285320b79e24ed8883302cf8f7df060a8004c5c0938fed54f8fff48e9ac6b489e847f0c3677ef77be14126dcf6327a8191c1ad83e1793bfdfc22e69b40984c05e0c1954e248339bf9e1bd29804656307b365ad72759fa216f0e810f6781e130fe2db2095ddb1a07efb03b7056c81a1d02268cf9bed68ced0bbec9049f107dca9f1584fa61fbb7ade874b1759cc03db19c6b5d282e2d70f820a30e4a12489678ed9d48df09806efeb06e779750ba2fa85e090723934eed1daf31448a79e0d453d1ce8d8851941bd9d3017f667d60959e700c" + }, + "binding": { + "current_balance_commitment_hex": "d67974feb2c5b5b2d9334e2bcd455e1c4dd4d68fe1d36a9e169ae6b638373a38", + "current_balance_handle_hex": "3644ec42acf9ab8541e290ff4006e1c5ca61279368d3f0313f25dfddfcb0460f", + "recipient_pubkey_hex": "30943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214", + "sender_pubkey_hex": "f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a76" + }, + "mutations": [ + { + "id": "transfer-composite-06-swap-eq-val", + "op": "swap_fields", + "target": "payload.equality_proof_data_hex", + "params": { + "with": "payload.validity_proof_data_hex" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "transfer-composite-06-pk-s", + "op": "bitflip", + "target": "binding.sender_pubkey_hex", + "params": { + "value_hex": "f95e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a76" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "transfer-composite-06-pk-r", + "op": "bitflip", + "target": "binding.recipient_pubkey_hex", + "params": { + "value_hex": "31943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "transfer-composite-06-bal-c1", + "op": "replace_field", + "target": "binding.current_balance_commitment_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "remaining balance commitment mismatch" + }, + { + "id": "transfer-composite-06-rng-trunc", + "op": "truncate", + "target": "payload.range_proof_data_hex", + "params": { + "value_hex": "fed7eef0f734800b63277b8420bf111dcb6ba2508e9635fb35bdc9a37e45b2401acb171db8e9f6aabcb4affd4abfd1eac9a982cf04af96017e57bb9b890245680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000ca7280619ee0ca599127393f3a0beaa5e696112177168a2c431dba199f5d1902c8d65f55fabfb9384aa4e5b027514e469f100dc5005c8aeac10b074ef365a857ba826694ae9a5a287820db647c70a954adf14458cb09430ffaed00d42c978911a235151add0cbe42f717926f3725693dad09c05b641a70c97cb2b71aea104c3fba2bf581f081151443845eaa06a9c3e1738b521493d1854be45f62df64e75e0261559a59eec76969259d888e362989cd4793bea53cd8ca8f8788e15fe40f1d08a742e7ad81c33b5d3d0ad4e61b1a48054a00005393862765c5981492de1456013ae35e17204041227efadf84f43d2ba3caa678a1811275e3fe8814d5ad6ea769fea3347ffdaa560957ff6278417c9368d19df599f757f6c4c3391154d8152356c8f8c0794fa3bfdf04e350dd2efd3175892b88b76c97a5507106055f30ecf4713632d74d949d1e204e1727092f33a9746cfed47a4ac715f7299c23c38db95925fc8bf13045c5acc9ae54fc5041b5dbf52b0e87f23c233c853254fb2e58a53d043616ee147d73a3cb3a75add5e26d1e40a82735688dd61e9a319bcb7e737324044edda301e7bc765b072d7d28610c430127cf5362770bffa3dd04b3c61e34412ba2238943083b323ab3c558f1e685f766fa07948ef090cf14da3d8fff533aa03b42ad969fcc0c74a4a70ce1a9e4d070455693e42d9b974bb1c2340422a64ae870b68eda2044107a0347bb47a74f8c82cdc683e9d900e93bb24b43b872c8305451b4a2034e60bc4b06a4c319394902b43a7ed7ee9ef2a228194a0786aedecd2070049450fa3c177e9f3d585071245572875ebc80026bd6a738d8f5cf869b72181376a012418d7287b7c7c8674a2f13b765a1782b4758ba2bd58d66e56163bcf44cfc3a99e5626de2760c8c3e7ba04edeaf5853df677060c7e80a02d829d567d45389b5aec9fb6a88b53091b25d6175faa8135a6d8c70bd8e18fd5388a49b4d3a029c82826233dc39a3260fbeb6656814826e8de6772b51d4b8b6a7581b0729" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + } + ] + }, + { + "id": "equality-07", + "family": "equality", + "expected_valid": true, + "payload": { + "proof_data_hex": "30943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214fe3004511f24f433de3a26c21d25d6d94a931413446c0cb2018693a596e3cb5cf62e972df91f67b5bb073379c53069b920f9639c5100beea10bb5ba2ad6dc802aa44352b1f2c49b05d2b8a6fdb64a5a06b65be84158bf1239c7495402cc1f85e8e0126022917a2a891c4a6d79f2e2324ebc99cd3980483be69f8398dc41ef61fb41eb31a4feb59da07b5b1d3ac36e581eb852051820f4e5f49701c00e24e932eeaef60ed9444f90037f02f3aee1135211d048eee6f50d1ef8973fd623d526974ffb6eae106d66ef21d568dc20b750be0faa67a7ee8e1c3c918a3528193908c02300a32a25c8e543cee514990396f86e2ce553eaabfd68c70de3415e9675810056c4ff7bfef161f887b7951e7107053d5f5376d769afbe8e47578443e3061a708" + }, + "mutations": [ + { + "id": "equality-07-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "31943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214fe3004511f24f433de3a26c21d25d6d94a931413446c0cb2018693a596e3cb5cf62e972df91f67b5bb073379c53069b920f9639c5100beea10bb5ba2ad6dc802aa44352b1f2c49b05d2b8a6fdb64a5a06b65be84158bf1239c7495402cc1f85e8e0126022917a2a891c4a6d79f2e2324ebc99cd3980483be69f8398dc41ef61fb41eb31a4feb59da07b5b1d3ac36e581eb852051820f4e5f49701c00e24e932eeaef60ed9444f90037f02f3aee1135211d048eee6f50d1ef8973fd623d526974ffb6eae106d66ef21d568dc20b750be0faa67a7ee8e1c3c918a3528193908c02300a32a25c8e543cee514990396f86e2ce553eaabfd68c70de3415e9675810056c4ff7bfef161f887b7951e7107053d5f5376d769afbe8e47578443e3061a708" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "equality-07-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "30943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214fe3004511f24f433de3a26c21d25d6d94a931413446c0cb2018693a596e3cb5cf62e972df91f67b5bb073379c53069b920f9639c5100beea10bb5ba2ad6dc802aa44352b1f2c49b05d2b8a6fdb64a5a06b65be84158bf1239c7495402cc1f85e8e0126022917a2a891c4a6d79f2e2324ebc99cd3980483be69f8398dc41ef61fb41eb31a4feb59da07b5b1d3ac36e581eb852051820f4e5f49701c00e24e932eeaef60ed9444f90037f02f3aee1135211d048eee6f50d1ef8973fd623d526974ffb6eae106d66ef21d568dc20b750be0faa67a7ee8e1c3c918a3528193908c02300a32a25c8e543cee514990396f86e2ce553eaabfd68c70de3415e9675810056c4ff7bfef161f887b7951e7107053d5f5376d769afbe8e47578443e3061" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "equality-07-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + } + ] + }, + { + "id": "validity-07", + "family": "validity", + "expected_valid": true, + "payload": { + "proof_data_hex": "30943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c7923732453cc0c678c42538ebcc8469d9652366f23194391beecaf2efd9b0754cd3fc3830e8ee40edddc78a367edc0e949517012933dfccdc69fe42b54bfa13eadc91f63e22c5b8d4503c4cf829a03fc13fdc4114e9717ad469e6a6da3574a9bac2ac8805521cb769194db9582c61306d2290884b05d304ed16033f563ff6a03b2278223caa4215cd9fb2892c3c3952a8f2e7612303f50fe03dd4d67ec8f3a6c1086818367a2cc4f5c776738ba49b05673fda19e057da582aca0a2d3a7969a131db0cc3437affc1e6bc78ccd39a38c54a2ad854f3ba049d0bd95e5a0f3b518cd284f4f51658fd5354edbab82b9698623024b2b03387475d891b6975c686aca77c304b1b668e06e3813255b60b17df01ad84bd29da60a2920ce12ac998c3d5cb044dae8b3682f287f6e653e337ae14183fb50705ee1785e8718d8e1a88044567da4a83f105fd590cd100197ea0db22e1a3915ab447e98d77f712106b1829f9c1583d7ceb07" + }, + "mutations": [ + { + "id": "validity-07-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "31943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c7923732453cc0c678c42538ebcc8469d9652366f23194391beecaf2efd9b0754cd3fc3830e8ee40edddc78a367edc0e949517012933dfccdc69fe42b54bfa13eadc91f63e22c5b8d4503c4cf829a03fc13fdc4114e9717ad469e6a6da3574a9bac2ac8805521cb769194db9582c61306d2290884b05d304ed16033f563ff6a03b2278223caa4215cd9fb2892c3c3952a8f2e7612303f50fe03dd4d67ec8f3a6c1086818367a2cc4f5c776738ba49b05673fda19e057da582aca0a2d3a7969a131db0cc3437affc1e6bc78ccd39a38c54a2ad854f3ba049d0bd95e5a0f3b518cd284f4f51658fd5354edbab82b9698623024b2b03387475d891b6975c686aca77c304b1b668e06e3813255b60b17df01ad84bd29da60a2920ce12ac998c3d5cb044dae8b3682f287f6e653e337ae14183fb50705ee1785e8718d8e1a88044567da4a83f105fd590cd100197ea0db22e1a3915ab447e98d77f712106b1829f9c1583d7ceb07" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "validity-07-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "30943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c7923732453cc0c678c42538ebcc8469d9652366f23194391beecaf2efd9b0754cd3fc3830e8ee40edddc78a367edc0e949517012933dfccdc69fe42b54bfa13eadc91f63e22c5b8d4503c4cf829a03fc13fdc4114e9717ad469e6a6da3574a9bac2ac8805521cb769194db9582c61306d2290884b05d304ed16033f563ff6a03b2278223caa4215cd9fb2892c3c3952a8f2e7612303f50fe03dd4d67ec8f3a6c1086818367a2cc4f5c776738ba49b05673fda19e057da582aca0a2d3a7969a131db0cc3437affc1e6bc78ccd39a38c54a2ad854f3ba049d0bd95e5a0f3b518cd284f4f51658fd5354edbab82b9698623024b2b03387475d891b6975c686aca77c304b1b668e06e3813255b60b17df01ad84bd29da60a2920ce12ac998c3d5cb044dae8b3682f287f6e653e337ae14183fb50705ee1785e8718d8e1a88044567da4a83f105fd590cd100197ea0db22e1a3915ab447e98d77f712106b1829f9c1583d7c" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "validity-07-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + } + ] + }, + { + "id": "transfer-range-07", + "family": "transfer_range", + "expected_valid": true, + "payload": { + "proof_data_hex": "aa44352b1f2c49b05d2b8a6fdb64a5a06b65be84158bf1239c7495402cc1f85e3cc0c678c42538ebcc8469d9652366f23194391beecaf2efd9b0754cd3fc38300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a41f8292d36d87a2277bc4f61259398cb21bac85e8146580881de53780b48578c43746b27fe88f4aed9aab63c2b7c4281f0dc29bbcc13bc52e5b5b8f703ac86820242d57dc57804fc32c68d48761aee764ad72f06aa7c3bbc2e9d2235c69185920ba2c7e0b7b158933b0ccd370852d4db36c8fb26cfa1f38cd66004e90eb845baeb429f2b07a0e14b3e94f94df105d6ba39099fd46420f6337e9ba7873196a035d989d993a120377207e854b149396a6cd577c5e541d6e10b6517a89d958bc07e43c1792d82f260c2d56b0fba42891279a7efacc06bf8669c36cb7f195db9100988bb6e6ecaae2c18d52a8f20a46d996506ed27ba9e3e9715807f16928b6f3556248acc42e8e6084287e6e39e66ff4559aac100e7a381b89342c54a3f05bda575e258de0cb67a754693551a0b3b9282052bde3f7c1c7766531b4ce3be3799f05ac3a0e77fe9679ffbdb8939bdf157d9382da972ad44e9078b4860647d89d3a3646d9685f6f39508b3faeaad0981f2d435b025c212e9c58cbbfe79228c356760606aa7a068f13fcb95f77e1aa135bc04c043dfb6b00a8bf5f5a6e3aa22369a1561050c8383808a2b966e1efc04c2bb8a2c92a5d8d0cdad425c263a599ab43f17d30c274ec2d626c539241997c48f60aeb8b3717e221feeb12b18196f0723a5126860c30f2f4909fdb2982b9ffcc4a77097446457482fc795bd176f89fcee8d52fd8e700124d5bbb2ad29e87f7ae0e2687ac5e90625977ca43dd66211f4f29bd390a034d80bacaa64b8c37187b634275b8287ebd950bbdb1a4f3ab695e61d08e77347354dcdd24517da5b6b384978c9a6908cdfe9abec4e126023786381c43e97c86a642a6141b206112a249340f068893cef5ee44d310002666c1f5b2810cab6a0ef01221523b4064ded0bb3a71c28260da7f9efa1d8674c333e2bdb49aeb9232acbabb69c02c3432505b0da25c4d146ecc7c8789f942849bef71641f9b586e095521b4b4bb9bb2debb2afcbc2b8b245a61711915555d659956601112a8f6c10f" + }, + "mutations": [ + { + "id": "transfer-range-07-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "ab44352b1f2c49b05d2b8a6fdb64a5a06b65be84158bf1239c7495402cc1f85e3cc0c678c42538ebcc8469d9652366f23194391beecaf2efd9b0754cd3fc38300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a41f8292d36d87a2277bc4f61259398cb21bac85e8146580881de53780b48578c43746b27fe88f4aed9aab63c2b7c4281f0dc29bbcc13bc52e5b5b8f703ac86820242d57dc57804fc32c68d48761aee764ad72f06aa7c3bbc2e9d2235c69185920ba2c7e0b7b158933b0ccd370852d4db36c8fb26cfa1f38cd66004e90eb845baeb429f2b07a0e14b3e94f94df105d6ba39099fd46420f6337e9ba7873196a035d989d993a120377207e854b149396a6cd577c5e541d6e10b6517a89d958bc07e43c1792d82f260c2d56b0fba42891279a7efacc06bf8669c36cb7f195db9100988bb6e6ecaae2c18d52a8f20a46d996506ed27ba9e3e9715807f16928b6f3556248acc42e8e6084287e6e39e66ff4559aac100e7a381b89342c54a3f05bda575e258de0cb67a754693551a0b3b9282052bde3f7c1c7766531b4ce3be3799f05ac3a0e77fe9679ffbdb8939bdf157d9382da972ad44e9078b4860647d89d3a3646d9685f6f39508b3faeaad0981f2d435b025c212e9c58cbbfe79228c356760606aa7a068f13fcb95f77e1aa135bc04c043dfb6b00a8bf5f5a6e3aa22369a1561050c8383808a2b966e1efc04c2bb8a2c92a5d8d0cdad425c263a599ab43f17d30c274ec2d626c539241997c48f60aeb8b3717e221feeb12b18196f0723a5126860c30f2f4909fdb2982b9ffcc4a77097446457482fc795bd176f89fcee8d52fd8e700124d5bbb2ad29e87f7ae0e2687ac5e90625977ca43dd66211f4f29bd390a034d80bacaa64b8c37187b634275b8287ebd950bbdb1a4f3ab695e61d08e77347354dcdd24517da5b6b384978c9a6908cdfe9abec4e126023786381c43e97c86a642a6141b206112a249340f068893cef5ee44d310002666c1f5b2810cab6a0ef01221523b4064ded0bb3a71c28260da7f9efa1d8674c333e2bdb49aeb9232acbabb69c02c3432505b0da25c4d146ecc7c8789f942849bef71641f9b586e095521b4b4bb9bb2debb2afcbc2b8b245a61711915555d659956601112a8f6c10f" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "transfer-range-07-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "aa44352b1f2c49b05d2b8a6fdb64a5a06b65be84158bf1239c7495402cc1f85e3cc0c678c42538ebcc8469d9652366f23194391beecaf2efd9b0754cd3fc38300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a41f8292d36d87a2277bc4f61259398cb21bac85e8146580881de53780b48578c43746b27fe88f4aed9aab63c2b7c4281f0dc29bbcc13bc52e5b5b8f703ac86820242d57dc57804fc32c68d48761aee764ad72f06aa7c3bbc2e9d2235c69185920ba2c7e0b7b158933b0ccd370852d4db36c8fb26cfa1f38cd66004e90eb845baeb429f2b07a0e14b3e94f94df105d6ba39099fd46420f6337e9ba7873196a035d989d993a120377207e854b149396a6cd577c5e541d6e10b6517a89d958bc07e43c1792d82f260c2d56b0fba42891279a7efacc06bf8669c36cb7f195db9100988bb6e6ecaae2c18d52a8f20a46d996506ed27ba9e3e9715807f16928b6f3556248acc42e8e6084287e6e39e66ff4559aac100e7a381b89342c54a3f05bda575e258de0cb67a754693551a0b3b9282052bde3f7c1c7766531b4ce3be3799f05ac3a0e77fe9679ffbdb8939bdf157d9382da972ad44e9078b4860647d89d3a3646d9685f6f39508b3faeaad0981f2d435b025c212e9c58cbbfe79228c356760606aa7a068f13fcb95f77e1aa135bc04c043dfb6b00a8bf5f5a6e3aa22369a1561050c8383808a2b966e1efc04c2bb8a2c92a5d8d0cdad425c263a599ab43f17d30c274ec2d626c539241997c48f60aeb8b3717e221feeb12b18196f0723a5126860c30f2f4909fdb2982b9ffcc4a77097446457482fc795bd176f89fcee8d52fd8e700124d5bbb2ad29e87f7ae0e2687ac5e90625977ca43dd66211f4f29bd390a034d80bacaa64b8c37187b634275b8287ebd950bbdb1a4f3ab695e61d08e77347354dcdd24517da5b6b384978c9a6908cdfe9abec4e126023786381c43e97c86a642a6141b206112a249340f068893cef5ee44d310002666c1f5b2810cab6a0ef01221523b4064ded0bb3a71c28260da7f9efa1d8674c333e2bdb49aeb9232acbabb69c02c3432505b0da25c4d146ecc7c8789f942849bef71641f9b586e095521b4b4bb9bb2debb2afcbc2b8b245a61711915555d659956601112a8f6" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "transfer-range-07-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + }, + { + "id": "transfer-range-07-bfN", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "aa44352b1f2c49b05d2b8a6fdb64a5a06b65be84158bf1239c7495402cc1f85e3cc0c678c42538ebcc8469d9652366f23194391beecaf2efd9b0754cd3fc38300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a41f8292d36d87a2277bc4f61259398cb21bac85e8146580881de53780b48578c43746b27fe88f4aed9aab63c2b7c4281f0dc29bbcc13bc52e5b5b8f703ac86820242d57dc57804fc32c68d48761aee764ad72f06aa7c3bbc2e9d2235c69185920ba2c7e0b7b158933b0ccd370852d4db36c8fb26cfa1f38cd66004e90eb845baeb429f2b07a0e14b3e94f94df105d6ba39099fd46420f6337e9ba7873196a035d989d993a120377207e854b149396a6cd577c5e541d6e10b6517a89d958bc07e43c1792d82f260c2d56b0fba42891279a7efacc06bf8669c36cb7f195db9100988bb6e6ecaae2c18d52a8f20a46d996506ed27ba9e3e9715807f16928b6f3556248acc42e8e6084287e6e39e66ff4559aac100e7a381b89342c54a3f05bda575e258de0cb67a754693551a0b3b9282052bde3f7c1c7766531b4ce3be3799f05ac3a0e77fe9679ffbdb8939bdf157d9382da972ad44e9078b4860647d89d3a3646d9685f6f39508b3faeaad0981f2d435b025c212e9c58cbbfe79228c356760606aa7a068f13fcb95f77e1aa135bc04c043dfb6b00a8bf5f5a6e3aa22369a1561050c8383808a2b966e1efc04c2bb8a2c92a5d8d0cdad425c263a599ab43f17d30c274ec2d626c539241997c48f60aeb8b3717e221feeb12b18196f0723a5126860c30f2f4909fdb2982b9ffcc4a77097446457482fc795bd176f89fcee8d52fd8e700124d5bbb2ad29e87f7ae0e2687ac5e90625977ca43dd66211f4f29bd390a034d80bacaa64b8c37187b634275b8287ebd950bbdb1a4f3ab695e61d08e77347354dcdd24517da5b6b384978c9a6908cdfe9abec4e126023786381c43e97c86a642a6141b206112a249340f068893cef5ee44d310002666c1f5b2810cab6a0ef01221523b4064ded0bb3a71c28260da7f9efa1d8674c333e2bdb49aeb9232acbabb69c02c3432505b0da25c4d146ecc7c8789f942849bef71641f9b586e095521b4b4bb9bb2debb2afcbc2b8b245a61711915555d659956601112a8f6c10e" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + } + ] + }, + { + "id": "transfer-composite-07", + "family": "transfer_composite", + "expected_valid": true, + "payload": { + "equality_proof_data_hex": "30943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214fe3004511f24f433de3a26c21d25d6d94a931413446c0cb2018693a596e3cb5cf62e972df91f67b5bb073379c53069b920f9639c5100beea10bb5ba2ad6dc802aa44352b1f2c49b05d2b8a6fdb64a5a06b65be84158bf1239c7495402cc1f85e8e0126022917a2a891c4a6d79f2e2324ebc99cd3980483be69f8398dc41ef61fb41eb31a4feb59da07b5b1d3ac36e581eb852051820f4e5f49701c00e24e932eeaef60ed9444f90037f02f3aee1135211d048eee6f50d1ef8973fd623d526974ffb6eae106d66ef21d568dc20b750be0faa67a7ee8e1c3c918a3528193908c02300a32a25c8e543cee514990396f86e2ce553eaabfd68c70de3415e9675810056c4ff7bfef161f887b7951e7107053d5f5376d769afbe8e47578443e3061a708", + "range_proof_data_hex": "aa44352b1f2c49b05d2b8a6fdb64a5a06b65be84158bf1239c7495402cc1f85e3cc0c678c42538ebcc8469d9652366f23194391beecaf2efd9b0754cd3fc38300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a41f8292d36d87a2277bc4f61259398cb21bac85e8146580881de53780b48578c43746b27fe88f4aed9aab63c2b7c4281f0dc29bbcc13bc52e5b5b8f703ac86820242d57dc57804fc32c68d48761aee764ad72f06aa7c3bbc2e9d2235c69185920ba2c7e0b7b158933b0ccd370852d4db36c8fb26cfa1f38cd66004e90eb845baeb429f2b07a0e14b3e94f94df105d6ba39099fd46420f6337e9ba7873196a035d989d993a120377207e854b149396a6cd577c5e541d6e10b6517a89d958bc07e43c1792d82f260c2d56b0fba42891279a7efacc06bf8669c36cb7f195db9100988bb6e6ecaae2c18d52a8f20a46d996506ed27ba9e3e9715807f16928b6f3556248acc42e8e6084287e6e39e66ff4559aac100e7a381b89342c54a3f05bda575e258de0cb67a754693551a0b3b9282052bde3f7c1c7766531b4ce3be3799f05ac3a0e77fe9679ffbdb8939bdf157d9382da972ad44e9078b4860647d89d3a3646d9685f6f39508b3faeaad0981f2d435b025c212e9c58cbbfe79228c356760606aa7a068f13fcb95f77e1aa135bc04c043dfb6b00a8bf5f5a6e3aa22369a1561050c8383808a2b966e1efc04c2bb8a2c92a5d8d0cdad425c263a599ab43f17d30c274ec2d626c539241997c48f60aeb8b3717e221feeb12b18196f0723a5126860c30f2f4909fdb2982b9ffcc4a77097446457482fc795bd176f89fcee8d52fd8e700124d5bbb2ad29e87f7ae0e2687ac5e90625977ca43dd66211f4f29bd390a034d80bacaa64b8c37187b634275b8287ebd950bbdb1a4f3ab695e61d08e77347354dcdd24517da5b6b384978c9a6908cdfe9abec4e126023786381c43e97c86a642a6141b206112a249340f068893cef5ee44d310002666c1f5b2810cab6a0ef01221523b4064ded0bb3a71c28260da7f9efa1d8674c333e2bdb49aeb9232acbabb69c02c3432505b0da25c4d146ecc7c8789f942849bef71641f9b586e095521b4b4bb9bb2debb2afcbc2b8b245a61711915555d659956601112a8f6c10f", + "validity_proof_data_hex": "30943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c7923732453cc0c678c42538ebcc8469d9652366f23194391beecaf2efd9b0754cd3fc3830e8ee40edddc78a367edc0e949517012933dfccdc69fe42b54bfa13eadc91f63e22c5b8d4503c4cf829a03fc13fdc4114e9717ad469e6a6da3574a9bac2ac8805521cb769194db9582c61306d2290884b05d304ed16033f563ff6a03b2278223caa4215cd9fb2892c3c3952a8f2e7612303f50fe03dd4d67ec8f3a6c1086818367a2cc4f5c776738ba49b05673fda19e057da582aca0a2d3a7969a131db0cc3437affc1e6bc78ccd39a38c54a2ad854f3ba049d0bd95e5a0f3b518cd284f4f51658fd5354edbab82b9698623024b2b03387475d891b6975c686aca77c304b1b668e06e3813255b60b17df01ad84bd29da60a2920ce12ac998c3d5cb044dae8b3682f287f6e653e337ae14183fb50705ee1785e8718d8e1a88044567da4a83f105fd590cd100197ea0db22e1a3915ab447e98d77f712106b1829f9c1583d7ceb07" + }, + "binding": { + "current_balance_commitment_hex": "407d720005e25589c26f9b7acea6e3031c3b91698d1ca4badbb7127e40eef462", + "current_balance_handle_hex": "dcfdfd46264a9aa2b7495f342a4fba84d7343699a00099aa918232b0a8971f08", + "recipient_pubkey_hex": "aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245", + "sender_pubkey_hex": "30943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214" + }, + "mutations": [ + { + "id": "transfer-composite-07-swap-eq-val", + "op": "swap_fields", + "target": "payload.equality_proof_data_hex", + "params": { + "with": "payload.validity_proof_data_hex" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "transfer-composite-07-pk-s", + "op": "bitflip", + "target": "binding.sender_pubkey_hex", + "params": { + "value_hex": "31943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "transfer-composite-07-pk-r", + "op": "bitflip", + "target": "binding.recipient_pubkey_hex", + "params": { + "value_hex": "afec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "transfer-composite-07-bal-c1", + "op": "replace_field", + "target": "binding.current_balance_commitment_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "remaining balance commitment mismatch" + }, + { + "id": "transfer-composite-07-rng-trunc", + "op": "truncate", + "target": "payload.range_proof_data_hex", + "params": { + "value_hex": "aa44352b1f2c49b05d2b8a6fdb64a5a06b65be84158bf1239c7495402cc1f85e3cc0c678c42538ebcc8469d9652366f23194391beecaf2efd9b0754cd3fc38300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a41f8292d36d87a2277bc4f61259398cb21bac85e8146580881de53780b48578c43746b27fe88f4aed9aab63c2b7c4281f0dc29bbcc13bc52e5b5b8f703ac86820242d57dc57804fc32c68d48761aee764ad72f06aa7c3bbc2e9d2235c69185920ba2c7e0b7b158933b0ccd370852d4db36c8fb26cfa1f38cd66004e90eb845baeb429f2b07a0e14b3e94f94df105d6ba39099fd46420f6337e9ba7873196a035d989d993a120377207e854b149396a6cd577c5e541d6e10b6517a89d958bc07e43c1792d82f260c2d56b0fba42891279a7efacc06bf8669c36cb7f195db9100988bb6e6ecaae2c18d52a8f20a46d996506ed27ba9e3e9715807f16928b6f3556248acc42e8e6084287e6e39e66ff4559aac100e7a381b89342c54a3f05bda575e258de0cb67a754693551a0b3b9282052bde3f7c1c7766531b4ce3be3799f05ac3a0e77fe9679ffbdb8939bdf157d9382da972ad44e9078b4860647d89d3a3646d9685f6f39508b3faeaad0981f2d435b025c212e9c58cbbfe79228c356760606aa7a068f13fcb95f77e1aa135bc04c043dfb6b00a8bf5f5a6e3aa22369a1561050c8383808a2b966e1efc04c2bb8a2c92a5d8d0cdad425c263a599ab43f17d30c274ec2d626c539241997c48f60aeb8b3717e221feeb12b18196f0723a5126860c30f2f4909fdb2982b9ffcc4a77097446457482fc795bd176f89fcee8d52fd8e700124d5bbb2ad29e87f7ae0e2687ac5e90625977ca43dd66211f4f29bd390a034d80bacaa64b8c37187b634275b8287ebd950bbdb1a4f3ab695e61d08e77347354dcdd24517da5b6b384978c9a6908cdfe9abec4e126023786381c43e97c86a642a6141b206112a249340f068893cef5ee44d310002666c1f5b2810cab6a0ef01221523b4064ded0bb3a71c28260da7f9efa1d8674c333e2bdb49aeb9232acbabb69c02c3432505b0da25c4d146ecc7c8789f942849bef71641f9b586e095521b4b4bb9bb2debb2afcbc2b8b245a61711915555d659956601112a8f6" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + } + ] + }, + { + "id": "equality-08", + "family": "equality", + "expected_valid": true, + "payload": { + "proof_data_hex": "aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c7923732452e8dbee520fb7ab016d76cda607fb07b97da8e606b48cc556ce077261da8611db4caad8414e9d231ce0a662ebaf94c5cfb5d0f8bbe1aa1c822941786e9ff265a9c4dac62b85ac8b0ee5c9678be078d0629fc257af7a0cf3d466f244b5a0cf6593a41a10d4cd78315a494a3915aad5efbcd3c4b76cdbb541b5bc94e9913282a4a9c5fffaccadec6a23e9f216f1ad43d0d06fc152cc73e3e25175e319a1349d21eee7be163fb992fdf083c584d8145d74715fb3cea2105934c4fa173de27dd8938511c94c5e5bd1a3935234aa864a7539918ca27d7367c359753ecc71951ef2509057b58c8003566cbfd0382c4e51ef617eca18d3d78d83d9c70078378f41374088288dbfe9373bfedb71270006d2f49c626e4c14fe37a4e334b146b546a4a2b00" + }, + "mutations": [ + { + "id": "equality-08-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "afec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c7923732452e8dbee520fb7ab016d76cda607fb07b97da8e606b48cc556ce077261da8611db4caad8414e9d231ce0a662ebaf94c5cfb5d0f8bbe1aa1c822941786e9ff265a9c4dac62b85ac8b0ee5c9678be078d0629fc257af7a0cf3d466f244b5a0cf6593a41a10d4cd78315a494a3915aad5efbcd3c4b76cdbb541b5bc94e9913282a4a9c5fffaccadec6a23e9f216f1ad43d0d06fc152cc73e3e25175e319a1349d21eee7be163fb992fdf083c584d8145d74715fb3cea2105934c4fa173de27dd8938511c94c5e5bd1a3935234aa864a7539918ca27d7367c359753ecc71951ef2509057b58c8003566cbfd0382c4e51ef617eca18d3d78d83d9c70078378f41374088288dbfe9373bfedb71270006d2f49c626e4c14fe37a4e334b146b546a4a2b00" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "equality-08-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c7923732452e8dbee520fb7ab016d76cda607fb07b97da8e606b48cc556ce077261da8611db4caad8414e9d231ce0a662ebaf94c5cfb5d0f8bbe1aa1c822941786e9ff265a9c4dac62b85ac8b0ee5c9678be078d0629fc257af7a0cf3d466f244b5a0cf6593a41a10d4cd78315a494a3915aad5efbcd3c4b76cdbb541b5bc94e9913282a4a9c5fffaccadec6a23e9f216f1ad43d0d06fc152cc73e3e25175e319a1349d21eee7be163fb992fdf083c584d8145d74715fb3cea2105934c4fa173de27dd8938511c94c5e5bd1a3935234aa864a7539918ca27d7367c359753ecc71951ef2509057b58c8003566cbfd0382c4e51ef617eca18d3d78d83d9c70078378f41374088288dbfe9373bfedb71270006d2f49c626e4c14fe37a4e334b146b546a4a" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "equality-08-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + } + ] + }, + { + "id": "validity-08", + "family": "validity", + "expected_valid": true, + "payload": { + "proof_data_hex": "aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268e4027c0694a6d1c9413fbf3f8d187dec4a85e0ebb06c0f5cc1d7d47373181c563c3f97bc645bbc4851bdd30419ef5d7e37eea5ea40c36d2cfc9240aa882183169c9228fa2ff9e40f933616c5d8190f67b973bc146c7df88950676ad6d62b972eaabc0426c4744f1bb26bcfe8d03ebb61fca61d553d0bb16fe3168d42190d401b0a1b416e280c45ba27a81a1f420a6120c99588f9455a5ee6cd04d4f255aad06940bdf72ab5e85f38890fa62ac37f7890911ac664dacc6627f7380b0ed376ed02d0e26a24a061d95cc5e2189ff4b1d1f73f80cccedac725dd6d38172c8ff9ce3d8673fbab741857723955f66ea8766f7923f94334ee5f94da2e3f08182ac26b55d2ca9ac7d51508b1b8a61cd3d71024411b98075c7ec9612cd6244234cd0ebd75e4dd6ae08dfee943dc1ddc999bedf9962a471fa95560fb025285c360fca9610666b40924e10b1dd138a0b0525ec36213a4d1bcaac9e6c8c5745db3542f378d0e" + }, + "mutations": [ + { + "id": "validity-08-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "afec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268e4027c0694a6d1c9413fbf3f8d187dec4a85e0ebb06c0f5cc1d7d47373181c563c3f97bc645bbc4851bdd30419ef5d7e37eea5ea40c36d2cfc9240aa882183169c9228fa2ff9e40f933616c5d8190f67b973bc146c7df88950676ad6d62b972eaabc0426c4744f1bb26bcfe8d03ebb61fca61d553d0bb16fe3168d42190d401b0a1b416e280c45ba27a81a1f420a6120c99588f9455a5ee6cd04d4f255aad06940bdf72ab5e85f38890fa62ac37f7890911ac664dacc6627f7380b0ed376ed02d0e26a24a061d95cc5e2189ff4b1d1f73f80cccedac725dd6d38172c8ff9ce3d8673fbab741857723955f66ea8766f7923f94334ee5f94da2e3f08182ac26b55d2ca9ac7d51508b1b8a61cd3d71024411b98075c7ec9612cd6244234cd0ebd75e4dd6ae08dfee943dc1ddc999bedf9962a471fa95560fb025285c360fca9610666b40924e10b1dd138a0b0525ec36213a4d1bcaac9e6c8c5745db3542f378d0e" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "validity-08-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268e4027c0694a6d1c9413fbf3f8d187dec4a85e0ebb06c0f5cc1d7d47373181c563c3f97bc645bbc4851bdd30419ef5d7e37eea5ea40c36d2cfc9240aa882183169c9228fa2ff9e40f933616c5d8190f67b973bc146c7df88950676ad6d62b972eaabc0426c4744f1bb26bcfe8d03ebb61fca61d553d0bb16fe3168d42190d401b0a1b416e280c45ba27a81a1f420a6120c99588f9455a5ee6cd04d4f255aad06940bdf72ab5e85f38890fa62ac37f7890911ac664dacc6627f7380b0ed376ed02d0e26a24a061d95cc5e2189ff4b1d1f73f80cccedac725dd6d38172c8ff9ce3d8673fbab741857723955f66ea8766f7923f94334ee5f94da2e3f08182ac26b55d2ca9ac7d51508b1b8a61cd3d71024411b98075c7ec9612cd6244234cd0ebd75e4dd6ae08dfee943dc1ddc999bedf9962a471fa95560fb025285c360fca9610666b40924e10b1dd138a0b0525ec36213a4d1bcaac9e6c8c5745db3542f37" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "validity-08-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + } + ] + }, + { + "id": "transfer-range-08", + "family": "transfer_range", + "expected_valid": true, + "payload": { + "proof_data_hex": "9c4dac62b85ac8b0ee5c9678be078d0629fc257af7a0cf3d466f244b5a0cf659e4027c0694a6d1c9413fbf3f8d187dec4a85e0ebb06c0f5cc1d7d47373181c5600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000002636ab98020d46b3c41991b8ed299c779494605b4ebf31d532727f8a96e7696856231d1219a3f7d05c36332a51089ce346cd282951f2b53baf570d5109445334c42774a3c0513e24527f7d7c288d784d613ae0cc437cd4d685b73910ceede8476682dc5a19a3bbbc2c875d8ed97eb9a67d6204fb7ef952b5db07020c3582a53237d07187471a4a9b20c31005a8d8d499e1e06d199b7b8f2cb8d88b13c4abfa06355aad25dd7a82337734cb624244163a84a78eba1ce4ff42faa75ea53e3ae10dfa1af68680cf521b19eaaac95ba8bd8f744e06df1c9c3f79b82dfed9d402730df6f5e6c1d0f4820e3356c5da0587fbdc9c725b4eaa44e0e0ed9f1ae9e7d4f574128a1828619041d2d37de4a8fe0bc4bd398c18d02a34973eb139eb31eee38543029b01567a4eebbe293faf27723e570fed67f3ffb534d51280c401f951d67d55868a4cdb242d863c2e7b57eac83f84f29e669e0c4e618e6304a894e62d46097362d9caa2ca183f815dec8eac54033c810263f562dea69f8d9014bfbdbe8ec0063e99bc501684dfd1607ff39586127992dfa3aebc7de509d31e928c9afe9d195bce060fdd363edf0c8d8ede136c0f10d310bf7048de536c6ffc225f3d17281155f2466ef277ea28cc564d723b72e3e9dd26683ae6d9367a6f7796031c1f84240e501bcf3aa6775055141c46875c84d41cbb06162ba9d26b05e985cb2ebfd7ec27a2f018f3dfa34ffabf8d86356587b178c71c13a8e211809abacd5f0bb25b145fa4b8fdc72b93351ff3cf6fad7f9b2b3056bb1741098174e892b51f85fb8cf32d00ebf1b7b5cff1a5b9024be4cca3fe8323f0218e225f1fff8d922d0202b7ec63ce6eb3eb91d8266e3bb92bf073631aa1ae07f2229953bc86f768bf2da813f1603c42f257f821f5716cd0c655d52c08a7cae67ea8c180e0b8a26faeeaae2fb942e807f9fdeabf97dfe6ad9972446961dc18b98d357f5e5572db4ed528b5abe0047cd3c722cf7ed7f050da485350666e3b3aef4a559e0a285bd33adf8924062b0d" + }, + "mutations": [ + { + "id": "transfer-range-08-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "9d4dac62b85ac8b0ee5c9678be078d0629fc257af7a0cf3d466f244b5a0cf659e4027c0694a6d1c9413fbf3f8d187dec4a85e0ebb06c0f5cc1d7d47373181c5600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000002636ab98020d46b3c41991b8ed299c779494605b4ebf31d532727f8a96e7696856231d1219a3f7d05c36332a51089ce346cd282951f2b53baf570d5109445334c42774a3c0513e24527f7d7c288d784d613ae0cc437cd4d685b73910ceede8476682dc5a19a3bbbc2c875d8ed97eb9a67d6204fb7ef952b5db07020c3582a53237d07187471a4a9b20c31005a8d8d499e1e06d199b7b8f2cb8d88b13c4abfa06355aad25dd7a82337734cb624244163a84a78eba1ce4ff42faa75ea53e3ae10dfa1af68680cf521b19eaaac95ba8bd8f744e06df1c9c3f79b82dfed9d402730df6f5e6c1d0f4820e3356c5da0587fbdc9c725b4eaa44e0e0ed9f1ae9e7d4f574128a1828619041d2d37de4a8fe0bc4bd398c18d02a34973eb139eb31eee38543029b01567a4eebbe293faf27723e570fed67f3ffb534d51280c401f951d67d55868a4cdb242d863c2e7b57eac83f84f29e669e0c4e618e6304a894e62d46097362d9caa2ca183f815dec8eac54033c810263f562dea69f8d9014bfbdbe8ec0063e99bc501684dfd1607ff39586127992dfa3aebc7de509d31e928c9afe9d195bce060fdd363edf0c8d8ede136c0f10d310bf7048de536c6ffc225f3d17281155f2466ef277ea28cc564d723b72e3e9dd26683ae6d9367a6f7796031c1f84240e501bcf3aa6775055141c46875c84d41cbb06162ba9d26b05e985cb2ebfd7ec27a2f018f3dfa34ffabf8d86356587b178c71c13a8e211809abacd5f0bb25b145fa4b8fdc72b93351ff3cf6fad7f9b2b3056bb1741098174e892b51f85fb8cf32d00ebf1b7b5cff1a5b9024be4cca3fe8323f0218e225f1fff8d922d0202b7ec63ce6eb3eb91d8266e3bb92bf073631aa1ae07f2229953bc86f768bf2da813f1603c42f257f821f5716cd0c655d52c08a7cae67ea8c180e0b8a26faeeaae2fb942e807f9fdeabf97dfe6ad9972446961dc18b98d357f5e5572db4ed528b5abe0047cd3c722cf7ed7f050da485350666e3b3aef4a559e0a285bd33adf8924062b0d" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "transfer-range-08-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "9c4dac62b85ac8b0ee5c9678be078d0629fc257af7a0cf3d466f244b5a0cf659e4027c0694a6d1c9413fbf3f8d187dec4a85e0ebb06c0f5cc1d7d47373181c5600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000002636ab98020d46b3c41991b8ed299c779494605b4ebf31d532727f8a96e7696856231d1219a3f7d05c36332a51089ce346cd282951f2b53baf570d5109445334c42774a3c0513e24527f7d7c288d784d613ae0cc437cd4d685b73910ceede8476682dc5a19a3bbbc2c875d8ed97eb9a67d6204fb7ef952b5db07020c3582a53237d07187471a4a9b20c31005a8d8d499e1e06d199b7b8f2cb8d88b13c4abfa06355aad25dd7a82337734cb624244163a84a78eba1ce4ff42faa75ea53e3ae10dfa1af68680cf521b19eaaac95ba8bd8f744e06df1c9c3f79b82dfed9d402730df6f5e6c1d0f4820e3356c5da0587fbdc9c725b4eaa44e0e0ed9f1ae9e7d4f574128a1828619041d2d37de4a8fe0bc4bd398c18d02a34973eb139eb31eee38543029b01567a4eebbe293faf27723e570fed67f3ffb534d51280c401f951d67d55868a4cdb242d863c2e7b57eac83f84f29e669e0c4e618e6304a894e62d46097362d9caa2ca183f815dec8eac54033c810263f562dea69f8d9014bfbdbe8ec0063e99bc501684dfd1607ff39586127992dfa3aebc7de509d31e928c9afe9d195bce060fdd363edf0c8d8ede136c0f10d310bf7048de536c6ffc225f3d17281155f2466ef277ea28cc564d723b72e3e9dd26683ae6d9367a6f7796031c1f84240e501bcf3aa6775055141c46875c84d41cbb06162ba9d26b05e985cb2ebfd7ec27a2f018f3dfa34ffabf8d86356587b178c71c13a8e211809abacd5f0bb25b145fa4b8fdc72b93351ff3cf6fad7f9b2b3056bb1741098174e892b51f85fb8cf32d00ebf1b7b5cff1a5b9024be4cca3fe8323f0218e225f1fff8d922d0202b7ec63ce6eb3eb91d8266e3bb92bf073631aa1ae07f2229953bc86f768bf2da813f1603c42f257f821f5716cd0c655d52c08a7cae67ea8c180e0b8a26faeeaae2fb942e807f9fdeabf97dfe6ad9972446961dc18b98d357f5e5572db4ed528b5abe0047cd3c722cf7ed7f050da485350666e3b3aef4a559e0a285bd33adf892406" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "transfer-range-08-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + }, + { + "id": "transfer-range-08-bfN", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "9c4dac62b85ac8b0ee5c9678be078d0629fc257af7a0cf3d466f244b5a0cf659e4027c0694a6d1c9413fbf3f8d187dec4a85e0ebb06c0f5cc1d7d47373181c5600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000002636ab98020d46b3c41991b8ed299c779494605b4ebf31d532727f8a96e7696856231d1219a3f7d05c36332a51089ce346cd282951f2b53baf570d5109445334c42774a3c0513e24527f7d7c288d784d613ae0cc437cd4d685b73910ceede8476682dc5a19a3bbbc2c875d8ed97eb9a67d6204fb7ef952b5db07020c3582a53237d07187471a4a9b20c31005a8d8d499e1e06d199b7b8f2cb8d88b13c4abfa06355aad25dd7a82337734cb624244163a84a78eba1ce4ff42faa75ea53e3ae10dfa1af68680cf521b19eaaac95ba8bd8f744e06df1c9c3f79b82dfed9d402730df6f5e6c1d0f4820e3356c5da0587fbdc9c725b4eaa44e0e0ed9f1ae9e7d4f574128a1828619041d2d37de4a8fe0bc4bd398c18d02a34973eb139eb31eee38543029b01567a4eebbe293faf27723e570fed67f3ffb534d51280c401f951d67d55868a4cdb242d863c2e7b57eac83f84f29e669e0c4e618e6304a894e62d46097362d9caa2ca183f815dec8eac54033c810263f562dea69f8d9014bfbdbe8ec0063e99bc501684dfd1607ff39586127992dfa3aebc7de509d31e928c9afe9d195bce060fdd363edf0c8d8ede136c0f10d310bf7048de536c6ffc225f3d17281155f2466ef277ea28cc564d723b72e3e9dd26683ae6d9367a6f7796031c1f84240e501bcf3aa6775055141c46875c84d41cbb06162ba9d26b05e985cb2ebfd7ec27a2f018f3dfa34ffabf8d86356587b178c71c13a8e211809abacd5f0bb25b145fa4b8fdc72b93351ff3cf6fad7f9b2b3056bb1741098174e892b51f85fb8cf32d00ebf1b7b5cff1a5b9024be4cca3fe8323f0218e225f1fff8d922d0202b7ec63ce6eb3eb91d8266e3bb92bf073631aa1ae07f2229953bc86f768bf2da813f1603c42f257f821f5716cd0c655d52c08a7cae67ea8c180e0b8a26faeeaae2fb942e807f9fdeabf97dfe6ad9972446961dc18b98d357f5e5572db4ed528b5abe0047cd3c722cf7ed7f050da485350666e3b3aef4a559e0a285bd33adf8924062b0c" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + } + ] + }, + { + "id": "transfer-composite-08", + "family": "transfer_composite", + "expected_valid": true, + "payload": { + "equality_proof_data_hex": "aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c7923732452e8dbee520fb7ab016d76cda607fb07b97da8e606b48cc556ce077261da8611db4caad8414e9d231ce0a662ebaf94c5cfb5d0f8bbe1aa1c822941786e9ff265a9c4dac62b85ac8b0ee5c9678be078d0629fc257af7a0cf3d466f244b5a0cf6593a41a10d4cd78315a494a3915aad5efbcd3c4b76cdbb541b5bc94e9913282a4a9c5fffaccadec6a23e9f216f1ad43d0d06fc152cc73e3e25175e319a1349d21eee7be163fb992fdf083c584d8145d74715fb3cea2105934c4fa173de27dd8938511c94c5e5bd1a3935234aa864a7539918ca27d7367c359753ecc71951ef2509057b58c8003566cbfd0382c4e51ef617eca18d3d78d83d9c70078378f41374088288dbfe9373bfedb71270006d2f49c626e4c14fe37a4e334b146b546a4a2b00", + "range_proof_data_hex": "9c4dac62b85ac8b0ee5c9678be078d0629fc257af7a0cf3d466f244b5a0cf659e4027c0694a6d1c9413fbf3f8d187dec4a85e0ebb06c0f5cc1d7d47373181c5600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000002636ab98020d46b3c41991b8ed299c779494605b4ebf31d532727f8a96e7696856231d1219a3f7d05c36332a51089ce346cd282951f2b53baf570d5109445334c42774a3c0513e24527f7d7c288d784d613ae0cc437cd4d685b73910ceede8476682dc5a19a3bbbc2c875d8ed97eb9a67d6204fb7ef952b5db07020c3582a53237d07187471a4a9b20c31005a8d8d499e1e06d199b7b8f2cb8d88b13c4abfa06355aad25dd7a82337734cb624244163a84a78eba1ce4ff42faa75ea53e3ae10dfa1af68680cf521b19eaaac95ba8bd8f744e06df1c9c3f79b82dfed9d402730df6f5e6c1d0f4820e3356c5da0587fbdc9c725b4eaa44e0e0ed9f1ae9e7d4f574128a1828619041d2d37de4a8fe0bc4bd398c18d02a34973eb139eb31eee38543029b01567a4eebbe293faf27723e570fed67f3ffb534d51280c401f951d67d55868a4cdb242d863c2e7b57eac83f84f29e669e0c4e618e6304a894e62d46097362d9caa2ca183f815dec8eac54033c810263f562dea69f8d9014bfbdbe8ec0063e99bc501684dfd1607ff39586127992dfa3aebc7de509d31e928c9afe9d195bce060fdd363edf0c8d8ede136c0f10d310bf7048de536c6ffc225f3d17281155f2466ef277ea28cc564d723b72e3e9dd26683ae6d9367a6f7796031c1f84240e501bcf3aa6775055141c46875c84d41cbb06162ba9d26b05e985cb2ebfd7ec27a2f018f3dfa34ffabf8d86356587b178c71c13a8e211809abacd5f0bb25b145fa4b8fdc72b93351ff3cf6fad7f9b2b3056bb1741098174e892b51f85fb8cf32d00ebf1b7b5cff1a5b9024be4cca3fe8323f0218e225f1fff8d922d0202b7ec63ce6eb3eb91d8266e3bb92bf073631aa1ae07f2229953bc86f768bf2da813f1603c42f257f821f5716cd0c655d52c08a7cae67ea8c180e0b8a26faeeaae2fb942e807f9fdeabf97dfe6ad9972446961dc18b98d357f5e5572db4ed528b5abe0047cd3c722cf7ed7f050da485350666e3b3aef4a559e0a285bd33adf8924062b0d", + "validity_proof_data_hex": "aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268e4027c0694a6d1c9413fbf3f8d187dec4a85e0ebb06c0f5cc1d7d47373181c563c3f97bc645bbc4851bdd30419ef5d7e37eea5ea40c36d2cfc9240aa882183169c9228fa2ff9e40f933616c5d8190f67b973bc146c7df88950676ad6d62b972eaabc0426c4744f1bb26bcfe8d03ebb61fca61d553d0bb16fe3168d42190d401b0a1b416e280c45ba27a81a1f420a6120c99588f9455a5ee6cd04d4f255aad06940bdf72ab5e85f38890fa62ac37f7890911ac664dacc6627f7380b0ed376ed02d0e26a24a061d95cc5e2189ff4b1d1f73f80cccedac725dd6d38172c8ff9ce3d8673fbab741857723955f66ea8766f7923f94334ee5f94da2e3f08182ac26b55d2ca9ac7d51508b1b8a61cd3d71024411b98075c7ec9612cd6244234cd0ebd75e4dd6ae08dfee943dc1ddc999bedf9962a471fa95560fb025285c360fca9610666b40924e10b1dd138a0b0525ec36213a4d1bcaac9e6c8c5745db3542f378d0e" + }, + "binding": { + "current_balance_commitment_hex": "940a324c1ff4615d4be14d88ac335ef719514d1a8c91c8c3c6a1f045c7dc0f74", + "current_balance_handle_hex": "820372a0afcb50f1dbdbb6d364662a3df7d13e348729b5ca687cbb616a68b454", + "recipient_pubkey_hex": "ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268", + "sender_pubkey_hex": "aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245" + }, + "mutations": [ + { + "id": "transfer-composite-08-swap-eq-val", + "op": "swap_fields", + "target": "payload.equality_proof_data_hex", + "params": { + "with": "payload.validity_proof_data_hex" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "transfer-composite-08-pk-s", + "op": "bitflip", + "target": "binding.sender_pubkey_hex", + "params": { + "value_hex": "afec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "transfer-composite-08-pk-r", + "op": "bitflip", + "target": "binding.recipient_pubkey_hex", + "params": { + "value_hex": "ebd02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "transfer-composite-08-bal-c1", + "op": "replace_field", + "target": "binding.current_balance_commitment_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "remaining balance commitment mismatch" + }, + { + "id": "transfer-composite-08-rng-trunc", + "op": "truncate", + "target": "payload.range_proof_data_hex", + "params": { + "value_hex": "9c4dac62b85ac8b0ee5c9678be078d0629fc257af7a0cf3d466f244b5a0cf659e4027c0694a6d1c9413fbf3f8d187dec4a85e0ebb06c0f5cc1d7d47373181c5600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000002636ab98020d46b3c41991b8ed299c779494605b4ebf31d532727f8a96e7696856231d1219a3f7d05c36332a51089ce346cd282951f2b53baf570d5109445334c42774a3c0513e24527f7d7c288d784d613ae0cc437cd4d685b73910ceede8476682dc5a19a3bbbc2c875d8ed97eb9a67d6204fb7ef952b5db07020c3582a53237d07187471a4a9b20c31005a8d8d499e1e06d199b7b8f2cb8d88b13c4abfa06355aad25dd7a82337734cb624244163a84a78eba1ce4ff42faa75ea53e3ae10dfa1af68680cf521b19eaaac95ba8bd8f744e06df1c9c3f79b82dfed9d402730df6f5e6c1d0f4820e3356c5da0587fbdc9c725b4eaa44e0e0ed9f1ae9e7d4f574128a1828619041d2d37de4a8fe0bc4bd398c18d02a34973eb139eb31eee38543029b01567a4eebbe293faf27723e570fed67f3ffb534d51280c401f951d67d55868a4cdb242d863c2e7b57eac83f84f29e669e0c4e618e6304a894e62d46097362d9caa2ca183f815dec8eac54033c810263f562dea69f8d9014bfbdbe8ec0063e99bc501684dfd1607ff39586127992dfa3aebc7de509d31e928c9afe9d195bce060fdd363edf0c8d8ede136c0f10d310bf7048de536c6ffc225f3d17281155f2466ef277ea28cc564d723b72e3e9dd26683ae6d9367a6f7796031c1f84240e501bcf3aa6775055141c46875c84d41cbb06162ba9d26b05e985cb2ebfd7ec27a2f018f3dfa34ffabf8d86356587b178c71c13a8e211809abacd5f0bb25b145fa4b8fdc72b93351ff3cf6fad7f9b2b3056bb1741098174e892b51f85fb8cf32d00ebf1b7b5cff1a5b9024be4cca3fe8323f0218e225f1fff8d922d0202b7ec63ce6eb3eb91d8266e3bb92bf073631aa1ae07f2229953bc86f768bf2da813f1603c42f257f821f5716cd0c655d52c08a7cae67ea8c180e0b8a26faeeaae2fb942e807f9fdeabf97dfe6ad9972446961dc18b98d357f5e5572db4ed528b5abe0047cd3c722cf7ed7f050da485350666e3b3aef4a559e0a285bd33adf892406" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + } + ] + }, + { + "id": "equality-09", + "family": "equality", + "expected_valid": true, + "payload": { + "proof_data_hex": "ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268de4c3d91066bdd05ab31d6a139d6b002005efc0d55a70c5393b9faf7381053212eafff6b28c62f72126419f08dd316bb428b1c00c8f7ab9650f089ac72f3ad32dcf2d46ae964b49ba3e3db3f8b6470e7f8353e09fc45f279b4935a8eabb30b3d006ad1b0d780388c8ea4a5eeb34818be5691939fc4ae0092463fe0676bfb0b1dd872ba0af3cb19ec24071a4f2f0c3f3dd98e4019156b4855156f4be14d1a735c546f929613a02d8980d27d8db1062cd737a915c59a6573eb1463da6a4d3ee745e34157f96332af5aff9c6a383c438c48fc9986ca37ede30fb33c378a670bcc0085b4f5144d663c5ffac0afba1d4c3e4eb13f8230682ac14f28869fb8dcc22e01673982910c30ca1e2a8bdf237560a877c12a6419d407ab9466e15fb5e179c70b" + }, + "mutations": [ + { + "id": "equality-09-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "ebd02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268de4c3d91066bdd05ab31d6a139d6b002005efc0d55a70c5393b9faf7381053212eafff6b28c62f72126419f08dd316bb428b1c00c8f7ab9650f089ac72f3ad32dcf2d46ae964b49ba3e3db3f8b6470e7f8353e09fc45f279b4935a8eabb30b3d006ad1b0d780388c8ea4a5eeb34818be5691939fc4ae0092463fe0676bfb0b1dd872ba0af3cb19ec24071a4f2f0c3f3dd98e4019156b4855156f4be14d1a735c546f929613a02d8980d27d8db1062cd737a915c59a6573eb1463da6a4d3ee745e34157f96332af5aff9c6a383c438c48fc9986ca37ede30fb33c378a670bcc0085b4f5144d663c5ffac0afba1d4c3e4eb13f8230682ac14f28869fb8dcc22e01673982910c30ca1e2a8bdf237560a877c12a6419d407ab9466e15fb5e179c70b" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "equality-09-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268de4c3d91066bdd05ab31d6a139d6b002005efc0d55a70c5393b9faf7381053212eafff6b28c62f72126419f08dd316bb428b1c00c8f7ab9650f089ac72f3ad32dcf2d46ae964b49ba3e3db3f8b6470e7f8353e09fc45f279b4935a8eabb30b3d006ad1b0d780388c8ea4a5eeb34818be5691939fc4ae0092463fe0676bfb0b1dd872ba0af3cb19ec24071a4f2f0c3f3dd98e4019156b4855156f4be14d1a735c546f929613a02d8980d27d8db1062cd737a915c59a6573eb1463da6a4d3ee745e34157f96332af5aff9c6a383c438c48fc9986ca37ede30fb33c378a670bcc0085b4f5144d663c5ffac0afba1d4c3e4eb13f8230682ac14f28869fb8dcc22e01673982910c30ca1e2a8bdf237560a877c12a6419d407ab9466e15fb5e179" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "equality-09-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + } + ] + }, + { + "id": "validity-09", + "family": "validity", + "expected_valid": true, + "payload": { + "proof_data_hex": "ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d2685e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b7471604546ee3084fb1cef0aa9798ddcef4694bac9091adf5eda3b0345df7d0dc68237cff9e617f3bb3ed7438f41157147fa42ee952b4969f4041a578264124b3ce1d340532dbd4c3adca7406f7802931bffec088921469404341b2f0be89420463a818b1b7c56ae0ad2f4a77c05b5c9cbf43be703f6b577b184e1ee5ccd5925983c8b9dbd222aaa8920b6ba22996d6c14aeab4f30a6005368e1ef6cc0ed3a718e2ba227b1c02b5d0a4b249bf21664d9e92e9a8a6222933a9ee629d2c0d6c110188332a15c29fcf21f666ff96566f21c43b6e3c9334709e666e1951515317801c4ab1c0d184bd22d70b5111993a9fa1e131978e5af49b65ffcc4b6bb0dd7c04f88704f81171cba1f4433f9a8c5024be7f0b272aa2af0552fa2dd726dcc1fbc101ffd760a403c13886c618b9ac8e3cdb73a6e1883038363634054dba8e7b0a30bf63844abacf3e2b80d8ea0cae99aa171b88f02d4be534886df9e1f62ca86f60e" + }, + "mutations": [ + { + "id": "validity-09-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "ebd02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d2685e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b7471604546ee3084fb1cef0aa9798ddcef4694bac9091adf5eda3b0345df7d0dc68237cff9e617f3bb3ed7438f41157147fa42ee952b4969f4041a578264124b3ce1d340532dbd4c3adca7406f7802931bffec088921469404341b2f0be89420463a818b1b7c56ae0ad2f4a77c05b5c9cbf43be703f6b577b184e1ee5ccd5925983c8b9dbd222aaa8920b6ba22996d6c14aeab4f30a6005368e1ef6cc0ed3a718e2ba227b1c02b5d0a4b249bf21664d9e92e9a8a6222933a9ee629d2c0d6c110188332a15c29fcf21f666ff96566f21c43b6e3c9334709e666e1951515317801c4ab1c0d184bd22d70b5111993a9fa1e131978e5af49b65ffcc4b6bb0dd7c04f88704f81171cba1f4433f9a8c5024be7f0b272aa2af0552fa2dd726dcc1fbc101ffd760a403c13886c618b9ac8e3cdb73a6e1883038363634054dba8e7b0a30bf63844abacf3e2b80d8ea0cae99aa171b88f02d4be534886df9e1f62ca86f60e" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "validity-09-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d2685e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b7471604546ee3084fb1cef0aa9798ddcef4694bac9091adf5eda3b0345df7d0dc68237cff9e617f3bb3ed7438f41157147fa42ee952b4969f4041a578264124b3ce1d340532dbd4c3adca7406f7802931bffec088921469404341b2f0be89420463a818b1b7c56ae0ad2f4a77c05b5c9cbf43be703f6b577b184e1ee5ccd5925983c8b9dbd222aaa8920b6ba22996d6c14aeab4f30a6005368e1ef6cc0ed3a718e2ba227b1c02b5d0a4b249bf21664d9e92e9a8a6222933a9ee629d2c0d6c110188332a15c29fcf21f666ff96566f21c43b6e3c9334709e666e1951515317801c4ab1c0d184bd22d70b5111993a9fa1e131978e5af49b65ffcc4b6bb0dd7c04f88704f81171cba1f4433f9a8c5024be7f0b272aa2af0552fa2dd726dcc1fbc101ffd760a403c13886c618b9ac8e3cdb73a6e1883038363634054dba8e7b0a30bf63844abacf3e2b80d8ea0cae99aa171b88f02d4be534886df9e1f62ca86" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "validity-09-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + } + ] + }, + { + "id": "transfer-range-09", + "family": "transfer_range", + "expected_valid": true, + "payload": { + "proof_data_hex": "dcf2d46ae964b49ba3e3db3f8b6470e7f8353e09fc45f279b4935a8eabb30b3d7471604546ee3084fb1cef0aa9798ddcef4694bac9091adf5eda3b0345df7d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000bce867cc3281fe0ede7d916e12905939edf93bd500f925a6d0f46e8c03c0de1288935a3c1760f8f36f1f1535aabeb04990616f3f850bd6c1d97756b3fcbcf961f4d8bf3901100187d2e05408fa5a579d657889ce2dd0be06ce18fe39170e3c3dc26d9a67892b5d49116c7906aa1de14bf6642fe7a078020f0cf3a5c6a186913e29803cf7a4a6c7439cf562ddbaaa65d4f61ba5d11a859f519371ce803c47f10dca269fc8e02d9f63b0d6753e0cfe9b49affdb261bd7fe1239b6fba7dbcdcdd07e6575da355f45bb5eab7668b579427128221c4ae3204b9a0c6f9cfc201f90f0baafaf7424f8423fa28102aa2d3ed06fe93e5d5b39cefdad9e9ceaa8418dc6f65e2cd38ab2c1884ce463d5f435c4f0654ded22509161af882f0dc83187e12dd0b22b5447d2b79cd349c56d1846ffecee4f0d94a91cc8ecbf96d858a4795bb201e46c60e9e4b68125a1eeb6908e16af3d08aa50b08942856e5557924534f7bd2639cdb14b907a7598403001ebfa8bb4c79d6e2465ddcfe0c210a5965cd25632670200a7e2206f9c849d0ce9b254bd9dcecbcc086db2fc099c5eb2ef41b02e92c694a7c8f2bfffb5c670ca475e88b5b8c657dfc9b63aa75f6c1b11b3b5a300ace66a0d90b3d70c6845f9e4b21f82f17e0dfab46f79f58e7ee6405175f910321be3046e1034b225b7c1be378204057d8335a6ebbd396116af8297aeadc460bcada72c84ed1ca22ccb7d84d99193ef323d289f777b274287ca5c033bb9b6e7f700467ba8bf3233c3013c5096cbf22ec14f55a1eb214c740f06f711b6786e08a7d931e8c219e8d21d8cf6204e0e6f233460fdddf4647b72a4375f374f8c40133d1002836c757723ec7f9aa3945e7173aa5adac5a6169c65698c59d276734315d9d7246e2ad1032b5a73d4f292041c45b27b1a52ae909a8ae89128c536288eb7289ef68188e411b133da664dbd545bb39180291ef5ffffa7633545335e021a76911270e827e0031c39f9a54d1ce5f84e350fe50d4be9352f63546ec62600c6c8e014b06" + }, + "mutations": [ + { + "id": "transfer-range-09-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "ddf2d46ae964b49ba3e3db3f8b6470e7f8353e09fc45f279b4935a8eabb30b3d7471604546ee3084fb1cef0aa9798ddcef4694bac9091adf5eda3b0345df7d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000bce867cc3281fe0ede7d916e12905939edf93bd500f925a6d0f46e8c03c0de1288935a3c1760f8f36f1f1535aabeb04990616f3f850bd6c1d97756b3fcbcf961f4d8bf3901100187d2e05408fa5a579d657889ce2dd0be06ce18fe39170e3c3dc26d9a67892b5d49116c7906aa1de14bf6642fe7a078020f0cf3a5c6a186913e29803cf7a4a6c7439cf562ddbaaa65d4f61ba5d11a859f519371ce803c47f10dca269fc8e02d9f63b0d6753e0cfe9b49affdb261bd7fe1239b6fba7dbcdcdd07e6575da355f45bb5eab7668b579427128221c4ae3204b9a0c6f9cfc201f90f0baafaf7424f8423fa28102aa2d3ed06fe93e5d5b39cefdad9e9ceaa8418dc6f65e2cd38ab2c1884ce463d5f435c4f0654ded22509161af882f0dc83187e12dd0b22b5447d2b79cd349c56d1846ffecee4f0d94a91cc8ecbf96d858a4795bb201e46c60e9e4b68125a1eeb6908e16af3d08aa50b08942856e5557924534f7bd2639cdb14b907a7598403001ebfa8bb4c79d6e2465ddcfe0c210a5965cd25632670200a7e2206f9c849d0ce9b254bd9dcecbcc086db2fc099c5eb2ef41b02e92c694a7c8f2bfffb5c670ca475e88b5b8c657dfc9b63aa75f6c1b11b3b5a300ace66a0d90b3d70c6845f9e4b21f82f17e0dfab46f79f58e7ee6405175f910321be3046e1034b225b7c1be378204057d8335a6ebbd396116af8297aeadc460bcada72c84ed1ca22ccb7d84d99193ef323d289f777b274287ca5c033bb9b6e7f700467ba8bf3233c3013c5096cbf22ec14f55a1eb214c740f06f711b6786e08a7d931e8c219e8d21d8cf6204e0e6f233460fdddf4647b72a4375f374f8c40133d1002836c757723ec7f9aa3945e7173aa5adac5a6169c65698c59d276734315d9d7246e2ad1032b5a73d4f292041c45b27b1a52ae909a8ae89128c536288eb7289ef68188e411b133da664dbd545bb39180291ef5ffffa7633545335e021a76911270e827e0031c39f9a54d1ce5f84e350fe50d4be9352f63546ec62600c6c8e014b06" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "transfer-range-09-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "dcf2d46ae964b49ba3e3db3f8b6470e7f8353e09fc45f279b4935a8eabb30b3d7471604546ee3084fb1cef0aa9798ddcef4694bac9091adf5eda3b0345df7d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000bce867cc3281fe0ede7d916e12905939edf93bd500f925a6d0f46e8c03c0de1288935a3c1760f8f36f1f1535aabeb04990616f3f850bd6c1d97756b3fcbcf961f4d8bf3901100187d2e05408fa5a579d657889ce2dd0be06ce18fe39170e3c3dc26d9a67892b5d49116c7906aa1de14bf6642fe7a078020f0cf3a5c6a186913e29803cf7a4a6c7439cf562ddbaaa65d4f61ba5d11a859f519371ce803c47f10dca269fc8e02d9f63b0d6753e0cfe9b49affdb261bd7fe1239b6fba7dbcdcdd07e6575da355f45bb5eab7668b579427128221c4ae3204b9a0c6f9cfc201f90f0baafaf7424f8423fa28102aa2d3ed06fe93e5d5b39cefdad9e9ceaa8418dc6f65e2cd38ab2c1884ce463d5f435c4f0654ded22509161af882f0dc83187e12dd0b22b5447d2b79cd349c56d1846ffecee4f0d94a91cc8ecbf96d858a4795bb201e46c60e9e4b68125a1eeb6908e16af3d08aa50b08942856e5557924534f7bd2639cdb14b907a7598403001ebfa8bb4c79d6e2465ddcfe0c210a5965cd25632670200a7e2206f9c849d0ce9b254bd9dcecbcc086db2fc099c5eb2ef41b02e92c694a7c8f2bfffb5c670ca475e88b5b8c657dfc9b63aa75f6c1b11b3b5a300ace66a0d90b3d70c6845f9e4b21f82f17e0dfab46f79f58e7ee6405175f910321be3046e1034b225b7c1be378204057d8335a6ebbd396116af8297aeadc460bcada72c84ed1ca22ccb7d84d99193ef323d289f777b274287ca5c033bb9b6e7f700467ba8bf3233c3013c5096cbf22ec14f55a1eb214c740f06f711b6786e08a7d931e8c219e8d21d8cf6204e0e6f233460fdddf4647b72a4375f374f8c40133d1002836c757723ec7f9aa3945e7173aa5adac5a6169c65698c59d276734315d9d7246e2ad1032b5a73d4f292041c45b27b1a52ae909a8ae89128c536288eb7289ef68188e411b133da664dbd545bb39180291ef5ffffa7633545335e021a76911270e827e0031c39f9a54d1ce5f84e350fe50d4be9352f63546ec62600c6c8e01" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "transfer-range-09-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + }, + { + "id": "transfer-range-09-bfN", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "dcf2d46ae964b49ba3e3db3f8b6470e7f8353e09fc45f279b4935a8eabb30b3d7471604546ee3084fb1cef0aa9798ddcef4694bac9091adf5eda3b0345df7d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000bce867cc3281fe0ede7d916e12905939edf93bd500f925a6d0f46e8c03c0de1288935a3c1760f8f36f1f1535aabeb04990616f3f850bd6c1d97756b3fcbcf961f4d8bf3901100187d2e05408fa5a579d657889ce2dd0be06ce18fe39170e3c3dc26d9a67892b5d49116c7906aa1de14bf6642fe7a078020f0cf3a5c6a186913e29803cf7a4a6c7439cf562ddbaaa65d4f61ba5d11a859f519371ce803c47f10dca269fc8e02d9f63b0d6753e0cfe9b49affdb261bd7fe1239b6fba7dbcdcdd07e6575da355f45bb5eab7668b579427128221c4ae3204b9a0c6f9cfc201f90f0baafaf7424f8423fa28102aa2d3ed06fe93e5d5b39cefdad9e9ceaa8418dc6f65e2cd38ab2c1884ce463d5f435c4f0654ded22509161af882f0dc83187e12dd0b22b5447d2b79cd349c56d1846ffecee4f0d94a91cc8ecbf96d858a4795bb201e46c60e9e4b68125a1eeb6908e16af3d08aa50b08942856e5557924534f7bd2639cdb14b907a7598403001ebfa8bb4c79d6e2465ddcfe0c210a5965cd25632670200a7e2206f9c849d0ce9b254bd9dcecbcc086db2fc099c5eb2ef41b02e92c694a7c8f2bfffb5c670ca475e88b5b8c657dfc9b63aa75f6c1b11b3b5a300ace66a0d90b3d70c6845f9e4b21f82f17e0dfab46f79f58e7ee6405175f910321be3046e1034b225b7c1be378204057d8335a6ebbd396116af8297aeadc460bcada72c84ed1ca22ccb7d84d99193ef323d289f777b274287ca5c033bb9b6e7f700467ba8bf3233c3013c5096cbf22ec14f55a1eb214c740f06f711b6786e08a7d931e8c219e8d21d8cf6204e0e6f233460fdddf4647b72a4375f374f8c40133d1002836c757723ec7f9aa3945e7173aa5adac5a6169c65698c59d276734315d9d7246e2ad1032b5a73d4f292041c45b27b1a52ae909a8ae89128c536288eb7289ef68188e411b133da664dbd545bb39180291ef5ffffa7633545335e021a76911270e827e0031c39f9a54d1ce5f84e350fe50d4be9352f63546ec62600c6c8e014b07" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + } + ] + }, + { + "id": "transfer-composite-09", + "family": "transfer_composite", + "expected_valid": true, + "payload": { + "equality_proof_data_hex": "ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268de4c3d91066bdd05ab31d6a139d6b002005efc0d55a70c5393b9faf7381053212eafff6b28c62f72126419f08dd316bb428b1c00c8f7ab9650f089ac72f3ad32dcf2d46ae964b49ba3e3db3f8b6470e7f8353e09fc45f279b4935a8eabb30b3d006ad1b0d780388c8ea4a5eeb34818be5691939fc4ae0092463fe0676bfb0b1dd872ba0af3cb19ec24071a4f2f0c3f3dd98e4019156b4855156f4be14d1a735c546f929613a02d8980d27d8db1062cd737a915c59a6573eb1463da6a4d3ee745e34157f96332af5aff9c6a383c438c48fc9986ca37ede30fb33c378a670bcc0085b4f5144d663c5ffac0afba1d4c3e4eb13f8230682ac14f28869fb8dcc22e01673982910c30ca1e2a8bdf237560a877c12a6419d407ab9466e15fb5e179c70b", + "range_proof_data_hex": "dcf2d46ae964b49ba3e3db3f8b6470e7f8353e09fc45f279b4935a8eabb30b3d7471604546ee3084fb1cef0aa9798ddcef4694bac9091adf5eda3b0345df7d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000bce867cc3281fe0ede7d916e12905939edf93bd500f925a6d0f46e8c03c0de1288935a3c1760f8f36f1f1535aabeb04990616f3f850bd6c1d97756b3fcbcf961f4d8bf3901100187d2e05408fa5a579d657889ce2dd0be06ce18fe39170e3c3dc26d9a67892b5d49116c7906aa1de14bf6642fe7a078020f0cf3a5c6a186913e29803cf7a4a6c7439cf562ddbaaa65d4f61ba5d11a859f519371ce803c47f10dca269fc8e02d9f63b0d6753e0cfe9b49affdb261bd7fe1239b6fba7dbcdcdd07e6575da355f45bb5eab7668b579427128221c4ae3204b9a0c6f9cfc201f90f0baafaf7424f8423fa28102aa2d3ed06fe93e5d5b39cefdad9e9ceaa8418dc6f65e2cd38ab2c1884ce463d5f435c4f0654ded22509161af882f0dc83187e12dd0b22b5447d2b79cd349c56d1846ffecee4f0d94a91cc8ecbf96d858a4795bb201e46c60e9e4b68125a1eeb6908e16af3d08aa50b08942856e5557924534f7bd2639cdb14b907a7598403001ebfa8bb4c79d6e2465ddcfe0c210a5965cd25632670200a7e2206f9c849d0ce9b254bd9dcecbcc086db2fc099c5eb2ef41b02e92c694a7c8f2bfffb5c670ca475e88b5b8c657dfc9b63aa75f6c1b11b3b5a300ace66a0d90b3d70c6845f9e4b21f82f17e0dfab46f79f58e7ee6405175f910321be3046e1034b225b7c1be378204057d8335a6ebbd396116af8297aeadc460bcada72c84ed1ca22ccb7d84d99193ef323d289f777b274287ca5c033bb9b6e7f700467ba8bf3233c3013c5096cbf22ec14f55a1eb214c740f06f711b6786e08a7d931e8c219e8d21d8cf6204e0e6f233460fdddf4647b72a4375f374f8c40133d1002836c757723ec7f9aa3945e7173aa5adac5a6169c65698c59d276734315d9d7246e2ad1032b5a73d4f292041c45b27b1a52ae909a8ae89128c536288eb7289ef68188e411b133da664dbd545bb39180291ef5ffffa7633545335e021a76911270e827e0031c39f9a54d1ce5f84e350fe50d4be9352f63546ec62600c6c8e014b06", + "validity_proof_data_hex": "ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d2685e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b7471604546ee3084fb1cef0aa9798ddcef4694bac9091adf5eda3b0345df7d0dc68237cff9e617f3bb3ed7438f41157147fa42ee952b4969f4041a578264124b3ce1d340532dbd4c3adca7406f7802931bffec088921469404341b2f0be89420463a818b1b7c56ae0ad2f4a77c05b5c9cbf43be703f6b577b184e1ee5ccd5925983c8b9dbd222aaa8920b6ba22996d6c14aeab4f30a6005368e1ef6cc0ed3a718e2ba227b1c02b5d0a4b249bf21664d9e92e9a8a6222933a9ee629d2c0d6c110188332a15c29fcf21f666ff96566f21c43b6e3c9334709e666e1951515317801c4ab1c0d184bd22d70b5111993a9fa1e131978e5af49b65ffcc4b6bb0dd7c04f88704f81171cba1f4433f9a8c5024be7f0b272aa2af0552fa2dd726dcc1fbc101ffd760a403c13886c618b9ac8e3cdb73a6e1883038363634054dba8e7b0a30bf63844abacf3e2b80d8ea0cae99aa171b88f02d4be534886df9e1f62ca86f60e" + }, + "binding": { + "current_balance_commitment_hex": "04c1d0c616538a2f3194b61d408f29b58a1a2ad85901cce5d0e2e4c9ac2cb93a", + "current_balance_handle_hex": "e8f4bc5bba3f5319bfdcbb68ddd842f749ebf4497c78ee50f84eb89693858355", + "recipient_pubkey_hex": "5e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b", + "sender_pubkey_hex": "ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268" + }, + "mutations": [ + { + "id": "transfer-composite-09-swap-eq-val", + "op": "swap_fields", + "target": "payload.equality_proof_data_hex", + "params": { + "with": "payload.validity_proof_data_hex" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "transfer-composite-09-pk-s", + "op": "bitflip", + "target": "binding.sender_pubkey_hex", + "params": { + "value_hex": "ebd02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "transfer-composite-09-pk-r", + "op": "bitflip", + "target": "binding.recipient_pubkey_hex", + "params": { + "value_hex": "5f06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "transfer-composite-09-bal-c1", + "op": "replace_field", + "target": "binding.current_balance_commitment_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "remaining balance commitment mismatch" + }, + { + "id": "transfer-composite-09-rng-trunc", + "op": "truncate", + "target": "payload.range_proof_data_hex", + "params": { + "value_hex": "dcf2d46ae964b49ba3e3db3f8b6470e7f8353e09fc45f279b4935a8eabb30b3d7471604546ee3084fb1cef0aa9798ddcef4694bac9091adf5eda3b0345df7d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000bce867cc3281fe0ede7d916e12905939edf93bd500f925a6d0f46e8c03c0de1288935a3c1760f8f36f1f1535aabeb04990616f3f850bd6c1d97756b3fcbcf961f4d8bf3901100187d2e05408fa5a579d657889ce2dd0be06ce18fe39170e3c3dc26d9a67892b5d49116c7906aa1de14bf6642fe7a078020f0cf3a5c6a186913e29803cf7a4a6c7439cf562ddbaaa65d4f61ba5d11a859f519371ce803c47f10dca269fc8e02d9f63b0d6753e0cfe9b49affdb261bd7fe1239b6fba7dbcdcdd07e6575da355f45bb5eab7668b579427128221c4ae3204b9a0c6f9cfc201f90f0baafaf7424f8423fa28102aa2d3ed06fe93e5d5b39cefdad9e9ceaa8418dc6f65e2cd38ab2c1884ce463d5f435c4f0654ded22509161af882f0dc83187e12dd0b22b5447d2b79cd349c56d1846ffecee4f0d94a91cc8ecbf96d858a4795bb201e46c60e9e4b68125a1eeb6908e16af3d08aa50b08942856e5557924534f7bd2639cdb14b907a7598403001ebfa8bb4c79d6e2465ddcfe0c210a5965cd25632670200a7e2206f9c849d0ce9b254bd9dcecbcc086db2fc099c5eb2ef41b02e92c694a7c8f2bfffb5c670ca475e88b5b8c657dfc9b63aa75f6c1b11b3b5a300ace66a0d90b3d70c6845f9e4b21f82f17e0dfab46f79f58e7ee6405175f910321be3046e1034b225b7c1be378204057d8335a6ebbd396116af8297aeadc460bcada72c84ed1ca22ccb7d84d99193ef323d289f777b274287ca5c033bb9b6e7f700467ba8bf3233c3013c5096cbf22ec14f55a1eb214c740f06f711b6786e08a7d931e8c219e8d21d8cf6204e0e6f233460fdddf4647b72a4375f374f8c40133d1002836c757723ec7f9aa3945e7173aa5adac5a6169c65698c59d276734315d9d7246e2ad1032b5a73d4f292041c45b27b1a52ae909a8ae89128c536288eb7289ef68188e411b133da664dbd545bb39180291ef5ffffa7633545335e021a76911270e827e0031c39f9a54d1ce5f84e350fe50d4be9352f63546ec62600c6c8e01" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + } + ] + }, + { + "id": "withdraw-range-00", + "family": "withdraw_range", + "expected_valid": true, + "payload": { + "proof_data_hex": "f44d37949bc5598aefd84df2e25e58f46d6a44128a54dfdab0a9faeb6802a223000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000da2168975dbddce0d9cadee80f71c683d44cf0ac2e9c2a09d127a20f2252ef503231c4444cd436daedee15fddfe14bdfb881bbc4db6ed27ebcd88df7f4d0a94f9899c80084e97e257d1c9125dd152caedc934930f4c73889f8b1d67f958c9b028c7661bf4e5e07d08b3941be61e6baafc15df117624b5eaa088028dc4a7ede4d9b694d82a899bcc9aee8b35fa2c9c8ea91fea7f9c73234dc077ef887ed78f50715e900950cdc789be950c71b32284369eb5e96bd1260a4a1bca08dcd5d08600fa1699b0e09342282fe22a3f158cb4b56f13f00bd34896d808fbdcb9cb46454025edb2d5b05a187edda567537c1f66bb781f24cc65f1793f9510908cf47f6ec7a405c1b6ccd943992ad20ff8ef0f278d1fd9628394a6f41980206d02d7b2ca37cee4259919692ca1b868c2bca39411724fc3082bbda3de13e32a639a26de571204463348d985ac97a270f66fb1a373996f4ff5484fd07a6065e26b12bc32e03210e91d6a6ccae8c187ad9060b60400b9ac5fd36c4b4b4c42575067453029c8f7ede4e1ce0033a26437139ae0c3e4a3f1bd1cf44beb7a9694ab76f17e54bff313d3897205f1cef1b0837fe73ce92b70b4d0d0ab4dbb967218253eaf2106769fc1d3e70650a0889f3abd96fd6fca4ac903079c2ddf404af33ca5c206c259dcae67430cc508256f675c6dbf607e186946128fe41f2aa3da5649852b934d68489a6355ac7d46c6196a77b77a93cc4efd4d55fd574061923772b1f8dac2796742a443d405a6a9cfbaad2fc3a598b9dffb827485edf4a477e6287881f99a052800c7f7e947957dc77eb65a19abcaab3764866ffdb9d740a87afa0a748f3fc4a880edb7071d74b2981cebc5118fc85c086568ddb29c212d0218075d2d789baa2972a0e01ba30337d81cb6d012e79074ee5846c681941c3da4e2c6b2b97686bcc67dc7105" + }, + "mutations": [ + { + "id": "withdraw-range-00-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "f54d37949bc5598aefd84df2e25e58f46d6a44128a54dfdab0a9faeb6802a223000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000da2168975dbddce0d9cadee80f71c683d44cf0ac2e9c2a09d127a20f2252ef503231c4444cd436daedee15fddfe14bdfb881bbc4db6ed27ebcd88df7f4d0a94f9899c80084e97e257d1c9125dd152caedc934930f4c73889f8b1d67f958c9b028c7661bf4e5e07d08b3941be61e6baafc15df117624b5eaa088028dc4a7ede4d9b694d82a899bcc9aee8b35fa2c9c8ea91fea7f9c73234dc077ef887ed78f50715e900950cdc789be950c71b32284369eb5e96bd1260a4a1bca08dcd5d08600fa1699b0e09342282fe22a3f158cb4b56f13f00bd34896d808fbdcb9cb46454025edb2d5b05a187edda567537c1f66bb781f24cc65f1793f9510908cf47f6ec7a405c1b6ccd943992ad20ff8ef0f278d1fd9628394a6f41980206d02d7b2ca37cee4259919692ca1b868c2bca39411724fc3082bbda3de13e32a639a26de571204463348d985ac97a270f66fb1a373996f4ff5484fd07a6065e26b12bc32e03210e91d6a6ccae8c187ad9060b60400b9ac5fd36c4b4b4c42575067453029c8f7ede4e1ce0033a26437139ae0c3e4a3f1bd1cf44beb7a9694ab76f17e54bff313d3897205f1cef1b0837fe73ce92b70b4d0d0ab4dbb967218253eaf2106769fc1d3e70650a0889f3abd96fd6fca4ac903079c2ddf404af33ca5c206c259dcae67430cc508256f675c6dbf607e186946128fe41f2aa3da5649852b934d68489a6355ac7d46c6196a77b77a93cc4efd4d55fd574061923772b1f8dac2796742a443d405a6a9cfbaad2fc3a598b9dffb827485edf4a477e6287881f99a052800c7f7e947957dc77eb65a19abcaab3764866ffdb9d740a87afa0a748f3fc4a880edb7071d74b2981cebc5118fc85c086568ddb29c212d0218075d2d789baa2972a0e01ba30337d81cb6d012e79074ee5846c681941c3da4e2c6b2b97686bcc67dc7105" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "withdraw-range-00-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "f44d37949bc5598aefd84df2e25e58f46d6a44128a54dfdab0a9faeb6802a223000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000da2168975dbddce0d9cadee80f71c683d44cf0ac2e9c2a09d127a20f2252ef503231c4444cd436daedee15fddfe14bdfb881bbc4db6ed27ebcd88df7f4d0a94f9899c80084e97e257d1c9125dd152caedc934930f4c73889f8b1d67f958c9b028c7661bf4e5e07d08b3941be61e6baafc15df117624b5eaa088028dc4a7ede4d9b694d82a899bcc9aee8b35fa2c9c8ea91fea7f9c73234dc077ef887ed78f50715e900950cdc789be950c71b32284369eb5e96bd1260a4a1bca08dcd5d08600fa1699b0e09342282fe22a3f158cb4b56f13f00bd34896d808fbdcb9cb46454025edb2d5b05a187edda567537c1f66bb781f24cc65f1793f9510908cf47f6ec7a405c1b6ccd943992ad20ff8ef0f278d1fd9628394a6f41980206d02d7b2ca37cee4259919692ca1b868c2bca39411724fc3082bbda3de13e32a639a26de571204463348d985ac97a270f66fb1a373996f4ff5484fd07a6065e26b12bc32e03210e91d6a6ccae8c187ad9060b60400b9ac5fd36c4b4b4c42575067453029c8f7ede4e1ce0033a26437139ae0c3e4a3f1bd1cf44beb7a9694ab76f17e54bff313d3897205f1cef1b0837fe73ce92b70b4d0d0ab4dbb967218253eaf2106769fc1d3e70650a0889f3abd96fd6fca4ac903079c2ddf404af33ca5c206c259dcae67430cc508256f675c6dbf607e186946128fe41f2aa3da5649852b934d68489a6355ac7d46c6196a77b77a93cc4efd4d55fd574061923772b1f8dac2796742a443d405a6a9cfbaad2fc3a598b9dffb827485edf4a477e6287881f99a052800c7f7e947957dc77eb65a19abcaab3764866ffdb9d740a87afa0a748f3fc4a880edb7071d74b2981cebc5118fc85c086568ddb29c212d0218075d2d789baa2972a0e01ba30337d81cb6d012e79074ee5846c681941c3da4e2c6b2b97686bcc67dc" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "withdraw-range-00-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + }, + { + "id": "withdraw-range-00-bfN", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "f44d37949bc5598aefd84df2e25e58f46d6a44128a54dfdab0a9faeb6802a223000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000da2168975dbddce0d9cadee80f71c683d44cf0ac2e9c2a09d127a20f2252ef503231c4444cd436daedee15fddfe14bdfb881bbc4db6ed27ebcd88df7f4d0a94f9899c80084e97e257d1c9125dd152caedc934930f4c73889f8b1d67f958c9b028c7661bf4e5e07d08b3941be61e6baafc15df117624b5eaa088028dc4a7ede4d9b694d82a899bcc9aee8b35fa2c9c8ea91fea7f9c73234dc077ef887ed78f50715e900950cdc789be950c71b32284369eb5e96bd1260a4a1bca08dcd5d08600fa1699b0e09342282fe22a3f158cb4b56f13f00bd34896d808fbdcb9cb46454025edb2d5b05a187edda567537c1f66bb781f24cc65f1793f9510908cf47f6ec7a405c1b6ccd943992ad20ff8ef0f278d1fd9628394a6f41980206d02d7b2ca37cee4259919692ca1b868c2bca39411724fc3082bbda3de13e32a639a26de571204463348d985ac97a270f66fb1a373996f4ff5484fd07a6065e26b12bc32e03210e91d6a6ccae8c187ad9060b60400b9ac5fd36c4b4b4c42575067453029c8f7ede4e1ce0033a26437139ae0c3e4a3f1bd1cf44beb7a9694ab76f17e54bff313d3897205f1cef1b0837fe73ce92b70b4d0d0ab4dbb967218253eaf2106769fc1d3e70650a0889f3abd96fd6fca4ac903079c2ddf404af33ca5c206c259dcae67430cc508256f675c6dbf607e186946128fe41f2aa3da5649852b934d68489a6355ac7d46c6196a77b77a93cc4efd4d55fd574061923772b1f8dac2796742a443d405a6a9cfbaad2fc3a598b9dffb827485edf4a477e6287881f99a052800c7f7e947957dc77eb65a19abcaab3764866ffdb9d740a87afa0a748f3fc4a880edb7071d74b2981cebc5118fc85c086568ddb29c212d0218075d2d789baa2972a0e01ba30337d81cb6d012e79074ee5846c681941c3da4e2c6b2b97686bcc67dc7104" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + } + ] + }, + { + "id": "withdraw-composite-00", + "family": "withdraw_composite", + "expected_valid": true, + "payload": { + "equality_proof_data_hex": "9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d8c6085a3610cefb5a9732a465b643d40218ffddc5b3ab367285b880da8f9653fe4bdebf1223efd5f309d91b052a13b2a52019103dc7cc8183d5a52da13cf9158f44d37949bc5598aefd84df2e25e58f46d6a44128a54dfdab0a9faeb6802a223000000000000000002f7cd7ca8ea8397c6dbf4bca72e1f24345eddf449dc8d1a7caf7fc105642a5fd22fc768ed0dbae6f4b31e0172c60edc7f6ce097279ec8d97cee9e3f60ff1165c8c7dbfc6aa5409ebf10c01f7a95de316096a5f99333cadf2df51ab7cf2dec313a83bd38cea682130d3d58e15b4409a5f62497ff44e504328e900511a0eb850f7edcce18a7022278b96a6b5944e79752e4b2747082c8faceb60ffba9e74d99060614b3bc1d228d308ca93c768d58d5becfa27c68bbc69798c1f4089d4a53b501", + "range_proof_data_hex": "f44d37949bc5598aefd84df2e25e58f46d6a44128a54dfdab0a9faeb6802a223000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000da2168975dbddce0d9cadee80f71c683d44cf0ac2e9c2a09d127a20f2252ef503231c4444cd436daedee15fddfe14bdfb881bbc4db6ed27ebcd88df7f4d0a94f9899c80084e97e257d1c9125dd152caedc934930f4c73889f8b1d67f958c9b028c7661bf4e5e07d08b3941be61e6baafc15df117624b5eaa088028dc4a7ede4d9b694d82a899bcc9aee8b35fa2c9c8ea91fea7f9c73234dc077ef887ed78f50715e900950cdc789be950c71b32284369eb5e96bd1260a4a1bca08dcd5d08600fa1699b0e09342282fe22a3f158cb4b56f13f00bd34896d808fbdcb9cb46454025edb2d5b05a187edda567537c1f66bb781f24cc65f1793f9510908cf47f6ec7a405c1b6ccd943992ad20ff8ef0f278d1fd9628394a6f41980206d02d7b2ca37cee4259919692ca1b868c2bca39411724fc3082bbda3de13e32a639a26de571204463348d985ac97a270f66fb1a373996f4ff5484fd07a6065e26b12bc32e03210e91d6a6ccae8c187ad9060b60400b9ac5fd36c4b4b4c42575067453029c8f7ede4e1ce0033a26437139ae0c3e4a3f1bd1cf44beb7a9694ab76f17e54bff313d3897205f1cef1b0837fe73ce92b70b4d0d0ab4dbb967218253eaf2106769fc1d3e70650a0889f3abd96fd6fca4ac903079c2ddf404af33ca5c206c259dcae67430cc508256f675c6dbf607e186946128fe41f2aa3da5649852b934d68489a6355ac7d46c6196a77b77a93cc4efd4d55fd574061923772b1f8dac2796742a443d405a6a9cfbaad2fc3a598b9dffb827485edf4a477e6287881f99a052800c7f7e947957dc77eb65a19abcaab3764866ffdb9d740a87afa0a748f3fc4a880edb7071d74b2981cebc5118fc85c086568ddb29c212d0218075d2d789baa2972a0e01ba30337d81cb6d012e79074ee5846c681941c3da4e2c6b2b97686bcc67dc7105" + }, + "binding": { + "ciphertext_commitment_hex": "8c6085a3610cefb5a9732a465b643d40218ffddc5b3ab367285b880da8f9653f", + "ciphertext_handle_hex": "e4bdebf1223efd5f309d91b052a13b2a52019103dc7cc8183d5a52da13cf9158", + "expected_nonce_u64": 0, + "user_pubkey_hex": "9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d" + }, + "mutations": [ + { + "id": "withdraw-composite-00-swap-eq-rng", + "op": "swap_fields", + "target": "payload.equality_proof_data_hex", + "params": { + "with": "payload.range_proof_data_hex" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "withdraw-composite-00-nonce", + "op": "replace_field", + "target": "binding.expected_nonce_u64", + "params": { + "value_u64": 1 + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "withdraw-composite-00-pk-u", + "op": "bitflip", + "target": "binding.user_pubkey_hex", + "params": { + "value_hex": "9b8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "withdraw-composite-00-eq-trunc", + "op": "truncate", + "target": "payload.equality_proof_data_hex", + "params": { + "value_hex": "9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d8c6085a3610cefb5a9732a465b643d40218ffddc5b3ab367285b880da8f9653fe4bdebf1223efd5f309d91b052a13b2a52019103dc7cc8183d5a52da13cf9158f44d37949bc5598aefd84df2e25e58f46d6a44128a54dfdab0a9faeb6802a223000000000000000002f7cd7ca8ea8397c6dbf4bca72e1f24345eddf449dc8d1a7caf7fc105642a5fd22fc768ed0dbae6f4b31e0172c60edc7f6ce097279ec8d97cee9e3f60ff1165c8c7dbfc6aa5409ebf10c01f7a95de316096a5f99333cadf2df51ab7cf2dec313a83bd38cea682130d3d58e15b4409a5f62497ff44e504328e900511a0eb850f7edcce18a7022278b96a6b5944e79752e4b2747082c8faceb60ffba9e74d99060614b3bc1d228d308ca93c768d58d5becfa27c68bbc69798c1f4089d4a53" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "withdraw-composite-00-h0", + "op": "replace_field", + "target": "binding.ciphertext_handle_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "handle mismatch" + } + ] + }, + { + "id": "withdraw-range-01", + "family": "withdraw_range", + "expected_valid": true, + "payload": { + "proof_data_hex": "188711ac7b46b168d13358ef1eaef4feebeaa6e54d50ced3dfaed7603aa0b91d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100000000000000c45fdbe02d3fda8ced4e4858a8903b674f9fd2fce269b6f8dcb162da307b4e7264ed89dde3105f31b7d73cfc7545b73a4074fa7fb8962ab7d16ac4f3cb580b62ba61519ceae40a379a628c95f2dd1f904aba4066a327f29252dd6b0be9635b1ede64c4c64f39f806189343860ed8aeee0d7317d774cefa09f86a418293afb234c382d52cd7522db9cbceb1a3242bbe9d924a0bd4cbd281848f14b0a39bfec3068d86ea9f48e2857f9bead8b284b92e2f2493984067edb41153e0ae428cc7b3086b7d95059afc0dc8ddea68a10d3f9f85bbb10618d4ca64ba5fb08bec11c6c20e78281fd14d568e19b37de57f26e65e8ce203bc5db74df4b1518167bafe01487d9c851012aab4cc11d0e3a53725426b45a70a95d9f6a1d3707c93bb95f0459f1d50f456d67f4ce0ce765847fb4a0b13f255857e29d57c1823bb14902842bd4751341b40f742e8d6103add51efa067fca95b4115f2c391a7b8bdafb02ddc794c1a80123a8d3d5a880a431465234cbe7cbfa9a3668c2b4f73a4c6597e7d96d1b10b7adee5ad9448f122b9b8b5ab768d1b53035aed8a96665684405768ab8f31303814aca5ec5ec8fcf7f181d505f538df151f97d2147d42fa31b1871a784bc660098ef99ba81e872ac3b9be265a393e01fd31d962bb3cfc6c90170329cf1b3df5409c01f0183ded52b6b7f701e21b5af70fe155bd143c844395a8e0783f2a55d17142ed66b9f0fa5f35b21580c6dbd76c909373c8e5e125abd44013f75f2aa0d441fed88e90851d07228be2c92113826237f5ce59bb368b08395b379aa5c7face710aef1a75671ab8eafd843bcd03c958c33831707c947cfd53881635097136682dcfd7947097fc9fd4b6198f3146fda8b120f7ff4dcca4e5a067b9fec213b42003820e8af241d961ef60e2157f53ea8800b0f28fc5a3c5156641de08e17a464208" + }, + "mutations": [ + { + "id": "withdraw-range-01-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "198711ac7b46b168d13358ef1eaef4feebeaa6e54d50ced3dfaed7603aa0b91d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100000000000000c45fdbe02d3fda8ced4e4858a8903b674f9fd2fce269b6f8dcb162da307b4e7264ed89dde3105f31b7d73cfc7545b73a4074fa7fb8962ab7d16ac4f3cb580b62ba61519ceae40a379a628c95f2dd1f904aba4066a327f29252dd6b0be9635b1ede64c4c64f39f806189343860ed8aeee0d7317d774cefa09f86a418293afb234c382d52cd7522db9cbceb1a3242bbe9d924a0bd4cbd281848f14b0a39bfec3068d86ea9f48e2857f9bead8b284b92e2f2493984067edb41153e0ae428cc7b3086b7d95059afc0dc8ddea68a10d3f9f85bbb10618d4ca64ba5fb08bec11c6c20e78281fd14d568e19b37de57f26e65e8ce203bc5db74df4b1518167bafe01487d9c851012aab4cc11d0e3a53725426b45a70a95d9f6a1d3707c93bb95f0459f1d50f456d67f4ce0ce765847fb4a0b13f255857e29d57c1823bb14902842bd4751341b40f742e8d6103add51efa067fca95b4115f2c391a7b8bdafb02ddc794c1a80123a8d3d5a880a431465234cbe7cbfa9a3668c2b4f73a4c6597e7d96d1b10b7adee5ad9448f122b9b8b5ab768d1b53035aed8a96665684405768ab8f31303814aca5ec5ec8fcf7f181d505f538df151f97d2147d42fa31b1871a784bc660098ef99ba81e872ac3b9be265a393e01fd31d962bb3cfc6c90170329cf1b3df5409c01f0183ded52b6b7f701e21b5af70fe155bd143c844395a8e0783f2a55d17142ed66b9f0fa5f35b21580c6dbd76c909373c8e5e125abd44013f75f2aa0d441fed88e90851d07228be2c92113826237f5ce59bb368b08395b379aa5c7face710aef1a75671ab8eafd843bcd03c958c33831707c947cfd53881635097136682dcfd7947097fc9fd4b6198f3146fda8b120f7ff4dcca4e5a067b9fec213b42003820e8af241d961ef60e2157f53ea8800b0f28fc5a3c5156641de08e17a464208" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "withdraw-range-01-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "188711ac7b46b168d13358ef1eaef4feebeaa6e54d50ced3dfaed7603aa0b91d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100000000000000c45fdbe02d3fda8ced4e4858a8903b674f9fd2fce269b6f8dcb162da307b4e7264ed89dde3105f31b7d73cfc7545b73a4074fa7fb8962ab7d16ac4f3cb580b62ba61519ceae40a379a628c95f2dd1f904aba4066a327f29252dd6b0be9635b1ede64c4c64f39f806189343860ed8aeee0d7317d774cefa09f86a418293afb234c382d52cd7522db9cbceb1a3242bbe9d924a0bd4cbd281848f14b0a39bfec3068d86ea9f48e2857f9bead8b284b92e2f2493984067edb41153e0ae428cc7b3086b7d95059afc0dc8ddea68a10d3f9f85bbb10618d4ca64ba5fb08bec11c6c20e78281fd14d568e19b37de57f26e65e8ce203bc5db74df4b1518167bafe01487d9c851012aab4cc11d0e3a53725426b45a70a95d9f6a1d3707c93bb95f0459f1d50f456d67f4ce0ce765847fb4a0b13f255857e29d57c1823bb14902842bd4751341b40f742e8d6103add51efa067fca95b4115f2c391a7b8bdafb02ddc794c1a80123a8d3d5a880a431465234cbe7cbfa9a3668c2b4f73a4c6597e7d96d1b10b7adee5ad9448f122b9b8b5ab768d1b53035aed8a96665684405768ab8f31303814aca5ec5ec8fcf7f181d505f538df151f97d2147d42fa31b1871a784bc660098ef99ba81e872ac3b9be265a393e01fd31d962bb3cfc6c90170329cf1b3df5409c01f0183ded52b6b7f701e21b5af70fe155bd143c844395a8e0783f2a55d17142ed66b9f0fa5f35b21580c6dbd76c909373c8e5e125abd44013f75f2aa0d441fed88e90851d07228be2c92113826237f5ce59bb368b08395b379aa5c7face710aef1a75671ab8eafd843bcd03c958c33831707c947cfd53881635097136682dcfd7947097fc9fd4b6198f3146fda8b120f7ff4dcca4e5a067b9fec213b42003820e8af241d961ef60e2157f53ea8800b0f28fc5a3c5156641de08e17a46" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "withdraw-range-01-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + }, + { + "id": "withdraw-range-01-bfN", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "188711ac7b46b168d13358ef1eaef4feebeaa6e54d50ced3dfaed7603aa0b91d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100000000000000c45fdbe02d3fda8ced4e4858a8903b674f9fd2fce269b6f8dcb162da307b4e7264ed89dde3105f31b7d73cfc7545b73a4074fa7fb8962ab7d16ac4f3cb580b62ba61519ceae40a379a628c95f2dd1f904aba4066a327f29252dd6b0be9635b1ede64c4c64f39f806189343860ed8aeee0d7317d774cefa09f86a418293afb234c382d52cd7522db9cbceb1a3242bbe9d924a0bd4cbd281848f14b0a39bfec3068d86ea9f48e2857f9bead8b284b92e2f2493984067edb41153e0ae428cc7b3086b7d95059afc0dc8ddea68a10d3f9f85bbb10618d4ca64ba5fb08bec11c6c20e78281fd14d568e19b37de57f26e65e8ce203bc5db74df4b1518167bafe01487d9c851012aab4cc11d0e3a53725426b45a70a95d9f6a1d3707c93bb95f0459f1d50f456d67f4ce0ce765847fb4a0b13f255857e29d57c1823bb14902842bd4751341b40f742e8d6103add51efa067fca95b4115f2c391a7b8bdafb02ddc794c1a80123a8d3d5a880a431465234cbe7cbfa9a3668c2b4f73a4c6597e7d96d1b10b7adee5ad9448f122b9b8b5ab768d1b53035aed8a96665684405768ab8f31303814aca5ec5ec8fcf7f181d505f538df151f97d2147d42fa31b1871a784bc660098ef99ba81e872ac3b9be265a393e01fd31d962bb3cfc6c90170329cf1b3df5409c01f0183ded52b6b7f701e21b5af70fe155bd143c844395a8e0783f2a55d17142ed66b9f0fa5f35b21580c6dbd76c909373c8e5e125abd44013f75f2aa0d441fed88e90851d07228be2c92113826237f5ce59bb368b08395b379aa5c7face710aef1a75671ab8eafd843bcd03c958c33831707c947cfd53881635097136682dcfd7947097fc9fd4b6198f3146fda8b120f7ff4dcca4e5a067b9fec213b42003820e8af241d961ef60e2157f53ea8800b0f28fc5a3c5156641de08e17a464209" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + } + ] + }, + { + "id": "withdraw-composite-01", + "family": "withdraw_composite", + "expected_valid": true, + "payload": { + "equality_proof_data_hex": "40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c22013a79a452cf5af39c415bf56f1548c33d3e1023aee59af378bf47afab85e01708441927e3e6b63be38a1465c8cc63ea666306a1d3fb70cecec4e8b62d5465c000188711ac7b46b168d13358ef1eaef4feebeaa6e54d50ced3dfaed7603aa0b91d010000000000000030b30d9d4cf91579ac38361021b7f26f5aa5e814667356f8a959eb0aebec514aae9a173ab28deb39a919fcf818bf7db2f426ba9d68d26485bd37a9f21af8520914ac5b8522c4f1152101e1167824a522fdd768131e7c695dc7b09b0171512804c984ad636996341fd956bd700ef2fa605172922115d02f2559921d8541ebb40846e63e0667624366b21f5af2a11ef064e3f86cba8a653d49f946d58fa9b9980cda1ec85cf90e043325600e2b0efaeae8ad9d29d99d2f1018dbfddf37038de20e", + "range_proof_data_hex": "188711ac7b46b168d13358ef1eaef4feebeaa6e54d50ced3dfaed7603aa0b91d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100000000000000c45fdbe02d3fda8ced4e4858a8903b674f9fd2fce269b6f8dcb162da307b4e7264ed89dde3105f31b7d73cfc7545b73a4074fa7fb8962ab7d16ac4f3cb580b62ba61519ceae40a379a628c95f2dd1f904aba4066a327f29252dd6b0be9635b1ede64c4c64f39f806189343860ed8aeee0d7317d774cefa09f86a418293afb234c382d52cd7522db9cbceb1a3242bbe9d924a0bd4cbd281848f14b0a39bfec3068d86ea9f48e2857f9bead8b284b92e2f2493984067edb41153e0ae428cc7b3086b7d95059afc0dc8ddea68a10d3f9f85bbb10618d4ca64ba5fb08bec11c6c20e78281fd14d568e19b37de57f26e65e8ce203bc5db74df4b1518167bafe01487d9c851012aab4cc11d0e3a53725426b45a70a95d9f6a1d3707c93bb95f0459f1d50f456d67f4ce0ce765847fb4a0b13f255857e29d57c1823bb14902842bd4751341b40f742e8d6103add51efa067fca95b4115f2c391a7b8bdafb02ddc794c1a80123a8d3d5a880a431465234cbe7cbfa9a3668c2b4f73a4c6597e7d96d1b10b7adee5ad9448f122b9b8b5ab768d1b53035aed8a96665684405768ab8f31303814aca5ec5ec8fcf7f181d505f538df151f97d2147d42fa31b1871a784bc660098ef99ba81e872ac3b9be265a393e01fd31d962bb3cfc6c90170329cf1b3df5409c01f0183ded52b6b7f701e21b5af70fe155bd143c844395a8e0783f2a55d17142ed66b9f0fa5f35b21580c6dbd76c909373c8e5e125abd44013f75f2aa0d441fed88e90851d07228be2c92113826237f5ce59bb368b08395b379aa5c7face710aef1a75671ab8eafd843bcd03c958c33831707c947cfd53881635097136682dcfd7947097fc9fd4b6198f3146fda8b120f7ff4dcca4e5a067b9fec213b42003820e8af241d961ef60e2157f53ea8800b0f28fc5a3c5156641de08e17a464208" + }, + "binding": { + "ciphertext_commitment_hex": "3a79a452cf5af39c415bf56f1548c33d3e1023aee59af378bf47afab85e01708", + "ciphertext_handle_hex": "441927e3e6b63be38a1465c8cc63ea666306a1d3fb70cecec4e8b62d5465c000", + "expected_nonce_u64": 1, + "user_pubkey_hex": "40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c2201" + }, + "mutations": [ + { + "id": "withdraw-composite-01-swap-eq-rng", + "op": "swap_fields", + "target": "payload.equality_proof_data_hex", + "params": { + "with": "payload.range_proof_data_hex" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "withdraw-composite-01-nonce", + "op": "replace_field", + "target": "binding.expected_nonce_u64", + "params": { + "value_u64": 0 + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "withdraw-composite-01-pk-u", + "op": "bitflip", + "target": "binding.user_pubkey_hex", + "params": { + "value_hex": "41b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c2201" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "withdraw-composite-01-eq-trunc", + "op": "truncate", + "target": "payload.equality_proof_data_hex", + "params": { + "value_hex": "40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c22013a79a452cf5af39c415bf56f1548c33d3e1023aee59af378bf47afab85e01708441927e3e6b63be38a1465c8cc63ea666306a1d3fb70cecec4e8b62d5465c000188711ac7b46b168d13358ef1eaef4feebeaa6e54d50ced3dfaed7603aa0b91d010000000000000030b30d9d4cf91579ac38361021b7f26f5aa5e814667356f8a959eb0aebec514aae9a173ab28deb39a919fcf818bf7db2f426ba9d68d26485bd37a9f21af8520914ac5b8522c4f1152101e1167824a522fdd768131e7c695dc7b09b0171512804c984ad636996341fd956bd700ef2fa605172922115d02f2559921d8541ebb40846e63e0667624366b21f5af2a11ef064e3f86cba8a653d49f946d58fa9b9980cda1ec85cf90e043325600e2b0efaeae8ad9d29d99d2f1018dbfddf37038d" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "withdraw-composite-01-h0", + "op": "replace_field", + "target": "binding.ciphertext_handle_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "handle mismatch" + } + ] + }, + { + "id": "withdraw-range-02", + "family": "withdraw_range", + "expected_valid": true, + "payload": { + "proof_data_hex": "d64cb89601298f7e092b751c0f61d23b21f213d42d6e1133dc8b34ecc07c827f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000200000000000000447231f6eee415d8f5028e81a963d7efd7fd2c9a3f3f8d0a88b23b0cb1e76d2f0a837ffa68833f77fe9ea48d9cd6b14d84b5ab7f19e46c61e85beb306a98b92ec29ed01998f4752925f9d3a1af774bdbe9abe92e82c6fe01957c72ea001f382432196742dd0e6027522a66b5bb233bcc22aa2e5b5dfc38898da0100be728d54173768725f33325e6dde51c257922fd5120db6ed42ee8e394eca301721ded3409d22090e9ef6c8df933b8839687e68a9dd39230aed5c2a7eb4082498d58e5c50bf5430120a17162ccce70d717ce8914203a483150463961e480254c768607680f9642152bee91cac05c3f2d56cb6d41460d58b18440d1be319e065f3aee1c6873781cabe1c57dadbbe5f906e3a574d33c76c1fb24b96efa8335a486023fd8fd63f072257064dce7f3db251744e59b94ac06e135aee59dcfc9802a0e7ffea77f12820d7f6e60318ff49e2a9501062b93c580bb09116e22a2d74ea3e4b7ac14fb041c8d2271da4953b088a351da93c435c1b1b3efdc11fa95636316ccad3aeed1450467b4d20240aec8377fce0d9c9200527efdffef25cac65d9dc15dc237e1391fc8d2b7feacf23ac90c6bdba9edef35513dca897543a338fe6e462bc793cc165f103f2630c8a32016f114980a50629c7d5548ae56d36b093811dccb4e8034b8666e25a2a7db74843e8a477dc0b2c65587ad854f556424c18d580a8842455a183deeb5915b2f4ea649b4bde12c9413b061f3234b69455651b5cb43088cf825d6398abdfca0c332b9708bac53618b65609ad18096f409329777034424c1e429cf65d898b6cdb035a9a5057c11739cbca9bb576fda1f16134cac615e701bbc453146e7d5d799bf88dd50d951ee859115fd358525c388d67b27080a03c3f13bd09f07dd07afc27507932abc82c96c2c8e76ad82217c91f9b06abe8142a1631ce07f03" + }, + "mutations": [ + { + "id": "withdraw-range-02-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "d74cb89601298f7e092b751c0f61d23b21f213d42d6e1133dc8b34ecc07c827f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000200000000000000447231f6eee415d8f5028e81a963d7efd7fd2c9a3f3f8d0a88b23b0cb1e76d2f0a837ffa68833f77fe9ea48d9cd6b14d84b5ab7f19e46c61e85beb306a98b92ec29ed01998f4752925f9d3a1af774bdbe9abe92e82c6fe01957c72ea001f382432196742dd0e6027522a66b5bb233bcc22aa2e5b5dfc38898da0100be728d54173768725f33325e6dde51c257922fd5120db6ed42ee8e394eca301721ded3409d22090e9ef6c8df933b8839687e68a9dd39230aed5c2a7eb4082498d58e5c50bf5430120a17162ccce70d717ce8914203a483150463961e480254c768607680f9642152bee91cac05c3f2d56cb6d41460d58b18440d1be319e065f3aee1c6873781cabe1c57dadbbe5f906e3a574d33c76c1fb24b96efa8335a486023fd8fd63f072257064dce7f3db251744e59b94ac06e135aee59dcfc9802a0e7ffea77f12820d7f6e60318ff49e2a9501062b93c580bb09116e22a2d74ea3e4b7ac14fb041c8d2271da4953b088a351da93c435c1b1b3efdc11fa95636316ccad3aeed1450467b4d20240aec8377fce0d9c9200527efdffef25cac65d9dc15dc237e1391fc8d2b7feacf23ac90c6bdba9edef35513dca897543a338fe6e462bc793cc165f103f2630c8a32016f114980a50629c7d5548ae56d36b093811dccb4e8034b8666e25a2a7db74843e8a477dc0b2c65587ad854f556424c18d580a8842455a183deeb5915b2f4ea649b4bde12c9413b061f3234b69455651b5cb43088cf825d6398abdfca0c332b9708bac53618b65609ad18096f409329777034424c1e429cf65d898b6cdb035a9a5057c11739cbca9bb576fda1f16134cac615e701bbc453146e7d5d799bf88dd50d951ee859115fd358525c388d67b27080a03c3f13bd09f07dd07afc27507932abc82c96c2c8e76ad82217c91f9b06abe8142a1631ce07f03" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "withdraw-range-02-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "d64cb89601298f7e092b751c0f61d23b21f213d42d6e1133dc8b34ecc07c827f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000200000000000000447231f6eee415d8f5028e81a963d7efd7fd2c9a3f3f8d0a88b23b0cb1e76d2f0a837ffa68833f77fe9ea48d9cd6b14d84b5ab7f19e46c61e85beb306a98b92ec29ed01998f4752925f9d3a1af774bdbe9abe92e82c6fe01957c72ea001f382432196742dd0e6027522a66b5bb233bcc22aa2e5b5dfc38898da0100be728d54173768725f33325e6dde51c257922fd5120db6ed42ee8e394eca301721ded3409d22090e9ef6c8df933b8839687e68a9dd39230aed5c2a7eb4082498d58e5c50bf5430120a17162ccce70d717ce8914203a483150463961e480254c768607680f9642152bee91cac05c3f2d56cb6d41460d58b18440d1be319e065f3aee1c6873781cabe1c57dadbbe5f906e3a574d33c76c1fb24b96efa8335a486023fd8fd63f072257064dce7f3db251744e59b94ac06e135aee59dcfc9802a0e7ffea77f12820d7f6e60318ff49e2a9501062b93c580bb09116e22a2d74ea3e4b7ac14fb041c8d2271da4953b088a351da93c435c1b1b3efdc11fa95636316ccad3aeed1450467b4d20240aec8377fce0d9c9200527efdffef25cac65d9dc15dc237e1391fc8d2b7feacf23ac90c6bdba9edef35513dca897543a338fe6e462bc793cc165f103f2630c8a32016f114980a50629c7d5548ae56d36b093811dccb4e8034b8666e25a2a7db74843e8a477dc0b2c65587ad854f556424c18d580a8842455a183deeb5915b2f4ea649b4bde12c9413b061f3234b69455651b5cb43088cf825d6398abdfca0c332b9708bac53618b65609ad18096f409329777034424c1e429cf65d898b6cdb035a9a5057c11739cbca9bb576fda1f16134cac615e701bbc453146e7d5d799bf88dd50d951ee859115fd358525c388d67b27080a03c3f13bd09f07dd07afc27507932abc82c96c2c8e76ad82217c91f9b06abe8142a1631ce0" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "withdraw-range-02-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + }, + { + "id": "withdraw-range-02-bfN", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "d64cb89601298f7e092b751c0f61d23b21f213d42d6e1133dc8b34ecc07c827f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000200000000000000447231f6eee415d8f5028e81a963d7efd7fd2c9a3f3f8d0a88b23b0cb1e76d2f0a837ffa68833f77fe9ea48d9cd6b14d84b5ab7f19e46c61e85beb306a98b92ec29ed01998f4752925f9d3a1af774bdbe9abe92e82c6fe01957c72ea001f382432196742dd0e6027522a66b5bb233bcc22aa2e5b5dfc38898da0100be728d54173768725f33325e6dde51c257922fd5120db6ed42ee8e394eca301721ded3409d22090e9ef6c8df933b8839687e68a9dd39230aed5c2a7eb4082498d58e5c50bf5430120a17162ccce70d717ce8914203a483150463961e480254c768607680f9642152bee91cac05c3f2d56cb6d41460d58b18440d1be319e065f3aee1c6873781cabe1c57dadbbe5f906e3a574d33c76c1fb24b96efa8335a486023fd8fd63f072257064dce7f3db251744e59b94ac06e135aee59dcfc9802a0e7ffea77f12820d7f6e60318ff49e2a9501062b93c580bb09116e22a2d74ea3e4b7ac14fb041c8d2271da4953b088a351da93c435c1b1b3efdc11fa95636316ccad3aeed1450467b4d20240aec8377fce0d9c9200527efdffef25cac65d9dc15dc237e1391fc8d2b7feacf23ac90c6bdba9edef35513dca897543a338fe6e462bc793cc165f103f2630c8a32016f114980a50629c7d5548ae56d36b093811dccb4e8034b8666e25a2a7db74843e8a477dc0b2c65587ad854f556424c18d580a8842455a183deeb5915b2f4ea649b4bde12c9413b061f3234b69455651b5cb43088cf825d6398abdfca0c332b9708bac53618b65609ad18096f409329777034424c1e429cf65d898b6cdb035a9a5057c11739cbca9bb576fda1f16134cac615e701bbc453146e7d5d799bf88dd50d951ee859115fd358525c388d67b27080a03c3f13bd09f07dd07afc27507932abc82c96c2c8e76ad82217c91f9b06abe8142a1631ce07f02" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + } + ] + }, + { + "id": "withdraw-composite-02", + "family": "withdraw_composite", + "expected_valid": true, + "payload": { + "equality_proof_data_hex": "1ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c66784241e094a7db00b615ef236719fa2160f2ccef7dda4a3920420c995741356416b65de908173d7c5d2ba81768e269d40fa9a01f1256ac7c848e096a98a8a7625924ad64cb89601298f7e092b751c0f61d23b21f213d42d6e1133dc8b34ecc07c827f02000000000000005689226d58a399c78c5339f062f51d6958016c9ff4304278f97bf7467181a10ff8c25fb2898aeea28140f35fab658f69a294da06176b9ca3b42975180103cc51eef9862c8d6dc93747d9e2ebe80dfb9f31f77da9cc39e1549aeffdb797d948557ca8c4c0c37439a00803c5a39c859ce7e2851a78f828d2f05cf8c6b0df781a0477d60a6ee42bfac196f9c2be65629f831a7dd3980d495d51c3a7c9150c6ded04f1e0200c4a4f950ad1739fbf7a65cc0324aeffe49a637baa310a4e221be73b09", + "range_proof_data_hex": "d64cb89601298f7e092b751c0f61d23b21f213d42d6e1133dc8b34ecc07c827f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000200000000000000447231f6eee415d8f5028e81a963d7efd7fd2c9a3f3f8d0a88b23b0cb1e76d2f0a837ffa68833f77fe9ea48d9cd6b14d84b5ab7f19e46c61e85beb306a98b92ec29ed01998f4752925f9d3a1af774bdbe9abe92e82c6fe01957c72ea001f382432196742dd0e6027522a66b5bb233bcc22aa2e5b5dfc38898da0100be728d54173768725f33325e6dde51c257922fd5120db6ed42ee8e394eca301721ded3409d22090e9ef6c8df933b8839687e68a9dd39230aed5c2a7eb4082498d58e5c50bf5430120a17162ccce70d717ce8914203a483150463961e480254c768607680f9642152bee91cac05c3f2d56cb6d41460d58b18440d1be319e065f3aee1c6873781cabe1c57dadbbe5f906e3a574d33c76c1fb24b96efa8335a486023fd8fd63f072257064dce7f3db251744e59b94ac06e135aee59dcfc9802a0e7ffea77f12820d7f6e60318ff49e2a9501062b93c580bb09116e22a2d74ea3e4b7ac14fb041c8d2271da4953b088a351da93c435c1b1b3efdc11fa95636316ccad3aeed1450467b4d20240aec8377fce0d9c9200527efdffef25cac65d9dc15dc237e1391fc8d2b7feacf23ac90c6bdba9edef35513dca897543a338fe6e462bc793cc165f103f2630c8a32016f114980a50629c7d5548ae56d36b093811dccb4e8034b8666e25a2a7db74843e8a477dc0b2c65587ad854f556424c18d580a8842455a183deeb5915b2f4ea649b4bde12c9413b061f3234b69455651b5cb43088cf825d6398abdfca0c332b9708bac53618b65609ad18096f409329777034424c1e429cf65d898b6cdb035a9a5057c11739cbca9bb576fda1f16134cac615e701bbc453146e7d5d799bf88dd50d951ee859115fd358525c388d67b27080a03c3f13bd09f07dd07afc27507932abc82c96c2c8e76ad82217c91f9b06abe8142a1631ce07f03" + }, + "binding": { + "ciphertext_commitment_hex": "1e094a7db00b615ef236719fa2160f2ccef7dda4a3920420c995741356416b65", + "ciphertext_handle_hex": "de908173d7c5d2ba81768e269d40fa9a01f1256ac7c848e096a98a8a7625924a", + "expected_nonce_u64": 2, + "user_pubkey_hex": "1ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c6678424" + }, + "mutations": [ + { + "id": "withdraw-composite-02-swap-eq-rng", + "op": "swap_fields", + "target": "payload.equality_proof_data_hex", + "params": { + "with": "payload.range_proof_data_hex" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "withdraw-composite-02-nonce", + "op": "replace_field", + "target": "binding.expected_nonce_u64", + "params": { + "value_u64": 3 + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "withdraw-composite-02-pk-u", + "op": "bitflip", + "target": "binding.user_pubkey_hex", + "params": { + "value_hex": "1bda8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c6678424" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "withdraw-composite-02-eq-trunc", + "op": "truncate", + "target": "payload.equality_proof_data_hex", + "params": { + "value_hex": "1ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c66784241e094a7db00b615ef236719fa2160f2ccef7dda4a3920420c995741356416b65de908173d7c5d2ba81768e269d40fa9a01f1256ac7c848e096a98a8a7625924ad64cb89601298f7e092b751c0f61d23b21f213d42d6e1133dc8b34ecc07c827f02000000000000005689226d58a399c78c5339f062f51d6958016c9ff4304278f97bf7467181a10ff8c25fb2898aeea28140f35fab658f69a294da06176b9ca3b42975180103cc51eef9862c8d6dc93747d9e2ebe80dfb9f31f77da9cc39e1549aeffdb797d948557ca8c4c0c37439a00803c5a39c859ce7e2851a78f828d2f05cf8c6b0df781a0477d60a6ee42bfac196f9c2be65629f831a7dd3980d495d51c3a7c9150c6ded04f1e0200c4a4f950ad1739fbf7a65cc0324aeffe49a637baa310a4e221be7" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "withdraw-composite-02-h0", + "op": "replace_field", + "target": "binding.ciphertext_handle_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "handle mismatch" + } + ] + }, + { + "id": "withdraw-range-03", + "family": "withdraw_range", + "expected_valid": true, + "payload": { + "proof_data_hex": "fc8d266cab7e55456039be7dbc582f24d057dc5b2461c419acd51c0ea640ae5a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000500000000000000bc102d03d79b52619082709e593ee099b0c668fad0b7927deb993c7138f90b48d457239a4047f3564fd4937894b91656aac5d4fd16b473faeeb641f1633e6f0c36cb68fa648bc5b09783f777586c78a76c9c3eb48a5455b607e737d2a08433011aff5f2f003a8170545fe4deb3944d2e3f1f6524b82f8de212960fb9e7ca3058f4860390b8d00e2b71feb38a3f66dd96ca1d8a68adf28c410bfc4b564da8920a52908bdbed3ef763696da10e68e911fc79891b5d85adb8b967d6b76b27a7d70381e9352fc35f8253403d19d0458f965142537e141b26036e77afbf6c45fba40aac2b3d763a85c28ae88a58a0ed2abb1ca1712af474baef9924252ab1d5899e0718a66f04096f54ca8e2b0956026e5d7c06bb241a813838d00bbde71b6129744420074708fe35b028c55214fcb63d9b5d9b416bbd709705d3578bd26cf8e0b9362ececb8bda766c7158eb1374e52b163206f73c4071b99e8521dbd6c5a7c36c050e6a41ecd15ad46f14e26285090393cc991b55be3e0b930903aa21931556973998d950accaf9f456a07e67fd31dcb119d7922eb899b1229545e57a275219750950afbebf352d006850025a9acfccff025862007a191571ecf9717fdc504d155e7c13c58de6e65434c4152713f68b5f78edfef9cc326610d68d14fb482037d718d4d3980c35e2f712cb832592efd3d7634594f6c28aa10f2b1eb384d9c4a4997154c5b5ff76ca016503d7870930d22deb3fe57de992e955d1bdacd6d22c9b493da482df0f67fd0efb2f4c9361454474e94dcda5cf1c2cf8aab115cb280f09a646729ff46df046b23bcb553975e1ee72d4606dbb555972353fe2097223bc2ee84b1336018c443e3ec085d44e0c4f93b5dab33ba1bfb5b558be2a2ef88e7f3c6d0b02913b2d1b3ae99bf3d0e29dfc54230ac9e0b498dbc967c5288e23f50471be04" + }, + "mutations": [ + { + "id": "withdraw-range-03-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "fd8d266cab7e55456039be7dbc582f24d057dc5b2461c419acd51c0ea640ae5a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000500000000000000bc102d03d79b52619082709e593ee099b0c668fad0b7927deb993c7138f90b48d457239a4047f3564fd4937894b91656aac5d4fd16b473faeeb641f1633e6f0c36cb68fa648bc5b09783f777586c78a76c9c3eb48a5455b607e737d2a08433011aff5f2f003a8170545fe4deb3944d2e3f1f6524b82f8de212960fb9e7ca3058f4860390b8d00e2b71feb38a3f66dd96ca1d8a68adf28c410bfc4b564da8920a52908bdbed3ef763696da10e68e911fc79891b5d85adb8b967d6b76b27a7d70381e9352fc35f8253403d19d0458f965142537e141b26036e77afbf6c45fba40aac2b3d763a85c28ae88a58a0ed2abb1ca1712af474baef9924252ab1d5899e0718a66f04096f54ca8e2b0956026e5d7c06bb241a813838d00bbde71b6129744420074708fe35b028c55214fcb63d9b5d9b416bbd709705d3578bd26cf8e0b9362ececb8bda766c7158eb1374e52b163206f73c4071b99e8521dbd6c5a7c36c050e6a41ecd15ad46f14e26285090393cc991b55be3e0b930903aa21931556973998d950accaf9f456a07e67fd31dcb119d7922eb899b1229545e57a275219750950afbebf352d006850025a9acfccff025862007a191571ecf9717fdc504d155e7c13c58de6e65434c4152713f68b5f78edfef9cc326610d68d14fb482037d718d4d3980c35e2f712cb832592efd3d7634594f6c28aa10f2b1eb384d9c4a4997154c5b5ff76ca016503d7870930d22deb3fe57de992e955d1bdacd6d22c9b493da482df0f67fd0efb2f4c9361454474e94dcda5cf1c2cf8aab115cb280f09a646729ff46df046b23bcb553975e1ee72d4606dbb555972353fe2097223bc2ee84b1336018c443e3ec085d44e0c4f93b5dab33ba1bfb5b558be2a2ef88e7f3c6d0b02913b2d1b3ae99bf3d0e29dfc54230ac9e0b498dbc967c5288e23f50471be04" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "withdraw-range-03-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "fc8d266cab7e55456039be7dbc582f24d057dc5b2461c419acd51c0ea640ae5a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000500000000000000bc102d03d79b52619082709e593ee099b0c668fad0b7927deb993c7138f90b48d457239a4047f3564fd4937894b91656aac5d4fd16b473faeeb641f1633e6f0c36cb68fa648bc5b09783f777586c78a76c9c3eb48a5455b607e737d2a08433011aff5f2f003a8170545fe4deb3944d2e3f1f6524b82f8de212960fb9e7ca3058f4860390b8d00e2b71feb38a3f66dd96ca1d8a68adf28c410bfc4b564da8920a52908bdbed3ef763696da10e68e911fc79891b5d85adb8b967d6b76b27a7d70381e9352fc35f8253403d19d0458f965142537e141b26036e77afbf6c45fba40aac2b3d763a85c28ae88a58a0ed2abb1ca1712af474baef9924252ab1d5899e0718a66f04096f54ca8e2b0956026e5d7c06bb241a813838d00bbde71b6129744420074708fe35b028c55214fcb63d9b5d9b416bbd709705d3578bd26cf8e0b9362ececb8bda766c7158eb1374e52b163206f73c4071b99e8521dbd6c5a7c36c050e6a41ecd15ad46f14e26285090393cc991b55be3e0b930903aa21931556973998d950accaf9f456a07e67fd31dcb119d7922eb899b1229545e57a275219750950afbebf352d006850025a9acfccff025862007a191571ecf9717fdc504d155e7c13c58de6e65434c4152713f68b5f78edfef9cc326610d68d14fb482037d718d4d3980c35e2f712cb832592efd3d7634594f6c28aa10f2b1eb384d9c4a4997154c5b5ff76ca016503d7870930d22deb3fe57de992e955d1bdacd6d22c9b493da482df0f67fd0efb2f4c9361454474e94dcda5cf1c2cf8aab115cb280f09a646729ff46df046b23bcb553975e1ee72d4606dbb555972353fe2097223bc2ee84b1336018c443e3ec085d44e0c4f93b5dab33ba1bfb5b558be2a2ef88e7f3c6d0b02913b2d1b3ae99bf3d0e29dfc54230ac9e0b498dbc967c5288e23f50471" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "withdraw-range-03-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + }, + { + "id": "withdraw-range-03-bfN", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "fc8d266cab7e55456039be7dbc582f24d057dc5b2461c419acd51c0ea640ae5a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000500000000000000bc102d03d79b52619082709e593ee099b0c668fad0b7927deb993c7138f90b48d457239a4047f3564fd4937894b91656aac5d4fd16b473faeeb641f1633e6f0c36cb68fa648bc5b09783f777586c78a76c9c3eb48a5455b607e737d2a08433011aff5f2f003a8170545fe4deb3944d2e3f1f6524b82f8de212960fb9e7ca3058f4860390b8d00e2b71feb38a3f66dd96ca1d8a68adf28c410bfc4b564da8920a52908bdbed3ef763696da10e68e911fc79891b5d85adb8b967d6b76b27a7d70381e9352fc35f8253403d19d0458f965142537e141b26036e77afbf6c45fba40aac2b3d763a85c28ae88a58a0ed2abb1ca1712af474baef9924252ab1d5899e0718a66f04096f54ca8e2b0956026e5d7c06bb241a813838d00bbde71b6129744420074708fe35b028c55214fcb63d9b5d9b416bbd709705d3578bd26cf8e0b9362ececb8bda766c7158eb1374e52b163206f73c4071b99e8521dbd6c5a7c36c050e6a41ecd15ad46f14e26285090393cc991b55be3e0b930903aa21931556973998d950accaf9f456a07e67fd31dcb119d7922eb899b1229545e57a275219750950afbebf352d006850025a9acfccff025862007a191571ecf9717fdc504d155e7c13c58de6e65434c4152713f68b5f78edfef9cc326610d68d14fb482037d718d4d3980c35e2f712cb832592efd3d7634594f6c28aa10f2b1eb384d9c4a4997154c5b5ff76ca016503d7870930d22deb3fe57de992e955d1bdacd6d22c9b493da482df0f67fd0efb2f4c9361454474e94dcda5cf1c2cf8aab115cb280f09a646729ff46df046b23bcb553975e1ee72d4606dbb555972353fe2097223bc2ee84b1336018c443e3ec085d44e0c4f93b5dab33ba1bfb5b558be2a2ef88e7f3c6d0b02913b2d1b3ae99bf3d0e29dfc54230ac9e0b498dbc967c5288e23f50471be05" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + } + ] + }, + { + "id": "withdraw-composite-03", + "family": "withdraw_composite", + "expected_valid": true, + "payload": { + "equality_proof_data_hex": "36d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e3174ee9c491a45330ca8447c8c3b1e1b1e1c3e31e8e8e7187fedb1430896adf80587a7f13ab2b2da1f060be02eb4c9fcaca9bed78a05b802d02cfeb0a9e26563a19fc8d266cab7e55456039be7dbc582f24d057dc5b2461c419acd51c0ea640ae5a05000000000000000ed74ab32bfe88fd151ff9e74f655d935fa4d81209b3c993a14c084916de6940a2d7027b6a245eb23cfaae0418467d299597bc93676822d71518498413e65170c0d68103c0f8a81f385bb4d57ad30f7bd7fe75d1198c285148b835ed8ced4852776327907076f40a434bd8ac727a227f4fb4b87f7e81923175ed6e47db29dd0d27183517d89be6bbfea525adb2f8d1376decbb391c400c7dc5d239e42939d503bb09d1c0497b122ebd7c1929c3659fbc75f815703a49178df2212a4777d46008", + "range_proof_data_hex": "fc8d266cab7e55456039be7dbc582f24d057dc5b2461c419acd51c0ea640ae5a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000500000000000000bc102d03d79b52619082709e593ee099b0c668fad0b7927deb993c7138f90b48d457239a4047f3564fd4937894b91656aac5d4fd16b473faeeb641f1633e6f0c36cb68fa648bc5b09783f777586c78a76c9c3eb48a5455b607e737d2a08433011aff5f2f003a8170545fe4deb3944d2e3f1f6524b82f8de212960fb9e7ca3058f4860390b8d00e2b71feb38a3f66dd96ca1d8a68adf28c410bfc4b564da8920a52908bdbed3ef763696da10e68e911fc79891b5d85adb8b967d6b76b27a7d70381e9352fc35f8253403d19d0458f965142537e141b26036e77afbf6c45fba40aac2b3d763a85c28ae88a58a0ed2abb1ca1712af474baef9924252ab1d5899e0718a66f04096f54ca8e2b0956026e5d7c06bb241a813838d00bbde71b6129744420074708fe35b028c55214fcb63d9b5d9b416bbd709705d3578bd26cf8e0b9362ececb8bda766c7158eb1374e52b163206f73c4071b99e8521dbd6c5a7c36c050e6a41ecd15ad46f14e26285090393cc991b55be3e0b930903aa21931556973998d950accaf9f456a07e67fd31dcb119d7922eb899b1229545e57a275219750950afbebf352d006850025a9acfccff025862007a191571ecf9717fdc504d155e7c13c58de6e65434c4152713f68b5f78edfef9cc326610d68d14fb482037d718d4d3980c35e2f712cb832592efd3d7634594f6c28aa10f2b1eb384d9c4a4997154c5b5ff76ca016503d7870930d22deb3fe57de992e955d1bdacd6d22c9b493da482df0f67fd0efb2f4c9361454474e94dcda5cf1c2cf8aab115cb280f09a646729ff46df046b23bcb553975e1ee72d4606dbb555972353fe2097223bc2ee84b1336018c443e3ec085d44e0c4f93b5dab33ba1bfb5b558be2a2ef88e7f3c6d0b02913b2d1b3ae99bf3d0e29dfc54230ac9e0b498dbc967c5288e23f50471be04" + }, + "binding": { + "ciphertext_commitment_hex": "4ee9c491a45330ca8447c8c3b1e1b1e1c3e31e8e8e7187fedb1430896adf8058", + "ciphertext_handle_hex": "7a7f13ab2b2da1f060be02eb4c9fcaca9bed78a05b802d02cfeb0a9e26563a19", + "expected_nonce_u64": 5, + "user_pubkey_hex": "36d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317" + }, + "mutations": [ + { + "id": "withdraw-composite-03-swap-eq-rng", + "op": "swap_fields", + "target": "payload.equality_proof_data_hex", + "params": { + "with": "payload.range_proof_data_hex" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "withdraw-composite-03-nonce", + "op": "replace_field", + "target": "binding.expected_nonce_u64", + "params": { + "value_u64": 4 + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "withdraw-composite-03-pk-u", + "op": "bitflip", + "target": "binding.user_pubkey_hex", + "params": { + "value_hex": "37d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "withdraw-composite-03-eq-trunc", + "op": "truncate", + "target": "payload.equality_proof_data_hex", + "params": { + "value_hex": "36d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e3174ee9c491a45330ca8447c8c3b1e1b1e1c3e31e8e8e7187fedb1430896adf80587a7f13ab2b2da1f060be02eb4c9fcaca9bed78a05b802d02cfeb0a9e26563a19fc8d266cab7e55456039be7dbc582f24d057dc5b2461c419acd51c0ea640ae5a05000000000000000ed74ab32bfe88fd151ff9e74f655d935fa4d81209b3c993a14c084916de6940a2d7027b6a245eb23cfaae0418467d299597bc93676822d71518498413e65170c0d68103c0f8a81f385bb4d57ad30f7bd7fe75d1198c285148b835ed8ced4852776327907076f40a434bd8ac727a227f4fb4b87f7e81923175ed6e47db29dd0d27183517d89be6bbfea525adb2f8d1376decbb391c400c7dc5d239e42939d503bb09d1c0497b122ebd7c1929c3659fbc75f815703a49178df2212a4777d4" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "withdraw-composite-03-h0", + "op": "replace_field", + "target": "binding.ciphertext_handle_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "handle mismatch" + } + ] + }, + { + "id": "withdraw-range-04", + "family": "withdraw_range", + "expected_valid": true, + "payload": { + "proof_data_hex": "aa9b0bf46d3d88372806dea1bc8f04f031c42753d0f41137f40e3b9f403afc470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000013000000000000004825cf1cf7fda9b07c5e31f3523330eb34088ea129cc7a70ce6f143017261b765ef97df969659664695ac42bedc1b0bc852026a00942e43cfce6021acfed82350c189b9a79ba802fe38fbcd13099d70d1b54e97b0ec36c017a93e2a7bf349042f21c8b70b1ebda65a0386c2939c49e24182777a9d2ddd7808c36a5181b821346a32ceb9418db29c4471e6dfe0307ca9e4c3f04601f1d39513440c3927be4950b2daf6bdc59bf519f7ed234dd49386ec529f0fa5b775f7da39b0d82a52c51fe0d5f3cd9be8357a074dfef74c14e45d8c8979e92f09f5655e883da9a2f3d0dbf0d20f32340fd56e368ad4011f4ecbec9f22579ba85efffd564b9b27d27d9700965f2ed105016893b0fe76047a4f44740293476f64f0ecd3c1e3bf38aef9e59904af8b31ce61d3f162dda70ce78496f24b68fc8f225707a67d0bd2b6d13ea56f1066408884baa2802935da295a83be37ae89bbae08a517784307bb5b9cb9edabe192aeb28663fc206ec4cefdd8e1e615eb40bc03137ab5fd90f5544c4d2e3241063c4192cc1990bade70a75846b0551ecfaa30de4ad708d72c177d482dad166b71b16a2336ee28f3e7906eb3bd37512cd566d301c900e9526ca5d0a3464ff0d061afa25546744b61da40c796954a8b7c5b42ea2ef9140c67ee8f2adfded81501d6768d04d1a2dd02c0ff3d69b4aa8f62bddb972e7d31c66f01e57c033d2dd58a409908363a64b52b8627ab290f0f52710f79ee9218feb6fb5d0613e76a103c6483d6a402ec59254909f74e20fe28b6ae181de12eeed18c562c8614ea9fdb084fa2ea814bb03180dfe4be27c04f327458cec7a483653942ef05710f8ce892bea0e7726e89b9ff67af74182ab5fb9c86f87daef6c929baefbba7c796edd1a67e60b09e57f6d7f2b73d5ab25869e9f8a770783b70180d9d8609b246cba30b7a36f5506" + }, + "mutations": [ + { + "id": "withdraw-range-04-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "ab9b0bf46d3d88372806dea1bc8f04f031c42753d0f41137f40e3b9f403afc470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000013000000000000004825cf1cf7fda9b07c5e31f3523330eb34088ea129cc7a70ce6f143017261b765ef97df969659664695ac42bedc1b0bc852026a00942e43cfce6021acfed82350c189b9a79ba802fe38fbcd13099d70d1b54e97b0ec36c017a93e2a7bf349042f21c8b70b1ebda65a0386c2939c49e24182777a9d2ddd7808c36a5181b821346a32ceb9418db29c4471e6dfe0307ca9e4c3f04601f1d39513440c3927be4950b2daf6bdc59bf519f7ed234dd49386ec529f0fa5b775f7da39b0d82a52c51fe0d5f3cd9be8357a074dfef74c14e45d8c8979e92f09f5655e883da9a2f3d0dbf0d20f32340fd56e368ad4011f4ecbec9f22579ba85efffd564b9b27d27d9700965f2ed105016893b0fe76047a4f44740293476f64f0ecd3c1e3bf38aef9e59904af8b31ce61d3f162dda70ce78496f24b68fc8f225707a67d0bd2b6d13ea56f1066408884baa2802935da295a83be37ae89bbae08a517784307bb5b9cb9edabe192aeb28663fc206ec4cefdd8e1e615eb40bc03137ab5fd90f5544c4d2e3241063c4192cc1990bade70a75846b0551ecfaa30de4ad708d72c177d482dad166b71b16a2336ee28f3e7906eb3bd37512cd566d301c900e9526ca5d0a3464ff0d061afa25546744b61da40c796954a8b7c5b42ea2ef9140c67ee8f2adfded81501d6768d04d1a2dd02c0ff3d69b4aa8f62bddb972e7d31c66f01e57c033d2dd58a409908363a64b52b8627ab290f0f52710f79ee9218feb6fb5d0613e76a103c6483d6a402ec59254909f74e20fe28b6ae181de12eeed18c562c8614ea9fdb084fa2ea814bb03180dfe4be27c04f327458cec7a483653942ef05710f8ce892bea0e7726e89b9ff67af74182ab5fb9c86f87daef6c929baefbba7c796edd1a67e60b09e57f6d7f2b73d5ab25869e9f8a770783b70180d9d8609b246cba30b7a36f5506" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "withdraw-range-04-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "aa9b0bf46d3d88372806dea1bc8f04f031c42753d0f41137f40e3b9f403afc470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000013000000000000004825cf1cf7fda9b07c5e31f3523330eb34088ea129cc7a70ce6f143017261b765ef97df969659664695ac42bedc1b0bc852026a00942e43cfce6021acfed82350c189b9a79ba802fe38fbcd13099d70d1b54e97b0ec36c017a93e2a7bf349042f21c8b70b1ebda65a0386c2939c49e24182777a9d2ddd7808c36a5181b821346a32ceb9418db29c4471e6dfe0307ca9e4c3f04601f1d39513440c3927be4950b2daf6bdc59bf519f7ed234dd49386ec529f0fa5b775f7da39b0d82a52c51fe0d5f3cd9be8357a074dfef74c14e45d8c8979e92f09f5655e883da9a2f3d0dbf0d20f32340fd56e368ad4011f4ecbec9f22579ba85efffd564b9b27d27d9700965f2ed105016893b0fe76047a4f44740293476f64f0ecd3c1e3bf38aef9e59904af8b31ce61d3f162dda70ce78496f24b68fc8f225707a67d0bd2b6d13ea56f1066408884baa2802935da295a83be37ae89bbae08a517784307bb5b9cb9edabe192aeb28663fc206ec4cefdd8e1e615eb40bc03137ab5fd90f5544c4d2e3241063c4192cc1990bade70a75846b0551ecfaa30de4ad708d72c177d482dad166b71b16a2336ee28f3e7906eb3bd37512cd566d301c900e9526ca5d0a3464ff0d061afa25546744b61da40c796954a8b7c5b42ea2ef9140c67ee8f2adfded81501d6768d04d1a2dd02c0ff3d69b4aa8f62bddb972e7d31c66f01e57c033d2dd58a409908363a64b52b8627ab290f0f52710f79ee9218feb6fb5d0613e76a103c6483d6a402ec59254909f74e20fe28b6ae181de12eeed18c562c8614ea9fdb084fa2ea814bb03180dfe4be27c04f327458cec7a483653942ef05710f8ce892bea0e7726e89b9ff67af74182ab5fb9c86f87daef6c929baefbba7c796edd1a67e60b09e57f6d7f2b73d5ab25869e9f8a770783b70180d9d8609b246cba30b7a36f" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "withdraw-range-04-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + }, + { + "id": "withdraw-range-04-bfN", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "aa9b0bf46d3d88372806dea1bc8f04f031c42753d0f41137f40e3b9f403afc470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000013000000000000004825cf1cf7fda9b07c5e31f3523330eb34088ea129cc7a70ce6f143017261b765ef97df969659664695ac42bedc1b0bc852026a00942e43cfce6021acfed82350c189b9a79ba802fe38fbcd13099d70d1b54e97b0ec36c017a93e2a7bf349042f21c8b70b1ebda65a0386c2939c49e24182777a9d2ddd7808c36a5181b821346a32ceb9418db29c4471e6dfe0307ca9e4c3f04601f1d39513440c3927be4950b2daf6bdc59bf519f7ed234dd49386ec529f0fa5b775f7da39b0d82a52c51fe0d5f3cd9be8357a074dfef74c14e45d8c8979e92f09f5655e883da9a2f3d0dbf0d20f32340fd56e368ad4011f4ecbec9f22579ba85efffd564b9b27d27d9700965f2ed105016893b0fe76047a4f44740293476f64f0ecd3c1e3bf38aef9e59904af8b31ce61d3f162dda70ce78496f24b68fc8f225707a67d0bd2b6d13ea56f1066408884baa2802935da295a83be37ae89bbae08a517784307bb5b9cb9edabe192aeb28663fc206ec4cefdd8e1e615eb40bc03137ab5fd90f5544c4d2e3241063c4192cc1990bade70a75846b0551ecfaa30de4ad708d72c177d482dad166b71b16a2336ee28f3e7906eb3bd37512cd566d301c900e9526ca5d0a3464ff0d061afa25546744b61da40c796954a8b7c5b42ea2ef9140c67ee8f2adfded81501d6768d04d1a2dd02c0ff3d69b4aa8f62bddb972e7d31c66f01e57c033d2dd58a409908363a64b52b8627ab290f0f52710f79ee9218feb6fb5d0613e76a103c6483d6a402ec59254909f74e20fe28b6ae181de12eeed18c562c8614ea9fdb084fa2ea814bb03180dfe4be27c04f327458cec7a483653942ef05710f8ce892bea0e7726e89b9ff67af74182ab5fb9c86f87daef6c929baefbba7c796edd1a67e60b09e57f6d7f2b73d5ab25869e9f8a770783b70180d9d8609b246cba30b7a36f5507" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + } + ] + }, + { + "id": "withdraw-composite-04", + "family": "withdraw_composite", + "expected_valid": true, + "payload": { + "equality_proof_data_hex": "f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a76386d0a32762487a234e5305cc5d1bcdad2cd7c56984d80349d27936722b112601870b78302596be0d48ee190d4a84b21449e7a3016c82373a8530ec936897f56aa9b0bf46d3d88372806dea1bc8f04f031c42753d0f41137f40e3b9f403afc4713000000000000006ea3d669961e8041e5dce661a33a55e54f04093bbb430da98d2ac11418e90a6ac801255c7d933466e4d34cb797eb00c1c59b0762f89fe5ba9d1bf5cd91cb8f382e593d81568340de79ceaf548ab484c540ba71267e94bfbe5142ae3aa56f76130963a9cf8df5bc005357fffc6fbfaceba256e1be78fecae4333dadc65ecc110f1b7a6a7b2f08b231d76544e4626c9777f8881e7ca591b8fb60dcc97c8ca6d0037975a887164aeb27cbc1608eea98b3fa3bbabd819c4460958e39d422f3861d00", + "range_proof_data_hex": "aa9b0bf46d3d88372806dea1bc8f04f031c42753d0f41137f40e3b9f403afc470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000013000000000000004825cf1cf7fda9b07c5e31f3523330eb34088ea129cc7a70ce6f143017261b765ef97df969659664695ac42bedc1b0bc852026a00942e43cfce6021acfed82350c189b9a79ba802fe38fbcd13099d70d1b54e97b0ec36c017a93e2a7bf349042f21c8b70b1ebda65a0386c2939c49e24182777a9d2ddd7808c36a5181b821346a32ceb9418db29c4471e6dfe0307ca9e4c3f04601f1d39513440c3927be4950b2daf6bdc59bf519f7ed234dd49386ec529f0fa5b775f7da39b0d82a52c51fe0d5f3cd9be8357a074dfef74c14e45d8c8979e92f09f5655e883da9a2f3d0dbf0d20f32340fd56e368ad4011f4ecbec9f22579ba85efffd564b9b27d27d9700965f2ed105016893b0fe76047a4f44740293476f64f0ecd3c1e3bf38aef9e59904af8b31ce61d3f162dda70ce78496f24b68fc8f225707a67d0bd2b6d13ea56f1066408884baa2802935da295a83be37ae89bbae08a517784307bb5b9cb9edabe192aeb28663fc206ec4cefdd8e1e615eb40bc03137ab5fd90f5544c4d2e3241063c4192cc1990bade70a75846b0551ecfaa30de4ad708d72c177d482dad166b71b16a2336ee28f3e7906eb3bd37512cd566d301c900e9526ca5d0a3464ff0d061afa25546744b61da40c796954a8b7c5b42ea2ef9140c67ee8f2adfded81501d6768d04d1a2dd02c0ff3d69b4aa8f62bddb972e7d31c66f01e57c033d2dd58a409908363a64b52b8627ab290f0f52710f79ee9218feb6fb5d0613e76a103c6483d6a402ec59254909f74e20fe28b6ae181de12eeed18c562c8614ea9fdb084fa2ea814bb03180dfe4be27c04f327458cec7a483653942ef05710f8ce892bea0e7726e89b9ff67af74182ab5fb9c86f87daef6c929baefbba7c796edd1a67e60b09e57f6d7f2b73d5ab25869e9f8a770783b70180d9d8609b246cba30b7a36f5506" + }, + "binding": { + "ciphertext_commitment_hex": "386d0a32762487a234e5305cc5d1bcdad2cd7c56984d80349d27936722b11260", + "ciphertext_handle_hex": "1870b78302596be0d48ee190d4a84b21449e7a3016c82373a8530ec936897f56", + "expected_nonce_u64": 19, + "user_pubkey_hex": "f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a76" + }, + "mutations": [ + { + "id": "withdraw-composite-04-swap-eq-rng", + "op": "swap_fields", + "target": "payload.equality_proof_data_hex", + "params": { + "with": "payload.range_proof_data_hex" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "withdraw-composite-04-nonce", + "op": "replace_field", + "target": "binding.expected_nonce_u64", + "params": { + "value_u64": 18 + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "withdraw-composite-04-pk-u", + "op": "bitflip", + "target": "binding.user_pubkey_hex", + "params": { + "value_hex": "f95e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a76" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "withdraw-composite-04-eq-trunc", + "op": "truncate", + "target": "payload.equality_proof_data_hex", + "params": { + "value_hex": "f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a76386d0a32762487a234e5305cc5d1bcdad2cd7c56984d80349d27936722b112601870b78302596be0d48ee190d4a84b21449e7a3016c82373a8530ec936897f56aa9b0bf46d3d88372806dea1bc8f04f031c42753d0f41137f40e3b9f403afc4713000000000000006ea3d669961e8041e5dce661a33a55e54f04093bbb430da98d2ac11418e90a6ac801255c7d933466e4d34cb797eb00c1c59b0762f89fe5ba9d1bf5cd91cb8f382e593d81568340de79ceaf548ab484c540ba71267e94bfbe5142ae3aa56f76130963a9cf8df5bc005357fffc6fbfaceba256e1be78fecae4333dadc65ecc110f1b7a6a7b2f08b231d76544e4626c9777f8881e7ca591b8fb60dcc97c8ca6d0037975a887164aeb27cbc1608eea98b3fa3bbabd819c4460958e39d422f386" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "withdraw-composite-04-h0", + "op": "replace_field", + "target": "binding.ciphertext_handle_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "handle mismatch" + } + ] + }, + { + "id": "withdraw-range-05", + "family": "withdraw_range", + "expected_valid": true, + "payload": { + "proof_data_hex": "daf6b85b7d9173a3cb33f923cb6da69fc74276fec78a8ef6aac30e723be07156000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100010000000000dcb115507afdd3baf0347fb8de810c66393f569dc88610609fc17e944145c11a601a343741a68462549db59023b6125bc152bdded2f0c04ffe4e3a4eba2c0a107af546637619f572bcc9e7d9ca66f2aca4d3359f3d182ba1cb76986cc3c1785d8820e5a91d3821357680bc77d2e448e00e1840edec51c3fb0dfd685bbb87ae2b1502b93e04051f572bc96430ad0633db3016518882d851c66102515248ee8706d79a69771903712c9286b005baf511fa7c1345428cb56742442c8a9d4568cf0f0ec3480e24b2a4d4316c407cd7e8f00d09080b5c3fcf796ae6ff6d1c30c9720c404c525b65bd7c4f12b9671b0d784eafeb61fe0f894ca67344336035b569161b3ce7e246ff44306ea71884de8b1d40ea21e61250510f9c4bba3f8e3d8537002b98eb882ff94a342e3ce9de6101ec6f32c282987ca39afcfd3f1949d0d6c4b65b08a174bb5259771c9e90d0a246a8c78ae2e20421c62046fb2c57d4625d9162449ade9f2b2234867623040e146c90a3ddd4a28cfad7c06ac455adec9a5a4e3a7aa68476f06462f54f2f05e0b8da117024b6aac1eed04a46507af8eaccd7a18c2406b1a52b6a33f5e7f9de6461e6defa2b6753cb1ca1d66b97d2d9a659b2f67b15b85bc186572839ca7fce150d4fb94abd62d2af9e27c33b329d868d303826cc7566a00db967044c5b279be33bafdf2d4a8af11a402bee57457eb8f61f7592103af895f4bea63bd095c80583f4f8175b1e09fa5fe98de30d71891756902b6f0718ea90a8d06a500157dcc43e58dbc06c3ddc0b5c6122c04a787c62b87d3cf2ce000a25425fac59760e9ae31dba8c716a429c4a2f3a2fede5fe9b381ea56e89bc3875529e4975373bf9d3a2528f7267eeda2401a0b2c1c37fcef26b38e4ec84680d2601e68a826d35048d97211d85309d3d3e52c1a6d73c410041fb0d8b0e15c70f" + }, + "mutations": [ + { + "id": "withdraw-range-05-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "dbf6b85b7d9173a3cb33f923cb6da69fc74276fec78a8ef6aac30e723be07156000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100010000000000dcb115507afdd3baf0347fb8de810c66393f569dc88610609fc17e944145c11a601a343741a68462549db59023b6125bc152bdded2f0c04ffe4e3a4eba2c0a107af546637619f572bcc9e7d9ca66f2aca4d3359f3d182ba1cb76986cc3c1785d8820e5a91d3821357680bc77d2e448e00e1840edec51c3fb0dfd685bbb87ae2b1502b93e04051f572bc96430ad0633db3016518882d851c66102515248ee8706d79a69771903712c9286b005baf511fa7c1345428cb56742442c8a9d4568cf0f0ec3480e24b2a4d4316c407cd7e8f00d09080b5c3fcf796ae6ff6d1c30c9720c404c525b65bd7c4f12b9671b0d784eafeb61fe0f894ca67344336035b569161b3ce7e246ff44306ea71884de8b1d40ea21e61250510f9c4bba3f8e3d8537002b98eb882ff94a342e3ce9de6101ec6f32c282987ca39afcfd3f1949d0d6c4b65b08a174bb5259771c9e90d0a246a8c78ae2e20421c62046fb2c57d4625d9162449ade9f2b2234867623040e146c90a3ddd4a28cfad7c06ac455adec9a5a4e3a7aa68476f06462f54f2f05e0b8da117024b6aac1eed04a46507af8eaccd7a18c2406b1a52b6a33f5e7f9de6461e6defa2b6753cb1ca1d66b97d2d9a659b2f67b15b85bc186572839ca7fce150d4fb94abd62d2af9e27c33b329d868d303826cc7566a00db967044c5b279be33bafdf2d4a8af11a402bee57457eb8f61f7592103af895f4bea63bd095c80583f4f8175b1e09fa5fe98de30d71891756902b6f0718ea90a8d06a500157dcc43e58dbc06c3ddc0b5c6122c04a787c62b87d3cf2ce000a25425fac59760e9ae31dba8c716a429c4a2f3a2fede5fe9b381ea56e89bc3875529e4975373bf9d3a2528f7267eeda2401a0b2c1c37fcef26b38e4ec84680d2601e68a826d35048d97211d85309d3d3e52c1a6d73c410041fb0d8b0e15c70f" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "withdraw-range-05-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "daf6b85b7d9173a3cb33f923cb6da69fc74276fec78a8ef6aac30e723be07156000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100010000000000dcb115507afdd3baf0347fb8de810c66393f569dc88610609fc17e944145c11a601a343741a68462549db59023b6125bc152bdded2f0c04ffe4e3a4eba2c0a107af546637619f572bcc9e7d9ca66f2aca4d3359f3d182ba1cb76986cc3c1785d8820e5a91d3821357680bc77d2e448e00e1840edec51c3fb0dfd685bbb87ae2b1502b93e04051f572bc96430ad0633db3016518882d851c66102515248ee8706d79a69771903712c9286b005baf511fa7c1345428cb56742442c8a9d4568cf0f0ec3480e24b2a4d4316c407cd7e8f00d09080b5c3fcf796ae6ff6d1c30c9720c404c525b65bd7c4f12b9671b0d784eafeb61fe0f894ca67344336035b569161b3ce7e246ff44306ea71884de8b1d40ea21e61250510f9c4bba3f8e3d8537002b98eb882ff94a342e3ce9de6101ec6f32c282987ca39afcfd3f1949d0d6c4b65b08a174bb5259771c9e90d0a246a8c78ae2e20421c62046fb2c57d4625d9162449ade9f2b2234867623040e146c90a3ddd4a28cfad7c06ac455adec9a5a4e3a7aa68476f06462f54f2f05e0b8da117024b6aac1eed04a46507af8eaccd7a18c2406b1a52b6a33f5e7f9de6461e6defa2b6753cb1ca1d66b97d2d9a659b2f67b15b85bc186572839ca7fce150d4fb94abd62d2af9e27c33b329d868d303826cc7566a00db967044c5b279be33bafdf2d4a8af11a402bee57457eb8f61f7592103af895f4bea63bd095c80583f4f8175b1e09fa5fe98de30d71891756902b6f0718ea90a8d06a500157dcc43e58dbc06c3ddc0b5c6122c04a787c62b87d3cf2ce000a25425fac59760e9ae31dba8c716a429c4a2f3a2fede5fe9b381ea56e89bc3875529e4975373bf9d3a2528f7267eeda2401a0b2c1c37fcef26b38e4ec84680d2601e68a826d35048d97211d85309d3d3e52c1a6d73c410041fb0d8b0e15" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "withdraw-range-05-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + }, + { + "id": "withdraw-range-05-bfN", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "daf6b85b7d9173a3cb33f923cb6da69fc74276fec78a8ef6aac30e723be07156000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100010000000000dcb115507afdd3baf0347fb8de810c66393f569dc88610609fc17e944145c11a601a343741a68462549db59023b6125bc152bdded2f0c04ffe4e3a4eba2c0a107af546637619f572bcc9e7d9ca66f2aca4d3359f3d182ba1cb76986cc3c1785d8820e5a91d3821357680bc77d2e448e00e1840edec51c3fb0dfd685bbb87ae2b1502b93e04051f572bc96430ad0633db3016518882d851c66102515248ee8706d79a69771903712c9286b005baf511fa7c1345428cb56742442c8a9d4568cf0f0ec3480e24b2a4d4316c407cd7e8f00d09080b5c3fcf796ae6ff6d1c30c9720c404c525b65bd7c4f12b9671b0d784eafeb61fe0f894ca67344336035b569161b3ce7e246ff44306ea71884de8b1d40ea21e61250510f9c4bba3f8e3d8537002b98eb882ff94a342e3ce9de6101ec6f32c282987ca39afcfd3f1949d0d6c4b65b08a174bb5259771c9e90d0a246a8c78ae2e20421c62046fb2c57d4625d9162449ade9f2b2234867623040e146c90a3ddd4a28cfad7c06ac455adec9a5a4e3a7aa68476f06462f54f2f05e0b8da117024b6aac1eed04a46507af8eaccd7a18c2406b1a52b6a33f5e7f9de6461e6defa2b6753cb1ca1d66b97d2d9a659b2f67b15b85bc186572839ca7fce150d4fb94abd62d2af9e27c33b329d868d303826cc7566a00db967044c5b279be33bafdf2d4a8af11a402bee57457eb8f61f7592103af895f4bea63bd095c80583f4f8175b1e09fa5fe98de30d71891756902b6f0718ea90a8d06a500157dcc43e58dbc06c3ddc0b5c6122c04a787c62b87d3cf2ce000a25425fac59760e9ae31dba8c716a429c4a2f3a2fede5fe9b381ea56e89bc3875529e4975373bf9d3a2528f7267eeda2401a0b2c1c37fcef26b38e4ec84680d2601e68a826d35048d97211d85309d3d3e52c1a6d73c410041fb0d8b0e15c70e" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + } + ] + }, + { + "id": "withdraw-composite-05", + "family": "withdraw_composite", + "expected_valid": true, + "payload": { + "equality_proof_data_hex": "30943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de62146e179d05cb4a48da5a4e4fff76ffbb088647694e394b1610c25c92ebc72ac1277cf07a72b9ca39a89968d2b31bd8bb1d95e02d8989569e1b1b33572cf4111135daf6b85b7d9173a3cb33f923cb6da69fc74276fec78a8ef6aac30e723be071560100010000000000fad6d58493e75df68c80373c5ea92bb6990522f972467989f385df7e1f551108ea442bcf11501bd427a2af6f8a58479c296fed6910c76c40d7db933a1a3a3b13a628794838b8df2f1664387635866ad14092fd92c27a136a8a2ebc38d8ea655c2cc09353492bbd37cc5e360a62c06da3822c9f5742ca31211ad18923d185ab022b66f57eb7a205e6df7c837cbe79da383ab3186bbc61ec575e6b41fdf9a2ac0384b03c382746d8977386e9528d2698f30f2c27999232d120bf1a9d3ca4913803", + "range_proof_data_hex": "daf6b85b7d9173a3cb33f923cb6da69fc74276fec78a8ef6aac30e723be07156000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100010000000000dcb115507afdd3baf0347fb8de810c66393f569dc88610609fc17e944145c11a601a343741a68462549db59023b6125bc152bdded2f0c04ffe4e3a4eba2c0a107af546637619f572bcc9e7d9ca66f2aca4d3359f3d182ba1cb76986cc3c1785d8820e5a91d3821357680bc77d2e448e00e1840edec51c3fb0dfd685bbb87ae2b1502b93e04051f572bc96430ad0633db3016518882d851c66102515248ee8706d79a69771903712c9286b005baf511fa7c1345428cb56742442c8a9d4568cf0f0ec3480e24b2a4d4316c407cd7e8f00d09080b5c3fcf796ae6ff6d1c30c9720c404c525b65bd7c4f12b9671b0d784eafeb61fe0f894ca67344336035b569161b3ce7e246ff44306ea71884de8b1d40ea21e61250510f9c4bba3f8e3d8537002b98eb882ff94a342e3ce9de6101ec6f32c282987ca39afcfd3f1949d0d6c4b65b08a174bb5259771c9e90d0a246a8c78ae2e20421c62046fb2c57d4625d9162449ade9f2b2234867623040e146c90a3ddd4a28cfad7c06ac455adec9a5a4e3a7aa68476f06462f54f2f05e0b8da117024b6aac1eed04a46507af8eaccd7a18c2406b1a52b6a33f5e7f9de6461e6defa2b6753cb1ca1d66b97d2d9a659b2f67b15b85bc186572839ca7fce150d4fb94abd62d2af9e27c33b329d868d303826cc7566a00db967044c5b279be33bafdf2d4a8af11a402bee57457eb8f61f7592103af895f4bea63bd095c80583f4f8175b1e09fa5fe98de30d71891756902b6f0718ea90a8d06a500157dcc43e58dbc06c3ddc0b5c6122c04a787c62b87d3cf2ce000a25425fac59760e9ae31dba8c716a429c4a2f3a2fede5fe9b381ea56e89bc3875529e4975373bf9d3a2528f7267eeda2401a0b2c1c37fcef26b38e4ec84680d2601e68a826d35048d97211d85309d3d3e52c1a6d73c410041fb0d8b0e15c70f" + }, + "binding": { + "ciphertext_commitment_hex": "6e179d05cb4a48da5a4e4fff76ffbb088647694e394b1610c25c92ebc72ac127", + "ciphertext_handle_hex": "7cf07a72b9ca39a89968d2b31bd8bb1d95e02d8989569e1b1b33572cf4111135", + "expected_nonce_u64": 65537, + "user_pubkey_hex": "30943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214" + }, + "mutations": [ + { + "id": "withdraw-composite-05-swap-eq-rng", + "op": "swap_fields", + "target": "payload.equality_proof_data_hex", + "params": { + "with": "payload.range_proof_data_hex" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "withdraw-composite-05-nonce", + "op": "replace_field", + "target": "binding.expected_nonce_u64", + "params": { + "value_u64": 65536 + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "withdraw-composite-05-pk-u", + "op": "bitflip", + "target": "binding.user_pubkey_hex", + "params": { + "value_hex": "31943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "withdraw-composite-05-eq-trunc", + "op": "truncate", + "target": "payload.equality_proof_data_hex", + "params": { + "value_hex": "30943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de62146e179d05cb4a48da5a4e4fff76ffbb088647694e394b1610c25c92ebc72ac1277cf07a72b9ca39a89968d2b31bd8bb1d95e02d8989569e1b1b33572cf4111135daf6b85b7d9173a3cb33f923cb6da69fc74276fec78a8ef6aac30e723be071560100010000000000fad6d58493e75df68c80373c5ea92bb6990522f972467989f385df7e1f551108ea442bcf11501bd427a2af6f8a58479c296fed6910c76c40d7db933a1a3a3b13a628794838b8df2f1664387635866ad14092fd92c27a136a8a2ebc38d8ea655c2cc09353492bbd37cc5e360a62c06da3822c9f5742ca31211ad18923d185ab022b66f57eb7a205e6df7c837cbe79da383ab3186bbc61ec575e6b41fdf9a2ac0384b03c382746d8977386e9528d2698f30f2c27999232d120bf1a9d3ca491" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "withdraw-composite-05-h0", + "op": "replace_field", + "target": "binding.ciphertext_handle_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "handle mismatch" + } + ] + }, + { + "id": "withdraw-range-06", + "family": "withdraw_range", + "expected_valid": true, + "payload": { + "proof_data_hex": "6a1b0c293da2178f571ab7a0215d894bdba11c87679e72d59d503042c2ae33280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000043420f0000000000505ab3571594608ff266f49bf64b5d10d334b26ef34f2bc6231e960c341579374caf64ee398f5f425b0772524e8571f54a291ba0ec2910f93a1d28438d77d013debea25087da4deea666146e0a0c7b4b227a8f8ad10874586e51918f526fb26b045acd926aaa10df3f065be59bc5c444ee5a703234d9162b279209ed9f03546d7be6fe488aa7e2bf767f532457c72083ded90042db22346f60e6f217590e6d051b694075b6c1751cc647a0308a1d2fc9130e29e668b465cd94484ba31a06240aa47b7766b0439fa43f860fc1167469d5dbbc6fad8285ef696619e3f5024b310a208ea0ff4a6c44d23786aa3f43af26ad34ada5edb879f75f97250633aec28e637c9aaf6986909662070d3747de72c8cf04594ed21d6ff2f62cbf08aac20a8528a85231d873c91ffdfe5c196feff231dcacd24c31f998715d1967f42d5114b0486af08a3b9efeb0670bbcd8a2c52644aed881c9502db1ad3b740a16e3f981881028831ba5eb4e3ce6fff642d30a6ddb2ba84c700968a649bf4c58bf7ec7abd14cb68c66c7acfc7c6ad0fbc79706a4f0e66c63c6ea93aa6b9ddd89e0d4a1ba02249602fa7a5fbc568084c7c403210d797e206b45d70f1608d6da2423fae47eda31de3a7e9a96ba58e1d9b7a4a38121188b6d287191862fd64c218cfbaec149df0b502168248912a6d018f0d58026a1bcf4db75e22220cc3f760b3d53494a8c5e67dc2c62a68e8338ab5ace39eabf1ce73b1b95ccef2f90dd6361a7b0fee390222228adb7579e1bf7e310f9e1e07e7527190fe93a474eda521e9356b0cf723b12209412e7f765352669621c11b7d23f0c831cf35cd28e688d380b0b9ac2d8bf5176287cc5dbc33f528c63486df48b4b0a1467cb9743dc99d310662592c7927c2a0fed2301aa0b67c7cbed0b70b33032635fefe03bd448a8993212f38bf21533440c" + }, + "mutations": [ + { + "id": "withdraw-range-06-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "6b1b0c293da2178f571ab7a0215d894bdba11c87679e72d59d503042c2ae33280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000043420f0000000000505ab3571594608ff266f49bf64b5d10d334b26ef34f2bc6231e960c341579374caf64ee398f5f425b0772524e8571f54a291ba0ec2910f93a1d28438d77d013debea25087da4deea666146e0a0c7b4b227a8f8ad10874586e51918f526fb26b045acd926aaa10df3f065be59bc5c444ee5a703234d9162b279209ed9f03546d7be6fe488aa7e2bf767f532457c72083ded90042db22346f60e6f217590e6d051b694075b6c1751cc647a0308a1d2fc9130e29e668b465cd94484ba31a06240aa47b7766b0439fa43f860fc1167469d5dbbc6fad8285ef696619e3f5024b310a208ea0ff4a6c44d23786aa3f43af26ad34ada5edb879f75f97250633aec28e637c9aaf6986909662070d3747de72c8cf04594ed21d6ff2f62cbf08aac20a8528a85231d873c91ffdfe5c196feff231dcacd24c31f998715d1967f42d5114b0486af08a3b9efeb0670bbcd8a2c52644aed881c9502db1ad3b740a16e3f981881028831ba5eb4e3ce6fff642d30a6ddb2ba84c700968a649bf4c58bf7ec7abd14cb68c66c7acfc7c6ad0fbc79706a4f0e66c63c6ea93aa6b9ddd89e0d4a1ba02249602fa7a5fbc568084c7c403210d797e206b45d70f1608d6da2423fae47eda31de3a7e9a96ba58e1d9b7a4a38121188b6d287191862fd64c218cfbaec149df0b502168248912a6d018f0d58026a1bcf4db75e22220cc3f760b3d53494a8c5e67dc2c62a68e8338ab5ace39eabf1ce73b1b95ccef2f90dd6361a7b0fee390222228adb7579e1bf7e310f9e1e07e7527190fe93a474eda521e9356b0cf723b12209412e7f765352669621c11b7d23f0c831cf35cd28e688d380b0b9ac2d8bf5176287cc5dbc33f528c63486df48b4b0a1467cb9743dc99d310662592c7927c2a0fed2301aa0b67c7cbed0b70b33032635fefe03bd448a8993212f38bf21533440c" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "withdraw-range-06-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "6a1b0c293da2178f571ab7a0215d894bdba11c87679e72d59d503042c2ae33280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000043420f0000000000505ab3571594608ff266f49bf64b5d10d334b26ef34f2bc6231e960c341579374caf64ee398f5f425b0772524e8571f54a291ba0ec2910f93a1d28438d77d013debea25087da4deea666146e0a0c7b4b227a8f8ad10874586e51918f526fb26b045acd926aaa10df3f065be59bc5c444ee5a703234d9162b279209ed9f03546d7be6fe488aa7e2bf767f532457c72083ded90042db22346f60e6f217590e6d051b694075b6c1751cc647a0308a1d2fc9130e29e668b465cd94484ba31a06240aa47b7766b0439fa43f860fc1167469d5dbbc6fad8285ef696619e3f5024b310a208ea0ff4a6c44d23786aa3f43af26ad34ada5edb879f75f97250633aec28e637c9aaf6986909662070d3747de72c8cf04594ed21d6ff2f62cbf08aac20a8528a85231d873c91ffdfe5c196feff231dcacd24c31f998715d1967f42d5114b0486af08a3b9efeb0670bbcd8a2c52644aed881c9502db1ad3b740a16e3f981881028831ba5eb4e3ce6fff642d30a6ddb2ba84c700968a649bf4c58bf7ec7abd14cb68c66c7acfc7c6ad0fbc79706a4f0e66c63c6ea93aa6b9ddd89e0d4a1ba02249602fa7a5fbc568084c7c403210d797e206b45d70f1608d6da2423fae47eda31de3a7e9a96ba58e1d9b7a4a38121188b6d287191862fd64c218cfbaec149df0b502168248912a6d018f0d58026a1bcf4db75e22220cc3f760b3d53494a8c5e67dc2c62a68e8338ab5ace39eabf1ce73b1b95ccef2f90dd6361a7b0fee390222228adb7579e1bf7e310f9e1e07e7527190fe93a474eda521e9356b0cf723b12209412e7f765352669621c11b7d23f0c831cf35cd28e688d380b0b9ac2d8bf5176287cc5dbc33f528c63486df48b4b0a1467cb9743dc99d310662592c7927c2a0fed2301aa0b67c7cbed0b70b33032635fefe03bd448a8993212f38bf21533" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "withdraw-range-06-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + }, + { + "id": "withdraw-range-06-bfN", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "6a1b0c293da2178f571ab7a0215d894bdba11c87679e72d59d503042c2ae33280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000043420f0000000000505ab3571594608ff266f49bf64b5d10d334b26ef34f2bc6231e960c341579374caf64ee398f5f425b0772524e8571f54a291ba0ec2910f93a1d28438d77d013debea25087da4deea666146e0a0c7b4b227a8f8ad10874586e51918f526fb26b045acd926aaa10df3f065be59bc5c444ee5a703234d9162b279209ed9f03546d7be6fe488aa7e2bf767f532457c72083ded90042db22346f60e6f217590e6d051b694075b6c1751cc647a0308a1d2fc9130e29e668b465cd94484ba31a06240aa47b7766b0439fa43f860fc1167469d5dbbc6fad8285ef696619e3f5024b310a208ea0ff4a6c44d23786aa3f43af26ad34ada5edb879f75f97250633aec28e637c9aaf6986909662070d3747de72c8cf04594ed21d6ff2f62cbf08aac20a8528a85231d873c91ffdfe5c196feff231dcacd24c31f998715d1967f42d5114b0486af08a3b9efeb0670bbcd8a2c52644aed881c9502db1ad3b740a16e3f981881028831ba5eb4e3ce6fff642d30a6ddb2ba84c700968a649bf4c58bf7ec7abd14cb68c66c7acfc7c6ad0fbc79706a4f0e66c63c6ea93aa6b9ddd89e0d4a1ba02249602fa7a5fbc568084c7c403210d797e206b45d70f1608d6da2423fae47eda31de3a7e9a96ba58e1d9b7a4a38121188b6d287191862fd64c218cfbaec149df0b502168248912a6d018f0d58026a1bcf4db75e22220cc3f760b3d53494a8c5e67dc2c62a68e8338ab5ace39eabf1ce73b1b95ccef2f90dd6361a7b0fee390222228adb7579e1bf7e310f9e1e07e7527190fe93a474eda521e9356b0cf723b12209412e7f765352669621c11b7d23f0c831cf35cd28e688d380b0b9ac2d8bf5176287cc5dbc33f528c63486df48b4b0a1467cb9743dc99d310662592c7927c2a0fed2301aa0b67c7cbed0b70b33032635fefe03bd448a8993212f38bf21533440d" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + } + ] + }, + { + "id": "withdraw-composite-06", + "family": "withdraw_composite", + "expected_valid": true, + "payload": { + "equality_proof_data_hex": "aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245262a484e5e4cbeb40ea1e1476916e31fd242721b9079a02d056ec016806da87ec6189216eb993d81636a6087eb30abbf58e9b1b44f721a4bc36115887f9d09456a1b0c293da2178f571ab7a0215d894bdba11c87679e72d59d503042c2ae332843420f00000000007c60353575cbc42b12870066826d22e401fd4b09d4526cd036b6930a10fec87b647e4d3806c34db8328893986ea1319f5f34525c359e919f47dd3b6cef14430886b3a085a1e01d2daf37009ece25a4eff4ab5368269f71ef56a2161ef3f4ec54e9e85fe1bc546e837f801e915c12fb2faccac1c804fdbc7f4e7433c296d34806b237b49930e90e7bcf153423a7e5f71cbbea95cd3d88a6cece9b316055286008efd12f492acc29685d3db091c7385e4f4872b5e3d7b5bd4210a1f7aa140a4d0a", + "range_proof_data_hex": "6a1b0c293da2178f571ab7a0215d894bdba11c87679e72d59d503042c2ae33280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000043420f0000000000505ab3571594608ff266f49bf64b5d10d334b26ef34f2bc6231e960c341579374caf64ee398f5f425b0772524e8571f54a291ba0ec2910f93a1d28438d77d013debea25087da4deea666146e0a0c7b4b227a8f8ad10874586e51918f526fb26b045acd926aaa10df3f065be59bc5c444ee5a703234d9162b279209ed9f03546d7be6fe488aa7e2bf767f532457c72083ded90042db22346f60e6f217590e6d051b694075b6c1751cc647a0308a1d2fc9130e29e668b465cd94484ba31a06240aa47b7766b0439fa43f860fc1167469d5dbbc6fad8285ef696619e3f5024b310a208ea0ff4a6c44d23786aa3f43af26ad34ada5edb879f75f97250633aec28e637c9aaf6986909662070d3747de72c8cf04594ed21d6ff2f62cbf08aac20a8528a85231d873c91ffdfe5c196feff231dcacd24c31f998715d1967f42d5114b0486af08a3b9efeb0670bbcd8a2c52644aed881c9502db1ad3b740a16e3f981881028831ba5eb4e3ce6fff642d30a6ddb2ba84c700968a649bf4c58bf7ec7abd14cb68c66c7acfc7c6ad0fbc79706a4f0e66c63c6ea93aa6b9ddd89e0d4a1ba02249602fa7a5fbc568084c7c403210d797e206b45d70f1608d6da2423fae47eda31de3a7e9a96ba58e1d9b7a4a38121188b6d287191862fd64c218cfbaec149df0b502168248912a6d018f0d58026a1bcf4db75e22220cc3f760b3d53494a8c5e67dc2c62a68e8338ab5ace39eabf1ce73b1b95ccef2f90dd6361a7b0fee390222228adb7579e1bf7e310f9e1e07e7527190fe93a474eda521e9356b0cf723b12209412e7f765352669621c11b7d23f0c831cf35cd28e688d380b0b9ac2d8bf5176287cc5dbc33f528c63486df48b4b0a1467cb9743dc99d310662592c7927c2a0fed2301aa0b67c7cbed0b70b33032635fefe03bd448a8993212f38bf21533440c" + }, + "binding": { + "ciphertext_commitment_hex": "262a484e5e4cbeb40ea1e1476916e31fd242721b9079a02d056ec016806da87e", + "ciphertext_handle_hex": "c6189216eb993d81636a6087eb30abbf58e9b1b44f721a4bc36115887f9d0945", + "expected_nonce_u64": 1000003, + "user_pubkey_hex": "aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245" + }, + "mutations": [ + { + "id": "withdraw-composite-06-swap-eq-rng", + "op": "swap_fields", + "target": "payload.equality_proof_data_hex", + "params": { + "with": "payload.range_proof_data_hex" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "withdraw-composite-06-nonce", + "op": "replace_field", + "target": "binding.expected_nonce_u64", + "params": { + "value_u64": 1000002 + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "withdraw-composite-06-pk-u", + "op": "bitflip", + "target": "binding.user_pubkey_hex", + "params": { + "value_hex": "afec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "withdraw-composite-06-eq-trunc", + "op": "truncate", + "target": "payload.equality_proof_data_hex", + "params": { + "value_hex": "aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245262a484e5e4cbeb40ea1e1476916e31fd242721b9079a02d056ec016806da87ec6189216eb993d81636a6087eb30abbf58e9b1b44f721a4bc36115887f9d09456a1b0c293da2178f571ab7a0215d894bdba11c87679e72d59d503042c2ae332843420f00000000007c60353575cbc42b12870066826d22e401fd4b09d4526cd036b6930a10fec87b647e4d3806c34db8328893986ea1319f5f34525c359e919f47dd3b6cef14430886b3a085a1e01d2daf37009ece25a4eff4ab5368269f71ef56a2161ef3f4ec54e9e85fe1bc546e837f801e915c12fb2faccac1c804fdbc7f4e7433c296d34806b237b49930e90e7bcf153423a7e5f71cbbea95cd3d88a6cece9b316055286008efd12f492acc29685d3db091c7385e4f4872b5e3d7b5bd4210a1f7aa140a" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "withdraw-composite-06-h0", + "op": "replace_field", + "target": "binding.ciphertext_handle_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "handle mismatch" + } + ] + }, + { + "id": "withdraw-range-07", + "family": "withdraw_range", + "expected_valid": true, + "payload": { + "proof_data_hex": "3e6d192dc8efc15927eff7e5363d71a8c0057a38853f6c490d6016da04b1813a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000004b548900000000002cc79f344939169a0b4f24406f549b8cef5cd0eeb5a7def49b342f92c8536a140e2db6a829cdb3d8db3d663b22716831144356c32a65dd8a858971c96c3347642eae6e43472011a06ca28def30f132a555abcb2ba43b3304236c1f904f665b3854e08c47b7ea102a0057790afa4741df0d37982f7dfae06ee46e230a3c996f3fa3101ae7d932365915ead26c2c1af2d13500b5e15ff0a72046bd546519d2500b6335e866af34051d69da1e54741105e0d1cd02a7fd94a610fa0141d9696aa60b509db8636aa21af13eb88aa6869b49fa6b9e955ac3a2a3e9626a0316d911d70f1242d3606a97445d529604f4a3d0d7c9cd0bf25fa120b4fa186b10b3ee4c8572c4727c2a5385214213d9056ecfe3f59a10bc70552a54cd381562a67f5b4fea26e49bee916e387a3f63141bdfb5786e9685e67050143ea8caefbc27ee15449d17025ecaccf36e9f68b709ffa353238832d04e170c43d728d80e036b7ab4432f6d7c9070d3dce9c5bb131523aba8943479f961725c32e80413e4363d375f52207bd8538c7b6156eec66ddbc14f6701511b6ff85fb96518cbccfc51262ae09c0f401c1b21f2bfdb8dba0c2123582b65f6988038ddb1e98d8cb22f6b3394aa924022e824b862c353e0e66058d699e1cf088625672daaaee9642a69f1b166ba1b77522cb185f46161a3e21611a31d25aa64b10e2845bf477494d4f4ffc1d53ac80f71caadb12a5c3d7d6d953fa5df568ec13aa3893bc682494b47e310897832bd115ffcfdd5726066a8e03cd81aa37df3041fc6f4e222491e802ab3e00d6bbac48351023e3b0e2278cac9a474155c49a0530b6036abb0425c2d9341142ef6ee455101a3e8fb451fb284af6bb87531def9081ecfc13a8f670566722fbad8b56e5f4b045086a7328c9646f02d60ae2973fbd2e847c99b78c31e06e6145d16b2d0467b01" + }, + "mutations": [ + { + "id": "withdraw-range-07-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "3f6d192dc8efc15927eff7e5363d71a8c0057a38853f6c490d6016da04b1813a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000004b548900000000002cc79f344939169a0b4f24406f549b8cef5cd0eeb5a7def49b342f92c8536a140e2db6a829cdb3d8db3d663b22716831144356c32a65dd8a858971c96c3347642eae6e43472011a06ca28def30f132a555abcb2ba43b3304236c1f904f665b3854e08c47b7ea102a0057790afa4741df0d37982f7dfae06ee46e230a3c996f3fa3101ae7d932365915ead26c2c1af2d13500b5e15ff0a72046bd546519d2500b6335e866af34051d69da1e54741105e0d1cd02a7fd94a610fa0141d9696aa60b509db8636aa21af13eb88aa6869b49fa6b9e955ac3a2a3e9626a0316d911d70f1242d3606a97445d529604f4a3d0d7c9cd0bf25fa120b4fa186b10b3ee4c8572c4727c2a5385214213d9056ecfe3f59a10bc70552a54cd381562a67f5b4fea26e49bee916e387a3f63141bdfb5786e9685e67050143ea8caefbc27ee15449d17025ecaccf36e9f68b709ffa353238832d04e170c43d728d80e036b7ab4432f6d7c9070d3dce9c5bb131523aba8943479f961725c32e80413e4363d375f52207bd8538c7b6156eec66ddbc14f6701511b6ff85fb96518cbccfc51262ae09c0f401c1b21f2bfdb8dba0c2123582b65f6988038ddb1e98d8cb22f6b3394aa924022e824b862c353e0e66058d699e1cf088625672daaaee9642a69f1b166ba1b77522cb185f46161a3e21611a31d25aa64b10e2845bf477494d4f4ffc1d53ac80f71caadb12a5c3d7d6d953fa5df568ec13aa3893bc682494b47e310897832bd115ffcfdd5726066a8e03cd81aa37df3041fc6f4e222491e802ab3e00d6bbac48351023e3b0e2278cac9a474155c49a0530b6036abb0425c2d9341142ef6ee455101a3e8fb451fb284af6bb87531def9081ecfc13a8f670566722fbad8b56e5f4b045086a7328c9646f02d60ae2973fbd2e847c99b78c31e06e6145d16b2d0467b01" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "withdraw-range-07-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "3e6d192dc8efc15927eff7e5363d71a8c0057a38853f6c490d6016da04b1813a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000004b548900000000002cc79f344939169a0b4f24406f549b8cef5cd0eeb5a7def49b342f92c8536a140e2db6a829cdb3d8db3d663b22716831144356c32a65dd8a858971c96c3347642eae6e43472011a06ca28def30f132a555abcb2ba43b3304236c1f904f665b3854e08c47b7ea102a0057790afa4741df0d37982f7dfae06ee46e230a3c996f3fa3101ae7d932365915ead26c2c1af2d13500b5e15ff0a72046bd546519d2500b6335e866af34051d69da1e54741105e0d1cd02a7fd94a610fa0141d9696aa60b509db8636aa21af13eb88aa6869b49fa6b9e955ac3a2a3e9626a0316d911d70f1242d3606a97445d529604f4a3d0d7c9cd0bf25fa120b4fa186b10b3ee4c8572c4727c2a5385214213d9056ecfe3f59a10bc70552a54cd381562a67f5b4fea26e49bee916e387a3f63141bdfb5786e9685e67050143ea8caefbc27ee15449d17025ecaccf36e9f68b709ffa353238832d04e170c43d728d80e036b7ab4432f6d7c9070d3dce9c5bb131523aba8943479f961725c32e80413e4363d375f52207bd8538c7b6156eec66ddbc14f6701511b6ff85fb96518cbccfc51262ae09c0f401c1b21f2bfdb8dba0c2123582b65f6988038ddb1e98d8cb22f6b3394aa924022e824b862c353e0e66058d699e1cf088625672daaaee9642a69f1b166ba1b77522cb185f46161a3e21611a31d25aa64b10e2845bf477494d4f4ffc1d53ac80f71caadb12a5c3d7d6d953fa5df568ec13aa3893bc682494b47e310897832bd115ffcfdd5726066a8e03cd81aa37df3041fc6f4e222491e802ab3e00d6bbac48351023e3b0e2278cac9a474155c49a0530b6036abb0425c2d9341142ef6ee455101a3e8fb451fb284af6bb87531def9081ecfc13a8f670566722fbad8b56e5f4b045086a7328c9646f02d60ae2973fbd2e847c99b78c31e06e6145d16b2d046" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "withdraw-range-07-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + }, + { + "id": "withdraw-range-07-bfN", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "3e6d192dc8efc15927eff7e5363d71a8c0057a38853f6c490d6016da04b1813a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000004b548900000000002cc79f344939169a0b4f24406f549b8cef5cd0eeb5a7def49b342f92c8536a140e2db6a829cdb3d8db3d663b22716831144356c32a65dd8a858971c96c3347642eae6e43472011a06ca28def30f132a555abcb2ba43b3304236c1f904f665b3854e08c47b7ea102a0057790afa4741df0d37982f7dfae06ee46e230a3c996f3fa3101ae7d932365915ead26c2c1af2d13500b5e15ff0a72046bd546519d2500b6335e866af34051d69da1e54741105e0d1cd02a7fd94a610fa0141d9696aa60b509db8636aa21af13eb88aa6869b49fa6b9e955ac3a2a3e9626a0316d911d70f1242d3606a97445d529604f4a3d0d7c9cd0bf25fa120b4fa186b10b3ee4c8572c4727c2a5385214213d9056ecfe3f59a10bc70552a54cd381562a67f5b4fea26e49bee916e387a3f63141bdfb5786e9685e67050143ea8caefbc27ee15449d17025ecaccf36e9f68b709ffa353238832d04e170c43d728d80e036b7ab4432f6d7c9070d3dce9c5bb131523aba8943479f961725c32e80413e4363d375f52207bd8538c7b6156eec66ddbc14f6701511b6ff85fb96518cbccfc51262ae09c0f401c1b21f2bfdb8dba0c2123582b65f6988038ddb1e98d8cb22f6b3394aa924022e824b862c353e0e66058d699e1cf088625672daaaee9642a69f1b166ba1b77522cb185f46161a3e21611a31d25aa64b10e2845bf477494d4f4ffc1d53ac80f71caadb12a5c3d7d6d953fa5df568ec13aa3893bc682494b47e310897832bd115ffcfdd5726066a8e03cd81aa37df3041fc6f4e222491e802ab3e00d6bbac48351023e3b0e2278cac9a474155c49a0530b6036abb0425c2d9341142ef6ee455101a3e8fb451fb284af6bb87531def9081ecfc13a8f670566722fbad8b56e5f4b045086a7328c9646f02d60ae2973fbd2e847c99b78c31e06e6145d16b2d0467b00" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + } + ] + }, + { + "id": "withdraw-composite-07", + "family": "withdraw_composite", + "expected_valid": true, + "payload": { + "equality_proof_data_hex": "ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268dcb2150e7ff8397a4b0542bad139c290d68f2c3a145eb184c2da5afe9955ae3a56af56c138c26add05fcb9cd851e78693418f37471644db2780c3135e9f20a7b3e6d192dc8efc15927eff7e5363d71a8c0057a38853f6c490d6016da04b1813a4b548900000000009677b4bb4036f044f409dfc76544f9feb221b1ca526e89901bc34aa4d25ff17e5c8a4229fc0e2fb318a326b89c8a8b8ee9d754c8e9262186e1e600953ae29b7006d22d5d6e7a095e3f59743cd8c4a0a50493947b2d27378f311e0cea68ae46165a7cd6c9e8355003ce48d3a201c107dc8969b577df2ddb2fe0e1e9f08113690de8e3e20f4ce5fae7ef77adb3ec10994348761ce8626a38f851d3a736063be902b52dc08c6a43dfc160f2d2532ad89468cf66145f848e66538153eb9851de4c0a", + "range_proof_data_hex": "3e6d192dc8efc15927eff7e5363d71a8c0057a38853f6c490d6016da04b1813a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000004b548900000000002cc79f344939169a0b4f24406f549b8cef5cd0eeb5a7def49b342f92c8536a140e2db6a829cdb3d8db3d663b22716831144356c32a65dd8a858971c96c3347642eae6e43472011a06ca28def30f132a555abcb2ba43b3304236c1f904f665b3854e08c47b7ea102a0057790afa4741df0d37982f7dfae06ee46e230a3c996f3fa3101ae7d932365915ead26c2c1af2d13500b5e15ff0a72046bd546519d2500b6335e866af34051d69da1e54741105e0d1cd02a7fd94a610fa0141d9696aa60b509db8636aa21af13eb88aa6869b49fa6b9e955ac3a2a3e9626a0316d911d70f1242d3606a97445d529604f4a3d0d7c9cd0bf25fa120b4fa186b10b3ee4c8572c4727c2a5385214213d9056ecfe3f59a10bc70552a54cd381562a67f5b4fea26e49bee916e387a3f63141bdfb5786e9685e67050143ea8caefbc27ee15449d17025ecaccf36e9f68b709ffa353238832d04e170c43d728d80e036b7ab4432f6d7c9070d3dce9c5bb131523aba8943479f961725c32e80413e4363d375f52207bd8538c7b6156eec66ddbc14f6701511b6ff85fb96518cbccfc51262ae09c0f401c1b21f2bfdb8dba0c2123582b65f6988038ddb1e98d8cb22f6b3394aa924022e824b862c353e0e66058d699e1cf088625672daaaee9642a69f1b166ba1b77522cb185f46161a3e21611a31d25aa64b10e2845bf477494d4f4ffc1d53ac80f71caadb12a5c3d7d6d953fa5df568ec13aa3893bc682494b47e310897832bd115ffcfdd5726066a8e03cd81aa37df3041fc6f4e222491e802ab3e00d6bbac48351023e3b0e2278cac9a474155c49a0530b6036abb0425c2d9341142ef6ee455101a3e8fb451fb284af6bb87531def9081ecfc13a8f670566722fbad8b56e5f4b045086a7328c9646f02d60ae2973fbd2e847c99b78c31e06e6145d16b2d0467b01" + }, + "binding": { + "ciphertext_commitment_hex": "dcb2150e7ff8397a4b0542bad139c290d68f2c3a145eb184c2da5afe9955ae3a", + "ciphertext_handle_hex": "56af56c138c26add05fcb9cd851e78693418f37471644db2780c3135e9f20a7b", + "expected_nonce_u64": 9000011, + "user_pubkey_hex": "ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268" + }, + "mutations": [ + { + "id": "withdraw-composite-07-swap-eq-rng", + "op": "swap_fields", + "target": "payload.equality_proof_data_hex", + "params": { + "with": "payload.range_proof_data_hex" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "withdraw-composite-07-nonce", + "op": "replace_field", + "target": "binding.expected_nonce_u64", + "params": { + "value_u64": 9000010 + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "withdraw-composite-07-pk-u", + "op": "bitflip", + "target": "binding.user_pubkey_hex", + "params": { + "value_hex": "ebd02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "withdraw-composite-07-eq-trunc", + "op": "truncate", + "target": "payload.equality_proof_data_hex", + "params": { + "value_hex": "ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268dcb2150e7ff8397a4b0542bad139c290d68f2c3a145eb184c2da5afe9955ae3a56af56c138c26add05fcb9cd851e78693418f37471644db2780c3135e9f20a7b3e6d192dc8efc15927eff7e5363d71a8c0057a38853f6c490d6016da04b1813a4b548900000000009677b4bb4036f044f409dfc76544f9feb221b1ca526e89901bc34aa4d25ff17e5c8a4229fc0e2fb318a326b89c8a8b8ee9d754c8e9262186e1e600953ae29b7006d22d5d6e7a095e3f59743cd8c4a0a50493947b2d27378f311e0cea68ae46165a7cd6c9e8355003ce48d3a201c107dc8969b577df2ddb2fe0e1e9f08113690de8e3e20f4ce5fae7ef77adb3ec10994348761ce8626a38f851d3a736063be902b52dc08c6a43dfc160f2d2532ad89468cf66145f848e66538153eb9851de" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "withdraw-composite-07-h0", + "op": "replace_field", + "target": "binding.ciphertext_handle_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "handle mismatch" + } + ] + }, + { + "id": "withdraw-range-08", + "family": "withdraw_range", + "expected_valid": true, + "payload": { + "proof_data_hex": "52dd57ed47b0c95a9e366fbc4239ac260c1532e600d1a8e8eb4c268c55a1b958000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000080b8941de7c1b7e2f97ca38af946dd1ef79d257d655a457c56f4050e513f489e6890c53112bb1c67ec48966084c65c4b453b7a405c6ef184edc9c7e6489e9cbd72a2e3f663ca8638a5c03c99a36be5ff26e98c9338384bc040c025160e69e6ec166a087db3f1563bbf5e5e731bfa3d15bf796a60476b8ad0654930d30f2fdef37d9a032894ebbc066a0bf2e81538601a6f9e4256eada2131770ffdfb2a913c6b0ef85a611a5328a4d568f95e3810a8f37d4317f4db06da691da8c1408e4388a90b375b09ea8d0150e546f46df404593cab67f85357c82790c3777cd84d4c52cd0e3e7f4a179c40f6873aee43e7f984e5af274f2b052aed45acad1bfddbb7246f3e940a9c2edb004bc07b7ca17a246d46738214e8d95d360dd52b8a4329deaf4f204e1d617bdb5a52ebfaffac943de64643a2dcd146d90aaae5e15eeebf503aa47402ae31a69b8601eb48f1922f7c3e4ba30611a80ce2a4798efa11a44efd9b272f3ae4038489e06b14a98899f232c92f65dc53ab677c851f094f27e24e5d1b182166ca3b81eaa91be56bba78c1c3c8f2c26499e2f1ded4087896184b59beecac08102ba82b2169478232200a45e87a3c1556110fe711bdbc8eada16f13328db111aaf693f713f80713f54cf4c8681d1588c049452a27d3deb278c1ec3d7023160acc22ee486f25f175c6646f3acdf034e20150f818df3feb53e0d721abbade5737bcccd81f4c7f6df78cee39d07f29193d289f93a338260c0db26eab2b72222e4a8e30f3585cc5d309fdefdec497c1ccbd260e5fd623f55ef6988c769b09388059e622f5e85c5e3ded5be4e3a5596b7355f456845c88fb166c41e30ed40552a93fa3966d2b07018552326e3e86b28cae0fb8a8393cd09b5d6074e35d3808316c033433c9b7c9f2d484e951a11a31c68cf9bcadd02a82c1a35191d6ed48559bcd0b" + }, + "mutations": [ + { + "id": "withdraw-range-08-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "53dd57ed47b0c95a9e366fbc4239ac260c1532e600d1a8e8eb4c268c55a1b958000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000080b8941de7c1b7e2f97ca38af946dd1ef79d257d655a457c56f4050e513f489e6890c53112bb1c67ec48966084c65c4b453b7a405c6ef184edc9c7e6489e9cbd72a2e3f663ca8638a5c03c99a36be5ff26e98c9338384bc040c025160e69e6ec166a087db3f1563bbf5e5e731bfa3d15bf796a60476b8ad0654930d30f2fdef37d9a032894ebbc066a0bf2e81538601a6f9e4256eada2131770ffdfb2a913c6b0ef85a611a5328a4d568f95e3810a8f37d4317f4db06da691da8c1408e4388a90b375b09ea8d0150e546f46df404593cab67f85357c82790c3777cd84d4c52cd0e3e7f4a179c40f6873aee43e7f984e5af274f2b052aed45acad1bfddbb7246f3e940a9c2edb004bc07b7ca17a246d46738214e8d95d360dd52b8a4329deaf4f204e1d617bdb5a52ebfaffac943de64643a2dcd146d90aaae5e15eeebf503aa47402ae31a69b8601eb48f1922f7c3e4ba30611a80ce2a4798efa11a44efd9b272f3ae4038489e06b14a98899f232c92f65dc53ab677c851f094f27e24e5d1b182166ca3b81eaa91be56bba78c1c3c8f2c26499e2f1ded4087896184b59beecac08102ba82b2169478232200a45e87a3c1556110fe711bdbc8eada16f13328db111aaf693f713f80713f54cf4c8681d1588c049452a27d3deb278c1ec3d7023160acc22ee486f25f175c6646f3acdf034e20150f818df3feb53e0d721abbade5737bcccd81f4c7f6df78cee39d07f29193d289f93a338260c0db26eab2b72222e4a8e30f3585cc5d309fdefdec497c1ccbd260e5fd623f55ef6988c769b09388059e622f5e85c5e3ded5be4e3a5596b7355f456845c88fb166c41e30ed40552a93fa3966d2b07018552326e3e86b28cae0fb8a8393cd09b5d6074e35d3808316c033433c9b7c9f2d484e951a11a31c68cf9bcadd02a82c1a35191d6ed48559bcd0b" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "withdraw-range-08-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "52dd57ed47b0c95a9e366fbc4239ac260c1532e600d1a8e8eb4c268c55a1b958000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000080b8941de7c1b7e2f97ca38af946dd1ef79d257d655a457c56f4050e513f489e6890c53112bb1c67ec48966084c65c4b453b7a405c6ef184edc9c7e6489e9cbd72a2e3f663ca8638a5c03c99a36be5ff26e98c9338384bc040c025160e69e6ec166a087db3f1563bbf5e5e731bfa3d15bf796a60476b8ad0654930d30f2fdef37d9a032894ebbc066a0bf2e81538601a6f9e4256eada2131770ffdfb2a913c6b0ef85a611a5328a4d568f95e3810a8f37d4317f4db06da691da8c1408e4388a90b375b09ea8d0150e546f46df404593cab67f85357c82790c3777cd84d4c52cd0e3e7f4a179c40f6873aee43e7f984e5af274f2b052aed45acad1bfddbb7246f3e940a9c2edb004bc07b7ca17a246d46738214e8d95d360dd52b8a4329deaf4f204e1d617bdb5a52ebfaffac943de64643a2dcd146d90aaae5e15eeebf503aa47402ae31a69b8601eb48f1922f7c3e4ba30611a80ce2a4798efa11a44efd9b272f3ae4038489e06b14a98899f232c92f65dc53ab677c851f094f27e24e5d1b182166ca3b81eaa91be56bba78c1c3c8f2c26499e2f1ded4087896184b59beecac08102ba82b2169478232200a45e87a3c1556110fe711bdbc8eada16f13328db111aaf693f713f80713f54cf4c8681d1588c049452a27d3deb278c1ec3d7023160acc22ee486f25f175c6646f3acdf034e20150f818df3feb53e0d721abbade5737bcccd81f4c7f6df78cee39d07f29193d289f93a338260c0db26eab2b72222e4a8e30f3585cc5d309fdefdec497c1ccbd260e5fd623f55ef6988c769b09388059e622f5e85c5e3ded5be4e3a5596b7355f456845c88fb166c41e30ed40552a93fa3966d2b07018552326e3e86b28cae0fb8a8393cd09b5d6074e35d3808316c033433c9b7c9f2d484e951a11a31c68cf9bcadd02a82c1a35191d6ed48559b" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "withdraw-range-08-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + }, + { + "id": "withdraw-range-08-bfN", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "52dd57ed47b0c95a9e366fbc4239ac260c1532e600d1a8e8eb4c268c55a1b958000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000080b8941de7c1b7e2f97ca38af946dd1ef79d257d655a457c56f4050e513f489e6890c53112bb1c67ec48966084c65c4b453b7a405c6ef184edc9c7e6489e9cbd72a2e3f663ca8638a5c03c99a36be5ff26e98c9338384bc040c025160e69e6ec166a087db3f1563bbf5e5e731bfa3d15bf796a60476b8ad0654930d30f2fdef37d9a032894ebbc066a0bf2e81538601a6f9e4256eada2131770ffdfb2a913c6b0ef85a611a5328a4d568f95e3810a8f37d4317f4db06da691da8c1408e4388a90b375b09ea8d0150e546f46df404593cab67f85357c82790c3777cd84d4c52cd0e3e7f4a179c40f6873aee43e7f984e5af274f2b052aed45acad1bfddbb7246f3e940a9c2edb004bc07b7ca17a246d46738214e8d95d360dd52b8a4329deaf4f204e1d617bdb5a52ebfaffac943de64643a2dcd146d90aaae5e15eeebf503aa47402ae31a69b8601eb48f1922f7c3e4ba30611a80ce2a4798efa11a44efd9b272f3ae4038489e06b14a98899f232c92f65dc53ab677c851f094f27e24e5d1b182166ca3b81eaa91be56bba78c1c3c8f2c26499e2f1ded4087896184b59beecac08102ba82b2169478232200a45e87a3c1556110fe711bdbc8eada16f13328db111aaf693f713f80713f54cf4c8681d1588c049452a27d3deb278c1ec3d7023160acc22ee486f25f175c6646f3acdf034e20150f818df3feb53e0d721abbade5737bcccd81f4c7f6df78cee39d07f29193d289f93a338260c0db26eab2b72222e4a8e30f3585cc5d309fdefdec497c1ccbd260e5fd623f55ef6988c769b09388059e622f5e85c5e3ded5be4e3a5596b7355f456845c88fb166c41e30ed40552a93fa3966d2b07018552326e3e86b28cae0fb8a8393cd09b5d6074e35d3808316c033433c9b7c9f2d484e951a11a31c68cf9bcadd02a82c1a35191d6ed48559bcd0a" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + } + ] + }, + { + "id": "withdraw-composite-08", + "family": "withdraw_composite", + "expected_valid": true, + "payload": { + "equality_proof_data_hex": "5e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b203f5513d3e630a3a324d933fab83be829bde21eb7b451273380597ba24c9c659eb1cdeeee42f4d13a42a61cb1c359c5a943fdf22b74e515b9e49a48eb5b2e4552dd57ed47b0c95a9e366fbc4239ac260c1532e600d1a8e8eb4c268c55a1b9580000000000000080bab95b9f9f4a4a9d8a26dbdd23dd4661cf41b7265994f26964a0d7589e1d7f426626f9293b66cf40198c2aee42c0d0ef89fd363b911720492e1cd1d1f9fe5f4df6780f56d0972242afe0ae9c9c5825479e61ed043e58949291d988a36d34be1a2259fdc9862397d309313a2395670d813e84e515a86f2bf96d1a81d76d4d6102ff987ef395562be84c6c70d3734108a6465cf0d893ec377712430918d4fe7e0998c67f145e7fa45ac21c35814223b57e13be107c70cd68b555ff7cee25ce8c05", + "range_proof_data_hex": "52dd57ed47b0c95a9e366fbc4239ac260c1532e600d1a8e8eb4c268c55a1b958000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000080b8941de7c1b7e2f97ca38af946dd1ef79d257d655a457c56f4050e513f489e6890c53112bb1c67ec48966084c65c4b453b7a405c6ef184edc9c7e6489e9cbd72a2e3f663ca8638a5c03c99a36be5ff26e98c9338384bc040c025160e69e6ec166a087db3f1563bbf5e5e731bfa3d15bf796a60476b8ad0654930d30f2fdef37d9a032894ebbc066a0bf2e81538601a6f9e4256eada2131770ffdfb2a913c6b0ef85a611a5328a4d568f95e3810a8f37d4317f4db06da691da8c1408e4388a90b375b09ea8d0150e546f46df404593cab67f85357c82790c3777cd84d4c52cd0e3e7f4a179c40f6873aee43e7f984e5af274f2b052aed45acad1bfddbb7246f3e940a9c2edb004bc07b7ca17a246d46738214e8d95d360dd52b8a4329deaf4f204e1d617bdb5a52ebfaffac943de64643a2dcd146d90aaae5e15eeebf503aa47402ae31a69b8601eb48f1922f7c3e4ba30611a80ce2a4798efa11a44efd9b272f3ae4038489e06b14a98899f232c92f65dc53ab677c851f094f27e24e5d1b182166ca3b81eaa91be56bba78c1c3c8f2c26499e2f1ded4087896184b59beecac08102ba82b2169478232200a45e87a3c1556110fe711bdbc8eada16f13328db111aaf693f713f80713f54cf4c8681d1588c049452a27d3deb278c1ec3d7023160acc22ee486f25f175c6646f3acdf034e20150f818df3feb53e0d721abbade5737bcccd81f4c7f6df78cee39d07f29193d289f93a338260c0db26eab2b72222e4a8e30f3585cc5d309fdefdec497c1ccbd260e5fd623f55ef6988c769b09388059e622f5e85c5e3ded5be4e3a5596b7355f456845c88fb166c41e30ed40552a93fa3966d2b07018552326e3e86b28cae0fb8a8393cd09b5d6074e35d3808316c033433c9b7c9f2d484e951a11a31c68cf9bcadd02a82c1a35191d6ed48559bcd0b" + }, + "binding": { + "ciphertext_commitment_hex": "203f5513d3e630a3a324d933fab83be829bde21eb7b451273380597ba24c9c65", + "ciphertext_handle_hex": "9eb1cdeeee42f4d13a42a61cb1c359c5a943fdf22b74e515b9e49a48eb5b2e45", + "expected_nonce_u64": 9223372036854775808, + "user_pubkey_hex": "5e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b" + }, + "mutations": [ + { + "id": "withdraw-composite-08-swap-eq-rng", + "op": "swap_fields", + "target": "payload.equality_proof_data_hex", + "params": { + "with": "payload.range_proof_data_hex" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "withdraw-composite-08-nonce", + "op": "replace_field", + "target": "binding.expected_nonce_u64", + "params": { + "value_u64": 9223372036854775809 + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "withdraw-composite-08-pk-u", + "op": "bitflip", + "target": "binding.user_pubkey_hex", + "params": { + "value_hex": "5f06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "withdraw-composite-08-eq-trunc", + "op": "truncate", + "target": "payload.equality_proof_data_hex", + "params": { + "value_hex": "5e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b203f5513d3e630a3a324d933fab83be829bde21eb7b451273380597ba24c9c659eb1cdeeee42f4d13a42a61cb1c359c5a943fdf22b74e515b9e49a48eb5b2e4552dd57ed47b0c95a9e366fbc4239ac260c1532e600d1a8e8eb4c268c55a1b9580000000000000080bab95b9f9f4a4a9d8a26dbdd23dd4661cf41b7265994f26964a0d7589e1d7f426626f9293b66cf40198c2aee42c0d0ef89fd363b911720492e1cd1d1f9fe5f4df6780f56d0972242afe0ae9c9c5825479e61ed043e58949291d988a36d34be1a2259fdc9862397d309313a2395670d813e84e515a86f2bf96d1a81d76d4d6102ff987ef395562be84c6c70d3734108a6465cf0d893ec377712430918d4fe7e0998c67f145e7fa45ac21c35814223b57e13be107c70cd68b555ff7cee25ce" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "withdraw-composite-08-h0", + "op": "replace_field", + "target": "binding.ciphertext_handle_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "handle mismatch" + } + ] + }, + { + "id": "withdraw-range-09", + "family": "withdraw_range", + "expected_valid": true, + "payload": { + "proof_data_hex": "c88ec8dc255d2667627ecd06acf71cc543fddaeb180573e3cc6b55f2e59b5b39000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000001100000000000080eee9633ad3aefa0ee13ec7d24bf8f480cb6adf1afefc184bf552c212ec30d21cf625ce4bf963e17604b0df60a8e05a76891b3fd12a3a359b14323537a8e8ec14dac0e9ff757d433b6af765e5ea29fa51b3d0ee989d8f952079f2d400e2c98778b0d04c1be4c62d246fa592f0dfb67b83a02a8d0405c5e68fce4c648058a76f39813a4108dcce3eaefde729c952ea7e9279074c0d1d5576d1ab2dd711bf7d3d045f6be2f3e64f29199dbeb2776283d013190c932b0cd53c202af677154d49430a61e783a7847b758c948605c56a390f4a29fac458bc71a41bde1c20275060bb09a0cf63cbeddf5cc16427a2f3c47c2f5bbc0f817caf4599d8e5b685adf698682ffc62b9e7ae839bed2276129dc7e360bc39bb7a0224a8602bb887dc80390f023e186ae0d8da4f5733e7b0cf0c758dbd9cf8beb8d1fa4d815c5e85a68a239c361df81644bedbf0559acdb31ba912a59b2d4c2ccac729ed0685e0ff0a1ec45d6a419a3d0fd89f46da20644dd205d467c6b8be39ca14fa7d0fa4f2528d8023126f1610749a8fd3141160512eb80fa9edad736494dbbe2c17063a8bcb8a1fff0a0f0eac35cb8703a54d3217320b67bef6985b9cfce134211ba517392b13565e403e240a2771c3878b992233d771a81a78569bc412207ba3771d5f102644ec5ec53c6dde71ff0b73f718ab393a35c582991fffedddea451b7411fc00cb2a446c87662f7ac49db80696e19aa99de3b555c0659f5b2b8a8ed9a882396077b7df1300d76416510ae1123f7c0e446a56d63bfe93b32d9e0a854fef560d5a97ddb13914ae7602ccb2d2a506c212f9983d171c8dcf965cadfccda7ad167a7d2f3d4838ef1300e5977a17187d6fe95ca3712e3c46cb621b270233ad96d51a7805b87a78d8c60da0b175a65a6d16b10529d6c4ff0e233a65cbcaafd9ec932ba0ce89cca831df08" + }, + "mutations": [ + { + "id": "withdraw-range-09-bf0", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "c98ec8dc255d2667627ecd06acf71cc543fddaeb180573e3cc6b55f2e59b5b39000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000001100000000000080eee9633ad3aefa0ee13ec7d24bf8f480cb6adf1afefc184bf552c212ec30d21cf625ce4bf963e17604b0df60a8e05a76891b3fd12a3a359b14323537a8e8ec14dac0e9ff757d433b6af765e5ea29fa51b3d0ee989d8f952079f2d400e2c98778b0d04c1be4c62d246fa592f0dfb67b83a02a8d0405c5e68fce4c648058a76f39813a4108dcce3eaefde729c952ea7e9279074c0d1d5576d1ab2dd711bf7d3d045f6be2f3e64f29199dbeb2776283d013190c932b0cd53c202af677154d49430a61e783a7847b758c948605c56a390f4a29fac458bc71a41bde1c20275060bb09a0cf63cbeddf5cc16427a2f3c47c2f5bbc0f817caf4599d8e5b685adf698682ffc62b9e7ae839bed2276129dc7e360bc39bb7a0224a8602bb887dc80390f023e186ae0d8da4f5733e7b0cf0c758dbd9cf8beb8d1fa4d815c5e85a68a239c361df81644bedbf0559acdb31ba912a59b2d4c2ccac729ed0685e0ff0a1ec45d6a419a3d0fd89f46da20644dd205d467c6b8be39ca14fa7d0fa4f2528d8023126f1610749a8fd3141160512eb80fa9edad736494dbbe2c17063a8bcb8a1fff0a0f0eac35cb8703a54d3217320b67bef6985b9cfce134211ba517392b13565e403e240a2771c3878b992233d771a81a78569bc412207ba3771d5f102644ec5ec53c6dde71ff0b73f718ab393a35c582991fffedddea451b7411fc00cb2a446c87662f7ac49db80696e19aa99de3b555c0659f5b2b8a8ed9a882396077b7df1300d76416510ae1123f7c0e446a56d63bfe93b32d9e0a854fef560d5a97ddb13914ae7602ccb2d2a506c212f9983d171c8dcf965cadfccda7ad167a7d2f3d4838ef1300e5977a17187d6fe95ca3712e3c46cb621b270233ad96d51a7805b87a78d8c60da0b175a65a6d16b10529d6c4ff0e233a65cbcaafd9ec932ba0ce89cca831df08" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "withdraw-range-09-trunc", + "op": "truncate", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "c88ec8dc255d2667627ecd06acf71cc543fddaeb180573e3cc6b55f2e59b5b39000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000001100000000000080eee9633ad3aefa0ee13ec7d24bf8f480cb6adf1afefc184bf552c212ec30d21cf625ce4bf963e17604b0df60a8e05a76891b3fd12a3a359b14323537a8e8ec14dac0e9ff757d433b6af765e5ea29fa51b3d0ee989d8f952079f2d400e2c98778b0d04c1be4c62d246fa592f0dfb67b83a02a8d0405c5e68fce4c648058a76f39813a4108dcce3eaefde729c952ea7e9279074c0d1d5576d1ab2dd711bf7d3d045f6be2f3e64f29199dbeb2776283d013190c932b0cd53c202af677154d49430a61e783a7847b758c948605c56a390f4a29fac458bc71a41bde1c20275060bb09a0cf63cbeddf5cc16427a2f3c47c2f5bbc0f817caf4599d8e5b685adf698682ffc62b9e7ae839bed2276129dc7e360bc39bb7a0224a8602bb887dc80390f023e186ae0d8da4f5733e7b0cf0c758dbd9cf8beb8d1fa4d815c5e85a68a239c361df81644bedbf0559acdb31ba912a59b2d4c2ccac729ed0685e0ff0a1ec45d6a419a3d0fd89f46da20644dd205d467c6b8be39ca14fa7d0fa4f2528d8023126f1610749a8fd3141160512eb80fa9edad736494dbbe2c17063a8bcb8a1fff0a0f0eac35cb8703a54d3217320b67bef6985b9cfce134211ba517392b13565e403e240a2771c3878b992233d771a81a78569bc412207ba3771d5f102644ec5ec53c6dde71ff0b73f718ab393a35c582991fffedddea451b7411fc00cb2a446c87662f7ac49db80696e19aa99de3b555c0659f5b2b8a8ed9a882396077b7df1300d76416510ae1123f7c0e446a56d63bfe93b32d9e0a854fef560d5a97ddb13914ae7602ccb2d2a506c212f9983d171c8dcf965cadfccda7ad167a7d2f3d4838ef1300e5977a17187d6fe95ca3712e3c46cb621b270233ad96d51a7805b87a78d8c60da0b175a65a6d16b10529d6c4ff0e233a65cbcaafd9ec932ba0ce89cca831" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "withdraw-range-09-zeros", + "op": "replace_field", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "deserialization" + }, + { + "id": "withdraw-range-09-bfN", + "op": "bitflip", + "target": "payload.proof_data_hex", + "params": { + "value_hex": "c88ec8dc255d2667627ecd06acf71cc543fddaeb180573e3cc6b55f2e59b5b39000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000001100000000000080eee9633ad3aefa0ee13ec7d24bf8f480cb6adf1afefc184bf552c212ec30d21cf625ce4bf963e17604b0df60a8e05a76891b3fd12a3a359b14323537a8e8ec14dac0e9ff757d433b6af765e5ea29fa51b3d0ee989d8f952079f2d400e2c98778b0d04c1be4c62d246fa592f0dfb67b83a02a8d0405c5e68fce4c648058a76f39813a4108dcce3eaefde729c952ea7e9279074c0d1d5576d1ab2dd711bf7d3d045f6be2f3e64f29199dbeb2776283d013190c932b0cd53c202af677154d49430a61e783a7847b758c948605c56a390f4a29fac458bc71a41bde1c20275060bb09a0cf63cbeddf5cc16427a2f3c47c2f5bbc0f817caf4599d8e5b685adf698682ffc62b9e7ae839bed2276129dc7e360bc39bb7a0224a8602bb887dc80390f023e186ae0d8da4f5733e7b0cf0c758dbd9cf8beb8d1fa4d815c5e85a68a239c361df81644bedbf0559acdb31ba912a59b2d4c2ccac729ed0685e0ff0a1ec45d6a419a3d0fd89f46da20644dd205d467c6b8be39ca14fa7d0fa4f2528d8023126f1610749a8fd3141160512eb80fa9edad736494dbbe2c17063a8bcb8a1fff0a0f0eac35cb8703a54d3217320b67bef6985b9cfce134211ba517392b13565e403e240a2771c3878b992233d771a81a78569bc412207ba3771d5f102644ec5ec53c6dde71ff0b73f718ab393a35c582991fffedddea451b7411fc00cb2a446c87662f7ac49db80696e19aa99de3b555c0659f5b2b8a8ed9a882396077b7df1300d76416510ae1123f7c0e446a56d63bfe93b32d9e0a854fef560d5a97ddb13914ae7602ccb2d2a506c212f9983d171c8dcf965cadfccda7ad167a7d2f3d4838ef1300e5977a17187d6fe95ca3712e3c46cb621b270233ad96d51a7805b87a78d8c60da0b175a65a6d16b10529d6c4ff0e233a65cbcaafd9ec932ba0ce89cca831df09" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + } + ] + }, + { + "id": "withdraw-composite-09", + "family": "withdraw_composite", + "expected_valid": true, + "payload": { + "equality_proof_data_hex": "ccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3cae8987a60b1e17c31d6ad1f761f292faf40797115e868dac41d1bb6fe962af580cdf3055b47894c4579b1cd122fc82facf6278fa2179e20339ab436d123d2501c88ec8dc255d2667627ecd06acf71cc543fddaeb180573e3cc6b55f2e59b5b3911000000000000802c69e87f3c3997bafe95552064819ea2a8fb6c93dbc65ae21caeef962a5f5926f8110816ce86b30e517f25152452c1eea043e7dab3d56220511a9b6cbf57a4361aaa571bc1d6378dd2b6e682e6bad0d85e1ebd8fe6d15cee3be89c1e707339094c2af69d16e863c1545cbe1a1bc2005c2d66f9f3af489c7bbb039d53b8782209644879d02df7d448cce64535e8a471cfa5d719a677d4efcc1de7027b9ae65a08a3de6526f6082339aaa302a952fd1accf9c7b8b3940730473cc1122421198100", + "range_proof_data_hex": "c88ec8dc255d2667627ecd06acf71cc543fddaeb180573e3cc6b55f2e59b5b39000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000001100000000000080eee9633ad3aefa0ee13ec7d24bf8f480cb6adf1afefc184bf552c212ec30d21cf625ce4bf963e17604b0df60a8e05a76891b3fd12a3a359b14323537a8e8ec14dac0e9ff757d433b6af765e5ea29fa51b3d0ee989d8f952079f2d400e2c98778b0d04c1be4c62d246fa592f0dfb67b83a02a8d0405c5e68fce4c648058a76f39813a4108dcce3eaefde729c952ea7e9279074c0d1d5576d1ab2dd711bf7d3d045f6be2f3e64f29199dbeb2776283d013190c932b0cd53c202af677154d49430a61e783a7847b758c948605c56a390f4a29fac458bc71a41bde1c20275060bb09a0cf63cbeddf5cc16427a2f3c47c2f5bbc0f817caf4599d8e5b685adf698682ffc62b9e7ae839bed2276129dc7e360bc39bb7a0224a8602bb887dc80390f023e186ae0d8da4f5733e7b0cf0c758dbd9cf8beb8d1fa4d815c5e85a68a239c361df81644bedbf0559acdb31ba912a59b2d4c2ccac729ed0685e0ff0a1ec45d6a419a3d0fd89f46da20644dd205d467c6b8be39ca14fa7d0fa4f2528d8023126f1610749a8fd3141160512eb80fa9edad736494dbbe2c17063a8bcb8a1fff0a0f0eac35cb8703a54d3217320b67bef6985b9cfce134211ba517392b13565e403e240a2771c3878b992233d771a81a78569bc412207ba3771d5f102644ec5ec53c6dde71ff0b73f718ab393a35c582991fffedddea451b7411fc00cb2a446c87662f7ac49db80696e19aa99de3b555c0659f5b2b8a8ed9a882396077b7df1300d76416510ae1123f7c0e446a56d63bfe93b32d9e0a854fef560d5a97ddb13914ae7602ccb2d2a506c212f9983d171c8dcf965cadfccda7ad167a7d2f3d4838ef1300e5977a17187d6fe95ca3712e3c46cb621b270233ad96d51a7805b87a78d8c60da0b175a65a6d16b10529d6c4ff0e233a65cbcaafd9ec932ba0ce89cca831df08" + }, + "binding": { + "ciphertext_commitment_hex": "ae8987a60b1e17c31d6ad1f761f292faf40797115e868dac41d1bb6fe962af58", + "ciphertext_handle_hex": "0cdf3055b47894c4579b1cd122fc82facf6278fa2179e20339ab436d123d2501", + "expected_nonce_u64": 9223372036854775825, + "user_pubkey_hex": "ccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c" + }, + "mutations": [ + { + "id": "withdraw-composite-09-swap-eq-rng", + "op": "swap_fields", + "target": "payload.equality_proof_data_hex", + "params": { + "with": "payload.range_proof_data_hex" + }, + "expected_valid": false, + "expected_error_contains": "verification failed" + }, + { + "id": "withdraw-composite-09-nonce", + "op": "replace_field", + "target": "binding.expected_nonce_u64", + "params": { + "value_u64": 9223372036854775824 + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "withdraw-composite-09-pk-u", + "op": "bitflip", + "target": "binding.user_pubkey_hex", + "params": { + "value_hex": "cdab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c" + }, + "expected_valid": false, + "expected_error_contains": "failed" + }, + { + "id": "withdraw-composite-09-eq-trunc", + "op": "truncate", + "target": "payload.equality_proof_data_hex", + "params": { + "value_hex": "ccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3cae8987a60b1e17c31d6ad1f761f292faf40797115e868dac41d1bb6fe962af580cdf3055b47894c4579b1cd122fc82facf6278fa2179e20339ab436d123d2501c88ec8dc255d2667627ecd06acf71cc543fddaeb180573e3cc6b55f2e59b5b3911000000000000802c69e87f3c3997bafe95552064819ea2a8fb6c93dbc65ae21caeef962a5f5926f8110816ce86b30e517f25152452c1eea043e7dab3d56220511a9b6cbf57a4361aaa571bc1d6378dd2b6e682e6bad0d85e1ebd8fe6d15cee3be89c1e707339094c2af69d16e863c1545cbe1a1bc2005c2d66f9f3af489c7bbb039d53b8782209644879d02df7d448cce64535e8a471cfa5d719a677d4efcc1de7027b9ae65a08a3de6526f6082339aaa302a952fd1accf9c7b8b3940730473cc112242119" + }, + "expected_valid": false, + "expected_error_contains": "invalid" + }, + { + "id": "withdraw-composite-09-h0", + "op": "replace_field", + "target": "binding.ciphertext_handle_hex", + "params": { + "value_hex": "0000000000000000000000000000000000000000000000000000000000000000" + }, + "expected_valid": false, + "expected_error_contains": "handle mismatch" + } + ] + } + ] +} \ No newline at end of file diff --git a/x/zkp/keeper/query_grpc_test.go b/x/zkp/keeper/query_grpc_test.go index d8abbcd4..5f10a75b 100644 --- a/x/zkp/keeper/query_grpc_test.go +++ b/x/zkp/keeper/query_grpc_test.go @@ -270,3 +270,111 @@ func TestDirectKeeperGRPCCompositeProofsRequireBindingFields(t *testing.T) { require.Equal(t, "withdraw binding verification failed: missing or invalid pubkey/ciphertext fields (expected 32-byte values)", resp.Error) }) } + +func TestDirectKeeperGRPCProofVerificationRejectsWellFormedButInvalidPayloads(t *testing.T) { + fx := newZkpGRPCTestFixture(t, nil) + defer fx.closer() + + t.Run("withdraw range proof", func(t *testing.T) { + resp, err := fx.client.VerifyWithdrawRangeProof(context.Background(), &types.QueryVerifyWithdrawRangeProofRequest{ + ProofData: make([]byte, 8*32+8+8+672), + }) + require.NoError(t, err) + require.False(t, resp.Valid) + require.Equal(t, "algebraic relation failed", resp.Error) + }) + + t.Run("transfer range proof", func(t *testing.T) { + resp, err := fx.client.VerifyTransferRangeProof(context.Background(), &types.QueryVerifyTransferRangeProofRequest{ + ProofData: make([]byte, 8*32+8+736), + }) + require.NoError(t, err) + require.False(t, resp.Valid) + require.Equal(t, "algebraic relation failed", resp.Error) + }) + + t.Run("validity proof", func(t *testing.T) { + resp, err := fx.client.VerifyValidityProof(context.Background(), &types.QueryVerifyValidityProofRequest{ + ProofData: make([]byte, 416), + }) + require.NoError(t, err) + require.False(t, resp.Valid) + require.Equal(t, "validity proof: invalid proof", resp.Error) + }) + + t.Run("equality proof", func(t *testing.T) { + resp, err := fx.client.VerifyEqualityProof(context.Background(), &types.QueryVerifyEqualityProofRequest{ + ProofData: make([]byte, 320), + }) + require.NoError(t, err) + require.False(t, resp.Valid) + require.Equal(t, "algebraic relation failed", resp.Error) + }) +} + +func TestDirectKeeperGRPCCompositeProofsBindingAndVerificationFailures(t *testing.T) { + fx := newZkpGRPCTestFixture(t, nil) + defer fx.closer() + + zero32 := make([]byte, 32) + nonZero32 := make([]byte, 32) + nonZero32[0] = 1 + + t.Run("transfer proof bundle binding mismatch", func(t *testing.T) { + resp, err := fx.client.VerifyTransferProofs(context.Background(), &types.QueryVerifyTransferProofsRequest{ + EqualityProofData: make([]byte, 320), + RangeProofData: make([]byte, 8*32+8+736), + ValidityProofData: make([]byte, 416), + SenderPubkey: nonZero32, + RecipientPubkey: zero32, + CurrentBalanceCommitment: zero32, + CurrentBalanceHandle: zero32, + }) + require.NoError(t, err) + require.False(t, resp.Valid) + require.Equal(t, "transfer binding verification failed: sender pubkey mismatch", resp.Error) + }) + + t.Run("transfer proof bundle verification stage", func(t *testing.T) { + resp, err := fx.client.VerifyTransferProofs(context.Background(), &types.QueryVerifyTransferProofsRequest{ + EqualityProofData: make([]byte, 320), + RangeProofData: make([]byte, 8*32+8+736), + ValidityProofData: make([]byte, 416), + SenderPubkey: zero32, + RecipientPubkey: zero32, + CurrentBalanceCommitment: zero32, + CurrentBalanceHandle: zero32, + }) + require.NoError(t, err) + require.False(t, resp.Valid) + require.Equal(t, "equality proof verification failed: algebraic relation failed", resp.Error) + }) + + t.Run("withdraw proof bundle nonce mismatch", func(t *testing.T) { + resp, err := fx.client.VerifyWithdrawProofs(context.Background(), &types.QueryVerifyWithdrawProofsRequest{ + EqualityProofData: make([]byte, 328), + RangeProofData: make([]byte, 8*32+8+8+672), + UserPubkey: zero32, + CiphertextCommitment: zero32, + CiphertextHandle: zero32, + ExpectedNonce: 1, + }) + require.NoError(t, err) + require.False(t, resp.Valid) + require.Equal(t, "withdraw binding verification failed: withdraw equality proof nonce mismatch", resp.Error) + }) + + t.Run("withdraw proof bundle verification stage", func(t *testing.T) { + resp, err := fx.client.VerifyWithdrawProofs(context.Background(), &types.QueryVerifyWithdrawProofsRequest{ + EqualityProofData: make([]byte, 328), + RangeProofData: make([]byte, 8*32+8+8+672), + UserPubkey: zero32, + CiphertextCommitment: zero32, + CiphertextHandle: zero32, + ExpectedNonce: 0, + }) + require.NoError(t, err) + require.False(t, resp.Valid) + require.Equal(t, "equality proof verification failed: algebraic relation failed", resp.Error) + }) +} diff --git a/x/zkp/keeper/zkp_verification_vectors_test.go b/x/zkp/keeper/zkp_verification_vectors_test.go new file mode 100644 index 00000000..99d0456c --- /dev/null +++ b/x/zkp/keeper/zkp_verification_vectors_test.go @@ -0,0 +1,446 @@ +package keeper_test + +import ( + "context" + "encoding/hex" + "encoding/json" + "os" + "path/filepath" + "runtime" + "strings" + "testing" + + "github.com/Fairblock/fairyring/x/zkp/keeper" + "github.com/Fairblock/fairyring/x/zkp/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" +) + +const ( + zkpVectorLenEqualityProof = 320 + zkpVectorLenValidityProof = 416 + zkpVectorLenWithdrawEqualityProof = 328 + zkpVectorLenTransferRangeProof = 8*32 + 8 + 736 + zkpVectorLenWithdrawRangeProof = 8*32 + 8 + 8 + 672 +) + +type zkpVerificationVectorsRoot struct { + Version string `json:"version"` + Repo *zkpProofRepoMeta `json:"repo,omitempty"` + VerificationVectors []zkpVerificationVector `json:"verification_vectors"` +} + +type zkpProofRepoMeta struct { + Pkg string `json:"pkg"` + Version string `json:"version"` +} + +type zkpVerificationVector struct { + ID string `json:"id"` + Family string `json:"family"` + ExpectedValid bool `json:"expected_valid"` + Payload json.RawMessage `json:"payload"` + Binding json.RawMessage `json:"binding"` + Mutations []zkpVectorMut `json:"mutations"` +} + +type zkpVectorMut struct { + ID string `json:"id"` + Op string `json:"op"` + Target string `json:"target"` + Params json.RawMessage `json:"params"` + ExpectedValid bool `json:"expected_valid"` + ExpectedErrorContains string `json:"expected_error_contains"` +} + +type zkpMutParams struct { + ValueHex string `json:"value_hex"` + ValueU64 uint64 `json:"value_u64"` + With string `json:"with"` +} + +type payloadEquality struct { + ProofDataHex string `json:"proof_data_hex"` +} + +type payloadValidity struct { + ProofDataHex string `json:"proof_data_hex"` +} + +type payloadRange struct { + ProofDataHex string `json:"proof_data_hex"` +} + +type payloadTransferComposite struct { + EqualityProofDataHex string `json:"equality_proof_data_hex"` + RangeProofDataHex string `json:"range_proof_data_hex"` + ValidityProofDataHex string `json:"validity_proof_data_hex"` +} + +type payloadWithdrawComposite struct { + EqualityProofDataHex string `json:"equality_proof_data_hex"` + RangeProofDataHex string `json:"range_proof_data_hex"` +} + +type bindingTransfer struct { + SenderPubkeyHex string `json:"sender_pubkey_hex"` + RecipientPubkeyHex string `json:"recipient_pubkey_hex"` + CurrentBalanceCommitmentHex string `json:"current_balance_commitment_hex"` + CurrentBalanceHandleHex string `json:"current_balance_handle_hex"` +} + +type bindingWithdraw struct { + UserPubkeyHex string `json:"user_pubkey_hex"` + CiphertextCommitmentHex string `json:"ciphertext_commitment_hex"` + CiphertextHandleHex string `json:"ciphertext_handle_hex"` + ExpectedNonceU64 uint64 `json:"expected_nonce_u64"` +} + +func zkpVerificationVectorsJSONPath(t *testing.T) string { + t.Helper() + _, file, _, ok := runtime.Caller(0) + if !ok { + t.Fatal("runtime.Caller failed") + } + return filepath.Join(filepath.Dir(file), "../../../test-vectors/zkp_verification_vectors.json") +} + +func zkpLoadVerificationVectors(t *testing.T) *zkpVerificationVectorsRoot { + t.Helper() + raw, err := os.ReadFile(zkpVerificationVectorsJSONPath(t)) + require.NoError(t, err) + var root zkpVerificationVectorsRoot + require.NoError(t, json.Unmarshal(raw, &root)) + require.Equal(t, "1", root.Version) + require.NotEmpty(t, root.VerificationVectors) + return &root +} + +func zkpAssertVectorProofByteLengths(t *testing.T, vc *zkpVerificationVector) { + t.Helper() + switch vc.Family { + case "equality": + var pl payloadEquality + require.NoError(t, json.Unmarshal(vc.Payload, &pl)) + require.Len(t, zkpDecodeHex(t, pl.ProofDataHex), zkpVectorLenEqualityProof) + case "validity": + var pl payloadValidity + require.NoError(t, json.Unmarshal(vc.Payload, &pl)) + require.Len(t, zkpDecodeHex(t, pl.ProofDataHex), zkpVectorLenValidityProof) + case "transfer_range": + var pl payloadRange + require.NoError(t, json.Unmarshal(vc.Payload, &pl)) + require.Len(t, zkpDecodeHex(t, pl.ProofDataHex), zkpVectorLenTransferRangeProof) + case "withdraw_range": + var pl payloadRange + require.NoError(t, json.Unmarshal(vc.Payload, &pl)) + require.Len(t, zkpDecodeHex(t, pl.ProofDataHex), zkpVectorLenWithdrawRangeProof) + case "transfer_composite": + var pl payloadTransferComposite + require.NoError(t, json.Unmarshal(vc.Payload, &pl)) + require.Len(t, zkpDecodeHex(t, pl.EqualityProofDataHex), zkpVectorLenEqualityProof) + require.Len(t, zkpDecodeHex(t, pl.RangeProofDataHex), zkpVectorLenTransferRangeProof) + require.Len(t, zkpDecodeHex(t, pl.ValidityProofDataHex), zkpVectorLenValidityProof) + case "withdraw_composite": + var pl payloadWithdrawComposite + require.NoError(t, json.Unmarshal(vc.Payload, &pl)) + require.Len(t, zkpDecodeHex(t, pl.EqualityProofDataHex), zkpVectorLenWithdrawEqualityProof) + require.Len(t, zkpDecodeHex(t, pl.RangeProofDataHex), zkpVectorLenWithdrawRangeProof) + default: + t.Fatalf("unknown family %q", vc.Family) + } +} + +func zkpDecodeHex(t *testing.T, s string) []byte { + t.Helper() + s = strings.TrimPrefix(strings.ToLower(strings.TrimSpace(s)), "0x") + b, err := hex.DecodeString(s) + require.NoError(t, err) + return b +} + +func zkpMutationErrMatches(actual, needle string) bool { + la := strings.ToLower(actual) + ln := strings.ToLower(strings.TrimSpace(needle)) + if ln == "" { + return strings.TrimSpace(actual) != "" + } + if strings.Contains(la, ln) { + return true + } + switch ln { + case "verification failed": + return strings.Contains(la, "algebraic relation failed") || + strings.Contains(la, "deserialization error") || + strings.Contains(la, "invalid proof") || + strings.Contains(la, "verification failed") || + strings.Contains(la, "invalid equality proof data length") || + strings.Contains(la, "invalid range proof data length") || + strings.Contains(la, "invalid validity proof data length") || + strings.Contains(la, "equality proof verification failed:") || + strings.Contains(la, "range proof verification failed:") || + strings.Contains(la, "validity proof verification failed:") + case "deserialization": + return strings.Contains(la, "deserialization") || + strings.Contains(la, "algebraic relation failed") || + strings.Contains(la, "validity proof: invalid proof") + default: + return false + } +} + +func zkpSwapRangeProofCommitmentSlots01(t *testing.T, proof []byte) []byte { + t.Helper() + require.GreaterOrEqual(t, len(proof), 64, "range proof must span at least two 32-byte commitments") + out := make([]byte, len(proof)) + copy(out, proof) + copy(out[0:32], proof[32:64]) + copy(out[32:64], proof[0:32]) + return out +} + +func zkpApplyVectorMutation(t *testing.T, family string, payload, binding json.RawMessage, m zkpVectorMut) (json.RawMessage, json.RawMessage) { + t.Helper() + var p zkpMutParams + if len(m.Params) > 0 { + require.NoError(t, json.Unmarshal(m.Params, &p)) + } + switch family { + case "equality": + var pl payloadEquality + require.NoError(t, json.Unmarshal(payload, &pl)) + switch m.Op { + case "bitflip", "truncate", "replace_field": + pl.ProofDataHex = p.ValueHex + default: + t.Fatalf("unsupported op %q for equality", m.Op) + } + b, err := json.Marshal(pl) + require.NoError(t, err) + return b, binding + case "validity": + var pl payloadValidity + require.NoError(t, json.Unmarshal(payload, &pl)) + switch m.Op { + case "bitflip", "truncate", "replace_field": + pl.ProofDataHex = p.ValueHex + default: + t.Fatalf("unsupported op %q for validity", m.Op) + } + b, err := json.Marshal(pl) + require.NoError(t, err) + return b, binding + case "transfer_range", "withdraw_range": + var pl payloadRange + require.NoError(t, json.Unmarshal(payload, &pl)) + switch m.Op { + case "bitflip", "truncate", "replace_field": + pl.ProofDataHex = p.ValueHex + case "swap_fields": + raw := zkpDecodeHex(t, pl.ProofDataHex) + sw := zkpSwapRangeProofCommitmentSlots01(t, raw) + pl.ProofDataHex = hex.EncodeToString(sw) + default: + t.Fatalf("unsupported op %q for %s", m.Op, family) + } + b, err := json.Marshal(pl) + require.NoError(t, err) + return b, binding + case "transfer_composite": + var pl payloadTransferComposite + var bd bindingTransfer + require.NoError(t, json.Unmarshal(payload, &pl)) + if len(binding) > 0 { + require.NoError(t, json.Unmarshal(binding, &bd)) + } + switch m.Op { + case "swap_fields": + if p.With == "payload.validity_proof_data_hex" { + pl.EqualityProofDataHex, pl.ValidityProofDataHex = pl.ValidityProofDataHex, pl.EqualityProofDataHex + } else { + t.Fatalf("unsupported swap_fields with %q", p.With) + } + case "bitflip": + switch m.Target { + case "binding.sender_pubkey_hex": + bd.SenderPubkeyHex = p.ValueHex + case "binding.recipient_pubkey_hex": + bd.RecipientPubkeyHex = p.ValueHex + default: + t.Fatalf("unsupported bitflip target %q", m.Target) + } + case "replace_field": + switch m.Target { + case "binding.current_balance_commitment_hex": + bd.CurrentBalanceCommitmentHex = p.ValueHex + default: + t.Fatalf("unsupported replace_field target %q", m.Target) + } + case "truncate": + switch m.Target { + case "payload.equality_proof_data_hex": + pl.EqualityProofDataHex = p.ValueHex + case "payload.range_proof_data_hex": + pl.RangeProofDataHex = p.ValueHex + case "payload.validity_proof_data_hex": + pl.ValidityProofDataHex = p.ValueHex + default: + t.Fatalf("unsupported truncate target %q", m.Target) + } + default: + t.Fatalf("unsupported op %q for transfer_composite", m.Op) + } + pb, err := json.Marshal(pl) + require.NoError(t, err) + bb, err := json.Marshal(bd) + require.NoError(t, err) + return pb, bb + case "withdraw_composite": + var pl payloadWithdrawComposite + var bd bindingWithdraw + require.NoError(t, json.Unmarshal(payload, &pl)) + if len(binding) > 0 { + require.NoError(t, json.Unmarshal(binding, &bd)) + } + switch m.Op { + case "swap_fields": + if p.With == "payload.range_proof_data_hex" { + pl.EqualityProofDataHex, pl.RangeProofDataHex = pl.RangeProofDataHex, pl.EqualityProofDataHex + } else { + t.Fatalf("unsupported swap_fields with %q", p.With) + } + case "replace_field": + switch m.Target { + case "binding.expected_nonce_u64": + bd.ExpectedNonceU64 = p.ValueU64 + case "binding.ciphertext_handle_hex": + bd.CiphertextHandleHex = p.ValueHex + default: + t.Fatalf("unsupported replace_field target %q", m.Target) + } + case "bitflip": + if m.Target == "binding.user_pubkey_hex" { + bd.UserPubkeyHex = p.ValueHex + } else { + t.Fatalf("unsupported bitflip target %q", m.Target) + } + case "truncate": + if m.Target == "payload.equality_proof_data_hex" { + pl.EqualityProofDataHex = p.ValueHex + } else { + t.Fatalf("unsupported truncate target %q", m.Target) + } + default: + t.Fatalf("unsupported op %q for withdraw_composite", m.Op) + } + pb, err := json.Marshal(pl) + require.NoError(t, err) + bb, err := json.Marshal(bd) + require.NoError(t, err) + return pb, bb + default: + t.Fatalf("unknown family %q", family) + } + return nil, nil +} + +func zkpRunVerificationVectorCase(t *testing.T, k *keeper.Keeper, goCtx context.Context, vc *zkpVerificationVector, payload, binding json.RawMessage) (bool, string) { + t.Helper() + switch vc.Family { + case "equality": + var pl payloadEquality + require.NoError(t, json.Unmarshal(payload, &pl)) + resp, err := k.VerifyEqualityProof(goCtx, &types.QueryVerifyEqualityProofRequest{ + ProofData: zkpDecodeHex(t, pl.ProofDataHex), + }) + require.NoError(t, err) + return resp.Valid, resp.Error + case "validity": + var pl payloadValidity + require.NoError(t, json.Unmarshal(payload, &pl)) + resp, err := k.VerifyValidityProof(goCtx, &types.QueryVerifyValidityProofRequest{ + ProofData: zkpDecodeHex(t, pl.ProofDataHex), + }) + require.NoError(t, err) + return resp.Valid, resp.Error + case "transfer_range": + var pl payloadRange + require.NoError(t, json.Unmarshal(payload, &pl)) + resp, err := k.VerifyTransferRangeProof(goCtx, &types.QueryVerifyTransferRangeProofRequest{ + ProofData: zkpDecodeHex(t, pl.ProofDataHex), + }) + require.NoError(t, err) + return resp.Valid, resp.Error + case "withdraw_range": + var pl payloadRange + require.NoError(t, json.Unmarshal(payload, &pl)) + resp, err := k.VerifyWithdrawRangeProof(goCtx, &types.QueryVerifyWithdrawRangeProofRequest{ + ProofData: zkpDecodeHex(t, pl.ProofDataHex), + }) + require.NoError(t, err) + return resp.Valid, resp.Error + case "transfer_composite": + var pl payloadTransferComposite + var bd bindingTransfer + require.NoError(t, json.Unmarshal(payload, &pl)) + require.NotEmpty(t, binding, "transfer_composite requires binding") + require.NoError(t, json.Unmarshal(binding, &bd)) + resp, err := k.VerifyTransferProofs(goCtx, &types.QueryVerifyTransferProofsRequest{ + EqualityProofData: zkpDecodeHex(t, pl.EqualityProofDataHex), + RangeProofData: zkpDecodeHex(t, pl.RangeProofDataHex), + ValidityProofData: zkpDecodeHex(t, pl.ValidityProofDataHex), + SenderPubkey: zkpDecodeHex(t, bd.SenderPubkeyHex), + RecipientPubkey: zkpDecodeHex(t, bd.RecipientPubkeyHex), + CurrentBalanceCommitment: zkpDecodeHex(t, bd.CurrentBalanceCommitmentHex), + CurrentBalanceHandle: zkpDecodeHex(t, bd.CurrentBalanceHandleHex), + }) + require.NoError(t, err) + return resp.Valid, resp.Error + case "withdraw_composite": + var pl payloadWithdrawComposite + var bd bindingWithdraw + require.NoError(t, json.Unmarshal(payload, &pl)) + require.NotEmpty(t, binding, "withdraw_composite requires binding") + require.NoError(t, json.Unmarshal(binding, &bd)) + resp, err := k.VerifyWithdrawProofs(goCtx, &types.QueryVerifyWithdrawProofsRequest{ + EqualityProofData: zkpDecodeHex(t, pl.EqualityProofDataHex), + RangeProofData: zkpDecodeHex(t, pl.RangeProofDataHex), + UserPubkey: zkpDecodeHex(t, bd.UserPubkeyHex), + CiphertextCommitment: zkpDecodeHex(t, bd.CiphertextCommitmentHex), + CiphertextHandle: zkpDecodeHex(t, bd.CiphertextHandleHex), + ExpectedNonce: bd.ExpectedNonceU64, + }) + require.NoError(t, err) + return resp.Valid, resp.Error + default: + t.Fatalf("unknown family %q", vc.Family) + } + return false, "" +} + +func TestZkpVerificationVectorsAgainstKeeper(t *testing.T) { + root := zkpLoadVerificationVectors(t) + k, sdkCtx := newZkpKeeperForGRPCTest(t) + goCtx := sdk.WrapSDKContext(sdkCtx) + + for i := range root.VerificationVectors { + vc := &root.VerificationVectors[i] + t.Run(vc.ID, func(t *testing.T) { + zkpAssertVectorProofByteLengths(t, vc) + valid, errMsg := zkpRunVerificationVectorCase(t, k, goCtx, vc, vc.Payload, vc.Binding) + require.Equal(t, vc.ExpectedValid, valid, "error: %s", errMsg) + if vc.ExpectedValid { + require.Empty(t, errMsg) + } + for j := range vc.Mutations { + mut := &vc.Mutations[j] + t.Run(mut.ID, func(t *testing.T) { + pay, bind := zkpApplyVectorMutation(t, vc.Family, vc.Payload, vc.Binding, *mut) + v, e := zkpRunVerificationVectorCase(t, k, goCtx, vc, pay, bind) + require.Equal(t, mut.ExpectedValid, v, "error: %s", e) + require.True(t, zkpMutationErrMatches(e, mut.ExpectedErrorContains), "got %q want contains %q", e, mut.ExpectedErrorContains) + }) + } + }) + } +} diff --git a/x/zkp/verification/commitment/commitment_test.go b/x/zkp/verification/commitment/commitment_test.go index 19f802e6..34a8a259 100644 --- a/x/zkp/verification/commitment/commitment_test.go +++ b/x/zkp/verification/commitment/commitment_test.go @@ -335,3 +335,63 @@ func TestVerifyWithdrawEqualityProofRejectsAlgebraicallyInvalidButWellFormedProo t.Fatalf("expected algebraic failure for random well-formed withdraw proof, got %v", err) } } + +func cBuildProofObjects(t *testing.T) (*EqualityProof, *ElGamalPubkey, *ElGamalCiphertext, *PedersenCommitment, *CiphertextCommitmentEqualityProofContext) { + t.Helper() + pd := cBaseEqualityData(t) + var pk ElGamalPubkey + if err := pk.FromPod(pd.Context.Pubkey); err != nil { + t.Fatalf("pubkey decode failed: %v", err) + } + var ct ElGamalCiphertext + if err := ct.FromPod(pd.Context.Ciphertext); err != nil { + t.Fatalf("ciphertext decode failed: %v", err) + } + cm, err := PedersenCommitmentFromPod(pd.Context.Commitment) + if err != nil { + t.Fatalf("commitment decode failed: %v", err) + } + raw := pd.Proof.AsBytes() + proof, err := EqualityProofFromBytes(&raw) + if err != nil { + t.Fatalf("proof decode failed: %v", err) + } + return proof, &pk, &ct, cm, &pd.Context +} + +func TestEqualityProofVerifyRejectsIdentityInputs(t *testing.T) { + cases := []struct { + name string + mut func(*ElGamalPubkey, *ElGamalCiphertext, *PedersenCommitment) + }{ + {"identity pubkey", func(pk *ElGamalPubkey, _ *ElGamalCiphertext, _ *PedersenCommitment) { pk.P.SetZero() }}, + {"identity ciphertext commitment", func(_ *ElGamalPubkey, ct *ElGamalCiphertext, _ *PedersenCommitment) { + ct.Commitment.P.SetZero() + }}, + {"identity ciphertext handle", func(_ *ElGamalPubkey, ct *ElGamalCiphertext, _ *PedersenCommitment) { + ct.Handle.P.SetZero() + }}, + {"identity pedersen commitment", func(_ *ElGamalPubkey, _ *ElGamalCiphertext, cm *PedersenCommitment) { + cm.P.SetZero() + }}, + } + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + proof, pk, ct, cm, ctx := cBuildProofObjects(t) + tt.mut(pk, ct, cm) + err := proof.Verify(pk, ct, cm, newSplTranscript(ctx)) + if !errors.Is(err, ErrProofAlgebraic) { + t.Fatalf("expected ErrProofAlgebraic, got %v", err) + } + }) + } +} + +func TestEqualityProofVerifyRejectsMalformedPointEncoding(t *testing.T) { + proof, pk, ct, cm, ctx := cBuildProofObjects(t) + proof.Y0 = common.CompressedRistretto(cInvalidPointBytes()) + err := proof.Verify(pk, ct, cm, newSplTranscript(ctx)) + if !errors.Is(err, common.ErrDeserialization) { + t.Fatalf("expected point deserialization error, got %v", err) + } +} diff --git a/x/zkp/verification/common/common_test.go b/x/zkp/verification/common/common_test.go index 8bda1e82..4ef62c0c 100644 --- a/x/zkp/verification/common/common_test.go +++ b/x/zkp/verification/common/common_test.go @@ -291,6 +291,70 @@ func TestChallengeScalarDeterminism(t *testing.T) { } } +func TestValidateAndAppendPointDecodedMatchesOriginalPoint(t *testing.T) { + encoded := CompressedRistretto(testPointBytes(t, 19)) + tr := merlin.NewTranscript("decode") + decoded, err := ValidateAndAppendPointDecoded(tr, []byte("P"), &encoded) + if err != nil { + t.Fatalf("expected valid point to decode, got %v", err) + } + original, ok := encoded.Decompress() + if !ok { + t.Fatal("expected valid point encoding to decompress") + } + if !decoded.Equals(original) { + t.Fatal("decoded point mismatch") + } +} + +func TestAppendHelpersAffectTranscriptChallenges(t *testing.T) { + build := func(sVal uint64, pVal uint64) [32]byte { + tr := merlin.NewTranscript("append-helpers") + s := testScalar(t, sVal) + p := CompressedRistretto(testPointBytes(t, pVal)) + AppendScalar(tr, []byte("s"), &s) + AppendPoint(tr, []byte("p"), &p) + return testScalarBytesFromScalar(t, ChallengeScalar(tr, []byte("c"))) + } + + if build(3, 5) != build(3, 5) { + t.Fatal("append helper transcript is not deterministic") + } + if build(3, 5) == build(4, 5) { + t.Fatal("scalar append mutation did not change challenge") + } + if build(3, 5) == build(3, 6) { + t.Fatal("point append mutation did not change challenge") + } +} + +func TestVartimeMultiScalarMulLinearComposition(t *testing.T) { + s1 := testScalar(t, 2) + s2 := testScalar(t, 3) + s3 := testScalar(t, 5) + p1 := testPoint(t, 7) + p2 := testPoint(t, 11) + p3 := testPoint(t, 13) + + left, err := VartimeMultiScalarMul([]*Scalar{&s1, &s2, &s3}, []*Point{&p1, &p2, &p3}) + if err != nil { + t.Fatalf("left multiscalar failed: %v", err) + } + rightA, err := VartimeMultiScalarMul([]*Scalar{&s1, &s2}, []*Point{&p1, &p2}) + if err != nil { + t.Fatalf("rightA multiscalar failed: %v", err) + } + rightB, err := VartimeMultiScalarMul([]*Scalar{&s3}, []*Point{&p3}) + if err != nil { + t.Fatalf("rightB multiscalar failed: %v", err) + } + var right Point + right.Add(&rightA, &rightB) + if !left.Equals(&right) { + t.Fatal("multiscalar linear composition mismatch") + } +} + func mustDecodeHex32Common(t *testing.T, s string) [32]byte { t.Helper() b, err := os.ReadFile(s) diff --git a/x/zkp/verification/range/range_test.go b/x/zkp/verification/range/range_test.go index 27554c63..2e7b88cb 100644 --- a/x/zkp/verification/range/range_test.go +++ b/x/zkp/verification/range/range_test.go @@ -411,6 +411,17 @@ func TestBatchInvertScalarsWithZero(t *testing.T) { } } +func TestBatchInvertScalarsEmptyInput(t *testing.T) { + allInv, err := batchInvertScalars(nil) + if err != nil { + t.Fatalf("batchInvertScalars(nil): %v", err) + } + one := rpScalar(t, 1) + if rpScalarBytesFromScalar(t, allInv) != rpScalarBytesFromScalar(t, one) { + t.Fatal("empty inversion product must be one") + } +} + func TestMultiscalarMulParallelMatchesSerial(t *testing.T) { scalars := []Scalar{rpScalar(t, 2), rpScalar(t, 3), rpScalar(t, 5), rpScalar(t, 7), rpScalar(t, 11)} points := []*Point{} @@ -503,6 +514,57 @@ func TestLeadingZeros32(t *testing.T) { } } +func TestRangeProofDeltaMatchesIndependentConstruction(t *testing.T) { + y := rpScalar(t, 7) + z := rpScalar(t, 11) + bitLengths := []int{16, 32, 64} + + got := rangeProofDelta(bitLengths, &y, &z) + + manualSumPowers := func(base Scalar, n int) Scalar { + var sum Scalar + var term Scalar + term.SetOne() + for i := 0; i < n; i++ { + sum.Add(&sum, &term) + var next Scalar + next.Mul(&term, &base) + term = next + } + return sum + } + + nm := 0 + for _, bl := range bitLengths { + nm += bl + } + sumY := manualSumPowers(y, nm) + var z2 Scalar + z2.Mul(&z, &z) + var zMinusZ2 Scalar + zMinusZ2.Sub(&z, &z2) + var want Scalar + want.Mul(&zMinusZ2, &sumY) + var expZ Scalar + expZ.Mul(&z2, &z) + two := rpScalar(t, 2) + for _, bl := range bitLengths { + sum2 := manualSumPowers(two, bl) + var term Scalar + term.Mul(&expZ, &sum2) + var negTerm Scalar + negTerm.Neg(&term) + want.Add(&want, &negTerm) + var nextExp Scalar + nextExp.Mul(&expZ, &z) + expZ = nextExp + } + + if rpScalarBytesFromScalar(t, got) != rpScalarBytesFromScalar(t, want) { + t.Fatal("rangeProofDelta mismatch") + } +} + type sharedGeneratorVectorsRange struct { H string `json:"h"` GChain map[string]string `json:"g_chain"` diff --git a/x/zkp/verification/validity/validity_test.go b/x/zkp/verification/validity/validity_test.go index 403ae4d9..e4b0198e 100644 --- a/x/zkp/verification/validity/validity_test.go +++ b/x/zkp/verification/validity/validity_test.go @@ -297,3 +297,67 @@ func TestVerifyValidityProofRejectsAlgebraicallyInvalidButWellFormedProof(t *tes t.Fatalf("expected random well-formed validity proof to fail, got %v", err) } } + +func vBuildProofObjects(t *testing.T) (*GroupedCiphertext2HandlesValidityProof, *PedersenCommitment, *ElGamalPubkey, *ElGamalPubkey, *DecryptHandle, *DecryptHandle, *BatchedGroupedCiphertext2HandlesValidityProofContext) { + t.Helper() + pd := vBaseData(t) + grouped, err := GroupedElGamalCiphertext2FromPod(pd.Context.GroupedCiphertextLo) + if err != nil { + t.Fatalf("grouped ciphertext decode failed: %v", err) + } + var first ElGamalPubkey + if err := first.FromPod(pd.Context.FirstPubkey); err != nil { + t.Fatalf("first pubkey decode failed: %v", err) + } + var second ElGamalPubkey + if err := second.FromPod(pd.Context.SecondPubkey); err != nil { + t.Fatalf("second pubkey decode failed: %v", err) + } + inner, err := GroupedCiphertext2HandlesValidityProofFromBytes(pd.Proof.Bytes[:]) + if err != nil { + t.Fatalf("proof decode failed: %v", err) + } + return inner, &grouped.Commitment, &first, &second, &grouped.Handles[0], &grouped.Handles[1], &pd.Context +} + +func TestGroupedValidityProofVerifyRejectsIdentityInputs(t *testing.T) { + cases := []struct { + name string + mut func(*PedersenCommitment, *ElGamalPubkey, *ElGamalPubkey, *DecryptHandle, *DecryptHandle) + }{ + {"identity first pubkey", func(_ *PedersenCommitment, first *ElGamalPubkey, _ *ElGamalPubkey, _ *DecryptHandle, _ *DecryptHandle) { + first.P.SetZero() + }}, + {"identity second pubkey", func(_ *PedersenCommitment, _ *ElGamalPubkey, second *ElGamalPubkey, _ *DecryptHandle, _ *DecryptHandle) { + second.P.SetZero() + }}, + {"identity commitment", func(c *PedersenCommitment, _ *ElGamalPubkey, _ *ElGamalPubkey, _ *DecryptHandle, _ *DecryptHandle) { + c.P.SetZero() + }}, + {"identity first handle", func(_ *PedersenCommitment, _ *ElGamalPubkey, _ *ElGamalPubkey, h0 *DecryptHandle, _ *DecryptHandle) { + h0.P.SetZero() + }}, + {"identity second handle", func(_ *PedersenCommitment, _ *ElGamalPubkey, _ *ElGamalPubkey, _ *DecryptHandle, h1 *DecryptHandle) { + h1.P.SetZero() + }}, + } + for _, tt := range cases { + t.Run(tt.name, func(t *testing.T) { + proof, c, first, second, h0, h1, ctx := vBuildProofObjects(t) + tt.mut(c, first, second, h0, h1) + err := proof.Verify(c, first, second, h0, h1, ctx.NewTranscript()) + if !errors.Is(err, ErrValidityInvalidProof) { + t.Fatalf("expected ErrValidityInvalidProof, got %v", err) + } + }) + } +} + +func TestGroupedValidityProofVerifyRejectsMalformedPointEncoding(t *testing.T) { + proof, c, first, second, h0, h1, ctx := vBuildProofObjects(t) + proof.Y0 = common.CompressedRistretto(vInvalidPointBytes()) + err := proof.Verify(c, first, second, h0, h1, ctx.NewTranscript()) + if !errors.Is(err, common.ErrDeserialization) { + t.Fatalf("expected point deserialization error, got %v", err) + } +} From f48d88916c2f41931da81a9112916368249ff7c0 Mon Sep 17 00:00:00 2001 From: SetarehGhorshi Date: Wed, 6 May 2026 08:52:24 -0400 Subject: [PATCH 24/42] additional tests --- scripts/tests/zkp_e2e/multi_val_zkp_cw_e2e.sh | 30 +++- x/zkp/keeper/query_gas_metering_test.go | 135 ++++++++++++++++ x/zkp/keeper/query_proof_fuzz_test.go | 52 ++++++ x/zkp/keeper/query_proof_verification.go | 23 +++ x/zkp/keeper/zkp_verification_vectors_test.go | 151 ++++++++++++++++-- x/zkp/types/keys.go | 2 + x/zkp/verification/commitment/commitment.go | 27 +++- .../commitment/commitment_test.go | 40 ++++- x/zkp/verification/common/common_test.go | 9 +- .../transcriptgold/transcript_vectors.json | 26 +++ .../internal/transcriptgold/transcriptgold.go | 75 +++++++++ .../transcriptgold/transcriptgold_test.go | 24 +++ x/zkp/verification/range/range.go | 94 ++++++++++- x/zkp/verification/range/range_test.go | 71 ++++++++ x/zkp/verification/validity/validity.go | 26 +++ x/zkp/verification/validity/validity_test.go | 40 +++++ 16 files changed, 789 insertions(+), 36 deletions(-) create mode 100644 x/zkp/keeper/query_gas_metering_test.go create mode 100644 x/zkp/keeper/query_proof_fuzz_test.go create mode 100644 x/zkp/verification/internal/transcriptgold/transcript_vectors.json create mode 100644 x/zkp/verification/internal/transcriptgold/transcriptgold.go create mode 100644 x/zkp/verification/internal/transcriptgold/transcriptgold_test.go diff --git a/scripts/tests/zkp_e2e/multi_val_zkp_cw_e2e.sh b/scripts/tests/zkp_e2e/multi_val_zkp_cw_e2e.sh index 6227c106..90de7b4c 100755 --- a/scripts/tests/zkp_e2e/multi_val_zkp_cw_e2e.sh +++ b/scripts/tests/zkp_e2e/multi_val_zkp_cw_e2e.sh @@ -767,6 +767,13 @@ print(base64.b64encode(b"\x01\x02\x03").decode()) PY } +oversized_b64() { + python3 - <<'PY' +import base64 +print(base64.b64encode(bytes([7]) * 16384).decode()) +PY +} + zero32_b64() { python3 - <<'PY' import base64 @@ -792,13 +799,13 @@ make_withdraw_query_bad_base64() { '{verify_withdraw_proofs:{equality_proof_data:"%%%not-base64%%%",range_proof_data:$short,user_pubkey:$zero32,ciphertext_commitment:$zero32,ciphertext_handle:$zero32,expected_nonce:0}}' } -make_transfer_query_short() { - local short="$1" +make_transfer_query_payload() { + local payload="$1" local zero32="$2" jq -cn \ - --arg short "$short" \ + --arg payload "$payload" \ --arg zero32 "$zero32" \ - '{verify_transfer_proofs:{equality_proof_data:$short,range_proof_data:$short,validity_proof_data:$short,sender_pubkey:$zero32,recipient_pubkey:$zero32,current_balance_commitment:$zero32,current_balance_handle:$zero32}}' + '{verify_transfer_proofs:{equality_proof_data:$payload,range_proof_data:$payload,validity_proof_data:$payload,sender_pubkey:$zero32,recipient_pubkey:$zero32,current_balance_commitment:$zero32,current_balance_handle:$zero32}}' } run_prebuilt_zkp_query_tester_cases() { @@ -808,14 +815,17 @@ run_prebuilt_zkp_query_tester_cases() { fi [[ -n "$ZKP_QUERY_TESTER_WASM" ]] || fail "RUN_ZKP_QUERY_TESTER=1 requires ZKP_QUERY_TESTER_WASM=/path/to/prebuilt_tester.wasm" - local short zero32 withdraw_short withdraw_bad64 transfer_short + local short oversized zero32 withdraw_short withdraw_bad64 transfer_short transfer_oversized withdraw_oversized_bad64 store_and_instantiate_tester_contract "$ZKP_QUERY_TESTER_WASM" short="$(short_b64)" + oversized="$(oversized_b64)" zero32="$(zero32_b64)" withdraw_short="$(make_withdraw_query_short "$short" "$zero32")" withdraw_bad64="$(make_withdraw_query_bad_base64 "$short" "$zero32")" - transfer_short="$(make_transfer_query_short "$short" "$zero32")" + transfer_short="$(make_transfer_query_payload "$short" "$zero32")" + transfer_oversized="$(make_transfer_query_payload "$oversized" "$zero32")" + withdraw_oversized_bad64="$(make_withdraw_query_bad_base64 "${oversized}%%%bad%%%" "$zero32")" assert_trusted_not_contains "$TESTER_CONTRACT_ADDR" @@ -834,7 +844,13 @@ run_prebuilt_zkp_query_tester_cases() { log "Tester Case 5: malformed base64 is rejected in wasm binding before keeper verification" expect_wasm_query_fail_contains "$TESTER_CONTRACT_ADDR" "$withdraw_bad64" "base64" - log "Tester Case 6: removing trust blocks the custom ZKP query path again" + log "Tester Case 6: oversized valid base64 reaches keeper and fails proof-length checks" + expect_wasm_query_valid_false_contains "$TESTER_CONTRACT_ADDR" "$transfer_oversized" "invalid equality proof data length" + + log "Tester Case 7: oversized malformed base64 is rejected in wasm binding before keeper verification" + expect_wasm_query_fail_contains "$TESTER_CONTRACT_ADDR" "$withdraw_oversized_bad64" "base64" + + log "Tester Case 8: removing trust blocks the custom ZKP query path again" remove_trusted_contract "$TESTER_CONTRACT_ADDR" expect_wasm_query_fail_contains "$TESTER_CONTRACT_ADDR" "$withdraw_short" "not authorized" } diff --git a/x/zkp/keeper/query_gas_metering_test.go b/x/zkp/keeper/query_gas_metering_test.go new file mode 100644 index 00000000..62cf3429 --- /dev/null +++ b/x/zkp/keeper/query_gas_metering_test.go @@ -0,0 +1,135 @@ +package keeper_test + +import ( + "context" + "testing" + + storetypes "cosmossdk.io/store/types" + "github.com/Fairblock/fairyring/x/zkp/keeper" + "github.com/Fairblock/fairyring/x/zkp/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" +) + +func newGasMeteredKeeperContext(t *testing.T) (*keeper.Keeper, sdk.Context, context.Context) { + t.Helper() + k, ctx := newZkpKeeperForGRPCTest(t) + ctx = ctx.WithGasMeter(storetypes.NewGasMeter(1_000_000_000)) + return k, ctx, sdk.WrapSDKContext(ctx) +} + +func TestKeeperGasMeteringBaseCharge(t *testing.T) { + k, ctx, goCtx := newGasMeteredKeeperContext(t) + + before := ctx.GasMeter().GasConsumed() + respEq, err := k.VerifyEqualityProof(goCtx, &types.QueryVerifyEqualityProofRequest{ProofData: []byte{1}}) + require.NoError(t, err) + require.False(t, respEq.Valid) + require.Equal(t, "invalid proof data length", respEq.Error) + afterEq := ctx.GasMeter().GasConsumed() + require.Equal(t, before+types.GasVerifyEqualityProof, afterEq) + + respVal, err := k.VerifyValidityProof(goCtx, &types.QueryVerifyValidityProofRequest{ProofData: []byte{1}}) + require.NoError(t, err) + require.False(t, respVal.Valid) + require.Equal(t, "invalid proof data length", respVal.Error) + afterVal := ctx.GasMeter().GasConsumed() + require.Equal(t, afterEq+types.GasVerifyValidityProof, afterVal) +} + +func TestKeeperGasMeteringMalformedPreParse(t *testing.T) { + k, ctx, goCtx := newGasMeteredKeeperContext(t) + + before := ctx.GasMeter().GasConsumed() + respW, err := k.VerifyWithdrawRangeProof(goCtx, &types.QueryVerifyWithdrawRangeProofRequest{ProofData: []byte{1}}) + require.NoError(t, err) + require.False(t, respW.Valid) + require.Equal(t, "invalid proof data length", respW.Error) + afterW := ctx.GasMeter().GasConsumed() + require.Equal(t, before+types.GasVerifyWithdrawRangeProof, afterW) + + respT, err := k.VerifyTransferRangeProof(goCtx, &types.QueryVerifyTransferRangeProofRequest{ProofData: []byte{1}}) + require.NoError(t, err) + require.False(t, respT.Valid) + require.Equal(t, "invalid proof data length", respT.Error) + afterT := ctx.GasMeter().GasConsumed() + require.Equal(t, afterW+types.GasVerifyTransferRangeProof, afterT) + + respTP, err := k.VerifyTransferProofs(goCtx, &types.QueryVerifyTransferProofsRequest{ + EqualityProofData: []byte{1}, + RangeProofData: []byte{1}, + ValidityProofData: []byte{1}, + }) + require.NoError(t, err) + require.False(t, respTP.Valid) + require.Equal(t, "invalid equality proof data length", respTP.Error) + afterTP := ctx.GasMeter().GasConsumed() + require.Equal(t, afterT+types.GasVerifyTransferProofs, afterTP) + + respWP, err := k.VerifyWithdrawProofs(goCtx, &types.QueryVerifyWithdrawProofsRequest{ + EqualityProofData: []byte{1}, + RangeProofData: []byte{1}, + }) + require.NoError(t, err) + require.False(t, respWP.Valid) + require.Equal(t, "invalid equality proof data length", respWP.Error) + afterWP := ctx.GasMeter().GasConsumed() + require.Equal(t, afterTP+types.GasVerifyWithdrawProofs, afterWP) +} + +func TestKeeperGasMeteringProportionalCharge(t *testing.T) { + makeTransferRangeProof := func(bitLen uint8) []byte { + raw := make([]byte, 8*32+8+736) + raw[8*32] = bitLen + return raw + } + makeWithdrawRangeProof := func(bitLen uint8) []byte { + raw := make([]byte, 8*32+8+8+672) + raw[8*32] = bitLen + return raw + } + + t.Run("transfer range scales by bit length", func(t *testing.T) { + k, ctx, goCtx := newGasMeteredKeeperContext(t) + before := ctx.GasMeter().GasConsumed() + _, err := k.VerifyTransferRangeProof(goCtx, &types.QueryVerifyTransferRangeProofRequest{ + ProofData: makeTransferRangeProof(16), + }) + require.NoError(t, err) + after16 := ctx.GasMeter().GasConsumed() + + _, err = k.VerifyTransferRangeProof(goCtx, &types.QueryVerifyTransferRangeProofRequest{ + ProofData: makeTransferRangeProof(64), + }) + require.NoError(t, err) + after64 := ctx.GasMeter().GasConsumed() + + charge16 := after16 - before + charge64 := after64 - after16 + require.Equal(t, types.GasVerifyTransferRangeProof+16*types.GasRangeProofPerBitU128, charge16) + require.Equal(t, types.GasVerifyTransferRangeProof+64*types.GasRangeProofPerBitU128, charge64) + require.Greater(t, charge64, charge16) + }) + + t.Run("withdraw range scales by bit length", func(t *testing.T) { + k, ctx, goCtx := newGasMeteredKeeperContext(t) + before := ctx.GasMeter().GasConsumed() + _, err := k.VerifyWithdrawRangeProof(goCtx, &types.QueryVerifyWithdrawRangeProofRequest{ + ProofData: makeWithdrawRangeProof(16), + }) + require.NoError(t, err) + after16 := ctx.GasMeter().GasConsumed() + + _, err = k.VerifyWithdrawRangeProof(goCtx, &types.QueryVerifyWithdrawRangeProofRequest{ + ProofData: makeWithdrawRangeProof(64), + }) + require.NoError(t, err) + after64 := ctx.GasMeter().GasConsumed() + + charge16 := after16 - before + charge64 := after64 - after16 + require.Equal(t, types.GasVerifyWithdrawRangeProof+16*types.GasRangeProofPerBitU64, charge16) + require.Equal(t, types.GasVerifyWithdrawRangeProof+64*types.GasRangeProofPerBitU64, charge64) + require.Greater(t, charge64, charge16) + }) +} diff --git a/x/zkp/keeper/query_proof_fuzz_test.go b/x/zkp/keeper/query_proof_fuzz_test.go new file mode 100644 index 00000000..1418e160 --- /dev/null +++ b/x/zkp/keeper/query_proof_fuzz_test.go @@ -0,0 +1,52 @@ +package keeper_test + +import ( + "testing" + + "github.com/Fairblock/fairyring/x/zkp/types" + sdk "github.com/cosmos/cosmos-sdk/types" +) + +func FuzzProofDataDeserialization(f *testing.F) { + seeds := [][]byte{ + {}, + {0}, + {1, 2, 3}, + make([]byte, 32), + make([]byte, 256), + } + for _, s := range seeds { + f.Add(s) + } + + f.Fuzz(func(t *testing.T, raw []byte) { + if len(raw) > 4096 { + raw = raw[:4096] + } + + k, ctx := newZkpKeeperForGRPCTest(t) + goCtx := sdk.WrapSDKContext(ctx) + + _, _ = k.VerifyWithdrawRangeProof(goCtx, &types.QueryVerifyWithdrawRangeProofRequest{ProofData: raw}) + _, _ = k.VerifyTransferRangeProof(goCtx, &types.QueryVerifyTransferRangeProofRequest{ProofData: raw}) + _, _ = k.VerifyValidityProof(goCtx, &types.QueryVerifyValidityProofRequest{ProofData: raw}) + _, _ = k.VerifyEqualityProof(goCtx, &types.QueryVerifyEqualityProofRequest{ProofData: raw}) + _, _ = k.VerifyTransferProofs(goCtx, &types.QueryVerifyTransferProofsRequest{ + EqualityProofData: raw, + RangeProofData: raw, + ValidityProofData: raw, + SenderPubkey: raw, + RecipientPubkey: raw, + CurrentBalanceCommitment: raw, + CurrentBalanceHandle: raw, + }) + _, _ = k.VerifyWithdrawProofs(goCtx, &types.QueryVerifyWithdrawProofsRequest{ + EqualityProofData: raw, + RangeProofData: raw, + UserPubkey: raw, + CiphertextCommitment: raw, + CiphertextHandle: raw, + ExpectedNonce: 0, + }) + }) +} diff --git a/x/zkp/keeper/query_proof_verification.go b/x/zkp/keeper/query_proof_verification.go index e9779271..5c66cd64 100644 --- a/x/zkp/keeper/query_proof_verification.go +++ b/x/zkp/keeper/query_proof_verification.go @@ -3,6 +3,7 @@ package keeper import ( "context" + storetypes "cosmossdk.io/store/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/Fairblock/fairyring/x/zkp/types" @@ -15,6 +16,20 @@ import ( "google.golang.org/grpc/status" ) +func rangeBitLengthGas(bitLengths [8]uint8, maxPerCommit uint8, perBit storetypes.Gas) storetypes.Gas { + var total storetypes.Gas + for _, bl := range bitLengths { + if bl == 0 { + continue + } + if bl > maxPerCommit { + bl = maxPerCommit + } + total += storetypes.Gas(bl) * perBit + } + return total +} + func (k Keeper) VerifyWithdrawRangeProof(goCtx context.Context, req *types.QueryVerifyWithdrawRangeProofRequest) (*types.QueryVerifyWithdrawRangeProofResponse, error) { if req == nil { return nil, status.Error(codes.InvalidArgument, "invalid request") @@ -54,6 +69,10 @@ func (k Keeper) VerifyWithdrawRangeProof(goCtx context.Context, req *types.Query proofData.Context.BitLengths[i] = req.ProofData[offset] offset++ } + ctx.GasMeter().ConsumeGas( + rangeBitLengthGas(proofData.Context.BitLengths, 64, types.GasRangeProofPerBitU64), + "verify_withdraw_range_proof_bitlength", + ) if offset+8 > len(req.ProofData) { return &types.QueryVerifyWithdrawRangeProofResponse{ @@ -127,6 +146,10 @@ func (k Keeper) VerifyTransferRangeProof(goCtx context.Context, req *types.Query proofData.Context.BitLengths[i] = req.ProofData[offset] offset++ } + ctx.GasMeter().ConsumeGas( + rangeBitLengthGas(proofData.Context.BitLengths, 64, types.GasRangeProofPerBitU128), + "verify_transfer_range_proof_bitlength", + ) // Deserialize proof if offset+736 > len(req.ProofData) { diff --git a/x/zkp/keeper/zkp_verification_vectors_test.go b/x/zkp/keeper/zkp_verification_vectors_test.go index 99d0456c..7a6956cf 100644 --- a/x/zkp/keeper/zkp_verification_vectors_test.go +++ b/x/zkp/keeper/zkp_verification_vectors_test.go @@ -199,6 +199,18 @@ func zkpSwapRangeProofCommitmentSlots01(t *testing.T, proof []byte) []byte { return out } +func zkpCorruptRangeProofScalarTail(t *testing.T, proof []byte) []byte { + t.Helper() + require.GreaterOrEqual(t, len(proof), 64, "range proof must include scalar tail") + out := make([]byte, len(proof)) + copy(out, proof) + start := len(out) - 32 + for i := start; i < len(out); i++ { + out[i] ^= 0x5a + } + return out +} + func zkpApplyVectorMutation(t *testing.T, family string, payload, binding json.RawMessage, m zkpVectorMut) (json.RawMessage, json.RawMessage) { t.Helper() var p zkpMutParams @@ -418,29 +430,134 @@ func zkpRunVerificationVectorCase(t *testing.T, k *keeper.Keeper, goCtx context. return false, "" } +func zkpExecVectorBase(t *testing.T, k *keeper.Keeper, goCtx context.Context, vc *zkpVerificationVector) { + t.Helper() + zkpAssertVectorProofByteLengths(t, vc) + valid, errMsg := zkpRunVerificationVectorCase(t, k, goCtx, vc, vc.Payload, vc.Binding) + require.Equal(t, vc.ExpectedValid, valid, "error: %s", errMsg) + if vc.ExpectedValid { + require.Empty(t, errMsg) + } +} + +func zkpExecVectorMutations(t *testing.T, k *keeper.Keeper, goCtx context.Context, vc *zkpVerificationVector) { + t.Helper() + for j := range vc.Mutations { + mut := &vc.Mutations[j] + t.Run(mut.ID, func(t *testing.T) { + pay, bind := zkpApplyVectorMutation(t, vc.Family, vc.Payload, vc.Binding, *mut) + v, e := zkpRunVerificationVectorCase(t, k, goCtx, vc, pay, bind) + require.Equal(t, mut.ExpectedValid, v, "error: %s", e) + require.True(t, zkpMutationErrMatches(e, mut.ExpectedErrorContains), "got %q want contains %q", e, mut.ExpectedErrorContains) + }) + } +} + +func zkpVerificationTestEnv(t *testing.T) (*keeper.Keeper, context.Context) { + t.Helper() + k, sdkCtx := newZkpKeeperForGRPCTest(t) + return k, sdk.WrapSDKContext(sdkCtx) +} + func TestZkpVerificationVectorsAgainstKeeper(t *testing.T) { root := zkpLoadVerificationVectors(t) - k, sdkCtx := newZkpKeeperForGRPCTest(t) - goCtx := sdk.WrapSDKContext(sdkCtx) + k, goCtx := zkpVerificationTestEnv(t) for i := range root.VerificationVectors { vc := &root.VerificationVectors[i] t.Run(vc.ID, func(t *testing.T) { - zkpAssertVectorProofByteLengths(t, vc) - valid, errMsg := zkpRunVerificationVectorCase(t, k, goCtx, vc, vc.Payload, vc.Binding) - require.Equal(t, vc.ExpectedValid, valid, "error: %s", errMsg) - if vc.ExpectedValid { - require.Empty(t, errMsg) - } - for j := range vc.Mutations { - mut := &vc.Mutations[j] - t.Run(mut.ID, func(t *testing.T) { - pay, bind := zkpApplyVectorMutation(t, vc.Family, vc.Payload, vc.Binding, *mut) - v, e := zkpRunVerificationVectorCase(t, k, goCtx, vc, pay, bind) - require.Equal(t, mut.ExpectedValid, v, "error: %s", e) - require.True(t, zkpMutationErrMatches(e, mut.ExpectedErrorContains), "got %q want contains %q", e, mut.ExpectedErrorContains) - }) - } + zkpExecVectorBase(t, k, goCtx, vc) + zkpExecVectorMutations(t, k, goCtx, vc) + }) + } +} + +func TestRangeProofVerifyHappyPath(t *testing.T) { + root := zkpLoadVerificationVectors(t) + k, goCtx := zkpVerificationTestEnv(t) + for i := range root.VerificationVectors { + vc := &root.VerificationVectors[i] + if !vc.ExpectedValid { + continue + } + if vc.Family != "transfer_range" && vc.Family != "withdraw_range" { + continue + } + t.Run(vc.ID, func(t *testing.T) { + zkpExecVectorBase(t, k, goCtx, vc) + }) + } +} + +func TestRangeProofVerifyMalformedCommitments(t *testing.T) { + root := zkpLoadVerificationVectors(t) + k, goCtx := zkpVerificationTestEnv(t) + for i := range root.VerificationVectors { + vc := &root.VerificationVectors[i] + if !vc.ExpectedValid || len(vc.Mutations) == 0 { + continue + } + if vc.Family != "transfer_range" && vc.Family != "withdraw_range" { + continue + } + t.Run(vc.ID, func(t *testing.T) { + zkpExecVectorMutations(t, k, goCtx, vc) + + var pl payloadRange + require.NoError(t, json.Unmarshal(vc.Payload, &pl)) + raw := zkpDecodeHex(t, pl.ProofDataHex) + + t.Run("swap_commitment_slots", func(t *testing.T) { + swapped := zkpSwapRangeProofCommitmentSlots01(t, raw) + mut := pl + mut.ProofDataHex = hex.EncodeToString(swapped) + payload, err := json.Marshal(mut) + require.NoError(t, err) + + v, e := zkpRunVerificationVectorCase(t, k, goCtx, vc, payload, vc.Binding) + require.False(t, v, "swapping commitments must invalidate range proof") + require.True(t, zkpMutationErrMatches(e, "verification failed"), "got %q", e) + }) + + t.Run("wrong_scalars_tail", func(t *testing.T) { + corrupt := zkpCorruptRangeProofScalarTail(t, raw) + mut := pl + mut.ProofDataHex = hex.EncodeToString(corrupt) + payload, err := json.Marshal(mut) + require.NoError(t, err) + + v, e := zkpRunVerificationVectorCase(t, k, goCtx, vc, payload, vc.Binding) + require.False(t, v, "corrupting scalar tail must invalidate range proof") + require.True(t, zkpMutationErrMatches(e, "verification failed"), "got %q", e) + }) + }) + } +} + +func TestEqualityProofVerifyHappyPath(t *testing.T) { + root := zkpLoadVerificationVectors(t) + k, goCtx := zkpVerificationTestEnv(t) + for i := range root.VerificationVectors { + vc := &root.VerificationVectors[i] + if !vc.ExpectedValid || vc.Family != "equality" { + continue + } + t.Run(vc.ID, func(t *testing.T) { + zkpExecVectorBase(t, k, goCtx, vc) + }) + } +} + +func TestValidityProofVerifyHappyPath(t *testing.T) { + root := zkpLoadVerificationVectors(t) + k, goCtx := zkpVerificationTestEnv(t) + for i := range root.VerificationVectors { + vc := &root.VerificationVectors[i] + if !vc.ExpectedValid || vc.Family != "validity" { + continue + } + t.Run(vc.ID, func(t *testing.T) { + zkpExecVectorBase(t, k, goCtx, vc) }) } } diff --git a/x/zkp/types/keys.go b/x/zkp/types/keys.go index b6daad80..c55dd5c1 100644 --- a/x/zkp/types/keys.go +++ b/x/zkp/types/keys.go @@ -13,6 +13,8 @@ const ( GasVerifyValidityProof storetypes.Gas = 60_000 GasVerifyWithdrawRangeProof storetypes.Gas = 80_000 GasVerifyTransferRangeProof storetypes.Gas = 100_000 + GasRangeProofPerBitU64 storetypes.Gas = 500 + GasRangeProofPerBitU128 storetypes.Gas = 500 GasVerifyTransferProofs storetypes.Gas = 250_000 GasVerifyWithdrawProofs storetypes.Gas = 150_000 ) diff --git a/x/zkp/verification/commitment/commitment.go b/x/zkp/verification/commitment/commitment.go index f6bff08d..6d22478a 100644 --- a/x/zkp/verification/commitment/commitment.go +++ b/x/zkp/verification/commitment/commitment.go @@ -311,7 +311,7 @@ func VerifyEqualityProof( return ErrProofDeserialization } - t := newSplTranscript(&pd.Context) + t := NewEqualityInstructionTranscript(&pd.Context) if err := proof.Verify(&pk, &ct, cm, t); err != nil { return ErrProofAlgebraic @@ -323,7 +323,30 @@ func ciphertextCommitmentEqualityProofDomainSeparator(t *merlin.Transcript) { t.AppendMessage([]byte("dom-sep"), []byte("ciphertext-commitment-equality-proof")) } -func newSplTranscript(ctx *CiphertextCommitmentEqualityProofContext) *merlin.Transcript { +// EqualityProofFiatShamirChallenges returns Merlin Fiat–Shamir scalars (c, w) after appending the +// ciphertext-commitment-equality proof domain separator and proof messages to transcript. +func EqualityProofFiatShamirChallenges(transcript *merlin.Transcript, ep *EqualityProof) (c Scalar, w Scalar, err error) { + ciphertextCommitmentEqualityProofDomainSeparator(transcript) + if err := common.ValidateAndAppendPoint(transcript, []byte("Y_0"), &ep.Y0); err != nil { + return Scalar{}, Scalar{}, err + } + if err := common.ValidateAndAppendPoint(transcript, []byte("Y_1"), &ep.Y1); err != nil { + return Scalar{}, Scalar{}, err + } + if err := common.ValidateAndAppendPoint(transcript, []byte("Y_2"), &ep.Y2); err != nil { + return Scalar{}, Scalar{}, err + } + c = common.ChallengeScalar(transcript, []byte("c")) + common.AppendScalar(transcript, []byte("z_s"), &ep.Zs) + common.AppendScalar(transcript, []byte("z_x"), &ep.Zx) + common.AppendScalar(transcript, []byte("z_r"), &ep.Zr) + w = common.ChallengeScalar(transcript, []byte("w")) + return c, w, nil +} + +// NewEqualityInstructionTranscript returns the Merlin transcript after the +// ciphertext-commitment-equality instruction prefix (pubkey, ciphertext, commitment). +func NewEqualityInstructionTranscript(ctx *CiphertextCommitmentEqualityProofContext) *merlin.Transcript { t := merlin.NewTranscript("ciphertext-commitment-equality-instruction") // pubkey diff --git a/x/zkp/verification/commitment/commitment_test.go b/x/zkp/verification/commitment/commitment_test.go index 34a8a259..4afa98dd 100644 --- a/x/zkp/verification/commitment/commitment_test.go +++ b/x/zkp/verification/commitment/commitment_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/Fairblock/fairyring/x/zkp/verification/common" + "github.com/Fairblock/fairyring/x/zkp/verification/internal/transcriptgold" ) func cScalar(t *testing.T, v uint64) Scalar { @@ -274,7 +275,7 @@ func TestWithdrawTranscriptBindsNonce(t *testing.T) { Commitment: pd.Context.Commitment, } - normal := newSplTranscript(&normalCtx) + normal := NewEqualityInstructionTranscript(&normalCtx) withdraw := newWithdrawSplTranscript(&pd.Context) cNormal := common.ChallengeScalar(normal, []byte("c")) cWithdraw := common.ChallengeScalar(withdraw, []byte("c")) @@ -291,6 +292,39 @@ func TestWithdrawTranscriptBindsNonce(t *testing.T) { } } +func TestEqualityProofTranscriptParity(t *testing.T) { + vec, err := transcriptgold.LoadTranscriptVectors() + if err != nil { + t.Fatalf("load golden vectors: %v", err) + } + wantC, err := transcriptgold.ParseHex32(vec.Equality.C) + if err != nil { + t.Fatalf("golden c: %v", err) + } + wantW, err := transcriptgold.ParseHex32(vec.Equality.W) + if err != nil { + t.Fatalf("golden w: %v", err) + } + + pd := cBaseEqualityData(t) + raw := pd.Proof.AsBytes() + ep, err := EqualityProofFromBytes(&raw) + if err != nil { + t.Fatalf("decode proof: %v", err) + } + tr := NewEqualityInstructionTranscript(&pd.Context) + c, w, err := EqualityProofFiatShamirChallenges(tr, ep) + if err != nil { + t.Fatalf("fiat-shamir: %v", err) + } + if cScalarBytesFromScalar(t, c) != wantC { + t.Fatalf("c does not match golden vector (regenerate with gencmd or fix Rust transcript)") + } + if cScalarBytesFromScalar(t, w) != wantW { + t.Fatalf("w does not match golden vector (regenerate with gencmd or fix Rust transcript)") + } +} + func TestVerifyWithdrawEqualityProofRejectsMalformedContextAndProof(t *testing.T) { cases := []struct { name string @@ -379,7 +413,7 @@ func TestEqualityProofVerifyRejectsIdentityInputs(t *testing.T) { t.Run(tt.name, func(t *testing.T) { proof, pk, ct, cm, ctx := cBuildProofObjects(t) tt.mut(pk, ct, cm) - err := proof.Verify(pk, ct, cm, newSplTranscript(ctx)) + err := proof.Verify(pk, ct, cm, NewEqualityInstructionTranscript(ctx)) if !errors.Is(err, ErrProofAlgebraic) { t.Fatalf("expected ErrProofAlgebraic, got %v", err) } @@ -390,7 +424,7 @@ func TestEqualityProofVerifyRejectsIdentityInputs(t *testing.T) { func TestEqualityProofVerifyRejectsMalformedPointEncoding(t *testing.T) { proof, pk, ct, cm, ctx := cBuildProofObjects(t) proof.Y0 = common.CompressedRistretto(cInvalidPointBytes()) - err := proof.Verify(pk, ct, cm, newSplTranscript(ctx)) + err := proof.Verify(pk, ct, cm, NewEqualityInstructionTranscript(ctx)) if !errors.Is(err, common.ErrDeserialization) { t.Fatalf("expected point deserialization error, got %v", err) } diff --git a/x/zkp/verification/common/common_test.go b/x/zkp/verification/common/common_test.go index 4ef62c0c..a03cf1bc 100644 --- a/x/zkp/verification/common/common_test.go +++ b/x/zkp/verification/common/common_test.go @@ -260,13 +260,16 @@ func TestVartimeMultiScalarMul(t *testing.T) { } } -func TestVartimeMultiScalarMulRejectsBadInputs(t *testing.T) { +func TestVartimeMultiScalarMulLengthMismatch(t *testing.T) { s := testScalar(t, 1) - p := testPoint(t, 1) - if _, err := VartimeMultiScalarMul([]*Scalar{&s}, []*Point{}); !errors.Is(err, ErrVectorLengthMismatch) { t.Fatalf("expected vector length error, got %v", err) } +} + +func TestVartimeMultiScalarMulRejectsNilOperands(t *testing.T) { + s := testScalar(t, 1) + p := testPoint(t, 1) if _, err := VartimeMultiScalarMul([]*Scalar{nil}, []*Point{&p}); !errors.Is(err, ErrInvalidInput) { t.Fatalf("expected invalid scalar error, got %v", err) } diff --git a/x/zkp/verification/internal/transcriptgold/transcript_vectors.json b/x/zkp/verification/internal/transcriptgold/transcript_vectors.json new file mode 100644 index 00000000..97c1189e --- /dev/null +++ b/x/zkp/verification/internal/transcriptgold/transcript_vectors.json @@ -0,0 +1,26 @@ +{ + "equality_transfer_fixture": { + "c": "08aa1fcf5c842095b4e824f8bca28147b8563c5df7747ebbed0dcb9f6ca07d06", + "w": "1cc1aaa3536f7d33f937d0d2f5c2997ce3af5d8c1d6aa16f7801abef90e1fd01" + }, + "range_batched_single64_fixture": { + "y": "6eccd46299eeb2b87b9ae154891be986a50fe84452df195e52e8c85583a7320b", + "z": "0b149ef4fea144a849bcf953c8a34ca89196f4939e809da4ab411e7e1f52b90a", + "x": "d134ec2a5682c1a04f7984351e1a2d3b2bef0216ab4f598bc21d3726dc922002", + "w": "c88d7c3a05ec68ebba98eac204a687dd9af8a91cf40738d96afc091ed4ad3206", + "d": "717b8b1c56d5dceda46d572408caec1bd7547643a297bee2e4c3534b3ade920e", + "u": [ + "a7a2a53e60b54d973da479800e8eaadadb4d836b0c6f39e110d246d1ef0f480f", + "29dc020238e63a151455707e93d826a0839abd4672b648e46e5df6651da8c806", + "e496b50a2684b9064b51a66628f17aba764e4db8fd617cc1f58ee87b1d873e0e", + "a277aa3ae2d4c0ecb77001de5ef295e2731834d9fb6313f2cfcbeda8f7cc6f00", + "1d5469d7d1d14427d0d16468a0e02c8cf19688d9c6fa34ea0f32836509e3cf00", + "aaf27f95ae6920b38e5c2c46d6e859d968bd883653e96e71c0de04a90e615e04" + ] + }, + "validity_batched_2handles_fixture": { + "t": "d2e949034f45814e5d080d01675efa9a0990fb5d405131966dabd79bb41c2b0e", + "c": "7d5a96654263d220b6fe7af319e6ba0799c4613e0dfecdc94cf90a90014dd803", + "w": "b0a958b80fca4571ed15f5defbe1d77fee4b00c97f4593db8f907b83a16d760d" + } +} diff --git a/x/zkp/verification/internal/transcriptgold/transcriptgold.go b/x/zkp/verification/internal/transcriptgold/transcriptgold.go new file mode 100644 index 00000000..8f3d20cc --- /dev/null +++ b/x/zkp/verification/internal/transcriptgold/transcriptgold.go @@ -0,0 +1,75 @@ +// Package transcriptgold loads Merlin Fiat–Shamir golden vectors for cross-checking +// the Go verifier against the Rust prover (same fixtures, same transcript order). +package transcriptgold + +import ( + _ "embed" + "encoding/hex" + "encoding/json" + "fmt" + "strings" +) + +//go:embed transcript_vectors.json +var transcriptVectorsJSON []byte + +// TranscriptVectors contains prover-exported challenge vectors. +type TranscriptVectors struct { + Equality EqualityFixture + Range RangeFixture + Validity ValidityFixture +} + +type EqualityFixture struct { + C string `json:"c"` + W string `json:"w"` +} + +type RangeFixture struct { + Y string `json:"y"` + Z string `json:"z"` + X string `json:"x"` + W string `json:"w"` + D string `json:"d"` + U []string `json:"u"` +} + +type ValidityFixture struct { + T string `json:"t"` + C string `json:"c"` + W string `json:"w"` +} + +type vectorsFile struct { + Equality EqualityFixture `json:"equality_transfer_fixture"` + Range RangeFixture `json:"range_batched_single64_fixture"` + Validity ValidityFixture `json:"validity_batched_2handles_fixture"` +} + +// LoadTranscriptVectors parses the embedded golden vector file. +func LoadTranscriptVectors() (TranscriptVectors, error) { + var raw vectorsFile + if err := json.Unmarshal(transcriptVectorsJSON, &raw); err != nil { + return TranscriptVectors{}, fmt.Errorf("transcriptgold: json: %w", err) + } + return TranscriptVectors{ + Equality: raw.Equality, + Range: raw.Range, + Validity: raw.Validity, + }, nil +} + +// ParseHex32 decodes a 64-character hex string into a little-endian canonical scalar encoding. +func ParseHex32(s string) ([32]byte, error) { + var out [32]byte + s = strings.TrimSpace(strings.ToLower(s)) + if len(s) != 64 { + return out, fmt.Errorf("transcriptgold: want 64 hex chars, got %d", len(s)) + } + b, err := hex.DecodeString(s) + if err != nil { + return out, fmt.Errorf("transcriptgold: hex: %w", err) + } + copy(out[:], b) + return out, nil +} diff --git a/x/zkp/verification/internal/transcriptgold/transcriptgold_test.go b/x/zkp/verification/internal/transcriptgold/transcriptgold_test.go new file mode 100644 index 00000000..b09e365b --- /dev/null +++ b/x/zkp/verification/internal/transcriptgold/transcriptgold_test.go @@ -0,0 +1,24 @@ +package transcriptgold + +import "testing" + +func TestLoadTranscriptVectors(t *testing.T) { + vec, err := LoadTranscriptVectors() + if err != nil { + t.Fatal(err) + } + for _, h := range []string{vec.Equality.C, vec.Equality.W, vec.Range.Y, vec.Validity.T} { + if _, err := ParseHex32(h); err != nil { + t.Fatalf("parse %q: %v", h, err) + } + } + if len(vec.Range.U) != 6 { + t.Fatalf("range u len %d", len(vec.Range.U)) + } +} + +func TestParseHex32RejectsBadLength(t *testing.T) { + if _, err := ParseHex32("abcd"); err == nil { + t.Fatal("expected error") + } +} diff --git a/x/zkp/verification/range/range.go b/x/zkp/verification/range/range.go index d7808920..3e2e8e80 100644 --- a/x/zkp/verification/range/range.go +++ b/x/zkp/verification/range/range.go @@ -284,6 +284,7 @@ func (g *generatorsChain) nextPoint() Point { func (ipp *InnerProductProof) verificationScalars( n int, t *merlin.Transcript, + rawUOut *[]Scalar, ) ([]Scalar, []Scalar, []Scalar, []*Point, []*Point, error) { lgN := len(ipp.LVec) @@ -300,6 +301,9 @@ func (ipp *InnerProductProof) verificationScalars( rangeProofInnerProductDomainSeparator(t, uint64(n)) challenges := make([]Scalar, 0, lgN) + if rawUOut != nil { + *rawUOut = (*rawUOut)[:0] + } lPoints := make([]*Point, 0, lgN) rPoints := make([]*Point, 0, lgN) for i := 0; i < lgN; i++ { @@ -314,6 +318,9 @@ func (ipp *InnerProductProof) verificationScalars( lPoints = append(lPoints, lPoint) rPoints = append(rPoints, rPoint) u := challengeScalarRP(t, []byte("u")) + if rawUOut != nil { + *rawUOut = append(*rawUOut, u) + } challenges = append(challenges, u) } @@ -545,7 +552,7 @@ func (rp *RangeProof) Verify( w := challengeScalarRP(t, []byte("w")) - xSq, xInvSq, sVec, lPoints, rPoints, err := rp.IPPProof.verificationScalars(nm, t) + xSq, xInvSq, sVec, lPoints, rPoints, err := rp.IPPProof.verificationScalars(nm, t, nil) if err != nil { return err } @@ -733,6 +740,71 @@ func (rp *RangeProof) Verify( return RangeErrAlgebraicRelation } + +type RangeProofFiatShamirState struct { + Y, Z, X, W Scalar + U []Scalar + D Scalar +} + + +func RangeProofFiatShamirChallenges( + transcript *merlin.Transcript, + rp *RangeProof, + comms []*PedersenCommitment, + bitLengths []int, +) (out RangeProofFiatShamirState, err error) { + if len(comms) != len(bitLengths) { + return out, RangeErrVectorLengthMismatch + } + nm := 0 + for _, bl := range bitLengths { + nm += bl + } + if nm <= 0 || !isPowerOfTwo(nm) { + return out, RangeErrInvalidBitSize + } + var id Point + id.SetZero() + for _, V := range comms { + if V == nil || V.P.Equals(&id) { + return out, RangeErrValidationError + } + } + + rangeProofDomainSeparator(transcript, uint64(nm)) + if _, err := validateAndAppendPointRPDecoded(transcript, []byte("A"), &rp.A); err != nil { + return out, err + } + if _, err := validateAndAppendPointRPDecoded(transcript, []byte("S"), &rp.S); err != nil { + return out, err + } + out.Y = challengeScalarRP(transcript, []byte("y")) + out.Z = challengeScalarRP(transcript, []byte("z")) + if _, err := validateAndAppendPointRPDecoded(transcript, []byte("T_1"), &rp.T1); err != nil { + return out, err + } + if _, err := validateAndAppendPointRPDecoded(transcript, []byte("T_2"), &rp.T2); err != nil { + return out, err + } + out.X = challengeScalarRP(transcript, []byte("x")) + appendScalarRP(transcript, []byte("t_x"), &rp.Tx) + appendScalarRP(transcript, []byte("t_x_blinding"), &rp.TxBlinding) + appendScalarRP(transcript, []byte("e_blinding"), &rp.EBlinding) + out.W = challengeScalarRP(transcript, []byte("w")) + var rawU []Scalar + if _, _, _, _, _, ierr := rp.IPPProof.verificationScalars(nm, transcript, &rawU); ierr != nil { + return out, ierr + } + out.U = rawU + a := rp.IPPProof.A + b := rp.IPPProof.B + appendScalarRP(transcript, []byte("ipp_a"), &a) + appendScalarRP(transcript, []byte("ipp_b"), &b) + out.D = challengeScalarRP(transcript, []byte("d")) + return out, nil +} + func rangeProofDelta(bitLengths []int, y, z *Scalar) Scalar { nm := 0 for _, bl := range bitLengths { @@ -817,7 +889,7 @@ func VerifyWithdrawRange(pd *BatchedRangeProofU64Data) error { return perr } - t := newTranscriptRange(&pd.Context) + t := NewBatchedRangeInstructionTranscript(&pd.Context) rp, err := RangeProofFromPodU64(pd.Proof) if err != nil { @@ -894,13 +966,25 @@ func newWithdrawTranscriptRange(ctx *WithdrawBatchedRangeProofContext) *merlin.T return t } +// NewBatchedRangeProofInstructionTranscript returns the Merlin transcript prefix used for transfer +// U128 range proofs (commitments and bit-lengths), matching VerifyTransferRange. +func NewBatchedRangeProofInstructionTranscript(ctx *BatchedRangeProofContext) *merlin.Transcript { + return NewBatchedRangeInstructionTranscript(ctx) +} + +// BatchedRangeStatement extracts Pedersen commitments and bit-lengths from a batched context, +// respecting padding rules used by VerifyTransferRange (maxBL caps active commitments). +func BatchedRangeStatement(ctx *BatchedRangeProofContext, maxBL uint8) ([]PedersenCommitment, []int, ProofError) { + return collectRangeCtx(ctx, maxBL) +} + func VerifyTransferRange(pd *BatchedRangeProofU128Data) error { commitments, bitLengths, perr := collectRangeCtx(&pd.Context, 64) if perr != 0 { return perr } - t := newTranscriptRange(&pd.Context) + t := NewBatchedRangeInstructionTranscript(&pd.Context) rp, err := RangeProofFromPodU128(pd.Proof) if err != nil { @@ -918,7 +1002,9 @@ func VerifyTransferRange(pd *BatchedRangeProofU128Data) error { return nil } -func newTranscriptRange(ctx *BatchedRangeProofContext) *merlin.Transcript { +// NewBatchedRangeInstructionTranscript builds the Merlin transcript for the batched range +// statement (protocol label, commitments, bit-lengths) before range-proof domain separation. +func NewBatchedRangeInstructionTranscript(ctx *BatchedRangeProofContext) *merlin.Transcript { t := merlin.NewTranscript("batched-range-proof-instruction") var commitsBytes [8 * 32]byte diff --git a/x/zkp/verification/range/range_test.go b/x/zkp/verification/range/range_test.go index 2e7b88cb..13480ef3 100644 --- a/x/zkp/verification/range/range_test.go +++ b/x/zkp/verification/range/range_test.go @@ -10,6 +10,7 @@ import ( "testing" "github.com/Fairblock/fairyring/x/zkp/verification/common" + "github.com/Fairblock/fairyring/x/zkp/verification/internal/transcriptgold" "github.com/gtank/merlin" ) @@ -565,6 +566,76 @@ func TestRangeProofDeltaMatchesIndependentConstruction(t *testing.T) { } } +func TestRangeProofTranscriptParity(t *testing.T) { + vec, err := transcriptgold.LoadTranscriptVectors() + if err != nil { + t.Fatalf("load golden vectors: %v", err) + } + g := vec.Range + parse := func(label, hexStr string) [32]byte { + t.Helper() + b, err := transcriptgold.ParseHex32(hexStr) + if err != nil { + t.Fatalf("%s: %v", label, err) + } + return b + } + wantY := parse("golden y", g.Y) + wantZ := parse("golden z", g.Z) + wantX := parse("golden x", g.X) + wantW := parse("golden w", g.W) + wantD := parse("golden d", g.D) + if len(g.U) != 6 { + t.Fatalf("golden u length %d, want 6", len(g.U)) + } + wantU := make([][32]byte, 6) + for i := range wantU { + wantU[i] = parse("golden u", g.U[i]) + } + + ctx := BatchedRangeProofContext{} + ctx.Commitments[0] = rpPodCommit(t, 1) + ctx.BitLengths[0] = 64 + + rp, err := RangeProofFromBytes(rpValidProofBytes(t, 6)) + if err != nil { + t.Fatalf("proof parse failed: %v", err) + } + pc, err := PedersenCommitmentFromPod(ctx.Commitments[0]) + if err != nil { + t.Fatalf("commitment: %v", err) + } + comm := pc + tr := NewBatchedRangeInstructionTranscript(&ctx) + state, err := RangeProofFiatShamirChallenges(tr, &rp, []*PedersenCommitment{&comm}, []int{64}) + if err != nil { + t.Fatalf("fiat-shamir: %v", err) + } + if rpScalarBytesFromScalar(t, state.Y) != wantY { + t.Fatal("y does not match golden vector (regenerate with gencmd or fix Rust transcript)") + } + if rpScalarBytesFromScalar(t, state.Z) != wantZ { + t.Fatal("z does not match golden vector (regenerate with gencmd or fix Rust transcript)") + } + if rpScalarBytesFromScalar(t, state.X) != wantX { + t.Fatal("x does not match golden vector (regenerate with gencmd or fix Rust transcript)") + } + if rpScalarBytesFromScalar(t, state.W) != wantW { + t.Fatal("w does not match golden vector (regenerate with gencmd or fix Rust transcript)") + } + if rpScalarBytesFromScalar(t, state.D) != wantD { + t.Fatal("d does not match golden vector (regenerate with gencmd or fix Rust transcript)") + } + if len(state.U) != len(wantU) { + t.Fatalf("u len %d, want %d", len(state.U), len(wantU)) + } + for i := range wantU { + if rpScalarBytesFromScalar(t, state.U[i]) != wantU[i] { + t.Fatalf("u[%d] does not match golden vector (regenerate with gencmd or fix Rust transcript)", i) + } + } +} + type sharedGeneratorVectorsRange struct { H string `json:"h"` GChain map[string]string `json:"g_chain"` diff --git a/x/zkp/verification/validity/validity.go b/x/zkp/verification/validity/validity.go index c4132612..48898806 100644 --- a/x/zkp/verification/validity/validity.go +++ b/x/zkp/verification/validity/validity.go @@ -433,3 +433,29 @@ func batchedGroupedCiphertextValidityProofDomainSeparator(t *merlin.Transcript, t.AppendMessage([]byte("handles"), buf[:]) } +// BatchedGroupedValidityFiatShamirChallenges returns (t, c, w) after walking the transcript used in +// BatchedGroupedCiphertext2HandlesValidityProof.Verify. +func BatchedGroupedValidityFiatShamirChallenges( + transcript *merlin.Transcript, + inner *GroupedCiphertext2HandlesValidityProof, + handles uint64, +) (t Scalar, c Scalar, w Scalar, err error) { + batchedGroupedCiphertextValidityProofDomainSeparator(transcript, handles) + t = common.ChallengeScalar(transcript, []byte("t")) + groupedCiphertextValidityProofDomainSeparator(transcript, handles) + if err := common.ValidateAndAppendPoint(transcript, []byte("Y_0"), &inner.Y0); err != nil { + return Scalar{}, Scalar{}, Scalar{}, err + } + if err := common.ValidateAndAppendPoint(transcript, []byte("Y_1"), &inner.Y1); err != nil { + return Scalar{}, Scalar{}, Scalar{}, err + } + if err := common.ValidateAndAppendPoint(transcript, []byte("Y_2"), &inner.Y2); err != nil { + return Scalar{}, Scalar{}, Scalar{}, err + } + c = common.ChallengeScalar(transcript, []byte("c")) + common.AppendScalar(transcript, []byte("z_r"), &inner.Zr) + common.AppendScalar(transcript, []byte("z_x"), &inner.Zx) + w = common.ChallengeScalar(transcript, []byte("w")) + return t, c, w, nil +} + diff --git a/x/zkp/verification/validity/validity_test.go b/x/zkp/verification/validity/validity_test.go index e4b0198e..4668b1b9 100644 --- a/x/zkp/verification/validity/validity_test.go +++ b/x/zkp/verification/validity/validity_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/Fairblock/fairyring/x/zkp/verification/common" + "github.com/Fairblock/fairyring/x/zkp/verification/internal/transcriptgold" ) func vScalar(t *testing.T, n uint64) Scalar { @@ -246,6 +247,45 @@ func TestValidityTranscriptDeterministicAndContextSensitive(t *testing.T) { } } +func TestValidityProofTranscriptParity(t *testing.T) { + vec, err := transcriptgold.LoadTranscriptVectors() + if err != nil { + t.Fatalf("load golden vectors: %v", err) + } + wantT, err := transcriptgold.ParseHex32(vec.Validity.T) + if err != nil { + t.Fatalf("golden t: %v", err) + } + wantC, err := transcriptgold.ParseHex32(vec.Validity.C) + if err != nil { + t.Fatalf("golden c: %v", err) + } + wantW, err := transcriptgold.ParseHex32(vec.Validity.W) + if err != nil { + t.Fatalf("golden w: %v", err) + } + + pd := vBaseData(t) + inner, err := GroupedCiphertext2HandlesValidityProofFromBytes(pd.Proof.Bytes[:]) + if err != nil { + t.Fatalf("decode proof: %v", err) + } + tr := pd.Context.NewTranscript() + tCh, c, w, err := BatchedGroupedValidityFiatShamirChallenges(tr, inner, 2) + if err != nil { + t.Fatalf("fiat-shamir: %v", err) + } + if vScalarBytesFromScalar(t, tCh) != wantT { + t.Fatalf("t does not match golden vector (regenerate with gencmd or fix Rust transcript)") + } + if vScalarBytesFromScalar(t, c) != wantC { + t.Fatalf("c does not match golden vector (regenerate with gencmd or fix Rust transcript)") + } + if vScalarBytesFromScalar(t, w) != wantW { + t.Fatalf("w does not match golden vector (regenerate with gencmd or fix Rust transcript)") + } +} + func TestVerifyValidityProofRejectsMalformedContext(t *testing.T) { cases := []struct { name string From fa59b368dc9368ec00ab24cd861b7e48fc332aa3 Mon Sep 17 00:00:00 2001 From: SetarehGhorshi Date: Wed, 6 May 2026 10:24:03 -0400 Subject: [PATCH 25/42] benchmarks --- .../commitment/commitment_test.go | 231 ++++++++++++++++-- x/zkp/verification/range/range_test.go | 220 +++++++++++++++-- x/zkp/verification/validity/validity_test.go | 157 +++++++++--- 3 files changed, 525 insertions(+), 83 deletions(-) diff --git a/x/zkp/verification/commitment/commitment_test.go b/x/zkp/verification/commitment/commitment_test.go index 4afa98dd..808abb21 100644 --- a/x/zkp/verification/commitment/commitment_test.go +++ b/x/zkp/verification/commitment/commitment_test.go @@ -2,46 +2,52 @@ package commitment import ( "bytes" + "encoding/hex" + "encoding/json" "errors" + "os" + "path/filepath" + "runtime" + "strings" "testing" "github.com/Fairblock/fairyring/x/zkp/verification/common" "github.com/Fairblock/fairyring/x/zkp/verification/internal/transcriptgold" ) -func cScalar(t *testing.T, v uint64) Scalar { - t.Helper() +func cScalar(tb testing.TB, v uint64) Scalar { + tb.Helper() var s Scalar s.SetUint64(v) return s } -func cScalarBytes(t *testing.T, v uint64) [32]byte { - t.Helper() - s := cScalar(t, v) +func cScalarBytes(tb testing.TB, v uint64) [32]byte { + tb.Helper() + s := cScalar(tb, v) var out [32]byte s.BytesInto(&out) return out } -func cScalarBytesFromScalar(t *testing.T, s Scalar) [32]byte { - t.Helper() +func cScalarBytesFromScalar(tb testing.TB, s Scalar) [32]byte { + tb.Helper() var out [32]byte s.BytesInto(&out) return out } -func cPoint(t *testing.T, v uint64) Point { - t.Helper() - s := cScalar(t, v) +func cPoint(tb testing.TB, v uint64) Point { + tb.Helper() + s := cScalar(tb, v) var p Point p.ScalarMult(&common.G, &s) return p } -func cPointBytes(t *testing.T, v uint64) [32]byte { - t.Helper() - p := cPoint(t, v) +func cPointBytes(tb testing.TB, v uint64) [32]byte { + tb.Helper() + p := cPoint(tb, v) var out [32]byte p.BytesInto(&out) return out @@ -55,28 +61,28 @@ func cInvalidPointBytes() [32]byte { return out } -func cBaseEqualityData(t *testing.T) CiphertextCommitmentEqualityProofData { - t.Helper() +func cBaseEqualityData(tb testing.TB) CiphertextCommitmentEqualityProofData { + tb.Helper() return CiphertextCommitmentEqualityProofData{ Context: CiphertextCommitmentEqualityProofContext{ - Pubkey: PodElGamalPubkey{Bytes: cPointBytes(t, 2)}, - Ciphertext: PodElGamalCiphertext{Commitment: cPointBytes(t, 3), Handle: cPointBytes(t, 4)}, - Commitment: PodPedersenCommitment{Bytes: cPointBytes(t, 5)}, + Pubkey: PodElGamalPubkey{Bytes: cPointBytes(tb, 2)}, + Ciphertext: PodElGamalCiphertext{Commitment: cPointBytes(tb, 3), Handle: cPointBytes(tb, 4)}, + Commitment: PodPedersenCommitment{Bytes: cPointBytes(tb, 5)}, }, Proof: PodCiphertextCommitmentEqualityProof{ - Y0: cPointBytes(t, 6), - Y1: cPointBytes(t, 7), - Y2: cPointBytes(t, 8), - Zs: cScalarBytes(t, 9), - Zx: cScalarBytes(t, 10), - Zr: cScalarBytes(t, 11), + Y0: cPointBytes(tb, 6), + Y1: cPointBytes(tb, 7), + Y2: cPointBytes(tb, 8), + Zs: cScalarBytes(tb, 9), + Zx: cScalarBytes(tb, 10), + Zr: cScalarBytes(tb, 11), }, } } -func cBaseWithdrawData(t *testing.T) WithdrawCiphertextCommitmentEqualityProofData { - t.Helper() - base := cBaseEqualityData(t) +func cBaseWithdrawData(tb testing.TB) WithdrawCiphertextCommitmentEqualityProofData { + tb.Helper() + base := cBaseEqualityData(tb) return WithdrawCiphertextCommitmentEqualityProofData{ Context: WithdrawCiphertextCommitmentEqualityProofContext{ Pubkey: base.Context.Pubkey, @@ -325,6 +331,177 @@ func TestEqualityProofTranscriptParity(t *testing.T) { } } +func BenchmarkEqualityProofVerification(b *testing.B) { + cases := []struct { + name string + run func(*testing.B) + }{ + { + name: "transfer", + run: func(b *testing.B) { + base := cBaseEqualityData(b) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + pd := base + _ = VerifyEqualityProof(&pd) + } + }, + }, + { + name: "withdraw", + run: func(b *testing.B) { + base := cBaseWithdrawData(b) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + pd := base + _ = VerifyWithdrawEqualityProof(&pd) + } + }, + }, + } + for _, tc := range cases { + b.Run(tc.name, tc.run) + } +} + +func BenchmarkEqualityProofVerificationRealProofs(b *testing.B) { + type vector struct { + Family string `json:"family"` + ExpectedValid bool `json:"expected_valid"` + Payload struct { + ProofDataHex string `json:"proof_data_hex"` + EqualityProofDataHex string `json:"equality_proof_data_hex"` + } `json:"payload"` + } + type root struct { + VerificationVectors []vector `json:"verification_vectors"` + } + load := func(b *testing.B) root { + b.Helper() + _, file, _, ok := runtime.Caller(0) + if !ok { + b.Fatal("runtime.Caller failed") + } + p := filepath.Join(filepath.Dir(file), "../../../../test-vectors/zkp_verification_vectors.json") + raw, err := os.ReadFile(p) + if err != nil { + b.Fatalf("read vectors: %v", err) + } + var r root + if err := json.Unmarshal(raw, &r); err != nil { + b.Fatalf("unmarshal vectors: %v", err) + } + return r + } + decodeHex := func(b *testing.B, s string) []byte { + b.Helper() + s = strings.TrimPrefix(strings.ToLower(strings.TrimSpace(s)), "0x") + out, err := hex.DecodeString(s) + if err != nil { + b.Fatalf("decode hex: %v", err) + } + return out + } + decodeEq := func(b *testing.B, raw []byte) CiphertextCommitmentEqualityProofData { + b.Helper() + if len(raw) != 320 { + b.Fatalf("equality proof length: got %d", len(raw)) + } + var pd CiphertextCommitmentEqualityProofData + offset := 0 + copy(pd.Context.Pubkey.Bytes[:], raw[offset:offset+32]) + offset += 32 + copy(pd.Context.Ciphertext.Commitment[:], raw[offset:offset+32]) + offset += 32 + copy(pd.Context.Ciphertext.Handle[:], raw[offset:offset+32]) + offset += 32 + copy(pd.Context.Commitment.Bytes[:], raw[offset:offset+32]) + offset += 32 + copy(pd.Proof.Y0[:], raw[offset:offset+32]) + offset += 32 + copy(pd.Proof.Y1[:], raw[offset:offset+32]) + offset += 32 + copy(pd.Proof.Y2[:], raw[offset:offset+32]) + offset += 32 + copy(pd.Proof.Zs[:], raw[offset:offset+32]) + offset += 32 + copy(pd.Proof.Zx[:], raw[offset:offset+32]) + offset += 32 + copy(pd.Proof.Zr[:], raw[offset:offset+32]) + return pd + } + decodeWithdrawEq := func(b *testing.B, raw []byte) WithdrawCiphertextCommitmentEqualityProofData { + b.Helper() + if len(raw) != 328 { + b.Fatalf("withdraw equality proof length: got %d", len(raw)) + } + var pd WithdrawCiphertextCommitmentEqualityProofData + offset := 0 + copy(pd.Context.Pubkey.Bytes[:], raw[offset:offset+32]) + offset += 32 + copy(pd.Context.Ciphertext.Commitment[:], raw[offset:offset+32]) + offset += 32 + copy(pd.Context.Ciphertext.Handle[:], raw[offset:offset+32]) + offset += 32 + copy(pd.Context.Commitment.Bytes[:], raw[offset:offset+32]) + offset += 32 + copy(pd.Context.Nonce[:], raw[offset:offset+8]) + offset += 8 + copy(pd.Proof.Y0[:], raw[offset:offset+32]) + offset += 32 + copy(pd.Proof.Y1[:], raw[offset:offset+32]) + offset += 32 + copy(pd.Proof.Y2[:], raw[offset:offset+32]) + offset += 32 + copy(pd.Proof.Zs[:], raw[offset:offset+32]) + offset += 32 + copy(pd.Proof.Zx[:], raw[offset:offset+32]) + offset += 32 + copy(pd.Proof.Zr[:], raw[offset:offset+32]) + return pd + } + + var eqRaw, withdrawEqRaw []byte + r := load(b) + for i := range r.VerificationVectors { + v := r.VerificationVectors[i] + if !v.ExpectedValid { + continue + } + if v.Family == "equality" && eqRaw == nil && v.Payload.ProofDataHex != "" { + eqRaw = decodeHex(b, v.Payload.ProofDataHex) + } + if v.Family == "withdraw_composite" && withdrawEqRaw == nil && v.Payload.EqualityProofDataHex != "" { + withdrawEqRaw = decodeHex(b, v.Payload.EqualityProofDataHex) + } + } + if eqRaw == nil { + b.Fatal("missing valid equality vector") + } + if withdrawEqRaw == nil { + b.Fatal("missing valid withdraw equality vector") + } + + b.Run("transfer", func(b *testing.B) { + pd := decodeEq(b, eqRaw) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + _ = VerifyEqualityProof(&pd) + } + }) + b.Run("withdraw", func(b *testing.B) { + pd := decodeWithdrawEq(b, withdrawEqRaw) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + _ = VerifyWithdrawEqualityProof(&pd) + } + }) +} + func TestVerifyWithdrawEqualityProofRejectsMalformedContextAndProof(t *testing.T) { cases := []struct { name string diff --git a/x/zkp/verification/range/range_test.go b/x/zkp/verification/range/range_test.go index 13480ef3..589d21ee 100644 --- a/x/zkp/verification/range/range_test.go +++ b/x/zkp/verification/range/range_test.go @@ -2,11 +2,13 @@ package rangeproof import ( "bytes" + "encoding/hex" "encoding/json" "errors" "os" "path/filepath" "runtime" + "strings" "testing" "github.com/Fairblock/fairyring/x/zkp/verification/common" @@ -14,71 +16,71 @@ import ( "github.com/gtank/merlin" ) -func rpScalar(t *testing.T, v uint64) Scalar { - t.Helper() +func rpScalar(tb testing.TB, v uint64) Scalar { + tb.Helper() var s Scalar s.SetUint64(v) return s } -func rpScalarBytes(t *testing.T, v uint64) [32]byte { - t.Helper() - s := rpScalar(t, v) +func rpScalarBytes(tb testing.TB, v uint64) [32]byte { + tb.Helper() + s := rpScalar(tb, v) var out [32]byte s.BytesInto(&out) return out } -func rpScalarBytesFromScalar(t *testing.T, s Scalar) [32]byte { - t.Helper() +func rpScalarBytesFromScalar(tb testing.TB, s Scalar) [32]byte { + tb.Helper() var out [32]byte s.BytesInto(&out) return out } -func rpPoint(t *testing.T, v uint64) Point { - t.Helper() - s := rpScalar(t, v) +func rpPoint(tb testing.TB, v uint64) Point { + tb.Helper() + s := rpScalar(tb, v) var p Point p.ScalarMult(G, &s) return p } -func rpPointBytes(t *testing.T, v uint64) [32]byte { - t.Helper() - p := rpPoint(t, v) +func rpPointBytes(tb testing.TB, v uint64) [32]byte { + tb.Helper() + p := rpPoint(tb, v) var out [32]byte p.BytesInto(&out) return out } -func rpPodCommit(t *testing.T, v uint64) PodPedersenCommitment { - t.Helper() - return PodPedersenCommitment{Bytes: rpPointBytes(t, v)} +func rpPodCommit(tb testing.TB, v uint64) PodPedersenCommitment { + tb.Helper() + return PodPedersenCommitment{Bytes: rpPointBytes(tb, v)} } -func rpValidProofBytes(t *testing.T, lgN int) []byte { - t.Helper() +func rpValidProofBytes(tb testing.TB, lgN int) []byte { + tb.Helper() if lgN <= 0 { lgN = 1 } buf := make([]byte, 0, (7+2*lgN+2)*32) for i := uint64(1); i <= 4; i++ { - b := rpPointBytes(t, i) + b := rpPointBytes(tb, i) buf = append(buf, b[:]...) } for i := uint64(1); i <= 3; i++ { - b := rpScalarBytes(t, i) + b := rpScalarBytes(tb, i) buf = append(buf, b[:]...) } for i := 0; i < lgN; i++ { - l := rpPointBytes(t, uint64(10+i)) - r := rpPointBytes(t, uint64(20+i)) + l := rpPointBytes(tb, uint64(10+i)) + r := rpPointBytes(tb, uint64(20+i)) buf = append(buf, l[:]...) buf = append(buf, r[:]...) } - a := rpScalarBytes(t, 31) - b := rpScalarBytes(t, 32) + a := rpScalarBytes(tb, 31) + b := rpScalarBytes(tb, 32) buf = append(buf, a[:]...) buf = append(buf, b[:]...) return buf @@ -636,6 +638,176 @@ func TestRangeProofTranscriptParity(t *testing.T) { } } +func BenchmarkRangeProofVerificationScaling(b *testing.B) { + cases := []struct { + name string + commitment int + totalBits int + lgN int + }{ + {name: "bits_64", commitment: 1, totalBits: 64, lgN: 6}, + {name: "bits_128", commitment: 2, totalBits: 128, lgN: 7}, + {name: "bits_256", commitment: 4, totalBits: 256, lgN: 8}, + {name: "bits_512", commitment: 8, totalBits: 512, lgN: 9}, + } + + for _, tc := range cases { + b.Run(tc.name, func(b *testing.B) { + var ctx BatchedRangeProofContext + bitLengths := make([]int, tc.commitment) + commitments := make([]*PedersenCommitment, tc.commitment) + for i := 0; i < tc.commitment; i++ { + ctx.Commitments[i] = rpPodCommit(b, uint64(i+1)) + ctx.BitLengths[i] = 64 + bitLengths[i] = 64 + pc, err := PedersenCommitmentFromPod(ctx.Commitments[i]) + if err != nil { + b.Fatalf("commitment[%d]: %v", i, err) + } + commitments[i] = &pc + } + + rp, err := RangeProofFromBytes(rpValidProofBytes(b, tc.lgN)) + if err != nil { + b.Fatalf("proof parse failed: %v", err) + } + + bytesProcessed := int64(tc.totalBits / 8) + b.SetBytes(bytesProcessed) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + tr := NewBatchedRangeInstructionTranscript(&ctx) + _ = rp.Verify(commitments, bitLengths, tr) + } + b.StopTimer() + + nsPerByte := float64(b.Elapsed().Nanoseconds()) / float64(b.N*int(bytesProcessed)) + b.ReportMetric(nsPerByte, "ns/byte") + }) + } +} + +func BenchmarkRangeProofVerificationRealProofs(b *testing.B) { + type vector struct { + Family string `json:"family"` + ExpectedValid bool `json:"expected_valid"` + Payload struct { + ProofDataHex string `json:"proof_data_hex"` + } `json:"payload"` + } + type root struct { + VerificationVectors []vector `json:"verification_vectors"` + } + load := func(b *testing.B) root { + b.Helper() + _, file, _, ok := runtime.Caller(0) + if !ok { + b.Fatal("runtime.Caller failed") + } + p := filepath.Join(filepath.Dir(file), "../../../../test-vectors/zkp_verification_vectors.json") + raw, err := os.ReadFile(p) + if err != nil { + b.Fatalf("read vectors: %v", err) + } + var r root + if err := json.Unmarshal(raw, &r); err != nil { + b.Fatalf("unmarshal vectors: %v", err) + } + return r + } + decodeHex := func(b *testing.B, s string) []byte { + b.Helper() + s = strings.TrimPrefix(strings.ToLower(strings.TrimSpace(s)), "0x") + out, err := hex.DecodeString(s) + if err != nil { + b.Fatalf("decode hex: %v", err) + } + return out + } + + var transferRaw, withdrawRaw []byte + r := load(b) + for i := range r.VerificationVectors { + v := r.VerificationVectors[i] + if !v.ExpectedValid || v.Payload.ProofDataHex == "" { + continue + } + switch v.Family { + case "transfer_range": + if transferRaw == nil { + transferRaw = decodeHex(b, v.Payload.ProofDataHex) + } + case "withdraw_range": + if withdrawRaw == nil { + withdrawRaw = decodeHex(b, v.Payload.ProofDataHex) + } + } + } + if transferRaw == nil || withdrawRaw == nil { + b.Fatal("missing valid transfer_range or withdraw_range vectors") + } + + decodeTransfer := func(b *testing.B, raw []byte) BatchedRangeProofU128Data { + b.Helper() + if len(raw) != 8*32+8+736 { + b.Fatalf("transfer proof length: got %d", len(raw)) + } + var pd BatchedRangeProofU128Data + offset := 0 + for i := 0; i < 8; i++ { + copy(pd.Context.Commitments[i].Bytes[:], raw[offset:offset+32]) + offset += 32 + } + for i := 0; i < 8; i++ { + pd.Context.BitLengths[i] = raw[offset] + offset++ + } + copy(pd.Proof[:], raw[offset:offset+736]) + return pd + } + decodeWithdraw := func(b *testing.B, raw []byte) WithdrawBatchedRangeProofU64Data { + b.Helper() + if len(raw) != 8*32+8+8+672 { + b.Fatalf("withdraw proof length: got %d", len(raw)) + } + var pd WithdrawBatchedRangeProofU64Data + offset := 0 + for i := 0; i < 8; i++ { + copy(pd.Context.Commitments[i].Bytes[:], raw[offset:offset+32]) + offset += 32 + } + for i := 0; i < 8; i++ { + pd.Context.BitLengths[i] = raw[offset] + offset++ + } + copy(pd.Context.Nonce[:], raw[offset:offset+8]) + offset += 8 + copy(pd.Proof[:], raw[offset:offset+672]) + return pd + } + + b.Run("bits_64_withdraw", func(b *testing.B) { + pd := decodeWithdraw(b, withdrawRaw) + b.SetBytes(8) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + _ = VerifyWithdrawRangeWithNonce(&pd) + } + }) + + b.Run("bits_128_transfer", func(b *testing.B) { + pd := decodeTransfer(b, transferRaw) + b.SetBytes(16) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + _ = VerifyTransferRange(&pd) + } + }) +} + type sharedGeneratorVectorsRange struct { H string `json:"h"` GChain map[string]string `json:"g_chain"` diff --git a/x/zkp/verification/validity/validity_test.go b/x/zkp/verification/validity/validity_test.go index 4668b1b9..10b5beb4 100644 --- a/x/zkp/verification/validity/validity_test.go +++ b/x/zkp/verification/validity/validity_test.go @@ -2,46 +2,52 @@ package validity import ( "bytes" + "encoding/hex" + "encoding/json" "errors" + "os" + "path/filepath" + "runtime" + "strings" "testing" "github.com/Fairblock/fairyring/x/zkp/verification/common" "github.com/Fairblock/fairyring/x/zkp/verification/internal/transcriptgold" ) -func vScalar(t *testing.T, n uint64) Scalar { - t.Helper() +func vScalar(tb testing.TB, n uint64) Scalar { + tb.Helper() var s Scalar s.SetUint64(n) return s } -func vScalarBytes(t *testing.T, n uint64) [32]byte { - t.Helper() - s := vScalar(t, n) +func vScalarBytes(tb testing.TB, n uint64) [32]byte { + tb.Helper() + s := vScalar(tb, n) var out [32]byte s.BytesInto(&out) return out } -func vScalarBytesFromScalar(t *testing.T, s Scalar) [32]byte { - t.Helper() +func vScalarBytesFromScalar(tb testing.TB, s Scalar) [32]byte { + tb.Helper() var out [32]byte s.BytesInto(&out) return out } -func vPoint(t *testing.T, n uint64) Point { - t.Helper() - s := vScalar(t, n) +func vPoint(tb testing.TB, n uint64) Point { + tb.Helper() + s := vScalar(tb, n) var p Point p.ScalarMult(&common.G, &s) return p } -func vPointBytes(t *testing.T, n uint64) [32]byte { - t.Helper() - p := vPoint(t, n) +func vPointBytes(tb testing.TB, n uint64) [32]byte { + tb.Helper() + p := vPoint(tb, n) var out [32]byte p.BytesInto(&out) return out @@ -55,26 +61,26 @@ func vInvalidPointBytes() [32]byte { return out } -func vGroupedCiphertextBytes(t *testing.T, commit, handle0, handle1 uint64) [96]byte { - t.Helper() +func vGroupedCiphertextBytes(tb testing.TB, commit, handle0, handle1 uint64) [96]byte { + tb.Helper() var out [96]byte - c := vPointBytes(t, commit) - h0 := vPointBytes(t, handle0) - h1 := vPointBytes(t, handle1) + c := vPointBytes(tb, commit) + h0 := vPointBytes(tb, handle0) + h1 := vPointBytes(tb, handle1) copy(out[0:32], c[:]) copy(out[32:64], h0[:]) copy(out[64:96], h1[:]) return out } -func vBaseProofBytes(t *testing.T) [160]byte { - t.Helper() +func vBaseProofBytes(tb testing.TB) [160]byte { + tb.Helper() var out [160]byte - y0 := vPointBytes(t, 10) - y1 := vPointBytes(t, 11) - y2 := vPointBytes(t, 12) - zr := vScalarBytes(t, 13) - zx := vScalarBytes(t, 14) + y0 := vPointBytes(tb, 10) + y1 := vPointBytes(tb, 11) + y2 := vPointBytes(tb, 12) + zr := vScalarBytes(tb, 13) + zx := vScalarBytes(tb, 14) copy(out[0:32], y0[:]) copy(out[32:64], y1[:]) copy(out[64:96], y2[:]) @@ -83,16 +89,16 @@ func vBaseProofBytes(t *testing.T) [160]byte { return out } -func vBaseData(t *testing.T) BatchedGroupedCiphertext2HandlesValidityProofData { - t.Helper() +func vBaseData(tb testing.TB) BatchedGroupedCiphertext2HandlesValidityProofData { + tb.Helper() return BatchedGroupedCiphertext2HandlesValidityProofData{ Context: BatchedGroupedCiphertext2HandlesValidityProofContext{ - FirstPubkey: PodElGamalPubkey{Bytes: vPointBytes(t, 1)}, - SecondPubkey: PodElGamalPubkey{Bytes: vPointBytes(t, 2)}, - GroupedCiphertextLo: PodGroupedElGamalCiphertext2Handles{Bytes: vGroupedCiphertextBytes(t, 3, 4, 5)}, - GroupedCiphertextHi: PodGroupedElGamalCiphertext2Handles{Bytes: vGroupedCiphertextBytes(t, 6, 7, 8)}, + FirstPubkey: PodElGamalPubkey{Bytes: vPointBytes(tb, 1)}, + SecondPubkey: PodElGamalPubkey{Bytes: vPointBytes(tb, 2)}, + GroupedCiphertextLo: PodGroupedElGamalCiphertext2Handles{Bytes: vGroupedCiphertextBytes(tb, 3, 4, 5)}, + GroupedCiphertextHi: PodGroupedElGamalCiphertext2Handles{Bytes: vGroupedCiphertextBytes(tb, 6, 7, 8)}, }, - Proof: PodBatchedGroupedCiphertext2HandlesValidityProof{Bytes: vBaseProofBytes(t)}, + Proof: PodBatchedGroupedCiphertext2HandlesValidityProof{Bytes: vBaseProofBytes(tb)}, } } @@ -286,6 +292,93 @@ func TestValidityProofTranscriptParity(t *testing.T) { } } +func BenchmarkValidityProofVerification(b *testing.B) { + base := vBaseData(b) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + pd := base + _ = VerifyValidityProof(&pd) + } +} + +func BenchmarkValidityProofVerificationRealProof(b *testing.B) { + type vector struct { + Family string `json:"family"` + ExpectedValid bool `json:"expected_valid"` + Payload struct { + ProofDataHex string `json:"proof_data_hex"` + } `json:"payload"` + } + type root struct { + VerificationVectors []vector `json:"verification_vectors"` + } + load := func(b *testing.B) root { + b.Helper() + _, file, _, ok := runtime.Caller(0) + if !ok { + b.Fatal("runtime.Caller failed") + } + p := filepath.Join(filepath.Dir(file), "../../../../test-vectors/zkp_verification_vectors.json") + raw, err := os.ReadFile(p) + if err != nil { + b.Fatalf("read vectors: %v", err) + } + var r root + if err := json.Unmarshal(raw, &r); err != nil { + b.Fatalf("unmarshal vectors: %v", err) + } + return r + } + decodeHex := func(b *testing.B, s string) []byte { + b.Helper() + s = strings.TrimPrefix(strings.ToLower(strings.TrimSpace(s)), "0x") + out, err := hex.DecodeString(s) + if err != nil { + b.Fatalf("decode hex: %v", err) + } + return out + } + decodeValidity := func(b *testing.B, raw []byte) BatchedGroupedCiphertext2HandlesValidityProofData { + b.Helper() + if len(raw) != 416 { + b.Fatalf("validity proof length: got %d", len(raw)) + } + var pd BatchedGroupedCiphertext2HandlesValidityProofData + offset := 0 + copy(pd.Context.FirstPubkey.Bytes[:], raw[offset:offset+32]) + offset += 32 + copy(pd.Context.SecondPubkey.Bytes[:], raw[offset:offset+32]) + offset += 32 + copy(pd.Context.GroupedCiphertextLo.Bytes[:], raw[offset:offset+96]) + offset += 96 + copy(pd.Context.GroupedCiphertextHi.Bytes[:], raw[offset:offset+96]) + offset += 96 + copy(pd.Proof.Bytes[:], raw[offset:offset+160]) + return pd + } + + var validityRaw []byte + r := load(b) + for i := range r.VerificationVectors { + v := r.VerificationVectors[i] + if v.ExpectedValid && v.Family == "validity" && v.Payload.ProofDataHex != "" { + validityRaw = decodeHex(b, v.Payload.ProofDataHex) + break + } + } + if validityRaw == nil { + b.Fatal("missing valid validity vector") + } + + pd := decodeValidity(b, validityRaw) + b.ReportAllocs() + b.ResetTimer() + for i := 0; i < b.N; i++ { + _ = VerifyValidityProof(&pd) + } +} + func TestVerifyValidityProofRejectsMalformedContext(t *testing.T) { cases := []struct { name string From ffc5c9603f08dbc5558e165a217a9537d30352d8 Mon Sep 17 00:00:00 2001 From: SetarehGhorshi Date: Wed, 6 May 2026 14:17:56 -0400 Subject: [PATCH 26/42] fixing a few tests --- Makefile | 6 + scripts/tests/zkp_e2e/multi_val_zkp_cw_e2e.sh | 42 ++++++- .../commitment/commitment_test.go | 49 ++++++++ .../transcriptgold/transcript_vectors.json | 29 ++++- .../internal/transcriptgold/transcriptgold.go | 31 +++-- .../transcriptgold/transcriptgold_test.go | 8 +- x/zkp/verification/range/range_test.go | 107 ++++++++++++++++++ x/zkp/verification/validity/validity_test.go | 63 +++++++++++ 8 files changed, 321 insertions(+), 14 deletions(-) diff --git a/Makefile b/Makefile index f30decd4..2aba9a45 100644 --- a/Makefile +++ b/Makefile @@ -274,6 +274,12 @@ else @go test -mod=readonly $(ARGS) $(TEST_PACKAGES) endif +FUZZTIME ?= 30s +test-zkp-fuzz: + @echo "--> Fuzzing ZKP proof-data deserialization for $(FUZZTIME)" + @go test -mod=readonly -run=^$$ -fuzz=^FuzzProofDataDeserialization$$ -fuzztime=$(FUZZTIME) ./x/zkp/keeper/... +.PHONY: test-zkp-fuzz + ############################################################################### ### Linting ### ############################################################################### diff --git a/scripts/tests/zkp_e2e/multi_val_zkp_cw_e2e.sh b/scripts/tests/zkp_e2e/multi_val_zkp_cw_e2e.sh index 90de7b4c..e9804698 100755 --- a/scripts/tests/zkp_e2e/multi_val_zkp_cw_e2e.sh +++ b/scripts/tests/zkp_e2e/multi_val_zkp_cw_e2e.sh @@ -733,6 +733,26 @@ expect_wasm_query_fail_contains() { pass "expected wasm query failure observed: $needle" } + +expect_wasm_query_fail_before_keeper() { + local contract="$1" + local msg="$2" + local out rc + set +e + out="$(wasm_smart_query "$contract" "$msg" 2>&1)" + rc=$? + set -e + if [[ "$rc" == "0" ]]; then + echo "$out" >&2 + fail "expected wasm smart query to fail before reaching keeper, but it succeeded" + fi + if grep -qi "invalid equality proof data length" <<<"$out"; then + echo "$out" >&2 + fail "payload reached keeper-side length gate; wasm/query layer should have rejected it first" + fi + pass "wasm query rejected before keeper: $(echo "$out" | head -n1)" +} + extract_query_valid() { jq -r 'if (.data? | type) == "object" then .data.valid else .valid end' } @@ -774,6 +794,16 @@ print(base64.b64encode(bytes([7]) * 16384).decode()) PY } + +huge_b64() { + local size_bytes="${HUGE_PAYLOAD_BYTES:-786432}" + python3 - "$size_bytes" <<'PY' +import base64, sys +n = int(sys.argv[1]) +print(base64.b64encode(bytes([0xab]) * n).decode()) +PY +} + zero32_b64() { python3 - <<'PY' import base64 @@ -815,16 +845,19 @@ run_prebuilt_zkp_query_tester_cases() { fi [[ -n "$ZKP_QUERY_TESTER_WASM" ]] || fail "RUN_ZKP_QUERY_TESTER=1 requires ZKP_QUERY_TESTER_WASM=/path/to/prebuilt_tester.wasm" - local short oversized zero32 withdraw_short withdraw_bad64 transfer_short transfer_oversized withdraw_oversized_bad64 + local short oversized huge zero32 withdraw_short withdraw_bad64 + local transfer_short transfer_oversized transfer_huge withdraw_oversized_bad64 store_and_instantiate_tester_contract "$ZKP_QUERY_TESTER_WASM" short="$(short_b64)" oversized="$(oversized_b64)" + huge="$(huge_b64)" zero32="$(zero32_b64)" withdraw_short="$(make_withdraw_query_short "$short" "$zero32")" withdraw_bad64="$(make_withdraw_query_bad_base64 "$short" "$zero32")" transfer_short="$(make_transfer_query_payload "$short" "$zero32")" transfer_oversized="$(make_transfer_query_payload "$oversized" "$zero32")" + transfer_huge="$(make_transfer_query_payload "$huge" "$zero32")" withdraw_oversized_bad64="$(make_withdraw_query_bad_base64 "${oversized}%%%bad%%%" "$zero32")" assert_trusted_not_contains "$TESTER_CONTRACT_ADDR" @@ -844,13 +877,16 @@ run_prebuilt_zkp_query_tester_cases() { log "Tester Case 5: malformed base64 is rejected in wasm binding before keeper verification" expect_wasm_query_fail_contains "$TESTER_CONTRACT_ADDR" "$withdraw_bad64" "base64" - log "Tester Case 6: oversized valid base64 reaches keeper and fails proof-length checks" + log "Tester Case 6: moderately oversized valid base64 reaches keeper and fails proof-length checks" expect_wasm_query_valid_false_contains "$TESTER_CONTRACT_ADDR" "$transfer_oversized" "invalid equality proof data length" log "Tester Case 7: oversized malformed base64 is rejected in wasm binding before keeper verification" expect_wasm_query_fail_contains "$TESTER_CONTRACT_ADDR" "$withdraw_oversized_bad64" "base64" - log "Tester Case 8: removing trust blocks the custom ZKP query path again" + log "Tester Case 8: huge valid base64 payload is rejected by wasm/query layer before keeper sees it" + expect_wasm_query_fail_before_keeper "$TESTER_CONTRACT_ADDR" "$transfer_huge" + + log "Tester Case 9: removing trust blocks the custom ZKP query path again" remove_trusted_contract "$TESTER_CONTRACT_ADDR" expect_wasm_query_fail_contains "$TESTER_CONTRACT_ADDR" "$withdraw_short" "not authorized" } diff --git a/x/zkp/verification/commitment/commitment_test.go b/x/zkp/verification/commitment/commitment_test.go index 808abb21..e25771db 100644 --- a/x/zkp/verification/commitment/commitment_test.go +++ b/x/zkp/verification/commitment/commitment_test.go @@ -331,6 +331,55 @@ func TestEqualityProofTranscriptParity(t *testing.T) { } } +func TestEqualityProofTranscriptParityCase2(t *testing.T) { + vec, err := transcriptgold.LoadTranscriptVectors() + if err != nil { + t.Fatalf("load golden vectors: %v", err) + } + wantC, err := transcriptgold.ParseHex32(vec.EqualityCase2.C) + if err != nil { + t.Fatalf("golden case2 c: %v", err) + } + wantW, err := transcriptgold.ParseHex32(vec.EqualityCase2.W) + if err != nil { + t.Fatalf("golden case2 w: %v", err) + } + + // Matches prover-side deterministic constructor: + // equality_fixture(12,13,14,15,16,17,18,19,20,21) + pd := CiphertextCommitmentEqualityProofData{ + Context: CiphertextCommitmentEqualityProofContext{ + Pubkey: PodElGamalPubkey{Bytes: cPointBytes(t, 12)}, + Ciphertext: PodElGamalCiphertext{Commitment: cPointBytes(t, 13), Handle: cPointBytes(t, 14)}, + Commitment: PodPedersenCommitment{Bytes: cPointBytes(t, 15)}, + }, + Proof: PodCiphertextCommitmentEqualityProof{ + Y0: cPointBytes(t, 16), + Y1: cPointBytes(t, 17), + Y2: cPointBytes(t, 18), + Zs: cScalarBytes(t, 19), + Zx: cScalarBytes(t, 20), + Zr: cScalarBytes(t, 21), + }, + } + raw := pd.Proof.AsBytes() + ep, err := EqualityProofFromBytes(&raw) + if err != nil { + t.Fatalf("decode case2 proof: %v", err) + } + tr := NewEqualityInstructionTranscript(&pd.Context) + c, w, err := EqualityProofFiatShamirChallenges(tr, ep) + if err != nil { + t.Fatalf("fiat-shamir case2: %v", err) + } + if cScalarBytesFromScalar(t, c) != wantC { + t.Fatalf("case2 c does not match golden vector (regenerate with gencmd or fix Rust transcript)") + } + if cScalarBytesFromScalar(t, w) != wantW { + t.Fatalf("case2 w does not match golden vector (regenerate with gencmd or fix Rust transcript)") + } +} + func BenchmarkEqualityProofVerification(b *testing.B) { cases := []struct { name string diff --git a/x/zkp/verification/internal/transcriptgold/transcript_vectors.json b/x/zkp/verification/internal/transcriptgold/transcript_vectors.json index 97c1189e..5296ef64 100644 --- a/x/zkp/verification/internal/transcriptgold/transcript_vectors.json +++ b/x/zkp/verification/internal/transcriptgold/transcript_vectors.json @@ -22,5 +22,32 @@ "t": "d2e949034f45814e5d080d01675efa9a0990fb5d405131966dabd79bb41c2b0e", "c": "7d5a96654263d220b6fe7af319e6ba0799c4613e0dfecdc94cf90a90014dd803", "w": "b0a958b80fca4571ed15f5defbe1d77fee4b00c97f4593db8f907b83a16d760d" + }, + "additional_fixtures": { + "equality_transfer_fixture_case2": { + "c": "8f86e124ce0e97f87a6f13634aa924ecbb25f95c8302006d4936e2ba55279f04", + "w": "0ba6d3fad47acb421d62e9ae49b29f4b2897d015de1f12d4fec6c66bb4c32f05" + }, + "range_batched_two64_fixture": { + "y": "8882a7e0ce6162591e6cba706d3fe586a07d181c89c88e6d9546758ddfba400d", + "z": "3b08e14b201daea514c15f177a77faa23e82ab9fa7ac8154fc75db7456dab60b", + "x": "893fc03b1c32c77ea2bf869d21d06a9a9d6ac1cf116c1e592f2381fbfd933602", + "w": "24a52886e36febed38127780b493696d9409370be98d333d3e88181f60be4608", + "d": "721777b1b19232947d3102f30583969c2eaf1d29d5aab7d64b17c668aad8ec05", + "u": [ + "1a3693dd437012e693f8112084d95a0062bf6443882c85561b14dc8c6d49ce06", + "e7f95464fc2b902a38f481701e222d9e42712bb6e7c9e9274851009bdfefab08", + "0122fc723e483bc25c7ff15cc118be210cef3325076761c2e3bc9ef950ea9501", + "29bf1cf98d1b40b12df6a9bc74353efca5f4473b59d7ea5da9d7d6f11a591c0c", + "ccdec82770f8f2a1216e6ca365ce4e1bd5ddb08481c16ce45b51af3bbfa0ba0b", + "f18d22f3de9a2973fb94199a47095cdfa6080262bbd6afd1743cd8f98467480f", + "488fa0ecfabc047ebf2d44f8ebfd27af0d870475f336142a5165e0a6de4f1f0b" + ] + }, + "validity_batched_2handles_fixture_case2": { + "t": "1d4cc2abd1bd45413e55fa1c76a2f446d6b9eec944546cfc7f2fb48905712909", + "c": "ce6265983307e9338eae32210c1f96caf1ddfb4ab53938e1e6d541fe565d3307", + "w": "bc6e109cde0563c0a7abf2fb4436cfac8df85f083b75b235693f43d889daec08" + } } -} +} \ No newline at end of file diff --git a/x/zkp/verification/internal/transcriptgold/transcriptgold.go b/x/zkp/verification/internal/transcriptgold/transcriptgold.go index 8f3d20cc..08f147d6 100644 --- a/x/zkp/verification/internal/transcriptgold/transcriptgold.go +++ b/x/zkp/verification/internal/transcriptgold/transcriptgold.go @@ -15,9 +15,12 @@ var transcriptVectorsJSON []byte // TranscriptVectors contains prover-exported challenge vectors. type TranscriptVectors struct { - Equality EqualityFixture - Range RangeFixture - Validity ValidityFixture + Equality EqualityFixture + Range RangeFixture + Validity ValidityFixture + EqualityCase2 EqualityFixture + RangeCase2 RangeFixture + ValidityCase2 ValidityFixture } type EqualityFixture struct { @@ -40,10 +43,17 @@ type ValidityFixture struct { W string `json:"w"` } +type additionalFixtures struct { + EqualityCase2 EqualityFixture `json:"equality_transfer_fixture_case2"` + RangeTwo64 RangeFixture `json:"range_batched_two64_fixture"` + ValidityCase2 ValidityFixture `json:"validity_batched_2handles_fixture_case2"` +} + type vectorsFile struct { - Equality EqualityFixture `json:"equality_transfer_fixture"` - Range RangeFixture `json:"range_batched_single64_fixture"` - Validity ValidityFixture `json:"validity_batched_2handles_fixture"` + Equality EqualityFixture `json:"equality_transfer_fixture"` + Range RangeFixture `json:"range_batched_single64_fixture"` + Validity ValidityFixture `json:"validity_batched_2handles_fixture"` + Additional additionalFixtures `json:"additional_fixtures"` } // LoadTranscriptVectors parses the embedded golden vector file. @@ -53,9 +63,12 @@ func LoadTranscriptVectors() (TranscriptVectors, error) { return TranscriptVectors{}, fmt.Errorf("transcriptgold: json: %w", err) } return TranscriptVectors{ - Equality: raw.Equality, - Range: raw.Range, - Validity: raw.Validity, + Equality: raw.Equality, + Range: raw.Range, + Validity: raw.Validity, + EqualityCase2: raw.Additional.EqualityCase2, + RangeCase2: raw.Additional.RangeTwo64, + ValidityCase2: raw.Additional.ValidityCase2, }, nil } diff --git a/x/zkp/verification/internal/transcriptgold/transcriptgold_test.go b/x/zkp/verification/internal/transcriptgold/transcriptgold_test.go index b09e365b..671be35a 100644 --- a/x/zkp/verification/internal/transcriptgold/transcriptgold_test.go +++ b/x/zkp/verification/internal/transcriptgold/transcriptgold_test.go @@ -7,7 +7,10 @@ func TestLoadTranscriptVectors(t *testing.T) { if err != nil { t.Fatal(err) } - for _, h := range []string{vec.Equality.C, vec.Equality.W, vec.Range.Y, vec.Validity.T} { + for _, h := range []string{ + vec.Equality.C, vec.Equality.W, vec.Range.Y, vec.Validity.T, + vec.EqualityCase2.C, vec.EqualityCase2.W, vec.RangeCase2.Y, vec.ValidityCase2.T, + } { if _, err := ParseHex32(h); err != nil { t.Fatalf("parse %q: %v", h, err) } @@ -15,6 +18,9 @@ func TestLoadTranscriptVectors(t *testing.T) { if len(vec.Range.U) != 6 { t.Fatalf("range u len %d", len(vec.Range.U)) } + if len(vec.RangeCase2.U) != 7 { + t.Fatalf("range case2 u len %d", len(vec.RangeCase2.U)) + } } func TestParseHex32RejectsBadLength(t *testing.T) { diff --git a/x/zkp/verification/range/range_test.go b/x/zkp/verification/range/range_test.go index 589d21ee..ce5daae1 100644 --- a/x/zkp/verification/range/range_test.go +++ b/x/zkp/verification/range/range_test.go @@ -638,6 +638,113 @@ func TestRangeProofTranscriptParity(t *testing.T) { } } +func TestRangeProofTranscriptParityCase2(t *testing.T) { + vec, err := transcriptgold.LoadTranscriptVectors() + if err != nil { + t.Fatalf("load golden vectors: %v", err) + } + g := vec.RangeCase2 + parse := func(label, hexStr string) [32]byte { + t.Helper() + b, err := transcriptgold.ParseHex32(hexStr) + if err != nil { + t.Fatalf("%s: %v", label, err) + } + return b + } + wantY := parse("golden case2 y", g.Y) + wantZ := parse("golden case2 z", g.Z) + wantX := parse("golden case2 x", g.X) + wantW := parse("golden case2 w", g.W) + wantD := parse("golden case2 d", g.D) + if len(g.U) != 7 { + t.Fatalf("golden case2 u length %d, want 7", len(g.U)) + } + wantU := make([][32]byte, 7) + for i := range wantU { + wantU[i] = parse("golden case2 u", g.U[i]) + } + + // Matches prover-side deterministic constructor: + // range_fixture(&[2,3], &[64,64], 7) + ctx := BatchedRangeProofContext{} + ctx.Commitments[0] = rpPodCommit(t, 2) + ctx.Commitments[1] = rpPodCommit(t, 3) + ctx.BitLengths[0] = 64 + ctx.BitLengths[1] = 64 + + rpCase2Bytes := func() []byte { + // [A|S|T1|T2|tx|txb|eb|L0|R0|...|L6|R6|a|b] + // A,S,T1,T2 = point(1..4) + // tx,txb,eb = scalar(1..3) + // Li = point(10+i), Ri = point(20+i), i=0..6 + // a,b = scalar(31),scalar(32) + buf := make([]byte, 0, (7+2*7+2)*32) + for i := uint64(1); i <= 4; i++ { + b := rpPointBytes(t, i) + buf = append(buf, b[:]...) + } + for i := uint64(1); i <= 3; i++ { + b := rpScalarBytes(t, i) + buf = append(buf, b[:]...) + } + for i := uint64(0); i < 7; i++ { + l := rpPointBytes(t, 10+i) + r := rpPointBytes(t, 20+i) + buf = append(buf, l[:]...) + buf = append(buf, r[:]...) + } + a := rpScalarBytes(t, 31) + b := rpScalarBytes(t, 32) + buf = append(buf, a[:]...) + buf = append(buf, b[:]...) + return buf + }() + + rp, err := RangeProofFromBytes(rpCase2Bytes) + if err != nil { + t.Fatalf("case2 proof parse failed: %v", err) + } + pc0, err := PedersenCommitmentFromPod(ctx.Commitments[0]) + if err != nil { + t.Fatalf("case2 commitment[0]: %v", err) + } + pc1, err := PedersenCommitmentFromPod(ctx.Commitments[1]) + if err != nil { + t.Fatalf("case2 commitment[1]: %v", err) + } + comm0 := pc0 + comm1 := pc1 + tr := NewBatchedRangeInstructionTranscript(&ctx) + state, err := RangeProofFiatShamirChallenges(tr, &rp, []*PedersenCommitment{&comm0, &comm1}, []int{64, 64}) + if err != nil { + t.Fatalf("case2 fiat-shamir: %v", err) + } + if rpScalarBytesFromScalar(t, state.Y) != wantY { + t.Fatal("case2 y does not match golden vector (regenerate with gencmd or fix Rust transcript)") + } + if rpScalarBytesFromScalar(t, state.Z) != wantZ { + t.Fatal("case2 z does not match golden vector (regenerate with gencmd or fix Rust transcript)") + } + if rpScalarBytesFromScalar(t, state.X) != wantX { + t.Fatal("case2 x does not match golden vector (regenerate with gencmd or fix Rust transcript)") + } + if rpScalarBytesFromScalar(t, state.W) != wantW { + t.Fatal("case2 w does not match golden vector (regenerate with gencmd or fix Rust transcript)") + } + if rpScalarBytesFromScalar(t, state.D) != wantD { + t.Fatal("case2 d does not match golden vector (regenerate with gencmd or fix Rust transcript)") + } + if len(state.U) != len(wantU) { + t.Fatalf("case2 u len %d, want %d", len(state.U), len(wantU)) + } + for i := range wantU { + if rpScalarBytesFromScalar(t, state.U[i]) != wantU[i] { + t.Fatalf("case2 u[%d] does not match golden vector (regenerate with gencmd or fix Rust transcript)", i) + } + } +} + func BenchmarkRangeProofVerificationScaling(b *testing.B) { cases := []struct { name string diff --git a/x/zkp/verification/validity/validity_test.go b/x/zkp/verification/validity/validity_test.go index 10b5beb4..6207e282 100644 --- a/x/zkp/verification/validity/validity_test.go +++ b/x/zkp/verification/validity/validity_test.go @@ -292,6 +292,69 @@ func TestValidityProofTranscriptParity(t *testing.T) { } } +func TestValidityProofTranscriptParityCase2(t *testing.T) { + vec, err := transcriptgold.LoadTranscriptVectors() + if err != nil { + t.Fatalf("load golden vectors: %v", err) + } + wantT, err := transcriptgold.ParseHex32(vec.ValidityCase2.T) + if err != nil { + t.Fatalf("golden case2 t: %v", err) + } + wantC, err := transcriptgold.ParseHex32(vec.ValidityCase2.C) + if err != nil { + t.Fatalf("golden case2 c: %v", err) + } + wantW, err := transcriptgold.ParseHex32(vec.ValidityCase2.W) + if err != nil { + t.Fatalf("golden case2 w: %v", err) + } + + // Matches prover-side deterministic constructor: + // validity_fixture(22,23,(24,25,26),(27,28,29),30,31,32,33,34) + pd := BatchedGroupedCiphertext2HandlesValidityProofData{ + Context: BatchedGroupedCiphertext2HandlesValidityProofContext{ + FirstPubkey: PodElGamalPubkey{Bytes: vPointBytes(t, 22)}, + SecondPubkey: PodElGamalPubkey{Bytes: vPointBytes(t, 23)}, + GroupedCiphertextLo: PodGroupedElGamalCiphertext2Handles{Bytes: vGroupedCiphertextBytes(t, 24, 25, 26)}, + GroupedCiphertextHi: PodGroupedElGamalCiphertext2Handles{Bytes: vGroupedCiphertextBytes(t, 27, 28, 29)}, + }, + Proof: PodBatchedGroupedCiphertext2HandlesValidityProof{Bytes: func() [160]byte { + var out [160]byte + y0 := vPointBytes(t, 30) + y1 := vPointBytes(t, 31) + y2 := vPointBytes(t, 32) + zr := vScalarBytes(t, 33) + zx := vScalarBytes(t, 34) + copy(out[0:32], y0[:]) + copy(out[32:64], y1[:]) + copy(out[64:96], y2[:]) + copy(out[96:128], zr[:]) + copy(out[128:160], zx[:]) + return out + }()}, + } + + inner, err := GroupedCiphertext2HandlesValidityProofFromBytes(pd.Proof.Bytes[:]) + if err != nil { + t.Fatalf("decode case2 proof: %v", err) + } + tr := pd.Context.NewTranscript() + tCh, c, w, err := BatchedGroupedValidityFiatShamirChallenges(tr, inner, 2) + if err != nil { + t.Fatalf("fiat-shamir case2: %v", err) + } + if vScalarBytesFromScalar(t, tCh) != wantT { + t.Fatalf("case2 t does not match golden vector (regenerate with gencmd or fix Rust transcript)") + } + if vScalarBytesFromScalar(t, c) != wantC { + t.Fatalf("case2 c does not match golden vector (regenerate with gencmd or fix Rust transcript)") + } + if vScalarBytesFromScalar(t, w) != wantW { + t.Fatalf("case2 w does not match golden vector (regenerate with gencmd or fix Rust transcript)") + } +} + func BenchmarkValidityProofVerification(b *testing.B) { base := vBaseData(b) b.ReportAllocs() From 34f1689c81cb69b280caebb9b8c41e2e36f9a6cc Mon Sep 17 00:00:00 2001 From: ap0calypse644 Date: Wed, 13 May 2026 17:51:59 +0530 Subject: [PATCH 27/42] fix: minor queue removal bug --- ve_tests.zip | Bin 18321 -> 0 bytes x/keyshare/keeper/process_queues.go | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 ve_tests.zip diff --git a/ve_tests.zip b/ve_tests.zip deleted file mode 100644 index 2a1a3bc6e34976c525e4092799e9422ae7a99796..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18321 zcma&NQ;;rTv!z+KZQHhO+qS>5ZQI5!+ctOEwr%d3|D2hah|>`r-S0(4Uah=cPp&tW zWI@4Tfd1TYiM|2FDs&_JNKb!OIp*gI=C zPgo#euyar#p#LsP{}Dv{j|9|z3u>>37OBGm0j-k&0WtpX1p%(cF0O_a#?~%gF4hi~ zh7OK~?&b^ttN(w{DA)b}I_NKsK47ckLBHSRZ%3mmGxY{w@-KDT9h$B)+dsT5>ADm| z1bPt+(`Yj&rT96G3dSEuziU8%LcqvR@+}CMxK!#*>4jV#B=UesWB0n_@q!HNk@XW_ zWHw#)KrMcaGmaQ0adXMK<^3Y;;uRVt(Q}g(lL<9Q zPZW5_F6JN!!3eVBu)=T4mq~wnh^-?ib1<3tt2t8mJ=pB9r&APaV*xyv2#JI*3qbYv&?B3>yWILZCczDIZf7Fyo{-(_=7I1iyLkFqrvalL!SvOwUtd zCn<(rEST$njkZ%*Qxq#O$t(mZ4+jR75*87k!!#F}!DU>h1Z@u*GAY!2(v{N*I2XYf zwem<^s?`UNu-JekHUk96_d89pUjOMXxGEj5yu!qGusmn<4m3bX5~?Wz231ij8$zH- zHvzSaiqY=R-}-n2?^}gmGyFC~x336?084y?c!Vz>{@l$Ad;V817muxUCk}&P%uQUVG}y4f$GJ8&44tj3pHcp6f@dq`fc6_`o6Nf?E^#PoX`OUJ zd)}0D=OQ{?9ma&MR|(nQ6W)pr^L7u?1 z+PXB1XyGl4kkTDH2fKgAE%$p8K2ICX6@mxhhqusuSZc$9C7|;=4QyBtpo(3H)+BNb zscWaMlo|3~RrZ3m#0a7lP&1iA5**M|O6_@YsB&O(AzCEhMcO<>oI=Iy>duq1!AhE<9^-w>{$%$-Di$}xQ38wS2s zF?wQI(N>EEHGCyOHO}HVtjJDxRWUwVu3GwiR(ZMKj~sthfLOpzblKF|J4FvU$9eCZflqE}8bY>>1z2gP&AJZm+8-SS!PSO^c;7ZV62 zxr;m>*Yb5yta&Czo7VRB7)OHJDalQL_57S$gHbSCETTV|>bgkb?m)-5OU^^rsIpRU zDqn8O;0jATXHxx*gA+U0a<$>AqTK2Kkm1K>;!eAsgvK2~CoutbJ7r2u8VdjQIH&6=X9aU%A?U|77Gxzxl2JM(xfrJnYLHbT#)=j?a~r49j6;yI@nc3<@P85ySgw)89vX+%xGRY@_zWBD%a+PE zRX3hxa*QC(Gu(%?RN!oUTW!wbW3vE9rzm&mU}t6dv!g7G3KcFuAYnAZm--b!BFQr+jE=DraO`ZOga-h{C-ZXLU`y$x9m{r zbzLKfe;2v`(7OHhX8UjOQ1kSRng+5ZT{CFZo6Y9qE20=nnNG+|HoJZ(?QDIi*SV~BFZBffKCK2A2`S6|w9 zQieHt;u%P5DluEIMDB1xrU5mx;IXEHSO&Nn$}&rq zBI4LgPhgDvuI@Cpn)+DCvCQH=aM+f^bfJ9oRK7yS`<9xSNvGk}eo1m!5df?*asVB} z^#J!9Lu-nJ<)ouvI97~G&(K@?)3A^2i#rDcdi2uU>P^_|?OT^<=wls2W$Dn=1{IMq zmW;mPv-?*Br|>aFj&uck8sKlj-QL0dPei%FdL})QGn?QD(rR#8e|jLUQE?}ARZy2s z;CKQs=K{fBy=G_CKYVkuSAXN5L;?78CR-#`gF^`t2&^j~To6RcORTnUFeU;?+F;J} zNOZ-DS))INh)KO&7aR2T52uog)GZ*GvVmk{EUlmu_lKpegSDrddAj-qVMEnoN_5(a zy0s7bnVGRZ0Iuib9WkjtHY77;Ur~jdf=IAh(HA~Y%1*LUS-L$DnKUw0lb(?vbfrM1 zHM(OP>wWhfaWb*uM8)*%iRA!PKC)Y*=g)G_urHyEJU31HGWoGZd;?{)Q4sL`Ey%Oj6pxR5JAh6CpjC4$k!Fm-Lq;B+TM6 zPVlG_F`VV7K@PgK>SL`^gWx`sRA_IOM4d*6-n~!DQk}7ug;M2SK0l2u4Ur+KCwdYR zO%eFUPJb1@_@eNQMb6e^bm8`Hyu zmAc`Q!iY&K!(0|Xji#CfA%8-{bJa!yjg`S}Y?gjPd(^ws#QLh5aH3f4(F4xWoLeA8|t` zuPwIpNaTw6`wx;joL~#Ww`8F~F2_2}{xqld6Rvd}aKDTQ>E3b8TP0TDfPi8sfPh&4@7?={JpPx1e>bW8kAq(- zRc&>tUUw;uqW7_*ypd0FvO-4DRwWY+bkWnz^XUw5o_ibqly$%a>L;6u_sPp?CKN-8 z8ND^>AEd;+Nu|7z6|`%1LdZaP!^wqa(#8?K9=AJu7cO}Ko00q`e(xky0JR8Dn%+6xuI6ST}_R>4^ag8MGV}xs@co8!}oB@M7Zvk_-ejWjv$9CJPxnT1LZ!eyV0b6a zePuMbiZT=oLhWKwNCC3!a0(9WMENUw$_)^dVL@|DG>9MIOe{5)Vxda3Ni;r(-Glz# z!vYy1Gu{R@K-pUdd@Bv-vkn@^7dLA&@Z^Nenh)5K)141?2mN?6`M!LDWP6s=7yC_# zjQQmoBP#@ZhK>iiuZP=?k2~YQ2+p%a^s?kz&I|TnzL zF^5qD2C*rTHF*!Lxw-f~pu|e7Ubz)5C*JTrJn)gp_W@XWdWA%F>+o;6p+T7746=Qq zDn&*(RuJl9EiU=R9Y)gmqq?_pSv*kHf1@mUG5h%Ez$}W!P@jQT1hbpT9`wonV2_Gb zpthg|uThSJei?bT!GG0%4JYyQt%o0_EZqMEGQ@|Ipd8BK zdhf(~nY&qPKKKWOj0gWo8ufhbx+ic+h({E?w6k=LypXHk!{5pnJ|2?N-k~AGk2@9i zF=@w0I8*X$FkGFIOEQ=3m-&StwUT6neaCP5#Nl(Bo%6ij<`R_+u#h+yvN8i9xxenT zmEl5VABCR54_zE0CHh%UyHo%;LIku+{u}|zTg>URt|5meqEuLa%(JUT5l~K93O$`T zuWetL1$du;WTYZSr>BnVKY8s$Uo(+=a-3(IV|h)ffIZKr@o_$aRz&&EvyXD!wr%lt z?`h$G?_J#Xc|LsO>LuEO51xg1zhkxxMjO&^>D94^(i0}CVL+VsQx^6_v1taqhQ9vk zb<$pf67`C8N#?TRR$O3nwjaQ&W1g7+mf;KnlLwQ9>XndXYaS_hH%YuqOnjFZ6@jXGEVjM%-%(yny7a#-9Pd>w3Z_Lz#0KQhci02Hqpk}fa^xgM zaGn|2-C{MYxo`B~mt*<5zvbWhO2$*zB@SSP(=b6;T2fl-uWxQ|kRYc2F*?+7l2I|z zP6RU4ioCw4)A`)MYzRp}?QcvZOAQIZ`~8&uQ7N6gsK`_yR6%1!BV`tN$IH7{1CYZb zf_6>+7e$m=@X2ezou0WAc6Wm&mDZS3DSto0W)e^Br?2iK2fQ~7eeDw9Nl?SsvJX-B z4Kv$5YGAUEt+bxexmvG$+@oJEJrMrBw}T`m88A-%Nk&DDMd1K%{Yzn4UHIP^t|Du<0;EA+WisP*QmZ+IXFSb(Z;9{v3(iQH7Azo;MXb3iEH~ zBE!s(NltiJZ(*`oJc4@Z8mOsdUU_b#HX9{Mv{ErTNmfvn+<;bg;>=8)o**!*K{kD4 zDV_|uOtci?cpIKA4FE(YQ7}C!(1M^nx}kL<#Fr6K71kOD9bYn597`0sCj&04e0%I! zpGtgau_e_yti+CH%2-csU`c4-5$i7ztmpBJ4Bt%&Msls{EZAQX3kDY2U8*J7D0C;r zu5cC4(O!8}OEa>5*D+12G$JgXdmWwv3>`h5lM{KowI9Y;roU9^&NTa)@y5pWEL#$6 z8qm$+Or2dlSA-ipHXQw-&S%W7tyN8TqzOFTV_LitxG2XLEGQU8x5Di3+H@C+eVcCb zKXx{9Er9q*AXDrGzbdskl`!{hd0&b!>I%M?^eTIj8tbv4R3=~eNf=@EY+3B(;nRDl zOWE1x{6d%x31!8a0|&k; zDz1$4xK;z-zx(+E{C@6X=3ZlVMS|aW@wxo=1>2?5*uN3{yUbyk+Y~RYw24TP@jlx z)y`tTo${A(AW~&+>Wc=mnF=5Bz*A`~Yw}%5Ko(%v$QPN~AcGg8MClBei2FUnQPnyu zJMJ}$=hq&h3IQ578F{XiJ);3!of~}Yj02Tu21CB@HuQNr+U=qrsT6g4I&RB1d)^m< zic_6^M$0hOeA9wE)zvUU)`yqq3bq{WbgXGlc-$o11q>d1A>P=TRAdSrp8tS_7(jCP zGXksT)Wn{0FcN0l1TQ0CE@a1cx?gcJHH&3v5!f6*L z^=^18Ax&4#(L{!YE3w2x2=|MYtq4OcV9;XAan-|E|R z(;+F)2m4NW?q1B?4v$Ra(H%_~>?($aR#6u7yf7gz)83E5q<_DFhEjE~m(s}#2+84- zznJ+(fuz#75?9AyYw$F?S}5Q<6r-4KND*{f1=6SEg>om>6}e|UqI%e#PD!QB75b+r zRLp-i+hn->3|{S8q#Wv~q`3J?FAuK2R1~Av4bMn!tAVOl({+9!qxpGF4XV#;O$b1< ztg!c2NDXAISF3e3c`*8Hx8x@uS(B86JztfigarA?^lFwA@$7VXnY+Gg623bkX| z(B8Ns$(Ox39*!B{X!?+d&1K^etZe}2u)2o&b46+BVISC|hG7U`HxULS%Pw|yHWF~X z>VxW(vFfUqc8)`WZ#wky5bbWR(_Jz=tY> zy{+Yl9d!?(9Z2-%|4<~O*sM@O^tEU;CmW@5vHZd^U@%!xD$#YB-n~49tJJ;pt*`#< z8n$V!sr?sPSc-|&h4NU*;{Q2C5v{d>ZRi^BjT@-9#SQ9SQP?kmsz(ZNq+~KCk#7>8 zt{q70BXHI*U;1{ZuSj#>R*YvPJIhp`6xjh*i>IEZWxs$-_Oz>zHd0KsvY2))TZBw^ z^j_YWHS|KpbWVkmX*qsIb(nh$u4c@iewP=`PUN|X=L)-XMMskuCmxxd(tCGRZ zppiKO-$%l#Uxq|eS>)C4n}U zKyjHUi~ic&|A4`#+ZPgo(dp(UNWTd&0@g?L$B7|JYTCkoZLio+#1m+&J(6L%!mCz z16i!g%m%n}`#U>Cbx|xCYOP?4j`Z#yi%i}-F)d< zu<7|$`2!w3368StHrW8cd2YivW#j{R@RQusvj-2Y<)1qObx}RzVlN#<^0-J?8fGoyWb@Ot5iG|ohSrB30ShD7W5(TY`y z`hSSL2<3+*LuiVI*%&oN6nP9)bC{sqds4#!1*+S5Mo^9tQS+QranhmSn@>N{n>DSf&V8#1=m1i1!DmL z1t|gnk^b)q%HGY+)!NYA*zW&8Of!5pE?aF)zb|N1N2s#)R8h&_Wop*?lJb1gb_qx2 z{HWb{iJ@d;Xp=~#c5ACyUuS)zKYoPQe3Lui1B%M=IY;hwTS;O@z;v%ZLFW0sOVXap zje7mV-{6f@1?*fgQM1W`q5oNIEWhByQHlk`3T9dsegzFr%q_<`kgOG;Fg8@44JQ-G z`}&NLESBa=Vk`sjaUhWcBm`oipDIt7E5b4p{l1GTJb#znoSiz3W!X`Scfdxl1s2WPW0|fae!xp0-an=##rAkuH5$( z`PSl{35|h>Kt5CD^$D6I>uV(S3iO(A8$q%l6%Lu14>d1`o{3MGZ{5bWFX$+iJto*p zh$Gq*IBZToU9uz(BC;d#1|+trts!7B#2M}_4^#?2ipjfh1#kKZbLtcJ;v_f6>|dFd zIq$2N@=IryG35vc+&@%o@p^Uz`B)GQ4-=o?lrRgs_B$PbmUA8i6%i8*vIK7kd$0+i z_hpupAPL5RHa)ooc>E)f4#$-gN6hA*{@MNhUEdDy_?}+Ce#I<^=vtuvt{jxbda?0! zebqHqd+_?>Sc~2AyUWMT&xe#cK@jeZe7b+*`733I8vr*d5a8|Odq2j<3x@KVcu5$X zne^Z`<9iDsAO!=p5IlC@{Q&%jSHSm0hbWC7?!_PTbmRBK&etY-W7jm`0Xs>82Rc8Q zRE<^XgluGdY~f+L(TnJn$Et@{fXA0rz)#QyCJWPK2erWOf!m7Mbf)CT!!&U6m^0(p z;9qmWZ>TYRD%8^n@$3$f*w#d88EN{W4UUgn+)vk7(5ltJKLw>VDX2CPtP~1;usTxL z4fJC>b_GR*nUtd?R-uyi-riQxeSog-ZRFfep2ktBhf3%M2Gb!x()ZS(9j6`!^~UY3 z3ryhiop~UkR>So7nCXV|a||IULH~O_B*6f)VHA4zw%<2Pg{*DZxWe?=eN+E^4$EQN zLe}@%fUcEs5DPKzf*+_nfhig4tt2Dqg5cRD^X2@6>1tux7|k197Bb;3evGOQ@~&E+ z@O6)%Z(ER8fL#@73Co&eJzJJ()<|d2)evP%zk`5p+^EoTfV!}V;+jXyme(=~)@UD8 z*!i?hk#q=@=?37$4t1@7+At7x7tEN2O3=j-@E zVUWnilyL?>u$@>_*j4&8^+_l9i`0HFFmf4FtWfj3Obe}$1O>8Zh+JtIQigk`yaAdw zvzvoW|HCZbDSZaoXpkyGxM*5AFJvMQinA=Z zlmL|aVV#WP6^yPMeoiKNhJQ?CfNW?miV+%~IWf`bwkU9283eDjaJZW|J>vK@>IjGd zX&rclw9RP)J*#^H!~vGBc0YS2nY-Z*#u^GI5$Ga_HFOR%k<1EOG}TEfIj~ENVL}z_ zU8o$FqUWzaRx*>w+bC04(7U*VuJsH`tK<1LsH|7;?jtBy%bt_qevb^js9*b9#q27B zmew>A+-f_dM1ap+`4+E4yQ8kFM}qP2Zu*JVEW^%DTYD}37zNPcUTfEoAV$S?E!`sS zWlMW6Yh#yR^;{c%cfYNjy&Lw;Yn!`J>gQM?BJH(8?9HyxT5(`FYomJ`PkyT10L)fsa=JD82zp-44nC)V}>=M>_OeB9S9IplE_2MH+BW)kX ze4OK3guqOG*hmfmetrS`RP)VY)A03%YEMIUig$@=-2kPSk>4G283w^w{&GF$OcR4`d8AbdIlW}4WxTARmpF2_c0c%G#r9GT1 zPb^lPY$@GUc_FB6azxFpWOBpO1SxVUAC(d*FI0+m%igi_tc!mcDhwRqO9jpu#E{`R zF-fr?S;?sCZe~pBR9WjP(sPW&HI78THm`8U;jCr& zxD}%+cB5$_P>Y<+axj-#IZ;m@m1zIMN{r1E-&T>hONU4%Y+0odshEyG8>w~^bQ*=F z-*r3k+*qEI$uk@-JfDv6uonmx^huGLAQ7e_4$2=Y^NH`zo71 zP2c{n!<0jl1)({n=EmSr)`TcwEbCM|-`od6O?#XqA&Hq+i(4Rd`BV*CTP|Wq{uq4)LS3*Ij&_mHc<||bQFbmu^sFGEE-t8K z$fs2fSnW9CxaO&GsXVzfm+LYp`h*5F>bgO*X>@Dlav5S!O$vmIy?*F!ajjj6*7iJt zFZZcbE6_ywi&4u3J5U1VU5&-qZeUaDr3%7}X@JVwrC7mQ%xW~M*A<#D;#Lvj)XLC( z*^S{k<*-<3!%FaQl@Rqhst-mJ;HHm1$TPHFyzFRlMQ!jG$T;F&E8w1HoVuei^co!o z-fVg`BQJQWc+XtrU2L>r=~r&*uhq;Yx%F)wahHD(MmI^y-tZyI^nlI2D4i3tlOEAY z#5|+9>C+DRk^*x!_z4Ll#*P;u2MaNv@PJQGSdn79GtDt9R0c6vbjxr$duhvXzz?R8 z-0}2(R?#21fM;9LqP2Slb#Ozm5Z&7<4}MrDQp-H(RSe@)-~~l7CbtgIT4OJztf{x; zv76pDZ&c87pVWh?EAQMs^MKDmAqS0S4#4iTWlbVjSO=TIuc7O{bI(jT+=SC{HnG!G zsYaC4FyPo|iSX(pC&_{v=I~#1s*61D7-2@0tt52v+J9`z?i67SlMXJDg4GV+b+-F0 zp|cK8_EM*}bIR0)@ziAl?HER;u2|z!PhIq=Kdbb(1r=BxnIzLCG2Ldkp@womELlpT zD~hM8jiQOO)cC@*nfD&t;0b?oN!E!MC`-e`%FKB-+lS<928&D3XKPkE6@qTuKb9(ANbI$@66$hExiRkFIX3_H|&P}x#W_Z zRPh#{2q!p6ga6o(gxkPQvr7hYMJbd}Yd2so$Xq4Mlk?Kjwp5yTA3KO;+jjBbyL8(n zb^B0SF&h0+Ousr#sSv0x7>RKJQ8J6Vk-kHb4LZG3XE8pGlVnCZUQIlUelb?4`tav% zA{MKDIhLnPftJSp>k9B@BkO<1dU_`tmfi&p$|z0r8l4k!N^~7U|cDXMQNgR2(9}QArygbcdarep=4Rvz>!Un!_AV1<3~l z!AJa@Gc1gY9pwS&@ssTz^l+1(63#HMzN)VDT+7k>(9(fFPVnLBxFUt2R-rBCV;wZB zt%n6`S$Aq4JNVM3UG8C`>!5NoUjjX9eO3~D(;D#2x#c?I1sCs^zNocs2c zF;RlI0h5zu-UF0$LEd;PSbrm|aICI0t*K&BE5OZh+M)#x{y_(ZFR|5bb%e#iz1%5( z5jpxitbdfyy$_2d(w$>~#}<|nn~G>ts;Oa&+~x)md-j+*^Xlsmcxftjsm?TIPg$ar zSd#n`DpffuLXu7BGnbJ>Fcj(9m*ATP1I>}|Nu(nj{*3^(;IX|4!gX3l&aiLfvPA+L zb7DZG)*xBb`0$h~T`@TWvt{_E#{8-_(2)|ga#wWcHTtkHm#dC+(5eB=lOrRi=?znQ@OYH zqw}LKZl5PR{!<5XOuAHS-zci(wVqOll{O}dm-Se*K5-HX8?kYh5L&eq8`ih!04>gw zMWz2u-(YkO-Jxp3u=+>xvl0H@js$-uk3EQ{+mMN3`!c8iOG#?F>JpezNeD7QrH-?$ zXvo$fwkqtKjE>}4>F*q56;uR_FTIFM%l%7fogrxMo;5+9hW`GK413*nS=0TqQfh`T4wLo{q%Kaf>ow&DUI778W~tES-Sm#B-ViT zH%{|(GP^%AHdHS}q3kIJYQ?x2A+3r@i0pVag*!_np2m)~PXY|R5FxM&Y$nV}-td4w zRu643q8`Wiq>A|vXb$=yG}>$B3pAY;L~bo)J$3CvO-$*;1E!j|4;3f|L$_Omxw|k^ z+o~C%o{^DQ_Sl%%x3jP*@p?K#_NatWsYow9r&nCL#Wkrrv+*jNrQ;piFyKxAXVbUbJ_NeCe;m>4Ur*96#OJx3yISEWje7xAsO>v>1pA+9-?w zsIxCqVOLDJDaeX?;1}i3wx;yfm$?0VS!I`;bW)t-C9vq)f>d>l4tC>HDpIS--}5e%Xc>C+ph*>u<0l4b zR7;#>oo88VGrR>PyLY;%y#1++?_IK^J%l+W-{~7#7oc7d1f=7}4MZ@ZTTKrN>Esnh zpyehGvmq6&x?@og^(h-!aIxYZju1L^knVse4p9_Yi<#lVD7FWA7`K2S=8VBEjLTL6 zd+ulEW-bKzp44RGfRoR>aqCq(z9a$DtTp<5B`aa=WT(ecXl~QY%(w#lT(u@YXP*Ml z9syp_NDFupGdCiQJALIy-ubA&!I0-4&?Hx;%I{mk9&m=f#~~2wpYaNTCT!Z*2k1V+wx{RV3Q~`15ZBhQh45|A8Az7f zC`^z6(T6uK=I1M`ww7adl#P#;oz)D=u6Ivx#Utpcevo4K=&xPH2_)s3~= zBK=2gx({>k&9wEvNHr90_M&!r&&%EK=brDYcM{`00a3k0ohLW5G5TOSr!?z9iOjRu z7uEfBTT`~8mRb0@^l_C++Rf$O@6+BfTEZAn@m~in%MMI#hONBpti;Gs>EjfK5+X7; zkT}eZ)@mAQ0Z$+Vf)1{2vI2+Y_w(6-Fd{b$}xpI;f;W@v#v;xhstoJfm{Anf=XimL~w5 z#OK42be|5Xpfm*bzT&GtxqZC8u-W}1(jd!7hC}xSJ!3lfZa{~qQ*^Q{?z^>Ff_#eZ zkC|^=hGeBkd5c%?@4r?e_HuynDGA{;~h!koEPN-U9v zI-O0V^w$FxX$ooEb>Xcik-)b(`l3vh;})g=oS{!M!=9-{jin{b9Kr-Y3DL`?_r zE!KFFb!mY~^c;Zj7mU9grCJ_V0XaHtlsBCao#wO!z}{lZZP19UzMML5afiHS0cbXv z1K}r#p3mX=%_?7CWxb`{>%CMYd%cN~$L)T#HJ56CLs4U}Xw1`~0FO)dtnyUV%!;3P z;e|g{dU^H#x`}`HY)V-+fb|Cy*L~gR;pa*oU)J6F@=|5I4eYWsS))X%H;a9HJ>g1! z4CytOmWYtV?takE!K()8%bEGDOys;-cI6ny*yzcvR7TL2m!HRZ9bZwk#8G?FK)PMm z{hk)yD41np_MA$+H`D`67{?#HHS0L2Khit)%W=`vxh#Klw~`W=oT+yc%7}A_W?@zP zpxbCQYG8wKw2s|$a7tq5rn?b2vCfwNPW|FYm*YsX$l{DkYVNAU8BUXAQRHL(eZrhm zZ>(CPM32Eq0_|c!;z?AzP(V8-$LsbYShMCFk``TP?*9#-;fmq55AxlA<@Z7e(sRhXj z)jcFv4(pD%6yuMGgq)zxz3Hh%U+S4|RsYx9sD}KMIv*|S>)z?=Z%@#PRFeQLlBK}B zV@b_?{AFT^B_54Ge~Zo{4=bFs+{&=_?wIcDzB^dN^PSe zXgg}E%)g$JG^_H_F{drI7N`%Yll9v)>K^;epGlGo0&W5!|4ngTM&&VJFKCb26*h z+;I+cWK`A^`JTzhaGr$Wlp&gu!=eo+@6J|z`0=|vdHX%0=?&{1pc#~P@_|Me5d!bPPs0PP zhJlXYl_!Jy*E4*$3H~E#f&u(2$cveN3Okt}bW)y#d%&)l)WP^ppj^0eyHi1X0wL&J zMiq?_q<9Aps+Y zG6)6Dp~EN}R!zBa6tFdw<1^rZvzXAtVf5H;y*lp5tTZOQbXm%?^MsI+g##lO9*zXX z@bL=D5>P8};t?su$nDb}dgE`jZZMHaHV%#SJK?FQ@Fp~(=;5*}CdhJHr}bnn;}MfE zUz5>Dfyz13jut&%1ranpshR$e!K+CpyFMNseoqeu%-$&NkwMrqJd4P#d4dSE$|nU9 zQ6N1uw3hN%N}im99x-D7KB<%R{m_gcq-h_AzuFY2CBx9vtQjGlW~XI2baLWVl`XSE zSH&wON6kwQW=<>@m@Jj1$7t65p%{lVbtEHD6A~F3+hfQhiPZQ^WSPxOGW=+2X$7IM zWUvtKSmQGafvmineqA05q8i<@*@}yL4Yb6ax9VH(Ht9sbgTh!d+uX@bX3nugVP&?+ z?Dovto<81uY>1Lae)eZE-nUo0&+E)CW0$h!mihY<|H+8(V-;o=i0PH*{Pbs5dgt5t zdLx=66Yj!6>U^(Z_e4$a!uvBRLym~ytIqoJt35eP`FOlc`*84jaP#q|qD~b3@ZER@ zE8~U_CNG%(A|d+mqyO2T_%OS7utJDe+$)f?>iOPX^VwMx?0kpN?8VNP^Jl1~>3@5v z(8YkCmA-}yF8wa6&p5-wgNLLHwtk++)I(V{QIMF3sfZhUzaHSj!6SgFJ7JWn#DC$< z+r530!2G>>@pya9_fM#vbDxX;_>lei<~Lah$Ap|#kV1awOyYG8PVawy8Q0g-;c&oV z>_^okd)}6%9u8Ucd>6cvJUTG$M(kGHXNkp+cSq7@uIj&M<7={$_;;JZ1il56I!O)- zCx+3fXYMy7$~qn71To``>SAPOz`ABCVY(Fi#*T~r2vVF#c|QLRzJ9y-a?d}A73P4} z&uV;#2I?E`kAep`5=jWbw4D&q5t5KPZ|0F-d{7Y-gD@ajqmK)}6=$Cy9DD>z8?Aw) zz-&=^j%ylhI$oE+?8+`aJ*fC^0z_uD2Ul7iQ0DU>z*6N1t&ZDWG|ArU6B>5lv*JM48zq@Q zNt}hY5Ran8sK(3wFo}7fcPopb9i#_dN9p?neGmN^*N{tze1)0m4-!VR_iWb2sF*q^ zPlH6eS5>HEs_YnJGCF>hq|z3Y(MX_bxp%$n=2KNO6w4wi#j^IH4g<3ouZ~QWx*j$p zLR8wsqkiHWxCZ@oi~zQgj^0#upAiX?z4QCoxHX;j`mFi-erQ>{Y8-z}**)q#YioV; ztN&Wh*O|*_{k;FaSkB^^tFiQX-F@~Mv*0>;Xtvg@6ttP2X$|8Bw(d~uM52^r%kL3H zb@%@?_$Yp?=<8dn?EvMjeGHOQz8<+2hvJ>mr&SDaFrI20dJaKG4fR080_fPkF9JDP z-UDqMe3f2)qO|1YLoo7Er70wmRJa=oT=x=1fpK9A*%iT$A1yf(X7lz^n1?y1YjZ>7 zdd-OBC1Im>L@jaJSyv6(Ts;Lj5$Bers!1$<(&C*t7z^K>R`kzD4YuIKH1P!e7%F z_dIe*+Bp{n5*|j)7?Snnfof~{rsbm5vyzVUssz73a{<#7Na!|ELo#rQe=}2oZdG}Cwq#qI1t*0#$#k7G5ZhZ-j>OaF{al#R2_uR?%1{=kmM2`8*dz>-O-Et#Ff z2_@U$srJay0l;Kff7K*Fbi7`*$Pzdcgv?{SnmkGAT1{M_8l@ESn!3f(sU{<8(Jr+lfL?3M7cB$+%I%6{+kY8> z4ir=``I6o{*-c=64UzHTe{>UxGYKlUBVpczLe=1299sU8YASC^@i~lInZB+GQ4Rkg zvzEbQDmDF4r$Izw)E`Gyj+3MR0@l?A7Db*0+1sIC)Lq6aGl2x8S;{s|wgv|-6Yywln4&$g3ocyKKgC#y7|1rF;@Xd-Qi9I~>KG2=Nq^%8uw6QZ<-&ut!r%#E}Z#c@?rNc1h4MkcfotrU4pH|{a zrY-eFk_{wpVK;dSw}vi$-kk|`XqJB+ysLV?GnUA7dQ-7dc_lLOBLBHWCbyyL&m8DZ zOaQ6L8`lE6d2BxM{-G}GeSy-b{IgdD1{y?kJN&fp;XkUlUQE7`qy*4(cJhAoejfYJ zHjZ#*cJ3dR^tlgP9?W|!pq45b75BKd`7=|e*Q;NroPvuPVF6$DjpUIoC#syDhg)iB z*+2;j3YCWt`J{)g`U%g5;zX3qp_U|K`G8Ugx3^u4SoN}fl8^s^)J6QCc<_h1u4>wv zV}Y>cJX@k%ypf87h35}4!8IszulDF44v=7=65R*9bUR=ja}TT2S$|W^;p|NYy*p9c zX{8EKL#3noJ0Rn2f2bxz-pGv5Mg^o^5&%_?AXtEQPkO~m_7BW)^{y4FUpZ5YCP(#x|k7-jie70d6Zz9ic-}BCv zw8l(RIF%bxMf43&~t3&;U8?2JE%Z z`-kCi#Vv`J^0ty<8UexLHy5=b4?RA|p?EPfQ_1Hoss$*0W{_p?ojQ%DxPR8|!OoqN z!)$HZ8g)lqSz$9(xP|_*;2H)lGI}xAr@<#a9FXXgME>XY^4MZ-$-27P(Ra%W3@51;dA0CBRCl&h`G$>#3FlJw zNkO8f;xR`R&J~jU%;|0U>)wFIn!#Lc#ZbCp9y1dyLv%I~Tx;c2z3e7I+% z3Oo_fTCrRImqRKx_mT(h<-wh7q{f@9O4Nf?IL?Q2BQQCj4>ZYc7ej3o;!da>A;p{R zwgjlm-HXKAR!!!svVM-ft^{T4+~BpywbZ-$l<2w03BGljMbNp|yatZ#3HwnkGFgVE z-~39uL(nLxUxK%pT4zC(O$l72f~-AY<@BnN$`rcjkoi@yLUfae{{37*y4qwST~9F^SLu zL(^}RBaCU*6%=@8=GI6I1I3&I_R=YWz~QZfxJ^=xG)u%$vQ;5!^;GTo56`ORrU=e9 zGD4Tvm4C4|vu}6*Qn4OG-DJyMinVdytD?D8hk~nW^`y4A3snv|O1 zZ%`BAY;s0gU0=sW%1)E>#rb+)<~WHcit_jIvy)Z+f<0nwl74$p*458HQs=lDZwOLF zkIR>|Td)NySWbgdNKHoB*z(0f1RM@JAXxuoVY2+<8 zweY{6tb(CoMq!AgSmeuv;$W}Fw1(iL(strjnlWre-TztVXES|!u@SFS`PShXn~&Go z)c55xLqA0ago~qbo!`6M+}F2CD0O>(>g*h?vaVCMS~hgAh^_}fJ-|G+6AX>fNt?D> z{h+xYNu^O$CszvY$ylG9KhQssU|4cKGsVr$2*lg5#_^|gZIn-l(^B3ZP7CZ1PYBYB zjP6tQ3DXtu8I}c&z0*dRw?$EJF8HN@f^Pk*aRKE1? z-@w*Aeobuj)oBLQ{yQx9^!&N_b`LC#r)z+waz4}p*ap~q4 zTP}#XGDUY}%K0o-sQ#3QD2 z*Mg^}v`}llMOyLnce^g7>|%-e#maKa@853``;wsklXqYL=!rR}eq1Q6@T$yA?Q^eB z%X`%}#g$F}v(M!V^^R-gK+laU)X}Y{GCe)Qa`@-B?@&4rGb2e{2 z+<159V)oMDFLib8b(_9+6;1YAcW3UKIML-#3==%vHGbOMKPhHCbJNpppKN>P?_|5~ zul8Rz`&ra+^{T|f4VPVic<*YETa;q3Zfc#YLQKyImrs}VFKnEY$wITPxPm|lyozRveav$k?-tZMl8 zW-!NZ4y7`Br|;Bc#*e#Hfx^f>d+N=V%%1~krw&< zyDHbXR)`jFAQj*O zU@#D1`0EH_;5=4^6>_W!#*r!@!*Ly|0x_HsXzbs{K-`9-kHI01SRu|*)V-j{mhuC4 zh~n@Ox}~T)Ly5B(bqO`H#etGIEk<2XO`JujgPF({85rTT2#XIfhc Date: Tue, 19 May 2026 17:43:28 -0400 Subject: [PATCH 28/42] fix: cross-proof context binding --- test-vectors/zkp_verification_vectors.json | 620 +++++++++--------- x/zkp/keeper/query_grpc_test.go | 12 +- x/zkp/keeper/query_proof_verification.go | 52 +- x/zkp/keeper/zkp_verification_vectors_test.go | 4 +- x/zkp/verification/commitment/commitment.go | 19 +- x/zkp/verification/range/range.go | 12 +- x/zkp/verification/transferctx/transferctx.go | 68 ++ x/zkp/verification/validity/validity.go | 7 +- x/zkp/verification/withdrawctx/withdrawctx.go | 61 ++ 9 files changed, 481 insertions(+), 374 deletions(-) diff --git a/test-vectors/zkp_verification_vectors.json b/test-vectors/zkp_verification_vectors.json index f038868e..4f858b22 100644 --- a/test-vectors/zkp_verification_vectors.json +++ b/test-vectors/zkp_verification_vectors.json @@ -10,7 +10,7 @@ "family": "equality", "expected_valid": true, "payload": { - "proof_data_hex": "5e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870bd6e05fcbcb7077aa122301f052243c301644a332e4ab2a3ff45e456c9d38086a027f723e8302c8301bf58c162a48b4f171b9a75350957b5998566aabf9355246140466839b6c89f2a698caf5825425d70a49d5d9ea201ae8dffae5b0ac6b3b204201d7f563a5c837e7861d75980a46cec4ec82d6d007673db2b9b254ed1181330efc7b041d17987fe21175cbca66485cf85b5a64c1eb98ec42ada426c9520e3ed07de086f2cfd2def4fa1773e65dd132ba109c05fcdfcfa0161f1fc8800df515311c3695c0bd19213ba3f97157b4afc95bd1412269e62cb322890dc5e6aa91000259f92022fcf29baf40b876e0acb3ff0db214442a4a8b5a9d444a22c6be990d847e201b5cb26cc31a75008ea1a6ac302b5062458b8d37050fa94d428e34e70a" + "proof_data_hex": "d4508ad57e19936d09a2584f4b537b138dad4ae24fd0274a25fa67f16cff945b6c901500df6ed70581f38a023c8e0d15469ff4a97b9511f362a2de780c6d4a55eebd075e2af4ffc73cff35d7f8929cc3eda81eb94f3b31646def77022225f64e3492b7d0251dd93326e2fd1af4c06b8850622552865ada7f9fa9934a5b18ac3720aa6e513bff5bb6c1de099316c86e6fb2ab1664284492f1282f94315ec7fd09deef0f579777d61689e5968aff91773c2133a7fe0ca72e1a4e8569caf49a591c1ac491d0713b1669de00dcd25ccb710d1c587478be4f22e3fc35a3c4d3a36e04ab8c4df1bfe61e908bccc7dffc684d4d254f038b94622ac343847f1e0cf2d408067415ce200fd20f3ad4fd16fca7f0a681fbf0692c5dbabd210dce8cad27ad0c470abcce554c1f7e38a95479d3dc1d222effb34934b7cecc172d7d9ce8339909" }, "mutations": [ { @@ -18,7 +18,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "5f06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870bd6e05fcbcb7077aa122301f052243c301644a332e4ab2a3ff45e456c9d38086a027f723e8302c8301bf58c162a48b4f171b9a75350957b5998566aabf9355246140466839b6c89f2a698caf5825425d70a49d5d9ea201ae8dffae5b0ac6b3b204201d7f563a5c837e7861d75980a46cec4ec82d6d007673db2b9b254ed1181330efc7b041d17987fe21175cbca66485cf85b5a64c1eb98ec42ada426c9520e3ed07de086f2cfd2def4fa1773e65dd132ba109c05fcdfcfa0161f1fc8800df515311c3695c0bd19213ba3f97157b4afc95bd1412269e62cb322890dc5e6aa91000259f92022fcf29baf40b876e0acb3ff0db214442a4a8b5a9d444a22c6be990d847e201b5cb26cc31a75008ea1a6ac302b5062458b8d37050fa94d428e34e70a" + "value_hex": "d5508ad57e19936d09a2584f4b537b138dad4ae24fd0274a25fa67f16cff945b6c901500df6ed70581f38a023c8e0d15469ff4a97b9511f362a2de780c6d4a55eebd075e2af4ffc73cff35d7f8929cc3eda81eb94f3b31646def77022225f64e3492b7d0251dd93326e2fd1af4c06b8850622552865ada7f9fa9934a5b18ac3720aa6e513bff5bb6c1de099316c86e6fb2ab1664284492f1282f94315ec7fd09deef0f579777d61689e5968aff91773c2133a7fe0ca72e1a4e8569caf49a591c1ac491d0713b1669de00dcd25ccb710d1c587478be4f22e3fc35a3c4d3a36e04ab8c4df1bfe61e908bccc7dffc684d4d254f038b94622ac343847f1e0cf2d408067415ce200fd20f3ad4fd16fca7f0a681fbf0692c5dbabd210dce8cad27ad0c470abcce554c1f7e38a95479d3dc1d222effb34934b7cecc172d7d9ce8339909" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -28,7 +28,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "5e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870bd6e05fcbcb7077aa122301f052243c301644a332e4ab2a3ff45e456c9d38086a027f723e8302c8301bf58c162a48b4f171b9a75350957b5998566aabf9355246140466839b6c89f2a698caf5825425d70a49d5d9ea201ae8dffae5b0ac6b3b204201d7f563a5c837e7861d75980a46cec4ec82d6d007673db2b9b254ed1181330efc7b041d17987fe21175cbca66485cf85b5a64c1eb98ec42ada426c9520e3ed07de086f2cfd2def4fa1773e65dd132ba109c05fcdfcfa0161f1fc8800df515311c3695c0bd19213ba3f97157b4afc95bd1412269e62cb322890dc5e6aa91000259f92022fcf29baf40b876e0acb3ff0db214442a4a8b5a9d444a22c6be990d847e201b5cb26cc31a75008ea1a6ac302b5062458b8d37050fa94d428e34" + "value_hex": "d4508ad57e19936d09a2584f4b537b138dad4ae24fd0274a25fa67f16cff945b6c901500df6ed70581f38a023c8e0d15469ff4a97b9511f362a2de780c6d4a55eebd075e2af4ffc73cff35d7f8929cc3eda81eb94f3b31646def77022225f64e3492b7d0251dd93326e2fd1af4c06b8850622552865ada7f9fa9934a5b18ac3720aa6e513bff5bb6c1de099316c86e6fb2ab1664284492f1282f94315ec7fd09deef0f579777d61689e5968aff91773c2133a7fe0ca72e1a4e8569caf49a591c1ac491d0713b1669de00dcd25ccb710d1c587478be4f22e3fc35a3c4d3a36e04ab8c4df1bfe61e908bccc7dffc684d4d254f038b94622ac343847f1e0cf2d408067415ce200fd20f3ad4fd16fca7f0a681fbf0692c5dbabd210dce8cad27ad0c470abcce554c1f7e38a95479d3dc1d222effb34934b7cecc172d7d9ce833" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -50,7 +50,7 @@ "family": "validity", "expected_valid": true, "payload": { - "proof_data_hex": "5e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870bccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c726cc8d72b7ebef5ef05526821199c2b5018f1bdbbd53f8f2c72a477f52e8a77c235b763b917f2b8a7994b3e6e6c592904874028992dfa7f7abd0a6ca393d27c12a8eacffaf1045ace8a2a83950a8404638107fa371e4c48dcad45cd8955845d62d9fd0e651e4b857cee3329e4ce468442da84e55359a6bfd92f8bd82b7e620234cd97580e1a7a2e785716c6ba79b304e8e3e9b0cc76d1a7414be49d2432495b7c321c4bd0f118a9ae5daa9785ad1c42c28b3a619bc6b943ea83fad6e56afd6d3a9b5e7a27f364a3a894bab4921c2b419028c088634832677be8e35a029b475764bc05f573011ef336950446586adb86941318de26cca565234a4c86ec49873ff872427cb9bf326a6112ad10d70740455662a50e882ab9ff17d27578432e3d25450e14a7b53aebc9624175bf52e535bdf0bd68eb532397666de4aba3accde204713bddc60190ee1e310e10178c7c6deddd46ebb6ed9f5214234fa0e1bb181e03" + "proof_data_hex": "d4508ad57e19936d09a2584f4b537b138dad4ae24fd0274a25fa67f16cff945bd8454b4846ab296d15cf9a676c1d49febc2c67a7dff36271b1b43dff6d654915a4ecf5482c6ab6a3a82bf41ed28de2c02d6af8f3eaa4afa1a7e62cc2d563e1792a03e5ec8bbeca9568692f15cd3fb7c322090ab0f021a6af6b6e9154245f5211b0ddc49b204559a978ac05da0f2007a4acc9df4a9381ea0e039c3469d3e1f601a0bbdda2ee032addf2eb8b05dd5d81bc5d818dab66339bc432ca93e83b5fe801e008c4076623a87b2058a5ee9a3491c5a4f3237f214a04ec84346f5325855d21f000752c959c65ff6a6facd78dfe462add74e3461536092a9bb40e13a5abd33b1edbf481d76c16eba7f4893c73555842c514a504114801e9c38eed9495ba487ecc4b8d90d02e8b0ed5f5bd539576fee9749e33bc84969abd8883bfc7dde967080e5a61b152afab1782b9e0643bde9445b0b187b8f77166b393b214d1a72bcb0b9bc0326ae7bcfc39e075e01cfbbcff52ce7cd867a72a1ad8e61271447d81d30d5f05b730a7bc1682619cb66b3e9556f5daccc5b078a6b5043fdb2a882f0a4f0c" }, "mutations": [ { @@ -58,7 +58,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "5f06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870bccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c726cc8d72b7ebef5ef05526821199c2b5018f1bdbbd53f8f2c72a477f52e8a77c235b763b917f2b8a7994b3e6e6c592904874028992dfa7f7abd0a6ca393d27c12a8eacffaf1045ace8a2a83950a8404638107fa371e4c48dcad45cd8955845d62d9fd0e651e4b857cee3329e4ce468442da84e55359a6bfd92f8bd82b7e620234cd97580e1a7a2e785716c6ba79b304e8e3e9b0cc76d1a7414be49d2432495b7c321c4bd0f118a9ae5daa9785ad1c42c28b3a619bc6b943ea83fad6e56afd6d3a9b5e7a27f364a3a894bab4921c2b419028c088634832677be8e35a029b475764bc05f573011ef336950446586adb86941318de26cca565234a4c86ec49873ff872427cb9bf326a6112ad10d70740455662a50e882ab9ff17d27578432e3d25450e14a7b53aebc9624175bf52e535bdf0bd68eb532397666de4aba3accde204713bddc60190ee1e310e10178c7c6deddd46ebb6ed9f5214234fa0e1bb181e03" + "value_hex": "d5508ad57e19936d09a2584f4b537b138dad4ae24fd0274a25fa67f16cff945bd8454b4846ab296d15cf9a676c1d49febc2c67a7dff36271b1b43dff6d654915a4ecf5482c6ab6a3a82bf41ed28de2c02d6af8f3eaa4afa1a7e62cc2d563e1792a03e5ec8bbeca9568692f15cd3fb7c322090ab0f021a6af6b6e9154245f5211b0ddc49b204559a978ac05da0f2007a4acc9df4a9381ea0e039c3469d3e1f601a0bbdda2ee032addf2eb8b05dd5d81bc5d818dab66339bc432ca93e83b5fe801e008c4076623a87b2058a5ee9a3491c5a4f3237f214a04ec84346f5325855d21f000752c959c65ff6a6facd78dfe462add74e3461536092a9bb40e13a5abd33b1edbf481d76c16eba7f4893c73555842c514a504114801e9c38eed9495ba487ecc4b8d90d02e8b0ed5f5bd539576fee9749e33bc84969abd8883bfc7dde967080e5a61b152afab1782b9e0643bde9445b0b187b8f77166b393b214d1a72bcb0b9bc0326ae7bcfc39e075e01cfbbcff52ce7cd867a72a1ad8e61271447d81d30d5f05b730a7bc1682619cb66b3e9556f5daccc5b078a6b5043fdb2a882f0a4f0c" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -68,7 +68,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "5e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870bccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c726cc8d72b7ebef5ef05526821199c2b5018f1bdbbd53f8f2c72a477f52e8a77c235b763b917f2b8a7994b3e6e6c592904874028992dfa7f7abd0a6ca393d27c12a8eacffaf1045ace8a2a83950a8404638107fa371e4c48dcad45cd8955845d62d9fd0e651e4b857cee3329e4ce468442da84e55359a6bfd92f8bd82b7e620234cd97580e1a7a2e785716c6ba79b304e8e3e9b0cc76d1a7414be49d2432495b7c321c4bd0f118a9ae5daa9785ad1c42c28b3a619bc6b943ea83fad6e56afd6d3a9b5e7a27f364a3a894bab4921c2b419028c088634832677be8e35a029b475764bc05f573011ef336950446586adb86941318de26cca565234a4c86ec49873ff872427cb9bf326a6112ad10d70740455662a50e882ab9ff17d27578432e3d25450e14a7b53aebc9624175bf52e535bdf0bd68eb532397666de4aba3accde204713bddc60190ee1e310e10178c7c6deddd46ebb6ed9f5214234fa0e1bb18" + "value_hex": "d4508ad57e19936d09a2584f4b537b138dad4ae24fd0274a25fa67f16cff945bd8454b4846ab296d15cf9a676c1d49febc2c67a7dff36271b1b43dff6d654915a4ecf5482c6ab6a3a82bf41ed28de2c02d6af8f3eaa4afa1a7e62cc2d563e1792a03e5ec8bbeca9568692f15cd3fb7c322090ab0f021a6af6b6e9154245f5211b0ddc49b204559a978ac05da0f2007a4acc9df4a9381ea0e039c3469d3e1f601a0bbdda2ee032addf2eb8b05dd5d81bc5d818dab66339bc432ca93e83b5fe801e008c4076623a87b2058a5ee9a3491c5a4f3237f214a04ec84346f5325855d21f000752c959c65ff6a6facd78dfe462add74e3461536092a9bb40e13a5abd33b1edbf481d76c16eba7f4893c73555842c514a504114801e9c38eed9495ba487ecc4b8d90d02e8b0ed5f5bd539576fee9749e33bc84969abd8883bfc7dde967080e5a61b152afab1782b9e0643bde9445b0b187b8f77166b393b214d1a72bcb0b9bc0326ae7bcfc39e075e01cfbbcff52ce7cd867a72a1ad8e61271447d81d30d5f05b730a7bc1682619cb66b3e9556f5daccc5b078a6b5043fdb2a882f0a" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -90,7 +90,7 @@ "family": "transfer_range", "expected_valid": true, "payload": { - "proof_data_hex": "140466839b6c89f2a698caf5825425d70a49d5d9ea201ae8dffae5b0ac6b3b20726cc8d72b7ebef5ef05526821199c2b5018f1bdbbd53f8f2c72a477f52e8a770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000662b4a0066aae6cdf571e9d0d369ca879450e699c100243520b4e061a0d55b7efe9bd7f72f7a305ab7bb83d3efcfa3afda3a5ebe298dafc8a07f6161c26cf3723051fcf7a8b8a0aeec8dccd4bca499c6f420540e6850ae5775003ea10d13a5711e4ec199287b2f7c36690570e1def856085c873b6867e36f3a66087fdd24ab12d086e935833deb94f9339f57254125295df66273fd12d622de7b61362b69480ce018fea21c115fee011c18c496be8ea0ae8fd73811ed5a84ba0cc3ddea0c8808eec46107460b058dea7452b6581ffa62407cea6d391c8d621a0baeef2f5e230822e79fc29f03ac1c25fa82493191daa057523368d69136624926502dddef2030e2e3eece55a67a00d9005b961f6ee20d4a15362320fe8d54fcf6c13f09a212339a0fabcf2d251a29f0bdfd824df263fd0710d29bcb346c3a7e1d68ecbb15336476e03c757a31f3ddeb796a4475c9cc1e294a659d0e0430f2a4d9a8f8bf67f55668704d5034b06ef03b6262528a2125a5e839bbd3ad0da842de6370b7f990ed7de8f81d7f17370dee9cdfe58dfe5cfab750f9053fc9bb6361a8d67506189baa28aeb8ab5434da80c03b96e773d2228e2b7becf31c9f61b3a93182567a0b68b003d65a49bd074fb8a98a4d772e7c1c6c4f635b4cff4582af78eb38b0a02ccc157d7ef8151be6ad4fb219b3cd2bfb8af739abf462aaa8dd3d2b0e2a41c783c3cb6016d94bced42164ea577a32a5c8c3d44f4afe530da78c1645a7ae9083c2366d001ead708620aeedc012a726ffd4f93f71a5b01c835594417718c0ec0a1512c0182069c857559a20ad7ef34aaea1a49489083e46f7a41b40cb42726c6ed20de366fa24f6f560ebef1799b74a8775e43fbfe489785c6ddd73c02b436274ebca4f59723f00cb9f1f63c6be15ef5f5f8c30ec652842ae895c952ef83395bfec05a24c2509496b22efc3dd9459637bd1631d00024c012a26c1a997f61af381368b93015be83b1b9493ef34acb3ea835c0c30189ee76bc5d5dbbb1193625ea1ad6ee801" + "proof_data_hex": "3492b7d0251dd93326e2fd1af4c06b8850622552865ada7f9fa9934a5b18ac37a4ecf5482c6ab6a3a82bf41ed28de2c02d6af8f3eaa4afa1a7e62cc2d563e1790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a00da5d24c57ba5a7eda9f723faf5380aea15c3214ee0e8fa7a2dd3e3ebfd913f4f86aaab1b2cfec6d3932b5d32988565e0f1fd43a107c80301e8302924194001801b004bba72fc80021c906f97c05eac12a06f814ee02257921bc045d03ae119818522521ea71cbdc4d6187d4a7bf83f798321295aaf53f94d0c4be8b1b0a6d133ab9b48712fc2f5e6652104389c80857e27a0ded8af0dc468136136cba1f0e22e919c5cc9e86f0f5dc245beeb2512fa77a0b90088df10f75fb7142e54d2109f0ce4e6ca956691f4f1a94fbff8ccf1b6f063864edac7bef04b1783b2e9334058c7fabb98acf181a8c456c019ddcb8f2970d6dc43362e8da8778b2e4eb7e7b176c0b2c11d857ca48ea0837d4895a957c4f693dc4a313fef87c61b69ad571c5184a1bccc31b30aed4d0b1e49872d4794158ababc4a6911a8507d87746cd5afe4d744464392b9f81234b6f5dd022e6f5abad500a79218087201344c6a985120b45a00c146196a5e868d64628665e5217757c2dfd7b86da1f0f4db89df4ed532530ce14833f235d490aa1a2881e8114261e765347c36d761e00d6d1b650a427b962e0e2d4e9b6debd66666b2f340a94258c3bac6883089ff17fbc1dc7072e7bec3ab033225e1cf0f57538c1a969ad47dfaca82d11012db578291ceb0b48e063cb5bf02c39d4573d5e440c0734a2a06ba7339e20c1320f99165a3c0ea6c82eb86335ecaf0f791aac5ec8ea6a8d026661b6de4ec022478284882fc82183a36637e865d818314a191a65ad7fe36afab6d2e3f384ca1a7afb758bc3779c9246ef6e0e319c856b84cd94e82547d7f6b434340f24a1b0198805c61a614322b4f33d42404fac9b3a6d22505433b424bf96da919847ca84129fc44723a4b02a35051105f805502d99acd1a3af89f401bc483d6bcf4a4905be1e733bea54e5ca5b703bed26265c93e185fd56351ae12fed2b4a86901ff1ac9595db79ceb71e04aa04758bd5026162706c29efcd07dc99283b36b99cf71754635a6e8c7d807c7e85f3a25f7d0b" }, "mutations": [ { @@ -98,7 +98,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "150466839b6c89f2a698caf5825425d70a49d5d9ea201ae8dffae5b0ac6b3b20726cc8d72b7ebef5ef05526821199c2b5018f1bdbbd53f8f2c72a477f52e8a770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000662b4a0066aae6cdf571e9d0d369ca879450e699c100243520b4e061a0d55b7efe9bd7f72f7a305ab7bb83d3efcfa3afda3a5ebe298dafc8a07f6161c26cf3723051fcf7a8b8a0aeec8dccd4bca499c6f420540e6850ae5775003ea10d13a5711e4ec199287b2f7c36690570e1def856085c873b6867e36f3a66087fdd24ab12d086e935833deb94f9339f57254125295df66273fd12d622de7b61362b69480ce018fea21c115fee011c18c496be8ea0ae8fd73811ed5a84ba0cc3ddea0c8808eec46107460b058dea7452b6581ffa62407cea6d391c8d621a0baeef2f5e230822e79fc29f03ac1c25fa82493191daa057523368d69136624926502dddef2030e2e3eece55a67a00d9005b961f6ee20d4a15362320fe8d54fcf6c13f09a212339a0fabcf2d251a29f0bdfd824df263fd0710d29bcb346c3a7e1d68ecbb15336476e03c757a31f3ddeb796a4475c9cc1e294a659d0e0430f2a4d9a8f8bf67f55668704d5034b06ef03b6262528a2125a5e839bbd3ad0da842de6370b7f990ed7de8f81d7f17370dee9cdfe58dfe5cfab750f9053fc9bb6361a8d67506189baa28aeb8ab5434da80c03b96e773d2228e2b7becf31c9f61b3a93182567a0b68b003d65a49bd074fb8a98a4d772e7c1c6c4f635b4cff4582af78eb38b0a02ccc157d7ef8151be6ad4fb219b3cd2bfb8af739abf462aaa8dd3d2b0e2a41c783c3cb6016d94bced42164ea577a32a5c8c3d44f4afe530da78c1645a7ae9083c2366d001ead708620aeedc012a726ffd4f93f71a5b01c835594417718c0ec0a1512c0182069c857559a20ad7ef34aaea1a49489083e46f7a41b40cb42726c6ed20de366fa24f6f560ebef1799b74a8775e43fbfe489785c6ddd73c02b436274ebca4f59723f00cb9f1f63c6be15ef5f5f8c30ec652842ae895c952ef83395bfec05a24c2509496b22efc3dd9459637bd1631d00024c012a26c1a997f61af381368b93015be83b1b9493ef34acb3ea835c0c30189ee76bc5d5dbbb1193625ea1ad6ee801" + "value_hex": "3592b7d0251dd93326e2fd1af4c06b8850622552865ada7f9fa9934a5b18ac37a4ecf5482c6ab6a3a82bf41ed28de2c02d6af8f3eaa4afa1a7e62cc2d563e1790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a00da5d24c57ba5a7eda9f723faf5380aea15c3214ee0e8fa7a2dd3e3ebfd913f4f86aaab1b2cfec6d3932b5d32988565e0f1fd43a107c80301e8302924194001801b004bba72fc80021c906f97c05eac12a06f814ee02257921bc045d03ae119818522521ea71cbdc4d6187d4a7bf83f798321295aaf53f94d0c4be8b1b0a6d133ab9b48712fc2f5e6652104389c80857e27a0ded8af0dc468136136cba1f0e22e919c5cc9e86f0f5dc245beeb2512fa77a0b90088df10f75fb7142e54d2109f0ce4e6ca956691f4f1a94fbff8ccf1b6f063864edac7bef04b1783b2e9334058c7fabb98acf181a8c456c019ddcb8f2970d6dc43362e8da8778b2e4eb7e7b176c0b2c11d857ca48ea0837d4895a957c4f693dc4a313fef87c61b69ad571c5184a1bccc31b30aed4d0b1e49872d4794158ababc4a6911a8507d87746cd5afe4d744464392b9f81234b6f5dd022e6f5abad500a79218087201344c6a985120b45a00c146196a5e868d64628665e5217757c2dfd7b86da1f0f4db89df4ed532530ce14833f235d490aa1a2881e8114261e765347c36d761e00d6d1b650a427b962e0e2d4e9b6debd66666b2f340a94258c3bac6883089ff17fbc1dc7072e7bec3ab033225e1cf0f57538c1a969ad47dfaca82d11012db578291ceb0b48e063cb5bf02c39d4573d5e440c0734a2a06ba7339e20c1320f99165a3c0ea6c82eb86335ecaf0f791aac5ec8ea6a8d026661b6de4ec022478284882fc82183a36637e865d818314a191a65ad7fe36afab6d2e3f384ca1a7afb758bc3779c9246ef6e0e319c856b84cd94e82547d7f6b434340f24a1b0198805c61a614322b4f33d42404fac9b3a6d22505433b424bf96da919847ca84129fc44723a4b02a35051105f805502d99acd1a3af89f401bc483d6bcf4a4905be1e733bea54e5ca5b703bed26265c93e185fd56351ae12fed2b4a86901ff1ac9595db79ceb71e04aa04758bd5026162706c29efcd07dc99283b36b99cf71754635a6e8c7d807c7e85f3a25f7d0b" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -108,7 +108,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "140466839b6c89f2a698caf5825425d70a49d5d9ea201ae8dffae5b0ac6b3b20726cc8d72b7ebef5ef05526821199c2b5018f1bdbbd53f8f2c72a477f52e8a770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000662b4a0066aae6cdf571e9d0d369ca879450e699c100243520b4e061a0d55b7efe9bd7f72f7a305ab7bb83d3efcfa3afda3a5ebe298dafc8a07f6161c26cf3723051fcf7a8b8a0aeec8dccd4bca499c6f420540e6850ae5775003ea10d13a5711e4ec199287b2f7c36690570e1def856085c873b6867e36f3a66087fdd24ab12d086e935833deb94f9339f57254125295df66273fd12d622de7b61362b69480ce018fea21c115fee011c18c496be8ea0ae8fd73811ed5a84ba0cc3ddea0c8808eec46107460b058dea7452b6581ffa62407cea6d391c8d621a0baeef2f5e230822e79fc29f03ac1c25fa82493191daa057523368d69136624926502dddef2030e2e3eece55a67a00d9005b961f6ee20d4a15362320fe8d54fcf6c13f09a212339a0fabcf2d251a29f0bdfd824df263fd0710d29bcb346c3a7e1d68ecbb15336476e03c757a31f3ddeb796a4475c9cc1e294a659d0e0430f2a4d9a8f8bf67f55668704d5034b06ef03b6262528a2125a5e839bbd3ad0da842de6370b7f990ed7de8f81d7f17370dee9cdfe58dfe5cfab750f9053fc9bb6361a8d67506189baa28aeb8ab5434da80c03b96e773d2228e2b7becf31c9f61b3a93182567a0b68b003d65a49bd074fb8a98a4d772e7c1c6c4f635b4cff4582af78eb38b0a02ccc157d7ef8151be6ad4fb219b3cd2bfb8af739abf462aaa8dd3d2b0e2a41c783c3cb6016d94bced42164ea577a32a5c8c3d44f4afe530da78c1645a7ae9083c2366d001ead708620aeedc012a726ffd4f93f71a5b01c835594417718c0ec0a1512c0182069c857559a20ad7ef34aaea1a49489083e46f7a41b40cb42726c6ed20de366fa24f6f560ebef1799b74a8775e43fbfe489785c6ddd73c02b436274ebca4f59723f00cb9f1f63c6be15ef5f5f8c30ec652842ae895c952ef83395bfec05a24c2509496b22efc3dd9459637bd1631d00024c012a26c1a997f61af381368b93015be83b1b9493ef34acb3ea835c0c30189ee76bc5d5dbbb1193625ea1ad6e" + "value_hex": "3492b7d0251dd93326e2fd1af4c06b8850622552865ada7f9fa9934a5b18ac37a4ecf5482c6ab6a3a82bf41ed28de2c02d6af8f3eaa4afa1a7e62cc2d563e1790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a00da5d24c57ba5a7eda9f723faf5380aea15c3214ee0e8fa7a2dd3e3ebfd913f4f86aaab1b2cfec6d3932b5d32988565e0f1fd43a107c80301e8302924194001801b004bba72fc80021c906f97c05eac12a06f814ee02257921bc045d03ae119818522521ea71cbdc4d6187d4a7bf83f798321295aaf53f94d0c4be8b1b0a6d133ab9b48712fc2f5e6652104389c80857e27a0ded8af0dc468136136cba1f0e22e919c5cc9e86f0f5dc245beeb2512fa77a0b90088df10f75fb7142e54d2109f0ce4e6ca956691f4f1a94fbff8ccf1b6f063864edac7bef04b1783b2e9334058c7fabb98acf181a8c456c019ddcb8f2970d6dc43362e8da8778b2e4eb7e7b176c0b2c11d857ca48ea0837d4895a957c4f693dc4a313fef87c61b69ad571c5184a1bccc31b30aed4d0b1e49872d4794158ababc4a6911a8507d87746cd5afe4d744464392b9f81234b6f5dd022e6f5abad500a79218087201344c6a985120b45a00c146196a5e868d64628665e5217757c2dfd7b86da1f0f4db89df4ed532530ce14833f235d490aa1a2881e8114261e765347c36d761e00d6d1b650a427b962e0e2d4e9b6debd66666b2f340a94258c3bac6883089ff17fbc1dc7072e7bec3ab033225e1cf0f57538c1a969ad47dfaca82d11012db578291ceb0b48e063cb5bf02c39d4573d5e440c0734a2a06ba7339e20c1320f99165a3c0ea6c82eb86335ecaf0f791aac5ec8ea6a8d026661b6de4ec022478284882fc82183a36637e865d818314a191a65ad7fe36afab6d2e3f384ca1a7afb758bc3779c9246ef6e0e319c856b84cd94e82547d7f6b434340f24a1b0198805c61a614322b4f33d42404fac9b3a6d22505433b424bf96da919847ca84129fc44723a4b02a35051105f805502d99acd1a3af89f401bc483d6bcf4a4905be1e733bea54e5ca5b703bed26265c93e185fd56351ae12fed2b4a86901ff1ac9595db79ceb71e04aa04758bd5026162706c29efcd07dc99283b36b99cf71754635a6e8c7d807c7e85f3a25f" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -128,7 +128,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "140466839b6c89f2a698caf5825425d70a49d5d9ea201ae8dffae5b0ac6b3b20726cc8d72b7ebef5ef05526821199c2b5018f1bdbbd53f8f2c72a477f52e8a770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000662b4a0066aae6cdf571e9d0d369ca879450e699c100243520b4e061a0d55b7efe9bd7f72f7a305ab7bb83d3efcfa3afda3a5ebe298dafc8a07f6161c26cf3723051fcf7a8b8a0aeec8dccd4bca499c6f420540e6850ae5775003ea10d13a5711e4ec199287b2f7c36690570e1def856085c873b6867e36f3a66087fdd24ab12d086e935833deb94f9339f57254125295df66273fd12d622de7b61362b69480ce018fea21c115fee011c18c496be8ea0ae8fd73811ed5a84ba0cc3ddea0c8808eec46107460b058dea7452b6581ffa62407cea6d391c8d621a0baeef2f5e230822e79fc29f03ac1c25fa82493191daa057523368d69136624926502dddef2030e2e3eece55a67a00d9005b961f6ee20d4a15362320fe8d54fcf6c13f09a212339a0fabcf2d251a29f0bdfd824df263fd0710d29bcb346c3a7e1d68ecbb15336476e03c757a31f3ddeb796a4475c9cc1e294a659d0e0430f2a4d9a8f8bf67f55668704d5034b06ef03b6262528a2125a5e839bbd3ad0da842de6370b7f990ed7de8f81d7f17370dee9cdfe58dfe5cfab750f9053fc9bb6361a8d67506189baa28aeb8ab5434da80c03b96e773d2228e2b7becf31c9f61b3a93182567a0b68b003d65a49bd074fb8a98a4d772e7c1c6c4f635b4cff4582af78eb38b0a02ccc157d7ef8151be6ad4fb219b3cd2bfb8af739abf462aaa8dd3d2b0e2a41c783c3cb6016d94bced42164ea577a32a5c8c3d44f4afe530da78c1645a7ae9083c2366d001ead708620aeedc012a726ffd4f93f71a5b01c835594417718c0ec0a1512c0182069c857559a20ad7ef34aaea1a49489083e46f7a41b40cb42726c6ed20de366fa24f6f560ebef1799b74a8775e43fbfe489785c6ddd73c02b436274ebca4f59723f00cb9f1f63c6be15ef5f5f8c30ec652842ae895c952ef83395bfec05a24c2509496b22efc3dd9459637bd1631d00024c012a26c1a997f61af381368b93015be83b1b9493ef34acb3ea835c0c30189ee76bc5d5dbbb1193625ea1ad6ee800" + "value_hex": "3492b7d0251dd93326e2fd1af4c06b8850622552865ada7f9fa9934a5b18ac37a4ecf5482c6ab6a3a82bf41ed28de2c02d6af8f3eaa4afa1a7e62cc2d563e1790000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a00da5d24c57ba5a7eda9f723faf5380aea15c3214ee0e8fa7a2dd3e3ebfd913f4f86aaab1b2cfec6d3932b5d32988565e0f1fd43a107c80301e8302924194001801b004bba72fc80021c906f97c05eac12a06f814ee02257921bc045d03ae119818522521ea71cbdc4d6187d4a7bf83f798321295aaf53f94d0c4be8b1b0a6d133ab9b48712fc2f5e6652104389c80857e27a0ded8af0dc468136136cba1f0e22e919c5cc9e86f0f5dc245beeb2512fa77a0b90088df10f75fb7142e54d2109f0ce4e6ca956691f4f1a94fbff8ccf1b6f063864edac7bef04b1783b2e9334058c7fabb98acf181a8c456c019ddcb8f2970d6dc43362e8da8778b2e4eb7e7b176c0b2c11d857ca48ea0837d4895a957c4f693dc4a313fef87c61b69ad571c5184a1bccc31b30aed4d0b1e49872d4794158ababc4a6911a8507d87746cd5afe4d744464392b9f81234b6f5dd022e6f5abad500a79218087201344c6a985120b45a00c146196a5e868d64628665e5217757c2dfd7b86da1f0f4db89df4ed532530ce14833f235d490aa1a2881e8114261e765347c36d761e00d6d1b650a427b962e0e2d4e9b6debd66666b2f340a94258c3bac6883089ff17fbc1dc7072e7bec3ab033225e1cf0f57538c1a969ad47dfaca82d11012db578291ceb0b48e063cb5bf02c39d4573d5e440c0734a2a06ba7339e20c1320f99165a3c0ea6c82eb86335ecaf0f791aac5ec8ea6a8d026661b6de4ec022478284882fc82183a36637e865d818314a191a65ad7fe36afab6d2e3f384ca1a7afb758bc3779c9246ef6e0e319c856b84cd94e82547d7f6b434340f24a1b0198805c61a614322b4f33d42404fac9b3a6d22505433b424bf96da919847ca84129fc44723a4b02a35051105f805502d99acd1a3af89f401bc483d6bcf4a4905be1e733bea54e5ca5b703bed26265c93e185fd56351ae12fed2b4a86901ff1ac9595db79ceb71e04aa04758bd5026162706c29efcd07dc99283b36b99cf71754635a6e8c7d807c7e85f3a25f7d0a" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -140,15 +140,15 @@ "family": "transfer_composite", "expected_valid": true, "payload": { - "equality_proof_data_hex": "5e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870bd6e05fcbcb7077aa122301f052243c301644a332e4ab2a3ff45e456c9d38086a027f723e8302c8301bf58c162a48b4f171b9a75350957b5998566aabf9355246140466839b6c89f2a698caf5825425d70a49d5d9ea201ae8dffae5b0ac6b3b204201d7f563a5c837e7861d75980a46cec4ec82d6d007673db2b9b254ed1181330efc7b041d17987fe21175cbca66485cf85b5a64c1eb98ec42ada426c9520e3ed07de086f2cfd2def4fa1773e65dd132ba109c05fcdfcfa0161f1fc8800df515311c3695c0bd19213ba3f97157b4afc95bd1412269e62cb322890dc5e6aa91000259f92022fcf29baf40b876e0acb3ff0db214442a4a8b5a9d444a22c6be990d847e201b5cb26cc31a75008ea1a6ac302b5062458b8d37050fa94d428e34e70a", - "range_proof_data_hex": "140466839b6c89f2a698caf5825425d70a49d5d9ea201ae8dffae5b0ac6b3b20726cc8d72b7ebef5ef05526821199c2b5018f1bdbbd53f8f2c72a477f52e8a770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000662b4a0066aae6cdf571e9d0d369ca879450e699c100243520b4e061a0d55b7efe9bd7f72f7a305ab7bb83d3efcfa3afda3a5ebe298dafc8a07f6161c26cf3723051fcf7a8b8a0aeec8dccd4bca499c6f420540e6850ae5775003ea10d13a5711e4ec199287b2f7c36690570e1def856085c873b6867e36f3a66087fdd24ab12d086e935833deb94f9339f57254125295df66273fd12d622de7b61362b69480ce018fea21c115fee011c18c496be8ea0ae8fd73811ed5a84ba0cc3ddea0c8808eec46107460b058dea7452b6581ffa62407cea6d391c8d621a0baeef2f5e230822e79fc29f03ac1c25fa82493191daa057523368d69136624926502dddef2030e2e3eece55a67a00d9005b961f6ee20d4a15362320fe8d54fcf6c13f09a212339a0fabcf2d251a29f0bdfd824df263fd0710d29bcb346c3a7e1d68ecbb15336476e03c757a31f3ddeb796a4475c9cc1e294a659d0e0430f2a4d9a8f8bf67f55668704d5034b06ef03b6262528a2125a5e839bbd3ad0da842de6370b7f990ed7de8f81d7f17370dee9cdfe58dfe5cfab750f9053fc9bb6361a8d67506189baa28aeb8ab5434da80c03b96e773d2228e2b7becf31c9f61b3a93182567a0b68b003d65a49bd074fb8a98a4d772e7c1c6c4f635b4cff4582af78eb38b0a02ccc157d7ef8151be6ad4fb219b3cd2bfb8af739abf462aaa8dd3d2b0e2a41c783c3cb6016d94bced42164ea577a32a5c8c3d44f4afe530da78c1645a7ae9083c2366d001ead708620aeedc012a726ffd4f93f71a5b01c835594417718c0ec0a1512c0182069c857559a20ad7ef34aaea1a49489083e46f7a41b40cb42726c6ed20de366fa24f6f560ebef1799b74a8775e43fbfe489785c6ddd73c02b436274ebca4f59723f00cb9f1f63c6be15ef5f5f8c30ec652842ae895c952ef83395bfec05a24c2509496b22efc3dd9459637bd1631d00024c012a26c1a997f61af381368b93015be83b1b9493ef34acb3ea835c0c30189ee76bc5d5dbbb1193625ea1ad6ee801", - "validity_proof_data_hex": "5e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870bccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c726cc8d72b7ebef5ef05526821199c2b5018f1bdbbd53f8f2c72a477f52e8a77c235b763b917f2b8a7994b3e6e6c592904874028992dfa7f7abd0a6ca393d27c12a8eacffaf1045ace8a2a83950a8404638107fa371e4c48dcad45cd8955845d62d9fd0e651e4b857cee3329e4ce468442da84e55359a6bfd92f8bd82b7e620234cd97580e1a7a2e785716c6ba79b304e8e3e9b0cc76d1a7414be49d2432495b7c321c4bd0f118a9ae5daa9785ad1c42c28b3a619bc6b943ea83fad6e56afd6d3a9b5e7a27f364a3a894bab4921c2b419028c088634832677be8e35a029b475764bc05f573011ef336950446586adb86941318de26cca565234a4c86ec49873ff872427cb9bf326a6112ad10d70740455662a50e882ab9ff17d27578432e3d25450e14a7b53aebc9624175bf52e535bdf0bd68eb532397666de4aba3accde204713bddc60190ee1e310e10178c7c6deddd46ebb6ed9f5214234fa0e1bb181e03" + "equality_proof_data_hex": "d4508ad57e19936d09a2584f4b537b138dad4ae24fd0274a25fa67f16cff945b4a2357009dbcd99f422bfc00ee439e47146d6713da6a8eb375e00ca71c38cd796c3fbfe5ac81e83abce7eed706288ea785fca58c7657981ad5014f4934f9192ab4bd53d8ae9837fb343adb06794f86ed71d154c73975fadedc4e62a5f371225fe2c29e366239c73fece89d1cb16e6349a26e98739af70ca88ca0b4706cf6e62a06cf80c66c63137fe7dfe9585dd1002f241222b6431b5afbb4e7c40a8c535c6f70f2ba1c26b339b1bc370fec89b6b9ac206e52176d9b9c931fb6569dbd113747a767154f07471395e7ff87ff7a9810a3ce09aa3abf381d7ce32d0330fd43d201d683f54a73d7b2abb2e8c0ac96435e6d20e993966a238a9507c367dc0220110472246b2fc894ba032e3aeaaf8201a6f57119bb9e35872aa8e44446864437d901", + "range_proof_data_hex": "b4bd53d8ae9837fb343adb06794f86ed71d154c73975fadedc4e62a5f371225fd08d98ab71db7c75e8ae01e848a44648a8eb5b903c5d53aa43b5801910b928420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000dee4009e1e8167cb7f653888de894275464f792113a5530c3c679016c71106282024e1f0f0c520e2a5a5098061f9d53955cc782b51e94eb0dc3807b7bab1b15b40a427f79b2c5762c287ee442461b35b0fd2bdeab8924677bb23e281f840f54f4af2df728f53f0f8f2ad0d041e413ed1c694161fd4bf939c1627caf6b796c8597304f4299deddf0402cdfe7b7d80f6d2d3787cb0def1f37afdbc616988c14c0be30b74d4bc118715bb549d510a82e1b11fd0dc05ac1a81dfca88ec36066f820d49bf1c271e0c490a2215830ca69c14f9832da79401b8a7f7699439a3282769022aea8c0fba06b8c18772db50096ccddd552923aabb4bdce316ef8b5f7b880667ba93b33cd9a06b000986e6d113bc270b577fb1b57a9897543392c6cdabb16200fe2582ee804f8315e3fda6790fafec3d2e88f9eb19b7cb0e817635588eb99102aa7f5b77de2ff1f469543a40673872b3ec1d91e6e3aed37848fbf6e1c2e7417fa2ab799872c2984d72db51efdd56f2dc0681cb84a0794e5f1ae2de74bf7ae309de595330f665f57564d91aff441d3dc17e3ac4f0388433c4fd8d50df6bf81f5b1cc5e5e0839b7a4181db2dd4ae0b17610020ee677f8d738556ed10f48d3f095fc07a99ef6365feb53add4eb4526c4d81064fd34ceac3a69a4e56f2e2acb2137c120ce3763e667c18412c5153080bd1b04835e0442d9743bb79a053583e84f139769187c6a30bb82d7ede5af8f51e9aa4a697696d3c34ef72a7de3b0eed87fe1fa67c70c006392e45b85c0bb5fe28e052aa1ea1d4a0007886db52e5651c2c8a03f292f45d5ecb2cadc667d26fcc042d775feb584792998bfd3b01229fa329c71ede3905c48cc5ea3ff7853f70ed5c9d0b314f1027fc4b38b3b0b647858169136714868b11eddc2084398d2ec968e93025824054b517af58f1100f3276c15af008e5b608883fc379763cffaf6c3c5356acbf2f9f9776e74a1436c18546820447096f33441accbf1f93a640fa9b0b365717ec9d36e744520c85e0f522d6f7329d0e", + "validity_proof_data_hex": "d4508ad57e19936d09a2584f4b537b138dad4ae24fd0274a25fa67f16cff945bd8454b4846ab296d15cf9a676c1d49febc2c67a7dff36271b1b43dff6d654915d08d98ab71db7c75e8ae01e848a44648a8eb5b903c5d53aa43b5801910b92842e463de2fa5918606aa9e48039a97c3dea5e827a3c067052caaa1353955f39b521619236d9bf0b56619022334b9f08dcbd491b1c1cbbb267320efd9e9e87f2477d820ceaeb97792f2c3dd7adcae7bf4c65f8ee479b60253fa39cbc533529ebc6e20ae9ba26db8b6bbf3ccca10d773dabad63d69eb6cd084763129a6710fdf8a34de4a60f09d8e0e8a7da68d416d22f19200354bb1631f92f3e1c910143ad20376bef0491477311cb649de0bef2665dc7f5e8782b823fb2246358de56d09cf7d19de2c864e78a8ada8d9cad273e9e5923dc51d8b53759b98864bbbd5fce05fe015dec72019be64ede701a305532159c5812b97ebafc05e08c07e50289f96bd0c0ef9066d5bf1f5515e285fc9da8db72c72d965871acadb677923f38e658a1678023a466b1b9373c3d61b0dafaed9a4083949ecb2bb83ca6bd49b65ba876941870b" }, "binding": { - "current_balance_commitment_hex": "d2aac024a9c16f6b065395effc4502fbe91a1f080feff51b579aeec25326aa1d", - "current_balance_handle_hex": "0e267a3fc27f17f182d155055a5d99faf8cb31b065b7d85675d96ae041e25e0b", - "recipient_pubkey_hex": "ccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c", - "sender_pubkey_hex": "5e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b" + "current_balance_commitment_hex": "2c49e7c3d6566db816361d6ab7a4b2c5aa6166b682230840012cf4984278ce7e", + "current_balance_handle_hex": "72e1531a51c1f5bba57467e69b969a11aa2f1ae8489b758f7a50f5c517676f6d", + "recipient_pubkey_hex": "d8454b4846ab296d15cf9a676c1d49febc2c67a7dff36271b1b43dff6d654915", + "sender_pubkey_hex": "d4508ad57e19936d09a2584f4b537b138dad4ae24fd0274a25fa67f16cff945b" }, "mutations": [ { @@ -166,7 +166,7 @@ "op": "bitflip", "target": "binding.sender_pubkey_hex", "params": { - "value_hex": "5f06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b" + "value_hex": "d5508ad57e19936d09a2584f4b537b138dad4ae24fd0274a25fa67f16cff945b" }, "expected_valid": false, "expected_error_contains": "failed" @@ -176,7 +176,7 @@ "op": "bitflip", "target": "binding.recipient_pubkey_hex", "params": { - "value_hex": "cdab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c" + "value_hex": "d9454b4846ab296d15cf9a676c1d49febc2c67a7dff36271b1b43dff6d654915" }, "expected_valid": false, "expected_error_contains": "failed" @@ -196,7 +196,7 @@ "op": "truncate", "target": "payload.range_proof_data_hex", "params": { - "value_hex": "140466839b6c89f2a698caf5825425d70a49d5d9ea201ae8dffae5b0ac6b3b20726cc8d72b7ebef5ef05526821199c2b5018f1bdbbd53f8f2c72a477f52e8a770000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000662b4a0066aae6cdf571e9d0d369ca879450e699c100243520b4e061a0d55b7efe9bd7f72f7a305ab7bb83d3efcfa3afda3a5ebe298dafc8a07f6161c26cf3723051fcf7a8b8a0aeec8dccd4bca499c6f420540e6850ae5775003ea10d13a5711e4ec199287b2f7c36690570e1def856085c873b6867e36f3a66087fdd24ab12d086e935833deb94f9339f57254125295df66273fd12d622de7b61362b69480ce018fea21c115fee011c18c496be8ea0ae8fd73811ed5a84ba0cc3ddea0c8808eec46107460b058dea7452b6581ffa62407cea6d391c8d621a0baeef2f5e230822e79fc29f03ac1c25fa82493191daa057523368d69136624926502dddef2030e2e3eece55a67a00d9005b961f6ee20d4a15362320fe8d54fcf6c13f09a212339a0fabcf2d251a29f0bdfd824df263fd0710d29bcb346c3a7e1d68ecbb15336476e03c757a31f3ddeb796a4475c9cc1e294a659d0e0430f2a4d9a8f8bf67f55668704d5034b06ef03b6262528a2125a5e839bbd3ad0da842de6370b7f990ed7de8f81d7f17370dee9cdfe58dfe5cfab750f9053fc9bb6361a8d67506189baa28aeb8ab5434da80c03b96e773d2228e2b7becf31c9f61b3a93182567a0b68b003d65a49bd074fb8a98a4d772e7c1c6c4f635b4cff4582af78eb38b0a02ccc157d7ef8151be6ad4fb219b3cd2bfb8af739abf462aaa8dd3d2b0e2a41c783c3cb6016d94bced42164ea577a32a5c8c3d44f4afe530da78c1645a7ae9083c2366d001ead708620aeedc012a726ffd4f93f71a5b01c835594417718c0ec0a1512c0182069c857559a20ad7ef34aaea1a49489083e46f7a41b40cb42726c6ed20de366fa24f6f560ebef1799b74a8775e43fbfe489785c6ddd73c02b436274ebca4f59723f00cb9f1f63c6be15ef5f5f8c30ec652842ae895c952ef83395bfec05a24c2509496b22efc3dd9459637bd1631d00024c012a26c1a997f61af381368b93015be83b1b9493ef34acb3ea835c0c30189ee76bc5d5dbbb1193625ea1ad6e" + "value_hex": "b4bd53d8ae9837fb343adb06794f86ed71d154c73975fadedc4e62a5f371225fd08d98ab71db7c75e8ae01e848a44648a8eb5b903c5d53aa43b5801910b928420000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000dee4009e1e8167cb7f653888de894275464f792113a5530c3c679016c71106282024e1f0f0c520e2a5a5098061f9d53955cc782b51e94eb0dc3807b7bab1b15b40a427f79b2c5762c287ee442461b35b0fd2bdeab8924677bb23e281f840f54f4af2df728f53f0f8f2ad0d041e413ed1c694161fd4bf939c1627caf6b796c8597304f4299deddf0402cdfe7b7d80f6d2d3787cb0def1f37afdbc616988c14c0be30b74d4bc118715bb549d510a82e1b11fd0dc05ac1a81dfca88ec36066f820d49bf1c271e0c490a2215830ca69c14f9832da79401b8a7f7699439a3282769022aea8c0fba06b8c18772db50096ccddd552923aabb4bdce316ef8b5f7b880667ba93b33cd9a06b000986e6d113bc270b577fb1b57a9897543392c6cdabb16200fe2582ee804f8315e3fda6790fafec3d2e88f9eb19b7cb0e817635588eb99102aa7f5b77de2ff1f469543a40673872b3ec1d91e6e3aed37848fbf6e1c2e7417fa2ab799872c2984d72db51efdd56f2dc0681cb84a0794e5f1ae2de74bf7ae309de595330f665f57564d91aff441d3dc17e3ac4f0388433c4fd8d50df6bf81f5b1cc5e5e0839b7a4181db2dd4ae0b17610020ee677f8d738556ed10f48d3f095fc07a99ef6365feb53add4eb4526c4d81064fd34ceac3a69a4e56f2e2acb2137c120ce3763e667c18412c5153080bd1b04835e0442d9743bb79a053583e84f139769187c6a30bb82d7ede5af8f51e9aa4a697696d3c34ef72a7de3b0eed87fe1fa67c70c006392e45b85c0bb5fe28e052aa1ea1d4a0007886db52e5651c2c8a03f292f45d5ecb2cadc667d26fcc042d775feb584792998bfd3b01229fa329c71ede3905c48cc5ea3ff7853f70ed5c9d0b314f1027fc4b38b3b0b647858169136714868b11eddc2084398d2ec968e93025824054b517af58f1100f3276c15af008e5b608883fc379763cffaf6c3c5356acbf2f9f9776e74a1436c18546820447096f33441accbf1f93a640fa9b0b365717ec9d36e744520c85e0f522d6f732" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -208,7 +208,7 @@ "family": "equality", "expected_valid": true, "payload": { - "proof_data_hex": "ccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c240fbf582f058b6f65c20fd91705d1ab420ede8aef1386885443260bb932570244a14962c8b9a3b7abde4d5a9b9055691c29c300bd07b4ccbf282d7541613300a0f18c69cb0e4187daa25c76ffde09a9b7b50aa9837e7da8c0126564b4ed314fce8812b4819919cded524a4ea5ca39c39ac900d633828ae3367112a735b75657f85d10244d06d82abba3cf607cc30a54cf2be89efa205a51b86818167f5f0d0622a19e1ba98e1304e880de4232b305be89b0a3212aebd6a3cb0b0658dd3e0405361e4c69bbe5b2cc6fc21831ae794d58574759b1d4cb64f99be3031e5e48ae0654d889ff612d4c22f59d9fb715ca8e719cebedd3bc6f2ad4f1a837d031859d03d3d8e05887a7759c9834690ad367e0298dea0746bdd9d8d80af0f8e1ddbeac07" + "proof_data_hex": "d8454b4846ab296d15cf9a676c1d49febc2c67a7dff36271b1b43dff6d6549154880735d691afb648a583200ae11614692db1c9f81267059c95f9a4a2f1f0b2ca2ce5adc7b99a954e905567407157f4314c390315c68d7820386901c203a1936680b8a6451662520e28970958acab35c83cda0de16a56fe048ebed9b7d2d350f680e49c08c8d877c61ea984a2496d5c84f9b48ad6610f686c3310ce91f1fbc4268e73e63dc1ec676760b51a0adfe5610610e7e67e0b48a96192e0c742187976610afe4e64853ea63e62a0d1a516ee06d9b8a82f9e8207018315063166636814fbe834803f5709fc8f22ce9acf0f1ad4d1c0f1f05eed6eac1a084188a4f600e0ba387c7807afaa9a87c8d509350dab1eb42493a17438bc7f24c184b369b62f4094098744636ade00de16b239d1c8edce52888dc62d36f1fe52ca32d0821afcf06" }, "mutations": [ { @@ -216,7 +216,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "cdab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c240fbf582f058b6f65c20fd91705d1ab420ede8aef1386885443260bb932570244a14962c8b9a3b7abde4d5a9b9055691c29c300bd07b4ccbf282d7541613300a0f18c69cb0e4187daa25c76ffde09a9b7b50aa9837e7da8c0126564b4ed314fce8812b4819919cded524a4ea5ca39c39ac900d633828ae3367112a735b75657f85d10244d06d82abba3cf607cc30a54cf2be89efa205a51b86818167f5f0d0622a19e1ba98e1304e880de4232b305be89b0a3212aebd6a3cb0b0658dd3e0405361e4c69bbe5b2cc6fc21831ae794d58574759b1d4cb64f99be3031e5e48ae0654d889ff612d4c22f59d9fb715ca8e719cebedd3bc6f2ad4f1a837d031859d03d3d8e05887a7759c9834690ad367e0298dea0746bdd9d8d80af0f8e1ddbeac07" + "value_hex": "d9454b4846ab296d15cf9a676c1d49febc2c67a7dff36271b1b43dff6d6549154880735d691afb648a583200ae11614692db1c9f81267059c95f9a4a2f1f0b2ca2ce5adc7b99a954e905567407157f4314c390315c68d7820386901c203a1936680b8a6451662520e28970958acab35c83cda0de16a56fe048ebed9b7d2d350f680e49c08c8d877c61ea984a2496d5c84f9b48ad6610f686c3310ce91f1fbc4268e73e63dc1ec676760b51a0adfe5610610e7e67e0b48a96192e0c742187976610afe4e64853ea63e62a0d1a516ee06d9b8a82f9e8207018315063166636814fbe834803f5709fc8f22ce9acf0f1ad4d1c0f1f05eed6eac1a084188a4f600e0ba387c7807afaa9a87c8d509350dab1eb42493a17438bc7f24c184b369b62f4094098744636ade00de16b239d1c8edce52888dc62d36f1fe52ca32d0821afcf06" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -226,7 +226,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "ccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c240fbf582f058b6f65c20fd91705d1ab420ede8aef1386885443260bb932570244a14962c8b9a3b7abde4d5a9b9055691c29c300bd07b4ccbf282d7541613300a0f18c69cb0e4187daa25c76ffde09a9b7b50aa9837e7da8c0126564b4ed314fce8812b4819919cded524a4ea5ca39c39ac900d633828ae3367112a735b75657f85d10244d06d82abba3cf607cc30a54cf2be89efa205a51b86818167f5f0d0622a19e1ba98e1304e880de4232b305be89b0a3212aebd6a3cb0b0658dd3e0405361e4c69bbe5b2cc6fc21831ae794d58574759b1d4cb64f99be3031e5e48ae0654d889ff612d4c22f59d9fb715ca8e719cebedd3bc6f2ad4f1a837d031859d03d3d8e05887a7759c9834690ad367e0298dea0746bdd9d8d80af0f8e1ddbe" + "value_hex": "d8454b4846ab296d15cf9a676c1d49febc2c67a7dff36271b1b43dff6d6549154880735d691afb648a583200ae11614692db1c9f81267059c95f9a4a2f1f0b2ca2ce5adc7b99a954e905567407157f4314c390315c68d7820386901c203a1936680b8a6451662520e28970958acab35c83cda0de16a56fe048ebed9b7d2d350f680e49c08c8d877c61ea984a2496d5c84f9b48ad6610f686c3310ce91f1fbc4268e73e63dc1ec676760b51a0adfe5610610e7e67e0b48a96192e0c742187976610afe4e64853ea63e62a0d1a516ee06d9b8a82f9e8207018315063166636814fbe834803f5709fc8f22ce9acf0f1ad4d1c0f1f05eed6eac1a084188a4f600e0ba387c7807afaa9a87c8d509350dab1eb42493a17438bc7f24c184b369b62f4094098744636ade00de16b239d1c8edce52888dc62d36f1fe52ca32d0821af" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -248,7 +248,7 @@ "family": "validity", "expected_valid": true, "payload": { - "proof_data_hex": "ccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d5275319e4b10e38f49d4def6ba1d3ebe8612b24c80c87653a61d865ec51bef288a6cacff5aff7e2740d4df71f9a17fa3470632c2fcd5541737572a33dcc88f74284a741e476c791ae088fe75b29088e3d5ac2b93cea1ca2ba1639ecbf60f814d5c909af844b3d08cdeb8e8bf52ebf5e9139f81989560a79645f668d02cdf7452e6fb3eade0eb0bb21de06712827e8203de7e02b1b60fb068ae8a8f5101f4381984546006c9c6f023899e5d40581e01ed3ede8c72c6ec98e859b42c4a124fd24d2817815cb6dd36e967029164e5bd96ceb03699749d7c65d01394189a416294649e3d31b861e15d4610b0907dfd65f8030d48ca0459bc9d0701806b345c765b5178bb9bbb420226337190a2db284f78a3d0b4aad459307ec6dc7e3c2c3fdd5c54cffdd1d8a0526002f97dc0516e6408162adf46d89476bbfacec4f897cacedd0b208f8d22a4c1a03c27e1841106fedf1222541944bbdd562fc33bb8521bde380f" + "proof_data_hex": "d8454b4846ab296d15cf9a676c1d49febc2c67a7dff36271b1b43dff6d654915fc2feed40d061ed35d415b503503273e201d99441a470b43c64e64870c6bb02ef4b9de1598005f1712bd5c8175e563bfd19be1d3f0b7e5a904aefd631e671623061092d3c1f09faf8d431e78ddb69cfc34df0ddde4784ac0080936957da7ce36407686ec373fd41a1985d33266489d0f0e65f32c39435e726b79d950ff028b7e3ac46f3669ba772a61626507d42ee7bdc2deedd2d123c422c13caed62a31793f56a35d1e031aa6e90645366cb9a475611c45c28a09d725e70f4da5e33da72178c4088aaf55a102a7efe091b06ea9bc7427f34674ea6874116002af0f2558864c18169555c75b6f69b2e558b4bba05e216bf49af831dd18c1ce551df6a31a97164ee18435029e4239ed87bd74d406035bca7cac5bd47032736f41e5fb6aca32200c49d8895cba4218ec4f1d02ceb77d070a6e3e223b1c55b86442d464434d3211e46d8d35249f34e1d54178d24e7abe13380cf9c2f066c3ee0aeba71ef5b8cd0f36511679e5631b84a7e769d1a2186bfe3167f9f5173d0688b0975e39fd492b01" }, "mutations": [ { @@ -256,7 +256,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "cdab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d5275319e4b10e38f49d4def6ba1d3ebe8612b24c80c87653a61d865ec51bef288a6cacff5aff7e2740d4df71f9a17fa3470632c2fcd5541737572a33dcc88f74284a741e476c791ae088fe75b29088e3d5ac2b93cea1ca2ba1639ecbf60f814d5c909af844b3d08cdeb8e8bf52ebf5e9139f81989560a79645f668d02cdf7452e6fb3eade0eb0bb21de06712827e8203de7e02b1b60fb068ae8a8f5101f4381984546006c9c6f023899e5d40581e01ed3ede8c72c6ec98e859b42c4a124fd24d2817815cb6dd36e967029164e5bd96ceb03699749d7c65d01394189a416294649e3d31b861e15d4610b0907dfd65f8030d48ca0459bc9d0701806b345c765b5178bb9bbb420226337190a2db284f78a3d0b4aad459307ec6dc7e3c2c3fdd5c54cffdd1d8a0526002f97dc0516e6408162adf46d89476bbfacec4f897cacedd0b208f8d22a4c1a03c27e1841106fedf1222541944bbdd562fc33bb8521bde380f" + "value_hex": "d9454b4846ab296d15cf9a676c1d49febc2c67a7dff36271b1b43dff6d654915fc2feed40d061ed35d415b503503273e201d99441a470b43c64e64870c6bb02ef4b9de1598005f1712bd5c8175e563bfd19be1d3f0b7e5a904aefd631e671623061092d3c1f09faf8d431e78ddb69cfc34df0ddde4784ac0080936957da7ce36407686ec373fd41a1985d33266489d0f0e65f32c39435e726b79d950ff028b7e3ac46f3669ba772a61626507d42ee7bdc2deedd2d123c422c13caed62a31793f56a35d1e031aa6e90645366cb9a475611c45c28a09d725e70f4da5e33da72178c4088aaf55a102a7efe091b06ea9bc7427f34674ea6874116002af0f2558864c18169555c75b6f69b2e558b4bba05e216bf49af831dd18c1ce551df6a31a97164ee18435029e4239ed87bd74d406035bca7cac5bd47032736f41e5fb6aca32200c49d8895cba4218ec4f1d02ceb77d070a6e3e223b1c55b86442d464434d3211e46d8d35249f34e1d54178d24e7abe13380cf9c2f066c3ee0aeba71ef5b8cd0f36511679e5631b84a7e769d1a2186bfe3167f9f5173d0688b0975e39fd492b01" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -266,7 +266,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "ccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d5275319e4b10e38f49d4def6ba1d3ebe8612b24c80c87653a61d865ec51bef288a6cacff5aff7e2740d4df71f9a17fa3470632c2fcd5541737572a33dcc88f74284a741e476c791ae088fe75b29088e3d5ac2b93cea1ca2ba1639ecbf60f814d5c909af844b3d08cdeb8e8bf52ebf5e9139f81989560a79645f668d02cdf7452e6fb3eade0eb0bb21de06712827e8203de7e02b1b60fb068ae8a8f5101f4381984546006c9c6f023899e5d40581e01ed3ede8c72c6ec98e859b42c4a124fd24d2817815cb6dd36e967029164e5bd96ceb03699749d7c65d01394189a416294649e3d31b861e15d4610b0907dfd65f8030d48ca0459bc9d0701806b345c765b5178bb9bbb420226337190a2db284f78a3d0b4aad459307ec6dc7e3c2c3fdd5c54cffdd1d8a0526002f97dc0516e6408162adf46d89476bbfacec4f897cacedd0b208f8d22a4c1a03c27e1841106fedf1222541944bbdd562fc33bb8521bde" + "value_hex": "d8454b4846ab296d15cf9a676c1d49febc2c67a7dff36271b1b43dff6d654915fc2feed40d061ed35d415b503503273e201d99441a470b43c64e64870c6bb02ef4b9de1598005f1712bd5c8175e563bfd19be1d3f0b7e5a904aefd631e671623061092d3c1f09faf8d431e78ddb69cfc34df0ddde4784ac0080936957da7ce36407686ec373fd41a1985d33266489d0f0e65f32c39435e726b79d950ff028b7e3ac46f3669ba772a61626507d42ee7bdc2deedd2d123c422c13caed62a31793f56a35d1e031aa6e90645366cb9a475611c45c28a09d725e70f4da5e33da72178c4088aaf55a102a7efe091b06ea9bc7427f34674ea6874116002af0f2558864c18169555c75b6f69b2e558b4bba05e216bf49af831dd18c1ce551df6a31a97164ee18435029e4239ed87bd74d406035bca7cac5bd47032736f41e5fb6aca32200c49d8895cba4218ec4f1d02ceb77d070a6e3e223b1c55b86442d464434d3211e46d8d35249f34e1d54178d24e7abe13380cf9c2f066c3ee0aeba71ef5b8cd0f36511679e5631b84a7e769d1a2186bfe3167f9f5173d0688b0975e39fd49" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -288,7 +288,7 @@ "family": "transfer_range", "expected_valid": true, "payload": { - "proof_data_hex": "a0f18c69cb0e4187daa25c76ffde09a9b7b50aa9837e7da8c0126564b4ed314f5275319e4b10e38f49d4def6ba1d3ebe8612b24c80c87653a61d865ec51bef28000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404000000000000020d40fed717097b9d86c50dda34e93ad87a18feb0dda1f9319da2be6b6fba54cfa878652001e53ca67b160bf22d8cda01b9d6194572559fc02d9be61d971382f101dcac52d8b7cb548c397209b31070975e3148b3f07ff51a224a309b32294354a7d5049d8ca494078d584c8e2594958eb907fd96754101aef484f4a948ec94495dbdadf0e21dfa033d089cf6ef845e380dad5f4d43e67d20274beecbe101a06dcecdd981bca3c60a419c9a3e65038e35d867c94418a2d02726400bfdf85a60c4d12fd18a045d5c105d5a9d0ae763d4670dceabb78d4dbe9b7fa3e2358b93b077ce20e741812595118ccc577ca3aa5574fdb77035563f6c05f5e3ec58be1df4b2a986a1c88a0fa7bc856cc67123d522f2d6429546daad6e31055cebe92ce5e64b04df3e716fb3935bbe157c069c0c4825e0bed1a8725851a11a17a14714e2f6d4c90e222fd1437b7eba9298729e3a1d30309723e23fcefd5a269247233683a21c6fc18b00345f64ec2acbc8dc34c26c2d22df36db765f2c585e92cbdd6d71a1d5ec079d12d12116ec8e2e041dc694eb1890dfa3c3e3837f42056c85758e2127206f1fcca42f071467a16607d828a2c0dba0761b070dc338cf5bc8280d325a601be890d915b6be3eca4dadcff6987a74dfea4281736fb33e66382a4194627fa5fc81f62d913afe249f7d2d4edbfade729ef836bffb5d2ed77b21aa65317f8c6139c0d48b806834c37acfc7982cf1a3ffe64cb760f3a11f0da7d9cd7ac8467a059026e50e493e5ce6082fed39e30ec148b716e636917fd198bf1e66d9ff519dc354eed5ec34f95989d8c87ef9028226367e8cca7e73bdec74db7a9b1bcb9125a2ea251a262fe539218a85ce98bdfc25cd53bdab604fc101320302ea28de49f5349b20790914ab23a85b80711b93a11047a72d928bb9c7115996d34f48c675ede140ca205038ca94beb9a007d746efb18bd39c55ec9b941aae1a692dabed2bc0e00572656fe76c2dc7adc1b62610dc3051c2e09a500fad71de3b5e31ac3e66d520c" + "proof_data_hex": "680b8a6451662520e28970958acab35c83cda0de16a56fe048ebed9b7d2d350ff4b9de1598005f1712bd5c8175e563bfd19be1d3f0b7e5a904aefd631e6716230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000e0ff1d1c033dcbbb5683dbea42f2ee333536a6755dc0e9e5be5d1abd6a9976316acd2803e91ce5ff3ff25181ef5c6d4db8e5de111ea6f2bfcaa3d3dcd9e2984c8a51d9cddde07da17f5c2e617cf579d5e88e7fd62109efa12b4dec7f0ab57a15de79995fc21e8a9303a5f3fa419396aa8413068197ca38b9f93200970a5c9173fd0767eebe81737351c9050492c87daf5854a009afb60c21c39f10bd3ad16d06601fe123286aaa623c0e7cfa2d16c5d33a9f00d0ef868b221aa4da18f6492a0c0178afd9a49cc986302ca7b67acec6d225bb8f1775537080e457eb1d4ef97d0b80de9c09de0f015905ad9f6d847f060093ebd24a0f3f34eac52ae11d9253be4770a6a5a514faef6bbefe4f0ccdfa22df307a552bd68bdd245b21e250e3a4f9139e96edffd52d28227eae0b329612a39b49ec3f34246f2d37b7ea49d22011414dd007687b681b1131c8a7b7b32ed283493261c1b87ec7ba94d5bb506ee78e774a1c9590f6296b2b3739d237c960231c501ede4ba2f7d1005d5fb497d99e17cf57dc65b9db9e6edae590148c780a458f3641f6d6114aa38bf7835029418e79dd32dad442a141b9b67d2f19a89c3523317a730887c9f2871fac8a732f25b5ca2753185c3e7ff4354c4b203bb25fdd8945b38447b3cbee082308c8fb35c5c5367d3e66e59490805b65ff644f4830628e4a66ebd5f09648917bf1b7c960df6cbf375f62f6e5f1b0c3fd89a6de40f35f7e4cdbe7a51bdf46d4d58cf0e2900ae38e0c3aea03ba1387c3e24e2fb9be4a270c56c10ae1e232e3c99693a6dcf42ad081b76332eb26ae54c0e6310d3ee3b8fe9984d01e16e164a54238a6aeb2da6ddc026c714060250a5809af40bac97b3ba26691692eeebea649a8dc4098b3000d30313419d216a6ce8ef42a0c6eddb86a38f0e876a3ae3c05be5880bc9fc049551fd41145ce5cca19442f868882618b519126d3d877f71bc73d11ada164ed941a12e8390f1d6a3c9a33f2618639e6e7423e5a64a458fbcd2f373f209769eae9082b9d7400" }, "mutations": [ { @@ -296,7 +296,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "a1f18c69cb0e4187daa25c76ffde09a9b7b50aa9837e7da8c0126564b4ed314f5275319e4b10e38f49d4def6ba1d3ebe8612b24c80c87653a61d865ec51bef28000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404000000000000020d40fed717097b9d86c50dda34e93ad87a18feb0dda1f9319da2be6b6fba54cfa878652001e53ca67b160bf22d8cda01b9d6194572559fc02d9be61d971382f101dcac52d8b7cb548c397209b31070975e3148b3f07ff51a224a309b32294354a7d5049d8ca494078d584c8e2594958eb907fd96754101aef484f4a948ec94495dbdadf0e21dfa033d089cf6ef845e380dad5f4d43e67d20274beecbe101a06dcecdd981bca3c60a419c9a3e65038e35d867c94418a2d02726400bfdf85a60c4d12fd18a045d5c105d5a9d0ae763d4670dceabb78d4dbe9b7fa3e2358b93b077ce20e741812595118ccc577ca3aa5574fdb77035563f6c05f5e3ec58be1df4b2a986a1c88a0fa7bc856cc67123d522f2d6429546daad6e31055cebe92ce5e64b04df3e716fb3935bbe157c069c0c4825e0bed1a8725851a11a17a14714e2f6d4c90e222fd1437b7eba9298729e3a1d30309723e23fcefd5a269247233683a21c6fc18b00345f64ec2acbc8dc34c26c2d22df36db765f2c585e92cbdd6d71a1d5ec079d12d12116ec8e2e041dc694eb1890dfa3c3e3837f42056c85758e2127206f1fcca42f071467a16607d828a2c0dba0761b070dc338cf5bc8280d325a601be890d915b6be3eca4dadcff6987a74dfea4281736fb33e66382a4194627fa5fc81f62d913afe249f7d2d4edbfade729ef836bffb5d2ed77b21aa65317f8c6139c0d48b806834c37acfc7982cf1a3ffe64cb760f3a11f0da7d9cd7ac8467a059026e50e493e5ce6082fed39e30ec148b716e636917fd198bf1e66d9ff519dc354eed5ec34f95989d8c87ef9028226367e8cca7e73bdec74db7a9b1bcb9125a2ea251a262fe539218a85ce98bdfc25cd53bdab604fc101320302ea28de49f5349b20790914ab23a85b80711b93a11047a72d928bb9c7115996d34f48c675ede140ca205038ca94beb9a007d746efb18bd39c55ec9b941aae1a692dabed2bc0e00572656fe76c2dc7adc1b62610dc3051c2e09a500fad71de3b5e31ac3e66d520c" + "value_hex": "690b8a6451662520e28970958acab35c83cda0de16a56fe048ebed9b7d2d350ff4b9de1598005f1712bd5c8175e563bfd19be1d3f0b7e5a904aefd631e6716230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000e0ff1d1c033dcbbb5683dbea42f2ee333536a6755dc0e9e5be5d1abd6a9976316acd2803e91ce5ff3ff25181ef5c6d4db8e5de111ea6f2bfcaa3d3dcd9e2984c8a51d9cddde07da17f5c2e617cf579d5e88e7fd62109efa12b4dec7f0ab57a15de79995fc21e8a9303a5f3fa419396aa8413068197ca38b9f93200970a5c9173fd0767eebe81737351c9050492c87daf5854a009afb60c21c39f10bd3ad16d06601fe123286aaa623c0e7cfa2d16c5d33a9f00d0ef868b221aa4da18f6492a0c0178afd9a49cc986302ca7b67acec6d225bb8f1775537080e457eb1d4ef97d0b80de9c09de0f015905ad9f6d847f060093ebd24a0f3f34eac52ae11d9253be4770a6a5a514faef6bbefe4f0ccdfa22df307a552bd68bdd245b21e250e3a4f9139e96edffd52d28227eae0b329612a39b49ec3f34246f2d37b7ea49d22011414dd007687b681b1131c8a7b7b32ed283493261c1b87ec7ba94d5bb506ee78e774a1c9590f6296b2b3739d237c960231c501ede4ba2f7d1005d5fb497d99e17cf57dc65b9db9e6edae590148c780a458f3641f6d6114aa38bf7835029418e79dd32dad442a141b9b67d2f19a89c3523317a730887c9f2871fac8a732f25b5ca2753185c3e7ff4354c4b203bb25fdd8945b38447b3cbee082308c8fb35c5c5367d3e66e59490805b65ff644f4830628e4a66ebd5f09648917bf1b7c960df6cbf375f62f6e5f1b0c3fd89a6de40f35f7e4cdbe7a51bdf46d4d58cf0e2900ae38e0c3aea03ba1387c3e24e2fb9be4a270c56c10ae1e232e3c99693a6dcf42ad081b76332eb26ae54c0e6310d3ee3b8fe9984d01e16e164a54238a6aeb2da6ddc026c714060250a5809af40bac97b3ba26691692eeebea649a8dc4098b3000d30313419d216a6ce8ef42a0c6eddb86a38f0e876a3ae3c05be5880bc9fc049551fd41145ce5cca19442f868882618b519126d3d877f71bc73d11ada164ed941a12e8390f1d6a3c9a33f2618639e6e7423e5a64a458fbcd2f373f209769eae9082b9d7400" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -306,7 +306,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "a0f18c69cb0e4187daa25c76ffde09a9b7b50aa9837e7da8c0126564b4ed314f5275319e4b10e38f49d4def6ba1d3ebe8612b24c80c87653a61d865ec51bef28000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404000000000000020d40fed717097b9d86c50dda34e93ad87a18feb0dda1f9319da2be6b6fba54cfa878652001e53ca67b160bf22d8cda01b9d6194572559fc02d9be61d971382f101dcac52d8b7cb548c397209b31070975e3148b3f07ff51a224a309b32294354a7d5049d8ca494078d584c8e2594958eb907fd96754101aef484f4a948ec94495dbdadf0e21dfa033d089cf6ef845e380dad5f4d43e67d20274beecbe101a06dcecdd981bca3c60a419c9a3e65038e35d867c94418a2d02726400bfdf85a60c4d12fd18a045d5c105d5a9d0ae763d4670dceabb78d4dbe9b7fa3e2358b93b077ce20e741812595118ccc577ca3aa5574fdb77035563f6c05f5e3ec58be1df4b2a986a1c88a0fa7bc856cc67123d522f2d6429546daad6e31055cebe92ce5e64b04df3e716fb3935bbe157c069c0c4825e0bed1a8725851a11a17a14714e2f6d4c90e222fd1437b7eba9298729e3a1d30309723e23fcefd5a269247233683a21c6fc18b00345f64ec2acbc8dc34c26c2d22df36db765f2c585e92cbdd6d71a1d5ec079d12d12116ec8e2e041dc694eb1890dfa3c3e3837f42056c85758e2127206f1fcca42f071467a16607d828a2c0dba0761b070dc338cf5bc8280d325a601be890d915b6be3eca4dadcff6987a74dfea4281736fb33e66382a4194627fa5fc81f62d913afe249f7d2d4edbfade729ef836bffb5d2ed77b21aa65317f8c6139c0d48b806834c37acfc7982cf1a3ffe64cb760f3a11f0da7d9cd7ac8467a059026e50e493e5ce6082fed39e30ec148b716e636917fd198bf1e66d9ff519dc354eed5ec34f95989d8c87ef9028226367e8cca7e73bdec74db7a9b1bcb9125a2ea251a262fe539218a85ce98bdfc25cd53bdab604fc101320302ea28de49f5349b20790914ab23a85b80711b93a11047a72d928bb9c7115996d34f48c675ede140ca205038ca94beb9a007d746efb18bd39c55ec9b941aae1a692dabed2bc0e00572656fe76c2dc7adc1b62610dc3051c2e09a500fad71de3b5e31ac3e66d" + "value_hex": "680b8a6451662520e28970958acab35c83cda0de16a56fe048ebed9b7d2d350ff4b9de1598005f1712bd5c8175e563bfd19be1d3f0b7e5a904aefd631e6716230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000e0ff1d1c033dcbbb5683dbea42f2ee333536a6755dc0e9e5be5d1abd6a9976316acd2803e91ce5ff3ff25181ef5c6d4db8e5de111ea6f2bfcaa3d3dcd9e2984c8a51d9cddde07da17f5c2e617cf579d5e88e7fd62109efa12b4dec7f0ab57a15de79995fc21e8a9303a5f3fa419396aa8413068197ca38b9f93200970a5c9173fd0767eebe81737351c9050492c87daf5854a009afb60c21c39f10bd3ad16d06601fe123286aaa623c0e7cfa2d16c5d33a9f00d0ef868b221aa4da18f6492a0c0178afd9a49cc986302ca7b67acec6d225bb8f1775537080e457eb1d4ef97d0b80de9c09de0f015905ad9f6d847f060093ebd24a0f3f34eac52ae11d9253be4770a6a5a514faef6bbefe4f0ccdfa22df307a552bd68bdd245b21e250e3a4f9139e96edffd52d28227eae0b329612a39b49ec3f34246f2d37b7ea49d22011414dd007687b681b1131c8a7b7b32ed283493261c1b87ec7ba94d5bb506ee78e774a1c9590f6296b2b3739d237c960231c501ede4ba2f7d1005d5fb497d99e17cf57dc65b9db9e6edae590148c780a458f3641f6d6114aa38bf7835029418e79dd32dad442a141b9b67d2f19a89c3523317a730887c9f2871fac8a732f25b5ca2753185c3e7ff4354c4b203bb25fdd8945b38447b3cbee082308c8fb35c5c5367d3e66e59490805b65ff644f4830628e4a66ebd5f09648917bf1b7c960df6cbf375f62f6e5f1b0c3fd89a6de40f35f7e4cdbe7a51bdf46d4d58cf0e2900ae38e0c3aea03ba1387c3e24e2fb9be4a270c56c10ae1e232e3c99693a6dcf42ad081b76332eb26ae54c0e6310d3ee3b8fe9984d01e16e164a54238a6aeb2da6ddc026c714060250a5809af40bac97b3ba26691692eeebea649a8dc4098b3000d30313419d216a6ce8ef42a0c6eddb86a38f0e876a3ae3c05be5880bc9fc049551fd41145ce5cca19442f868882618b519126d3d877f71bc73d11ada164ed941a12e8390f1d6a3c9a33f2618639e6e7423e5a64a458fbcd2f373f209769eae9082b9d" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -326,7 +326,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "a0f18c69cb0e4187daa25c76ffde09a9b7b50aa9837e7da8c0126564b4ed314f5275319e4b10e38f49d4def6ba1d3ebe8612b24c80c87653a61d865ec51bef28000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404000000000000020d40fed717097b9d86c50dda34e93ad87a18feb0dda1f9319da2be6b6fba54cfa878652001e53ca67b160bf22d8cda01b9d6194572559fc02d9be61d971382f101dcac52d8b7cb548c397209b31070975e3148b3f07ff51a224a309b32294354a7d5049d8ca494078d584c8e2594958eb907fd96754101aef484f4a948ec94495dbdadf0e21dfa033d089cf6ef845e380dad5f4d43e67d20274beecbe101a06dcecdd981bca3c60a419c9a3e65038e35d867c94418a2d02726400bfdf85a60c4d12fd18a045d5c105d5a9d0ae763d4670dceabb78d4dbe9b7fa3e2358b93b077ce20e741812595118ccc577ca3aa5574fdb77035563f6c05f5e3ec58be1df4b2a986a1c88a0fa7bc856cc67123d522f2d6429546daad6e31055cebe92ce5e64b04df3e716fb3935bbe157c069c0c4825e0bed1a8725851a11a17a14714e2f6d4c90e222fd1437b7eba9298729e3a1d30309723e23fcefd5a269247233683a21c6fc18b00345f64ec2acbc8dc34c26c2d22df36db765f2c585e92cbdd6d71a1d5ec079d12d12116ec8e2e041dc694eb1890dfa3c3e3837f42056c85758e2127206f1fcca42f071467a16607d828a2c0dba0761b070dc338cf5bc8280d325a601be890d915b6be3eca4dadcff6987a74dfea4281736fb33e66382a4194627fa5fc81f62d913afe249f7d2d4edbfade729ef836bffb5d2ed77b21aa65317f8c6139c0d48b806834c37acfc7982cf1a3ffe64cb760f3a11f0da7d9cd7ac8467a059026e50e493e5ce6082fed39e30ec148b716e636917fd198bf1e66d9ff519dc354eed5ec34f95989d8c87ef9028226367e8cca7e73bdec74db7a9b1bcb9125a2ea251a262fe539218a85ce98bdfc25cd53bdab604fc101320302ea28de49f5349b20790914ab23a85b80711b93a11047a72d928bb9c7115996d34f48c675ede140ca205038ca94beb9a007d746efb18bd39c55ec9b941aae1a692dabed2bc0e00572656fe76c2dc7adc1b62610dc3051c2e09a500fad71de3b5e31ac3e66d520d" + "value_hex": "680b8a6451662520e28970958acab35c83cda0de16a56fe048ebed9b7d2d350ff4b9de1598005f1712bd5c8175e563bfd19be1d3f0b7e5a904aefd631e6716230000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000e0ff1d1c033dcbbb5683dbea42f2ee333536a6755dc0e9e5be5d1abd6a9976316acd2803e91ce5ff3ff25181ef5c6d4db8e5de111ea6f2bfcaa3d3dcd9e2984c8a51d9cddde07da17f5c2e617cf579d5e88e7fd62109efa12b4dec7f0ab57a15de79995fc21e8a9303a5f3fa419396aa8413068197ca38b9f93200970a5c9173fd0767eebe81737351c9050492c87daf5854a009afb60c21c39f10bd3ad16d06601fe123286aaa623c0e7cfa2d16c5d33a9f00d0ef868b221aa4da18f6492a0c0178afd9a49cc986302ca7b67acec6d225bb8f1775537080e457eb1d4ef97d0b80de9c09de0f015905ad9f6d847f060093ebd24a0f3f34eac52ae11d9253be4770a6a5a514faef6bbefe4f0ccdfa22df307a552bd68bdd245b21e250e3a4f9139e96edffd52d28227eae0b329612a39b49ec3f34246f2d37b7ea49d22011414dd007687b681b1131c8a7b7b32ed283493261c1b87ec7ba94d5bb506ee78e774a1c9590f6296b2b3739d237c960231c501ede4ba2f7d1005d5fb497d99e17cf57dc65b9db9e6edae590148c780a458f3641f6d6114aa38bf7835029418e79dd32dad442a141b9b67d2f19a89c3523317a730887c9f2871fac8a732f25b5ca2753185c3e7ff4354c4b203bb25fdd8945b38447b3cbee082308c8fb35c5c5367d3e66e59490805b65ff644f4830628e4a66ebd5f09648917bf1b7c960df6cbf375f62f6e5f1b0c3fd89a6de40f35f7e4cdbe7a51bdf46d4d58cf0e2900ae38e0c3aea03ba1387c3e24e2fb9be4a270c56c10ae1e232e3c99693a6dcf42ad081b76332eb26ae54c0e6310d3ee3b8fe9984d01e16e164a54238a6aeb2da6ddc026c714060250a5809af40bac97b3ba26691692eeebea649a8dc4098b3000d30313419d216a6ce8ef42a0c6eddb86a38f0e876a3ae3c05be5880bc9fc049551fd41145ce5cca19442f868882618b519126d3d877f71bc73d11ada164ed941a12e8390f1d6a3c9a33f2618639e6e7423e5a64a458fbcd2f373f209769eae9082b9d7401" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -338,15 +338,15 @@ "family": "transfer_composite", "expected_valid": true, "payload": { - "equality_proof_data_hex": "ccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c240fbf582f058b6f65c20fd91705d1ab420ede8aef1386885443260bb932570244a14962c8b9a3b7abde4d5a9b9055691c29c300bd07b4ccbf282d7541613300a0f18c69cb0e4187daa25c76ffde09a9b7b50aa9837e7da8c0126564b4ed314fce8812b4819919cded524a4ea5ca39c39ac900d633828ae3367112a735b75657f85d10244d06d82abba3cf607cc30a54cf2be89efa205a51b86818167f5f0d0622a19e1ba98e1304e880de4232b305be89b0a3212aebd6a3cb0b0658dd3e0405361e4c69bbe5b2cc6fc21831ae794d58574759b1d4cb64f99be3031e5e48ae0654d889ff612d4c22f59d9fb715ca8e719cebedd3bc6f2ad4f1a837d031859d03d3d8e05887a7759c9834690ad367e0298dea0746bdd9d8d80af0f8e1ddbeac07", - "range_proof_data_hex": "a0f18c69cb0e4187daa25c76ffde09a9b7b50aa9837e7da8c0126564b4ed314f5275319e4b10e38f49d4def6ba1d3ebe8612b24c80c87653a61d865ec51bef28000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404000000000000020d40fed717097b9d86c50dda34e93ad87a18feb0dda1f9319da2be6b6fba54cfa878652001e53ca67b160bf22d8cda01b9d6194572559fc02d9be61d971382f101dcac52d8b7cb548c397209b31070975e3148b3f07ff51a224a309b32294354a7d5049d8ca494078d584c8e2594958eb907fd96754101aef484f4a948ec94495dbdadf0e21dfa033d089cf6ef845e380dad5f4d43e67d20274beecbe101a06dcecdd981bca3c60a419c9a3e65038e35d867c94418a2d02726400bfdf85a60c4d12fd18a045d5c105d5a9d0ae763d4670dceabb78d4dbe9b7fa3e2358b93b077ce20e741812595118ccc577ca3aa5574fdb77035563f6c05f5e3ec58be1df4b2a986a1c88a0fa7bc856cc67123d522f2d6429546daad6e31055cebe92ce5e64b04df3e716fb3935bbe157c069c0c4825e0bed1a8725851a11a17a14714e2f6d4c90e222fd1437b7eba9298729e3a1d30309723e23fcefd5a269247233683a21c6fc18b00345f64ec2acbc8dc34c26c2d22df36db765f2c585e92cbdd6d71a1d5ec079d12d12116ec8e2e041dc694eb1890dfa3c3e3837f42056c85758e2127206f1fcca42f071467a16607d828a2c0dba0761b070dc338cf5bc8280d325a601be890d915b6be3eca4dadcff6987a74dfea4281736fb33e66382a4194627fa5fc81f62d913afe249f7d2d4edbfade729ef836bffb5d2ed77b21aa65317f8c6139c0d48b806834c37acfc7982cf1a3ffe64cb760f3a11f0da7d9cd7ac8467a059026e50e493e5ce6082fed39e30ec148b716e636917fd198bf1e66d9ff519dc354eed5ec34f95989d8c87ef9028226367e8cca7e73bdec74db7a9b1bcb9125a2ea251a262fe539218a85ce98bdfc25cd53bdab604fc101320302ea28de49f5349b20790914ab23a85b80711b93a11047a72d928bb9c7115996d34f48c675ede140ca205038ca94beb9a007d746efb18bd39c55ec9b941aae1a692dabed2bc0e00572656fe76c2dc7adc1b62610dc3051c2e09a500fad71de3b5e31ac3e66d520c", - "validity_proof_data_hex": "ccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d5275319e4b10e38f49d4def6ba1d3ebe8612b24c80c87653a61d865ec51bef288a6cacff5aff7e2740d4df71f9a17fa3470632c2fcd5541737572a33dcc88f74284a741e476c791ae088fe75b29088e3d5ac2b93cea1ca2ba1639ecbf60f814d5c909af844b3d08cdeb8e8bf52ebf5e9139f81989560a79645f668d02cdf7452e6fb3eade0eb0bb21de06712827e8203de7e02b1b60fb068ae8a8f5101f4381984546006c9c6f023899e5d40581e01ed3ede8c72c6ec98e859b42c4a124fd24d2817815cb6dd36e967029164e5bd96ceb03699749d7c65d01394189a416294649e3d31b861e15d4610b0907dfd65f8030d48ca0459bc9d0701806b345c765b5178bb9bbb420226337190a2db284f78a3d0b4aad459307ec6dc7e3c2c3fdd5c54cffdd1d8a0526002f97dc0516e6408162adf46d89476bbfacec4f897cacedd0b208f8d22a4c1a03c27e1841106fedf1222541944bbdd562fc33bb8521bde380f" + "equality_proof_data_hex": "d8454b4846ab296d15cf9a676c1d49febc2c67a7dff36271b1b43dff6d654915aebc2d9f9435592e6eb3e46cdef1d367009fb9670d0dffe87477d8136a618460e2d010ad3d1a074107a00f54bc7efcadb083655440afa60274b9444c43809a49329893ae7bf1c34187baf748da94d533ac7570353cca06ffec90c7073e1c65485e6015154279534af9e0d895a4a88b758eb440a89fce039169d59c67ac07336dd6128e2229ec5174b3618e6c7d0df1a4bb4151c65249b0a351e6bb278ccb6200c6b6cb03ab7517a54d18f3a72289170c6f5b880f92c8c65c21f61cf44ec60b5d8993256d08c4642b5a5fce621781fde7d80dfe73e1251cb491ea77ff0050fa06343b9afad21224d3bbe1eff33566f5a981bfda2857e3af5ef503858c5ba2fb065c8caa52be73abf4f5059dd1630634d034af8b1c3881c6c4410e3cf502fcac07", + "range_proof_data_hex": "329893ae7bf1c34187baf748da94d533ac7570353cca06ffec90c7073e1c6548ba2d497ad5cf5a612d5ae8f38dd3ca36b054ac7b480f540e884999d178587a7f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000b0f188ef3776b1bc8bfa886094f2ad331c4150ec07dbc97583933b79f273073d9c3684bbd7b3f908d110bb187acf0b7ac97295c63e3ed6ebd215b2823c8c5d42fc40223d6eb5c75a939a77389b07123f6bd11f76cb0b52142c3949573e09ca40f8f0732f1ab323c80288458ff9b82b7ac0d80f5355119296f70c11697d50a162572b867089ab5d89eba815090012565fbe49c93182b9638d49945ce3e8e7d70ebc6eaa0bacd058f451b63998eb87b3c053234417cfc28af7b3d30d917a9ae100ae05d071871ddb79c8dd9c99a9e64dabced812f40334ee769525573afce87f0812c1015659580775376501f22fea53ae3e701805aab7c05f9648a9809fb16d56520cf79ef39748cc28b0235fbd11a5c320d99d5db3a1f9a20874aaf660cd8f24f2804ecae8b53eef0a67b6bb3da6ac7f7291e5cb3c5a38c22bf2a012df1003640a02bed5b62db73a716a2c79cccb5b4f8862a6a5792ccc6305dfd99da999ba6558bc9060049d946506d038c2c5a2cee11cd658c32551a72c0da828f852f37b40126093602dbf3518ccb53186baad83610817379ffad24e978ad2cb24cc6f0714aa401b8b923c222585a651eebcdc56afe3ca6133bd597a48d537e5b037cf7d33bc6d30817c00b9cc98c3d4638fefe8455d61ca238f7773106cb7d55c87394e03e8414cb7d98bfb2ffd5b982ffb1e28886f8c755f89197766ef97dd855212171a6acc940649e8dc84369f66f5aa2bb44120ca46f73fc1903a4b02d3fb99f32e2810c3bdcfe0e5ee151369271726aad9fcd59ca3b8f0dc9096a68a5a3f41233a159ea68b992575218205ac7974508ac132d571b8291010cc60f246b607752fad6c342b7c2c6c9b50275b6ad662d1f8fa2de163d96ad30f926d9493d4fc6545fb441c0aa517fc533b360565cb6ebec6f1b7d066b702a9e7c2da54039e10a5dd6c4c70cb274bd375323c12283eb6bfa0bf7f2175ea0c2e0f7d1f1a85c3bc5e4a0509550dcc883950ab773340af05d10df80ffa8abd9235f2e0ddc38c4df93e21200f", + "validity_proof_data_hex": "d8454b4846ab296d15cf9a676c1d49febc2c67a7dff36271b1b43dff6d654915fc2feed40d061ed35d415b503503273e201d99441a470b43c64e64870c6bb02eba2d497ad5cf5a612d5ae8f38dd3ca36b054ac7b480f540e884999d178587a7fb08beece7fc4704cc6af41f6e5ca7befbf77eb85743d5563c413304f25f84d3f06b2ff5f4253732c1154cc648d34d76459d8ad671630af7bb48d2c0469c2e14ec6c8c9a9e18107ea3812f8158d434185a7214a45d26fa40ef96aeb065ae3a86b90e8c63fc4876bfcf58245184f7caff956c588ebd090fe29918381b9e16d3f260c609502580a6493ddb7ac191adfbf9a315a690b6a994c541790c6cbb134a35b742aaf0ea5ebc617978fff89d455045348d6aed6001d82cf1cad78a89fb89b54989b1b734127719d084aa4d9734a1ed82d483c317f170ff856de118a5c599a0b90109d47d45c78abe6abde6f47cbaa3685082b51daa114e40c623e9affd7d0559b3c45400e60ff8ed29afff2fd5f40fc7ecc0f8da9f823215d2a983b96a5c1000e9a289d50147cd2f7a8526bb375626bef09f34146bd21bd1b848ed511be9a0c" }, "binding": { - "current_balance_commitment_hex": "04e54a371e512b55c5b1b79e48b46cb1cec3810ba62bee392a2ea228fd3ae443", - "current_balance_handle_hex": "aa1090265370114fd841117fcc89e2c31746d923da0ccef0025940c751147113", - "recipient_pubkey_hex": "9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d", - "sender_pubkey_hex": "ccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c" + "current_balance_commitment_hex": "5e3fae2a754ee502135ba2ceba35413e6510b57ee1a85de8671fe961801b5353", + "current_balance_handle_hex": "3845197179ec7346128695f8144390b476b653a6044ee05720bdf673c74ed278", + "recipient_pubkey_hex": "fc2feed40d061ed35d415b503503273e201d99441a470b43c64e64870c6bb02e", + "sender_pubkey_hex": "d8454b4846ab296d15cf9a676c1d49febc2c67a7dff36271b1b43dff6d654915" }, "mutations": [ { @@ -364,7 +364,7 @@ "op": "bitflip", "target": "binding.sender_pubkey_hex", "params": { - "value_hex": "cdab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c" + "value_hex": "d9454b4846ab296d15cf9a676c1d49febc2c67a7dff36271b1b43dff6d654915" }, "expected_valid": false, "expected_error_contains": "failed" @@ -374,7 +374,7 @@ "op": "bitflip", "target": "binding.recipient_pubkey_hex", "params": { - "value_hex": "9b8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d" + "value_hex": "fd2feed40d061ed35d415b503503273e201d99441a470b43c64e64870c6bb02e" }, "expected_valid": false, "expected_error_contains": "failed" @@ -394,7 +394,7 @@ "op": "truncate", "target": "payload.range_proof_data_hex", "params": { - "value_hex": "a0f18c69cb0e4187daa25c76ffde09a9b7b50aa9837e7da8c0126564b4ed314f5275319e4b10e38f49d4def6ba1d3ebe8612b24c80c87653a61d865ec51bef28000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404000000000000020d40fed717097b9d86c50dda34e93ad87a18feb0dda1f9319da2be6b6fba54cfa878652001e53ca67b160bf22d8cda01b9d6194572559fc02d9be61d971382f101dcac52d8b7cb548c397209b31070975e3148b3f07ff51a224a309b32294354a7d5049d8ca494078d584c8e2594958eb907fd96754101aef484f4a948ec94495dbdadf0e21dfa033d089cf6ef845e380dad5f4d43e67d20274beecbe101a06dcecdd981bca3c60a419c9a3e65038e35d867c94418a2d02726400bfdf85a60c4d12fd18a045d5c105d5a9d0ae763d4670dceabb78d4dbe9b7fa3e2358b93b077ce20e741812595118ccc577ca3aa5574fdb77035563f6c05f5e3ec58be1df4b2a986a1c88a0fa7bc856cc67123d522f2d6429546daad6e31055cebe92ce5e64b04df3e716fb3935bbe157c069c0c4825e0bed1a8725851a11a17a14714e2f6d4c90e222fd1437b7eba9298729e3a1d30309723e23fcefd5a269247233683a21c6fc18b00345f64ec2acbc8dc34c26c2d22df36db765f2c585e92cbdd6d71a1d5ec079d12d12116ec8e2e041dc694eb1890dfa3c3e3837f42056c85758e2127206f1fcca42f071467a16607d828a2c0dba0761b070dc338cf5bc8280d325a601be890d915b6be3eca4dadcff6987a74dfea4281736fb33e66382a4194627fa5fc81f62d913afe249f7d2d4edbfade729ef836bffb5d2ed77b21aa65317f8c6139c0d48b806834c37acfc7982cf1a3ffe64cb760f3a11f0da7d9cd7ac8467a059026e50e493e5ce6082fed39e30ec148b716e636917fd198bf1e66d9ff519dc354eed5ec34f95989d8c87ef9028226367e8cca7e73bdec74db7a9b1bcb9125a2ea251a262fe539218a85ce98bdfc25cd53bdab604fc101320302ea28de49f5349b20790914ab23a85b80711b93a11047a72d928bb9c7115996d34f48c675ede140ca205038ca94beb9a007d746efb18bd39c55ec9b941aae1a692dabed2bc0e00572656fe76c2dc7adc1b62610dc3051c2e09a500fad71de3b5e31ac3e66d" + "value_hex": "329893ae7bf1c34187baf748da94d533ac7570353cca06ffec90c7073e1c6548ba2d497ad5cf5a612d5ae8f38dd3ca36b054ac7b480f540e884999d178587a7f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000b0f188ef3776b1bc8bfa886094f2ad331c4150ec07dbc97583933b79f273073d9c3684bbd7b3f908d110bb187acf0b7ac97295c63e3ed6ebd215b2823c8c5d42fc40223d6eb5c75a939a77389b07123f6bd11f76cb0b52142c3949573e09ca40f8f0732f1ab323c80288458ff9b82b7ac0d80f5355119296f70c11697d50a162572b867089ab5d89eba815090012565fbe49c93182b9638d49945ce3e8e7d70ebc6eaa0bacd058f451b63998eb87b3c053234417cfc28af7b3d30d917a9ae100ae05d071871ddb79c8dd9c99a9e64dabced812f40334ee769525573afce87f0812c1015659580775376501f22fea53ae3e701805aab7c05f9648a9809fb16d56520cf79ef39748cc28b0235fbd11a5c320d99d5db3a1f9a20874aaf660cd8f24f2804ecae8b53eef0a67b6bb3da6ac7f7291e5cb3c5a38c22bf2a012df1003640a02bed5b62db73a716a2c79cccb5b4f8862a6a5792ccc6305dfd99da999ba6558bc9060049d946506d038c2c5a2cee11cd658c32551a72c0da828f852f37b40126093602dbf3518ccb53186baad83610817379ffad24e978ad2cb24cc6f0714aa401b8b923c222585a651eebcdc56afe3ca6133bd597a48d537e5b037cf7d33bc6d30817c00b9cc98c3d4638fefe8455d61ca238f7773106cb7d55c87394e03e8414cb7d98bfb2ffd5b982ffb1e28886f8c755f89197766ef97dd855212171a6acc940649e8dc84369f66f5aa2bb44120ca46f73fc1903a4b02d3fb99f32e2810c3bdcfe0e5ee151369271726aad9fcd59ca3b8f0dc9096a68a5a3f41233a159ea68b992575218205ac7974508ac132d571b8291010cc60f246b607752fad6c342b7c2c6c9b50275b6ad662d1f8fa2de163d96ad30f926d9493d4fc6545fb441c0aa517fc533b360565cb6ebec6f1b7d066b702a9e7c2da54039e10a5dd6c4c70cb274bd375323c12283eb6bfa0bf7f2175ea0c2e0f7d1f1a85c3bc5e4a0509550dcc883950ab773340af05d10df80ffa8abd9235f2e0ddc38c4df93e21" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -406,7 +406,7 @@ "family": "equality", "expected_valid": true, "payload": { - "proof_data_hex": "9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d54d45a813c57eb36ce6f624bec32a33260941f2c154732bf73627bf2c1051f23228346c3c56c2c73c96c2e77c00957cf6d64879363e53cb53a1b7cacecf77318e2d1d2f655c55c71a98053558f178da1bd3f295224e99fe427622bbd3122696cae5422445ac7da4d245a0c01f5243d8aa1b34d8d9dc44a27c57bfcd30d89b925102f54bd4536ed6022ea188e5d777aef807e22908d56ac6495c13fd2761efa0024a685e99b776e94af0afe360f91c4131f05a09559103854d7697d3ca0a29331ebc27771ce873b9bad3296525a457af7adbd73a5d3876ee991bccd6febc0c60ecbde414296cd49fb1d2512e6b4c918666cdb9ff9855fc922a00933acc027590ca67334a122fce4a20fa0e06a607f6f1908b2d2d087f079558faec88ef92a5402" + "proof_data_hex": "fc2feed40d061ed35d415b503503273e201d99441a470b43c64e64870c6bb02e6af5f017018156c2816fc0749ee69cefb0ead6b403328f5fa38dec330ce7a16774541d5e65c25b942bc9398598af8fd51013226107581ea2a4b360d80f603e4cda7f189ae598fdf76881bb54acf84bab96a6f8477c97acae6986e817ff5b5e43147c13e9a5bf46d1bfdae5439205281791dfe2d04ebd63d39bcc643d048bd712d4f1e62ca772018c9e06598c865f53729d6810b2c94d44081e83710de7c36541f0e426f1d049c9d0c10116adfc53dee58023369e7c07d21b22d3389cba55c2077ead368925182535daa00080f404641fae291ae8b20f9eb6161ce7c13fd92d05a7fa78f980ea6599f7d472db0fd5411424d52a0b889446fd8cbc840fd66b5403d0bad8196aa5e38743c8184f8e4990e5de04c7552a71aece3527f1bdc1a6990d" }, "mutations": [ { @@ -414,7 +414,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "9b8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d54d45a813c57eb36ce6f624bec32a33260941f2c154732bf73627bf2c1051f23228346c3c56c2c73c96c2e77c00957cf6d64879363e53cb53a1b7cacecf77318e2d1d2f655c55c71a98053558f178da1bd3f295224e99fe427622bbd3122696cae5422445ac7da4d245a0c01f5243d8aa1b34d8d9dc44a27c57bfcd30d89b925102f54bd4536ed6022ea188e5d777aef807e22908d56ac6495c13fd2761efa0024a685e99b776e94af0afe360f91c4131f05a09559103854d7697d3ca0a29331ebc27771ce873b9bad3296525a457af7adbd73a5d3876ee991bccd6febc0c60ecbde414296cd49fb1d2512e6b4c918666cdb9ff9855fc922a00933acc027590ca67334a122fce4a20fa0e06a607f6f1908b2d2d087f079558faec88ef92a5402" + "value_hex": "fd2feed40d061ed35d415b503503273e201d99441a470b43c64e64870c6bb02e6af5f017018156c2816fc0749ee69cefb0ead6b403328f5fa38dec330ce7a16774541d5e65c25b942bc9398598af8fd51013226107581ea2a4b360d80f603e4cda7f189ae598fdf76881bb54acf84bab96a6f8477c97acae6986e817ff5b5e43147c13e9a5bf46d1bfdae5439205281791dfe2d04ebd63d39bcc643d048bd712d4f1e62ca772018c9e06598c865f53729d6810b2c94d44081e83710de7c36541f0e426f1d049c9d0c10116adfc53dee58023369e7c07d21b22d3389cba55c2077ead368925182535daa00080f404641fae291ae8b20f9eb6161ce7c13fd92d05a7fa78f980ea6599f7d472db0fd5411424d52a0b889446fd8cbc840fd66b5403d0bad8196aa5e38743c8184f8e4990e5de04c7552a71aece3527f1bdc1a6990d" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -424,7 +424,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d54d45a813c57eb36ce6f624bec32a33260941f2c154732bf73627bf2c1051f23228346c3c56c2c73c96c2e77c00957cf6d64879363e53cb53a1b7cacecf77318e2d1d2f655c55c71a98053558f178da1bd3f295224e99fe427622bbd3122696cae5422445ac7da4d245a0c01f5243d8aa1b34d8d9dc44a27c57bfcd30d89b925102f54bd4536ed6022ea188e5d777aef807e22908d56ac6495c13fd2761efa0024a685e99b776e94af0afe360f91c4131f05a09559103854d7697d3ca0a29331ebc27771ce873b9bad3296525a457af7adbd73a5d3876ee991bccd6febc0c60ecbde414296cd49fb1d2512e6b4c918666cdb9ff9855fc922a00933acc027590ca67334a122fce4a20fa0e06a607f6f1908b2d2d087f079558faec88ef92a" + "value_hex": "fc2feed40d061ed35d415b503503273e201d99441a470b43c64e64870c6bb02e6af5f017018156c2816fc0749ee69cefb0ead6b403328f5fa38dec330ce7a16774541d5e65c25b942bc9398598af8fd51013226107581ea2a4b360d80f603e4cda7f189ae598fdf76881bb54acf84bab96a6f8477c97acae6986e817ff5b5e43147c13e9a5bf46d1bfdae5439205281791dfe2d04ebd63d39bcc643d048bd712d4f1e62ca772018c9e06598c865f53729d6810b2c94d44081e83710de7c36541f0e426f1d049c9d0c10116adfc53dee58023369e7c07d21b22d3389cba55c2077ead368925182535daa00080f404641fae291ae8b20f9eb6161ce7c13fd92d05a7fa78f980ea6599f7d472db0fd5411424d52a0b889446fd8cbc840fd66b5403d0bad8196aa5e38743c8184f8e4990e5de04c7552a71aece3527f1bdc1a6" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -446,7 +446,7 @@ "family": "validity", "expected_valid": true, "payload": { - "proof_data_hex": "9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c2201ea7ec093a4a4b72267f737a93ccb67745975ce5970c0a56bb5c1e3797769ef67d82d0f687310b824dd854de4cc5db78f433cb1851a9292f35043cb2d6aeea13e604a19c5cbba67fa85352bf1a05c0f582c9f72d34606e8892245e390e050af2cba7dda34936875fde95d84909baa346fa6aea9901c1ae8c499f97b6ce0f5904dfa2f58e84be4d398579b13a3b588ec11236567d872d49de1ca2c63cae1b1670d3cd1b5b80c894792d7ec9c7851038dc75fe3ae10779f0fcd882b7ee02a69ba6a94dea3d472e41811210d5c9fc4e0dcc32ae226cf15befb372647423a26edb7498c83f9e20ac0f061f36d48696c4117c54d14621d76df51cd865b2efd4171ae6dec82b4dbe7fcb293efb79e73d0f5f089603c0ba035e3e89eabe7c43cadd8ed48592435fbaaba0e7f80093d08b28c4fe0339206ea0511c7fc3b9da6281d1834011a2eaecb844829c3ec410d7aded445a69521632373adeeaf08d994d771989a07" + "proof_data_hex": "fc2feed40d061ed35d415b503503273e201d99441a470b43c64e64870c6bb02e367592922b37fa321fc37bc38bf434685507162e731982c1b188fba562ae3472e6e7d267f4c23bb767b6dcef5b8b3be7957adadff5e500c922a0c06532c42761f8846ec4c06740d5b950e48137a2b284289cb81e441446c5d0e3db3e60e02f2fa08e7f21a00632af4f1b88ea4d2a91f984b9bffaa33baaf6bc2da3696f93c6704a9b80f9abeda6614a0a783155dd042b4a83776bc0a29d734108408b2f7d28139e35a2e3f9bc2588a1edbbbcb9403eac987caf251440e1e635819813c47a4424905582415f2f7196f1ebcea112819015b8956f5b177261dc176f2c233bc7147e4ee77ca4ce181e774b703a36361995bf4eaa2caf50ad80464b333fa89595da13a60c9ec26d283feffaecd974b8630df9b7eb777da72119ef7dd4941b756953740a4c6c6c54e0202d302014882d517ec6faab16bb73420eeca0637eb442c2bf0af4284b510c07309d94b130375178d2d875e37a3ab26f75da2f82e324009d9607ca756c28b91cbae0bd4cfc2792386ec28ce3cb1858c2f9e7541e1ec0f1424804" }, "mutations": [ { @@ -454,7 +454,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "9b8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c2201ea7ec093a4a4b72267f737a93ccb67745975ce5970c0a56bb5c1e3797769ef67d82d0f687310b824dd854de4cc5db78f433cb1851a9292f35043cb2d6aeea13e604a19c5cbba67fa85352bf1a05c0f582c9f72d34606e8892245e390e050af2cba7dda34936875fde95d84909baa346fa6aea9901c1ae8c499f97b6ce0f5904dfa2f58e84be4d398579b13a3b588ec11236567d872d49de1ca2c63cae1b1670d3cd1b5b80c894792d7ec9c7851038dc75fe3ae10779f0fcd882b7ee02a69ba6a94dea3d472e41811210d5c9fc4e0dcc32ae226cf15befb372647423a26edb7498c83f9e20ac0f061f36d48696c4117c54d14621d76df51cd865b2efd4171ae6dec82b4dbe7fcb293efb79e73d0f5f089603c0ba035e3e89eabe7c43cadd8ed48592435fbaaba0e7f80093d08b28c4fe0339206ea0511c7fc3b9da6281d1834011a2eaecb844829c3ec410d7aded445a69521632373adeeaf08d994d771989a07" + "value_hex": "fd2feed40d061ed35d415b503503273e201d99441a470b43c64e64870c6bb02e367592922b37fa321fc37bc38bf434685507162e731982c1b188fba562ae3472e6e7d267f4c23bb767b6dcef5b8b3be7957adadff5e500c922a0c06532c42761f8846ec4c06740d5b950e48137a2b284289cb81e441446c5d0e3db3e60e02f2fa08e7f21a00632af4f1b88ea4d2a91f984b9bffaa33baaf6bc2da3696f93c6704a9b80f9abeda6614a0a783155dd042b4a83776bc0a29d734108408b2f7d28139e35a2e3f9bc2588a1edbbbcb9403eac987caf251440e1e635819813c47a4424905582415f2f7196f1ebcea112819015b8956f5b177261dc176f2c233bc7147e4ee77ca4ce181e774b703a36361995bf4eaa2caf50ad80464b333fa89595da13a60c9ec26d283feffaecd974b8630df9b7eb777da72119ef7dd4941b756953740a4c6c6c54e0202d302014882d517ec6faab16bb73420eeca0637eb442c2bf0af4284b510c07309d94b130375178d2d875e37a3ab26f75da2f82e324009d9607ca756c28b91cbae0bd4cfc2792386ec28ce3cb1858c2f9e7541e1ec0f1424804" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -464,7 +464,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c2201ea7ec093a4a4b72267f737a93ccb67745975ce5970c0a56bb5c1e3797769ef67d82d0f687310b824dd854de4cc5db78f433cb1851a9292f35043cb2d6aeea13e604a19c5cbba67fa85352bf1a05c0f582c9f72d34606e8892245e390e050af2cba7dda34936875fde95d84909baa346fa6aea9901c1ae8c499f97b6ce0f5904dfa2f58e84be4d398579b13a3b588ec11236567d872d49de1ca2c63cae1b1670d3cd1b5b80c894792d7ec9c7851038dc75fe3ae10779f0fcd882b7ee02a69ba6a94dea3d472e41811210d5c9fc4e0dcc32ae226cf15befb372647423a26edb7498c83f9e20ac0f061f36d48696c4117c54d14621d76df51cd865b2efd4171ae6dec82b4dbe7fcb293efb79e73d0f5f089603c0ba035e3e89eabe7c43cadd8ed48592435fbaaba0e7f80093d08b28c4fe0339206ea0511c7fc3b9da6281d1834011a2eaecb844829c3ec410d7aded445a69521632373adeeaf08d994d77198" + "value_hex": "fc2feed40d061ed35d415b503503273e201d99441a470b43c64e64870c6bb02e367592922b37fa321fc37bc38bf434685507162e731982c1b188fba562ae3472e6e7d267f4c23bb767b6dcef5b8b3be7957adadff5e500c922a0c06532c42761f8846ec4c06740d5b950e48137a2b284289cb81e441446c5d0e3db3e60e02f2fa08e7f21a00632af4f1b88ea4d2a91f984b9bffaa33baaf6bc2da3696f93c6704a9b80f9abeda6614a0a783155dd042b4a83776bc0a29d734108408b2f7d28139e35a2e3f9bc2588a1edbbbcb9403eac987caf251440e1e635819813c47a4424905582415f2f7196f1ebcea112819015b8956f5b177261dc176f2c233bc7147e4ee77ca4ce181e774b703a36361995bf4eaa2caf50ad80464b333fa89595da13a60c9ec26d283feffaecd974b8630df9b7eb777da72119ef7dd4941b756953740a4c6c6c54e0202d302014882d517ec6faab16bb73420eeca0637eb442c2bf0af4284b510c07309d94b130375178d2d875e37a3ab26f75da2f82e324009d9607ca756c28b91cbae0bd4cfc2792386ec28ce3cb1858c2f9e7541e1ec0f142" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -486,7 +486,7 @@ "family": "transfer_range", "expected_valid": true, "payload": { - "proof_data_hex": "e2d1d2f655c55c71a98053558f178da1bd3f295224e99fe427622bbd3122696cea7ec093a4a4b72267f737a93ccb67745975ce5970c0a56bb5c1e3797769ef670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000364955db83e37d5696afaeed21e0c7ced9a951a78d0af7ad1468ee3654940d71527b0059940db9ed8ccf47e201dce6a8e04741246bef1d6490326cb9a62a0244e417bee2a407f3dcd1b05a1bfb390e6c8b368820b9b9903c6023d4bce36f1a3be8c972c16c2ac5fe8ce41fe5715fb9570d66de2ee127d14bf4db36708f917058bc3f387157d5f235d8dbe0a1efec6355366294dac73ea6b269ab0a1a26c84a055385649f0108409eaa6d7169db0a71540f998c4737b1f9796d46d7d0d6a75c0ab0a1b8609f7e61ee9be22f7f576117e506805efdff4eee6167d70f3d7c1518024272206754dcc2749e491fe10cd966301808949880e04960f3753c6e277632012ce51ac6d4b8bf5ee66ff08be9eef19cbdf978ffd9d4176ed15f88fdeae3f247321b373b63330a844fd640d007c1abd6e8012445fd4f21501817f3de863c414c9aecb76e2b8245fab58bad799b9f95534a3a6cfedef821e1cb4efed59f8b73504e561708968fa216039c712832211acd5b29f337bd85498d2b7ab6e94f28bf6ffc7a16e4480d90ae9ea7fb241172a44200895dfebf2e310c6c44bd2e3a52fd4e5cf3ec8671724b6e8fc7cc8c37985efa8b454fcf0392525736e8d32227c2e509864862dd40ac7a1ba06ff803d92854baf8392ef197e44d49b04b41b8ff35bf01708ea776a1bb42154ae9b6f961eec68c9eedd9453ab9a769b1165a20d9d54f1eaa8232394cb5c3ce19ab0c36bcb575ab1c178cbfa4a03e13ae0efa6271c9412e30861f247a317ceba38d03dd2ef1ca4ecc22662c0a2540a0dd5c8c6d4756e0524074183d9a8b478997004f3d656dcba9c070559404eccd60e60b731f31f4a31b002f5545f1d7b858c0a9e4010ccb77c0d703b957ae8096fe6aae1a75d81961020ec022e16f143be85fe24309641d038f0cb2f65c7d4a9403269f261ef276f136a44e57d6055c30aba527a361bf3d6d82065f1b4772121b7276888bad201de200a7f13d698df04f400abc40eee9f7ab812679000b96dc125ae977092670877a0e" + "proof_data_hex": "da7f189ae598fdf76881bb54acf84bab96a6f8477c97acae6986e817ff5b5e43e6e7d267f4c23bb767b6dcef5b8b3be7957adadff5e500c922a0c06532c427610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000fc82559e9ac85dfe85d556307b681a4d3111d2d4d2b2c8334ceea86b2ded4f4aa4560c5d92611c1642bdd5ffa0ced8ed7a79adaba0179b28711743fde9490b6d2426de2afc59ae698866793965cb9a47b27158216562290fedbdbb9683597539daa2a1a8f2438fc7f846279ebcfb3ba2a6f1d7e4c16b2431893b49e9f50703445b3ab4944f1c712a1b6ac1b4107d4468ba2893d9e581e30d74c527a5f3599a05f47b1de79f1539bc381705d7dba8d1af07091518412e3c3056871be7a8a2e6029aa100627ac523df29ebaa62ff2455cfa38dd77731e43270485e6d1cd1954b06ae2fe7fd593d32bc065e29e3bf7547c36949da66c53f0f66bfa4b873714a146bcc4f782eb2bd9532fa7dd7ca5dbf1894be1904047b045ed15bde5b4ca26aee1596dcaa3f2f559d9a486c8cf85f29fb58f36b78d2c1eb71df9927205ccc9cfd4df6eb60c9058fe1c4d837b11013f50512583d3d6bdf6a53a9dcd4aa09f56db475fa650bd81198abd702aa981d2754055bc2dcb23f8022d4c9219441ee7155240036d32d32f8839c7c3fa94c717009ec5ed28078ebb2a3a9288a1861576702e80798d15c316ff73049cc50b6521e1547510c84a8386d37d4e135edb813ea81e80d9c0c203a40506ff5e5cde94e158426f84d18d3536154c9b9d19c16137bb5213bf4c9651f078a31ef5045b5086e73fc760e7532fe01a25eebe03d6e7fffa1832fa4ad2028569620f35abfd0a4d74d4e4ddad9bbaa97bca61b3fa7c4c2fcd2261a601fff87acce8f388e717c376a76c0ccf86bc16d705a4ef2a3835c39f8310b00fe2cb9788d9211deb1732be7fca35b29e63818597bfd8ee2ee72c9eddd989a3afea43407760507bddb38d2af8e70170d6b2b2cd1768716cfdc52879272e64d071e9353fcb174ce510523263ffbeb2d2a3f33210d6804708197a9891957e46e755614ee807185ee3ca9edac678b38d04514c16259c7c325811f7c6c7addf57f081a3b3cc2d6dee823947f0a7fe94cf093a653510be4e6d948693c8b3c02d20e0f" }, "mutations": [ { @@ -494,7 +494,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "e3d1d2f655c55c71a98053558f178da1bd3f295224e99fe427622bbd3122696cea7ec093a4a4b72267f737a93ccb67745975ce5970c0a56bb5c1e3797769ef670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000364955db83e37d5696afaeed21e0c7ced9a951a78d0af7ad1468ee3654940d71527b0059940db9ed8ccf47e201dce6a8e04741246bef1d6490326cb9a62a0244e417bee2a407f3dcd1b05a1bfb390e6c8b368820b9b9903c6023d4bce36f1a3be8c972c16c2ac5fe8ce41fe5715fb9570d66de2ee127d14bf4db36708f917058bc3f387157d5f235d8dbe0a1efec6355366294dac73ea6b269ab0a1a26c84a055385649f0108409eaa6d7169db0a71540f998c4737b1f9796d46d7d0d6a75c0ab0a1b8609f7e61ee9be22f7f576117e506805efdff4eee6167d70f3d7c1518024272206754dcc2749e491fe10cd966301808949880e04960f3753c6e277632012ce51ac6d4b8bf5ee66ff08be9eef19cbdf978ffd9d4176ed15f88fdeae3f247321b373b63330a844fd640d007c1abd6e8012445fd4f21501817f3de863c414c9aecb76e2b8245fab58bad799b9f95534a3a6cfedef821e1cb4efed59f8b73504e561708968fa216039c712832211acd5b29f337bd85498d2b7ab6e94f28bf6ffc7a16e4480d90ae9ea7fb241172a44200895dfebf2e310c6c44bd2e3a52fd4e5cf3ec8671724b6e8fc7cc8c37985efa8b454fcf0392525736e8d32227c2e509864862dd40ac7a1ba06ff803d92854baf8392ef197e44d49b04b41b8ff35bf01708ea776a1bb42154ae9b6f961eec68c9eedd9453ab9a769b1165a20d9d54f1eaa8232394cb5c3ce19ab0c36bcb575ab1c178cbfa4a03e13ae0efa6271c9412e30861f247a317ceba38d03dd2ef1ca4ecc22662c0a2540a0dd5c8c6d4756e0524074183d9a8b478997004f3d656dcba9c070559404eccd60e60b731f31f4a31b002f5545f1d7b858c0a9e4010ccb77c0d703b957ae8096fe6aae1a75d81961020ec022e16f143be85fe24309641d038f0cb2f65c7d4a9403269f261ef276f136a44e57d6055c30aba527a361bf3d6d82065f1b4772121b7276888bad201de200a7f13d698df04f400abc40eee9f7ab812679000b96dc125ae977092670877a0e" + "value_hex": "db7f189ae598fdf76881bb54acf84bab96a6f8477c97acae6986e817ff5b5e43e6e7d267f4c23bb767b6dcef5b8b3be7957adadff5e500c922a0c06532c427610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000fc82559e9ac85dfe85d556307b681a4d3111d2d4d2b2c8334ceea86b2ded4f4aa4560c5d92611c1642bdd5ffa0ced8ed7a79adaba0179b28711743fde9490b6d2426de2afc59ae698866793965cb9a47b27158216562290fedbdbb9683597539daa2a1a8f2438fc7f846279ebcfb3ba2a6f1d7e4c16b2431893b49e9f50703445b3ab4944f1c712a1b6ac1b4107d4468ba2893d9e581e30d74c527a5f3599a05f47b1de79f1539bc381705d7dba8d1af07091518412e3c3056871be7a8a2e6029aa100627ac523df29ebaa62ff2455cfa38dd77731e43270485e6d1cd1954b06ae2fe7fd593d32bc065e29e3bf7547c36949da66c53f0f66bfa4b873714a146bcc4f782eb2bd9532fa7dd7ca5dbf1894be1904047b045ed15bde5b4ca26aee1596dcaa3f2f559d9a486c8cf85f29fb58f36b78d2c1eb71df9927205ccc9cfd4df6eb60c9058fe1c4d837b11013f50512583d3d6bdf6a53a9dcd4aa09f56db475fa650bd81198abd702aa981d2754055bc2dcb23f8022d4c9219441ee7155240036d32d32f8839c7c3fa94c717009ec5ed28078ebb2a3a9288a1861576702e80798d15c316ff73049cc50b6521e1547510c84a8386d37d4e135edb813ea81e80d9c0c203a40506ff5e5cde94e158426f84d18d3536154c9b9d19c16137bb5213bf4c9651f078a31ef5045b5086e73fc760e7532fe01a25eebe03d6e7fffa1832fa4ad2028569620f35abfd0a4d74d4e4ddad9bbaa97bca61b3fa7c4c2fcd2261a601fff87acce8f388e717c376a76c0ccf86bc16d705a4ef2a3835c39f8310b00fe2cb9788d9211deb1732be7fca35b29e63818597bfd8ee2ee72c9eddd989a3afea43407760507bddb38d2af8e70170d6b2b2cd1768716cfdc52879272e64d071e9353fcb174ce510523263ffbeb2d2a3f33210d6804708197a9891957e46e755614ee807185ee3ca9edac678b38d04514c16259c7c325811f7c6c7addf57f081a3b3cc2d6dee823947f0a7fe94cf093a653510be4e6d948693c8b3c02d20e0f" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -504,7 +504,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "e2d1d2f655c55c71a98053558f178da1bd3f295224e99fe427622bbd3122696cea7ec093a4a4b72267f737a93ccb67745975ce5970c0a56bb5c1e3797769ef670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000364955db83e37d5696afaeed21e0c7ced9a951a78d0af7ad1468ee3654940d71527b0059940db9ed8ccf47e201dce6a8e04741246bef1d6490326cb9a62a0244e417bee2a407f3dcd1b05a1bfb390e6c8b368820b9b9903c6023d4bce36f1a3be8c972c16c2ac5fe8ce41fe5715fb9570d66de2ee127d14bf4db36708f917058bc3f387157d5f235d8dbe0a1efec6355366294dac73ea6b269ab0a1a26c84a055385649f0108409eaa6d7169db0a71540f998c4737b1f9796d46d7d0d6a75c0ab0a1b8609f7e61ee9be22f7f576117e506805efdff4eee6167d70f3d7c1518024272206754dcc2749e491fe10cd966301808949880e04960f3753c6e277632012ce51ac6d4b8bf5ee66ff08be9eef19cbdf978ffd9d4176ed15f88fdeae3f247321b373b63330a844fd640d007c1abd6e8012445fd4f21501817f3de863c414c9aecb76e2b8245fab58bad799b9f95534a3a6cfedef821e1cb4efed59f8b73504e561708968fa216039c712832211acd5b29f337bd85498d2b7ab6e94f28bf6ffc7a16e4480d90ae9ea7fb241172a44200895dfebf2e310c6c44bd2e3a52fd4e5cf3ec8671724b6e8fc7cc8c37985efa8b454fcf0392525736e8d32227c2e509864862dd40ac7a1ba06ff803d92854baf8392ef197e44d49b04b41b8ff35bf01708ea776a1bb42154ae9b6f961eec68c9eedd9453ab9a769b1165a20d9d54f1eaa8232394cb5c3ce19ab0c36bcb575ab1c178cbfa4a03e13ae0efa6271c9412e30861f247a317ceba38d03dd2ef1ca4ecc22662c0a2540a0dd5c8c6d4756e0524074183d9a8b478997004f3d656dcba9c070559404eccd60e60b731f31f4a31b002f5545f1d7b858c0a9e4010ccb77c0d703b957ae8096fe6aae1a75d81961020ec022e16f143be85fe24309641d038f0cb2f65c7d4a9403269f261ef276f136a44e57d6055c30aba527a361bf3d6d82065f1b4772121b7276888bad201de200a7f13d698df04f400abc40eee9f7ab812679000b96dc125ae97709267087" + "value_hex": "da7f189ae598fdf76881bb54acf84bab96a6f8477c97acae6986e817ff5b5e43e6e7d267f4c23bb767b6dcef5b8b3be7957adadff5e500c922a0c06532c427610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000fc82559e9ac85dfe85d556307b681a4d3111d2d4d2b2c8334ceea86b2ded4f4aa4560c5d92611c1642bdd5ffa0ced8ed7a79adaba0179b28711743fde9490b6d2426de2afc59ae698866793965cb9a47b27158216562290fedbdbb9683597539daa2a1a8f2438fc7f846279ebcfb3ba2a6f1d7e4c16b2431893b49e9f50703445b3ab4944f1c712a1b6ac1b4107d4468ba2893d9e581e30d74c527a5f3599a05f47b1de79f1539bc381705d7dba8d1af07091518412e3c3056871be7a8a2e6029aa100627ac523df29ebaa62ff2455cfa38dd77731e43270485e6d1cd1954b06ae2fe7fd593d32bc065e29e3bf7547c36949da66c53f0f66bfa4b873714a146bcc4f782eb2bd9532fa7dd7ca5dbf1894be1904047b045ed15bde5b4ca26aee1596dcaa3f2f559d9a486c8cf85f29fb58f36b78d2c1eb71df9927205ccc9cfd4df6eb60c9058fe1c4d837b11013f50512583d3d6bdf6a53a9dcd4aa09f56db475fa650bd81198abd702aa981d2754055bc2dcb23f8022d4c9219441ee7155240036d32d32f8839c7c3fa94c717009ec5ed28078ebb2a3a9288a1861576702e80798d15c316ff73049cc50b6521e1547510c84a8386d37d4e135edb813ea81e80d9c0c203a40506ff5e5cde94e158426f84d18d3536154c9b9d19c16137bb5213bf4c9651f078a31ef5045b5086e73fc760e7532fe01a25eebe03d6e7fffa1832fa4ad2028569620f35abfd0a4d74d4e4ddad9bbaa97bca61b3fa7c4c2fcd2261a601fff87acce8f388e717c376a76c0ccf86bc16d705a4ef2a3835c39f8310b00fe2cb9788d9211deb1732be7fca35b29e63818597bfd8ee2ee72c9eddd989a3afea43407760507bddb38d2af8e70170d6b2b2cd1768716cfdc52879272e64d071e9353fcb174ce510523263ffbeb2d2a3f33210d6804708197a9891957e46e755614ee807185ee3ca9edac678b38d04514c16259c7c325811f7c6c7addf57f081a3b3cc2d6dee823947f0a7fe94cf093a653510be4e6d948693c8b3c02d2" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -524,7 +524,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "e2d1d2f655c55c71a98053558f178da1bd3f295224e99fe427622bbd3122696cea7ec093a4a4b72267f737a93ccb67745975ce5970c0a56bb5c1e3797769ef670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000364955db83e37d5696afaeed21e0c7ced9a951a78d0af7ad1468ee3654940d71527b0059940db9ed8ccf47e201dce6a8e04741246bef1d6490326cb9a62a0244e417bee2a407f3dcd1b05a1bfb390e6c8b368820b9b9903c6023d4bce36f1a3be8c972c16c2ac5fe8ce41fe5715fb9570d66de2ee127d14bf4db36708f917058bc3f387157d5f235d8dbe0a1efec6355366294dac73ea6b269ab0a1a26c84a055385649f0108409eaa6d7169db0a71540f998c4737b1f9796d46d7d0d6a75c0ab0a1b8609f7e61ee9be22f7f576117e506805efdff4eee6167d70f3d7c1518024272206754dcc2749e491fe10cd966301808949880e04960f3753c6e277632012ce51ac6d4b8bf5ee66ff08be9eef19cbdf978ffd9d4176ed15f88fdeae3f247321b373b63330a844fd640d007c1abd6e8012445fd4f21501817f3de863c414c9aecb76e2b8245fab58bad799b9f95534a3a6cfedef821e1cb4efed59f8b73504e561708968fa216039c712832211acd5b29f337bd85498d2b7ab6e94f28bf6ffc7a16e4480d90ae9ea7fb241172a44200895dfebf2e310c6c44bd2e3a52fd4e5cf3ec8671724b6e8fc7cc8c37985efa8b454fcf0392525736e8d32227c2e509864862dd40ac7a1ba06ff803d92854baf8392ef197e44d49b04b41b8ff35bf01708ea776a1bb42154ae9b6f961eec68c9eedd9453ab9a769b1165a20d9d54f1eaa8232394cb5c3ce19ab0c36bcb575ab1c178cbfa4a03e13ae0efa6271c9412e30861f247a317ceba38d03dd2ef1ca4ecc22662c0a2540a0dd5c8c6d4756e0524074183d9a8b478997004f3d656dcba9c070559404eccd60e60b731f31f4a31b002f5545f1d7b858c0a9e4010ccb77c0d703b957ae8096fe6aae1a75d81961020ec022e16f143be85fe24309641d038f0cb2f65c7d4a9403269f261ef276f136a44e57d6055c30aba527a361bf3d6d82065f1b4772121b7276888bad201de200a7f13d698df04f400abc40eee9f7ab812679000b96dc125ae977092670877a0f" + "value_hex": "da7f189ae598fdf76881bb54acf84bab96a6f8477c97acae6986e817ff5b5e43e6e7d267f4c23bb767b6dcef5b8b3be7957adadff5e500c922a0c06532c427610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000fc82559e9ac85dfe85d556307b681a4d3111d2d4d2b2c8334ceea86b2ded4f4aa4560c5d92611c1642bdd5ffa0ced8ed7a79adaba0179b28711743fde9490b6d2426de2afc59ae698866793965cb9a47b27158216562290fedbdbb9683597539daa2a1a8f2438fc7f846279ebcfb3ba2a6f1d7e4c16b2431893b49e9f50703445b3ab4944f1c712a1b6ac1b4107d4468ba2893d9e581e30d74c527a5f3599a05f47b1de79f1539bc381705d7dba8d1af07091518412e3c3056871be7a8a2e6029aa100627ac523df29ebaa62ff2455cfa38dd77731e43270485e6d1cd1954b06ae2fe7fd593d32bc065e29e3bf7547c36949da66c53f0f66bfa4b873714a146bcc4f782eb2bd9532fa7dd7ca5dbf1894be1904047b045ed15bde5b4ca26aee1596dcaa3f2f559d9a486c8cf85f29fb58f36b78d2c1eb71df9927205ccc9cfd4df6eb60c9058fe1c4d837b11013f50512583d3d6bdf6a53a9dcd4aa09f56db475fa650bd81198abd702aa981d2754055bc2dcb23f8022d4c9219441ee7155240036d32d32f8839c7c3fa94c717009ec5ed28078ebb2a3a9288a1861576702e80798d15c316ff73049cc50b6521e1547510c84a8386d37d4e135edb813ea81e80d9c0c203a40506ff5e5cde94e158426f84d18d3536154c9b9d19c16137bb5213bf4c9651f078a31ef5045b5086e73fc760e7532fe01a25eebe03d6e7fffa1832fa4ad2028569620f35abfd0a4d74d4e4ddad9bbaa97bca61b3fa7c4c2fcd2261a601fff87acce8f388e717c376a76c0ccf86bc16d705a4ef2a3835c39f8310b00fe2cb9788d9211deb1732be7fca35b29e63818597bfd8ee2ee72c9eddd989a3afea43407760507bddb38d2af8e70170d6b2b2cd1768716cfdc52879272e64d071e9353fcb174ce510523263ffbeb2d2a3f33210d6804708197a9891957e46e755614ee807185ee3ca9edac678b38d04514c16259c7c325811f7c6c7addf57f081a3b3cc2d6dee823947f0a7fe94cf093a653510be4e6d948693c8b3c02d20e0e" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -536,15 +536,15 @@ "family": "transfer_composite", "expected_valid": true, "payload": { - "equality_proof_data_hex": "9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d54d45a813c57eb36ce6f624bec32a33260941f2c154732bf73627bf2c1051f23228346c3c56c2c73c96c2e77c00957cf6d64879363e53cb53a1b7cacecf77318e2d1d2f655c55c71a98053558f178da1bd3f295224e99fe427622bbd3122696cae5422445ac7da4d245a0c01f5243d8aa1b34d8d9dc44a27c57bfcd30d89b925102f54bd4536ed6022ea188e5d777aef807e22908d56ac6495c13fd2761efa0024a685e99b776e94af0afe360f91c4131f05a09559103854d7697d3ca0a29331ebc27771ce873b9bad3296525a457af7adbd73a5d3876ee991bccd6febc0c60ecbde414296cd49fb1d2512e6b4c918666cdb9ff9855fc922a00933acc027590ca67334a122fce4a20fa0e06a607f6f1908b2d2d087f079558faec88ef92a5402", - "range_proof_data_hex": "e2d1d2f655c55c71a98053558f178da1bd3f295224e99fe427622bbd3122696cea7ec093a4a4b72267f737a93ccb67745975ce5970c0a56bb5c1e3797769ef670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000364955db83e37d5696afaeed21e0c7ced9a951a78d0af7ad1468ee3654940d71527b0059940db9ed8ccf47e201dce6a8e04741246bef1d6490326cb9a62a0244e417bee2a407f3dcd1b05a1bfb390e6c8b368820b9b9903c6023d4bce36f1a3be8c972c16c2ac5fe8ce41fe5715fb9570d66de2ee127d14bf4db36708f917058bc3f387157d5f235d8dbe0a1efec6355366294dac73ea6b269ab0a1a26c84a055385649f0108409eaa6d7169db0a71540f998c4737b1f9796d46d7d0d6a75c0ab0a1b8609f7e61ee9be22f7f576117e506805efdff4eee6167d70f3d7c1518024272206754dcc2749e491fe10cd966301808949880e04960f3753c6e277632012ce51ac6d4b8bf5ee66ff08be9eef19cbdf978ffd9d4176ed15f88fdeae3f247321b373b63330a844fd640d007c1abd6e8012445fd4f21501817f3de863c414c9aecb76e2b8245fab58bad799b9f95534a3a6cfedef821e1cb4efed59f8b73504e561708968fa216039c712832211acd5b29f337bd85498d2b7ab6e94f28bf6ffc7a16e4480d90ae9ea7fb241172a44200895dfebf2e310c6c44bd2e3a52fd4e5cf3ec8671724b6e8fc7cc8c37985efa8b454fcf0392525736e8d32227c2e509864862dd40ac7a1ba06ff803d92854baf8392ef197e44d49b04b41b8ff35bf01708ea776a1bb42154ae9b6f961eec68c9eedd9453ab9a769b1165a20d9d54f1eaa8232394cb5c3ce19ab0c36bcb575ab1c178cbfa4a03e13ae0efa6271c9412e30861f247a317ceba38d03dd2ef1ca4ecc22662c0a2540a0dd5c8c6d4756e0524074183d9a8b478997004f3d656dcba9c070559404eccd60e60b731f31f4a31b002f5545f1d7b858c0a9e4010ccb77c0d703b957ae8096fe6aae1a75d81961020ec022e16f143be85fe24309641d038f0cb2f65c7d4a9403269f261ef276f136a44e57d6055c30aba527a361bf3d6d82065f1b4772121b7276888bad201de200a7f13d698df04f400abc40eee9f7ab812679000b96dc125ae977092670877a0e", - "validity_proof_data_hex": "9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c2201ea7ec093a4a4b72267f737a93ccb67745975ce5970c0a56bb5c1e3797769ef67d82d0f687310b824dd854de4cc5db78f433cb1851a9292f35043cb2d6aeea13e604a19c5cbba67fa85352bf1a05c0f582c9f72d34606e8892245e390e050af2cba7dda34936875fde95d84909baa346fa6aea9901c1ae8c499f97b6ce0f5904dfa2f58e84be4d398579b13a3b588ec11236567d872d49de1ca2c63cae1b1670d3cd1b5b80c894792d7ec9c7851038dc75fe3ae10779f0fcd882b7ee02a69ba6a94dea3d472e41811210d5c9fc4e0dcc32ae226cf15befb372647423a26edb7498c83f9e20ac0f061f36d48696c4117c54d14621d76df51cd865b2efd4171ae6dec82b4dbe7fcb293efb79e73d0f5f089603c0ba035e3e89eabe7c43cadd8ed48592435fbaaba0e7f80093d08b28c4fe0339206ea0511c7fc3b9da6281d1834011a2eaecb844829c3ec410d7aded445a69521632373adeeaf08d994d771989a07" + "equality_proof_data_hex": "fc2feed40d061ed35d415b503503273e201d99441a470b43c64e64870c6bb02e7e496fb78f6f47368e6ec07652c9f9771d6eab8c12ff4c6dc6fadb79d10f273f381e533b31438262ff0f981d52a2fbee576e3e24f101c9c54e12e984ee7f305bf208407853bfc2deba74a479b62582c44b3924910ba67d43e2b72bdf8a1ad80a54aa572d9265c1ff9ff7f00f84b8fb13c6a452d56d82c46af16c805f5e108248226e87e319c39886bd99f62f555ad9c34443df4c54be9aaa5fe14566a355126bae89bc20c6c6de71f1b061b3e51f6cbf0c83c65e057fb0feaea62b2257dcfc7c2f281ecefe13f0800c3f570669cd9e2e12d6ee08c12c571c43300be8729817041f4c4e674cca73a367ddd1d11989f28275a10657935033e9ec1798a43d4bc90531ecfc8649c6e164621aacec2b2a5691e2b406ba53fec60d9e67e16faabc0709", + "range_proof_data_hex": "f208407853bfc2deba74a479b62582c44b3924910ba67d43e2b72bdf8a1ad80aba6318c620da8dae51a45d1d3dd8732a39c3325818973184c831cc4c3790713c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000721c6645a246e93edcc3cc6a9aa1f164ae626d21fcecd4a40759136c29a1696c68bb064e7780492b557474d83ed2f52ab4bfad0d1ec5622071e67c70eb6c98070cc41fa85ca41565adf8675a8c20cf0f68d590cf873ccdf9cae50ee24afd82537eb146351f3aed5f1256eae673963bb5750ed0cf3247c257a57deb62f44c722a502f5a1b89d4267ee844c45b71115b00d80ea4dc49cc4616241da1fe0d11ec015242f5288d29ff506ac72b7e7f955aab670e9240a93d269024b90c150d513d085497240ec698120617179bb55cd197505fbd23468148d2bff3977c6d7b9e2201c873e2d398e8864bd12bf87dea7402594ab090c6ea7a2589838139150986bd63629bc89d6ec93ba34112dc24084133a6e66f2abd7174d5477345803be2dfcb08be8749e453f7d4ce4f62764301982e593a2c88fc158c73d227cde230fdc0112b6c744e0444c2499e21f20966770cd4cf98d8b2c55060adc8c9e532072a1ea026e8d6bf9d33c567429355bd5a2f781ad92de6fb8e9d231131484ca41d8b08a134f8d210968241f7a3f2f6ab230fa5101c7c849c18ce167b15075ee4774bd7f061409728f70844b0a6c3f7e2de562f2a3e49f46588ddffae5e10d0577b8bc87c2c82149d3beed10926ada32434d0ab50aea2fa924fea0a01ecccdbdb085aa35b68ba30249861e3c9e64ad06f067d2bdc3cbadfb5d29c499755eec7cb897b71fe502405d8b63a08ac8a924c0f2770acd4156fe4d970b853a931d5a5058390a2495e9ac6499322ea1ef80cb6cf7dbd0edec8c36776c5ddee431bb966a14f1f02e63be64ba37a5e695abb360ae53278babeb38807e123c30d4aa78d115222596d68013ad0433c10f5edb587183e435cedb86b12ace754983c1d01de5c81880386dc40c0d9dbbec0806f7d4f7760cb981fbc3472678e7f597225663f7257269320cb1c3d1decd170e95c3c88b3b44c1e53f88319aa9205bb807e44516a1d2f00c56c0676e719caf4060612a86ea5740e940e06565b4c05dd5e43380c8a19e1f12e190e", + "validity_proof_data_hex": "fc2feed40d061ed35d415b503503273e201d99441a470b43c64e64870c6bb02e367592922b37fa321fc37bc38bf434685507162e731982c1b188fba562ae3472ba6318c620da8dae51a45d1d3dd8732a39c3325818973184c831cc4c3790713c705e6f3c801e2a4aa1c5d71e970fc65e202f0bf6c169f0e4eec329af59d91b07fc0c481bea097df573d21246a75fb9ad0f787c9015677e7ef5798323c94da96dfe01d206df73cd3ba7d502f226e64526fc4f70bca89e1b37f18cde78b72df8706a2b850894d6aced60a4af2133a5689ad97ad12bd2d1a0de2a8a805cdb2e644fda10c55b1e280a972a6f896689b62b060b00a53152719734f693ca118a2d661126e8dd71adc25fad62f886b249ea9b269ce4c51867658265b983defb4c37c11428608fbffa187ebf125f6c4aadeaa02e43de3e58036d6ca07a6289b5847cb8502c2224597e83660fe6e4b5014f641be6b07f7f997b67b5ec9d325d27e7c41d24b8d5b1d51ce5edbdbea14f08a612628fd882a699dbf0115bc1dae6089bae4a0ca4f0ad7471b409c042635eb37f76bcda492698e1334a509e4769e805194dfc03" }, "binding": { - "current_balance_commitment_hex": "decf0746f26374837048e22787dc319e5dfc76e3ac41ec8ef8da3f1543a5ee22", - "current_balance_handle_hex": "0e880114b417f34e2d40aa9a54d6454d472b047db3049069eae4190fecbcb31c", - "recipient_pubkey_hex": "40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c2201", - "sender_pubkey_hex": "9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d" + "current_balance_commitment_hex": "6e774fae7f2c4768ec04be399eed23d7afd212ceeb7a282c88960fd57af1e60e", + "current_balance_handle_hex": "2c2301ce30769c260463576576f9b0f06b1743660ea11a07d5b5f07b6b40f759", + "recipient_pubkey_hex": "367592922b37fa321fc37bc38bf434685507162e731982c1b188fba562ae3472", + "sender_pubkey_hex": "fc2feed40d061ed35d415b503503273e201d99441a470b43c64e64870c6bb02e" }, "mutations": [ { @@ -562,7 +562,7 @@ "op": "bitflip", "target": "binding.sender_pubkey_hex", "params": { - "value_hex": "9b8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d" + "value_hex": "fd2feed40d061ed35d415b503503273e201d99441a470b43c64e64870c6bb02e" }, "expected_valid": false, "expected_error_contains": "failed" @@ -572,7 +572,7 @@ "op": "bitflip", "target": "binding.recipient_pubkey_hex", "params": { - "value_hex": "41b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c2201" + "value_hex": "377592922b37fa321fc37bc38bf434685507162e731982c1b188fba562ae3472" }, "expected_valid": false, "expected_error_contains": "failed" @@ -592,7 +592,7 @@ "op": "truncate", "target": "payload.range_proof_data_hex", "params": { - "value_hex": "e2d1d2f655c55c71a98053558f178da1bd3f295224e99fe427622bbd3122696cea7ec093a4a4b72267f737a93ccb67745975ce5970c0a56bb5c1e3797769ef670000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000364955db83e37d5696afaeed21e0c7ced9a951a78d0af7ad1468ee3654940d71527b0059940db9ed8ccf47e201dce6a8e04741246bef1d6490326cb9a62a0244e417bee2a407f3dcd1b05a1bfb390e6c8b368820b9b9903c6023d4bce36f1a3be8c972c16c2ac5fe8ce41fe5715fb9570d66de2ee127d14bf4db36708f917058bc3f387157d5f235d8dbe0a1efec6355366294dac73ea6b269ab0a1a26c84a055385649f0108409eaa6d7169db0a71540f998c4737b1f9796d46d7d0d6a75c0ab0a1b8609f7e61ee9be22f7f576117e506805efdff4eee6167d70f3d7c1518024272206754dcc2749e491fe10cd966301808949880e04960f3753c6e277632012ce51ac6d4b8bf5ee66ff08be9eef19cbdf978ffd9d4176ed15f88fdeae3f247321b373b63330a844fd640d007c1abd6e8012445fd4f21501817f3de863c414c9aecb76e2b8245fab58bad799b9f95534a3a6cfedef821e1cb4efed59f8b73504e561708968fa216039c712832211acd5b29f337bd85498d2b7ab6e94f28bf6ffc7a16e4480d90ae9ea7fb241172a44200895dfebf2e310c6c44bd2e3a52fd4e5cf3ec8671724b6e8fc7cc8c37985efa8b454fcf0392525736e8d32227c2e509864862dd40ac7a1ba06ff803d92854baf8392ef197e44d49b04b41b8ff35bf01708ea776a1bb42154ae9b6f961eec68c9eedd9453ab9a769b1165a20d9d54f1eaa8232394cb5c3ce19ab0c36bcb575ab1c178cbfa4a03e13ae0efa6271c9412e30861f247a317ceba38d03dd2ef1ca4ecc22662c0a2540a0dd5c8c6d4756e0524074183d9a8b478997004f3d656dcba9c070559404eccd60e60b731f31f4a31b002f5545f1d7b858c0a9e4010ccb77c0d703b957ae8096fe6aae1a75d81961020ec022e16f143be85fe24309641d038f0cb2f65c7d4a9403269f261ef276f136a44e57d6055c30aba527a361bf3d6d82065f1b4772121b7276888bad201de200a7f13d698df04f400abc40eee9f7ab812679000b96dc125ae97709267087" + "value_hex": "f208407853bfc2deba74a479b62582c44b3924910ba67d43e2b72bdf8a1ad80aba6318c620da8dae51a45d1d3dd8732a39c3325818973184c831cc4c3790713c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000721c6645a246e93edcc3cc6a9aa1f164ae626d21fcecd4a40759136c29a1696c68bb064e7780492b557474d83ed2f52ab4bfad0d1ec5622071e67c70eb6c98070cc41fa85ca41565adf8675a8c20cf0f68d590cf873ccdf9cae50ee24afd82537eb146351f3aed5f1256eae673963bb5750ed0cf3247c257a57deb62f44c722a502f5a1b89d4267ee844c45b71115b00d80ea4dc49cc4616241da1fe0d11ec015242f5288d29ff506ac72b7e7f955aab670e9240a93d269024b90c150d513d085497240ec698120617179bb55cd197505fbd23468148d2bff3977c6d7b9e2201c873e2d398e8864bd12bf87dea7402594ab090c6ea7a2589838139150986bd63629bc89d6ec93ba34112dc24084133a6e66f2abd7174d5477345803be2dfcb08be8749e453f7d4ce4f62764301982e593a2c88fc158c73d227cde230fdc0112b6c744e0444c2499e21f20966770cd4cf98d8b2c55060adc8c9e532072a1ea026e8d6bf9d33c567429355bd5a2f781ad92de6fb8e9d231131484ca41d8b08a134f8d210968241f7a3f2f6ab230fa5101c7c849c18ce167b15075ee4774bd7f061409728f70844b0a6c3f7e2de562f2a3e49f46588ddffae5e10d0577b8bc87c2c82149d3beed10926ada32434d0ab50aea2fa924fea0a01ecccdbdb085aa35b68ba30249861e3c9e64ad06f067d2bdc3cbadfb5d29c499755eec7cb897b71fe502405d8b63a08ac8a924c0f2770acd4156fe4d970b853a931d5a5058390a2495e9ac6499322ea1ef80cb6cf7dbd0edec8c36776c5ddee431bb966a14f1f02e63be64ba37a5e695abb360ae53278babeb38807e123c30d4aa78d115222596d68013ad0433c10f5edb587183e435cedb86b12ace754983c1d01de5c81880386dc40c0d9dbbec0806f7d4f7760cb981fbc3472678e7f597225663f7257269320cb1c3d1decd170e95c3c88b3b44c1e53f88319aa9205bb807e44516a1d2f00c56c0676e719caf4060612a86ea5740e940e06565b4c05dd5e43380c8a19e1f12e" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -604,7 +604,7 @@ "family": "equality", "expected_valid": true, "payload": { - "proof_data_hex": "40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c22011236a299cf39e9b97c79547ecbc358dd5411d8d75e14a827a5b98125adf62a41c6b7bfaccf40f04df0f78492907d4c17f5516326c77c6ba2d963ea734fa75c0550c243075006fa553e02b29605b8716b952c3dbc832d510cc0a668928de6653fb2d012282a376ec1041c1a34a2e2c512e5595f110e514951b0119b1cbe6f152232e02db0049566adc25a573cfddcc1444c0e52a219a08a0366784fd6d2a5234b5e0e44952de1f99911ae5ed5f7d54e95ecf89ae82c06d7e23033097c093f784da22f2f1fee5a336c85e7cfc5b0ac907c12b020c7f0b29e4e85e005bccaf8890a89ffccba39c6cd16e2b7c88e4166bbe4f99f0996d29b18fe6e494f8660f77006670a56c03dfcfb8e1368eede259be91feadec1d54bd1dcc04b9e5208fea3e60f" + "proof_data_hex": "367592922b37fa321fc37bc38bf434685507162e731982c1b188fba562ae3472641efb396eec909817f83f903d12a78bca1289e965fe1d81e8237342177b73246652302d3492c8177d435c7c64a6c75c5b05cd11026e52f61ad8bac3f06f3b4762848ef3dae8e0829b310f657a876f553a2fb748cd70d5606358005d65a82617fc5b1d394418b561d07323abf16911daf3f76b1ffea90e482e6a4646cde1c728508ec4f8ba16fa5d09b0ac319655d662097390c4c363158912858176ef67f908c2bd903e2f868cc7fc7fe7831a22f8295001edf5e485d4f311fc34c5a82c060443da4f265939cfe71570c7a5b4a411fbc792bec44cceab3054889ca9a7116b056c55089570e3c50692285260e32fb2be50d382c3a2ba49d75892a61017712a0a830fbeeff1a9a020e31f30a0774112a2dd26e81dcba0bb11b8966bec69e26203" }, "mutations": [ { @@ -612,7 +612,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "41b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c22011236a299cf39e9b97c79547ecbc358dd5411d8d75e14a827a5b98125adf62a41c6b7bfaccf40f04df0f78492907d4c17f5516326c77c6ba2d963ea734fa75c0550c243075006fa553e02b29605b8716b952c3dbc832d510cc0a668928de6653fb2d012282a376ec1041c1a34a2e2c512e5595f110e514951b0119b1cbe6f152232e02db0049566adc25a573cfddcc1444c0e52a219a08a0366784fd6d2a5234b5e0e44952de1f99911ae5ed5f7d54e95ecf89ae82c06d7e23033097c093f784da22f2f1fee5a336c85e7cfc5b0ac907c12b020c7f0b29e4e85e005bccaf8890a89ffccba39c6cd16e2b7c88e4166bbe4f99f0996d29b18fe6e494f8660f77006670a56c03dfcfb8e1368eede259be91feadec1d54bd1dcc04b9e5208fea3e60f" + "value_hex": "377592922b37fa321fc37bc38bf434685507162e731982c1b188fba562ae3472641efb396eec909817f83f903d12a78bca1289e965fe1d81e8237342177b73246652302d3492c8177d435c7c64a6c75c5b05cd11026e52f61ad8bac3f06f3b4762848ef3dae8e0829b310f657a876f553a2fb748cd70d5606358005d65a82617fc5b1d394418b561d07323abf16911daf3f76b1ffea90e482e6a4646cde1c728508ec4f8ba16fa5d09b0ac319655d662097390c4c363158912858176ef67f908c2bd903e2f868cc7fc7fe7831a22f8295001edf5e485d4f311fc34c5a82c060443da4f265939cfe71570c7a5b4a411fbc792bec44cceab3054889ca9a7116b056c55089570e3c50692285260e32fb2be50d382c3a2ba49d75892a61017712a0a830fbeeff1a9a020e31f30a0774112a2dd26e81dcba0bb11b8966bec69e26203" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -622,7 +622,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c22011236a299cf39e9b97c79547ecbc358dd5411d8d75e14a827a5b98125adf62a41c6b7bfaccf40f04df0f78492907d4c17f5516326c77c6ba2d963ea734fa75c0550c243075006fa553e02b29605b8716b952c3dbc832d510cc0a668928de6653fb2d012282a376ec1041c1a34a2e2c512e5595f110e514951b0119b1cbe6f152232e02db0049566adc25a573cfddcc1444c0e52a219a08a0366784fd6d2a5234b5e0e44952de1f99911ae5ed5f7d54e95ecf89ae82c06d7e23033097c093f784da22f2f1fee5a336c85e7cfc5b0ac907c12b020c7f0b29e4e85e005bccaf8890a89ffccba39c6cd16e2b7c88e4166bbe4f99f0996d29b18fe6e494f8660f77006670a56c03dfcfb8e1368eede259be91feadec1d54bd1dcc04b9e5208fea3" + "value_hex": "367592922b37fa321fc37bc38bf434685507162e731982c1b188fba562ae3472641efb396eec909817f83f903d12a78bca1289e965fe1d81e8237342177b73246652302d3492c8177d435c7c64a6c75c5b05cd11026e52f61ad8bac3f06f3b4762848ef3dae8e0829b310f657a876f553a2fb748cd70d5606358005d65a82617fc5b1d394418b561d07323abf16911daf3f76b1ffea90e482e6a4646cde1c728508ec4f8ba16fa5d09b0ac319655d662097390c4c363158912858176ef67f908c2bd903e2f868cc7fc7fe7831a22f8295001edf5e485d4f311fc34c5a82c060443da4f265939cfe71570c7a5b4a411fbc792bec44cceab3054889ca9a7116b056c55089570e3c50692285260e32fb2be50d382c3a2ba49d75892a61017712a0a830fbeeff1a9a020e31f30a0774112a2dd26e81dcba0bb11b8966bec69e2" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -644,7 +644,7 @@ "family": "validity", "expected_valid": true, "payload": { - "proof_data_hex": "40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c22011ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c667842452cfe4069472ca9a2aaeb42b42076e5a43768ace50e2cff5d7f65385d4a1012a4cbe10e2d5f095c834e6351618aa702f3956f08022b92269d7464406e8bcd01f0059d8a86b0090a51e9a3899cd9de70147cdd2722f8d34b76c9215e79fc7d70fde69abdf3d5e237631a4eb99bad52df5d58a910a080de48ba01c0237274e8e321893a874646d2fa987cbcaf3853873533ebeaa80c5d2fc829d896805b1fe3c62b4d3e22dd3712dddc9c015f084f55ae7b6065d7661024646e126805a1ef9173f340d09f755e86c9b7b9d14ef5f043f73d93f13ae49f424d6bf86f22283e995074abf7ee0182eacb5cae95578982e938e95cb561ed692b3f1bb3c239d41b2437cd21314e84600da1c52483aa4efa1f5951cbcb0f35e7234acc0d08cb9b51f1f382c1c1d432f49959cd585fb8b54bec2b5b2c6dceb71e3ad6807de38bb56f4a20e5c27cb82c7002e7b95d8a9d406d175fe6570f3b315955a9e6e105b9e8ab5880e" + "proof_data_hex": "367592922b37fa321fc37bc38bf434685507162e731982c1b188fba562ae34729446fe67f5a6f4c607a9aff001fc39dba92ce6174ad9f219b07dcf312f672a7aca195a68d159159bda2ab9960d8ecca7aaaf039153bae0c5ca1c2fbcb002ea70a8b41938380e1695912650c3b512432c809a0d7aad6f756542eea507736d025484af842fae615908502893876740e32c6c1ad1eed108b30c795b899d9ea45c5262df0859d7e235f22a9724c4c60f6bc1fb598476c002fe252e3b735efca2b90a1c8992371207ef2dc0e232f3cea403acfe6a84e7798ded239b64dccaf0e3ca1bce8608c6f477e1aa14651291ee50cc7dd0d8d5901e43d56459ab07f08c0fc92cbc209c348b7fe811c5472b8a4e8a029e27e571a022b2affa3d105cb1ec63424cfe3e223c8f7f1f49da25b105e2da2e3039998d9c8639aae6f0ee29974e7b566b6a4700b33c4151e3ad500aedf900481a6c08d20a328345807828b3d48580bd40a26121b89203c7be2d5d3f40af276f431e510653c0bd066c080e351fa3a405095cb2319209d0cb6592e15240ec9778533ddeaf6051434962697d23babca08f03" }, "mutations": [ { @@ -652,7 +652,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "41b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c22011ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c667842452cfe4069472ca9a2aaeb42b42076e5a43768ace50e2cff5d7f65385d4a1012a4cbe10e2d5f095c834e6351618aa702f3956f08022b92269d7464406e8bcd01f0059d8a86b0090a51e9a3899cd9de70147cdd2722f8d34b76c9215e79fc7d70fde69abdf3d5e237631a4eb99bad52df5d58a910a080de48ba01c0237274e8e321893a874646d2fa987cbcaf3853873533ebeaa80c5d2fc829d896805b1fe3c62b4d3e22dd3712dddc9c015f084f55ae7b6065d7661024646e126805a1ef9173f340d09f755e86c9b7b9d14ef5f043f73d93f13ae49f424d6bf86f22283e995074abf7ee0182eacb5cae95578982e938e95cb561ed692b3f1bb3c239d41b2437cd21314e84600da1c52483aa4efa1f5951cbcb0f35e7234acc0d08cb9b51f1f382c1c1d432f49959cd585fb8b54bec2b5b2c6dceb71e3ad6807de38bb56f4a20e5c27cb82c7002e7b95d8a9d406d175fe6570f3b315955a9e6e105b9e8ab5880e" + "value_hex": "377592922b37fa321fc37bc38bf434685507162e731982c1b188fba562ae34729446fe67f5a6f4c607a9aff001fc39dba92ce6174ad9f219b07dcf312f672a7aca195a68d159159bda2ab9960d8ecca7aaaf039153bae0c5ca1c2fbcb002ea70a8b41938380e1695912650c3b512432c809a0d7aad6f756542eea507736d025484af842fae615908502893876740e32c6c1ad1eed108b30c795b899d9ea45c5262df0859d7e235f22a9724c4c60f6bc1fb598476c002fe252e3b735efca2b90a1c8992371207ef2dc0e232f3cea403acfe6a84e7798ded239b64dccaf0e3ca1bce8608c6f477e1aa14651291ee50cc7dd0d8d5901e43d56459ab07f08c0fc92cbc209c348b7fe811c5472b8a4e8a029e27e571a022b2affa3d105cb1ec63424cfe3e223c8f7f1f49da25b105e2da2e3039998d9c8639aae6f0ee29974e7b566b6a4700b33c4151e3ad500aedf900481a6c08d20a328345807828b3d48580bd40a26121b89203c7be2d5d3f40af276f431e510653c0bd066c080e351fa3a405095cb2319209d0cb6592e15240ec9778533ddeaf6051434962697d23babca08f03" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -662,7 +662,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c22011ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c667842452cfe4069472ca9a2aaeb42b42076e5a43768ace50e2cff5d7f65385d4a1012a4cbe10e2d5f095c834e6351618aa702f3956f08022b92269d7464406e8bcd01f0059d8a86b0090a51e9a3899cd9de70147cdd2722f8d34b76c9215e79fc7d70fde69abdf3d5e237631a4eb99bad52df5d58a910a080de48ba01c0237274e8e321893a874646d2fa987cbcaf3853873533ebeaa80c5d2fc829d896805b1fe3c62b4d3e22dd3712dddc9c015f084f55ae7b6065d7661024646e126805a1ef9173f340d09f755e86c9b7b9d14ef5f043f73d93f13ae49f424d6bf86f22283e995074abf7ee0182eacb5cae95578982e938e95cb561ed692b3f1bb3c239d41b2437cd21314e84600da1c52483aa4efa1f5951cbcb0f35e7234acc0d08cb9b51f1f382c1c1d432f49959cd585fb8b54bec2b5b2c6dceb71e3ad6807de38bb56f4a20e5c27cb82c7002e7b95d8a9d406d175fe6570f3b315955a9e6e105b9e8ab5" + "value_hex": "367592922b37fa321fc37bc38bf434685507162e731982c1b188fba562ae34729446fe67f5a6f4c607a9aff001fc39dba92ce6174ad9f219b07dcf312f672a7aca195a68d159159bda2ab9960d8ecca7aaaf039153bae0c5ca1c2fbcb002ea70a8b41938380e1695912650c3b512432c809a0d7aad6f756542eea507736d025484af842fae615908502893876740e32c6c1ad1eed108b30c795b899d9ea45c5262df0859d7e235f22a9724c4c60f6bc1fb598476c002fe252e3b735efca2b90a1c8992371207ef2dc0e232f3cea403acfe6a84e7798ded239b64dccaf0e3ca1bce8608c6f477e1aa14651291ee50cc7dd0d8d5901e43d56459ab07f08c0fc92cbc209c348b7fe811c5472b8a4e8a029e27e571a022b2affa3d105cb1ec63424cfe3e223c8f7f1f49da25b105e2da2e3039998d9c8639aae6f0ee29974e7b566b6a4700b33c4151e3ad500aedf900481a6c08d20a328345807828b3d48580bd40a26121b89203c7be2d5d3f40af276f431e510653c0bd066c080e351fa3a405095cb2319209d0cb6592e15240ec9778533ddeaf6051434962697d23babca0" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -684,7 +684,7 @@ "family": "transfer_range", "expected_valid": true, "payload": { - "proof_data_hex": "50c243075006fa553e02b29605b8716b952c3dbc832d510cc0a668928de6653f52cfe4069472ca9a2aaeb42b42076e5a43768ace50e2cff5d7f65385d4a1012a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000005ac1c0dec5266e5b39a17c8deebfa34d56adc0c69d58794eb9ecfefe2705f67bee015b045396902d3012c863854ed3c1e223eca6605110616e8c9bead911db525203cb997f2cf259daf2c4bbc32e3f34ee788023b3d4b13b3b2926840de4d7170ebdcd854ce2ca95ac9b5d546e6caafb551c603842b367a5d5347a28f1f8707cedc3b59431d94180324b2cc5a93369e80dbd9e434736afed962df2a0a950700d476b9d5ca1175dbe1f955cf847fb16367c17690ed3d28447949006c32799460d69fd6f04ce3e46324ca39f2d463ca17f9a0be5302d228d83a9f9d2a77de98e084aa2474da38c74f755018a9b5f9da84bdb78b1c755b48e7b27e3216ca1551104764d45139e8aaeabfc6e7b49c330b8493603695170d2a7d94c1f055684305b335ea52b7d4ebeaed1477668d542d2e16a5c7c020a1c406d9c281541890e357a48aa498aa46d187b4d63719103cb7b29496661d3eac593e0c45965bae02262bf6d1a5b80655a05a10b8c756423b3bad79b367eaa775d6603c1f328fcdf7f37b05490e719d0b15d1bd1738855444e17036b38462c1e27ee5b7d888b4420717d8b3afca450b7a94d42f6f3cebf2dcfbf681b65aa7b5467cf4900eaf79d7f1152df5514fed1cf4ee41c3a2ee019303ef8da4b9ca0255bd05a5be311b71669c49d110a7026ae60b227a007e08fddc24db1dd2b00da84904185e9c5e524f25ec4ccab1e2828dbd9c9ab92afc166f62ef6d6a97a256c5babb805123cb8314af1718fd77e5a3228f0170cefdd7f0a595555144c51960c0532473db09a756e3e1bb2c1054b3a900da56a76b9e5a26eb8b4cc17d663ca6ab8946bcf42104705b4b1cbba4a165aa3a072b1ab06729f3afd124289a942c351ca980da5752eb48dcd8609937a72989a9bd2dee57117ad230c1346a4d52a89636a0a65db0dffb8746a8496ccef16d57bb564af1d768158156da58fefdcfe3626c131672cb3f0264b886ef923ed06c1f07b3a1d8b23b977a72d145a33367d7bd765013eb15ef36eeb0b7ac483cc08" + "proof_data_hex": "62848ef3dae8e0829b310f657a876f553a2fb748cd70d5606358005d65a82617ca195a68d159159bda2ab9960d8ecca7aaaf039153bae0c5ca1c2fbcb002ea7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000007080743d39724b0d600d7fbf1c2900c1870da76e4b5179fb2604a19ae0ce54653ada006091c32793974ebc2be7130b9f8c871662026644c4be7d62be69401119a281d54f562dbca44eeecd808f9a3a57335c6cc488f1c628b3e768122e2c206c1a58a202a6fd3ee903f9f4414647972a0c4605b02cd77b7c622d029a922111554e4c7896da56e766fb5505b894f4477c2c095bb0d43604e6edd788ba6b30ca03ee9fe433ae70bfe0b33c7a9f77ea02b3e3ee16afba2e098ae89b9a4151553a06196a3aaa5e725ff8722697f80089c643333e37cd2bd1d489aedc5e68473a910470850cc85599c51937b22af77260abab717eb96ff3732be89cd50b70ad172411924821c8708967d682f248031dee69086d2e2253b3ecc9bdaf7fb9c9f5b4a1705cca1c73d2ef43791146224c2a1ea5f12e793dcb0c65e6cd6a0e5d6b85377f59442197507d2818f2d138b60cf52e45a74a5f2f94485193244eaa6e00fd4adb33ce30c86a76b4f5e947bd0c5ed24507c953cff1040e32e83197742c4750805d6e046639c1b21958c36e9549ef1e86c6e70cbd51fffbd15f77ae33df6d3c64e95f2cd8e86fc535b58ce572262024c42dfef93f3b87f4e7cfbdb2d365ca6113df7efa1de3518ed107fe57b523bbe1ef183848babf190c7705044e4fc6e5bd9bbb604eba1a5576e286a7946fa401caa120bbf2ea4aa79ec3479ae96a8b06d54e6d42d6a2d4c0c738d2f3d6beba0f5253e8d4a2ce1f9c81872c8bf474b5e6d33e33352aa801ddc5cfabcce3b6af402bd5ffdd1f291ecb789dfc7f09e83d7237b65e4c46a572fae87a7cf70f90464ac27a82209759c2139b0c9ba5ffe28be8e81289465660030261a2e674616759904118146c0cba1d577def418b7933bcdc48ae5e6134691041d9f20b4b8198df55aeab3ae3ecf6e3723bfb1aa4f7e642b40a5658561b7a46abf0cb0aca40fb023702339a0abc39d4c5dae761a4745b200c4f24cc0ec94e3484ca0e1859d87a25e9d3a093b24f0ebef836e000db10a41b7bed430c06" }, "mutations": [ { @@ -692,7 +692,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "51c243075006fa553e02b29605b8716b952c3dbc832d510cc0a668928de6653f52cfe4069472ca9a2aaeb42b42076e5a43768ace50e2cff5d7f65385d4a1012a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000005ac1c0dec5266e5b39a17c8deebfa34d56adc0c69d58794eb9ecfefe2705f67bee015b045396902d3012c863854ed3c1e223eca6605110616e8c9bead911db525203cb997f2cf259daf2c4bbc32e3f34ee788023b3d4b13b3b2926840de4d7170ebdcd854ce2ca95ac9b5d546e6caafb551c603842b367a5d5347a28f1f8707cedc3b59431d94180324b2cc5a93369e80dbd9e434736afed962df2a0a950700d476b9d5ca1175dbe1f955cf847fb16367c17690ed3d28447949006c32799460d69fd6f04ce3e46324ca39f2d463ca17f9a0be5302d228d83a9f9d2a77de98e084aa2474da38c74f755018a9b5f9da84bdb78b1c755b48e7b27e3216ca1551104764d45139e8aaeabfc6e7b49c330b8493603695170d2a7d94c1f055684305b335ea52b7d4ebeaed1477668d542d2e16a5c7c020a1c406d9c281541890e357a48aa498aa46d187b4d63719103cb7b29496661d3eac593e0c45965bae02262bf6d1a5b80655a05a10b8c756423b3bad79b367eaa775d6603c1f328fcdf7f37b05490e719d0b15d1bd1738855444e17036b38462c1e27ee5b7d888b4420717d8b3afca450b7a94d42f6f3cebf2dcfbf681b65aa7b5467cf4900eaf79d7f1152df5514fed1cf4ee41c3a2ee019303ef8da4b9ca0255bd05a5be311b71669c49d110a7026ae60b227a007e08fddc24db1dd2b00da84904185e9c5e524f25ec4ccab1e2828dbd9c9ab92afc166f62ef6d6a97a256c5babb805123cb8314af1718fd77e5a3228f0170cefdd7f0a595555144c51960c0532473db09a756e3e1bb2c1054b3a900da56a76b9e5a26eb8b4cc17d663ca6ab8946bcf42104705b4b1cbba4a165aa3a072b1ab06729f3afd124289a942c351ca980da5752eb48dcd8609937a72989a9bd2dee57117ad230c1346a4d52a89636a0a65db0dffb8746a8496ccef16d57bb564af1d768158156da58fefdcfe3626c131672cb3f0264b886ef923ed06c1f07b3a1d8b23b977a72d145a33367d7bd765013eb15ef36eeb0b7ac483cc08" + "value_hex": "63848ef3dae8e0829b310f657a876f553a2fb748cd70d5606358005d65a82617ca195a68d159159bda2ab9960d8ecca7aaaf039153bae0c5ca1c2fbcb002ea7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000007080743d39724b0d600d7fbf1c2900c1870da76e4b5179fb2604a19ae0ce54653ada006091c32793974ebc2be7130b9f8c871662026644c4be7d62be69401119a281d54f562dbca44eeecd808f9a3a57335c6cc488f1c628b3e768122e2c206c1a58a202a6fd3ee903f9f4414647972a0c4605b02cd77b7c622d029a922111554e4c7896da56e766fb5505b894f4477c2c095bb0d43604e6edd788ba6b30ca03ee9fe433ae70bfe0b33c7a9f77ea02b3e3ee16afba2e098ae89b9a4151553a06196a3aaa5e725ff8722697f80089c643333e37cd2bd1d489aedc5e68473a910470850cc85599c51937b22af77260abab717eb96ff3732be89cd50b70ad172411924821c8708967d682f248031dee69086d2e2253b3ecc9bdaf7fb9c9f5b4a1705cca1c73d2ef43791146224c2a1ea5f12e793dcb0c65e6cd6a0e5d6b85377f59442197507d2818f2d138b60cf52e45a74a5f2f94485193244eaa6e00fd4adb33ce30c86a76b4f5e947bd0c5ed24507c953cff1040e32e83197742c4750805d6e046639c1b21958c36e9549ef1e86c6e70cbd51fffbd15f77ae33df6d3c64e95f2cd8e86fc535b58ce572262024c42dfef93f3b87f4e7cfbdb2d365ca6113df7efa1de3518ed107fe57b523bbe1ef183848babf190c7705044e4fc6e5bd9bbb604eba1a5576e286a7946fa401caa120bbf2ea4aa79ec3479ae96a8b06d54e6d42d6a2d4c0c738d2f3d6beba0f5253e8d4a2ce1f9c81872c8bf474b5e6d33e33352aa801ddc5cfabcce3b6af402bd5ffdd1f291ecb789dfc7f09e83d7237b65e4c46a572fae87a7cf70f90464ac27a82209759c2139b0c9ba5ffe28be8e81289465660030261a2e674616759904118146c0cba1d577def418b7933bcdc48ae5e6134691041d9f20b4b8198df55aeab3ae3ecf6e3723bfb1aa4f7e642b40a5658561b7a46abf0cb0aca40fb023702339a0abc39d4c5dae761a4745b200c4f24cc0ec94e3484ca0e1859d87a25e9d3a093b24f0ebef836e000db10a41b7bed430c06" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -702,7 +702,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "50c243075006fa553e02b29605b8716b952c3dbc832d510cc0a668928de6653f52cfe4069472ca9a2aaeb42b42076e5a43768ace50e2cff5d7f65385d4a1012a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000005ac1c0dec5266e5b39a17c8deebfa34d56adc0c69d58794eb9ecfefe2705f67bee015b045396902d3012c863854ed3c1e223eca6605110616e8c9bead911db525203cb997f2cf259daf2c4bbc32e3f34ee788023b3d4b13b3b2926840de4d7170ebdcd854ce2ca95ac9b5d546e6caafb551c603842b367a5d5347a28f1f8707cedc3b59431d94180324b2cc5a93369e80dbd9e434736afed962df2a0a950700d476b9d5ca1175dbe1f955cf847fb16367c17690ed3d28447949006c32799460d69fd6f04ce3e46324ca39f2d463ca17f9a0be5302d228d83a9f9d2a77de98e084aa2474da38c74f755018a9b5f9da84bdb78b1c755b48e7b27e3216ca1551104764d45139e8aaeabfc6e7b49c330b8493603695170d2a7d94c1f055684305b335ea52b7d4ebeaed1477668d542d2e16a5c7c020a1c406d9c281541890e357a48aa498aa46d187b4d63719103cb7b29496661d3eac593e0c45965bae02262bf6d1a5b80655a05a10b8c756423b3bad79b367eaa775d6603c1f328fcdf7f37b05490e719d0b15d1bd1738855444e17036b38462c1e27ee5b7d888b4420717d8b3afca450b7a94d42f6f3cebf2dcfbf681b65aa7b5467cf4900eaf79d7f1152df5514fed1cf4ee41c3a2ee019303ef8da4b9ca0255bd05a5be311b71669c49d110a7026ae60b227a007e08fddc24db1dd2b00da84904185e9c5e524f25ec4ccab1e2828dbd9c9ab92afc166f62ef6d6a97a256c5babb805123cb8314af1718fd77e5a3228f0170cefdd7f0a595555144c51960c0532473db09a756e3e1bb2c1054b3a900da56a76b9e5a26eb8b4cc17d663ca6ab8946bcf42104705b4b1cbba4a165aa3a072b1ab06729f3afd124289a942c351ca980da5752eb48dcd8609937a72989a9bd2dee57117ad230c1346a4d52a89636a0a65db0dffb8746a8496ccef16d57bb564af1d768158156da58fefdcfe3626c131672cb3f0264b886ef923ed06c1f07b3a1d8b23b977a72d145a33367d7bd765013eb15ef36eeb0b7ac483" + "value_hex": "62848ef3dae8e0829b310f657a876f553a2fb748cd70d5606358005d65a82617ca195a68d159159bda2ab9960d8ecca7aaaf039153bae0c5ca1c2fbcb002ea7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000007080743d39724b0d600d7fbf1c2900c1870da76e4b5179fb2604a19ae0ce54653ada006091c32793974ebc2be7130b9f8c871662026644c4be7d62be69401119a281d54f562dbca44eeecd808f9a3a57335c6cc488f1c628b3e768122e2c206c1a58a202a6fd3ee903f9f4414647972a0c4605b02cd77b7c622d029a922111554e4c7896da56e766fb5505b894f4477c2c095bb0d43604e6edd788ba6b30ca03ee9fe433ae70bfe0b33c7a9f77ea02b3e3ee16afba2e098ae89b9a4151553a06196a3aaa5e725ff8722697f80089c643333e37cd2bd1d489aedc5e68473a910470850cc85599c51937b22af77260abab717eb96ff3732be89cd50b70ad172411924821c8708967d682f248031dee69086d2e2253b3ecc9bdaf7fb9c9f5b4a1705cca1c73d2ef43791146224c2a1ea5f12e793dcb0c65e6cd6a0e5d6b85377f59442197507d2818f2d138b60cf52e45a74a5f2f94485193244eaa6e00fd4adb33ce30c86a76b4f5e947bd0c5ed24507c953cff1040e32e83197742c4750805d6e046639c1b21958c36e9549ef1e86c6e70cbd51fffbd15f77ae33df6d3c64e95f2cd8e86fc535b58ce572262024c42dfef93f3b87f4e7cfbdb2d365ca6113df7efa1de3518ed107fe57b523bbe1ef183848babf190c7705044e4fc6e5bd9bbb604eba1a5576e286a7946fa401caa120bbf2ea4aa79ec3479ae96a8b06d54e6d42d6a2d4c0c738d2f3d6beba0f5253e8d4a2ce1f9c81872c8bf474b5e6d33e33352aa801ddc5cfabcce3b6af402bd5ffdd1f291ecb789dfc7f09e83d7237b65e4c46a572fae87a7cf70f90464ac27a82209759c2139b0c9ba5ffe28be8e81289465660030261a2e674616759904118146c0cba1d577def418b7933bcdc48ae5e6134691041d9f20b4b8198df55aeab3ae3ecf6e3723bfb1aa4f7e642b40a5658561b7a46abf0cb0aca40fb023702339a0abc39d4c5dae761a4745b200c4f24cc0ec94e3484ca0e1859d87a25e9d3a093b24f0ebef836e000db10a41b7bed43" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -722,7 +722,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "50c243075006fa553e02b29605b8716b952c3dbc832d510cc0a668928de6653f52cfe4069472ca9a2aaeb42b42076e5a43768ace50e2cff5d7f65385d4a1012a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000005ac1c0dec5266e5b39a17c8deebfa34d56adc0c69d58794eb9ecfefe2705f67bee015b045396902d3012c863854ed3c1e223eca6605110616e8c9bead911db525203cb997f2cf259daf2c4bbc32e3f34ee788023b3d4b13b3b2926840de4d7170ebdcd854ce2ca95ac9b5d546e6caafb551c603842b367a5d5347a28f1f8707cedc3b59431d94180324b2cc5a93369e80dbd9e434736afed962df2a0a950700d476b9d5ca1175dbe1f955cf847fb16367c17690ed3d28447949006c32799460d69fd6f04ce3e46324ca39f2d463ca17f9a0be5302d228d83a9f9d2a77de98e084aa2474da38c74f755018a9b5f9da84bdb78b1c755b48e7b27e3216ca1551104764d45139e8aaeabfc6e7b49c330b8493603695170d2a7d94c1f055684305b335ea52b7d4ebeaed1477668d542d2e16a5c7c020a1c406d9c281541890e357a48aa498aa46d187b4d63719103cb7b29496661d3eac593e0c45965bae02262bf6d1a5b80655a05a10b8c756423b3bad79b367eaa775d6603c1f328fcdf7f37b05490e719d0b15d1bd1738855444e17036b38462c1e27ee5b7d888b4420717d8b3afca450b7a94d42f6f3cebf2dcfbf681b65aa7b5467cf4900eaf79d7f1152df5514fed1cf4ee41c3a2ee019303ef8da4b9ca0255bd05a5be311b71669c49d110a7026ae60b227a007e08fddc24db1dd2b00da84904185e9c5e524f25ec4ccab1e2828dbd9c9ab92afc166f62ef6d6a97a256c5babb805123cb8314af1718fd77e5a3228f0170cefdd7f0a595555144c51960c0532473db09a756e3e1bb2c1054b3a900da56a76b9e5a26eb8b4cc17d663ca6ab8946bcf42104705b4b1cbba4a165aa3a072b1ab06729f3afd124289a942c351ca980da5752eb48dcd8609937a72989a9bd2dee57117ad230c1346a4d52a89636a0a65db0dffb8746a8496ccef16d57bb564af1d768158156da58fefdcfe3626c131672cb3f0264b886ef923ed06c1f07b3a1d8b23b977a72d145a33367d7bd765013eb15ef36eeb0b7ac483cc09" + "value_hex": "62848ef3dae8e0829b310f657a876f553a2fb748cd70d5606358005d65a82617ca195a68d159159bda2ab9960d8ecca7aaaf039153bae0c5ca1c2fbcb002ea7000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000007080743d39724b0d600d7fbf1c2900c1870da76e4b5179fb2604a19ae0ce54653ada006091c32793974ebc2be7130b9f8c871662026644c4be7d62be69401119a281d54f562dbca44eeecd808f9a3a57335c6cc488f1c628b3e768122e2c206c1a58a202a6fd3ee903f9f4414647972a0c4605b02cd77b7c622d029a922111554e4c7896da56e766fb5505b894f4477c2c095bb0d43604e6edd788ba6b30ca03ee9fe433ae70bfe0b33c7a9f77ea02b3e3ee16afba2e098ae89b9a4151553a06196a3aaa5e725ff8722697f80089c643333e37cd2bd1d489aedc5e68473a910470850cc85599c51937b22af77260abab717eb96ff3732be89cd50b70ad172411924821c8708967d682f248031dee69086d2e2253b3ecc9bdaf7fb9c9f5b4a1705cca1c73d2ef43791146224c2a1ea5f12e793dcb0c65e6cd6a0e5d6b85377f59442197507d2818f2d138b60cf52e45a74a5f2f94485193244eaa6e00fd4adb33ce30c86a76b4f5e947bd0c5ed24507c953cff1040e32e83197742c4750805d6e046639c1b21958c36e9549ef1e86c6e70cbd51fffbd15f77ae33df6d3c64e95f2cd8e86fc535b58ce572262024c42dfef93f3b87f4e7cfbdb2d365ca6113df7efa1de3518ed107fe57b523bbe1ef183848babf190c7705044e4fc6e5bd9bbb604eba1a5576e286a7946fa401caa120bbf2ea4aa79ec3479ae96a8b06d54e6d42d6a2d4c0c738d2f3d6beba0f5253e8d4a2ce1f9c81872c8bf474b5e6d33e33352aa801ddc5cfabcce3b6af402bd5ffdd1f291ecb789dfc7f09e83d7237b65e4c46a572fae87a7cf70f90464ac27a82209759c2139b0c9ba5ffe28be8e81289465660030261a2e674616759904118146c0cba1d577def418b7933bcdc48ae5e6134691041d9f20b4b8198df55aeab3ae3ecf6e3723bfb1aa4f7e642b40a5658561b7a46abf0cb0aca40fb023702339a0abc39d4c5dae761a4745b200c4f24cc0ec94e3484ca0e1859d87a25e9d3a093b24f0ebef836e000db10a41b7bed430c07" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -734,15 +734,15 @@ "family": "transfer_composite", "expected_valid": true, "payload": { - "equality_proof_data_hex": "40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c22011236a299cf39e9b97c79547ecbc358dd5411d8d75e14a827a5b98125adf62a41c6b7bfaccf40f04df0f78492907d4c17f5516326c77c6ba2d963ea734fa75c0550c243075006fa553e02b29605b8716b952c3dbc832d510cc0a668928de6653fb2d012282a376ec1041c1a34a2e2c512e5595f110e514951b0119b1cbe6f152232e02db0049566adc25a573cfddcc1444c0e52a219a08a0366784fd6d2a5234b5e0e44952de1f99911ae5ed5f7d54e95ecf89ae82c06d7e23033097c093f784da22f2f1fee5a336c85e7cfc5b0ac907c12b020c7f0b29e4e85e005bccaf8890a89ffccba39c6cd16e2b7c88e4166bbe4f99f0996d29b18fe6e494f8660f77006670a56c03dfcfb8e1368eede259be91feadec1d54bd1dcc04b9e5208fea3e60f", - "range_proof_data_hex": "50c243075006fa553e02b29605b8716b952c3dbc832d510cc0a668928de6653f52cfe4069472ca9a2aaeb42b42076e5a43768ace50e2cff5d7f65385d4a1012a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000005ac1c0dec5266e5b39a17c8deebfa34d56adc0c69d58794eb9ecfefe2705f67bee015b045396902d3012c863854ed3c1e223eca6605110616e8c9bead911db525203cb997f2cf259daf2c4bbc32e3f34ee788023b3d4b13b3b2926840de4d7170ebdcd854ce2ca95ac9b5d546e6caafb551c603842b367a5d5347a28f1f8707cedc3b59431d94180324b2cc5a93369e80dbd9e434736afed962df2a0a950700d476b9d5ca1175dbe1f955cf847fb16367c17690ed3d28447949006c32799460d69fd6f04ce3e46324ca39f2d463ca17f9a0be5302d228d83a9f9d2a77de98e084aa2474da38c74f755018a9b5f9da84bdb78b1c755b48e7b27e3216ca1551104764d45139e8aaeabfc6e7b49c330b8493603695170d2a7d94c1f055684305b335ea52b7d4ebeaed1477668d542d2e16a5c7c020a1c406d9c281541890e357a48aa498aa46d187b4d63719103cb7b29496661d3eac593e0c45965bae02262bf6d1a5b80655a05a10b8c756423b3bad79b367eaa775d6603c1f328fcdf7f37b05490e719d0b15d1bd1738855444e17036b38462c1e27ee5b7d888b4420717d8b3afca450b7a94d42f6f3cebf2dcfbf681b65aa7b5467cf4900eaf79d7f1152df5514fed1cf4ee41c3a2ee019303ef8da4b9ca0255bd05a5be311b71669c49d110a7026ae60b227a007e08fddc24db1dd2b00da84904185e9c5e524f25ec4ccab1e2828dbd9c9ab92afc166f62ef6d6a97a256c5babb805123cb8314af1718fd77e5a3228f0170cefdd7f0a595555144c51960c0532473db09a756e3e1bb2c1054b3a900da56a76b9e5a26eb8b4cc17d663ca6ab8946bcf42104705b4b1cbba4a165aa3a072b1ab06729f3afd124289a942c351ca980da5752eb48dcd8609937a72989a9bd2dee57117ad230c1346a4d52a89636a0a65db0dffb8746a8496ccef16d57bb564af1d768158156da58fefdcfe3626c131672cb3f0264b886ef923ed06c1f07b3a1d8b23b977a72d145a33367d7bd765013eb15ef36eeb0b7ac483cc08", - "validity_proof_data_hex": "40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c22011ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c667842452cfe4069472ca9a2aaeb42b42076e5a43768ace50e2cff5d7f65385d4a1012a4cbe10e2d5f095c834e6351618aa702f3956f08022b92269d7464406e8bcd01f0059d8a86b0090a51e9a3899cd9de70147cdd2722f8d34b76c9215e79fc7d70fde69abdf3d5e237631a4eb99bad52df5d58a910a080de48ba01c0237274e8e321893a874646d2fa987cbcaf3853873533ebeaa80c5d2fc829d896805b1fe3c62b4d3e22dd3712dddc9c015f084f55ae7b6065d7661024646e126805a1ef9173f340d09f755e86c9b7b9d14ef5f043f73d93f13ae49f424d6bf86f22283e995074abf7ee0182eacb5cae95578982e938e95cb561ed692b3f1bb3c239d41b2437cd21314e84600da1c52483aa4efa1f5951cbcb0f35e7234acc0d08cb9b51f1f382c1c1d432f49959cd585fb8b54bec2b5b2c6dceb71e3ad6807de38bb56f4a20e5c27cb82c7002e7b95d8a9d406d175fe6570f3b315955a9e6e105b9e8ab5880e" + "equality_proof_data_hex": "367592922b37fa321fc37bc38bf434685507162e731982c1b188fba562ae3472d8b5fb228481cc146564a6c22858c5e31cfeb8b1ee78b74c31a10110ccbaf715d8c14cdbd78cc59e711eb240228d35a5049b5603f94566b87e51eb3985b3c7393ea5e84e8efe3dc959d1353b5d900e4402ed3c973c95b00f3f74d63b3c218e3dccfbdb9337e05280b77e1e27e005ce9d384736d776b4fd048b0e3383e7e54236501792318e65d6f631815ccface56a09749fb8cbc4992a8e586bd62631d2e21edca2671e0c30f688003da6dcdf9badf46fdb152ad70dd2109850c151e834277615ce51c0524159783f40fd89eed6befcbb8010577cc30cbc06bc4395951ead0e6d35e7045e0cab5f2f2958976de5c6a63150af716619332b1e177121640da903cce98f0359777130d295be42d1e563bc2ae8250fae45e9841b4715f28511c40a", + "range_proof_data_hex": "3ea5e84e8efe3dc959d1353b5d900e4402ed3c973c95b00f3f74d63b3c218e3dc6fb2677b32ba074ae704b00bac35f801220c61a18a926d3346689a02f8d580c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404000000000000036edbbf24cc4a19ef85971585a61a5268fa2cae2be7c4ccdeb3d13e5813e6f3fd263565e97533c4c1769d5c13fb617dbbf86f3c321c220068d6441db89225370a071ed4c8e6d07980883269c0dce134d89ae4e7865539a62b211dbd5933dc30d501b4ddd9e97cbacab01399a4dd3425d5e8cb18fb9587364314ca0b25b21925ce57b4f63b0f08db62823232b1ada3924f0c859dd656338a70c8d2fb35ffbe1045cca4ac662e7babbc22bab545972ad3d69568279e5c8d84fb2d1689bc8c0350792f7ea76a7c2eec62630ffe3182047ceba3cf8129c52357653d5ed8f83c32b037668118defd827068e00f4fc5bedea7bb376fd4334222481d750578b74f272523689bddaf39a5ea959fa3377f84fa72061edcfddf741480f7630790a9dd42c5ee67df7565a85b763bf261b83705487bff8b8fd1d26de70efdd050a5b7d67cf0e646076c0a8ebf389a9e4fef2c6733f52491252a45042a6e84b8ebd950b4e5242e88b6cb9a754181a3295253af986eee95c21de53e9a18a9a08dfb2e7b96a85127aaa7ebc102f06483f16858a34926ada16ecca4d1a4cfb5fc46ac1377075f97b52b1d1166116b870610b15e5c3d72e9787a0a835c7ac59dc29a0ba7b9dc2be2422f1a9fa9b4a06851e3bddc3ec07e6364b05175513d1c012e117ebccf09c8f4584de80f66a50d92c209b62fdcff7d5222b7d8304d15b493b19e473928ede3965f08bb80019e33b38d084a3d706f0557d56d88693e0222ba4beb4049d1c86c43eb20ecbd0fa1d75b0bbe08c51581bf33e6d66894c9a368ec2081c2ed1b7f465095cdc5eb019e47a950993f491e6a5598b817b6f01cc78d454cd47bc34230bed590e06de9d33ce7e3e34824c7f56df061e59f56a862075aa0678efe1ec2bffba33e803797d3dbf6076d3d843c00035b9d6711a24208457cde6b2b1ee92b7ca412048de07c68ad559a903193d407f39ae05c85c69fc0bcf61d49c82b6f3a5ae3b0b23f581d39fb2f5aeecb5547090959c49a1cee4e399c6e2aee25961017e8c3404", + "validity_proof_data_hex": "367592922b37fa321fc37bc38bf434685507162e731982c1b188fba562ae34729446fe67f5a6f4c607a9aff001fc39dba92ce6174ad9f219b07dcf312f672a7ac6fb2677b32ba074ae704b00bac35f801220c61a18a926d3346689a02f8d580caecfff2720178f9b733eaf7975bcfb25a468b00cbd295b03356ca289f05a621e2eee02ba38c11638932827ef3a54f92ae8292f065b3c105448d859d8b7a0dc6326800926a5ee27afc12168734e98d766066e5070be808a61f3d1f91c95ba7f083ed12f028df004262338ed8da3c8425a22108f99d9b301086742e2f01955f433da4402d04df8bee013e6c1bee4b848e573c846bbbf936742b38d20c7a906707508cf9915a1a40f978fc4a90879770f4f1159a90eff3b272f4f25f862639f7e2ce841c8aa84143cdfe9bdbc03b3ea95e5a6738188f371cf4e5c246fad1f531c6928eeb83a15e8834b5af3f4cbdf20050e480f843c8a8f2677678d8f4b9f27ec4a321e4a393eb903bc180b775c1b52f94f112b8b0d41429ebc6616c32ac9272f0f904cbe88dd0ec59b874773b22ef5324ec104aa2240389cbe16df6c8c7d8d410a" }, "binding": { - "current_balance_commitment_hex": "02a6581c395c5927de61ac07a370d015aa92f54d7f0724be7b9902bb9def0816", - "current_balance_handle_hex": "3ebad8cc2883c8ef5302472c0ab192ea2da8f02a984ca69fa88592b8ae27fe6e", - "recipient_pubkey_hex": "1ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c6678424", - "sender_pubkey_hex": "40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c2201" + "current_balance_commitment_hex": "32d3edc6e2f0c781b39b9222e8447f85c290598ca4f9914f386323b23d4b5408", + "current_balance_handle_hex": "069aa7f7c34147b31ae095425695a38be560c014a6c880f2e6054ab616bff06d", + "recipient_pubkey_hex": "9446fe67f5a6f4c607a9aff001fc39dba92ce6174ad9f219b07dcf312f672a7a", + "sender_pubkey_hex": "367592922b37fa321fc37bc38bf434685507162e731982c1b188fba562ae3472" }, "mutations": [ { @@ -760,7 +760,7 @@ "op": "bitflip", "target": "binding.sender_pubkey_hex", "params": { - "value_hex": "41b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c2201" + "value_hex": "377592922b37fa321fc37bc38bf434685507162e731982c1b188fba562ae3472" }, "expected_valid": false, "expected_error_contains": "failed" @@ -770,7 +770,7 @@ "op": "bitflip", "target": "binding.recipient_pubkey_hex", "params": { - "value_hex": "1bda8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c6678424" + "value_hex": "9546fe67f5a6f4c607a9aff001fc39dba92ce6174ad9f219b07dcf312f672a7a" }, "expected_valid": false, "expected_error_contains": "failed" @@ -790,7 +790,7 @@ "op": "truncate", "target": "payload.range_proof_data_hex", "params": { - "value_hex": "50c243075006fa553e02b29605b8716b952c3dbc832d510cc0a668928de6653f52cfe4069472ca9a2aaeb42b42076e5a43768ace50e2cff5d7f65385d4a1012a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000005ac1c0dec5266e5b39a17c8deebfa34d56adc0c69d58794eb9ecfefe2705f67bee015b045396902d3012c863854ed3c1e223eca6605110616e8c9bead911db525203cb997f2cf259daf2c4bbc32e3f34ee788023b3d4b13b3b2926840de4d7170ebdcd854ce2ca95ac9b5d546e6caafb551c603842b367a5d5347a28f1f8707cedc3b59431d94180324b2cc5a93369e80dbd9e434736afed962df2a0a950700d476b9d5ca1175dbe1f955cf847fb16367c17690ed3d28447949006c32799460d69fd6f04ce3e46324ca39f2d463ca17f9a0be5302d228d83a9f9d2a77de98e084aa2474da38c74f755018a9b5f9da84bdb78b1c755b48e7b27e3216ca1551104764d45139e8aaeabfc6e7b49c330b8493603695170d2a7d94c1f055684305b335ea52b7d4ebeaed1477668d542d2e16a5c7c020a1c406d9c281541890e357a48aa498aa46d187b4d63719103cb7b29496661d3eac593e0c45965bae02262bf6d1a5b80655a05a10b8c756423b3bad79b367eaa775d6603c1f328fcdf7f37b05490e719d0b15d1bd1738855444e17036b38462c1e27ee5b7d888b4420717d8b3afca450b7a94d42f6f3cebf2dcfbf681b65aa7b5467cf4900eaf79d7f1152df5514fed1cf4ee41c3a2ee019303ef8da4b9ca0255bd05a5be311b71669c49d110a7026ae60b227a007e08fddc24db1dd2b00da84904185e9c5e524f25ec4ccab1e2828dbd9c9ab92afc166f62ef6d6a97a256c5babb805123cb8314af1718fd77e5a3228f0170cefdd7f0a595555144c51960c0532473db09a756e3e1bb2c1054b3a900da56a76b9e5a26eb8b4cc17d663ca6ab8946bcf42104705b4b1cbba4a165aa3a072b1ab06729f3afd124289a942c351ca980da5752eb48dcd8609937a72989a9bd2dee57117ad230c1346a4d52a89636a0a65db0dffb8746a8496ccef16d57bb564af1d768158156da58fefdcfe3626c131672cb3f0264b886ef923ed06c1f07b3a1d8b23b977a72d145a33367d7bd765013eb15ef36eeb0b7ac483" + "value_hex": "3ea5e84e8efe3dc959d1353b5d900e4402ed3c973c95b00f3f74d63b3c218e3dc6fb2677b32ba074ae704b00bac35f801220c61a18a926d3346689a02f8d580c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404000000000000036edbbf24cc4a19ef85971585a61a5268fa2cae2be7c4ccdeb3d13e5813e6f3fd263565e97533c4c1769d5c13fb617dbbf86f3c321c220068d6441db89225370a071ed4c8e6d07980883269c0dce134d89ae4e7865539a62b211dbd5933dc30d501b4ddd9e97cbacab01399a4dd3425d5e8cb18fb9587364314ca0b25b21925ce57b4f63b0f08db62823232b1ada3924f0c859dd656338a70c8d2fb35ffbe1045cca4ac662e7babbc22bab545972ad3d69568279e5c8d84fb2d1689bc8c0350792f7ea76a7c2eec62630ffe3182047ceba3cf8129c52357653d5ed8f83c32b037668118defd827068e00f4fc5bedea7bb376fd4334222481d750578b74f272523689bddaf39a5ea959fa3377f84fa72061edcfddf741480f7630790a9dd42c5ee67df7565a85b763bf261b83705487bff8b8fd1d26de70efdd050a5b7d67cf0e646076c0a8ebf389a9e4fef2c6733f52491252a45042a6e84b8ebd950b4e5242e88b6cb9a754181a3295253af986eee95c21de53e9a18a9a08dfb2e7b96a85127aaa7ebc102f06483f16858a34926ada16ecca4d1a4cfb5fc46ac1377075f97b52b1d1166116b870610b15e5c3d72e9787a0a835c7ac59dc29a0ba7b9dc2be2422f1a9fa9b4a06851e3bddc3ec07e6364b05175513d1c012e117ebccf09c8f4584de80f66a50d92c209b62fdcff7d5222b7d8304d15b493b19e473928ede3965f08bb80019e33b38d084a3d706f0557d56d88693e0222ba4beb4049d1c86c43eb20ecbd0fa1d75b0bbe08c51581bf33e6d66894c9a368ec2081c2ed1b7f465095cdc5eb019e47a950993f491e6a5598b817b6f01cc78d454cd47bc34230bed590e06de9d33ce7e3e34824c7f56df061e59f56a862075aa0678efe1ec2bffba33e803797d3dbf6076d3d843c00035b9d6711a24208457cde6b2b1ee92b7ca412048de07c68ad559a903193d407f39ae05c85c69fc0bcf61d49c82b6f3a5ae3b0b23f581d39fb2f5aeecb5547090959c49a1cee4e399c6e2aee25961017e8c" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -802,7 +802,7 @@ "family": "equality", "expected_valid": true, "payload": { - "proof_data_hex": "1ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c6678424f849a1a283866adfa29de0a9129357d99819e49271d8e5bf5d10c5cdc6211065de9e14e599f38716d66b5fc846e1d80f2052d34501e46bf5835890aadda99848c2bf90b0a1fa2a1fa6f61a2537b869e18268422f6a768c5e645b05d58792260b8acb23f53bc3efae4befae5f8179651fbf7e8e47a7cb1b17fa292947d1594f372029db7fffbefacc923802936bf76f3a9e7b4f1023109f24fd47370eb5485d3dd4fd48f967799e461b05aa95d8c57a6fa0aa6e4356e2aaa8f4ee36110899a168be350a2a62deef1e46f9437bfd88b48f7f28dea75d97fc5ed0ebe5088ecc2108b383f78e10dc2789aecfcffdafdc622dac8be78167c69e9736393ee095968c074dd956cf31198737620b03a4cf0ffdc0d7390263fab922827c281eff83fff908" + "proof_data_hex": "9446fe67f5a6f4c607a9aff001fc39dba92ce6174ad9f219b07dcf312f672a7a703b860a2c0a3309ad51dd57e72c5ad58b9d7c50f26c61c2e250adae72aa7b7b823bfb1a3ff0af4cf9c963e44e4a30ff5ea7379eaa1095fbbd930a707558b53758a1e97be3f3da75369b92c4e6c552fcf7a05db2f8ef8467121e2acf0ff3316c72b5513c9cb4af1683f896b162c61ea03b1d9ae8aff919adbeef668a6ed9a228f060dfeb3b9adc3ea3a43bcb5a9fbb179ef6461bdd0b634fd014739453b4ed1d6eee54e40566f96115ac7c491b61bcc420211f7277b2deab8ed41b518885f148961ccb758fdb83ecf7eb17b6e902f12691ab7998181913df19eae2d075ed360dc7c7a6f31159a94f3d26ea38521f7bb6307013ff1c79407bb529a3bfdc300b0bff81a7011db13bd1613f0bf28ec657f11a13c252469ed7faa12c248c3da5490a" }, "mutations": [ { @@ -810,7 +810,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "1bda8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c6678424f849a1a283866adfa29de0a9129357d99819e49271d8e5bf5d10c5cdc6211065de9e14e599f38716d66b5fc846e1d80f2052d34501e46bf5835890aadda99848c2bf90b0a1fa2a1fa6f61a2537b869e18268422f6a768c5e645b05d58792260b8acb23f53bc3efae4befae5f8179651fbf7e8e47a7cb1b17fa292947d1594f372029db7fffbefacc923802936bf76f3a9e7b4f1023109f24fd47370eb5485d3dd4fd48f967799e461b05aa95d8c57a6fa0aa6e4356e2aaa8f4ee36110899a168be350a2a62deef1e46f9437bfd88b48f7f28dea75d97fc5ed0ebe5088ecc2108b383f78e10dc2789aecfcffdafdc622dac8be78167c69e9736393ee095968c074dd956cf31198737620b03a4cf0ffdc0d7390263fab922827c281eff83fff908" + "value_hex": "9546fe67f5a6f4c607a9aff001fc39dba92ce6174ad9f219b07dcf312f672a7a703b860a2c0a3309ad51dd57e72c5ad58b9d7c50f26c61c2e250adae72aa7b7b823bfb1a3ff0af4cf9c963e44e4a30ff5ea7379eaa1095fbbd930a707558b53758a1e97be3f3da75369b92c4e6c552fcf7a05db2f8ef8467121e2acf0ff3316c72b5513c9cb4af1683f896b162c61ea03b1d9ae8aff919adbeef668a6ed9a228f060dfeb3b9adc3ea3a43bcb5a9fbb179ef6461bdd0b634fd014739453b4ed1d6eee54e40566f96115ac7c491b61bcc420211f7277b2deab8ed41b518885f148961ccb758fdb83ecf7eb17b6e902f12691ab7998181913df19eae2d075ed360dc7c7a6f31159a94f3d26ea38521f7bb6307013ff1c79407bb529a3bfdc300b0bff81a7011db13bd1613f0bf28ec657f11a13c252469ed7faa12c248c3da5490a" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -820,7 +820,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "1ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c6678424f849a1a283866adfa29de0a9129357d99819e49271d8e5bf5d10c5cdc6211065de9e14e599f38716d66b5fc846e1d80f2052d34501e46bf5835890aadda99848c2bf90b0a1fa2a1fa6f61a2537b869e18268422f6a768c5e645b05d58792260b8acb23f53bc3efae4befae5f8179651fbf7e8e47a7cb1b17fa292947d1594f372029db7fffbefacc923802936bf76f3a9e7b4f1023109f24fd47370eb5485d3dd4fd48f967799e461b05aa95d8c57a6fa0aa6e4356e2aaa8f4ee36110899a168be350a2a62deef1e46f9437bfd88b48f7f28dea75d97fc5ed0ebe5088ecc2108b383f78e10dc2789aecfcffdafdc622dac8be78167c69e9736393ee095968c074dd956cf31198737620b03a4cf0ffdc0d7390263fab922827c281eff83ff" + "value_hex": "9446fe67f5a6f4c607a9aff001fc39dba92ce6174ad9f219b07dcf312f672a7a703b860a2c0a3309ad51dd57e72c5ad58b9d7c50f26c61c2e250adae72aa7b7b823bfb1a3ff0af4cf9c963e44e4a30ff5ea7379eaa1095fbbd930a707558b53758a1e97be3f3da75369b92c4e6c552fcf7a05db2f8ef8467121e2acf0ff3316c72b5513c9cb4af1683f896b162c61ea03b1d9ae8aff919adbeef668a6ed9a228f060dfeb3b9adc3ea3a43bcb5a9fbb179ef6461bdd0b634fd014739453b4ed1d6eee54e40566f96115ac7c491b61bcc420211f7277b2deab8ed41b518885f148961ccb758fdb83ecf7eb17b6e902f12691ab7998181913df19eae2d075ed360dc7c7a6f31159a94f3d26ea38521f7bb6307013ff1c79407bb529a3bfdc300b0bff81a7011db13bd1613f0bf28ec657f11a13c252469ed7faa12c248c3da5" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -842,7 +842,7 @@ "family": "validity", "expected_valid": true, "payload": { - "proof_data_hex": "1ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c667842436d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317988684c294aa7c4af9bafe5088e97dc98eaac87fa2c82baddbfe2d677c70b03636ff1659ec34d2e304ba028056b9b681b89bb1b6a48cfbdb3f4383e97f5a0f09dcb5366e9ec6d108e6153206c5fa1a69adc7e3cf1bac32c48633bed114e44128947fee79800d128c84543d639a5156dbc8d58b1d781f4340d4eb8e98dfef3f369c409a5f5956e7774b3ade6375fbc4beef593c65e6e35f254a4e8f6c82bbf0656c4444ce46ec59fc44b42dd1d71d2b4f4126fc848a79f5237f0e87cb34c8ec0ae216f3a3b6a6ea216c42386aefabcb804c1f2bf1854743519c194b15f17426787ce14053b539dd3f908113cf2bce8c8a6e8c56abf62a56152ea4f13bccf0bc36f2e312bd3dbc17a2b8051f5813b91872f5c81bd03be718d4bd18393af89a775f82304e5faf82ac22c4b35357d1ef8ad42586e9b2533db9f173e1adaee27c030dbfc34ac8026b78ec2605977d9eb0969b85e54c835695a68562778d1aaa9de602" + "proof_data_hex": "9446fe67f5a6f4c607a9aff001fc39dba92ce6174ad9f219b07dcf312f672a7ab0aea323b18453bbf74f03044da9dd93e19f5f50bd125f8d376ae6dc74d35701ba3bcd1fa8ab509570047cdb1adaf05625fa487d622a7c7da4ac6c2b96c8bf43541e0de655999ad4823eddf4a4dcd3848e94423ef727b47b45ebc6c52072b55f80903a109c333e6d23c32504cdb4ded8e42a2210bfd1eb6a342b2003601b853b049c960f5ef639057718f301606ccccd7ec0334b0682e5141b3db5866d6f073b54ea68d1873053b7e54a24d5eb14beba1ef3fd34e12ee77fc119a4fe46342872fea08c3388ad29a67dbf1330a47c8f3e9fe42884fe141966ae4dcfb25c68823e9cd6dd536ed28b67bee586e133223438a2d18ad791a4c18aede9e57252a3ba41243c8c63066e956a4b10138235d25f29904d170b0d1f7854fbc0b608605fa16540a5b7fb4673ee6f8501d1252ac8c0822952f5d90e3c9b77bd9e8148e62bb91af8c98388cc929e6f6b2d695261af82e09a49dfb1f72eb28848fb64b07b78d903566bd60a441193b8b2279779f217a6bbb7acb63abd6eec244e84710483dad10b" }, "mutations": [ { @@ -850,7 +850,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "1bda8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c667842436d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317988684c294aa7c4af9bafe5088e97dc98eaac87fa2c82baddbfe2d677c70b03636ff1659ec34d2e304ba028056b9b681b89bb1b6a48cfbdb3f4383e97f5a0f09dcb5366e9ec6d108e6153206c5fa1a69adc7e3cf1bac32c48633bed114e44128947fee79800d128c84543d639a5156dbc8d58b1d781f4340d4eb8e98dfef3f369c409a5f5956e7774b3ade6375fbc4beef593c65e6e35f254a4e8f6c82bbf0656c4444ce46ec59fc44b42dd1d71d2b4f4126fc848a79f5237f0e87cb34c8ec0ae216f3a3b6a6ea216c42386aefabcb804c1f2bf1854743519c194b15f17426787ce14053b539dd3f908113cf2bce8c8a6e8c56abf62a56152ea4f13bccf0bc36f2e312bd3dbc17a2b8051f5813b91872f5c81bd03be718d4bd18393af89a775f82304e5faf82ac22c4b35357d1ef8ad42586e9b2533db9f173e1adaee27c030dbfc34ac8026b78ec2605977d9eb0969b85e54c835695a68562778d1aaa9de602" + "value_hex": "9546fe67f5a6f4c607a9aff001fc39dba92ce6174ad9f219b07dcf312f672a7ab0aea323b18453bbf74f03044da9dd93e19f5f50bd125f8d376ae6dc74d35701ba3bcd1fa8ab509570047cdb1adaf05625fa487d622a7c7da4ac6c2b96c8bf43541e0de655999ad4823eddf4a4dcd3848e94423ef727b47b45ebc6c52072b55f80903a109c333e6d23c32504cdb4ded8e42a2210bfd1eb6a342b2003601b853b049c960f5ef639057718f301606ccccd7ec0334b0682e5141b3db5866d6f073b54ea68d1873053b7e54a24d5eb14beba1ef3fd34e12ee77fc119a4fe46342872fea08c3388ad29a67dbf1330a47c8f3e9fe42884fe141966ae4dcfb25c68823e9cd6dd536ed28b67bee586e133223438a2d18ad791a4c18aede9e57252a3ba41243c8c63066e956a4b10138235d25f29904d170b0d1f7854fbc0b608605fa16540a5b7fb4673ee6f8501d1252ac8c0822952f5d90e3c9b77bd9e8148e62bb91af8c98388cc929e6f6b2d695261af82e09a49dfb1f72eb28848fb64b07b78d903566bd60a441193b8b2279779f217a6bbb7acb63abd6eec244e84710483dad10b" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -860,7 +860,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "1ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c667842436d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317988684c294aa7c4af9bafe5088e97dc98eaac87fa2c82baddbfe2d677c70b03636ff1659ec34d2e304ba028056b9b681b89bb1b6a48cfbdb3f4383e97f5a0f09dcb5366e9ec6d108e6153206c5fa1a69adc7e3cf1bac32c48633bed114e44128947fee79800d128c84543d639a5156dbc8d58b1d781f4340d4eb8e98dfef3f369c409a5f5956e7774b3ade6375fbc4beef593c65e6e35f254a4e8f6c82bbf0656c4444ce46ec59fc44b42dd1d71d2b4f4126fc848a79f5237f0e87cb34c8ec0ae216f3a3b6a6ea216c42386aefabcb804c1f2bf1854743519c194b15f17426787ce14053b539dd3f908113cf2bce8c8a6e8c56abf62a56152ea4f13bccf0bc36f2e312bd3dbc17a2b8051f5813b91872f5c81bd03be718d4bd18393af89a775f82304e5faf82ac22c4b35357d1ef8ad42586e9b2533db9f173e1adaee27c030dbfc34ac8026b78ec2605977d9eb0969b85e54c835695a68562778d1aaa9d" + "value_hex": "9446fe67f5a6f4c607a9aff001fc39dba92ce6174ad9f219b07dcf312f672a7ab0aea323b18453bbf74f03044da9dd93e19f5f50bd125f8d376ae6dc74d35701ba3bcd1fa8ab509570047cdb1adaf05625fa487d622a7c7da4ac6c2b96c8bf43541e0de655999ad4823eddf4a4dcd3848e94423ef727b47b45ebc6c52072b55f80903a109c333e6d23c32504cdb4ded8e42a2210bfd1eb6a342b2003601b853b049c960f5ef639057718f301606ccccd7ec0334b0682e5141b3db5866d6f073b54ea68d1873053b7e54a24d5eb14beba1ef3fd34e12ee77fc119a4fe46342872fea08c3388ad29a67dbf1330a47c8f3e9fe42884fe141966ae4dcfb25c68823e9cd6dd536ed28b67bee586e133223438a2d18ad791a4c18aede9e57252a3ba41243c8c63066e956a4b10138235d25f29904d170b0d1f7854fbc0b608605fa16540a5b7fb4673ee6f8501d1252ac8c0822952f5d90e3c9b77bd9e8148e62bb91af8c98388cc929e6f6b2d695261af82e09a49dfb1f72eb28848fb64b07b78d903566bd60a441193b8b2279779f217a6bbb7acb63abd6eec244e84710483da" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -882,7 +882,7 @@ "family": "transfer_range", "expected_valid": true, "payload": { - "proof_data_hex": "c2bf90b0a1fa2a1fa6f61a2537b869e18268422f6a768c5e645b05d58792260b988684c294aa7c4af9bafe5088e97dc98eaac87fa2c82baddbfe2d677c70b0360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000b06e188034e39e920bdf01d484a52ea0a6ef3d0ed16b7dd50309b93c77c6fb0d90e293abdf7638041e311d9cf8244b537750e4cb5f9ba623403193057797cd4ce0e24a6cad35fd8d4bc002ee1dfcb00ddd177a2b657eae7bb05039ad055a4c42906e761896d4fc7953a5738be310967b0e45986d178cdcda22383b8a6e1d20617f479f37a705c8f1fd50388a2c72c70efdd0094c15e50af81febe8e998e48704d2b69dd075d0ace9a5b8e00595dafd2738b70e1694846d782c8922d1edde5e063c59b5a33701e6fab289051b37a1fd5a192cc095a3ad3539a640bbdb5fbe0302985ba0b4308e9a9dfcdd0194e6a62f02b7fdc953eda5f50c2054f3b4a031604ae43d490dce122289b9870cd75b5b5a6e296df222fed4b619e8a68ed1bea28d3378fa058c60ac6dac636def72b26874c8c727dbbc8688b105aa4b1be4eb01e76f084dd7d532e3abd1ec620215119101ddcc004a16b0ac4e70dd9d8ecb556b4141cc8a9a045af6f2de18e345b698cfb751204aa8503a77944a233395f344b0bb7c38567735c56a47f98484191eebce1fd9526e9d7904832dbbcdeb008152b28c2a7e3a6ee4348eb35d81398eaa23ee04ef5f1c07244262c91a55e05950ef64152848a4057af9bff6a2c5a0118ba683e90a76df520e24e7cc3469090c058b03ab467e7f07af7f4c4938920a781f4e138de05c1f48af7489d4929e95176e3833d37246c096fce49b3a043b1774b8eb1b8add2520f9c1105a52dfc150c38923681d15fe71bd50917069920b6ba0758d89744cfd7ff7ba27ebffc8053bad5b7e9d8436c2676f6349a5dde752af834ed7a158c12681b8779b04a4ca81f35520742ffe73c0f23a9b995dc447a79942231ada8294e48a2e5d896f7284f601c73cc865601fb056c0745cba34017297aa49682028ab357e67215f64bd4904ffa3fc4bf89975f587f0c4d77df562a6b6e1a2aa8645b2984485d70715a5fde7a85756beac9c08e8f6561539c27fce055f492f91fecc5b876400406ad36b0306395ab2cf77440e" + "proof_data_hex": "58a1e97be3f3da75369b92c4e6c552fcf7a05db2f8ef8467121e2acf0ff3316cba3bcd1fa8ab509570047cdb1adaf05625fa487d622a7c7da4ac6c2b96c8bf430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000e81c637b21a06ce1e38bcbbff0cc6e45b2d28f52c63d1cdaf7adf5cfce16832ffcd00c08261f06612aaec9474fa1c1e184ee269e9e48de40a1144760bc5feb48b05c1e1edd0b6c80e76ec1e6537fde9afca4fe5db493abfd745a18d232a8fc190480d0127192941effd7bc78e08f6c5bddd848072b07b0e93f776ce3220f4e484e9cbe8e2a2ce6e0156cef36b736a76d126b52e2aef7a4a178cdb8bfc9db8a070e86f0a02c979afada59a8b71cf51fe4d0c90a0ba9ce62bc15c8c235b0a56d03aa3dc8347ad69806c63618f76d81ebca8e55bd32c78f2552e90caa94a6c8000a52c966f7f7c4d2cdac1e2ff03c68f2afa8c96eae5881547e6de4d2ce39fb6d53e43b7af1d4bcb01aa9d1f837cb7f1b664af1c934f0ba87a494b0e26908f8a42d9a6e55fab2315e7ba98006c9b39753497d0d128ca0bd8c430e669bdac202911114ca1ab6c3b5e0f0d23764d0630b6be7fd24f27cb74fd5f1e7e7f6e53da5c177aaff15263f31b52c56441b4aa245fe215feece5bf262683323d5c433e43c8a689a20b047c7f18ad1f785be9df72b2c83697b6308f37e72b78e543d0cdc975f1ec84ea3d2438e842b43c12b18c4ccd0926db7c03374481f62f4a38cf9835a076c5c14ac094d9f3c100903aaae2c1fad5251bf8181b9d43ec4025755ba53b49517587aad124331019b2d685babd9b302a29faee29228e2f1ad28e24492a5b9451de6674341baf5587a37d4108dd356e6f4e2dc1863804e5029af25d7b60f856913d49b63653a7c1444fa3ac43a63b54f657c0f52f7fbeb88f32300777d2646f15d2ac4f09f1b7bce999d96513a5f589d10f8b8d126b462a47fb6adc9e80afa675dc87d6f39919f846644e785f46ec5de62381b7834fd19d6dab75ddeeb0d5aeb4ae4272129275f52fba52ad13465560971bcd7af7f488c063afb3328d090387059f39f3574e969159edc26f904ea1a715d0fac51dc38aa9954db959f0d914f2d0c222bd00df06ef35e68d0ee68b1346e4b9db5bcd6452f0509a23864be1c2f7d07" }, "mutations": [ { @@ -890,7 +890,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "c3bf90b0a1fa2a1fa6f61a2537b869e18268422f6a768c5e645b05d58792260b988684c294aa7c4af9bafe5088e97dc98eaac87fa2c82baddbfe2d677c70b0360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000b06e188034e39e920bdf01d484a52ea0a6ef3d0ed16b7dd50309b93c77c6fb0d90e293abdf7638041e311d9cf8244b537750e4cb5f9ba623403193057797cd4ce0e24a6cad35fd8d4bc002ee1dfcb00ddd177a2b657eae7bb05039ad055a4c42906e761896d4fc7953a5738be310967b0e45986d178cdcda22383b8a6e1d20617f479f37a705c8f1fd50388a2c72c70efdd0094c15e50af81febe8e998e48704d2b69dd075d0ace9a5b8e00595dafd2738b70e1694846d782c8922d1edde5e063c59b5a33701e6fab289051b37a1fd5a192cc095a3ad3539a640bbdb5fbe0302985ba0b4308e9a9dfcdd0194e6a62f02b7fdc953eda5f50c2054f3b4a031604ae43d490dce122289b9870cd75b5b5a6e296df222fed4b619e8a68ed1bea28d3378fa058c60ac6dac636def72b26874c8c727dbbc8688b105aa4b1be4eb01e76f084dd7d532e3abd1ec620215119101ddcc004a16b0ac4e70dd9d8ecb556b4141cc8a9a045af6f2de18e345b698cfb751204aa8503a77944a233395f344b0bb7c38567735c56a47f98484191eebce1fd9526e9d7904832dbbcdeb008152b28c2a7e3a6ee4348eb35d81398eaa23ee04ef5f1c07244262c91a55e05950ef64152848a4057af9bff6a2c5a0118ba683e90a76df520e24e7cc3469090c058b03ab467e7f07af7f4c4938920a781f4e138de05c1f48af7489d4929e95176e3833d37246c096fce49b3a043b1774b8eb1b8add2520f9c1105a52dfc150c38923681d15fe71bd50917069920b6ba0758d89744cfd7ff7ba27ebffc8053bad5b7e9d8436c2676f6349a5dde752af834ed7a158c12681b8779b04a4ca81f35520742ffe73c0f23a9b995dc447a79942231ada8294e48a2e5d896f7284f601c73cc865601fb056c0745cba34017297aa49682028ab357e67215f64bd4904ffa3fc4bf89975f587f0c4d77df562a6b6e1a2aa8645b2984485d70715a5fde7a85756beac9c08e8f6561539c27fce055f492f91fecc5b876400406ad36b0306395ab2cf77440e" + "value_hex": "59a1e97be3f3da75369b92c4e6c552fcf7a05db2f8ef8467121e2acf0ff3316cba3bcd1fa8ab509570047cdb1adaf05625fa487d622a7c7da4ac6c2b96c8bf430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000e81c637b21a06ce1e38bcbbff0cc6e45b2d28f52c63d1cdaf7adf5cfce16832ffcd00c08261f06612aaec9474fa1c1e184ee269e9e48de40a1144760bc5feb48b05c1e1edd0b6c80e76ec1e6537fde9afca4fe5db493abfd745a18d232a8fc190480d0127192941effd7bc78e08f6c5bddd848072b07b0e93f776ce3220f4e484e9cbe8e2a2ce6e0156cef36b736a76d126b52e2aef7a4a178cdb8bfc9db8a070e86f0a02c979afada59a8b71cf51fe4d0c90a0ba9ce62bc15c8c235b0a56d03aa3dc8347ad69806c63618f76d81ebca8e55bd32c78f2552e90caa94a6c8000a52c966f7f7c4d2cdac1e2ff03c68f2afa8c96eae5881547e6de4d2ce39fb6d53e43b7af1d4bcb01aa9d1f837cb7f1b664af1c934f0ba87a494b0e26908f8a42d9a6e55fab2315e7ba98006c9b39753497d0d128ca0bd8c430e669bdac202911114ca1ab6c3b5e0f0d23764d0630b6be7fd24f27cb74fd5f1e7e7f6e53da5c177aaff15263f31b52c56441b4aa245fe215feece5bf262683323d5c433e43c8a689a20b047c7f18ad1f785be9df72b2c83697b6308f37e72b78e543d0cdc975f1ec84ea3d2438e842b43c12b18c4ccd0926db7c03374481f62f4a38cf9835a076c5c14ac094d9f3c100903aaae2c1fad5251bf8181b9d43ec4025755ba53b49517587aad124331019b2d685babd9b302a29faee29228e2f1ad28e24492a5b9451de6674341baf5587a37d4108dd356e6f4e2dc1863804e5029af25d7b60f856913d49b63653a7c1444fa3ac43a63b54f657c0f52f7fbeb88f32300777d2646f15d2ac4f09f1b7bce999d96513a5f589d10f8b8d126b462a47fb6adc9e80afa675dc87d6f39919f846644e785f46ec5de62381b7834fd19d6dab75ddeeb0d5aeb4ae4272129275f52fba52ad13465560971bcd7af7f488c063afb3328d090387059f39f3574e969159edc26f904ea1a715d0fac51dc38aa9954db959f0d914f2d0c222bd00df06ef35e68d0ee68b1346e4b9db5bcd6452f0509a23864be1c2f7d07" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -900,7 +900,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "c2bf90b0a1fa2a1fa6f61a2537b869e18268422f6a768c5e645b05d58792260b988684c294aa7c4af9bafe5088e97dc98eaac87fa2c82baddbfe2d677c70b0360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000b06e188034e39e920bdf01d484a52ea0a6ef3d0ed16b7dd50309b93c77c6fb0d90e293abdf7638041e311d9cf8244b537750e4cb5f9ba623403193057797cd4ce0e24a6cad35fd8d4bc002ee1dfcb00ddd177a2b657eae7bb05039ad055a4c42906e761896d4fc7953a5738be310967b0e45986d178cdcda22383b8a6e1d20617f479f37a705c8f1fd50388a2c72c70efdd0094c15e50af81febe8e998e48704d2b69dd075d0ace9a5b8e00595dafd2738b70e1694846d782c8922d1edde5e063c59b5a33701e6fab289051b37a1fd5a192cc095a3ad3539a640bbdb5fbe0302985ba0b4308e9a9dfcdd0194e6a62f02b7fdc953eda5f50c2054f3b4a031604ae43d490dce122289b9870cd75b5b5a6e296df222fed4b619e8a68ed1bea28d3378fa058c60ac6dac636def72b26874c8c727dbbc8688b105aa4b1be4eb01e76f084dd7d532e3abd1ec620215119101ddcc004a16b0ac4e70dd9d8ecb556b4141cc8a9a045af6f2de18e345b698cfb751204aa8503a77944a233395f344b0bb7c38567735c56a47f98484191eebce1fd9526e9d7904832dbbcdeb008152b28c2a7e3a6ee4348eb35d81398eaa23ee04ef5f1c07244262c91a55e05950ef64152848a4057af9bff6a2c5a0118ba683e90a76df520e24e7cc3469090c058b03ab467e7f07af7f4c4938920a781f4e138de05c1f48af7489d4929e95176e3833d37246c096fce49b3a043b1774b8eb1b8add2520f9c1105a52dfc150c38923681d15fe71bd50917069920b6ba0758d89744cfd7ff7ba27ebffc8053bad5b7e9d8436c2676f6349a5dde752af834ed7a158c12681b8779b04a4ca81f35520742ffe73c0f23a9b995dc447a79942231ada8294e48a2e5d896f7284f601c73cc865601fb056c0745cba34017297aa49682028ab357e67215f64bd4904ffa3fc4bf89975f587f0c4d77df562a6b6e1a2aa8645b2984485d70715a5fde7a85756beac9c08e8f6561539c27fce055f492f91fecc5b876400406ad36b0306395ab2cf77" + "value_hex": "58a1e97be3f3da75369b92c4e6c552fcf7a05db2f8ef8467121e2acf0ff3316cba3bcd1fa8ab509570047cdb1adaf05625fa487d622a7c7da4ac6c2b96c8bf430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000e81c637b21a06ce1e38bcbbff0cc6e45b2d28f52c63d1cdaf7adf5cfce16832ffcd00c08261f06612aaec9474fa1c1e184ee269e9e48de40a1144760bc5feb48b05c1e1edd0b6c80e76ec1e6537fde9afca4fe5db493abfd745a18d232a8fc190480d0127192941effd7bc78e08f6c5bddd848072b07b0e93f776ce3220f4e484e9cbe8e2a2ce6e0156cef36b736a76d126b52e2aef7a4a178cdb8bfc9db8a070e86f0a02c979afada59a8b71cf51fe4d0c90a0ba9ce62bc15c8c235b0a56d03aa3dc8347ad69806c63618f76d81ebca8e55bd32c78f2552e90caa94a6c8000a52c966f7f7c4d2cdac1e2ff03c68f2afa8c96eae5881547e6de4d2ce39fb6d53e43b7af1d4bcb01aa9d1f837cb7f1b664af1c934f0ba87a494b0e26908f8a42d9a6e55fab2315e7ba98006c9b39753497d0d128ca0bd8c430e669bdac202911114ca1ab6c3b5e0f0d23764d0630b6be7fd24f27cb74fd5f1e7e7f6e53da5c177aaff15263f31b52c56441b4aa245fe215feece5bf262683323d5c433e43c8a689a20b047c7f18ad1f785be9df72b2c83697b6308f37e72b78e543d0cdc975f1ec84ea3d2438e842b43c12b18c4ccd0926db7c03374481f62f4a38cf9835a076c5c14ac094d9f3c100903aaae2c1fad5251bf8181b9d43ec4025755ba53b49517587aad124331019b2d685babd9b302a29faee29228e2f1ad28e24492a5b9451de6674341baf5587a37d4108dd356e6f4e2dc1863804e5029af25d7b60f856913d49b63653a7c1444fa3ac43a63b54f657c0f52f7fbeb88f32300777d2646f15d2ac4f09f1b7bce999d96513a5f589d10f8b8d126b462a47fb6adc9e80afa675dc87d6f39919f846644e785f46ec5de62381b7834fd19d6dab75ddeeb0d5aeb4ae4272129275f52fba52ad13465560971bcd7af7f488c063afb3328d090387059f39f3574e969159edc26f904ea1a715d0fac51dc38aa9954db959f0d914f2d0c222bd00df06ef35e68d0ee68b1346e4b9db5bcd6452f0509a23864be1c2f" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -920,7 +920,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "c2bf90b0a1fa2a1fa6f61a2537b869e18268422f6a768c5e645b05d58792260b988684c294aa7c4af9bafe5088e97dc98eaac87fa2c82baddbfe2d677c70b0360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000b06e188034e39e920bdf01d484a52ea0a6ef3d0ed16b7dd50309b93c77c6fb0d90e293abdf7638041e311d9cf8244b537750e4cb5f9ba623403193057797cd4ce0e24a6cad35fd8d4bc002ee1dfcb00ddd177a2b657eae7bb05039ad055a4c42906e761896d4fc7953a5738be310967b0e45986d178cdcda22383b8a6e1d20617f479f37a705c8f1fd50388a2c72c70efdd0094c15e50af81febe8e998e48704d2b69dd075d0ace9a5b8e00595dafd2738b70e1694846d782c8922d1edde5e063c59b5a33701e6fab289051b37a1fd5a192cc095a3ad3539a640bbdb5fbe0302985ba0b4308e9a9dfcdd0194e6a62f02b7fdc953eda5f50c2054f3b4a031604ae43d490dce122289b9870cd75b5b5a6e296df222fed4b619e8a68ed1bea28d3378fa058c60ac6dac636def72b26874c8c727dbbc8688b105aa4b1be4eb01e76f084dd7d532e3abd1ec620215119101ddcc004a16b0ac4e70dd9d8ecb556b4141cc8a9a045af6f2de18e345b698cfb751204aa8503a77944a233395f344b0bb7c38567735c56a47f98484191eebce1fd9526e9d7904832dbbcdeb008152b28c2a7e3a6ee4348eb35d81398eaa23ee04ef5f1c07244262c91a55e05950ef64152848a4057af9bff6a2c5a0118ba683e90a76df520e24e7cc3469090c058b03ab467e7f07af7f4c4938920a781f4e138de05c1f48af7489d4929e95176e3833d37246c096fce49b3a043b1774b8eb1b8add2520f9c1105a52dfc150c38923681d15fe71bd50917069920b6ba0758d89744cfd7ff7ba27ebffc8053bad5b7e9d8436c2676f6349a5dde752af834ed7a158c12681b8779b04a4ca81f35520742ffe73c0f23a9b995dc447a79942231ada8294e48a2e5d896f7284f601c73cc865601fb056c0745cba34017297aa49682028ab357e67215f64bd4904ffa3fc4bf89975f587f0c4d77df562a6b6e1a2aa8645b2984485d70715a5fde7a85756beac9c08e8f6561539c27fce055f492f91fecc5b876400406ad36b0306395ab2cf77440f" + "value_hex": "58a1e97be3f3da75369b92c4e6c552fcf7a05db2f8ef8467121e2acf0ff3316cba3bcd1fa8ab509570047cdb1adaf05625fa487d622a7c7da4ac6c2b96c8bf430000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000e81c637b21a06ce1e38bcbbff0cc6e45b2d28f52c63d1cdaf7adf5cfce16832ffcd00c08261f06612aaec9474fa1c1e184ee269e9e48de40a1144760bc5feb48b05c1e1edd0b6c80e76ec1e6537fde9afca4fe5db493abfd745a18d232a8fc190480d0127192941effd7bc78e08f6c5bddd848072b07b0e93f776ce3220f4e484e9cbe8e2a2ce6e0156cef36b736a76d126b52e2aef7a4a178cdb8bfc9db8a070e86f0a02c979afada59a8b71cf51fe4d0c90a0ba9ce62bc15c8c235b0a56d03aa3dc8347ad69806c63618f76d81ebca8e55bd32c78f2552e90caa94a6c8000a52c966f7f7c4d2cdac1e2ff03c68f2afa8c96eae5881547e6de4d2ce39fb6d53e43b7af1d4bcb01aa9d1f837cb7f1b664af1c934f0ba87a494b0e26908f8a42d9a6e55fab2315e7ba98006c9b39753497d0d128ca0bd8c430e669bdac202911114ca1ab6c3b5e0f0d23764d0630b6be7fd24f27cb74fd5f1e7e7f6e53da5c177aaff15263f31b52c56441b4aa245fe215feece5bf262683323d5c433e43c8a689a20b047c7f18ad1f785be9df72b2c83697b6308f37e72b78e543d0cdc975f1ec84ea3d2438e842b43c12b18c4ccd0926db7c03374481f62f4a38cf9835a076c5c14ac094d9f3c100903aaae2c1fad5251bf8181b9d43ec4025755ba53b49517587aad124331019b2d685babd9b302a29faee29228e2f1ad28e24492a5b9451de6674341baf5587a37d4108dd356e6f4e2dc1863804e5029af25d7b60f856913d49b63653a7c1444fa3ac43a63b54f657c0f52f7fbeb88f32300777d2646f15d2ac4f09f1b7bce999d96513a5f589d10f8b8d126b462a47fb6adc9e80afa675dc87d6f39919f846644e785f46ec5de62381b7834fd19d6dab75ddeeb0d5aeb4ae4272129275f52fba52ad13465560971bcd7af7f488c063afb3328d090387059f39f3574e969159edc26f904ea1a715d0fac51dc38aa9954db959f0d914f2d0c222bd00df06ef35e68d0ee68b1346e4b9db5bcd6452f0509a23864be1c2f7d06" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -932,15 +932,15 @@ "family": "transfer_composite", "expected_valid": true, "payload": { - "equality_proof_data_hex": "1ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c6678424f849a1a283866adfa29de0a9129357d99819e49271d8e5bf5d10c5cdc6211065de9e14e599f38716d66b5fc846e1d80f2052d34501e46bf5835890aadda99848c2bf90b0a1fa2a1fa6f61a2537b869e18268422f6a768c5e645b05d58792260b8acb23f53bc3efae4befae5f8179651fbf7e8e47a7cb1b17fa292947d1594f372029db7fffbefacc923802936bf76f3a9e7b4f1023109f24fd47370eb5485d3dd4fd48f967799e461b05aa95d8c57a6fa0aa6e4356e2aaa8f4ee36110899a168be350a2a62deef1e46f9437bfd88b48f7f28dea75d97fc5ed0ebe5088ecc2108b383f78e10dc2789aecfcffdafdc622dac8be78167c69e9736393ee095968c074dd956cf31198737620b03a4cf0ffdc0d7390263fab922827c281eff83fff908", - "range_proof_data_hex": "c2bf90b0a1fa2a1fa6f61a2537b869e18268422f6a768c5e645b05d58792260b988684c294aa7c4af9bafe5088e97dc98eaac87fa2c82baddbfe2d677c70b0360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000b06e188034e39e920bdf01d484a52ea0a6ef3d0ed16b7dd50309b93c77c6fb0d90e293abdf7638041e311d9cf8244b537750e4cb5f9ba623403193057797cd4ce0e24a6cad35fd8d4bc002ee1dfcb00ddd177a2b657eae7bb05039ad055a4c42906e761896d4fc7953a5738be310967b0e45986d178cdcda22383b8a6e1d20617f479f37a705c8f1fd50388a2c72c70efdd0094c15e50af81febe8e998e48704d2b69dd075d0ace9a5b8e00595dafd2738b70e1694846d782c8922d1edde5e063c59b5a33701e6fab289051b37a1fd5a192cc095a3ad3539a640bbdb5fbe0302985ba0b4308e9a9dfcdd0194e6a62f02b7fdc953eda5f50c2054f3b4a031604ae43d490dce122289b9870cd75b5b5a6e296df222fed4b619e8a68ed1bea28d3378fa058c60ac6dac636def72b26874c8c727dbbc8688b105aa4b1be4eb01e76f084dd7d532e3abd1ec620215119101ddcc004a16b0ac4e70dd9d8ecb556b4141cc8a9a045af6f2de18e345b698cfb751204aa8503a77944a233395f344b0bb7c38567735c56a47f98484191eebce1fd9526e9d7904832dbbcdeb008152b28c2a7e3a6ee4348eb35d81398eaa23ee04ef5f1c07244262c91a55e05950ef64152848a4057af9bff6a2c5a0118ba683e90a76df520e24e7cc3469090c058b03ab467e7f07af7f4c4938920a781f4e138de05c1f48af7489d4929e95176e3833d37246c096fce49b3a043b1774b8eb1b8add2520f9c1105a52dfc150c38923681d15fe71bd50917069920b6ba0758d89744cfd7ff7ba27ebffc8053bad5b7e9d8436c2676f6349a5dde752af834ed7a158c12681b8779b04a4ca81f35520742ffe73c0f23a9b995dc447a79942231ada8294e48a2e5d896f7284f601c73cc865601fb056c0745cba34017297aa49682028ab357e67215f64bd4904ffa3fc4bf89975f587f0c4d77df562a6b6e1a2aa8645b2984485d70715a5fde7a85756beac9c08e8f6561539c27fce055f492f91fecc5b876400406ad36b0306395ab2cf77440e", - "validity_proof_data_hex": "1ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c667842436d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317988684c294aa7c4af9bafe5088e97dc98eaac87fa2c82baddbfe2d677c70b03636ff1659ec34d2e304ba028056b9b681b89bb1b6a48cfbdb3f4383e97f5a0f09dcb5366e9ec6d108e6153206c5fa1a69adc7e3cf1bac32c48633bed114e44128947fee79800d128c84543d639a5156dbc8d58b1d781f4340d4eb8e98dfef3f369c409a5f5956e7774b3ade6375fbc4beef593c65e6e35f254a4e8f6c82bbf0656c4444ce46ec59fc44b42dd1d71d2b4f4126fc848a79f5237f0e87cb34c8ec0ae216f3a3b6a6ea216c42386aefabcb804c1f2bf1854743519c194b15f17426787ce14053b539dd3f908113cf2bce8c8a6e8c56abf62a56152ea4f13bccf0bc36f2e312bd3dbc17a2b8051f5813b91872f5c81bd03be718d4bd18393af89a775f82304e5faf82ac22c4b35357d1ef8ad42586e9b2533db9f173e1adaee27c030dbfc34ac8026b78ec2605977d9eb0969b85e54c835695a68562778d1aaa9de602" + "equality_proof_data_hex": "9446fe67f5a6f4c607a9aff001fc39dba92ce6174ad9f219b07dcf312f672a7aa0a5a48e21cec2f23488808ba03c3e98cd5eea90f19af3db428b4e472092966e7c7383fd8d111f2c505ed2587d36e5a6b87da369bac8212c49b9bab2e09bd77c48cd9e1ef2c3e5323a395e5bd22e946fc1d4cba3061bbca3a5a14f83ec18c60aa47e3a55c331542fb8a34913deae8ff6fa12f8366654b0d8a8c4a2dd7bb31759f005b9b61575e3348be953482ea1d135ab660608721081e1c6a5ca00bba31d656215d01dda3c2ac0f1bd99380717591cb30ddecf8cac3fce03388c1d28f5b917c5a5a22335681245efe3d81f028f3605a14902eda6d41d0f2c1bd870d6583b04ee603569c4802bb7870757efd29ca5fc8ba967d46700bf7cfc2ae76e69f69f03f2951ca92ba312a41bb48958ccee925d3f1dde3612456f119033d83e153da905", + "range_proof_data_hex": "48cd9e1ef2c3e5323a395e5bd22e946fc1d4cba3061bbca3a5a14f83ec18c60a98f353f80d6a07e622f46cfc92d575329e9dd296fd70af9f90aecc0a52d1bf07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404000000000000002d8a623b6d3581749bc2a062f7e508ed125d76dc67612080832923d9649e601c48e3b6bb04548067744ed51511b3c371f0dec4a5d4683b4b6ba065dc6c7c3202241b434bdf375bf81228a4d84c1a63bff2d7ce9303539f35300e1462483f833e0156e55c732e3596b8f735aa95de76815e1eb822bceedef89f9d23f2551c575683e936146680e50f1ddc49e2d48020010ef6a724ea360f9d950f03da76b97044522b97d8e77ebe6ca2be7e1e8696fb26ee05e52bbea2cd0ebb7640473e86703c4b0914fca72759393800d909f7955ac35587c607a6509f2ed765c88a2ad1f0e0a02c1513054b862800818202f1d87a4463455dc9c4a23c771dc0e14df259b1318830d33891d5c89a7376b232b61a468cd0a8111ec2d7d7778c19dab5e2dd66f3ae66b210a454d5a3786c30b750bdc16cc17a5f9bc56798f54ca97a37916827a2431ce4ae9f3fc7acd0a026ff4274fbcf935d04c587c0b7c9cfc0a8b8f91372e425b08bf230cb3c34a8e1651ececc9d7e0d4450e64c435fdff0d1e7c5b1db24faee841e0cc6cfb53f7f35bf8c8a5662b825fd19405051ee43cd9c206d9a5881a108479673f0386a7b1fd60dbabc4541d1848e13bff05af964852af79bdf0b153c8d4a1507fd153a7f88841011ee88c7be584194c26a377ce3755cd11c783f55d4e5d48946bc46c4222b7fd514a2f012beb21ba25da6122eb298680410b0ad2285a178e4900d4541845289211fc1ca0c5ebc92b8f6a9ef58381c8ec5acd22373abac64abe3fec39e691a98deedadf794c1ebcbad37f2b1cd7c351d02fbce1382e8837ec384970f7d7da887c8c5da272f53cc4a1ea3c5c36c4fd144b78b46ffe324432b95f6c1572bdc9408822977a44716e889a3bcaa841c5d122f2955101e92bda1a6e677589de5da326aa0c38c2c2709e2f89a5fe6f7c90db49f7861363a116c9dc9b5d429525185d717d7acc261b61bfe624201de5013d45aeef00a722aa03e979a1132cc610c46b051760bfd770566b84ee74b806644d5e566b2c2f839307", + "validity_proof_data_hex": "9446fe67f5a6f4c607a9aff001fc39dba92ce6174ad9f219b07dcf312f672a7ab0aea323b18453bbf74f03044da9dd93e19f5f50bd125f8d376ae6dc74d3570198f353f80d6a07e622f46cfc92d575329e9dd296fd70af9f90aecc0a52d1bf07762dc17cda91e4de26e44c18624a3f28bde7583a03ea0da10c40a08b5a893c65b05e026f6c2dcd97e1e55b61c0c2f6184d54a02679281a4990f30fd55b3c402d226c92a12c74a9ac5ab3b1597fde75c946af6ffaaee96a9bc78421b2841c3f2344e0808c88f6a6ac0a0b7dbaa4f407ed6c1a82b9377ce42a804fd39c3a091e43e4afd2520bb39667bb5baf3098d5a2a70580290b32d20d62de7297f7ed76e928f62ac94d3f02403ef844b7386af1c8c8eec9295a5a103a5aa5ded7e7485f3550b69836411feac462364e31eeedc1860c4f1c4a12b3a205ac8ad0e630a0b98f66021ccf373f2f07f4eb558c7efa8f1ba9d5ea15039105311438dea5ef3b2a0c022fbee3c0976ce78b95d46e0dcb92c8d3fe0a0b089698e4d25d8672ccea22990d81304a6394557db8e8bf1e83f21c1484c9e2956c56bb622a0be8ae7f318e9806" }, "binding": { - "current_balance_commitment_hex": "86d31a09866d908cc07246863bc8c3bc9fc24fabb35e6570f53bd0d5d7d8236c", - "current_balance_handle_hex": "08fa97fc89d5fe372080fbb7911fb9ffa6791e272ae5dc7c3deb375350eb622e", - "recipient_pubkey_hex": "36d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317", - "sender_pubkey_hex": "1ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c6678424" + "current_balance_commitment_hex": "0c9b3dc5e8d2147bf20510e0b7809f70abbb7c402684e9971a16450274f52138", + "current_balance_handle_hex": "6eefa23e9021c2365bd22aa85b992bdab035a73d71f0cae0de077d60cc244270", + "recipient_pubkey_hex": "b0aea323b18453bbf74f03044da9dd93e19f5f50bd125f8d376ae6dc74d35701", + "sender_pubkey_hex": "9446fe67f5a6f4c607a9aff001fc39dba92ce6174ad9f219b07dcf312f672a7a" }, "mutations": [ { @@ -958,7 +958,7 @@ "op": "bitflip", "target": "binding.sender_pubkey_hex", "params": { - "value_hex": "1bda8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c6678424" + "value_hex": "9546fe67f5a6f4c607a9aff001fc39dba92ce6174ad9f219b07dcf312f672a7a" }, "expected_valid": false, "expected_error_contains": "failed" @@ -968,7 +968,7 @@ "op": "bitflip", "target": "binding.recipient_pubkey_hex", "params": { - "value_hex": "37d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317" + "value_hex": "b1aea323b18453bbf74f03044da9dd93e19f5f50bd125f8d376ae6dc74d35701" }, "expected_valid": false, "expected_error_contains": "failed" @@ -988,7 +988,7 @@ "op": "truncate", "target": "payload.range_proof_data_hex", "params": { - "value_hex": "c2bf90b0a1fa2a1fa6f61a2537b869e18268422f6a768c5e645b05d58792260b988684c294aa7c4af9bafe5088e97dc98eaac87fa2c82baddbfe2d677c70b0360000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000b06e188034e39e920bdf01d484a52ea0a6ef3d0ed16b7dd50309b93c77c6fb0d90e293abdf7638041e311d9cf8244b537750e4cb5f9ba623403193057797cd4ce0e24a6cad35fd8d4bc002ee1dfcb00ddd177a2b657eae7bb05039ad055a4c42906e761896d4fc7953a5738be310967b0e45986d178cdcda22383b8a6e1d20617f479f37a705c8f1fd50388a2c72c70efdd0094c15e50af81febe8e998e48704d2b69dd075d0ace9a5b8e00595dafd2738b70e1694846d782c8922d1edde5e063c59b5a33701e6fab289051b37a1fd5a192cc095a3ad3539a640bbdb5fbe0302985ba0b4308e9a9dfcdd0194e6a62f02b7fdc953eda5f50c2054f3b4a031604ae43d490dce122289b9870cd75b5b5a6e296df222fed4b619e8a68ed1bea28d3378fa058c60ac6dac636def72b26874c8c727dbbc8688b105aa4b1be4eb01e76f084dd7d532e3abd1ec620215119101ddcc004a16b0ac4e70dd9d8ecb556b4141cc8a9a045af6f2de18e345b698cfb751204aa8503a77944a233395f344b0bb7c38567735c56a47f98484191eebce1fd9526e9d7904832dbbcdeb008152b28c2a7e3a6ee4348eb35d81398eaa23ee04ef5f1c07244262c91a55e05950ef64152848a4057af9bff6a2c5a0118ba683e90a76df520e24e7cc3469090c058b03ab467e7f07af7f4c4938920a781f4e138de05c1f48af7489d4929e95176e3833d37246c096fce49b3a043b1774b8eb1b8add2520f9c1105a52dfc150c38923681d15fe71bd50917069920b6ba0758d89744cfd7ff7ba27ebffc8053bad5b7e9d8436c2676f6349a5dde752af834ed7a158c12681b8779b04a4ca81f35520742ffe73c0f23a9b995dc447a79942231ada8294e48a2e5d896f7284f601c73cc865601fb056c0745cba34017297aa49682028ab357e67215f64bd4904ffa3fc4bf89975f587f0c4d77df562a6b6e1a2aa8645b2984485d70715a5fde7a85756beac9c08e8f6561539c27fce055f492f91fecc5b876400406ad36b0306395ab2cf77" + "value_hex": "48cd9e1ef2c3e5323a395e5bd22e946fc1d4cba3061bbca3a5a14f83ec18c60a98f353f80d6a07e622f46cfc92d575329e9dd296fd70af9f90aecc0a52d1bf07000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404000000000000002d8a623b6d3581749bc2a062f7e508ed125d76dc67612080832923d9649e601c48e3b6bb04548067744ed51511b3c371f0dec4a5d4683b4b6ba065dc6c7c3202241b434bdf375bf81228a4d84c1a63bff2d7ce9303539f35300e1462483f833e0156e55c732e3596b8f735aa95de76815e1eb822bceedef89f9d23f2551c575683e936146680e50f1ddc49e2d48020010ef6a724ea360f9d950f03da76b97044522b97d8e77ebe6ca2be7e1e8696fb26ee05e52bbea2cd0ebb7640473e86703c4b0914fca72759393800d909f7955ac35587c607a6509f2ed765c88a2ad1f0e0a02c1513054b862800818202f1d87a4463455dc9c4a23c771dc0e14df259b1318830d33891d5c89a7376b232b61a468cd0a8111ec2d7d7778c19dab5e2dd66f3ae66b210a454d5a3786c30b750bdc16cc17a5f9bc56798f54ca97a37916827a2431ce4ae9f3fc7acd0a026ff4274fbcf935d04c587c0b7c9cfc0a8b8f91372e425b08bf230cb3c34a8e1651ececc9d7e0d4450e64c435fdff0d1e7c5b1db24faee841e0cc6cfb53f7f35bf8c8a5662b825fd19405051ee43cd9c206d9a5881a108479673f0386a7b1fd60dbabc4541d1848e13bff05af964852af79bdf0b153c8d4a1507fd153a7f88841011ee88c7be584194c26a377ce3755cd11c783f55d4e5d48946bc46c4222b7fd514a2f012beb21ba25da6122eb298680410b0ad2285a178e4900d4541845289211fc1ca0c5ebc92b8f6a9ef58381c8ec5acd22373abac64abe3fec39e691a98deedadf794c1ebcbad37f2b1cd7c351d02fbce1382e8837ec384970f7d7da887c8c5da272f53cc4a1ea3c5c36c4fd144b78b46ffe324432b95f6c1572bdc9408822977a44716e889a3bcaa841c5d122f2955101e92bda1a6e677589de5da326aa0c38c2c2709e2f89a5fe6f7c90db49f7861363a116c9dc9b5d429525185d717d7acc261b61bfe624201de5013d45aeef00a722aa03e979a1132cc610c46b051760bfd770566b84ee74b806644d5e566b2c2f83" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -1000,7 +1000,7 @@ "family": "equality", "expected_valid": true, "payload": { - "proof_data_hex": "36d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317fce55fefc1b5d10d83081881b4bb51fc1857334ae14926d2d631ac3c9767485b9426cd109f794bf4bc5c90475a2695737bc1ca20c6790dfb4e16423a03a1634330c0c25a7168d2882ecbbeacc9e713ee6a7c2a9dc3696264a850a61c5c98df6222e72a480d6d46ea85ff5eec59378b82863be4ced933c8af470e177a11304c1c9e0710c463a28e70556a026246bc794027777a4c83b0f9fc2d68e0adc67a22128ed5bab98386cab5d3a6e6d3545813903e7990914dc0b24d461d572ca090515ebe75c3f9bdc5888c326566e805fb2c9a1b370f128c1241d06e87bfedfda01408a32f84368dd25c82bc6de2082a0b99a9ddbe53602c5eef1a9c801fbf73739f0cccf04297ff6f56cde8b6074dff9a2d3f047a6fe57b622c11ebba3d7abf7baf07" + "proof_data_hex": "b0aea323b18453bbf74f03044da9dd93e19f5f50bd125f8d376ae6dc74d35701e8282f6c676fcb9f5a2860aa8c83594829b14a54a93971ebe3fd26976aaf871080983aca7cd15443df075b7bebfe75761a081f89926de84cbc02aad669d1df5880fd56ee20d1453ef3d6d70c1d9a8b7e50734f5e625ac7e5d7196c0ff9c6f87724a76cabbf6cf5e591cb76c779c139db4de05d77572fd233b089d9071109442c98d47dcf7302e24b74a043c68fe60b86841ed25192c61b47288f52cdf2c5f05176406067fe62e3e6e72010a7ff330459720a3d1d68f3931466d19e7a9f972926093eec4360d72829ac8a9e7b07bb08f96edfdca98dad078c240b447e30dccb00df0d8677737d543628e5905747f1f06ca3734d92f8c44cfa20e52d6500197c0e9319648c9b875345dff3b908bad5f9ea7e0f71d51e5a064a0ad5a739630b8d0d" }, "mutations": [ { @@ -1008,7 +1008,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "37d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317fce55fefc1b5d10d83081881b4bb51fc1857334ae14926d2d631ac3c9767485b9426cd109f794bf4bc5c90475a2695737bc1ca20c6790dfb4e16423a03a1634330c0c25a7168d2882ecbbeacc9e713ee6a7c2a9dc3696264a850a61c5c98df6222e72a480d6d46ea85ff5eec59378b82863be4ced933c8af470e177a11304c1c9e0710c463a28e70556a026246bc794027777a4c83b0f9fc2d68e0adc67a22128ed5bab98386cab5d3a6e6d3545813903e7990914dc0b24d461d572ca090515ebe75c3f9bdc5888c326566e805fb2c9a1b370f128c1241d06e87bfedfda01408a32f84368dd25c82bc6de2082a0b99a9ddbe53602c5eef1a9c801fbf73739f0cccf04297ff6f56cde8b6074dff9a2d3f047a6fe57b622c11ebba3d7abf7baf07" + "value_hex": "b1aea323b18453bbf74f03044da9dd93e19f5f50bd125f8d376ae6dc74d35701e8282f6c676fcb9f5a2860aa8c83594829b14a54a93971ebe3fd26976aaf871080983aca7cd15443df075b7bebfe75761a081f89926de84cbc02aad669d1df5880fd56ee20d1453ef3d6d70c1d9a8b7e50734f5e625ac7e5d7196c0ff9c6f87724a76cabbf6cf5e591cb76c779c139db4de05d77572fd233b089d9071109442c98d47dcf7302e24b74a043c68fe60b86841ed25192c61b47288f52cdf2c5f05176406067fe62e3e6e72010a7ff330459720a3d1d68f3931466d19e7a9f972926093eec4360d72829ac8a9e7b07bb08f96edfdca98dad078c240b447e30dccb00df0d8677737d543628e5905747f1f06ca3734d92f8c44cfa20e52d6500197c0e9319648c9b875345dff3b908bad5f9ea7e0f71d51e5a064a0ad5a739630b8d0d" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -1018,7 +1018,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "36d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317fce55fefc1b5d10d83081881b4bb51fc1857334ae14926d2d631ac3c9767485b9426cd109f794bf4bc5c90475a2695737bc1ca20c6790dfb4e16423a03a1634330c0c25a7168d2882ecbbeacc9e713ee6a7c2a9dc3696264a850a61c5c98df6222e72a480d6d46ea85ff5eec59378b82863be4ced933c8af470e177a11304c1c9e0710c463a28e70556a026246bc794027777a4c83b0f9fc2d68e0adc67a22128ed5bab98386cab5d3a6e6d3545813903e7990914dc0b24d461d572ca090515ebe75c3f9bdc5888c326566e805fb2c9a1b370f128c1241d06e87bfedfda01408a32f84368dd25c82bc6de2082a0b99a9ddbe53602c5eef1a9c801fbf73739f0cccf04297ff6f56cde8b6074dff9a2d3f047a6fe57b622c11ebba3d7abf7b" + "value_hex": "b0aea323b18453bbf74f03044da9dd93e19f5f50bd125f8d376ae6dc74d35701e8282f6c676fcb9f5a2860aa8c83594829b14a54a93971ebe3fd26976aaf871080983aca7cd15443df075b7bebfe75761a081f89926de84cbc02aad669d1df5880fd56ee20d1453ef3d6d70c1d9a8b7e50734f5e625ac7e5d7196c0ff9c6f87724a76cabbf6cf5e591cb76c779c139db4de05d77572fd233b089d9071109442c98d47dcf7302e24b74a043c68fe60b86841ed25192c61b47288f52cdf2c5f05176406067fe62e3e6e72010a7ff330459720a3d1d68f3931466d19e7a9f972926093eec4360d72829ac8a9e7b07bb08f96edfdca98dad078c240b447e30dccb00df0d8677737d543628e5905747f1f06ca3734d92f8c44cfa20e52d6500197c0e9319648c9b875345dff3b908bad5f9ea7e0f71d51e5a064a0ad5a739630b" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -1040,7 +1040,7 @@ "family": "validity", "expected_valid": true, "payload": { - "proof_data_hex": "36d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7624588418ad89f5b16d98d3365845085c9ca5fe922bd0911be2137d860489ef60bcffdcb053f5ebafec6719393a03de9cdb825214f0965f851845b4ed1119160bb4c725f60304a9612d458ddffc40570a0681021172f11d36e43ae2e2704da94bd8a170e25269e28320d887eedc3d88f896061c0bd790cf169785597c90471f429a142ca709fb84da1311bf009b5fb1bf6f9eb4278c12d39f2d4475a1c7eb7d269694ad76358fb66b0066686eafdffd3cc1198530553ed2330731fd4130d363115636097663d6a2731c71c60dad6f7a1b3ae601596a7dade081144acb3e71f3142691fbb553ea99a0e69ecea77100596816abed10ab72c4c96151e63964d6dd33a6875441da529d68078e2255ca2cfb1a7000a5afe03ef626c6b0a24730f93d63cb31349d2e6f8113746b585e36dfcf45b749abc78ffa0e4d129d602c11b7a5015680a56c32f0bfb9d081090f80f1d97b2a364051c162006d1c48d310452eb60f" + "proof_data_hex": "b0aea323b18453bbf74f03044da9dd93e19f5f50bd125f8d376ae6dc74d35701e22809202e4d8f13770e8bcb5f37c5e6e18c122e2cd0c6d09b57c4517cfc09556ac41e2d902db3a1fb68cd208bb5071f1a1247628e9ee994111cc796c894e064687842319881fd6cdc601e389da4fd5da0c4a79052e44aaa6341e906d208192e76abbc41b852a8a5f4a617b32010704f1f24bc9352513f1cb34e2a2d5bde87146aff2a68000313cc99f3400b85cd5b38629afa532294233603c617d6fd952f35543ab78c634f610729b3645ef105cea43c7f923c0ebe8a6cbbbed6aa1c12b0194279f6e47dc82b95547a2a6c53a1ed3d3e9dc91e0964048f80fda553c7b2443ae8add2a8072c284f025ea9552ecb1dd8f20184b8044ee4d64954faa37bcd0b3428a7b130e0cb95a778547b8a979343e73aa9774f4d344507b59a1c31b106363b6ef4af4d7fe6f717daf4828b6a0bd971599653b0eeb697d57f072cc5c36ddb79425e6db12714db6bb433d6d6b6c41ba6f8f08a1e280e8f0ab48fe209b4d5000fe1bdffd7a618f33e88c8fd8909ab66f1e48581f4db8c9942259a8a487a60c308" }, "mutations": [ { @@ -1048,7 +1048,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "37d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7624588418ad89f5b16d98d3365845085c9ca5fe922bd0911be2137d860489ef60bcffdcb053f5ebafec6719393a03de9cdb825214f0965f851845b4ed1119160bb4c725f60304a9612d458ddffc40570a0681021172f11d36e43ae2e2704da94bd8a170e25269e28320d887eedc3d88f896061c0bd790cf169785597c90471f429a142ca709fb84da1311bf009b5fb1bf6f9eb4278c12d39f2d4475a1c7eb7d269694ad76358fb66b0066686eafdffd3cc1198530553ed2330731fd4130d363115636097663d6a2731c71c60dad6f7a1b3ae601596a7dade081144acb3e71f3142691fbb553ea99a0e69ecea77100596816abed10ab72c4c96151e63964d6dd33a6875441da529d68078e2255ca2cfb1a7000a5afe03ef626c6b0a24730f93d63cb31349d2e6f8113746b585e36dfcf45b749abc78ffa0e4d129d602c11b7a5015680a56c32f0bfb9d081090f80f1d97b2a364051c162006d1c48d310452eb60f" + "value_hex": "b1aea323b18453bbf74f03044da9dd93e19f5f50bd125f8d376ae6dc74d35701e22809202e4d8f13770e8bcb5f37c5e6e18c122e2cd0c6d09b57c4517cfc09556ac41e2d902db3a1fb68cd208bb5071f1a1247628e9ee994111cc796c894e064687842319881fd6cdc601e389da4fd5da0c4a79052e44aaa6341e906d208192e76abbc41b852a8a5f4a617b32010704f1f24bc9352513f1cb34e2a2d5bde87146aff2a68000313cc99f3400b85cd5b38629afa532294233603c617d6fd952f35543ab78c634f610729b3645ef105cea43c7f923c0ebe8a6cbbbed6aa1c12b0194279f6e47dc82b95547a2a6c53a1ed3d3e9dc91e0964048f80fda553c7b2443ae8add2a8072c284f025ea9552ecb1dd8f20184b8044ee4d64954faa37bcd0b3428a7b130e0cb95a778547b8a979343e73aa9774f4d344507b59a1c31b106363b6ef4af4d7fe6f717daf4828b6a0bd971599653b0eeb697d57f072cc5c36ddb79425e6db12714db6bb433d6d6b6c41ba6f8f08a1e280e8f0ab48fe209b4d5000fe1bdffd7a618f33e88c8fd8909ab66f1e48581f4db8c9942259a8a487a60c308" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -1058,7 +1058,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "36d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7624588418ad89f5b16d98d3365845085c9ca5fe922bd0911be2137d860489ef60bcffdcb053f5ebafec6719393a03de9cdb825214f0965f851845b4ed1119160bb4c725f60304a9612d458ddffc40570a0681021172f11d36e43ae2e2704da94bd8a170e25269e28320d887eedc3d88f896061c0bd790cf169785597c90471f429a142ca709fb84da1311bf009b5fb1bf6f9eb4278c12d39f2d4475a1c7eb7d269694ad76358fb66b0066686eafdffd3cc1198530553ed2330731fd4130d363115636097663d6a2731c71c60dad6f7a1b3ae601596a7dade081144acb3e71f3142691fbb553ea99a0e69ecea77100596816abed10ab72c4c96151e63964d6dd33a6875441da529d68078e2255ca2cfb1a7000a5afe03ef626c6b0a24730f93d63cb31349d2e6f8113746b585e36dfcf45b749abc78ffa0e4d129d602c11b7a5015680a56c32f0bfb9d081090f80f1d97b2a364051c162006d1c48d310452e" + "value_hex": "b0aea323b18453bbf74f03044da9dd93e19f5f50bd125f8d376ae6dc74d35701e22809202e4d8f13770e8bcb5f37c5e6e18c122e2cd0c6d09b57c4517cfc09556ac41e2d902db3a1fb68cd208bb5071f1a1247628e9ee994111cc796c894e064687842319881fd6cdc601e389da4fd5da0c4a79052e44aaa6341e906d208192e76abbc41b852a8a5f4a617b32010704f1f24bc9352513f1cb34e2a2d5bde87146aff2a68000313cc99f3400b85cd5b38629afa532294233603c617d6fd952f35543ab78c634f610729b3645ef105cea43c7f923c0ebe8a6cbbbed6aa1c12b0194279f6e47dc82b95547a2a6c53a1ed3d3e9dc91e0964048f80fda553c7b2443ae8add2a8072c284f025ea9552ecb1dd8f20184b8044ee4d64954faa37bcd0b3428a7b130e0cb95a778547b8a979343e73aa9774f4d344507b59a1c31b106363b6ef4af4d7fe6f717daf4828b6a0bd971599653b0eeb697d57f072cc5c36ddb79425e6db12714db6bb433d6d6b6c41ba6f8f08a1e280e8f0ab48fe209b4d5000fe1bdffd7a618f33e88c8fd8909ab66f1e48581f4db8c9942259a8a487a60" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -1080,7 +1080,7 @@ "family": "transfer_range", "expected_valid": true, "payload": { - "proof_data_hex": "30c0c25a7168d2882ecbbeacc9e713ee6a7c2a9dc3696264a850a61c5c98df6224588418ad89f5b16d98d3365845085c9ca5fe922bd0911be2137d860489ef600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a2d8b9b8a7a1eca41a37c2dd138cb5d1807da6157b6b8e8dabfe78cdf6bddc58cabac8699fefc87a9d5f96a197ba6929ad8c941f3947bf7177ec2cb93e50324eceb15e54d879a6e73413469a0dc682515f7941665f53fe3b068e8605173257445ee61d2baefc1f6c2ffbea0bf9aa70bf29d066346ce401f344563195e588f042c21461c22565ac0463a15bc50cd3726d9fe2f97f70ed75ccd30b2569921b550b431a96b4c002ba704b8af5ab5dd5ba78cb4ea810d4b220538c326788a231f90667e216464e8d7d612c6e1e2a07287fa83ca63a4aab7e58764365c160ab1b380e52ec1311b121670dde79071883cb2549acc78d5293b4b65596603465fa8ad87dd690db2ac6b2d64ca11236059de84d867fe593ecbdc5c09d4e0037fb0fdc4219b884a855341b1326216cd710abdf76980d9721283a5d02d9514537a1d4312e5150edbbf425583855c753b353985e2766ac68ae6c5447c862c0eb80317e93ba32ca79984b0502d1575284e428e2830db208be8c672c5a69bc05c967440fda6349b295fc62829138611b12eac6596850461494251ce94e84b093105b415c1a52159cb7d748981375c773199eb640adfe4e4fdfa49106bc04668df4dcaccd604b10c672eff411c3ed0b1ab127059b6f7818ea90bcce2a91acf262802876c160cd740a026b940d88439611b0b27b2587b613af70fb1b2d508b1f307ea82b8d04ff5224765efa342e68cd82210c46c0d634e84cf3f324f10d3d60c65ada66e9772f375c81f519d8b8426f67ac285d7239e07dddf23e1bff1dd8c11a705c36853ea8219c728804c18dd8177b589fb9e78a1fb14bdb5bc9a8d3bff3e4ba799ea61db7209e6602a5023ab55c2fc0f7b57a0830cb359c9c9963aecae2ea5495269c26bc0cce908e6bca91ba089c02428fc6a3ac2a619f500c54cc4c39597ce045a2d2865c1781ac044c9c8522fc90a732e3757e90be7d5c70dc2d3ffa7ae5a94d351096099576333f01d09d640450255965975d299f8b5a9412fda2eab053d38586a2500e" + "proof_data_hex": "80fd56ee20d1453ef3d6d70c1d9a8b7e50734f5e625ac7e5d7196c0ff9c6f8776ac41e2d902db3a1fb68cd208bb5071f1a1247628e9ee994111cc796c894e06400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000008e065ad7dcc35d6b558260c6ecb2454a66ed393007ee3116327b40d0e9672b02a0d9bbb239d767c8cdfa8df9b80cbd049919c8cb645c3280abdb9b4a1148335a8a94271b90a4196eab29269bfcb98d565a713f1921cc9bc96f158d9d56ff6378c47ea4da73205e20243505fc41c3cc9711d4f8b959403341d6d85c24323d4e12bc2340e4569f7b75b5f6a78a0dce31d8822948eed021c8f34c50e85daf5e7b0b2261643131dec1bffbab1a812362e6231dd8ef5672868ee5f2102c3ec203ec05a53b3a59de403d712ef52749fb34949f9605fb1afe588252849c0f27074cc40eda65c020e5a6c9a48347a472b4edb9a215a9a5b0729eb40b9accf4f254d90e3a5096b85c2c1c3883a7154a509833d2eeaed65e40b4dfc9e5b574349c6207bc7b048fb8bfa97cf718d7c3576f0e067a774bd4557fdcbf30fbd30f2454be7eaa30984ba48acaf3f6922ee17f34b4684f03e7684b00fa3d77e4eeb9ab14a5bbff1fccff4bdd7d62741a9cf2f8ece315bd86dda32b843a66645cffa56d26374f631114042d4cefe8bd9ac383d64972b29ded0331b2da071ab80080deae313d854e7e16514c913d556e189c9c046c35f507453c83d3a26f54ff0ce2b91a9a3d703d468675b3427e74baf8031b99e8cced2c7ea6ab0a7162986c4d2eb0132a87e1ce561cd95ce26d2bbe84dcaabf4ed1e08e29d894ccf33715e7254f68dcb7a508fe02209f4a2bcd7fb59dc8d9be11bcfc14d5d824a9bd73a751ee979d73c0b2214439a20a5f491d8ebb511a8f3944712e47676c2487d205599f3b78a2ddd049cf3e237285ef7f4bee16eee59a1589f8a8ec02736246f8a8d05987735650a5e546ef19609133157afd7b01bb9e0c8a0cd28b1c9334bec872dac66eb01f834d4672c35b761379aecece6160aa322e82cacb4c5dc2e76e362f20163e9be3f76ad7a39205a9e12cd89174df22d72274e69c074199a44d31c44b62634b571881981535f80cc20267b2a34533b53f62bfe793280e4830d23ac20bf2de4713ccaad48b01040e" }, "mutations": [ { @@ -1088,7 +1088,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "31c0c25a7168d2882ecbbeacc9e713ee6a7c2a9dc3696264a850a61c5c98df6224588418ad89f5b16d98d3365845085c9ca5fe922bd0911be2137d860489ef600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a2d8b9b8a7a1eca41a37c2dd138cb5d1807da6157b6b8e8dabfe78cdf6bddc58cabac8699fefc87a9d5f96a197ba6929ad8c941f3947bf7177ec2cb93e50324eceb15e54d879a6e73413469a0dc682515f7941665f53fe3b068e8605173257445ee61d2baefc1f6c2ffbea0bf9aa70bf29d066346ce401f344563195e588f042c21461c22565ac0463a15bc50cd3726d9fe2f97f70ed75ccd30b2569921b550b431a96b4c002ba704b8af5ab5dd5ba78cb4ea810d4b220538c326788a231f90667e216464e8d7d612c6e1e2a07287fa83ca63a4aab7e58764365c160ab1b380e52ec1311b121670dde79071883cb2549acc78d5293b4b65596603465fa8ad87dd690db2ac6b2d64ca11236059de84d867fe593ecbdc5c09d4e0037fb0fdc4219b884a855341b1326216cd710abdf76980d9721283a5d02d9514537a1d4312e5150edbbf425583855c753b353985e2766ac68ae6c5447c862c0eb80317e93ba32ca79984b0502d1575284e428e2830db208be8c672c5a69bc05c967440fda6349b295fc62829138611b12eac6596850461494251ce94e84b093105b415c1a52159cb7d748981375c773199eb640adfe4e4fdfa49106bc04668df4dcaccd604b10c672eff411c3ed0b1ab127059b6f7818ea90bcce2a91acf262802876c160cd740a026b940d88439611b0b27b2587b613af70fb1b2d508b1f307ea82b8d04ff5224765efa342e68cd82210c46c0d634e84cf3f324f10d3d60c65ada66e9772f375c81f519d8b8426f67ac285d7239e07dddf23e1bff1dd8c11a705c36853ea8219c728804c18dd8177b589fb9e78a1fb14bdb5bc9a8d3bff3e4ba799ea61db7209e6602a5023ab55c2fc0f7b57a0830cb359c9c9963aecae2ea5495269c26bc0cce908e6bca91ba089c02428fc6a3ac2a619f500c54cc4c39597ce045a2d2865c1781ac044c9c8522fc90a732e3757e90be7d5c70dc2d3ffa7ae5a94d351096099576333f01d09d640450255965975d299f8b5a9412fda2eab053d38586a2500e" + "value_hex": "81fd56ee20d1453ef3d6d70c1d9a8b7e50734f5e625ac7e5d7196c0ff9c6f8776ac41e2d902db3a1fb68cd208bb5071f1a1247628e9ee994111cc796c894e06400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000008e065ad7dcc35d6b558260c6ecb2454a66ed393007ee3116327b40d0e9672b02a0d9bbb239d767c8cdfa8df9b80cbd049919c8cb645c3280abdb9b4a1148335a8a94271b90a4196eab29269bfcb98d565a713f1921cc9bc96f158d9d56ff6378c47ea4da73205e20243505fc41c3cc9711d4f8b959403341d6d85c24323d4e12bc2340e4569f7b75b5f6a78a0dce31d8822948eed021c8f34c50e85daf5e7b0b2261643131dec1bffbab1a812362e6231dd8ef5672868ee5f2102c3ec203ec05a53b3a59de403d712ef52749fb34949f9605fb1afe588252849c0f27074cc40eda65c020e5a6c9a48347a472b4edb9a215a9a5b0729eb40b9accf4f254d90e3a5096b85c2c1c3883a7154a509833d2eeaed65e40b4dfc9e5b574349c6207bc7b048fb8bfa97cf718d7c3576f0e067a774bd4557fdcbf30fbd30f2454be7eaa30984ba48acaf3f6922ee17f34b4684f03e7684b00fa3d77e4eeb9ab14a5bbff1fccff4bdd7d62741a9cf2f8ece315bd86dda32b843a66645cffa56d26374f631114042d4cefe8bd9ac383d64972b29ded0331b2da071ab80080deae313d854e7e16514c913d556e189c9c046c35f507453c83d3a26f54ff0ce2b91a9a3d703d468675b3427e74baf8031b99e8cced2c7ea6ab0a7162986c4d2eb0132a87e1ce561cd95ce26d2bbe84dcaabf4ed1e08e29d894ccf33715e7254f68dcb7a508fe02209f4a2bcd7fb59dc8d9be11bcfc14d5d824a9bd73a751ee979d73c0b2214439a20a5f491d8ebb511a8f3944712e47676c2487d205599f3b78a2ddd049cf3e237285ef7f4bee16eee59a1589f8a8ec02736246f8a8d05987735650a5e546ef19609133157afd7b01bb9e0c8a0cd28b1c9334bec872dac66eb01f834d4672c35b761379aecece6160aa322e82cacb4c5dc2e76e362f20163e9be3f76ad7a39205a9e12cd89174df22d72274e69c074199a44d31c44b62634b571881981535f80cc20267b2a34533b53f62bfe793280e4830d23ac20bf2de4713ccaad48b01040e" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -1098,7 +1098,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "30c0c25a7168d2882ecbbeacc9e713ee6a7c2a9dc3696264a850a61c5c98df6224588418ad89f5b16d98d3365845085c9ca5fe922bd0911be2137d860489ef600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a2d8b9b8a7a1eca41a37c2dd138cb5d1807da6157b6b8e8dabfe78cdf6bddc58cabac8699fefc87a9d5f96a197ba6929ad8c941f3947bf7177ec2cb93e50324eceb15e54d879a6e73413469a0dc682515f7941665f53fe3b068e8605173257445ee61d2baefc1f6c2ffbea0bf9aa70bf29d066346ce401f344563195e588f042c21461c22565ac0463a15bc50cd3726d9fe2f97f70ed75ccd30b2569921b550b431a96b4c002ba704b8af5ab5dd5ba78cb4ea810d4b220538c326788a231f90667e216464e8d7d612c6e1e2a07287fa83ca63a4aab7e58764365c160ab1b380e52ec1311b121670dde79071883cb2549acc78d5293b4b65596603465fa8ad87dd690db2ac6b2d64ca11236059de84d867fe593ecbdc5c09d4e0037fb0fdc4219b884a855341b1326216cd710abdf76980d9721283a5d02d9514537a1d4312e5150edbbf425583855c753b353985e2766ac68ae6c5447c862c0eb80317e93ba32ca79984b0502d1575284e428e2830db208be8c672c5a69bc05c967440fda6349b295fc62829138611b12eac6596850461494251ce94e84b093105b415c1a52159cb7d748981375c773199eb640adfe4e4fdfa49106bc04668df4dcaccd604b10c672eff411c3ed0b1ab127059b6f7818ea90bcce2a91acf262802876c160cd740a026b940d88439611b0b27b2587b613af70fb1b2d508b1f307ea82b8d04ff5224765efa342e68cd82210c46c0d634e84cf3f324f10d3d60c65ada66e9772f375c81f519d8b8426f67ac285d7239e07dddf23e1bff1dd8c11a705c36853ea8219c728804c18dd8177b589fb9e78a1fb14bdb5bc9a8d3bff3e4ba799ea61db7209e6602a5023ab55c2fc0f7b57a0830cb359c9c9963aecae2ea5495269c26bc0cce908e6bca91ba089c02428fc6a3ac2a619f500c54cc4c39597ce045a2d2865c1781ac044c9c8522fc90a732e3757e90be7d5c70dc2d3ffa7ae5a94d351096099576333f01d09d640450255965975d299f8b5a9412fda2eab053d38586a2" + "value_hex": "80fd56ee20d1453ef3d6d70c1d9a8b7e50734f5e625ac7e5d7196c0ff9c6f8776ac41e2d902db3a1fb68cd208bb5071f1a1247628e9ee994111cc796c894e06400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000008e065ad7dcc35d6b558260c6ecb2454a66ed393007ee3116327b40d0e9672b02a0d9bbb239d767c8cdfa8df9b80cbd049919c8cb645c3280abdb9b4a1148335a8a94271b90a4196eab29269bfcb98d565a713f1921cc9bc96f158d9d56ff6378c47ea4da73205e20243505fc41c3cc9711d4f8b959403341d6d85c24323d4e12bc2340e4569f7b75b5f6a78a0dce31d8822948eed021c8f34c50e85daf5e7b0b2261643131dec1bffbab1a812362e6231dd8ef5672868ee5f2102c3ec203ec05a53b3a59de403d712ef52749fb34949f9605fb1afe588252849c0f27074cc40eda65c020e5a6c9a48347a472b4edb9a215a9a5b0729eb40b9accf4f254d90e3a5096b85c2c1c3883a7154a509833d2eeaed65e40b4dfc9e5b574349c6207bc7b048fb8bfa97cf718d7c3576f0e067a774bd4557fdcbf30fbd30f2454be7eaa30984ba48acaf3f6922ee17f34b4684f03e7684b00fa3d77e4eeb9ab14a5bbff1fccff4bdd7d62741a9cf2f8ece315bd86dda32b843a66645cffa56d26374f631114042d4cefe8bd9ac383d64972b29ded0331b2da071ab80080deae313d854e7e16514c913d556e189c9c046c35f507453c83d3a26f54ff0ce2b91a9a3d703d468675b3427e74baf8031b99e8cced2c7ea6ab0a7162986c4d2eb0132a87e1ce561cd95ce26d2bbe84dcaabf4ed1e08e29d894ccf33715e7254f68dcb7a508fe02209f4a2bcd7fb59dc8d9be11bcfc14d5d824a9bd73a751ee979d73c0b2214439a20a5f491d8ebb511a8f3944712e47676c2487d205599f3b78a2ddd049cf3e237285ef7f4bee16eee59a1589f8a8ec02736246f8a8d05987735650a5e546ef19609133157afd7b01bb9e0c8a0cd28b1c9334bec872dac66eb01f834d4672c35b761379aecece6160aa322e82cacb4c5dc2e76e362f20163e9be3f76ad7a39205a9e12cd89174df22d72274e69c074199a44d31c44b62634b571881981535f80cc20267b2a34533b53f62bfe793280e4830d23ac20bf2de4713ccaad48b01" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -1118,7 +1118,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "30c0c25a7168d2882ecbbeacc9e713ee6a7c2a9dc3696264a850a61c5c98df6224588418ad89f5b16d98d3365845085c9ca5fe922bd0911be2137d860489ef600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a2d8b9b8a7a1eca41a37c2dd138cb5d1807da6157b6b8e8dabfe78cdf6bddc58cabac8699fefc87a9d5f96a197ba6929ad8c941f3947bf7177ec2cb93e50324eceb15e54d879a6e73413469a0dc682515f7941665f53fe3b068e8605173257445ee61d2baefc1f6c2ffbea0bf9aa70bf29d066346ce401f344563195e588f042c21461c22565ac0463a15bc50cd3726d9fe2f97f70ed75ccd30b2569921b550b431a96b4c002ba704b8af5ab5dd5ba78cb4ea810d4b220538c326788a231f90667e216464e8d7d612c6e1e2a07287fa83ca63a4aab7e58764365c160ab1b380e52ec1311b121670dde79071883cb2549acc78d5293b4b65596603465fa8ad87dd690db2ac6b2d64ca11236059de84d867fe593ecbdc5c09d4e0037fb0fdc4219b884a855341b1326216cd710abdf76980d9721283a5d02d9514537a1d4312e5150edbbf425583855c753b353985e2766ac68ae6c5447c862c0eb80317e93ba32ca79984b0502d1575284e428e2830db208be8c672c5a69bc05c967440fda6349b295fc62829138611b12eac6596850461494251ce94e84b093105b415c1a52159cb7d748981375c773199eb640adfe4e4fdfa49106bc04668df4dcaccd604b10c672eff411c3ed0b1ab127059b6f7818ea90bcce2a91acf262802876c160cd740a026b940d88439611b0b27b2587b613af70fb1b2d508b1f307ea82b8d04ff5224765efa342e68cd82210c46c0d634e84cf3f324f10d3d60c65ada66e9772f375c81f519d8b8426f67ac285d7239e07dddf23e1bff1dd8c11a705c36853ea8219c728804c18dd8177b589fb9e78a1fb14bdb5bc9a8d3bff3e4ba799ea61db7209e6602a5023ab55c2fc0f7b57a0830cb359c9c9963aecae2ea5495269c26bc0cce908e6bca91ba089c02428fc6a3ac2a619f500c54cc4c39597ce045a2d2865c1781ac044c9c8522fc90a732e3757e90be7d5c70dc2d3ffa7ae5a94d351096099576333f01d09d640450255965975d299f8b5a9412fda2eab053d38586a2500f" + "value_hex": "80fd56ee20d1453ef3d6d70c1d9a8b7e50734f5e625ac7e5d7196c0ff9c6f8776ac41e2d902db3a1fb68cd208bb5071f1a1247628e9ee994111cc796c894e06400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000008e065ad7dcc35d6b558260c6ecb2454a66ed393007ee3116327b40d0e9672b02a0d9bbb239d767c8cdfa8df9b80cbd049919c8cb645c3280abdb9b4a1148335a8a94271b90a4196eab29269bfcb98d565a713f1921cc9bc96f158d9d56ff6378c47ea4da73205e20243505fc41c3cc9711d4f8b959403341d6d85c24323d4e12bc2340e4569f7b75b5f6a78a0dce31d8822948eed021c8f34c50e85daf5e7b0b2261643131dec1bffbab1a812362e6231dd8ef5672868ee5f2102c3ec203ec05a53b3a59de403d712ef52749fb34949f9605fb1afe588252849c0f27074cc40eda65c020e5a6c9a48347a472b4edb9a215a9a5b0729eb40b9accf4f254d90e3a5096b85c2c1c3883a7154a509833d2eeaed65e40b4dfc9e5b574349c6207bc7b048fb8bfa97cf718d7c3576f0e067a774bd4557fdcbf30fbd30f2454be7eaa30984ba48acaf3f6922ee17f34b4684f03e7684b00fa3d77e4eeb9ab14a5bbff1fccff4bdd7d62741a9cf2f8ece315bd86dda32b843a66645cffa56d26374f631114042d4cefe8bd9ac383d64972b29ded0331b2da071ab80080deae313d854e7e16514c913d556e189c9c046c35f507453c83d3a26f54ff0ce2b91a9a3d703d468675b3427e74baf8031b99e8cced2c7ea6ab0a7162986c4d2eb0132a87e1ce561cd95ce26d2bbe84dcaabf4ed1e08e29d894ccf33715e7254f68dcb7a508fe02209f4a2bcd7fb59dc8d9be11bcfc14d5d824a9bd73a751ee979d73c0b2214439a20a5f491d8ebb511a8f3944712e47676c2487d205599f3b78a2ddd049cf3e237285ef7f4bee16eee59a1589f8a8ec02736246f8a8d05987735650a5e546ef19609133157afd7b01bb9e0c8a0cd28b1c9334bec872dac66eb01f834d4672c35b761379aecece6160aa322e82cacb4c5dc2e76e362f20163e9be3f76ad7a39205a9e12cd89174df22d72274e69c074199a44d31c44b62634b571881981535f80cc20267b2a34533b53f62bfe793280e4830d23ac20bf2de4713ccaad48b01040f" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -1130,15 +1130,15 @@ "family": "transfer_composite", "expected_valid": true, "payload": { - "equality_proof_data_hex": "36d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317fce55fefc1b5d10d83081881b4bb51fc1857334ae14926d2d631ac3c9767485b9426cd109f794bf4bc5c90475a2695737bc1ca20c6790dfb4e16423a03a1634330c0c25a7168d2882ecbbeacc9e713ee6a7c2a9dc3696264a850a61c5c98df6222e72a480d6d46ea85ff5eec59378b82863be4ced933c8af470e177a11304c1c9e0710c463a28e70556a026246bc794027777a4c83b0f9fc2d68e0adc67a22128ed5bab98386cab5d3a6e6d3545813903e7990914dc0b24d461d572ca090515ebe75c3f9bdc5888c326566e805fb2c9a1b370f128c1241d06e87bfedfda01408a32f84368dd25c82bc6de2082a0b99a9ddbe53602c5eef1a9c801fbf73739f0cccf04297ff6f56cde8b6074dff9a2d3f047a6fe57b622c11ebba3d7abf7baf07", - "range_proof_data_hex": "30c0c25a7168d2882ecbbeacc9e713ee6a7c2a9dc3696264a850a61c5c98df6224588418ad89f5b16d98d3365845085c9ca5fe922bd0911be2137d860489ef600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a2d8b9b8a7a1eca41a37c2dd138cb5d1807da6157b6b8e8dabfe78cdf6bddc58cabac8699fefc87a9d5f96a197ba6929ad8c941f3947bf7177ec2cb93e50324eceb15e54d879a6e73413469a0dc682515f7941665f53fe3b068e8605173257445ee61d2baefc1f6c2ffbea0bf9aa70bf29d066346ce401f344563195e588f042c21461c22565ac0463a15bc50cd3726d9fe2f97f70ed75ccd30b2569921b550b431a96b4c002ba704b8af5ab5dd5ba78cb4ea810d4b220538c326788a231f90667e216464e8d7d612c6e1e2a07287fa83ca63a4aab7e58764365c160ab1b380e52ec1311b121670dde79071883cb2549acc78d5293b4b65596603465fa8ad87dd690db2ac6b2d64ca11236059de84d867fe593ecbdc5c09d4e0037fb0fdc4219b884a855341b1326216cd710abdf76980d9721283a5d02d9514537a1d4312e5150edbbf425583855c753b353985e2766ac68ae6c5447c862c0eb80317e93ba32ca79984b0502d1575284e428e2830db208be8c672c5a69bc05c967440fda6349b295fc62829138611b12eac6596850461494251ce94e84b093105b415c1a52159cb7d748981375c773199eb640adfe4e4fdfa49106bc04668df4dcaccd604b10c672eff411c3ed0b1ab127059b6f7818ea90bcce2a91acf262802876c160cd740a026b940d88439611b0b27b2587b613af70fb1b2d508b1f307ea82b8d04ff5224765efa342e68cd82210c46c0d634e84cf3f324f10d3d60c65ada66e9772f375c81f519d8b8426f67ac285d7239e07dddf23e1bff1dd8c11a705c36853ea8219c728804c18dd8177b589fb9e78a1fb14bdb5bc9a8d3bff3e4ba799ea61db7209e6602a5023ab55c2fc0f7b57a0830cb359c9c9963aecae2ea5495269c26bc0cce908e6bca91ba089c02428fc6a3ac2a619f500c54cc4c39597ce045a2d2865c1781ac044c9c8522fc90a732e3757e90be7d5c70dc2d3ffa7ae5a94d351096099576333f01d09d640450255965975d299f8b5a9412fda2eab053d38586a2500e", - "validity_proof_data_hex": "36d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7624588418ad89f5b16d98d3365845085c9ca5fe922bd0911be2137d860489ef60bcffdcb053f5ebafec6719393a03de9cdb825214f0965f851845b4ed1119160bb4c725f60304a9612d458ddffc40570a0681021172f11d36e43ae2e2704da94bd8a170e25269e28320d887eedc3d88f896061c0bd790cf169785597c90471f429a142ca709fb84da1311bf009b5fb1bf6f9eb4278c12d39f2d4475a1c7eb7d269694ad76358fb66b0066686eafdffd3cc1198530553ed2330731fd4130d363115636097663d6a2731c71c60dad6f7a1b3ae601596a7dade081144acb3e71f3142691fbb553ea99a0e69ecea77100596816abed10ab72c4c96151e63964d6dd33a6875441da529d68078e2255ca2cfb1a7000a5afe03ef626c6b0a24730f93d63cb31349d2e6f8113746b585e36dfcf45b749abc78ffa0e4d129d602c11b7a5015680a56c32f0bfb9d081090f80f1d97b2a364051c162006d1c48d310452eb60f" + "equality_proof_data_hex": "b0aea323b18453bbf74f03044da9dd93e19f5f50bd125f8d376ae6dc74d35701b282771483d84083716c357bc7546bcbd5d3712698d1623f5a076c14da0d4b33ee01907a54e4e0f6c1cace22052e5309f497940ae3e46a9ef8b66f2f85484b316ce971a2f7a20bb5273aa05a3a6aa58d2d347136f8af0633ea8017c858887a6fba8f45a77484cfcedfc2b562b5835d89cdc49ac94809f842de13b1a9c8edbf383cef208c89d23e61ea354acdfe90dfd615a4ae4e0e5f3ac9ce2696e8b74cac43c8ec718f555c617807c95b090ef32d990adf3f174e45c0c68be3d4558aa5a73c731adc156aa940e20f42221a86afbc4b6e4b4b81cbe525bb7538a82c70eedd08a1bee8bd468c4049e581a98a319dd858efdecc501a205fd08f6be8bbcc9bfd0e6c4aa46d851bfbea02d91f195f3f1c7a67680b53624aa81a4126cad499078b0e", + "range_proof_data_hex": "6ce971a2f7a20bb5273aa05a3a6aa58d2d347136f8af0633ea8017c858887a6f74138826ae2136413f5389d61c0a35d0b0f12fedd786c802da475719b235d77700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000009e01c637d88379a03e4fabf860805daf09768d07ae91fb0cda96a468686a4b2cc21e9c28ab574dd5e6a471a6910687818c757e02bb90c818f2636d24d91fba240e5ecd3093601318a45691d017a1832854594c732508b3320ef81d19433e9279ee8e1218a13dd7d07b09c8066c49f66abbe9d34cd14b5336abca91a4d022bc4ba19f422609c5a62c989b78f8d23a1f26f94e2154644f62838d6870e7040eb406b16aafdfd9c0989c89bd8d47be98b61c3e6e9c6e3e2662764281a879daf88f0406679a74dd5e4542d68945fd482e4daf7ec5a2583cd096287515b0cbcfe6340cf2bd21a126e56a7fda1ae5b6e7cfbc4bbad7f34e9b0d8c774bdb4477455e634d2c80425258d69498cdf5dcf5af3e06cee3c81ee86220e892c2c874143ad65670a8f71fbb4e9233debf7ceb01267b388a7b1548308e4186a6a1bee01740447f0b4acff4e5ad8c67c1bfb1fd11c0d6732d1c66e71d1150d1c54a4381e2ae1a5b3cb0ec91b2b802fe5310e8cfeddb669cb48ec1baa5a03ed4cc9a7aa9d14d994c12724c2fbf312330a8e2f87c94a4ff2c70a1aae5988b1766bdade34bbd68029a60cc5b5ab16f659a2b38095c3430f4ed71ef8f9a5e13dc67ef52b4af1b5c183f4530cea59e51305e956a0585eaa7604c8ca4e52229327be24438e6237ba26df604de86f2b3a0aa49efce1e06a732399cd6e7caa3d8fde1be7cb91fb2565bf5d36a58c33766739cc9f009d44d6f814ca86f674da4ef764f8e40c2605b408a525c3e20d74f4379f91f7b530cdce651644f6b58ca8ded776398f53b845038dfd1be1e9258246355c188bf2f60bc7ea16411dfe785ddfbec30687a15a2ea280461566896cbe1bf196a6cc7a62d8d6363586e4d91fc705fc32ae5c3fc489ce8d23fef1d5a0b8c23a4944d0f3af3ac884727f22e0cbb6edf353102ed253ea2d056081c76990ce54882e59a74efe0bd7960071d4b3593381abd880670f61a95db4959c708282b8aeaa064c605aae2e5a42fa6687b286039e0481b7f97676c28a0944ae209", + "validity_proof_data_hex": "b0aea323b18453bbf74f03044da9dd93e19f5f50bd125f8d376ae6dc74d35701e22809202e4d8f13770e8bcb5f37c5e6e18c122e2cd0c6d09b57c4517cfc095574138826ae2136413f5389d61c0a35d0b0f12fedd786c802da475719b235d7772a6fdbea9fbd272893d2ab1378013f10642f6a0efc9d7cb6620ffef2c3f4dc296ea01f6885bdbd38e37060c354d88c19c9dead19d854885940e5c26fe354476e0acb5bdf3df35b65cdbc5b054e9d2e09dbc3b6c91b12ecf18fe7779f105b3e67428b68e309c9251a70c6b72d488823c593188f02f89009602e3192f645a7902906023c4ac1d07471e29ff963fcae9407e68c1e20d67be40f599b6681cf35ee5504da9a34c688bfee1d8712e32cd715d9d37baaa2bb4189c7615c9c194fa58e568c968e3eeeb536d8245173b8c502d65d6a846aee910ef958782827a68ed5ed52566dd1f007a166ed5f0ac802783c733c5d884762ac1bfa2b3c52f605bec9ee1127c676695e3835eae79898720de6bf218b2f88090f84f20820c262f8897a780b1b89ac4e28a37644b091845f431abc4181e9d4f2f4392ffc1d6f3c99c94a0e09" }, "binding": { - "current_balance_commitment_hex": "4651ac354851bf6db7345197988f90aa6fe6e455a2d38982793fe3f899773d32", - "current_balance_handle_hex": "c2d94d97912e21eea2b85b38977124049a4352ee83b2dc3ab65bca1b3370af29", - "recipient_pubkey_hex": "f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a76", - "sender_pubkey_hex": "36d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317" + "current_balance_commitment_hex": "e84f4045138b1f85c2a1ead1211380c3ce39ad581c9cc2d2e82d200f38c5fd68", + "current_balance_handle_hex": "0a7ef17c24ceea3e1dce057b29b6c22c646c4180e0cdd252fab8b0db5ae6625f", + "recipient_pubkey_hex": "e22809202e4d8f13770e8bcb5f37c5e6e18c122e2cd0c6d09b57c4517cfc0955", + "sender_pubkey_hex": "b0aea323b18453bbf74f03044da9dd93e19f5f50bd125f8d376ae6dc74d35701" }, "mutations": [ { @@ -1156,7 +1156,7 @@ "op": "bitflip", "target": "binding.sender_pubkey_hex", "params": { - "value_hex": "37d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317" + "value_hex": "b1aea323b18453bbf74f03044da9dd93e19f5f50bd125f8d376ae6dc74d35701" }, "expected_valid": false, "expected_error_contains": "failed" @@ -1166,7 +1166,7 @@ "op": "bitflip", "target": "binding.recipient_pubkey_hex", "params": { - "value_hex": "f95e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a76" + "value_hex": "e32809202e4d8f13770e8bcb5f37c5e6e18c122e2cd0c6d09b57c4517cfc0955" }, "expected_valid": false, "expected_error_contains": "failed" @@ -1186,7 +1186,7 @@ "op": "truncate", "target": "payload.range_proof_data_hex", "params": { - "value_hex": "30c0c25a7168d2882ecbbeacc9e713ee6a7c2a9dc3696264a850a61c5c98df6224588418ad89f5b16d98d3365845085c9ca5fe922bd0911be2137d860489ef600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a2d8b9b8a7a1eca41a37c2dd138cb5d1807da6157b6b8e8dabfe78cdf6bddc58cabac8699fefc87a9d5f96a197ba6929ad8c941f3947bf7177ec2cb93e50324eceb15e54d879a6e73413469a0dc682515f7941665f53fe3b068e8605173257445ee61d2baefc1f6c2ffbea0bf9aa70bf29d066346ce401f344563195e588f042c21461c22565ac0463a15bc50cd3726d9fe2f97f70ed75ccd30b2569921b550b431a96b4c002ba704b8af5ab5dd5ba78cb4ea810d4b220538c326788a231f90667e216464e8d7d612c6e1e2a07287fa83ca63a4aab7e58764365c160ab1b380e52ec1311b121670dde79071883cb2549acc78d5293b4b65596603465fa8ad87dd690db2ac6b2d64ca11236059de84d867fe593ecbdc5c09d4e0037fb0fdc4219b884a855341b1326216cd710abdf76980d9721283a5d02d9514537a1d4312e5150edbbf425583855c753b353985e2766ac68ae6c5447c862c0eb80317e93ba32ca79984b0502d1575284e428e2830db208be8c672c5a69bc05c967440fda6349b295fc62829138611b12eac6596850461494251ce94e84b093105b415c1a52159cb7d748981375c773199eb640adfe4e4fdfa49106bc04668df4dcaccd604b10c672eff411c3ed0b1ab127059b6f7818ea90bcce2a91acf262802876c160cd740a026b940d88439611b0b27b2587b613af70fb1b2d508b1f307ea82b8d04ff5224765efa342e68cd82210c46c0d634e84cf3f324f10d3d60c65ada66e9772f375c81f519d8b8426f67ac285d7239e07dddf23e1bff1dd8c11a705c36853ea8219c728804c18dd8177b589fb9e78a1fb14bdb5bc9a8d3bff3e4ba799ea61db7209e6602a5023ab55c2fc0f7b57a0830cb359c9c9963aecae2ea5495269c26bc0cce908e6bca91ba089c02428fc6a3ac2a619f500c54cc4c39597ce045a2d2865c1781ac044c9c8522fc90a732e3757e90be7d5c70dc2d3ffa7ae5a94d351096099576333f01d09d640450255965975d299f8b5a9412fda2eab053d38586a2" + "value_hex": "6ce971a2f7a20bb5273aa05a3a6aa58d2d347136f8af0633ea8017c858887a6f74138826ae2136413f5389d61c0a35d0b0f12fedd786c802da475719b235d77700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000009e01c637d88379a03e4fabf860805daf09768d07ae91fb0cda96a468686a4b2cc21e9c28ab574dd5e6a471a6910687818c757e02bb90c818f2636d24d91fba240e5ecd3093601318a45691d017a1832854594c732508b3320ef81d19433e9279ee8e1218a13dd7d07b09c8066c49f66abbe9d34cd14b5336abca91a4d022bc4ba19f422609c5a62c989b78f8d23a1f26f94e2154644f62838d6870e7040eb406b16aafdfd9c0989c89bd8d47be98b61c3e6e9c6e3e2662764281a879daf88f0406679a74dd5e4542d68945fd482e4daf7ec5a2583cd096287515b0cbcfe6340cf2bd21a126e56a7fda1ae5b6e7cfbc4bbad7f34e9b0d8c774bdb4477455e634d2c80425258d69498cdf5dcf5af3e06cee3c81ee86220e892c2c874143ad65670a8f71fbb4e9233debf7ceb01267b388a7b1548308e4186a6a1bee01740447f0b4acff4e5ad8c67c1bfb1fd11c0d6732d1c66e71d1150d1c54a4381e2ae1a5b3cb0ec91b2b802fe5310e8cfeddb669cb48ec1baa5a03ed4cc9a7aa9d14d994c12724c2fbf312330a8e2f87c94a4ff2c70a1aae5988b1766bdade34bbd68029a60cc5b5ab16f659a2b38095c3430f4ed71ef8f9a5e13dc67ef52b4af1b5c183f4530cea59e51305e956a0585eaa7604c8ca4e52229327be24438e6237ba26df604de86f2b3a0aa49efce1e06a732399cd6e7caa3d8fde1be7cb91fb2565bf5d36a58c33766739cc9f009d44d6f814ca86f674da4ef764f8e40c2605b408a525c3e20d74f4379f91f7b530cdce651644f6b58ca8ded776398f53b845038dfd1be1e9258246355c188bf2f60bc7ea16411dfe785ddfbec30687a15a2ea280461566896cbe1bf196a6cc7a62d8d6363586e4d91fc705fc32ae5c3fc489ce8d23fef1d5a0b8c23a4944d0f3af3ac884727f22e0cbb6edf353102ed253ea2d056081c76990ce54882e59a74efe0bd7960071d4b3593381abd880670f61a95db4959c708282b8aeaa064c605aae2e5a42fa6687b286039e0481b7f97676c28a0944a" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -1198,7 +1198,7 @@ "family": "equality", "expected_valid": true, "payload": { - "proof_data_hex": "f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7616cee89858876c6db2c389bfa93cbda033281ce2c20c9636a29b0fd4e9db1d31c404df3215035706cd538f45b2bf340d6af3e106e7bfa6955067dc5c141d2442fed7eef0f734800b63277b8420bf111dcb6ba2508e9635fb35bdc9a37e45b2408a7ca7bf9843bc0c1f75ec770aea06eeff42ea96ff714aaab4c3fab7db25d32c9e940a14facebfacd56c1dd72482a1f5b0b2c344967dc02de1a731319393c861ccb4a842c97703c4646d1a31bafa6cf114015277329a0272c2a072dc59dc2b6d0e712d30abc35b39cbbecb48c2fa1786ca75fff4ac30d0a21f264c43a1f4ee03164719d14fac448c036ab20aa95c26a35f4dae519090ff5a2f52e47c8ce71a09ab2f3e9d3f6f0ff5428f6e5b817ff1b7c64547372b52df564832584df3c5f103" + "proof_data_hex": "e22809202e4d8f13770e8bcb5f37c5e6e18c122e2cd0c6d09b57c4517cfc09558a3e4b74d20a110ed7f884315cb02dc7e46d2321c8062b29b937a5c133154a06fe46b1b6ed36d0be49dcb22d411a089b202fbf73f5714330a46fffc21788505220e698474455bb7250a1db9152cb50d284f13403c4d714c59d764d7f90e9dd309c8fa4498d880993247d6b49431d1dfefa29c65716ec6f5c7aabadebd1693c4232b88ff6394c5011efce7544daeef3310d83d8013d310323900ea86cb71d8f1706fa2fdd4bc5a977c2b7ca2f918f60e3b37d028670dadaeb47b697e9d0db4a17f7587018d39bbf4840ec66cd33db4b377075b4fe025cd74f1d26f106597b0209905961556d3afd59c7f943849cecae998ed872b0a95cdfa2823f19a82c631e0eee388e213a6ffdc56f39c8b072552d76279f630096735936b51787b1a9456f0e" }, "mutations": [ { @@ -1206,7 +1206,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "f95e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7616cee89858876c6db2c389bfa93cbda033281ce2c20c9636a29b0fd4e9db1d31c404df3215035706cd538f45b2bf340d6af3e106e7bfa6955067dc5c141d2442fed7eef0f734800b63277b8420bf111dcb6ba2508e9635fb35bdc9a37e45b2408a7ca7bf9843bc0c1f75ec770aea06eeff42ea96ff714aaab4c3fab7db25d32c9e940a14facebfacd56c1dd72482a1f5b0b2c344967dc02de1a731319393c861ccb4a842c97703c4646d1a31bafa6cf114015277329a0272c2a072dc59dc2b6d0e712d30abc35b39cbbecb48c2fa1786ca75fff4ac30d0a21f264c43a1f4ee03164719d14fac448c036ab20aa95c26a35f4dae519090ff5a2f52e47c8ce71a09ab2f3e9d3f6f0ff5428f6e5b817ff1b7c64547372b52df564832584df3c5f103" + "value_hex": "e32809202e4d8f13770e8bcb5f37c5e6e18c122e2cd0c6d09b57c4517cfc09558a3e4b74d20a110ed7f884315cb02dc7e46d2321c8062b29b937a5c133154a06fe46b1b6ed36d0be49dcb22d411a089b202fbf73f5714330a46fffc21788505220e698474455bb7250a1db9152cb50d284f13403c4d714c59d764d7f90e9dd309c8fa4498d880993247d6b49431d1dfefa29c65716ec6f5c7aabadebd1693c4232b88ff6394c5011efce7544daeef3310d83d8013d310323900ea86cb71d8f1706fa2fdd4bc5a977c2b7ca2f918f60e3b37d028670dadaeb47b697e9d0db4a17f7587018d39bbf4840ec66cd33db4b377075b4fe025cd74f1d26f106597b0209905961556d3afd59c7f943849cecae998ed872b0a95cdfa2823f19a82c631e0eee388e213a6ffdc56f39c8b072552d76279f630096735936b51787b1a9456f0e" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -1216,7 +1216,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7616cee89858876c6db2c389bfa93cbda033281ce2c20c9636a29b0fd4e9db1d31c404df3215035706cd538f45b2bf340d6af3e106e7bfa6955067dc5c141d2442fed7eef0f734800b63277b8420bf111dcb6ba2508e9635fb35bdc9a37e45b2408a7ca7bf9843bc0c1f75ec770aea06eeff42ea96ff714aaab4c3fab7db25d32c9e940a14facebfacd56c1dd72482a1f5b0b2c344967dc02de1a731319393c861ccb4a842c97703c4646d1a31bafa6cf114015277329a0272c2a072dc59dc2b6d0e712d30abc35b39cbbecb48c2fa1786ca75fff4ac30d0a21f264c43a1f4ee03164719d14fac448c036ab20aa95c26a35f4dae519090ff5a2f52e47c8ce71a09ab2f3e9d3f6f0ff5428f6e5b817ff1b7c64547372b52df564832584df3c5" + "value_hex": "e22809202e4d8f13770e8bcb5f37c5e6e18c122e2cd0c6d09b57c4517cfc09558a3e4b74d20a110ed7f884315cb02dc7e46d2321c8062b29b937a5c133154a06fe46b1b6ed36d0be49dcb22d411a089b202fbf73f5714330a46fffc21788505220e698474455bb7250a1db9152cb50d284f13403c4d714c59d764d7f90e9dd309c8fa4498d880993247d6b49431d1dfefa29c65716ec6f5c7aabadebd1693c4232b88ff6394c5011efce7544daeef3310d83d8013d310323900ea86cb71d8f1706fa2fdd4bc5a977c2b7ca2f918f60e3b37d028670dadaeb47b697e9d0db4a17f7587018d39bbf4840ec66cd33db4b377075b4fe025cd74f1d26f106597b0209905961556d3afd59c7f943849cecae998ed872b0a95cdfa2823f19a82c631e0eee388e213a6ffdc56f39c8b072552d76279f630096735936b51787b1a945" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -1238,7 +1238,7 @@ "family": "validity", "expected_valid": true, "payload": { - "proof_data_hex": "f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7630943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de62141acb171db8e9f6aabcb4affd4abfd1eac9a982cf04af96017e57bb9b89024568fc0acca3f5e811bd1d54aada7d71f57e8a47aa21fed86f9bb53dee27723ca9767a668df2ce76caf0c519679121fca658185afefb91ed8c52945960e18afa622f3eaa1b02e2fc51d5855e538a849284cd12f4db794ce26b7e981efcaac99aa5603ae61fa7ea08af973a9118a2c48bf285320b79e24ed8883302cf8f7df060a8004c5c0938fed54f8fff48e9ac6b489e847f0c3677ef77be14126dcf6327a8191c1ad83e1793bfdfc22e69b40984c05e0c1954e248339bf9e1bd29804656307b365ad72759fa216f0e810f6781e130fe2db2095ddb1a07efb03b7056c81a1d02268cf9bed68ced0bbec9049f107dca9f1584fa61fbb7ade874b1759cc03db19c6b5d282e2d70f820a30e4a12489678ed9d48df09806efeb06e779750ba2fa85e090723934eed1daf31448a79e0d453d1ce8d8851941bd9d3017f667d60959e700c" + "proof_data_hex": "e22809202e4d8f13770e8bcb5f37c5e6e18c122e2cd0c6d09b57c4517cfc095592d8c7b5d6906b6f027c99e3e28f632cebf1da7aca95a70f1b823edeef6788178697a4e5d29d9ea7913c1c7b07ff2ccf4b73554ea69f3b8c96cfbc527e4acd7b3ca9509bab79636b5cc4eda17a3c199446d191ab60c0c3b4e359b9478965a425564d94600555ac1fb9800dace59b52e01fec11a49b3e31eb0b0acae3473e752818eaad493f563e65f15cc68535a5d5e716dbb4212c4dfce80c1dc94deaf6d7180e2070617fd6c3adf9b8519ae741e8387946997bc311decad8f5fa6797226c14f8792235d8096311d307164939bce612b63fbead0dcd0079852e14dddcd8ee41e6db0e868399df37a8dc38b70843c38f872b056e8667349c81ae7af861252c2fc4df8c698e3386704f94be0c95d08114e485dfea491cd0cbcafc4f22f1f9ab734a5654cfb907658b996c8620619d3f3eec6980f66d49bf4ffc1e6dfcb8c8a5339bb61f028a1b3fe0557b4340dccb9133aaafe16def7678c19d1ffce577c15e0c479175e1159fc053f09cc217539d58921ea584b54302f03b20e91cdbb8a54d02" }, "mutations": [ { @@ -1246,7 +1246,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "f95e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7630943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de62141acb171db8e9f6aabcb4affd4abfd1eac9a982cf04af96017e57bb9b89024568fc0acca3f5e811bd1d54aada7d71f57e8a47aa21fed86f9bb53dee27723ca9767a668df2ce76caf0c519679121fca658185afefb91ed8c52945960e18afa622f3eaa1b02e2fc51d5855e538a849284cd12f4db794ce26b7e981efcaac99aa5603ae61fa7ea08af973a9118a2c48bf285320b79e24ed8883302cf8f7df060a8004c5c0938fed54f8fff48e9ac6b489e847f0c3677ef77be14126dcf6327a8191c1ad83e1793bfdfc22e69b40984c05e0c1954e248339bf9e1bd29804656307b365ad72759fa216f0e810f6781e130fe2db2095ddb1a07efb03b7056c81a1d02268cf9bed68ced0bbec9049f107dca9f1584fa61fbb7ade874b1759cc03db19c6b5d282e2d70f820a30e4a12489678ed9d48df09806efeb06e779750ba2fa85e090723934eed1daf31448a79e0d453d1ce8d8851941bd9d3017f667d60959e700c" + "value_hex": "e32809202e4d8f13770e8bcb5f37c5e6e18c122e2cd0c6d09b57c4517cfc095592d8c7b5d6906b6f027c99e3e28f632cebf1da7aca95a70f1b823edeef6788178697a4e5d29d9ea7913c1c7b07ff2ccf4b73554ea69f3b8c96cfbc527e4acd7b3ca9509bab79636b5cc4eda17a3c199446d191ab60c0c3b4e359b9478965a425564d94600555ac1fb9800dace59b52e01fec11a49b3e31eb0b0acae3473e752818eaad493f563e65f15cc68535a5d5e716dbb4212c4dfce80c1dc94deaf6d7180e2070617fd6c3adf9b8519ae741e8387946997bc311decad8f5fa6797226c14f8792235d8096311d307164939bce612b63fbead0dcd0079852e14dddcd8ee41e6db0e868399df37a8dc38b70843c38f872b056e8667349c81ae7af861252c2fc4df8c698e3386704f94be0c95d08114e485dfea491cd0cbcafc4f22f1f9ab734a5654cfb907658b996c8620619d3f3eec6980f66d49bf4ffc1e6dfcb8c8a5339bb61f028a1b3fe0557b4340dccb9133aaafe16def7678c19d1ffce577c15e0c479175e1159fc053f09cc217539d58921ea584b54302f03b20e91cdbb8a54d02" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -1256,7 +1256,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7630943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de62141acb171db8e9f6aabcb4affd4abfd1eac9a982cf04af96017e57bb9b89024568fc0acca3f5e811bd1d54aada7d71f57e8a47aa21fed86f9bb53dee27723ca9767a668df2ce76caf0c519679121fca658185afefb91ed8c52945960e18afa622f3eaa1b02e2fc51d5855e538a849284cd12f4db794ce26b7e981efcaac99aa5603ae61fa7ea08af973a9118a2c48bf285320b79e24ed8883302cf8f7df060a8004c5c0938fed54f8fff48e9ac6b489e847f0c3677ef77be14126dcf6327a8191c1ad83e1793bfdfc22e69b40984c05e0c1954e248339bf9e1bd29804656307b365ad72759fa216f0e810f6781e130fe2db2095ddb1a07efb03b7056c81a1d02268cf9bed68ced0bbec9049f107dca9f1584fa61fbb7ade874b1759cc03db19c6b5d282e2d70f820a30e4a12489678ed9d48df09806efeb06e779750ba2fa85e090723934eed1daf31448a79e0d453d1ce8d8851941bd9d3017f667d60959e" + "value_hex": "e22809202e4d8f13770e8bcb5f37c5e6e18c122e2cd0c6d09b57c4517cfc095592d8c7b5d6906b6f027c99e3e28f632cebf1da7aca95a70f1b823edeef6788178697a4e5d29d9ea7913c1c7b07ff2ccf4b73554ea69f3b8c96cfbc527e4acd7b3ca9509bab79636b5cc4eda17a3c199446d191ab60c0c3b4e359b9478965a425564d94600555ac1fb9800dace59b52e01fec11a49b3e31eb0b0acae3473e752818eaad493f563e65f15cc68535a5d5e716dbb4212c4dfce80c1dc94deaf6d7180e2070617fd6c3adf9b8519ae741e8387946997bc311decad8f5fa6797226c14f8792235d8096311d307164939bce612b63fbead0dcd0079852e14dddcd8ee41e6db0e868399df37a8dc38b70843c38f872b056e8667349c81ae7af861252c2fc4df8c698e3386704f94be0c95d08114e485dfea491cd0cbcafc4f22f1f9ab734a5654cfb907658b996c8620619d3f3eec6980f66d49bf4ffc1e6dfcb8c8a5339bb61f028a1b3fe0557b4340dccb9133aaafe16def7678c19d1ffce577c15e0c479175e1159fc053f09cc217539d58921ea584b54302f03b20e91cdbb8a5" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -1278,7 +1278,7 @@ "family": "transfer_range", "expected_valid": true, "payload": { - "proof_data_hex": "fed7eef0f734800b63277b8420bf111dcb6ba2508e9635fb35bdc9a37e45b2401acb171db8e9f6aabcb4affd4abfd1eac9a982cf04af96017e57bb9b890245680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000ca7280619ee0ca599127393f3a0beaa5e696112177168a2c431dba199f5d1902c8d65f55fabfb9384aa4e5b027514e469f100dc5005c8aeac10b074ef365a857ba826694ae9a5a287820db647c70a954adf14458cb09430ffaed00d42c978911a235151add0cbe42f717926f3725693dad09c05b641a70c97cb2b71aea104c3fba2bf581f081151443845eaa06a9c3e1738b521493d1854be45f62df64e75e0261559a59eec76969259d888e362989cd4793bea53cd8ca8f8788e15fe40f1d08a742e7ad81c33b5d3d0ad4e61b1a48054a00005393862765c5981492de1456013ae35e17204041227efadf84f43d2ba3caa678a1811275e3fe8814d5ad6ea769fea3347ffdaa560957ff6278417c9368d19df599f757f6c4c3391154d8152356c8f8c0794fa3bfdf04e350dd2efd3175892b88b76c97a5507106055f30ecf4713632d74d949d1e204e1727092f33a9746cfed47a4ac715f7299c23c38db95925fc8bf13045c5acc9ae54fc5041b5dbf52b0e87f23c233c853254fb2e58a53d043616ee147d73a3cb3a75add5e26d1e40a82735688dd61e9a319bcb7e737324044edda301e7bc765b072d7d28610c430127cf5362770bffa3dd04b3c61e34412ba2238943083b323ab3c558f1e685f766fa07948ef090cf14da3d8fff533aa03b42ad969fcc0c74a4a70ce1a9e4d070455693e42d9b974bb1c2340422a64ae870b68eda2044107a0347bb47a74f8c82cdc683e9d900e93bb24b43b872c8305451b4a2034e60bc4b06a4c319394902b43a7ed7ee9ef2a228194a0786aedecd2070049450fa3c177e9f3d585071245572875ebc80026bd6a738d8f5cf869b72181376a012418d7287b7c7c8674a2f13b765a1782b4758ba2bd58d66e56163bcf44cfc3a99e5626de2760c8c3e7ba04edeaf5853df677060c7e80a02d829d567d45389b5aec9fb6a88b53091b25d6175faa8135a6d8c70bd8e18fd5388a49b4d3a029c82826233dc39a3260fbeb6656814826e8de6772b51d4b8b6a7581b0729f10e" + "proof_data_hex": "20e698474455bb7250a1db9152cb50d284f13403c4d714c59d764d7f90e9dd308697a4e5d29d9ea7913c1c7b07ff2ccf4b73554ea69f3b8c96cfbc527e4acd7b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000008e8eced3450efe55461fa3c9e19111cb18fe19550c3fd3ff24f4801fea665f424886a7637633cb8e7cb3abda1959df4bae2edbbfa2f57a6e0f1bec2fedb1b431ee665f0dfbba05d90dc835169843eaac1d86cfea95364327cddc3b9dd2ac0f337ee0b5d8bca8c163fbb75b20d79e74a1a1a5623701129d3f2e1f804e9eb0c46a6b26629587681bc1f00e976aebf244fce22a90ab98844dc10a16819c7cbb830b9397459076db9ef87913e7592b78297d46f01e767c79d3db6e826a9ae6a41b091f9eb1fd8dff5f3b0ba85752323073ac1d92f44dbd7785ae1a1f0a3bddc4930f18075f18274d61a2397b14fd6b37a24d416af357b44f67fbdca59f6a22102d6ff85d30dd7ffeb07af28c1dae1f3cd7082a2fb85bb20dff0e39a4328a58eab8487699749209ac2a5c45e47312fc254682fa6338d7954236852634def3bbde357c8ad02cecbd6edb4e72af3593a9ed6e64848ba712247b3397271fbed537ea4b0500aacb44da014cb97e4633c19a0302c979917cd1fdb3f390bdd2a529a12e5a6e94193ae5a6355b8b7eada330008be9c6edb3d6664c28d7cba5b58e141fc89633223f3d6ebe6b88f98850568983202c215407fc4937400b961f2712d955077e2ce44f27c551d26a894b30813c5769886a6b4e652d97a1b8f5e048fc7b45d95b7ed2878195c3256f9867ababb7aabb11d2b558a22e589e093ffdb7986db7e0de778e497b2a7c1c68aabda32cd75f81948b1e2a32eeb233327454149d7eaed6970180439c9a16c1b73d4e49084f51e313d0034c72e573dd7a963ae692a849f85516304cb28c4db3a0618d3efd33e82081b1f8c3d3ff4bf23c7078ce5392308b8b5bb8427069957a33f44164ee23fe43292501223b4bc1ebe249dc37a14f43d4d46a388d1ab7a76bd0eae25473796d6ccc5e066d10129c1d342974b9d13e9ab3d07498985eacdaf2d2df5407530ff58166873bcc24b87e7cfb24f86b635cac909500bd7b73283f5bbde9ef992053a37e8f4b6e1d30f0dfedf15fb8efc65036ed260e" }, "mutations": [ { @@ -1286,7 +1286,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "ffd7eef0f734800b63277b8420bf111dcb6ba2508e9635fb35bdc9a37e45b2401acb171db8e9f6aabcb4affd4abfd1eac9a982cf04af96017e57bb9b890245680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000ca7280619ee0ca599127393f3a0beaa5e696112177168a2c431dba199f5d1902c8d65f55fabfb9384aa4e5b027514e469f100dc5005c8aeac10b074ef365a857ba826694ae9a5a287820db647c70a954adf14458cb09430ffaed00d42c978911a235151add0cbe42f717926f3725693dad09c05b641a70c97cb2b71aea104c3fba2bf581f081151443845eaa06a9c3e1738b521493d1854be45f62df64e75e0261559a59eec76969259d888e362989cd4793bea53cd8ca8f8788e15fe40f1d08a742e7ad81c33b5d3d0ad4e61b1a48054a00005393862765c5981492de1456013ae35e17204041227efadf84f43d2ba3caa678a1811275e3fe8814d5ad6ea769fea3347ffdaa560957ff6278417c9368d19df599f757f6c4c3391154d8152356c8f8c0794fa3bfdf04e350dd2efd3175892b88b76c97a5507106055f30ecf4713632d74d949d1e204e1727092f33a9746cfed47a4ac715f7299c23c38db95925fc8bf13045c5acc9ae54fc5041b5dbf52b0e87f23c233c853254fb2e58a53d043616ee147d73a3cb3a75add5e26d1e40a82735688dd61e9a319bcb7e737324044edda301e7bc765b072d7d28610c430127cf5362770bffa3dd04b3c61e34412ba2238943083b323ab3c558f1e685f766fa07948ef090cf14da3d8fff533aa03b42ad969fcc0c74a4a70ce1a9e4d070455693e42d9b974bb1c2340422a64ae870b68eda2044107a0347bb47a74f8c82cdc683e9d900e93bb24b43b872c8305451b4a2034e60bc4b06a4c319394902b43a7ed7ee9ef2a228194a0786aedecd2070049450fa3c177e9f3d585071245572875ebc80026bd6a738d8f5cf869b72181376a012418d7287b7c7c8674a2f13b765a1782b4758ba2bd58d66e56163bcf44cfc3a99e5626de2760c8c3e7ba04edeaf5853df677060c7e80a02d829d567d45389b5aec9fb6a88b53091b25d6175faa8135a6d8c70bd8e18fd5388a49b4d3a029c82826233dc39a3260fbeb6656814826e8de6772b51d4b8b6a7581b0729f10e" + "value_hex": "21e698474455bb7250a1db9152cb50d284f13403c4d714c59d764d7f90e9dd308697a4e5d29d9ea7913c1c7b07ff2ccf4b73554ea69f3b8c96cfbc527e4acd7b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000008e8eced3450efe55461fa3c9e19111cb18fe19550c3fd3ff24f4801fea665f424886a7637633cb8e7cb3abda1959df4bae2edbbfa2f57a6e0f1bec2fedb1b431ee665f0dfbba05d90dc835169843eaac1d86cfea95364327cddc3b9dd2ac0f337ee0b5d8bca8c163fbb75b20d79e74a1a1a5623701129d3f2e1f804e9eb0c46a6b26629587681bc1f00e976aebf244fce22a90ab98844dc10a16819c7cbb830b9397459076db9ef87913e7592b78297d46f01e767c79d3db6e826a9ae6a41b091f9eb1fd8dff5f3b0ba85752323073ac1d92f44dbd7785ae1a1f0a3bddc4930f18075f18274d61a2397b14fd6b37a24d416af357b44f67fbdca59f6a22102d6ff85d30dd7ffeb07af28c1dae1f3cd7082a2fb85bb20dff0e39a4328a58eab8487699749209ac2a5c45e47312fc254682fa6338d7954236852634def3bbde357c8ad02cecbd6edb4e72af3593a9ed6e64848ba712247b3397271fbed537ea4b0500aacb44da014cb97e4633c19a0302c979917cd1fdb3f390bdd2a529a12e5a6e94193ae5a6355b8b7eada330008be9c6edb3d6664c28d7cba5b58e141fc89633223f3d6ebe6b88f98850568983202c215407fc4937400b961f2712d955077e2ce44f27c551d26a894b30813c5769886a6b4e652d97a1b8f5e048fc7b45d95b7ed2878195c3256f9867ababb7aabb11d2b558a22e589e093ffdb7986db7e0de778e497b2a7c1c68aabda32cd75f81948b1e2a32eeb233327454149d7eaed6970180439c9a16c1b73d4e49084f51e313d0034c72e573dd7a963ae692a849f85516304cb28c4db3a0618d3efd33e82081b1f8c3d3ff4bf23c7078ce5392308b8b5bb8427069957a33f44164ee23fe43292501223b4bc1ebe249dc37a14f43d4d46a388d1ab7a76bd0eae25473796d6ccc5e066d10129c1d342974b9d13e9ab3d07498985eacdaf2d2df5407530ff58166873bcc24b87e7cfb24f86b635cac909500bd7b73283f5bbde9ef992053a37e8f4b6e1d30f0dfedf15fb8efc65036ed260e" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -1296,7 +1296,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "fed7eef0f734800b63277b8420bf111dcb6ba2508e9635fb35bdc9a37e45b2401acb171db8e9f6aabcb4affd4abfd1eac9a982cf04af96017e57bb9b890245680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000ca7280619ee0ca599127393f3a0beaa5e696112177168a2c431dba199f5d1902c8d65f55fabfb9384aa4e5b027514e469f100dc5005c8aeac10b074ef365a857ba826694ae9a5a287820db647c70a954adf14458cb09430ffaed00d42c978911a235151add0cbe42f717926f3725693dad09c05b641a70c97cb2b71aea104c3fba2bf581f081151443845eaa06a9c3e1738b521493d1854be45f62df64e75e0261559a59eec76969259d888e362989cd4793bea53cd8ca8f8788e15fe40f1d08a742e7ad81c33b5d3d0ad4e61b1a48054a00005393862765c5981492de1456013ae35e17204041227efadf84f43d2ba3caa678a1811275e3fe8814d5ad6ea769fea3347ffdaa560957ff6278417c9368d19df599f757f6c4c3391154d8152356c8f8c0794fa3bfdf04e350dd2efd3175892b88b76c97a5507106055f30ecf4713632d74d949d1e204e1727092f33a9746cfed47a4ac715f7299c23c38db95925fc8bf13045c5acc9ae54fc5041b5dbf52b0e87f23c233c853254fb2e58a53d043616ee147d73a3cb3a75add5e26d1e40a82735688dd61e9a319bcb7e737324044edda301e7bc765b072d7d28610c430127cf5362770bffa3dd04b3c61e34412ba2238943083b323ab3c558f1e685f766fa07948ef090cf14da3d8fff533aa03b42ad969fcc0c74a4a70ce1a9e4d070455693e42d9b974bb1c2340422a64ae870b68eda2044107a0347bb47a74f8c82cdc683e9d900e93bb24b43b872c8305451b4a2034e60bc4b06a4c319394902b43a7ed7ee9ef2a228194a0786aedecd2070049450fa3c177e9f3d585071245572875ebc80026bd6a738d8f5cf869b72181376a012418d7287b7c7c8674a2f13b765a1782b4758ba2bd58d66e56163bcf44cfc3a99e5626de2760c8c3e7ba04edeaf5853df677060c7e80a02d829d567d45389b5aec9fb6a88b53091b25d6175faa8135a6d8c70bd8e18fd5388a49b4d3a029c82826233dc39a3260fbeb6656814826e8de6772b51d4b8b6a7581b0729" + "value_hex": "20e698474455bb7250a1db9152cb50d284f13403c4d714c59d764d7f90e9dd308697a4e5d29d9ea7913c1c7b07ff2ccf4b73554ea69f3b8c96cfbc527e4acd7b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000008e8eced3450efe55461fa3c9e19111cb18fe19550c3fd3ff24f4801fea665f424886a7637633cb8e7cb3abda1959df4bae2edbbfa2f57a6e0f1bec2fedb1b431ee665f0dfbba05d90dc835169843eaac1d86cfea95364327cddc3b9dd2ac0f337ee0b5d8bca8c163fbb75b20d79e74a1a1a5623701129d3f2e1f804e9eb0c46a6b26629587681bc1f00e976aebf244fce22a90ab98844dc10a16819c7cbb830b9397459076db9ef87913e7592b78297d46f01e767c79d3db6e826a9ae6a41b091f9eb1fd8dff5f3b0ba85752323073ac1d92f44dbd7785ae1a1f0a3bddc4930f18075f18274d61a2397b14fd6b37a24d416af357b44f67fbdca59f6a22102d6ff85d30dd7ffeb07af28c1dae1f3cd7082a2fb85bb20dff0e39a4328a58eab8487699749209ac2a5c45e47312fc254682fa6338d7954236852634def3bbde357c8ad02cecbd6edb4e72af3593a9ed6e64848ba712247b3397271fbed537ea4b0500aacb44da014cb97e4633c19a0302c979917cd1fdb3f390bdd2a529a12e5a6e94193ae5a6355b8b7eada330008be9c6edb3d6664c28d7cba5b58e141fc89633223f3d6ebe6b88f98850568983202c215407fc4937400b961f2712d955077e2ce44f27c551d26a894b30813c5769886a6b4e652d97a1b8f5e048fc7b45d95b7ed2878195c3256f9867ababb7aabb11d2b558a22e589e093ffdb7986db7e0de778e497b2a7c1c68aabda32cd75f81948b1e2a32eeb233327454149d7eaed6970180439c9a16c1b73d4e49084f51e313d0034c72e573dd7a963ae692a849f85516304cb28c4db3a0618d3efd33e82081b1f8c3d3ff4bf23c7078ce5392308b8b5bb8427069957a33f44164ee23fe43292501223b4bc1ebe249dc37a14f43d4d46a388d1ab7a76bd0eae25473796d6ccc5e066d10129c1d342974b9d13e9ab3d07498985eacdaf2d2df5407530ff58166873bcc24b87e7cfb24f86b635cac909500bd7b73283f5bbde9ef992053a37e8f4b6e1d30f0dfedf15fb8efc65036ed" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -1316,7 +1316,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "fed7eef0f734800b63277b8420bf111dcb6ba2508e9635fb35bdc9a37e45b2401acb171db8e9f6aabcb4affd4abfd1eac9a982cf04af96017e57bb9b890245680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000ca7280619ee0ca599127393f3a0beaa5e696112177168a2c431dba199f5d1902c8d65f55fabfb9384aa4e5b027514e469f100dc5005c8aeac10b074ef365a857ba826694ae9a5a287820db647c70a954adf14458cb09430ffaed00d42c978911a235151add0cbe42f717926f3725693dad09c05b641a70c97cb2b71aea104c3fba2bf581f081151443845eaa06a9c3e1738b521493d1854be45f62df64e75e0261559a59eec76969259d888e362989cd4793bea53cd8ca8f8788e15fe40f1d08a742e7ad81c33b5d3d0ad4e61b1a48054a00005393862765c5981492de1456013ae35e17204041227efadf84f43d2ba3caa678a1811275e3fe8814d5ad6ea769fea3347ffdaa560957ff6278417c9368d19df599f757f6c4c3391154d8152356c8f8c0794fa3bfdf04e350dd2efd3175892b88b76c97a5507106055f30ecf4713632d74d949d1e204e1727092f33a9746cfed47a4ac715f7299c23c38db95925fc8bf13045c5acc9ae54fc5041b5dbf52b0e87f23c233c853254fb2e58a53d043616ee147d73a3cb3a75add5e26d1e40a82735688dd61e9a319bcb7e737324044edda301e7bc765b072d7d28610c430127cf5362770bffa3dd04b3c61e34412ba2238943083b323ab3c558f1e685f766fa07948ef090cf14da3d8fff533aa03b42ad969fcc0c74a4a70ce1a9e4d070455693e42d9b974bb1c2340422a64ae870b68eda2044107a0347bb47a74f8c82cdc683e9d900e93bb24b43b872c8305451b4a2034e60bc4b06a4c319394902b43a7ed7ee9ef2a228194a0786aedecd2070049450fa3c177e9f3d585071245572875ebc80026bd6a738d8f5cf869b72181376a012418d7287b7c7c8674a2f13b765a1782b4758ba2bd58d66e56163bcf44cfc3a99e5626de2760c8c3e7ba04edeaf5853df677060c7e80a02d829d567d45389b5aec9fb6a88b53091b25d6175faa8135a6d8c70bd8e18fd5388a49b4d3a029c82826233dc39a3260fbeb6656814826e8de6772b51d4b8b6a7581b0729f10f" + "value_hex": "20e698474455bb7250a1db9152cb50d284f13403c4d714c59d764d7f90e9dd308697a4e5d29d9ea7913c1c7b07ff2ccf4b73554ea69f3b8c96cfbc527e4acd7b00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000008e8eced3450efe55461fa3c9e19111cb18fe19550c3fd3ff24f4801fea665f424886a7637633cb8e7cb3abda1959df4bae2edbbfa2f57a6e0f1bec2fedb1b431ee665f0dfbba05d90dc835169843eaac1d86cfea95364327cddc3b9dd2ac0f337ee0b5d8bca8c163fbb75b20d79e74a1a1a5623701129d3f2e1f804e9eb0c46a6b26629587681bc1f00e976aebf244fce22a90ab98844dc10a16819c7cbb830b9397459076db9ef87913e7592b78297d46f01e767c79d3db6e826a9ae6a41b091f9eb1fd8dff5f3b0ba85752323073ac1d92f44dbd7785ae1a1f0a3bddc4930f18075f18274d61a2397b14fd6b37a24d416af357b44f67fbdca59f6a22102d6ff85d30dd7ffeb07af28c1dae1f3cd7082a2fb85bb20dff0e39a4328a58eab8487699749209ac2a5c45e47312fc254682fa6338d7954236852634def3bbde357c8ad02cecbd6edb4e72af3593a9ed6e64848ba712247b3397271fbed537ea4b0500aacb44da014cb97e4633c19a0302c979917cd1fdb3f390bdd2a529a12e5a6e94193ae5a6355b8b7eada330008be9c6edb3d6664c28d7cba5b58e141fc89633223f3d6ebe6b88f98850568983202c215407fc4937400b961f2712d955077e2ce44f27c551d26a894b30813c5769886a6b4e652d97a1b8f5e048fc7b45d95b7ed2878195c3256f9867ababb7aabb11d2b558a22e589e093ffdb7986db7e0de778e497b2a7c1c68aabda32cd75f81948b1e2a32eeb233327454149d7eaed6970180439c9a16c1b73d4e49084f51e313d0034c72e573dd7a963ae692a849f85516304cb28c4db3a0618d3efd33e82081b1f8c3d3ff4bf23c7078ce5392308b8b5bb8427069957a33f44164ee23fe43292501223b4bc1ebe249dc37a14f43d4d46a388d1ab7a76bd0eae25473796d6ccc5e066d10129c1d342974b9d13e9ab3d07498985eacdaf2d2df5407530ff58166873bcc24b87e7cfb24f86b635cac909500bd7b73283f5bbde9ef992053a37e8f4b6e1d30f0dfedf15fb8efc65036ed260f" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -1328,15 +1328,15 @@ "family": "transfer_composite", "expected_valid": true, "payload": { - "equality_proof_data_hex": "f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7616cee89858876c6db2c389bfa93cbda033281ce2c20c9636a29b0fd4e9db1d31c404df3215035706cd538f45b2bf340d6af3e106e7bfa6955067dc5c141d2442fed7eef0f734800b63277b8420bf111dcb6ba2508e9635fb35bdc9a37e45b2408a7ca7bf9843bc0c1f75ec770aea06eeff42ea96ff714aaab4c3fab7db25d32c9e940a14facebfacd56c1dd72482a1f5b0b2c344967dc02de1a731319393c861ccb4a842c97703c4646d1a31bafa6cf114015277329a0272c2a072dc59dc2b6d0e712d30abc35b39cbbecb48c2fa1786ca75fff4ac30d0a21f264c43a1f4ee03164719d14fac448c036ab20aa95c26a35f4dae519090ff5a2f52e47c8ce71a09ab2f3e9d3f6f0ff5428f6e5b817ff1b7c64547372b52df564832584df3c5f103", - "range_proof_data_hex": "fed7eef0f734800b63277b8420bf111dcb6ba2508e9635fb35bdc9a37e45b2401acb171db8e9f6aabcb4affd4abfd1eac9a982cf04af96017e57bb9b890245680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000ca7280619ee0ca599127393f3a0beaa5e696112177168a2c431dba199f5d1902c8d65f55fabfb9384aa4e5b027514e469f100dc5005c8aeac10b074ef365a857ba826694ae9a5a287820db647c70a954adf14458cb09430ffaed00d42c978911a235151add0cbe42f717926f3725693dad09c05b641a70c97cb2b71aea104c3fba2bf581f081151443845eaa06a9c3e1738b521493d1854be45f62df64e75e0261559a59eec76969259d888e362989cd4793bea53cd8ca8f8788e15fe40f1d08a742e7ad81c33b5d3d0ad4e61b1a48054a00005393862765c5981492de1456013ae35e17204041227efadf84f43d2ba3caa678a1811275e3fe8814d5ad6ea769fea3347ffdaa560957ff6278417c9368d19df599f757f6c4c3391154d8152356c8f8c0794fa3bfdf04e350dd2efd3175892b88b76c97a5507106055f30ecf4713632d74d949d1e204e1727092f33a9746cfed47a4ac715f7299c23c38db95925fc8bf13045c5acc9ae54fc5041b5dbf52b0e87f23c233c853254fb2e58a53d043616ee147d73a3cb3a75add5e26d1e40a82735688dd61e9a319bcb7e737324044edda301e7bc765b072d7d28610c430127cf5362770bffa3dd04b3c61e34412ba2238943083b323ab3c558f1e685f766fa07948ef090cf14da3d8fff533aa03b42ad969fcc0c74a4a70ce1a9e4d070455693e42d9b974bb1c2340422a64ae870b68eda2044107a0347bb47a74f8c82cdc683e9d900e93bb24b43b872c8305451b4a2034e60bc4b06a4c319394902b43a7ed7ee9ef2a228194a0786aedecd2070049450fa3c177e9f3d585071245572875ebc80026bd6a738d8f5cf869b72181376a012418d7287b7c7c8674a2f13b765a1782b4758ba2bd58d66e56163bcf44cfc3a99e5626de2760c8c3e7ba04edeaf5853df677060c7e80a02d829d567d45389b5aec9fb6a88b53091b25d6175faa8135a6d8c70bd8e18fd5388a49b4d3a029c82826233dc39a3260fbeb6656814826e8de6772b51d4b8b6a7581b0729f10e", - "validity_proof_data_hex": "f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a7630943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de62141acb171db8e9f6aabcb4affd4abfd1eac9a982cf04af96017e57bb9b89024568fc0acca3f5e811bd1d54aada7d71f57e8a47aa21fed86f9bb53dee27723ca9767a668df2ce76caf0c519679121fca658185afefb91ed8c52945960e18afa622f3eaa1b02e2fc51d5855e538a849284cd12f4db794ce26b7e981efcaac99aa5603ae61fa7ea08af973a9118a2c48bf285320b79e24ed8883302cf8f7df060a8004c5c0938fed54f8fff48e9ac6b489e847f0c3677ef77be14126dcf6327a8191c1ad83e1793bfdfc22e69b40984c05e0c1954e248339bf9e1bd29804656307b365ad72759fa216f0e810f6781e130fe2db2095ddb1a07efb03b7056c81a1d02268cf9bed68ced0bbec9049f107dca9f1584fa61fbb7ade874b1759cc03db19c6b5d282e2d70f820a30e4a12489678ed9d48df09806efeb06e779750ba2fa85e090723934eed1daf31448a79e0d453d1ce8d8851941bd9d3017f667d60959e700c" + "equality_proof_data_hex": "e22809202e4d8f13770e8bcb5f37c5e6e18c122e2cd0c6d09b57c4517cfc095588c6392ad4476ee0c8589e6dec61a75d02858a9946c7ce240cf1d22530f74770a04cb7361c2919602dedd40551acdca8dab1d6d4d31efd72621c93380954c746aa5508c2c0bb51a70ae4080be67f8ecf0005179858dbf8248087f3f897302347f45c0f5890826d828b2bd9cb9d48f3af7cd9df5070f88d5ab39e81cbd4e506672e8da86d4b9f70e47ebaaa40f3f8b828f6342d6c0bd86456fabf5ea7b7836f56bacb69c39573eca2885bd26ffbaec12a493e92b7e5bb53a14c808b63885ee85864dfaf9876a0e4e43d5fb554f8e87a46ff0c695e90018e6219faef95c8fdcf0793d986c1d99932e3a71f4eb2d81d5f2a77823cc8808f1b8d3f6133ad64514f09ff5d6a93876393b1f5c0e8ccf9dc9a95238f9302b8af8e32be3c88e858f68800", + "range_proof_data_hex": "aa5508c2c0bb51a70ae4080be67f8ecf0005179858dbf8248087f3f8973023472859749d93d79eec89e1a5d0d015a51966628197d8ac286dd98362af2c4a3e4700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000008ce6f94d6863167b06b832f528890ec30cce491acbad123c82ab66f2e2b9cb1a9eace2053bb7eb7c678e205d9b5c5415961943778afa6eec6a2d7e610188fe78a6b6a8941e584491f805f3d0d2a2e4830c3eb894558a45e914bae9c538a4451d9c9ff8962c0be8215357e26cad8557cd5275005fdf45378c2b8dc44a8a431958661d49b800a73f2d9d7537e78f7a04d8c148070b92455c9d077f76f85a9bfe094560c18a9acbc3418f68ec0abc249a47ad84577a7f9f1acb582e7ed4c9393a0f6684cd8bc7e0b049d17e4090154a7af39aef03a95cd723be23b6e90d914ac600440463fb22d2da4870c0ea9cc9f5982fa934940b1e286cf4344343209424a37a3465dfe3dd6805d1fe8386565021bc3b40476a84b68c64ca640fc509eb1a3c5c5cd1defa0a02e79d22e58a9b9229f97c9e876203793e15c11ccc6c1828974f3e9e92e50747af80ed9db0e662684648740913bc8fe7e7f420f68903a1085da77db4e46b0d34ac56190737e19a9ed3ad340c524eb0a0955e5a6395b266d5348e4dfa80daf13ce18da59c5eda08eb6aed07cabc5283999554360489bc89427b122cd046774b9e9c9676c13a1c54bd43b5c15b1e8a67bbb276e94c5d7b6461c54a27369b7a876421638ab3e688171d6de300583a65e9304b503e6e5f7827c185205154b854e8ba1c5736ce50cb7bde570427664c2eeafd086b1741d26d8378afb728c0ae4d85a4e61feb15a680b531f8f6bc3cf5bd40f421624522c5276b464fe46638fb439c8fd8ccaa411de1dbd48e2409d72468c48a759a8e883b550715d0895cfc4529a9cef7cc79b6ca95ac1bf6e36454c93cba5bd978d363828352a8fab74d762d662866e8f991287b2d25ef2876126d9ea5dc3e26158d1b59156196cd8a33bab9da926b384cee207e1019b5fefbee52b2eec7390f369912e12e3294d7dc3c7f4aa1e1c3593e3be8d146286f43554f2fab69df781bd1a7ee176a8616268a010b89d9e3acc9a4dcb1ed5bab127842440250d36be1e37adcb549db89cf071f0c", + "validity_proof_data_hex": "e22809202e4d8f13770e8bcb5f37c5e6e18c122e2cd0c6d09b57c4517cfc095592d8c7b5d6906b6f027c99e3e28f632cebf1da7aca95a70f1b823edeef6788172859749d93d79eec89e1a5d0d015a51966628197d8ac286dd98362af2c4a3e4716d90176aba2db1326eafb722a75b9a03cbb91c5a20517101941fcbc0288eb1af6e04721f7c0e1282231e318e5ce0fa6753d6b4891469f7d5400e68ab166fd63a83009aeb2ce0d284821310be1f28935f2ea91aa8d0cf6a7b38ce758cb3f193360c5134a773b85cff6d3ce0a1f8c33affe8019366fcc4b5faecac1c698c02231b4d69b1d2812b5e06f1124cbd890444b427f423450679fc977213864b48f23053a2c9a8d86e9a4b24ae21531a4f868609dcea21a103c41cd8270b4c5cc3ca64a486850fad1e722c8c5fa7ae63d7e79ddfde6d1e608a19f8163e45574acd7412a1a2742d05e960bc652c78d24d5222d0b2c5718bda5683de2eea57a9e839c9369d8821d79a1fe90941a2fdbf1ffcee963add9a02eb32ee2f8bd618a9bb7efcf0107f460b76c78ff78e3ea2e19d4b3bd76c755501e07ed86cb0e81dff7ae529e0c" }, "binding": { - "current_balance_commitment_hex": "d67974feb2c5b5b2d9334e2bcd455e1c4dd4d68fe1d36a9e169ae6b638373a38", - "current_balance_handle_hex": "3644ec42acf9ab8541e290ff4006e1c5ca61279368d3f0313f25dfddfcb0460f", - "recipient_pubkey_hex": "30943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214", - "sender_pubkey_hex": "f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a76" + "current_balance_commitment_hex": "a2fd670d08656f5ae57822507b951ed51788e35f565a84490a132f6ca44a5e04", + "current_balance_handle_hex": "8a2923836b33bdef450bd29b4cbcb77c98f4e6913e8276036f6c81949bff7842", + "recipient_pubkey_hex": "92d8c7b5d6906b6f027c99e3e28f632cebf1da7aca95a70f1b823edeef678817", + "sender_pubkey_hex": "e22809202e4d8f13770e8bcb5f37c5e6e18c122e2cd0c6d09b57c4517cfc0955" }, "mutations": [ { @@ -1354,7 +1354,7 @@ "op": "bitflip", "target": "binding.sender_pubkey_hex", "params": { - "value_hex": "f95e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a76" + "value_hex": "e32809202e4d8f13770e8bcb5f37c5e6e18c122e2cd0c6d09b57c4517cfc0955" }, "expected_valid": false, "expected_error_contains": "failed" @@ -1364,7 +1364,7 @@ "op": "bitflip", "target": "binding.recipient_pubkey_hex", "params": { - "value_hex": "31943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214" + "value_hex": "93d8c7b5d6906b6f027c99e3e28f632cebf1da7aca95a70f1b823edeef678817" }, "expected_valid": false, "expected_error_contains": "failed" @@ -1384,7 +1384,7 @@ "op": "truncate", "target": "payload.range_proof_data_hex", "params": { - "value_hex": "fed7eef0f734800b63277b8420bf111dcb6ba2508e9635fb35bdc9a37e45b2401acb171db8e9f6aabcb4affd4abfd1eac9a982cf04af96017e57bb9b890245680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000ca7280619ee0ca599127393f3a0beaa5e696112177168a2c431dba199f5d1902c8d65f55fabfb9384aa4e5b027514e469f100dc5005c8aeac10b074ef365a857ba826694ae9a5a287820db647c70a954adf14458cb09430ffaed00d42c978911a235151add0cbe42f717926f3725693dad09c05b641a70c97cb2b71aea104c3fba2bf581f081151443845eaa06a9c3e1738b521493d1854be45f62df64e75e0261559a59eec76969259d888e362989cd4793bea53cd8ca8f8788e15fe40f1d08a742e7ad81c33b5d3d0ad4e61b1a48054a00005393862765c5981492de1456013ae35e17204041227efadf84f43d2ba3caa678a1811275e3fe8814d5ad6ea769fea3347ffdaa560957ff6278417c9368d19df599f757f6c4c3391154d8152356c8f8c0794fa3bfdf04e350dd2efd3175892b88b76c97a5507106055f30ecf4713632d74d949d1e204e1727092f33a9746cfed47a4ac715f7299c23c38db95925fc8bf13045c5acc9ae54fc5041b5dbf52b0e87f23c233c853254fb2e58a53d043616ee147d73a3cb3a75add5e26d1e40a82735688dd61e9a319bcb7e737324044edda301e7bc765b072d7d28610c430127cf5362770bffa3dd04b3c61e34412ba2238943083b323ab3c558f1e685f766fa07948ef090cf14da3d8fff533aa03b42ad969fcc0c74a4a70ce1a9e4d070455693e42d9b974bb1c2340422a64ae870b68eda2044107a0347bb47a74f8c82cdc683e9d900e93bb24b43b872c8305451b4a2034e60bc4b06a4c319394902b43a7ed7ee9ef2a228194a0786aedecd2070049450fa3c177e9f3d585071245572875ebc80026bd6a738d8f5cf869b72181376a012418d7287b7c7c8674a2f13b765a1782b4758ba2bd58d66e56163bcf44cfc3a99e5626de2760c8c3e7ba04edeaf5853df677060c7e80a02d829d567d45389b5aec9fb6a88b53091b25d6175faa8135a6d8c70bd8e18fd5388a49b4d3a029c82826233dc39a3260fbeb6656814826e8de6772b51d4b8b6a7581b0729" + "value_hex": "aa5508c2c0bb51a70ae4080be67f8ecf0005179858dbf8248087f3f8973023472859749d93d79eec89e1a5d0d015a51966628197d8ac286dd98362af2c4a3e4700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000008ce6f94d6863167b06b832f528890ec30cce491acbad123c82ab66f2e2b9cb1a9eace2053bb7eb7c678e205d9b5c5415961943778afa6eec6a2d7e610188fe78a6b6a8941e584491f805f3d0d2a2e4830c3eb894558a45e914bae9c538a4451d9c9ff8962c0be8215357e26cad8557cd5275005fdf45378c2b8dc44a8a431958661d49b800a73f2d9d7537e78f7a04d8c148070b92455c9d077f76f85a9bfe094560c18a9acbc3418f68ec0abc249a47ad84577a7f9f1acb582e7ed4c9393a0f6684cd8bc7e0b049d17e4090154a7af39aef03a95cd723be23b6e90d914ac600440463fb22d2da4870c0ea9cc9f5982fa934940b1e286cf4344343209424a37a3465dfe3dd6805d1fe8386565021bc3b40476a84b68c64ca640fc509eb1a3c5c5cd1defa0a02e79d22e58a9b9229f97c9e876203793e15c11ccc6c1828974f3e9e92e50747af80ed9db0e662684648740913bc8fe7e7f420f68903a1085da77db4e46b0d34ac56190737e19a9ed3ad340c524eb0a0955e5a6395b266d5348e4dfa80daf13ce18da59c5eda08eb6aed07cabc5283999554360489bc89427b122cd046774b9e9c9676c13a1c54bd43b5c15b1e8a67bbb276e94c5d7b6461c54a27369b7a876421638ab3e688171d6de300583a65e9304b503e6e5f7827c185205154b854e8ba1c5736ce50cb7bde570427664c2eeafd086b1741d26d8378afb728c0ae4d85a4e61feb15a680b531f8f6bc3cf5bd40f421624522c5276b464fe46638fb439c8fd8ccaa411de1dbd48e2409d72468c48a759a8e883b550715d0895cfc4529a9cef7cc79b6ca95ac1bf6e36454c93cba5bd978d363828352a8fab74d762d662866e8f991287b2d25ef2876126d9ea5dc3e26158d1b59156196cd8a33bab9da926b384cee207e1019b5fefbee52b2eec7390f369912e12e3294d7dc3c7f4aa1e1c3593e3be8d146286f43554f2fab69df781bd1a7ee176a8616268a010b89d9e3acc9a4dcb1ed5bab127842440250d36be1e37adcb549db89cf07" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -1396,7 +1396,7 @@ "family": "equality", "expected_valid": true, "payload": { - "proof_data_hex": "30943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214fe3004511f24f433de3a26c21d25d6d94a931413446c0cb2018693a596e3cb5cf62e972df91f67b5bb073379c53069b920f9639c5100beea10bb5ba2ad6dc802aa44352b1f2c49b05d2b8a6fdb64a5a06b65be84158bf1239c7495402cc1f85e8e0126022917a2a891c4a6d79f2e2324ebc99cd3980483be69f8398dc41ef61fb41eb31a4feb59da07b5b1d3ac36e581eb852051820f4e5f49701c00e24e932eeaef60ed9444f90037f02f3aee1135211d048eee6f50d1ef8973fd623d526974ffb6eae106d66ef21d568dc20b750be0faa67a7ee8e1c3c918a3528193908c02300a32a25c8e543cee514990396f86e2ce553eaabfd68c70de3415e9675810056c4ff7bfef161f887b7951e7107053d5f5376d769afbe8e47578443e3061a708" + "proof_data_hex": "92d8c7b5d6906b6f027c99e3e28f632cebf1da7aca95a70f1b823edeef67881724c195266090228b8541fb0963460f7663f782c00cc55cdcda48b7718f119837ecd5c5f2114f08260b2af44315e3a9a4641c767515da3157d5b766f9b21bbc00bc08a0737eaba5cd4c1d103f20a42679d98e201ab1cbc8c8ba4c76b0bc5bd44fd6f124c6bfdb82925bae34c2a718c98d3397f977ddc34487855a5bf46ba87a1e1c28bb7c880e2708eeaa31510348016ad4727db033879e1083849cfaec5ce64f9a1019f5778b12b0508782ed2700e9185818742276efd8bd85726634fd39df166e93de60acbf8c30fc42d52fa414f32dc48f7443817518ed6c81d3eaa2496801e07ed599a3a3bb0fde27590ce825885e245178b7d4816858f670a30153c9c801322e858d47748c137fae1e675a3b6c9f99fe166e6eeda40b9c571c0eb265fb00" }, "mutations": [ { @@ -1404,7 +1404,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "31943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214fe3004511f24f433de3a26c21d25d6d94a931413446c0cb2018693a596e3cb5cf62e972df91f67b5bb073379c53069b920f9639c5100beea10bb5ba2ad6dc802aa44352b1f2c49b05d2b8a6fdb64a5a06b65be84158bf1239c7495402cc1f85e8e0126022917a2a891c4a6d79f2e2324ebc99cd3980483be69f8398dc41ef61fb41eb31a4feb59da07b5b1d3ac36e581eb852051820f4e5f49701c00e24e932eeaef60ed9444f90037f02f3aee1135211d048eee6f50d1ef8973fd623d526974ffb6eae106d66ef21d568dc20b750be0faa67a7ee8e1c3c918a3528193908c02300a32a25c8e543cee514990396f86e2ce553eaabfd68c70de3415e9675810056c4ff7bfef161f887b7951e7107053d5f5376d769afbe8e47578443e3061a708" + "value_hex": "93d8c7b5d6906b6f027c99e3e28f632cebf1da7aca95a70f1b823edeef67881724c195266090228b8541fb0963460f7663f782c00cc55cdcda48b7718f119837ecd5c5f2114f08260b2af44315e3a9a4641c767515da3157d5b766f9b21bbc00bc08a0737eaba5cd4c1d103f20a42679d98e201ab1cbc8c8ba4c76b0bc5bd44fd6f124c6bfdb82925bae34c2a718c98d3397f977ddc34487855a5bf46ba87a1e1c28bb7c880e2708eeaa31510348016ad4727db033879e1083849cfaec5ce64f9a1019f5778b12b0508782ed2700e9185818742276efd8bd85726634fd39df166e93de60acbf8c30fc42d52fa414f32dc48f7443817518ed6c81d3eaa2496801e07ed599a3a3bb0fde27590ce825885e245178b7d4816858f670a30153c9c801322e858d47748c137fae1e675a3b6c9f99fe166e6eeda40b9c571c0eb265fb00" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -1414,7 +1414,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "30943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214fe3004511f24f433de3a26c21d25d6d94a931413446c0cb2018693a596e3cb5cf62e972df91f67b5bb073379c53069b920f9639c5100beea10bb5ba2ad6dc802aa44352b1f2c49b05d2b8a6fdb64a5a06b65be84158bf1239c7495402cc1f85e8e0126022917a2a891c4a6d79f2e2324ebc99cd3980483be69f8398dc41ef61fb41eb31a4feb59da07b5b1d3ac36e581eb852051820f4e5f49701c00e24e932eeaef60ed9444f90037f02f3aee1135211d048eee6f50d1ef8973fd623d526974ffb6eae106d66ef21d568dc20b750be0faa67a7ee8e1c3c918a3528193908c02300a32a25c8e543cee514990396f86e2ce553eaabfd68c70de3415e9675810056c4ff7bfef161f887b7951e7107053d5f5376d769afbe8e47578443e3061" + "value_hex": "92d8c7b5d6906b6f027c99e3e28f632cebf1da7aca95a70f1b823edeef67881724c195266090228b8541fb0963460f7663f782c00cc55cdcda48b7718f119837ecd5c5f2114f08260b2af44315e3a9a4641c767515da3157d5b766f9b21bbc00bc08a0737eaba5cd4c1d103f20a42679d98e201ab1cbc8c8ba4c76b0bc5bd44fd6f124c6bfdb82925bae34c2a718c98d3397f977ddc34487855a5bf46ba87a1e1c28bb7c880e2708eeaa31510348016ad4727db033879e1083849cfaec5ce64f9a1019f5778b12b0508782ed2700e9185818742276efd8bd85726634fd39df166e93de60acbf8c30fc42d52fa414f32dc48f7443817518ed6c81d3eaa2496801e07ed599a3a3bb0fde27590ce825885e245178b7d4816858f670a30153c9c801322e858d47748c137fae1e675a3b6c9f99fe166e6eeda40b9c571c0eb265" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -1436,7 +1436,7 @@ "family": "validity", "expected_valid": true, "payload": { - "proof_data_hex": "30943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c7923732453cc0c678c42538ebcc8469d9652366f23194391beecaf2efd9b0754cd3fc3830e8ee40edddc78a367edc0e949517012933dfccdc69fe42b54bfa13eadc91f63e22c5b8d4503c4cf829a03fc13fdc4114e9717ad469e6a6da3574a9bac2ac8805521cb769194db9582c61306d2290884b05d304ed16033f563ff6a03b2278223caa4215cd9fb2892c3c3952a8f2e7612303f50fe03dd4d67ec8f3a6c1086818367a2cc4f5c776738ba49b05673fda19e057da582aca0a2d3a7969a131db0cc3437affc1e6bc78ccd39a38c54a2ad854f3ba049d0bd95e5a0f3b518cd284f4f51658fd5354edbab82b9698623024b2b03387475d891b6975c686aca77c304b1b668e06e3813255b60b17df01ad84bd29da60a2920ce12ac998c3d5cb044dae8b3682f287f6e653e337ae14183fb50705ee1785e8718d8e1a88044567da4a83f105fd590cd100197ea0db22e1a3915ab447e98d77f712106b1829f9c1583d7ceb07" + "proof_data_hex": "92d8c7b5d6906b6f027c99e3e28f632cebf1da7aca95a70f1b823edeef678817269b2044cea025efee559e615a04a71461ce2112778ecd73e0d41b74d3a6111a9492ab244824066207d5f495398bb5b446bf3879736a161b48c0a78e1f669a5904dc240c3b880f3fa28dc25d741bd1b319ac78d5526f69a1852fcdcb9e4a7d7258ecdbc80fc758bf68b45c77fd9fb044731477fb5106e9040c110d6095fd643d8a81d896897b4e86992a8965d3cb27b7c2a0707a522dbdea088bff78b6cf43738aa5ac2eb77888b9dfd1fb0a32e66a9b95b944147e11f74bf5298141e6ffe62ab61b043218fc0e369f580bfdcb0c816de6a54bb3fe3f6d0b1016d6ab94d4613c0e1e3effa0cdb9f1f5ea3d78074f51c8a494ce55f7c6ed363f2334aaed8cbb6036538e0975e1cd8a6f22c43b9e427c33e0cc58d2d1d69734a201152b7c8de20d3aa684747dbeb868d6a378475a7ceaeaf88121029918db73c63573c6df5d9d03710e76689d9e837e79ccc30101680260c725c0015cf844f0f69e410e033da00479afbe2e866cb0d92ea07f03ea5b07114230b82fce8cb81af415c488c2a14c0a" }, "mutations": [ { @@ -1444,7 +1444,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "31943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c7923732453cc0c678c42538ebcc8469d9652366f23194391beecaf2efd9b0754cd3fc3830e8ee40edddc78a367edc0e949517012933dfccdc69fe42b54bfa13eadc91f63e22c5b8d4503c4cf829a03fc13fdc4114e9717ad469e6a6da3574a9bac2ac8805521cb769194db9582c61306d2290884b05d304ed16033f563ff6a03b2278223caa4215cd9fb2892c3c3952a8f2e7612303f50fe03dd4d67ec8f3a6c1086818367a2cc4f5c776738ba49b05673fda19e057da582aca0a2d3a7969a131db0cc3437affc1e6bc78ccd39a38c54a2ad854f3ba049d0bd95e5a0f3b518cd284f4f51658fd5354edbab82b9698623024b2b03387475d891b6975c686aca77c304b1b668e06e3813255b60b17df01ad84bd29da60a2920ce12ac998c3d5cb044dae8b3682f287f6e653e337ae14183fb50705ee1785e8718d8e1a88044567da4a83f105fd590cd100197ea0db22e1a3915ab447e98d77f712106b1829f9c1583d7ceb07" + "value_hex": "93d8c7b5d6906b6f027c99e3e28f632cebf1da7aca95a70f1b823edeef678817269b2044cea025efee559e615a04a71461ce2112778ecd73e0d41b74d3a6111a9492ab244824066207d5f495398bb5b446bf3879736a161b48c0a78e1f669a5904dc240c3b880f3fa28dc25d741bd1b319ac78d5526f69a1852fcdcb9e4a7d7258ecdbc80fc758bf68b45c77fd9fb044731477fb5106e9040c110d6095fd643d8a81d896897b4e86992a8965d3cb27b7c2a0707a522dbdea088bff78b6cf43738aa5ac2eb77888b9dfd1fb0a32e66a9b95b944147e11f74bf5298141e6ffe62ab61b043218fc0e369f580bfdcb0c816de6a54bb3fe3f6d0b1016d6ab94d4613c0e1e3effa0cdb9f1f5ea3d78074f51c8a494ce55f7c6ed363f2334aaed8cbb6036538e0975e1cd8a6f22c43b9e427c33e0cc58d2d1d69734a201152b7c8de20d3aa684747dbeb868d6a378475a7ceaeaf88121029918db73c63573c6df5d9d03710e76689d9e837e79ccc30101680260c725c0015cf844f0f69e410e033da00479afbe2e866cb0d92ea07f03ea5b07114230b82fce8cb81af415c488c2a14c0a" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -1454,7 +1454,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "30943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c7923732453cc0c678c42538ebcc8469d9652366f23194391beecaf2efd9b0754cd3fc3830e8ee40edddc78a367edc0e949517012933dfccdc69fe42b54bfa13eadc91f63e22c5b8d4503c4cf829a03fc13fdc4114e9717ad469e6a6da3574a9bac2ac8805521cb769194db9582c61306d2290884b05d304ed16033f563ff6a03b2278223caa4215cd9fb2892c3c3952a8f2e7612303f50fe03dd4d67ec8f3a6c1086818367a2cc4f5c776738ba49b05673fda19e057da582aca0a2d3a7969a131db0cc3437affc1e6bc78ccd39a38c54a2ad854f3ba049d0bd95e5a0f3b518cd284f4f51658fd5354edbab82b9698623024b2b03387475d891b6975c686aca77c304b1b668e06e3813255b60b17df01ad84bd29da60a2920ce12ac998c3d5cb044dae8b3682f287f6e653e337ae14183fb50705ee1785e8718d8e1a88044567da4a83f105fd590cd100197ea0db22e1a3915ab447e98d77f712106b1829f9c1583d7c" + "value_hex": "92d8c7b5d6906b6f027c99e3e28f632cebf1da7aca95a70f1b823edeef678817269b2044cea025efee559e615a04a71461ce2112778ecd73e0d41b74d3a6111a9492ab244824066207d5f495398bb5b446bf3879736a161b48c0a78e1f669a5904dc240c3b880f3fa28dc25d741bd1b319ac78d5526f69a1852fcdcb9e4a7d7258ecdbc80fc758bf68b45c77fd9fb044731477fb5106e9040c110d6095fd643d8a81d896897b4e86992a8965d3cb27b7c2a0707a522dbdea088bff78b6cf43738aa5ac2eb77888b9dfd1fb0a32e66a9b95b944147e11f74bf5298141e6ffe62ab61b043218fc0e369f580bfdcb0c816de6a54bb3fe3f6d0b1016d6ab94d4613c0e1e3effa0cdb9f1f5ea3d78074f51c8a494ce55f7c6ed363f2334aaed8cbb6036538e0975e1cd8a6f22c43b9e427c33e0cc58d2d1d69734a201152b7c8de20d3aa684747dbeb868d6a378475a7ceaeaf88121029918db73c63573c6df5d9d03710e76689d9e837e79ccc30101680260c725c0015cf844f0f69e410e033da00479afbe2e866cb0d92ea07f03ea5b07114230b82fce8cb81af415c488c2a1" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -1476,7 +1476,7 @@ "family": "transfer_range", "expected_valid": true, "payload": { - "proof_data_hex": "aa44352b1f2c49b05d2b8a6fdb64a5a06b65be84158bf1239c7495402cc1f85e3cc0c678c42538ebcc8469d9652366f23194391beecaf2efd9b0754cd3fc38300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a41f8292d36d87a2277bc4f61259398cb21bac85e8146580881de53780b48578c43746b27fe88f4aed9aab63c2b7c4281f0dc29bbcc13bc52e5b5b8f703ac86820242d57dc57804fc32c68d48761aee764ad72f06aa7c3bbc2e9d2235c69185920ba2c7e0b7b158933b0ccd370852d4db36c8fb26cfa1f38cd66004e90eb845baeb429f2b07a0e14b3e94f94df105d6ba39099fd46420f6337e9ba7873196a035d989d993a120377207e854b149396a6cd577c5e541d6e10b6517a89d958bc07e43c1792d82f260c2d56b0fba42891279a7efacc06bf8669c36cb7f195db9100988bb6e6ecaae2c18d52a8f20a46d996506ed27ba9e3e9715807f16928b6f3556248acc42e8e6084287e6e39e66ff4559aac100e7a381b89342c54a3f05bda575e258de0cb67a754693551a0b3b9282052bde3f7c1c7766531b4ce3be3799f05ac3a0e77fe9679ffbdb8939bdf157d9382da972ad44e9078b4860647d89d3a3646d9685f6f39508b3faeaad0981f2d435b025c212e9c58cbbfe79228c356760606aa7a068f13fcb95f77e1aa135bc04c043dfb6b00a8bf5f5a6e3aa22369a1561050c8383808a2b966e1efc04c2bb8a2c92a5d8d0cdad425c263a599ab43f17d30c274ec2d626c539241997c48f60aeb8b3717e221feeb12b18196f0723a5126860c30f2f4909fdb2982b9ffcc4a77097446457482fc795bd176f89fcee8d52fd8e700124d5bbb2ad29e87f7ae0e2687ac5e90625977ca43dd66211f4f29bd390a034d80bacaa64b8c37187b634275b8287ebd950bbdb1a4f3ab695e61d08e77347354dcdd24517da5b6b384978c9a6908cdfe9abec4e126023786381c43e97c86a642a6141b206112a249340f068893cef5ee44d310002666c1f5b2810cab6a0ef01221523b4064ded0bb3a71c28260da7f9efa1d8674c333e2bdb49aeb9232acbabb69c02c3432505b0da25c4d146ecc7c8789f942849bef71641f9b586e095521b4b4bb9bb2debb2afcbc2b8b245a61711915555d659956601112a8f6c10f" + "proof_data_hex": "bc08a0737eaba5cd4c1d103f20a42679d98e201ab1cbc8c8ba4c76b0bc5bd44f9492ab244824066207d5f495398bb5b446bf3879736a161b48c0a78e1f669a5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000003238ccf7bcbc92d90bd14731edf6d005fb11e428e37af8e3d806f824ad6e6b1c386ddfddec6a9ecf42058c4a4764ec8f3f2ffe2ad3d007bae1acc7cbe13c183220a9a76eaeb17a68239978ec4158b4f657267e7fb4475c51f8ad39a968ec6056fa528d76db7c5f864ebbc77bc4fe3cec3f64e32b18c614d737042c68d03a342f2cd8d83e189f1bd82bdcc5617493658e5449b51e09e38b3121d4f89f8a615009a0480512960549daa8a7909c546a42ff93b764304732ef3f3d16f755646387093b06b06180c4404d6ca3428a8b172ddcb4cdccca2e4bda208e74a1ca27ef31097022d786b13bf4e14d7217268efa96438886720addc8b4ba9b85e6662e64bc07e05c42bda6a4798c1e8d8e554619741a6a0ac7bac886f1bc5216795a8b821626c207d9e358ae91b71397bcf43b630d1c4f703a32870a3e1fc39c364bd39bd843ee0f41d4565e3ae07d1589dde62530b468e223cc2d054648717ff20f93e6b653c0a648e36424a04b0fa0657684d26bf6ed6b0f8aa7f3961c944eae3070fc770f44dc47b36a789df396933b545b8e44b3c1b1ff0ad2388e0163e38c4cb882a3228cbd1c0f834b03cf7b49fe10423776c7431b00fbf95461a9dccdcd0c4b66134d9cf89fd1365d7da09dfb60f9ffb1eb1f3208c0de7903c262b9aa26b5adf82a7e5ee045b04eadc48dc862277e1474fae83c69f329ccaff73e94b11eba627a343f1c96dcf3fb5202b4e9c9ca296f8ab975a23bb97a060e41e4e50436ef04506119fc50f7896f22f5474bede94066ff5f1ff0e90a6a9ee24202fc3f2b46d8bd1b30a8d93e8d61ea96146a5f97afc23bdfd3c331686a2082a478cec686dea3ffcf43a488912a0c5975790babaa26bf9ad33db7540d6757242a58d8ed09eb5e1c253f8c3d249712b491aca25516a0aaffeb8c67aa848b90fb3233e048467e609f6557201cd8300f995526f8dae7b5d0b596acaa447bb0533bd7f947de626eb57fcf0a3d08be59a5dd2ee22948417e828b7683389b54c0cd68c0eb6445c50e7f7f7d08" }, "mutations": [ { @@ -1484,7 +1484,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "ab44352b1f2c49b05d2b8a6fdb64a5a06b65be84158bf1239c7495402cc1f85e3cc0c678c42538ebcc8469d9652366f23194391beecaf2efd9b0754cd3fc38300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a41f8292d36d87a2277bc4f61259398cb21bac85e8146580881de53780b48578c43746b27fe88f4aed9aab63c2b7c4281f0dc29bbcc13bc52e5b5b8f703ac86820242d57dc57804fc32c68d48761aee764ad72f06aa7c3bbc2e9d2235c69185920ba2c7e0b7b158933b0ccd370852d4db36c8fb26cfa1f38cd66004e90eb845baeb429f2b07a0e14b3e94f94df105d6ba39099fd46420f6337e9ba7873196a035d989d993a120377207e854b149396a6cd577c5e541d6e10b6517a89d958bc07e43c1792d82f260c2d56b0fba42891279a7efacc06bf8669c36cb7f195db9100988bb6e6ecaae2c18d52a8f20a46d996506ed27ba9e3e9715807f16928b6f3556248acc42e8e6084287e6e39e66ff4559aac100e7a381b89342c54a3f05bda575e258de0cb67a754693551a0b3b9282052bde3f7c1c7766531b4ce3be3799f05ac3a0e77fe9679ffbdb8939bdf157d9382da972ad44e9078b4860647d89d3a3646d9685f6f39508b3faeaad0981f2d435b025c212e9c58cbbfe79228c356760606aa7a068f13fcb95f77e1aa135bc04c043dfb6b00a8bf5f5a6e3aa22369a1561050c8383808a2b966e1efc04c2bb8a2c92a5d8d0cdad425c263a599ab43f17d30c274ec2d626c539241997c48f60aeb8b3717e221feeb12b18196f0723a5126860c30f2f4909fdb2982b9ffcc4a77097446457482fc795bd176f89fcee8d52fd8e700124d5bbb2ad29e87f7ae0e2687ac5e90625977ca43dd66211f4f29bd390a034d80bacaa64b8c37187b634275b8287ebd950bbdb1a4f3ab695e61d08e77347354dcdd24517da5b6b384978c9a6908cdfe9abec4e126023786381c43e97c86a642a6141b206112a249340f068893cef5ee44d310002666c1f5b2810cab6a0ef01221523b4064ded0bb3a71c28260da7f9efa1d8674c333e2bdb49aeb9232acbabb69c02c3432505b0da25c4d146ecc7c8789f942849bef71641f9b586e095521b4b4bb9bb2debb2afcbc2b8b245a61711915555d659956601112a8f6c10f" + "value_hex": "bd08a0737eaba5cd4c1d103f20a42679d98e201ab1cbc8c8ba4c76b0bc5bd44f9492ab244824066207d5f495398bb5b446bf3879736a161b48c0a78e1f669a5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000003238ccf7bcbc92d90bd14731edf6d005fb11e428e37af8e3d806f824ad6e6b1c386ddfddec6a9ecf42058c4a4764ec8f3f2ffe2ad3d007bae1acc7cbe13c183220a9a76eaeb17a68239978ec4158b4f657267e7fb4475c51f8ad39a968ec6056fa528d76db7c5f864ebbc77bc4fe3cec3f64e32b18c614d737042c68d03a342f2cd8d83e189f1bd82bdcc5617493658e5449b51e09e38b3121d4f89f8a615009a0480512960549daa8a7909c546a42ff93b764304732ef3f3d16f755646387093b06b06180c4404d6ca3428a8b172ddcb4cdccca2e4bda208e74a1ca27ef31097022d786b13bf4e14d7217268efa96438886720addc8b4ba9b85e6662e64bc07e05c42bda6a4798c1e8d8e554619741a6a0ac7bac886f1bc5216795a8b821626c207d9e358ae91b71397bcf43b630d1c4f703a32870a3e1fc39c364bd39bd843ee0f41d4565e3ae07d1589dde62530b468e223cc2d054648717ff20f93e6b653c0a648e36424a04b0fa0657684d26bf6ed6b0f8aa7f3961c944eae3070fc770f44dc47b36a789df396933b545b8e44b3c1b1ff0ad2388e0163e38c4cb882a3228cbd1c0f834b03cf7b49fe10423776c7431b00fbf95461a9dccdcd0c4b66134d9cf89fd1365d7da09dfb60f9ffb1eb1f3208c0de7903c262b9aa26b5adf82a7e5ee045b04eadc48dc862277e1474fae83c69f329ccaff73e94b11eba627a343f1c96dcf3fb5202b4e9c9ca296f8ab975a23bb97a060e41e4e50436ef04506119fc50f7896f22f5474bede94066ff5f1ff0e90a6a9ee24202fc3f2b46d8bd1b30a8d93e8d61ea96146a5f97afc23bdfd3c331686a2082a478cec686dea3ffcf43a488912a0c5975790babaa26bf9ad33db7540d6757242a58d8ed09eb5e1c253f8c3d249712b491aca25516a0aaffeb8c67aa848b90fb3233e048467e609f6557201cd8300f995526f8dae7b5d0b596acaa447bb0533bd7f947de626eb57fcf0a3d08be59a5dd2ee22948417e828b7683389b54c0cd68c0eb6445c50e7f7f7d08" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -1494,7 +1494,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "aa44352b1f2c49b05d2b8a6fdb64a5a06b65be84158bf1239c7495402cc1f85e3cc0c678c42538ebcc8469d9652366f23194391beecaf2efd9b0754cd3fc38300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a41f8292d36d87a2277bc4f61259398cb21bac85e8146580881de53780b48578c43746b27fe88f4aed9aab63c2b7c4281f0dc29bbcc13bc52e5b5b8f703ac86820242d57dc57804fc32c68d48761aee764ad72f06aa7c3bbc2e9d2235c69185920ba2c7e0b7b158933b0ccd370852d4db36c8fb26cfa1f38cd66004e90eb845baeb429f2b07a0e14b3e94f94df105d6ba39099fd46420f6337e9ba7873196a035d989d993a120377207e854b149396a6cd577c5e541d6e10b6517a89d958bc07e43c1792d82f260c2d56b0fba42891279a7efacc06bf8669c36cb7f195db9100988bb6e6ecaae2c18d52a8f20a46d996506ed27ba9e3e9715807f16928b6f3556248acc42e8e6084287e6e39e66ff4559aac100e7a381b89342c54a3f05bda575e258de0cb67a754693551a0b3b9282052bde3f7c1c7766531b4ce3be3799f05ac3a0e77fe9679ffbdb8939bdf157d9382da972ad44e9078b4860647d89d3a3646d9685f6f39508b3faeaad0981f2d435b025c212e9c58cbbfe79228c356760606aa7a068f13fcb95f77e1aa135bc04c043dfb6b00a8bf5f5a6e3aa22369a1561050c8383808a2b966e1efc04c2bb8a2c92a5d8d0cdad425c263a599ab43f17d30c274ec2d626c539241997c48f60aeb8b3717e221feeb12b18196f0723a5126860c30f2f4909fdb2982b9ffcc4a77097446457482fc795bd176f89fcee8d52fd8e700124d5bbb2ad29e87f7ae0e2687ac5e90625977ca43dd66211f4f29bd390a034d80bacaa64b8c37187b634275b8287ebd950bbdb1a4f3ab695e61d08e77347354dcdd24517da5b6b384978c9a6908cdfe9abec4e126023786381c43e97c86a642a6141b206112a249340f068893cef5ee44d310002666c1f5b2810cab6a0ef01221523b4064ded0bb3a71c28260da7f9efa1d8674c333e2bdb49aeb9232acbabb69c02c3432505b0da25c4d146ecc7c8789f942849bef71641f9b586e095521b4b4bb9bb2debb2afcbc2b8b245a61711915555d659956601112a8f6" + "value_hex": "bc08a0737eaba5cd4c1d103f20a42679d98e201ab1cbc8c8ba4c76b0bc5bd44f9492ab244824066207d5f495398bb5b446bf3879736a161b48c0a78e1f669a5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000003238ccf7bcbc92d90bd14731edf6d005fb11e428e37af8e3d806f824ad6e6b1c386ddfddec6a9ecf42058c4a4764ec8f3f2ffe2ad3d007bae1acc7cbe13c183220a9a76eaeb17a68239978ec4158b4f657267e7fb4475c51f8ad39a968ec6056fa528d76db7c5f864ebbc77bc4fe3cec3f64e32b18c614d737042c68d03a342f2cd8d83e189f1bd82bdcc5617493658e5449b51e09e38b3121d4f89f8a615009a0480512960549daa8a7909c546a42ff93b764304732ef3f3d16f755646387093b06b06180c4404d6ca3428a8b172ddcb4cdccca2e4bda208e74a1ca27ef31097022d786b13bf4e14d7217268efa96438886720addc8b4ba9b85e6662e64bc07e05c42bda6a4798c1e8d8e554619741a6a0ac7bac886f1bc5216795a8b821626c207d9e358ae91b71397bcf43b630d1c4f703a32870a3e1fc39c364bd39bd843ee0f41d4565e3ae07d1589dde62530b468e223cc2d054648717ff20f93e6b653c0a648e36424a04b0fa0657684d26bf6ed6b0f8aa7f3961c944eae3070fc770f44dc47b36a789df396933b545b8e44b3c1b1ff0ad2388e0163e38c4cb882a3228cbd1c0f834b03cf7b49fe10423776c7431b00fbf95461a9dccdcd0c4b66134d9cf89fd1365d7da09dfb60f9ffb1eb1f3208c0de7903c262b9aa26b5adf82a7e5ee045b04eadc48dc862277e1474fae83c69f329ccaff73e94b11eba627a343f1c96dcf3fb5202b4e9c9ca296f8ab975a23bb97a060e41e4e50436ef04506119fc50f7896f22f5474bede94066ff5f1ff0e90a6a9ee24202fc3f2b46d8bd1b30a8d93e8d61ea96146a5f97afc23bdfd3c331686a2082a478cec686dea3ffcf43a488912a0c5975790babaa26bf9ad33db7540d6757242a58d8ed09eb5e1c253f8c3d249712b491aca25516a0aaffeb8c67aa848b90fb3233e048467e609f6557201cd8300f995526f8dae7b5d0b596acaa447bb0533bd7f947de626eb57fcf0a3d08be59a5dd2ee22948417e828b7683389b54c0cd68c0eb6445c50e7f7f" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -1514,7 +1514,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "aa44352b1f2c49b05d2b8a6fdb64a5a06b65be84158bf1239c7495402cc1f85e3cc0c678c42538ebcc8469d9652366f23194391beecaf2efd9b0754cd3fc38300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a41f8292d36d87a2277bc4f61259398cb21bac85e8146580881de53780b48578c43746b27fe88f4aed9aab63c2b7c4281f0dc29bbcc13bc52e5b5b8f703ac86820242d57dc57804fc32c68d48761aee764ad72f06aa7c3bbc2e9d2235c69185920ba2c7e0b7b158933b0ccd370852d4db36c8fb26cfa1f38cd66004e90eb845baeb429f2b07a0e14b3e94f94df105d6ba39099fd46420f6337e9ba7873196a035d989d993a120377207e854b149396a6cd577c5e541d6e10b6517a89d958bc07e43c1792d82f260c2d56b0fba42891279a7efacc06bf8669c36cb7f195db9100988bb6e6ecaae2c18d52a8f20a46d996506ed27ba9e3e9715807f16928b6f3556248acc42e8e6084287e6e39e66ff4559aac100e7a381b89342c54a3f05bda575e258de0cb67a754693551a0b3b9282052bde3f7c1c7766531b4ce3be3799f05ac3a0e77fe9679ffbdb8939bdf157d9382da972ad44e9078b4860647d89d3a3646d9685f6f39508b3faeaad0981f2d435b025c212e9c58cbbfe79228c356760606aa7a068f13fcb95f77e1aa135bc04c043dfb6b00a8bf5f5a6e3aa22369a1561050c8383808a2b966e1efc04c2bb8a2c92a5d8d0cdad425c263a599ab43f17d30c274ec2d626c539241997c48f60aeb8b3717e221feeb12b18196f0723a5126860c30f2f4909fdb2982b9ffcc4a77097446457482fc795bd176f89fcee8d52fd8e700124d5bbb2ad29e87f7ae0e2687ac5e90625977ca43dd66211f4f29bd390a034d80bacaa64b8c37187b634275b8287ebd950bbdb1a4f3ab695e61d08e77347354dcdd24517da5b6b384978c9a6908cdfe9abec4e126023786381c43e97c86a642a6141b206112a249340f068893cef5ee44d310002666c1f5b2810cab6a0ef01221523b4064ded0bb3a71c28260da7f9efa1d8674c333e2bdb49aeb9232acbabb69c02c3432505b0da25c4d146ecc7c8789f942849bef71641f9b586e095521b4b4bb9bb2debb2afcbc2b8b245a61711915555d659956601112a8f6c10e" + "value_hex": "bc08a0737eaba5cd4c1d103f20a42679d98e201ab1cbc8c8ba4c76b0bc5bd44f9492ab244824066207d5f495398bb5b446bf3879736a161b48c0a78e1f669a5900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000003238ccf7bcbc92d90bd14731edf6d005fb11e428e37af8e3d806f824ad6e6b1c386ddfddec6a9ecf42058c4a4764ec8f3f2ffe2ad3d007bae1acc7cbe13c183220a9a76eaeb17a68239978ec4158b4f657267e7fb4475c51f8ad39a968ec6056fa528d76db7c5f864ebbc77bc4fe3cec3f64e32b18c614d737042c68d03a342f2cd8d83e189f1bd82bdcc5617493658e5449b51e09e38b3121d4f89f8a615009a0480512960549daa8a7909c546a42ff93b764304732ef3f3d16f755646387093b06b06180c4404d6ca3428a8b172ddcb4cdccca2e4bda208e74a1ca27ef31097022d786b13bf4e14d7217268efa96438886720addc8b4ba9b85e6662e64bc07e05c42bda6a4798c1e8d8e554619741a6a0ac7bac886f1bc5216795a8b821626c207d9e358ae91b71397bcf43b630d1c4f703a32870a3e1fc39c364bd39bd843ee0f41d4565e3ae07d1589dde62530b468e223cc2d054648717ff20f93e6b653c0a648e36424a04b0fa0657684d26bf6ed6b0f8aa7f3961c944eae3070fc770f44dc47b36a789df396933b545b8e44b3c1b1ff0ad2388e0163e38c4cb882a3228cbd1c0f834b03cf7b49fe10423776c7431b00fbf95461a9dccdcd0c4b66134d9cf89fd1365d7da09dfb60f9ffb1eb1f3208c0de7903c262b9aa26b5adf82a7e5ee045b04eadc48dc862277e1474fae83c69f329ccaff73e94b11eba627a343f1c96dcf3fb5202b4e9c9ca296f8ab975a23bb97a060e41e4e50436ef04506119fc50f7896f22f5474bede94066ff5f1ff0e90a6a9ee24202fc3f2b46d8bd1b30a8d93e8d61ea96146a5f97afc23bdfd3c331686a2082a478cec686dea3ffcf43a488912a0c5975790babaa26bf9ad33db7540d6757242a58d8ed09eb5e1c253f8c3d249712b491aca25516a0aaffeb8c67aa848b90fb3233e048467e609f6557201cd8300f995526f8dae7b5d0b596acaa447bb0533bd7f947de626eb57fcf0a3d08be59a5dd2ee22948417e828b7683389b54c0cd68c0eb6445c50e7f7f7d09" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -1526,15 +1526,15 @@ "family": "transfer_composite", "expected_valid": true, "payload": { - "equality_proof_data_hex": "30943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214fe3004511f24f433de3a26c21d25d6d94a931413446c0cb2018693a596e3cb5cf62e972df91f67b5bb073379c53069b920f9639c5100beea10bb5ba2ad6dc802aa44352b1f2c49b05d2b8a6fdb64a5a06b65be84158bf1239c7495402cc1f85e8e0126022917a2a891c4a6d79f2e2324ebc99cd3980483be69f8398dc41ef61fb41eb31a4feb59da07b5b1d3ac36e581eb852051820f4e5f49701c00e24e932eeaef60ed9444f90037f02f3aee1135211d048eee6f50d1ef8973fd623d526974ffb6eae106d66ef21d568dc20b750be0faa67a7ee8e1c3c918a3528193908c02300a32a25c8e543cee514990396f86e2ce553eaabfd68c70de3415e9675810056c4ff7bfef161f887b7951e7107053d5f5376d769afbe8e47578443e3061a708", - "range_proof_data_hex": "aa44352b1f2c49b05d2b8a6fdb64a5a06b65be84158bf1239c7495402cc1f85e3cc0c678c42538ebcc8469d9652366f23194391beecaf2efd9b0754cd3fc38300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a41f8292d36d87a2277bc4f61259398cb21bac85e8146580881de53780b48578c43746b27fe88f4aed9aab63c2b7c4281f0dc29bbcc13bc52e5b5b8f703ac86820242d57dc57804fc32c68d48761aee764ad72f06aa7c3bbc2e9d2235c69185920ba2c7e0b7b158933b0ccd370852d4db36c8fb26cfa1f38cd66004e90eb845baeb429f2b07a0e14b3e94f94df105d6ba39099fd46420f6337e9ba7873196a035d989d993a120377207e854b149396a6cd577c5e541d6e10b6517a89d958bc07e43c1792d82f260c2d56b0fba42891279a7efacc06bf8669c36cb7f195db9100988bb6e6ecaae2c18d52a8f20a46d996506ed27ba9e3e9715807f16928b6f3556248acc42e8e6084287e6e39e66ff4559aac100e7a381b89342c54a3f05bda575e258de0cb67a754693551a0b3b9282052bde3f7c1c7766531b4ce3be3799f05ac3a0e77fe9679ffbdb8939bdf157d9382da972ad44e9078b4860647d89d3a3646d9685f6f39508b3faeaad0981f2d435b025c212e9c58cbbfe79228c356760606aa7a068f13fcb95f77e1aa135bc04c043dfb6b00a8bf5f5a6e3aa22369a1561050c8383808a2b966e1efc04c2bb8a2c92a5d8d0cdad425c263a599ab43f17d30c274ec2d626c539241997c48f60aeb8b3717e221feeb12b18196f0723a5126860c30f2f4909fdb2982b9ffcc4a77097446457482fc795bd176f89fcee8d52fd8e700124d5bbb2ad29e87f7ae0e2687ac5e90625977ca43dd66211f4f29bd390a034d80bacaa64b8c37187b634275b8287ebd950bbdb1a4f3ab695e61d08e77347354dcdd24517da5b6b384978c9a6908cdfe9abec4e126023786381c43e97c86a642a6141b206112a249340f068893cef5ee44d310002666c1f5b2810cab6a0ef01221523b4064ded0bb3a71c28260da7f9efa1d8674c333e2bdb49aeb9232acbabb69c02c3432505b0da25c4d146ecc7c8789f942849bef71641f9b586e095521b4b4bb9bb2debb2afcbc2b8b245a61711915555d659956601112a8f6c10f", - "validity_proof_data_hex": "30943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c7923732453cc0c678c42538ebcc8469d9652366f23194391beecaf2efd9b0754cd3fc3830e8ee40edddc78a367edc0e949517012933dfccdc69fe42b54bfa13eadc91f63e22c5b8d4503c4cf829a03fc13fdc4114e9717ad469e6a6da3574a9bac2ac8805521cb769194db9582c61306d2290884b05d304ed16033f563ff6a03b2278223caa4215cd9fb2892c3c3952a8f2e7612303f50fe03dd4d67ec8f3a6c1086818367a2cc4f5c776738ba49b05673fda19e057da582aca0a2d3a7969a131db0cc3437affc1e6bc78ccd39a38c54a2ad854f3ba049d0bd95e5a0f3b518cd284f4f51658fd5354edbab82b9698623024b2b03387475d891b6975c686aca77c304b1b668e06e3813255b60b17df01ad84bd29da60a2920ce12ac998c3d5cb044dae8b3682f287f6e653e337ae14183fb50705ee1785e8718d8e1a88044567da4a83f105fd590cd100197ea0db22e1a3915ab447e98d77f712106b1829f9c1583d7ceb07" + "equality_proof_data_hex": "92d8c7b5d6906b6f027c99e3e28f632cebf1da7aca95a70f1b823edeef6788170416ed68545ceb2b0b91d1e3393304d089235c2284fcec86b6e7513744efc34bf88e5f9e714a041c4142947ef7cc37c50ce6e47f43fd998f79b8545912ac1d5fb677b12e01b2c476d280f0c777427a0a14cb696648362c219679c9426b40006976a64dea30a87f35aedde82c6e4489662049eaa2e52766d276c574f8a5799c1eac06030e1b41c084567ffd2a97a5b91b3caaa25dc913e3315c14ab0903aa2a1c1a0f8b41837f0ffb360d2fbeb44e2c4f2cf8a0ef990912ca61ad85a9af764742c33470e416b81728efbc8d8eac219ee55e0040e779b97dc07c35b666c18e6d0afc0523067e760eced8e572aedc4f7eea5fbfc017b9c44bf02a8c9b481923f603330afee48c86eabaf89712d523f719d23a159f2ee49a2070a904e3562a973103", + "range_proof_data_hex": "b677b12e01b2c476d280f0c777427a0a14cb696648362c219679c9426b400069e4a6900412c5c11289e23c9c5a616d65d3f562781c283f66cc6c8a1dac34e75900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000004859d2cba689dd330544a6ec61433d662ef355b4ea04d868d552deb24aa04f604c6bcabd0774faf5559b18fad6ad31f723d156d2b4cc0999df058098c9c89762c47c83b61037bd7929a68374e36f0009def320e7bf1b4921a048442190e2727362c637edebb9f0e45ced3c2c68459dc509cc64f6ff254296d089bcc28a2e6b221a654b7151f40e49cf8c6f2113e6e97cdd5af1a8e1dd03d7cf94698ac4b7af0483c9df068f13b08bad616b2dad871a9c8385ae47329b9dd2e9b23bdf4b5f470e55059a2e6bfe09b69285a0dc64c5df140d953f44ed728068f0c58281fbf18d033ec3d0738860a02c31928b5521ffaf1f1ca05abf8f7c4fd238fa020529b9ca57141fad272e3466f9900433ec2018183508db48a7e7c0436652e8aa29ac42e30ca647f7d9a7143325b22f0e359170daf96dfbb3d7844ca670856cbd100270cf1424bde4c7947adbd4145a6070d0248cb0914d7b7e439e2831cff5e3a360ed4c048cf8802667b0d20264df7146dda2b5bb8c738aa9c4078755ad865825a3be4a0b42cf8c9734223360953214a853af1779b90569a4673dc4b29209779094342d38d4aa97d8fb71de22baa41dcd3bea7d576422b03c1dc0aa6aaf35fb9f0ef3be0bee1ca804f0373e1aa675cec2d2a3b9d7d336567bf4096f17b85e3921b8a2683e38f6fe47a888c188e2ddd84038b770edb102d3c102bd4f0077ee5c4a6f72796bd2dd0087bb8c68ac42a9d52010fd026483428e6c186b8d002078a408fbd12f02a6c2584f4bc91b7771bd8f36407c71dafb06cbb44823bfbac9ff9febc1b171691e2b8f4e28b7cb2569ef270f0b9654783eda300fa7f1998071e77803fe3d4b2a8a147d60b10b62e9035cee57cbf5cfa7300732767a6d9dab5025cce52eaf2f04789d6839e7591143b54d21ccd625597d2c5235ecd1e6d3458d5ed7e8d0093a2661454a84cbb9323049079f595e18d82e82b1f3c95b3d905e779d4e18ddf89c07ddcbfec08b84068695a6ca5f0fb9b548151eed220f83f32e046f6c4da648de0c", + "validity_proof_data_hex": "92d8c7b5d6906b6f027c99e3e28f632cebf1da7aca95a70f1b823edeef678817269b2044cea025efee559e615a04a71461ce2112778ecd73e0d41b74d3a6111ae4a6900412c5c11289e23c9c5a616d65d3f562781c283f66cc6c8a1dac34e7598c92e29204585d1cf8c3d247c171dd3c5d8c3dc0035e50ca653e14e03cb3427c46c47edcf89af6b084f03582994d40e261976af2ae58ff56a93fb10435e88319f09cd529aea881e2d35126bc6ae49d9539f6f5f6db3c3ea3338e61bedfe65c045c9a558e157456a2f74b2cbae220accadaf6761a764c8f2e62b3f2fbab0c29453a846b69161968f047bfd0870fb653303241224dcf7b1c2ebd327cfb6990cb551885e56d14f17cc504ab5ad5401769d29331bfe84831f5aa1c3bb3b76dc0b92a2ae780dc684f902925e9e172f05c1d4f50225fdf5ef963a510656a7a7fabbe6c14316ab69e4bbac4a6b8619046c78ca09b437de5e122455fe4f793ce76ba752af3d438d3081146010ac29b70d3dc42ffb1dfd1e6b7966c7a587b56d1d1170a005c16afbeaf50189e71fd477d4cc3d61047cc5870cc85bff396c9bd0b8164f401" }, "binding": { - "current_balance_commitment_hex": "407d720005e25589c26f9b7acea6e3031c3b91698d1ca4badbb7127e40eef462", - "current_balance_handle_hex": "dcfdfd46264a9aa2b7495f342a4fba84d7343699a00099aa918232b0a8971f08", - "recipient_pubkey_hex": "aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245", - "sender_pubkey_hex": "30943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214" + "current_balance_commitment_hex": "6a18a9de8fbc7b3e36d42013898042c40c731a060821c413b75b6391541bcc3e", + "current_balance_handle_hex": "4c2222d9be93d05d71f077b307a88682960a08e6037048f74822153be7d8e967", + "recipient_pubkey_hex": "269b2044cea025efee559e615a04a71461ce2112778ecd73e0d41b74d3a6111a", + "sender_pubkey_hex": "92d8c7b5d6906b6f027c99e3e28f632cebf1da7aca95a70f1b823edeef678817" }, "mutations": [ { @@ -1552,7 +1552,7 @@ "op": "bitflip", "target": "binding.sender_pubkey_hex", "params": { - "value_hex": "31943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214" + "value_hex": "93d8c7b5d6906b6f027c99e3e28f632cebf1da7aca95a70f1b823edeef678817" }, "expected_valid": false, "expected_error_contains": "failed" @@ -1562,7 +1562,7 @@ "op": "bitflip", "target": "binding.recipient_pubkey_hex", "params": { - "value_hex": "afec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245" + "value_hex": "279b2044cea025efee559e615a04a71461ce2112778ecd73e0d41b74d3a6111a" }, "expected_valid": false, "expected_error_contains": "failed" @@ -1582,7 +1582,7 @@ "op": "truncate", "target": "payload.range_proof_data_hex", "params": { - "value_hex": "aa44352b1f2c49b05d2b8a6fdb64a5a06b65be84158bf1239c7495402cc1f85e3cc0c678c42538ebcc8469d9652366f23194391beecaf2efd9b0754cd3fc38300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000a41f8292d36d87a2277bc4f61259398cb21bac85e8146580881de53780b48578c43746b27fe88f4aed9aab63c2b7c4281f0dc29bbcc13bc52e5b5b8f703ac86820242d57dc57804fc32c68d48761aee764ad72f06aa7c3bbc2e9d2235c69185920ba2c7e0b7b158933b0ccd370852d4db36c8fb26cfa1f38cd66004e90eb845baeb429f2b07a0e14b3e94f94df105d6ba39099fd46420f6337e9ba7873196a035d989d993a120377207e854b149396a6cd577c5e541d6e10b6517a89d958bc07e43c1792d82f260c2d56b0fba42891279a7efacc06bf8669c36cb7f195db9100988bb6e6ecaae2c18d52a8f20a46d996506ed27ba9e3e9715807f16928b6f3556248acc42e8e6084287e6e39e66ff4559aac100e7a381b89342c54a3f05bda575e258de0cb67a754693551a0b3b9282052bde3f7c1c7766531b4ce3be3799f05ac3a0e77fe9679ffbdb8939bdf157d9382da972ad44e9078b4860647d89d3a3646d9685f6f39508b3faeaad0981f2d435b025c212e9c58cbbfe79228c356760606aa7a068f13fcb95f77e1aa135bc04c043dfb6b00a8bf5f5a6e3aa22369a1561050c8383808a2b966e1efc04c2bb8a2c92a5d8d0cdad425c263a599ab43f17d30c274ec2d626c539241997c48f60aeb8b3717e221feeb12b18196f0723a5126860c30f2f4909fdb2982b9ffcc4a77097446457482fc795bd176f89fcee8d52fd8e700124d5bbb2ad29e87f7ae0e2687ac5e90625977ca43dd66211f4f29bd390a034d80bacaa64b8c37187b634275b8287ebd950bbdb1a4f3ab695e61d08e77347354dcdd24517da5b6b384978c9a6908cdfe9abec4e126023786381c43e97c86a642a6141b206112a249340f068893cef5ee44d310002666c1f5b2810cab6a0ef01221523b4064ded0bb3a71c28260da7f9efa1d8674c333e2bdb49aeb9232acbabb69c02c3432505b0da25c4d146ecc7c8789f942849bef71641f9b586e095521b4b4bb9bb2debb2afcbc2b8b245a61711915555d659956601112a8f6" + "value_hex": "b677b12e01b2c476d280f0c777427a0a14cb696648362c219679c9426b400069e4a6900412c5c11289e23c9c5a616d65d3f562781c283f66cc6c8a1dac34e75900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000004859d2cba689dd330544a6ec61433d662ef355b4ea04d868d552deb24aa04f604c6bcabd0774faf5559b18fad6ad31f723d156d2b4cc0999df058098c9c89762c47c83b61037bd7929a68374e36f0009def320e7bf1b4921a048442190e2727362c637edebb9f0e45ced3c2c68459dc509cc64f6ff254296d089bcc28a2e6b221a654b7151f40e49cf8c6f2113e6e97cdd5af1a8e1dd03d7cf94698ac4b7af0483c9df068f13b08bad616b2dad871a9c8385ae47329b9dd2e9b23bdf4b5f470e55059a2e6bfe09b69285a0dc64c5df140d953f44ed728068f0c58281fbf18d033ec3d0738860a02c31928b5521ffaf1f1ca05abf8f7c4fd238fa020529b9ca57141fad272e3466f9900433ec2018183508db48a7e7c0436652e8aa29ac42e30ca647f7d9a7143325b22f0e359170daf96dfbb3d7844ca670856cbd100270cf1424bde4c7947adbd4145a6070d0248cb0914d7b7e439e2831cff5e3a360ed4c048cf8802667b0d20264df7146dda2b5bb8c738aa9c4078755ad865825a3be4a0b42cf8c9734223360953214a853af1779b90569a4673dc4b29209779094342d38d4aa97d8fb71de22baa41dcd3bea7d576422b03c1dc0aa6aaf35fb9f0ef3be0bee1ca804f0373e1aa675cec2d2a3b9d7d336567bf4096f17b85e3921b8a2683e38f6fe47a888c188e2ddd84038b770edb102d3c102bd4f0077ee5c4a6f72796bd2dd0087bb8c68ac42a9d52010fd026483428e6c186b8d002078a408fbd12f02a6c2584f4bc91b7771bd8f36407c71dafb06cbb44823bfbac9ff9febc1b171691e2b8f4e28b7cb2569ef270f0b9654783eda300fa7f1998071e77803fe3d4b2a8a147d60b10b62e9035cee57cbf5cfa7300732767a6d9dab5025cce52eaf2f04789d6839e7591143b54d21ccd625597d2c5235ecd1e6d3458d5ed7e8d0093a2661454a84cbb9323049079f595e18d82e82b1f3c95b3d905e779d4e18ddf89c07ddcbfec08b84068695a6ca5f0fb9b548151eed220f83f32e046f6c4da648" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -1594,7 +1594,7 @@ "family": "equality", "expected_valid": true, "payload": { - "proof_data_hex": "aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c7923732452e8dbee520fb7ab016d76cda607fb07b97da8e606b48cc556ce077261da8611db4caad8414e9d231ce0a662ebaf94c5cfb5d0f8bbe1aa1c822941786e9ff265a9c4dac62b85ac8b0ee5c9678be078d0629fc257af7a0cf3d466f244b5a0cf6593a41a10d4cd78315a494a3915aad5efbcd3c4b76cdbb541b5bc94e9913282a4a9c5fffaccadec6a23e9f216f1ad43d0d06fc152cc73e3e25175e319a1349d21eee7be163fb992fdf083c584d8145d74715fb3cea2105934c4fa173de27dd8938511c94c5e5bd1a3935234aa864a7539918ca27d7367c359753ecc71951ef2509057b58c8003566cbfd0382c4e51ef617eca18d3d78d83d9c70078378f41374088288dbfe9373bfedb71270006d2f49c626e4c14fe37a4e334b146b546a4a2b00" + "proof_data_hex": "269b2044cea025efee559e615a04a71461ce2112778ecd73e0d41b74d3a6111a280961101be888ed8a1508109205e3f26560e05d671e7b832b3521ec6a99af15402a31da05d57bf44298c06004fe361b47e4df3905910df013a0e27100315f4c2edb78a244e71b1f11f74b4c0d1b3c6939b9b7ba1a73e82d9bcee588cad2bd4122faaa5fb7271d90cdd274732495ace269871c6ce03fe7f5abaf7af1a4804301cae1955c726634669876a07baa9334bd31c2d65e651530013293fe913d736a33f09ac0abe71087f4085677e11085a15a16d185b8bf2731e56beb274a448ff1160e4c9639afb2a9f11684d173a57510056cdcaa47d72b1b64ad735491e69518041c90277a03ae7077ec41c9c524bc6c409760b7032d1cfb17ba1be35bda28640673f797e5477225412247637e1a9cf12a9cf69e89672ba5cf4d931232febaab0f" }, "mutations": [ { @@ -1602,7 +1602,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "afec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c7923732452e8dbee520fb7ab016d76cda607fb07b97da8e606b48cc556ce077261da8611db4caad8414e9d231ce0a662ebaf94c5cfb5d0f8bbe1aa1c822941786e9ff265a9c4dac62b85ac8b0ee5c9678be078d0629fc257af7a0cf3d466f244b5a0cf6593a41a10d4cd78315a494a3915aad5efbcd3c4b76cdbb541b5bc94e9913282a4a9c5fffaccadec6a23e9f216f1ad43d0d06fc152cc73e3e25175e319a1349d21eee7be163fb992fdf083c584d8145d74715fb3cea2105934c4fa173de27dd8938511c94c5e5bd1a3935234aa864a7539918ca27d7367c359753ecc71951ef2509057b58c8003566cbfd0382c4e51ef617eca18d3d78d83d9c70078378f41374088288dbfe9373bfedb71270006d2f49c626e4c14fe37a4e334b146b546a4a2b00" + "value_hex": "279b2044cea025efee559e615a04a71461ce2112778ecd73e0d41b74d3a6111a280961101be888ed8a1508109205e3f26560e05d671e7b832b3521ec6a99af15402a31da05d57bf44298c06004fe361b47e4df3905910df013a0e27100315f4c2edb78a244e71b1f11f74b4c0d1b3c6939b9b7ba1a73e82d9bcee588cad2bd4122faaa5fb7271d90cdd274732495ace269871c6ce03fe7f5abaf7af1a4804301cae1955c726634669876a07baa9334bd31c2d65e651530013293fe913d736a33f09ac0abe71087f4085677e11085a15a16d185b8bf2731e56beb274a448ff1160e4c9639afb2a9f11684d173a57510056cdcaa47d72b1b64ad735491e69518041c90277a03ae7077ec41c9c524bc6c409760b7032d1cfb17ba1be35bda28640673f797e5477225412247637e1a9cf12a9cf69e89672ba5cf4d931232febaab0f" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -1612,7 +1612,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c7923732452e8dbee520fb7ab016d76cda607fb07b97da8e606b48cc556ce077261da8611db4caad8414e9d231ce0a662ebaf94c5cfb5d0f8bbe1aa1c822941786e9ff265a9c4dac62b85ac8b0ee5c9678be078d0629fc257af7a0cf3d466f244b5a0cf6593a41a10d4cd78315a494a3915aad5efbcd3c4b76cdbb541b5bc94e9913282a4a9c5fffaccadec6a23e9f216f1ad43d0d06fc152cc73e3e25175e319a1349d21eee7be163fb992fdf083c584d8145d74715fb3cea2105934c4fa173de27dd8938511c94c5e5bd1a3935234aa864a7539918ca27d7367c359753ecc71951ef2509057b58c8003566cbfd0382c4e51ef617eca18d3d78d83d9c70078378f41374088288dbfe9373bfedb71270006d2f49c626e4c14fe37a4e334b146b546a4a" + "value_hex": "269b2044cea025efee559e615a04a71461ce2112778ecd73e0d41b74d3a6111a280961101be888ed8a1508109205e3f26560e05d671e7b832b3521ec6a99af15402a31da05d57bf44298c06004fe361b47e4df3905910df013a0e27100315f4c2edb78a244e71b1f11f74b4c0d1b3c6939b9b7ba1a73e82d9bcee588cad2bd4122faaa5fb7271d90cdd274732495ace269871c6ce03fe7f5abaf7af1a4804301cae1955c726634669876a07baa9334bd31c2d65e651530013293fe913d736a33f09ac0abe71087f4085677e11085a15a16d185b8bf2731e56beb274a448ff1160e4c9639afb2a9f11684d173a57510056cdcaa47d72b1b64ad735491e69518041c90277a03ae7077ec41c9c524bc6c409760b7032d1cfb17ba1be35bda28640673f797e5477225412247637e1a9cf12a9cf69e89672ba5cf4d931232feba" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -1634,7 +1634,7 @@ "family": "validity", "expected_valid": true, "payload": { - "proof_data_hex": "aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268e4027c0694a6d1c9413fbf3f8d187dec4a85e0ebb06c0f5cc1d7d47373181c563c3f97bc645bbc4851bdd30419ef5d7e37eea5ea40c36d2cfc9240aa882183169c9228fa2ff9e40f933616c5d8190f67b973bc146c7df88950676ad6d62b972eaabc0426c4744f1bb26bcfe8d03ebb61fca61d553d0bb16fe3168d42190d401b0a1b416e280c45ba27a81a1f420a6120c99588f9455a5ee6cd04d4f255aad06940bdf72ab5e85f38890fa62ac37f7890911ac664dacc6627f7380b0ed376ed02d0e26a24a061d95cc5e2189ff4b1d1f73f80cccedac725dd6d38172c8ff9ce3d8673fbab741857723955f66ea8766f7923f94334ee5f94da2e3f08182ac26b55d2ca9ac7d51508b1b8a61cd3d71024411b98075c7ec9612cd6244234cd0ebd75e4dd6ae08dfee943dc1ddc999bedf9962a471fa95560fb025285c360fca9610666b40924e10b1dd138a0b0525ec36213a4d1bcaac9e6c8c5745db3542f378d0e" + "proof_data_hex": "269b2044cea025efee559e615a04a71461ce2112778ecd73e0d41b74d3a6111aaaccc8b2f111925812d3c79c9eff877635229ef0e4e1fb65e11f390bc7b2e865cc1dac28f3b0069b9e04114083cdc1bf9c2b70e895de758e6bb56f9810956719d8294a2d4114df00c04de4cffff35ef6e49808ee1b22a71b4a032d8eca688e7c5e09b4fa1b53a5ebd0ce2bd058ed97ef557f04f7be27468da56f9e7e85733236ae40beb969db61763de2e55f1305289ff48b2f6f93f13bbaceccee58be7e6f68e8cc95bbc7c9caf9b0be224a012bb108eac25833d7197390f56a8099957b395886db9040b896d0d8122a6c0ae1b85c8dfebcb96fea3255dab12a4fe41fcace2a1472dad03ef3cf0dc6aefed152fba82085adb81da4f8c40c48aaf9cf1c9c9a22a63be44d65b7f965406957ae41bdd47c95704b64268127e034fd924322e9d104548e4c4ccfeadefaf1cbc7aa1f4217985f80d6f0a8fc37c56fafad67276ddc4fc56c6560aa28c99c67430eba1c7b2380fc82d76ed1c8c5b1f8da749c78e8070186d82274b604cb4d1c7e9c5bf10ba404e8eb6fe19415b2dfd3d3fe7a59031302" }, "mutations": [ { @@ -1642,7 +1642,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "afec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268e4027c0694a6d1c9413fbf3f8d187dec4a85e0ebb06c0f5cc1d7d47373181c563c3f97bc645bbc4851bdd30419ef5d7e37eea5ea40c36d2cfc9240aa882183169c9228fa2ff9e40f933616c5d8190f67b973bc146c7df88950676ad6d62b972eaabc0426c4744f1bb26bcfe8d03ebb61fca61d553d0bb16fe3168d42190d401b0a1b416e280c45ba27a81a1f420a6120c99588f9455a5ee6cd04d4f255aad06940bdf72ab5e85f38890fa62ac37f7890911ac664dacc6627f7380b0ed376ed02d0e26a24a061d95cc5e2189ff4b1d1f73f80cccedac725dd6d38172c8ff9ce3d8673fbab741857723955f66ea8766f7923f94334ee5f94da2e3f08182ac26b55d2ca9ac7d51508b1b8a61cd3d71024411b98075c7ec9612cd6244234cd0ebd75e4dd6ae08dfee943dc1ddc999bedf9962a471fa95560fb025285c360fca9610666b40924e10b1dd138a0b0525ec36213a4d1bcaac9e6c8c5745db3542f378d0e" + "value_hex": "279b2044cea025efee559e615a04a71461ce2112778ecd73e0d41b74d3a6111aaaccc8b2f111925812d3c79c9eff877635229ef0e4e1fb65e11f390bc7b2e865cc1dac28f3b0069b9e04114083cdc1bf9c2b70e895de758e6bb56f9810956719d8294a2d4114df00c04de4cffff35ef6e49808ee1b22a71b4a032d8eca688e7c5e09b4fa1b53a5ebd0ce2bd058ed97ef557f04f7be27468da56f9e7e85733236ae40beb969db61763de2e55f1305289ff48b2f6f93f13bbaceccee58be7e6f68e8cc95bbc7c9caf9b0be224a012bb108eac25833d7197390f56a8099957b395886db9040b896d0d8122a6c0ae1b85c8dfebcb96fea3255dab12a4fe41fcace2a1472dad03ef3cf0dc6aefed152fba82085adb81da4f8c40c48aaf9cf1c9c9a22a63be44d65b7f965406957ae41bdd47c95704b64268127e034fd924322e9d104548e4c4ccfeadefaf1cbc7aa1f4217985f80d6f0a8fc37c56fafad67276ddc4fc56c6560aa28c99c67430eba1c7b2380fc82d76ed1c8c5b1f8da749c78e8070186d82274b604cb4d1c7e9c5bf10ba404e8eb6fe19415b2dfd3d3fe7a59031302" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -1652,7 +1652,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268e4027c0694a6d1c9413fbf3f8d187dec4a85e0ebb06c0f5cc1d7d47373181c563c3f97bc645bbc4851bdd30419ef5d7e37eea5ea40c36d2cfc9240aa882183169c9228fa2ff9e40f933616c5d8190f67b973bc146c7df88950676ad6d62b972eaabc0426c4744f1bb26bcfe8d03ebb61fca61d553d0bb16fe3168d42190d401b0a1b416e280c45ba27a81a1f420a6120c99588f9455a5ee6cd04d4f255aad06940bdf72ab5e85f38890fa62ac37f7890911ac664dacc6627f7380b0ed376ed02d0e26a24a061d95cc5e2189ff4b1d1f73f80cccedac725dd6d38172c8ff9ce3d8673fbab741857723955f66ea8766f7923f94334ee5f94da2e3f08182ac26b55d2ca9ac7d51508b1b8a61cd3d71024411b98075c7ec9612cd6244234cd0ebd75e4dd6ae08dfee943dc1ddc999bedf9962a471fa95560fb025285c360fca9610666b40924e10b1dd138a0b0525ec36213a4d1bcaac9e6c8c5745db3542f37" + "value_hex": "269b2044cea025efee559e615a04a71461ce2112778ecd73e0d41b74d3a6111aaaccc8b2f111925812d3c79c9eff877635229ef0e4e1fb65e11f390bc7b2e865cc1dac28f3b0069b9e04114083cdc1bf9c2b70e895de758e6bb56f9810956719d8294a2d4114df00c04de4cffff35ef6e49808ee1b22a71b4a032d8eca688e7c5e09b4fa1b53a5ebd0ce2bd058ed97ef557f04f7be27468da56f9e7e85733236ae40beb969db61763de2e55f1305289ff48b2f6f93f13bbaceccee58be7e6f68e8cc95bbc7c9caf9b0be224a012bb108eac25833d7197390f56a8099957b395886db9040b896d0d8122a6c0ae1b85c8dfebcb96fea3255dab12a4fe41fcace2a1472dad03ef3cf0dc6aefed152fba82085adb81da4f8c40c48aaf9cf1c9c9a22a63be44d65b7f965406957ae41bdd47c95704b64268127e034fd924322e9d104548e4c4ccfeadefaf1cbc7aa1f4217985f80d6f0a8fc37c56fafad67276ddc4fc56c6560aa28c99c67430eba1c7b2380fc82d76ed1c8c5b1f8da749c78e8070186d82274b604cb4d1c7e9c5bf10ba404e8eb6fe19415b2dfd3d3fe7a5903" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -1674,7 +1674,7 @@ "family": "transfer_range", "expected_valid": true, "payload": { - "proof_data_hex": "9c4dac62b85ac8b0ee5c9678be078d0629fc257af7a0cf3d466f244b5a0cf659e4027c0694a6d1c9413fbf3f8d187dec4a85e0ebb06c0f5cc1d7d47373181c5600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000002636ab98020d46b3c41991b8ed299c779494605b4ebf31d532727f8a96e7696856231d1219a3f7d05c36332a51089ce346cd282951f2b53baf570d5109445334c42774a3c0513e24527f7d7c288d784d613ae0cc437cd4d685b73910ceede8476682dc5a19a3bbbc2c875d8ed97eb9a67d6204fb7ef952b5db07020c3582a53237d07187471a4a9b20c31005a8d8d499e1e06d199b7b8f2cb8d88b13c4abfa06355aad25dd7a82337734cb624244163a84a78eba1ce4ff42faa75ea53e3ae10dfa1af68680cf521b19eaaac95ba8bd8f744e06df1c9c3f79b82dfed9d402730df6f5e6c1d0f4820e3356c5da0587fbdc9c725b4eaa44e0e0ed9f1ae9e7d4f574128a1828619041d2d37de4a8fe0bc4bd398c18d02a34973eb139eb31eee38543029b01567a4eebbe293faf27723e570fed67f3ffb534d51280c401f951d67d55868a4cdb242d863c2e7b57eac83f84f29e669e0c4e618e6304a894e62d46097362d9caa2ca183f815dec8eac54033c810263f562dea69f8d9014bfbdbe8ec0063e99bc501684dfd1607ff39586127992dfa3aebc7de509d31e928c9afe9d195bce060fdd363edf0c8d8ede136c0f10d310bf7048de536c6ffc225f3d17281155f2466ef277ea28cc564d723b72e3e9dd26683ae6d9367a6f7796031c1f84240e501bcf3aa6775055141c46875c84d41cbb06162ba9d26b05e985cb2ebfd7ec27a2f018f3dfa34ffabf8d86356587b178c71c13a8e211809abacd5f0bb25b145fa4b8fdc72b93351ff3cf6fad7f9b2b3056bb1741098174e892b51f85fb8cf32d00ebf1b7b5cff1a5b9024be4cca3fe8323f0218e225f1fff8d922d0202b7ec63ce6eb3eb91d8266e3bb92bf073631aa1ae07f2229953bc86f768bf2da813f1603c42f257f821f5716cd0c655d52c08a7cae67ea8c180e0b8a26faeeaae2fb942e807f9fdeabf97dfe6ad9972446961dc18b98d357f5e5572db4ed528b5abe0047cd3c722cf7ed7f050da485350666e3b3aef4a559e0a285bd33adf8924062b0d" + "proof_data_hex": "2edb78a244e71b1f11f74b4c0d1b3c6939b9b7ba1a73e82d9bcee588cad2bd41cc1dac28f3b0069b9e04114083cdc1bf9c2b70e895de758e6bb56f98109567190000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000b64a6792010d4edebdc320f079dbc200fa04b7b78b814bb2fc86a82edf696c246670ace9159762019eeacb26df3fb38c3922d2fa649120e58aadcdd49c734715c26a7c2f3f377f79af9ba22aa1532d33867f61c827aaf72f0d95fb9c73a46a7e6a1a9682d85b8f7f5ad6bb0d42103af301cd8c58fa60ee1c187dd149b6ff5926e916e71d21aba4072a9b67b33896b9c9a061b713affa2210cbf87bf0a2c8780deac5d521238635405436987addff070cd766144e348cc0b94a700a95f9d831042389aa091f90243d7624de623cd84ead86fdddf329250946f36be403cefbfc0d40332d1bccbf8c2a362833b8a49db8118d4a905d75753667d38cabf021fd9e18943fcd92ea655a92e202ae704a4bc5a4dc98cb7e58e73a7675a220615d888c4ba8d93951687a0123b82d719da30d965eb381838f19cc7bbd069ba09b6ff9da2286b0d67be2d8240e88c27c942aaf385724a60e6c30c179678febbee9910a652d04903abfa4b1ab51230a1b39e8e1ce895d57e21d7583d2b7e58ff4c7d5c740304ab9bbe3c20f29e28abb15fc5522ddf23f457d77eaa99d244c634b5e2d14562f9695277f3ccd3a26b1133703c2aec360ab3672bb21250cb48c42602dd79709538a04dd50ec49776ab27bd6c432484896d130dac9b8110198e0b9bcef6e67fa0712da12827b07eccc28e13fda6270cb67579a612d90365a731bef75ecd56c235ce880b5bdb95555eff732774113f6381b17d687c88124e7c776671cc00191543b3678bdaf6f384833dbcf4249bb80f067d81a5f361e4deac18bab235d8be317019aaa417f449a745a1b085c4190846e739be0e9df94105bb82bb12660f5b51f186ea8ead45553ce2e3a38ad31a1a920f9ef31a611983d7521d958bcc83173be6b580df8e940577126f399168dec6e65783c9803eaf01fdbba3ec77402675b607f2ca68e0d9888246dd961b1db2820c32e7293386bd803e848fb59904acaf5520063b81e0662d915336047420da4c1a2fb7de321504d28093a1a5d5eb48b47cc08" }, "mutations": [ { @@ -1682,7 +1682,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "9d4dac62b85ac8b0ee5c9678be078d0629fc257af7a0cf3d466f244b5a0cf659e4027c0694a6d1c9413fbf3f8d187dec4a85e0ebb06c0f5cc1d7d47373181c5600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000002636ab98020d46b3c41991b8ed299c779494605b4ebf31d532727f8a96e7696856231d1219a3f7d05c36332a51089ce346cd282951f2b53baf570d5109445334c42774a3c0513e24527f7d7c288d784d613ae0cc437cd4d685b73910ceede8476682dc5a19a3bbbc2c875d8ed97eb9a67d6204fb7ef952b5db07020c3582a53237d07187471a4a9b20c31005a8d8d499e1e06d199b7b8f2cb8d88b13c4abfa06355aad25dd7a82337734cb624244163a84a78eba1ce4ff42faa75ea53e3ae10dfa1af68680cf521b19eaaac95ba8bd8f744e06df1c9c3f79b82dfed9d402730df6f5e6c1d0f4820e3356c5da0587fbdc9c725b4eaa44e0e0ed9f1ae9e7d4f574128a1828619041d2d37de4a8fe0bc4bd398c18d02a34973eb139eb31eee38543029b01567a4eebbe293faf27723e570fed67f3ffb534d51280c401f951d67d55868a4cdb242d863c2e7b57eac83f84f29e669e0c4e618e6304a894e62d46097362d9caa2ca183f815dec8eac54033c810263f562dea69f8d9014bfbdbe8ec0063e99bc501684dfd1607ff39586127992dfa3aebc7de509d31e928c9afe9d195bce060fdd363edf0c8d8ede136c0f10d310bf7048de536c6ffc225f3d17281155f2466ef277ea28cc564d723b72e3e9dd26683ae6d9367a6f7796031c1f84240e501bcf3aa6775055141c46875c84d41cbb06162ba9d26b05e985cb2ebfd7ec27a2f018f3dfa34ffabf8d86356587b178c71c13a8e211809abacd5f0bb25b145fa4b8fdc72b93351ff3cf6fad7f9b2b3056bb1741098174e892b51f85fb8cf32d00ebf1b7b5cff1a5b9024be4cca3fe8323f0218e225f1fff8d922d0202b7ec63ce6eb3eb91d8266e3bb92bf073631aa1ae07f2229953bc86f768bf2da813f1603c42f257f821f5716cd0c655d52c08a7cae67ea8c180e0b8a26faeeaae2fb942e807f9fdeabf97dfe6ad9972446961dc18b98d357f5e5572db4ed528b5abe0047cd3c722cf7ed7f050da485350666e3b3aef4a559e0a285bd33adf8924062b0d" + "value_hex": "2fdb78a244e71b1f11f74b4c0d1b3c6939b9b7ba1a73e82d9bcee588cad2bd41cc1dac28f3b0069b9e04114083cdc1bf9c2b70e895de758e6bb56f98109567190000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000b64a6792010d4edebdc320f079dbc200fa04b7b78b814bb2fc86a82edf696c246670ace9159762019eeacb26df3fb38c3922d2fa649120e58aadcdd49c734715c26a7c2f3f377f79af9ba22aa1532d33867f61c827aaf72f0d95fb9c73a46a7e6a1a9682d85b8f7f5ad6bb0d42103af301cd8c58fa60ee1c187dd149b6ff5926e916e71d21aba4072a9b67b33896b9c9a061b713affa2210cbf87bf0a2c8780deac5d521238635405436987addff070cd766144e348cc0b94a700a95f9d831042389aa091f90243d7624de623cd84ead86fdddf329250946f36be403cefbfc0d40332d1bccbf8c2a362833b8a49db8118d4a905d75753667d38cabf021fd9e18943fcd92ea655a92e202ae704a4bc5a4dc98cb7e58e73a7675a220615d888c4ba8d93951687a0123b82d719da30d965eb381838f19cc7bbd069ba09b6ff9da2286b0d67be2d8240e88c27c942aaf385724a60e6c30c179678febbee9910a652d04903abfa4b1ab51230a1b39e8e1ce895d57e21d7583d2b7e58ff4c7d5c740304ab9bbe3c20f29e28abb15fc5522ddf23f457d77eaa99d244c634b5e2d14562f9695277f3ccd3a26b1133703c2aec360ab3672bb21250cb48c42602dd79709538a04dd50ec49776ab27bd6c432484896d130dac9b8110198e0b9bcef6e67fa0712da12827b07eccc28e13fda6270cb67579a612d90365a731bef75ecd56c235ce880b5bdb95555eff732774113f6381b17d687c88124e7c776671cc00191543b3678bdaf6f384833dbcf4249bb80f067d81a5f361e4deac18bab235d8be317019aaa417f449a745a1b085c4190846e739be0e9df94105bb82bb12660f5b51f186ea8ead45553ce2e3a38ad31a1a920f9ef31a611983d7521d958bcc83173be6b580df8e940577126f399168dec6e65783c9803eaf01fdbba3ec77402675b607f2ca68e0d9888246dd961b1db2820c32e7293386bd803e848fb59904acaf5520063b81e0662d915336047420da4c1a2fb7de321504d28093a1a5d5eb48b47cc08" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -1692,7 +1692,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "9c4dac62b85ac8b0ee5c9678be078d0629fc257af7a0cf3d466f244b5a0cf659e4027c0694a6d1c9413fbf3f8d187dec4a85e0ebb06c0f5cc1d7d47373181c5600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000002636ab98020d46b3c41991b8ed299c779494605b4ebf31d532727f8a96e7696856231d1219a3f7d05c36332a51089ce346cd282951f2b53baf570d5109445334c42774a3c0513e24527f7d7c288d784d613ae0cc437cd4d685b73910ceede8476682dc5a19a3bbbc2c875d8ed97eb9a67d6204fb7ef952b5db07020c3582a53237d07187471a4a9b20c31005a8d8d499e1e06d199b7b8f2cb8d88b13c4abfa06355aad25dd7a82337734cb624244163a84a78eba1ce4ff42faa75ea53e3ae10dfa1af68680cf521b19eaaac95ba8bd8f744e06df1c9c3f79b82dfed9d402730df6f5e6c1d0f4820e3356c5da0587fbdc9c725b4eaa44e0e0ed9f1ae9e7d4f574128a1828619041d2d37de4a8fe0bc4bd398c18d02a34973eb139eb31eee38543029b01567a4eebbe293faf27723e570fed67f3ffb534d51280c401f951d67d55868a4cdb242d863c2e7b57eac83f84f29e669e0c4e618e6304a894e62d46097362d9caa2ca183f815dec8eac54033c810263f562dea69f8d9014bfbdbe8ec0063e99bc501684dfd1607ff39586127992dfa3aebc7de509d31e928c9afe9d195bce060fdd363edf0c8d8ede136c0f10d310bf7048de536c6ffc225f3d17281155f2466ef277ea28cc564d723b72e3e9dd26683ae6d9367a6f7796031c1f84240e501bcf3aa6775055141c46875c84d41cbb06162ba9d26b05e985cb2ebfd7ec27a2f018f3dfa34ffabf8d86356587b178c71c13a8e211809abacd5f0bb25b145fa4b8fdc72b93351ff3cf6fad7f9b2b3056bb1741098174e892b51f85fb8cf32d00ebf1b7b5cff1a5b9024be4cca3fe8323f0218e225f1fff8d922d0202b7ec63ce6eb3eb91d8266e3bb92bf073631aa1ae07f2229953bc86f768bf2da813f1603c42f257f821f5716cd0c655d52c08a7cae67ea8c180e0b8a26faeeaae2fb942e807f9fdeabf97dfe6ad9972446961dc18b98d357f5e5572db4ed528b5abe0047cd3c722cf7ed7f050da485350666e3b3aef4a559e0a285bd33adf892406" + "value_hex": "2edb78a244e71b1f11f74b4c0d1b3c6939b9b7ba1a73e82d9bcee588cad2bd41cc1dac28f3b0069b9e04114083cdc1bf9c2b70e895de758e6bb56f98109567190000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000b64a6792010d4edebdc320f079dbc200fa04b7b78b814bb2fc86a82edf696c246670ace9159762019eeacb26df3fb38c3922d2fa649120e58aadcdd49c734715c26a7c2f3f377f79af9ba22aa1532d33867f61c827aaf72f0d95fb9c73a46a7e6a1a9682d85b8f7f5ad6bb0d42103af301cd8c58fa60ee1c187dd149b6ff5926e916e71d21aba4072a9b67b33896b9c9a061b713affa2210cbf87bf0a2c8780deac5d521238635405436987addff070cd766144e348cc0b94a700a95f9d831042389aa091f90243d7624de623cd84ead86fdddf329250946f36be403cefbfc0d40332d1bccbf8c2a362833b8a49db8118d4a905d75753667d38cabf021fd9e18943fcd92ea655a92e202ae704a4bc5a4dc98cb7e58e73a7675a220615d888c4ba8d93951687a0123b82d719da30d965eb381838f19cc7bbd069ba09b6ff9da2286b0d67be2d8240e88c27c942aaf385724a60e6c30c179678febbee9910a652d04903abfa4b1ab51230a1b39e8e1ce895d57e21d7583d2b7e58ff4c7d5c740304ab9bbe3c20f29e28abb15fc5522ddf23f457d77eaa99d244c634b5e2d14562f9695277f3ccd3a26b1133703c2aec360ab3672bb21250cb48c42602dd79709538a04dd50ec49776ab27bd6c432484896d130dac9b8110198e0b9bcef6e67fa0712da12827b07eccc28e13fda6270cb67579a612d90365a731bef75ecd56c235ce880b5bdb95555eff732774113f6381b17d687c88124e7c776671cc00191543b3678bdaf6f384833dbcf4249bb80f067d81a5f361e4deac18bab235d8be317019aaa417f449a745a1b085c4190846e739be0e9df94105bb82bb12660f5b51f186ea8ead45553ce2e3a38ad31a1a920f9ef31a611983d7521d958bcc83173be6b580df8e940577126f399168dec6e65783c9803eaf01fdbba3ec77402675b607f2ca68e0d9888246dd961b1db2820c32e7293386bd803e848fb59904acaf5520063b81e0662d915336047420da4c1a2fb7de321504d28093a1a5d5eb48b47" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -1712,7 +1712,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "9c4dac62b85ac8b0ee5c9678be078d0629fc257af7a0cf3d466f244b5a0cf659e4027c0694a6d1c9413fbf3f8d187dec4a85e0ebb06c0f5cc1d7d47373181c5600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000002636ab98020d46b3c41991b8ed299c779494605b4ebf31d532727f8a96e7696856231d1219a3f7d05c36332a51089ce346cd282951f2b53baf570d5109445334c42774a3c0513e24527f7d7c288d784d613ae0cc437cd4d685b73910ceede8476682dc5a19a3bbbc2c875d8ed97eb9a67d6204fb7ef952b5db07020c3582a53237d07187471a4a9b20c31005a8d8d499e1e06d199b7b8f2cb8d88b13c4abfa06355aad25dd7a82337734cb624244163a84a78eba1ce4ff42faa75ea53e3ae10dfa1af68680cf521b19eaaac95ba8bd8f744e06df1c9c3f79b82dfed9d402730df6f5e6c1d0f4820e3356c5da0587fbdc9c725b4eaa44e0e0ed9f1ae9e7d4f574128a1828619041d2d37de4a8fe0bc4bd398c18d02a34973eb139eb31eee38543029b01567a4eebbe293faf27723e570fed67f3ffb534d51280c401f951d67d55868a4cdb242d863c2e7b57eac83f84f29e669e0c4e618e6304a894e62d46097362d9caa2ca183f815dec8eac54033c810263f562dea69f8d9014bfbdbe8ec0063e99bc501684dfd1607ff39586127992dfa3aebc7de509d31e928c9afe9d195bce060fdd363edf0c8d8ede136c0f10d310bf7048de536c6ffc225f3d17281155f2466ef277ea28cc564d723b72e3e9dd26683ae6d9367a6f7796031c1f84240e501bcf3aa6775055141c46875c84d41cbb06162ba9d26b05e985cb2ebfd7ec27a2f018f3dfa34ffabf8d86356587b178c71c13a8e211809abacd5f0bb25b145fa4b8fdc72b93351ff3cf6fad7f9b2b3056bb1741098174e892b51f85fb8cf32d00ebf1b7b5cff1a5b9024be4cca3fe8323f0218e225f1fff8d922d0202b7ec63ce6eb3eb91d8266e3bb92bf073631aa1ae07f2229953bc86f768bf2da813f1603c42f257f821f5716cd0c655d52c08a7cae67ea8c180e0b8a26faeeaae2fb942e807f9fdeabf97dfe6ad9972446961dc18b98d357f5e5572db4ed528b5abe0047cd3c722cf7ed7f050da485350666e3b3aef4a559e0a285bd33adf8924062b0c" + "value_hex": "2edb78a244e71b1f11f74b4c0d1b3c6939b9b7ba1a73e82d9bcee588cad2bd41cc1dac28f3b0069b9e04114083cdc1bf9c2b70e895de758e6bb56f98109567190000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000b64a6792010d4edebdc320f079dbc200fa04b7b78b814bb2fc86a82edf696c246670ace9159762019eeacb26df3fb38c3922d2fa649120e58aadcdd49c734715c26a7c2f3f377f79af9ba22aa1532d33867f61c827aaf72f0d95fb9c73a46a7e6a1a9682d85b8f7f5ad6bb0d42103af301cd8c58fa60ee1c187dd149b6ff5926e916e71d21aba4072a9b67b33896b9c9a061b713affa2210cbf87bf0a2c8780deac5d521238635405436987addff070cd766144e348cc0b94a700a95f9d831042389aa091f90243d7624de623cd84ead86fdddf329250946f36be403cefbfc0d40332d1bccbf8c2a362833b8a49db8118d4a905d75753667d38cabf021fd9e18943fcd92ea655a92e202ae704a4bc5a4dc98cb7e58e73a7675a220615d888c4ba8d93951687a0123b82d719da30d965eb381838f19cc7bbd069ba09b6ff9da2286b0d67be2d8240e88c27c942aaf385724a60e6c30c179678febbee9910a652d04903abfa4b1ab51230a1b39e8e1ce895d57e21d7583d2b7e58ff4c7d5c740304ab9bbe3c20f29e28abb15fc5522ddf23f457d77eaa99d244c634b5e2d14562f9695277f3ccd3a26b1133703c2aec360ab3672bb21250cb48c42602dd79709538a04dd50ec49776ab27bd6c432484896d130dac9b8110198e0b9bcef6e67fa0712da12827b07eccc28e13fda6270cb67579a612d90365a731bef75ecd56c235ce880b5bdb95555eff732774113f6381b17d687c88124e7c776671cc00191543b3678bdaf6f384833dbcf4249bb80f067d81a5f361e4deac18bab235d8be317019aaa417f449a745a1b085c4190846e739be0e9df94105bb82bb12660f5b51f186ea8ead45553ce2e3a38ad31a1a920f9ef31a611983d7521d958bcc83173be6b580df8e940577126f399168dec6e65783c9803eaf01fdbba3ec77402675b607f2ca68e0d9888246dd961b1db2820c32e7293386bd803e848fb59904acaf5520063b81e0662d915336047420da4c1a2fb7de321504d28093a1a5d5eb48b47cc09" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -1724,15 +1724,15 @@ "family": "transfer_composite", "expected_valid": true, "payload": { - "equality_proof_data_hex": "aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c7923732452e8dbee520fb7ab016d76cda607fb07b97da8e606b48cc556ce077261da8611db4caad8414e9d231ce0a662ebaf94c5cfb5d0f8bbe1aa1c822941786e9ff265a9c4dac62b85ac8b0ee5c9678be078d0629fc257af7a0cf3d466f244b5a0cf6593a41a10d4cd78315a494a3915aad5efbcd3c4b76cdbb541b5bc94e9913282a4a9c5fffaccadec6a23e9f216f1ad43d0d06fc152cc73e3e25175e319a1349d21eee7be163fb992fdf083c584d8145d74715fb3cea2105934c4fa173de27dd8938511c94c5e5bd1a3935234aa864a7539918ca27d7367c359753ecc71951ef2509057b58c8003566cbfd0382c4e51ef617eca18d3d78d83d9c70078378f41374088288dbfe9373bfedb71270006d2f49c626e4c14fe37a4e334b146b546a4a2b00", - "range_proof_data_hex": "9c4dac62b85ac8b0ee5c9678be078d0629fc257af7a0cf3d466f244b5a0cf659e4027c0694a6d1c9413fbf3f8d187dec4a85e0ebb06c0f5cc1d7d47373181c5600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000002636ab98020d46b3c41991b8ed299c779494605b4ebf31d532727f8a96e7696856231d1219a3f7d05c36332a51089ce346cd282951f2b53baf570d5109445334c42774a3c0513e24527f7d7c288d784d613ae0cc437cd4d685b73910ceede8476682dc5a19a3bbbc2c875d8ed97eb9a67d6204fb7ef952b5db07020c3582a53237d07187471a4a9b20c31005a8d8d499e1e06d199b7b8f2cb8d88b13c4abfa06355aad25dd7a82337734cb624244163a84a78eba1ce4ff42faa75ea53e3ae10dfa1af68680cf521b19eaaac95ba8bd8f744e06df1c9c3f79b82dfed9d402730df6f5e6c1d0f4820e3356c5da0587fbdc9c725b4eaa44e0e0ed9f1ae9e7d4f574128a1828619041d2d37de4a8fe0bc4bd398c18d02a34973eb139eb31eee38543029b01567a4eebbe293faf27723e570fed67f3ffb534d51280c401f951d67d55868a4cdb242d863c2e7b57eac83f84f29e669e0c4e618e6304a894e62d46097362d9caa2ca183f815dec8eac54033c810263f562dea69f8d9014bfbdbe8ec0063e99bc501684dfd1607ff39586127992dfa3aebc7de509d31e928c9afe9d195bce060fdd363edf0c8d8ede136c0f10d310bf7048de536c6ffc225f3d17281155f2466ef277ea28cc564d723b72e3e9dd26683ae6d9367a6f7796031c1f84240e501bcf3aa6775055141c46875c84d41cbb06162ba9d26b05e985cb2ebfd7ec27a2f018f3dfa34ffabf8d86356587b178c71c13a8e211809abacd5f0bb25b145fa4b8fdc72b93351ff3cf6fad7f9b2b3056bb1741098174e892b51f85fb8cf32d00ebf1b7b5cff1a5b9024be4cca3fe8323f0218e225f1fff8d922d0202b7ec63ce6eb3eb91d8266e3bb92bf073631aa1ae07f2229953bc86f768bf2da813f1603c42f257f821f5716cd0c655d52c08a7cae67ea8c180e0b8a26faeeaae2fb942e807f9fdeabf97dfe6ad9972446961dc18b98d357f5e5572db4ed528b5abe0047cd3c722cf7ed7f050da485350666e3b3aef4a559e0a285bd33adf8924062b0d", - "validity_proof_data_hex": "aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268e4027c0694a6d1c9413fbf3f8d187dec4a85e0ebb06c0f5cc1d7d47373181c563c3f97bc645bbc4851bdd30419ef5d7e37eea5ea40c36d2cfc9240aa882183169c9228fa2ff9e40f933616c5d8190f67b973bc146c7df88950676ad6d62b972eaabc0426c4744f1bb26bcfe8d03ebb61fca61d553d0bb16fe3168d42190d401b0a1b416e280c45ba27a81a1f420a6120c99588f9455a5ee6cd04d4f255aad06940bdf72ab5e85f38890fa62ac37f7890911ac664dacc6627f7380b0ed376ed02d0e26a24a061d95cc5e2189ff4b1d1f73f80cccedac725dd6d38172c8ff9ce3d8673fbab741857723955f66ea8766f7923f94334ee5f94da2e3f08182ac26b55d2ca9ac7d51508b1b8a61cd3d71024411b98075c7ec9612cd6244234cd0ebd75e4dd6ae08dfee943dc1ddc999bedf9962a471fa95560fb025285c360fca9610666b40924e10b1dd138a0b0525ec36213a4d1bcaac9e6c8c5745db3542f378d0e" + "equality_proof_data_hex": "269b2044cea025efee559e615a04a71461ce2112778ecd73e0d41b74d3a6111ad25307f34a59f50ec9a8aea674cebbef3108ad0672af4ada55125371b729301356986fb60ef22359aad6e31fec60b6cb482cf2e1d8ead8bd61ab43fdab8a410c8a40eb25361d9883251eaab8d343a26a94d7feff70a2e463f52822c60e545842f8d4759cb39264814d76ebfe555ed097621229e1dc12e52e8caf4f883e55ae32e48d3fb11d8ef4f7cb2442d1bc0467927a3cd4d34dc256bf80cfb97bfcc66c066ef970a8bbf424e0e283fc08e09b4f6adf07b559f03f418fac9ac83d2bf93415e7681df9421ab8e44fad0b307a5727f91f1bd4f99a5e4d699224aab160554e07910543a008a7d9dd1197fe2ec078299f870e26b49685a197070e64df1ea6be0caea229fd295d439e14ffc52fd266e1da9b3dc7c27db54c399d460bcd36b06504", + "range_proof_data_hex": "8a40eb25361d9883251eaab8d343a26a94d7feff70a2e463f52822c60e5458427a62759afa5ac501e10e0c4a475d08e010fb45c39097607ae68676d5273fa55e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000000604c5db092d0b237c4eb8963609bd44147b2a06c81caa24f6ed57b3b8ea80071e06942136330cbbd3b375f4b79fb189afbb6b4d0e01bad216fcfb7c7707c87026929f4ecb3977e6a1ac308243c7fff330e51fd062e045ad5a93c5f15552ac68d21ce969a99a57886986b1ec871b5f66b1b97bd7dab9c409e896cd60dc7bbe3d60a33b997bc5483fa8795455252eb13bfd0dd2ca672aa0f06d6f50b4cd7d6501d7046d3d352b8c6ad0e7ee0a49c3dddeb9bb48c0030b5b3a4dfeeb7db4469002851ff0d80bf930e96691047ebbad2aa70a166c525406962961e47fbcd447530b8ef32c640acd7769af7622c1d1f1da52ac53772d3317395722d0ff0dbad1d43a84b5df1106e15fe0b210d0dcef937a4438495c5dcf0ffb8597599173c5b16f4a84ba3e115cfc3428fb476791b15c6841bd9cf8eee9cc77ab5a6e0362a646500260edc247a337b167ed96ed5467fc10b4fbfa77c2d016ef403a916c35bb8a7c6f4cd62f17066f02ec19805bf879605b8f7f63b7d1f6ad1fe6961313e7fa874c57be8dc4a4067e5a1280e10755b7c6ac5254d9e87e66735fe8c50f2e02c78ac35dc424676ccd6c1279d9fef32d1d511fbf4d11a1b3384b054242e236f78137590eb09f4abbeadf86af15a759d2e8c5d49e6e2823db5108b0edda13146d5dcddc5eaa48116a865c7158f159502239fc90003683aa89e24218011796e367d8d82d5c78e22de0c4464f691c2073c9b4e3eec5f9122f1c255bcb1843a6dba9e215cb76ee721d8d9da39b334eae1d70482015ed45c444209249a328aeea682bc83c1b5c8e0768913e8ae7646c3eca1830fbeb11c3621ce8b039969718ab44d92c94326b4e17511fcb7cfc490f6370e73fe1e02d38f3540aca094c1a707a0b1ee63e8f75c88bdba133eab1152af40cc7360f1c97b834d28acb623dc48c5c0d01d36ea87a45dc175317189f88b8cadcb381cd0d9b63bc815bd3f604fb820c7573046b450735f42a295dcaf60bf75e25e4399f80cf314e0940644342199dc391f44fc8d90a", + "validity_proof_data_hex": "269b2044cea025efee559e615a04a71461ce2112778ecd73e0d41b74d3a6111aaaccc8b2f111925812d3c79c9eff877635229ef0e4e1fb65e11f390bc7b2e8657a62759afa5ac501e10e0c4a475d08e010fb45c39097607ae68676d5273fa55efe65d46227443b60e7707ce71c7b517e701c09b5c1255d4635a7496da10e491aec4158115677736a13fa277096e612e58aff6e4789a0b170d45eaf784c7eb240ecbd90bb3d4d348b342e192d42205093e80260a35fa7739b53a32c7c14a88166584954c8c25f09852876b0287f9fea8a21ce3f781ea2f0346099735f1b9edc38e4d162e6019028707b972af9d19905105d1a9ec641c1e1fce1ee7d41b2122c34322cb338f8db70d70c8a26a75d36cdad3a9b432ac83a5448dab6ec54af24be01a8e1760cb0baed7caaa509a397bf62b1600d431440db2a0d3440894a878fdb10589b3905858d73e334b8fd9d8165e9ec0b48099fa230895c259bf8fd1ca5982b27b66b5a6efb186fab29e3bd50cfaa71c9a3d4d659ee009a46bd371827edf60002d971fa1630b244d375e5d22fbf9804404672d30afd2ade803d3d2678b21d0a" }, "binding": { - "current_balance_commitment_hex": "940a324c1ff4615d4be14d88ac335ef719514d1a8c91c8c3c6a1f045c7dc0f74", - "current_balance_handle_hex": "820372a0afcb50f1dbdbb6d364662a3df7d13e348729b5ca687cbb616a68b454", - "recipient_pubkey_hex": "ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268", - "sender_pubkey_hex": "aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245" + "current_balance_commitment_hex": "609ed4b29e729e1e338ecf875bb622d41a5c8fcd15557051644c2d635d331078", + "current_balance_handle_hex": "7e88f78976dde50693468ed87d354d654f0cc9005258bf0e991c0b1763e32e38", + "recipient_pubkey_hex": "aaccc8b2f111925812d3c79c9eff877635229ef0e4e1fb65e11f390bc7b2e865", + "sender_pubkey_hex": "269b2044cea025efee559e615a04a71461ce2112778ecd73e0d41b74d3a6111a" }, "mutations": [ { @@ -1750,7 +1750,7 @@ "op": "bitflip", "target": "binding.sender_pubkey_hex", "params": { - "value_hex": "afec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245" + "value_hex": "279b2044cea025efee559e615a04a71461ce2112778ecd73e0d41b74d3a6111a" }, "expected_valid": false, "expected_error_contains": "failed" @@ -1760,7 +1760,7 @@ "op": "bitflip", "target": "binding.recipient_pubkey_hex", "params": { - "value_hex": "ebd02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268" + "value_hex": "abccc8b2f111925812d3c79c9eff877635229ef0e4e1fb65e11f390bc7b2e865" }, "expected_valid": false, "expected_error_contains": "failed" @@ -1780,7 +1780,7 @@ "op": "truncate", "target": "payload.range_proof_data_hex", "params": { - "value_hex": "9c4dac62b85ac8b0ee5c9678be078d0629fc257af7a0cf3d466f244b5a0cf659e4027c0694a6d1c9413fbf3f8d187dec4a85e0ebb06c0f5cc1d7d47373181c5600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000002636ab98020d46b3c41991b8ed299c779494605b4ebf31d532727f8a96e7696856231d1219a3f7d05c36332a51089ce346cd282951f2b53baf570d5109445334c42774a3c0513e24527f7d7c288d784d613ae0cc437cd4d685b73910ceede8476682dc5a19a3bbbc2c875d8ed97eb9a67d6204fb7ef952b5db07020c3582a53237d07187471a4a9b20c31005a8d8d499e1e06d199b7b8f2cb8d88b13c4abfa06355aad25dd7a82337734cb624244163a84a78eba1ce4ff42faa75ea53e3ae10dfa1af68680cf521b19eaaac95ba8bd8f744e06df1c9c3f79b82dfed9d402730df6f5e6c1d0f4820e3356c5da0587fbdc9c725b4eaa44e0e0ed9f1ae9e7d4f574128a1828619041d2d37de4a8fe0bc4bd398c18d02a34973eb139eb31eee38543029b01567a4eebbe293faf27723e570fed67f3ffb534d51280c401f951d67d55868a4cdb242d863c2e7b57eac83f84f29e669e0c4e618e6304a894e62d46097362d9caa2ca183f815dec8eac54033c810263f562dea69f8d9014bfbdbe8ec0063e99bc501684dfd1607ff39586127992dfa3aebc7de509d31e928c9afe9d195bce060fdd363edf0c8d8ede136c0f10d310bf7048de536c6ffc225f3d17281155f2466ef277ea28cc564d723b72e3e9dd26683ae6d9367a6f7796031c1f84240e501bcf3aa6775055141c46875c84d41cbb06162ba9d26b05e985cb2ebfd7ec27a2f018f3dfa34ffabf8d86356587b178c71c13a8e211809abacd5f0bb25b145fa4b8fdc72b93351ff3cf6fad7f9b2b3056bb1741098174e892b51f85fb8cf32d00ebf1b7b5cff1a5b9024be4cca3fe8323f0218e225f1fff8d922d0202b7ec63ce6eb3eb91d8266e3bb92bf073631aa1ae07f2229953bc86f768bf2da813f1603c42f257f821f5716cd0c655d52c08a7cae67ea8c180e0b8a26faeeaae2fb942e807f9fdeabf97dfe6ad9972446961dc18b98d357f5e5572db4ed528b5abe0047cd3c722cf7ed7f050da485350666e3b3aef4a559e0a285bd33adf892406" + "value_hex": "8a40eb25361d9883251eaab8d343a26a94d7feff70a2e463f52822c60e5458427a62759afa5ac501e10e0c4a475d08e010fb45c39097607ae68676d5273fa55e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040400000000000000604c5db092d0b237c4eb8963609bd44147b2a06c81caa24f6ed57b3b8ea80071e06942136330cbbd3b375f4b79fb189afbb6b4d0e01bad216fcfb7c7707c87026929f4ecb3977e6a1ac308243c7fff330e51fd062e045ad5a93c5f15552ac68d21ce969a99a57886986b1ec871b5f66b1b97bd7dab9c409e896cd60dc7bbe3d60a33b997bc5483fa8795455252eb13bfd0dd2ca672aa0f06d6f50b4cd7d6501d7046d3d352b8c6ad0e7ee0a49c3dddeb9bb48c0030b5b3a4dfeeb7db4469002851ff0d80bf930e96691047ebbad2aa70a166c525406962961e47fbcd447530b8ef32c640acd7769af7622c1d1f1da52ac53772d3317395722d0ff0dbad1d43a84b5df1106e15fe0b210d0dcef937a4438495c5dcf0ffb8597599173c5b16f4a84ba3e115cfc3428fb476791b15c6841bd9cf8eee9cc77ab5a6e0362a646500260edc247a337b167ed96ed5467fc10b4fbfa77c2d016ef403a916c35bb8a7c6f4cd62f17066f02ec19805bf879605b8f7f63b7d1f6ad1fe6961313e7fa874c57be8dc4a4067e5a1280e10755b7c6ac5254d9e87e66735fe8c50f2e02c78ac35dc424676ccd6c1279d9fef32d1d511fbf4d11a1b3384b054242e236f78137590eb09f4abbeadf86af15a759d2e8c5d49e6e2823db5108b0edda13146d5dcddc5eaa48116a865c7158f159502239fc90003683aa89e24218011796e367d8d82d5c78e22de0c4464f691c2073c9b4e3eec5f9122f1c255bcb1843a6dba9e215cb76ee721d8d9da39b334eae1d70482015ed45c444209249a328aeea682bc83c1b5c8e0768913e8ae7646c3eca1830fbeb11c3621ce8b039969718ab44d92c94326b4e17511fcb7cfc490f6370e73fe1e02d38f3540aca094c1a707a0b1ee63e8f75c88bdba133eab1152af40cc7360f1c97b834d28acb623dc48c5c0d01d36ea87a45dc175317189f88b8cadcb381cd0d9b63bc815bd3f604fb820c7573046b450735f42a295dcaf60bf75e25e4399f80cf314e0940644342199dc391f44fc8" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -1792,7 +1792,7 @@ "family": "equality", "expected_valid": true, "payload": { - "proof_data_hex": "ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268de4c3d91066bdd05ab31d6a139d6b002005efc0d55a70c5393b9faf7381053212eafff6b28c62f72126419f08dd316bb428b1c00c8f7ab9650f089ac72f3ad32dcf2d46ae964b49ba3e3db3f8b6470e7f8353e09fc45f279b4935a8eabb30b3d006ad1b0d780388c8ea4a5eeb34818be5691939fc4ae0092463fe0676bfb0b1dd872ba0af3cb19ec24071a4f2f0c3f3dd98e4019156b4855156f4be14d1a735c546f929613a02d8980d27d8db1062cd737a915c59a6573eb1463da6a4d3ee745e34157f96332af5aff9c6a383c438c48fc9986ca37ede30fb33c378a670bcc0085b4f5144d663c5ffac0afba1d4c3e4eb13f8230682ac14f28869fb8dcc22e01673982910c30ca1e2a8bdf237560a877c12a6419d407ab9466e15fb5e179c70b" + "proof_data_hex": "aaccc8b2f111925812d3c79c9eff877635229ef0e4e1fb65e11f390bc7b2e86532fed596e2a25744ad4cc293817214fb7c30b0137285b9de4310610d6ad5e44b1af40ac6dab8a173bcffab31972fd0a34c901621cf150500a5321e90a427ce54f41e319abdeaaae207f31b53703f67d8aa0f9d69ec81dbdc2545ae48da9d164a3e005ff7dc3f0e571f330a1b3e5f482f732802584e922162e09e63af33f28b53069723b6814b01b506677644e3fa83079f3be0b2c8ad571aa5adee0f4926ab6694c7ff82e101bc3a828840e7d39b57bc4bc1f2c191e4277c494ba27cef1ed600893b039ec135e238ce1f5af2287a9132ba38ce11a28a4949a2e0e96fcd226d034712617f4177c7c51f58f7ade802e03cf9f1c67ff6c2a963823c191937eb71052363dc86c028ca0cfc88738c8bd8bb64418452e68c3d157b368551b12644570f" }, "mutations": [ { @@ -1800,7 +1800,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "ebd02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268de4c3d91066bdd05ab31d6a139d6b002005efc0d55a70c5393b9faf7381053212eafff6b28c62f72126419f08dd316bb428b1c00c8f7ab9650f089ac72f3ad32dcf2d46ae964b49ba3e3db3f8b6470e7f8353e09fc45f279b4935a8eabb30b3d006ad1b0d780388c8ea4a5eeb34818be5691939fc4ae0092463fe0676bfb0b1dd872ba0af3cb19ec24071a4f2f0c3f3dd98e4019156b4855156f4be14d1a735c546f929613a02d8980d27d8db1062cd737a915c59a6573eb1463da6a4d3ee745e34157f96332af5aff9c6a383c438c48fc9986ca37ede30fb33c378a670bcc0085b4f5144d663c5ffac0afba1d4c3e4eb13f8230682ac14f28869fb8dcc22e01673982910c30ca1e2a8bdf237560a877c12a6419d407ab9466e15fb5e179c70b" + "value_hex": "abccc8b2f111925812d3c79c9eff877635229ef0e4e1fb65e11f390bc7b2e86532fed596e2a25744ad4cc293817214fb7c30b0137285b9de4310610d6ad5e44b1af40ac6dab8a173bcffab31972fd0a34c901621cf150500a5321e90a427ce54f41e319abdeaaae207f31b53703f67d8aa0f9d69ec81dbdc2545ae48da9d164a3e005ff7dc3f0e571f330a1b3e5f482f732802584e922162e09e63af33f28b53069723b6814b01b506677644e3fa83079f3be0b2c8ad571aa5adee0f4926ab6694c7ff82e101bc3a828840e7d39b57bc4bc1f2c191e4277c494ba27cef1ed600893b039ec135e238ce1f5af2287a9132ba38ce11a28a4949a2e0e96fcd226d034712617f4177c7c51f58f7ade802e03cf9f1c67ff6c2a963823c191937eb71052363dc86c028ca0cfc88738c8bd8bb64418452e68c3d157b368551b12644570f" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -1810,7 +1810,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268de4c3d91066bdd05ab31d6a139d6b002005efc0d55a70c5393b9faf7381053212eafff6b28c62f72126419f08dd316bb428b1c00c8f7ab9650f089ac72f3ad32dcf2d46ae964b49ba3e3db3f8b6470e7f8353e09fc45f279b4935a8eabb30b3d006ad1b0d780388c8ea4a5eeb34818be5691939fc4ae0092463fe0676bfb0b1dd872ba0af3cb19ec24071a4f2f0c3f3dd98e4019156b4855156f4be14d1a735c546f929613a02d8980d27d8db1062cd737a915c59a6573eb1463da6a4d3ee745e34157f96332af5aff9c6a383c438c48fc9986ca37ede30fb33c378a670bcc0085b4f5144d663c5ffac0afba1d4c3e4eb13f8230682ac14f28869fb8dcc22e01673982910c30ca1e2a8bdf237560a877c12a6419d407ab9466e15fb5e179" + "value_hex": "aaccc8b2f111925812d3c79c9eff877635229ef0e4e1fb65e11f390bc7b2e86532fed596e2a25744ad4cc293817214fb7c30b0137285b9de4310610d6ad5e44b1af40ac6dab8a173bcffab31972fd0a34c901621cf150500a5321e90a427ce54f41e319abdeaaae207f31b53703f67d8aa0f9d69ec81dbdc2545ae48da9d164a3e005ff7dc3f0e571f330a1b3e5f482f732802584e922162e09e63af33f28b53069723b6814b01b506677644e3fa83079f3be0b2c8ad571aa5adee0f4926ab6694c7ff82e101bc3a828840e7d39b57bc4bc1f2c191e4277c494ba27cef1ed600893b039ec135e238ce1f5af2287a9132ba38ce11a28a4949a2e0e96fcd226d034712617f4177c7c51f58f7ade802e03cf9f1c67ff6c2a963823c191937eb71052363dc86c028ca0cfc88738c8bd8bb64418452e68c3d157b368551b12644" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -1832,7 +1832,7 @@ "family": "validity", "expected_valid": true, "payload": { - "proof_data_hex": "ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d2685e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b7471604546ee3084fb1cef0aa9798ddcef4694bac9091adf5eda3b0345df7d0dc68237cff9e617f3bb3ed7438f41157147fa42ee952b4969f4041a578264124b3ce1d340532dbd4c3adca7406f7802931bffec088921469404341b2f0be89420463a818b1b7c56ae0ad2f4a77c05b5c9cbf43be703f6b577b184e1ee5ccd5925983c8b9dbd222aaa8920b6ba22996d6c14aeab4f30a6005368e1ef6cc0ed3a718e2ba227b1c02b5d0a4b249bf21664d9e92e9a8a6222933a9ee629d2c0d6c110188332a15c29fcf21f666ff96566f21c43b6e3c9334709e666e1951515317801c4ab1c0d184bd22d70b5111993a9fa1e131978e5af49b65ffcc4b6bb0dd7c04f88704f81171cba1f4433f9a8c5024be7f0b272aa2af0552fa2dd726dcc1fbc101ffd760a403c13886c618b9ac8e3cdb73a6e1883038363634054dba8e7b0a30bf63844abacf3e2b80d8ea0cae99aa171b88f02d4be534886df9e1f62ca86f60e" + "proof_data_hex": "aaccc8b2f111925812d3c79c9eff877635229ef0e4e1fb65e11f390bc7b2e865d4508ad57e19936d09a2584f4b537b138dad4ae24fd0274a25fa67f16cff945ba09e497ff72886e4c6827594c5ec93ac44837a62fe445ff01b225668835b946c40b1fe71cf74c27f87ae58b98487a8b1134dc0b049b117a119692bb9e821e438ba37cc9705598ded4ad6060e7418ed1a63430c299c2e7b61cb0d42b3d7079d3c0eaf5a3a5b1a18d03183f71c1e146699257d0a7d544a089accb49a8592a78d5fc07e867b29ca7c0cf7cd1e862e81fe595f3aa3321ee01c40f44cdd5900e7b0691cee22dd8b2c48be1b468a4febace3498acc7e3597e6f9eb394fe1e5219dcf05fcab7561fef3c959468847ef703ba4de8696a1909d0197f8fd79448cc0075065ec341618b426dc59e436585491300c172c37343d0c2f38c346fdd227b3f7d678347162edd3247db63dfdb4dd6ef099621c24fb07de039b2225867f11ac3dd4700f93a074e6f1944df0e0cfc2229e0e47ae8a6d22eecece8ff0ef055d406886085ce3e21a65426b0b54b84ffd5ec15a84a878191da1a7c80e4c46e2522ecf5806" }, "mutations": [ { @@ -1840,7 +1840,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "ebd02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d2685e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b7471604546ee3084fb1cef0aa9798ddcef4694bac9091adf5eda3b0345df7d0dc68237cff9e617f3bb3ed7438f41157147fa42ee952b4969f4041a578264124b3ce1d340532dbd4c3adca7406f7802931bffec088921469404341b2f0be89420463a818b1b7c56ae0ad2f4a77c05b5c9cbf43be703f6b577b184e1ee5ccd5925983c8b9dbd222aaa8920b6ba22996d6c14aeab4f30a6005368e1ef6cc0ed3a718e2ba227b1c02b5d0a4b249bf21664d9e92e9a8a6222933a9ee629d2c0d6c110188332a15c29fcf21f666ff96566f21c43b6e3c9334709e666e1951515317801c4ab1c0d184bd22d70b5111993a9fa1e131978e5af49b65ffcc4b6bb0dd7c04f88704f81171cba1f4433f9a8c5024be7f0b272aa2af0552fa2dd726dcc1fbc101ffd760a403c13886c618b9ac8e3cdb73a6e1883038363634054dba8e7b0a30bf63844abacf3e2b80d8ea0cae99aa171b88f02d4be534886df9e1f62ca86f60e" + "value_hex": "abccc8b2f111925812d3c79c9eff877635229ef0e4e1fb65e11f390bc7b2e865d4508ad57e19936d09a2584f4b537b138dad4ae24fd0274a25fa67f16cff945ba09e497ff72886e4c6827594c5ec93ac44837a62fe445ff01b225668835b946c40b1fe71cf74c27f87ae58b98487a8b1134dc0b049b117a119692bb9e821e438ba37cc9705598ded4ad6060e7418ed1a63430c299c2e7b61cb0d42b3d7079d3c0eaf5a3a5b1a18d03183f71c1e146699257d0a7d544a089accb49a8592a78d5fc07e867b29ca7c0cf7cd1e862e81fe595f3aa3321ee01c40f44cdd5900e7b0691cee22dd8b2c48be1b468a4febace3498acc7e3597e6f9eb394fe1e5219dcf05fcab7561fef3c959468847ef703ba4de8696a1909d0197f8fd79448cc0075065ec341618b426dc59e436585491300c172c37343d0c2f38c346fdd227b3f7d678347162edd3247db63dfdb4dd6ef099621c24fb07de039b2225867f11ac3dd4700f93a074e6f1944df0e0cfc2229e0e47ae8a6d22eecece8ff0ef055d406886085ce3e21a65426b0b54b84ffd5ec15a84a878191da1a7c80e4c46e2522ecf5806" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -1850,7 +1850,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d2685e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b7471604546ee3084fb1cef0aa9798ddcef4694bac9091adf5eda3b0345df7d0dc68237cff9e617f3bb3ed7438f41157147fa42ee952b4969f4041a578264124b3ce1d340532dbd4c3adca7406f7802931bffec088921469404341b2f0be89420463a818b1b7c56ae0ad2f4a77c05b5c9cbf43be703f6b577b184e1ee5ccd5925983c8b9dbd222aaa8920b6ba22996d6c14aeab4f30a6005368e1ef6cc0ed3a718e2ba227b1c02b5d0a4b249bf21664d9e92e9a8a6222933a9ee629d2c0d6c110188332a15c29fcf21f666ff96566f21c43b6e3c9334709e666e1951515317801c4ab1c0d184bd22d70b5111993a9fa1e131978e5af49b65ffcc4b6bb0dd7c04f88704f81171cba1f4433f9a8c5024be7f0b272aa2af0552fa2dd726dcc1fbc101ffd760a403c13886c618b9ac8e3cdb73a6e1883038363634054dba8e7b0a30bf63844abacf3e2b80d8ea0cae99aa171b88f02d4be534886df9e1f62ca86" + "value_hex": "aaccc8b2f111925812d3c79c9eff877635229ef0e4e1fb65e11f390bc7b2e865d4508ad57e19936d09a2584f4b537b138dad4ae24fd0274a25fa67f16cff945ba09e497ff72886e4c6827594c5ec93ac44837a62fe445ff01b225668835b946c40b1fe71cf74c27f87ae58b98487a8b1134dc0b049b117a119692bb9e821e438ba37cc9705598ded4ad6060e7418ed1a63430c299c2e7b61cb0d42b3d7079d3c0eaf5a3a5b1a18d03183f71c1e146699257d0a7d544a089accb49a8592a78d5fc07e867b29ca7c0cf7cd1e862e81fe595f3aa3321ee01c40f44cdd5900e7b0691cee22dd8b2c48be1b468a4febace3498acc7e3597e6f9eb394fe1e5219dcf05fcab7561fef3c959468847ef703ba4de8696a1909d0197f8fd79448cc0075065ec341618b426dc59e436585491300c172c37343d0c2f38c346fdd227b3f7d678347162edd3247db63dfdb4dd6ef099621c24fb07de039b2225867f11ac3dd4700f93a074e6f1944df0e0cfc2229e0e47ae8a6d22eecece8ff0ef055d406886085ce3e21a65426b0b54b84ffd5ec15a84a878191da1a7c80e4c46e2522ecf" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -1872,7 +1872,7 @@ "family": "transfer_range", "expected_valid": true, "payload": { - "proof_data_hex": "dcf2d46ae964b49ba3e3db3f8b6470e7f8353e09fc45f279b4935a8eabb30b3d7471604546ee3084fb1cef0aa9798ddcef4694bac9091adf5eda3b0345df7d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000bce867cc3281fe0ede7d916e12905939edf93bd500f925a6d0f46e8c03c0de1288935a3c1760f8f36f1f1535aabeb04990616f3f850bd6c1d97756b3fcbcf961f4d8bf3901100187d2e05408fa5a579d657889ce2dd0be06ce18fe39170e3c3dc26d9a67892b5d49116c7906aa1de14bf6642fe7a078020f0cf3a5c6a186913e29803cf7a4a6c7439cf562ddbaaa65d4f61ba5d11a859f519371ce803c47f10dca269fc8e02d9f63b0d6753e0cfe9b49affdb261bd7fe1239b6fba7dbcdcdd07e6575da355f45bb5eab7668b579427128221c4ae3204b9a0c6f9cfc201f90f0baafaf7424f8423fa28102aa2d3ed06fe93e5d5b39cefdad9e9ceaa8418dc6f65e2cd38ab2c1884ce463d5f435c4f0654ded22509161af882f0dc83187e12dd0b22b5447d2b79cd349c56d1846ffecee4f0d94a91cc8ecbf96d858a4795bb201e46c60e9e4b68125a1eeb6908e16af3d08aa50b08942856e5557924534f7bd2639cdb14b907a7598403001ebfa8bb4c79d6e2465ddcfe0c210a5965cd25632670200a7e2206f9c849d0ce9b254bd9dcecbcc086db2fc099c5eb2ef41b02e92c694a7c8f2bfffb5c670ca475e88b5b8c657dfc9b63aa75f6c1b11b3b5a300ace66a0d90b3d70c6845f9e4b21f82f17e0dfab46f79f58e7ee6405175f910321be3046e1034b225b7c1be378204057d8335a6ebbd396116af8297aeadc460bcada72c84ed1ca22ccb7d84d99193ef323d289f777b274287ca5c033bb9b6e7f700467ba8bf3233c3013c5096cbf22ec14f55a1eb214c740f06f711b6786e08a7d931e8c219e8d21d8cf6204e0e6f233460fdddf4647b72a4375f374f8c40133d1002836c757723ec7f9aa3945e7173aa5adac5a6169c65698c59d276734315d9d7246e2ad1032b5a73d4f292041c45b27b1a52ae909a8ae89128c536288eb7289ef68188e411b133da664dbd545bb39180291ef5ffffa7633545335e021a76911270e827e0031c39f9a54d1ce5f84e350fe50d4be9352f63546ec62600c6c8e014b06" + "proof_data_hex": "f41e319abdeaaae207f31b53703f67d8aa0f9d69ec81dbdc2545ae48da9d164aa09e497ff72886e4c6827594c5ec93ac44837a62fe445ff01b225668835b946c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000cc864185c22119f144442b7ebb03355b47601704f13e81759ae9dfb73de5412b9e256fe3fef2930ef90f91e5e731235c80f059843aaeed4215bbdb1e20c47f44862dd2ce864c8ecf9ed831aae5ba4daedfe47de09e9f60bd13c6cf37d457875fb26ff4fb6ad244a24c51bc5fb5d1d96d2da3ff81a49e7897a3e7f336c5f31a4618b9031e8721528fdc8e032e89db8b74c39d2381c1ab91ebc3c665e73251f9017028e395807a9cb359365edcf4015f8f739603ef181d540e3b4b81955553b9030400e89d8cf64413a6ff7ea09a0a0e8c120f4f75d718ad4df1adbd7e3d3a3305e0598c18aef7243258bf831bffc3a2c180dfa824f64a8aaa409a11e656bd7e6078e7d6c079be52006a0c34a496d7ba0d9296607cbbcc8a961bd825f9505e241f926f3d225d6252b9b594a9370ccc73a514f5b711d8d573a8b34090acd9ac4a775aa7144deedd9d6ade1b7e0146dd2d4aa746d151517333b5ed2ff337839cd8507a6ce7c950b74a273730f2b79040249959faf816da5ca34f11071678eadf3d05cc13f8e883b5aad7d148eb8d69d5a21045c88d99642588108099b8345b0e9e7af8ed7d8bc73afca6cbc8fc93cb61d6c42b218da04755439afa9ba1d7c47adf04f08b3b6c678fe7e48efd74a169cc726011126df869be8ac403208a9ba19ac90e38410f79f62910e0f7a967aeb0c755f6be9085b95fe6b864cfc2b6d6f64e177b18a21e1b5518074b8d76d0fadbd4e1143b85bf9c925bee2410f4c4ff753f0e2e546bebc1320c2f03e8e52a28d7f5021ddccb2772a82b48947233961c92d3b34e38279db14c53defdb596cc9fb93c7f8c28640790ccedc5a7c47033a2ae22f01322a17223ca6874374509d41143ea62473e56dad132ccf880750f484b5c08eb5f443830da4eff11d586623df4247a1a77f7ec0a4d73e071db1b7501cb292f794e0bd67580739d64cc0208f5f326f7999901c1bbf1667e27682bd80b5b7654890325afa2cb28e069677ebc69b37ea9a1fb48f8253055c1b1b1ef699fd33fdbba00" }, "mutations": [ { @@ -1880,7 +1880,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "ddf2d46ae964b49ba3e3db3f8b6470e7f8353e09fc45f279b4935a8eabb30b3d7471604546ee3084fb1cef0aa9798ddcef4694bac9091adf5eda3b0345df7d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000bce867cc3281fe0ede7d916e12905939edf93bd500f925a6d0f46e8c03c0de1288935a3c1760f8f36f1f1535aabeb04990616f3f850bd6c1d97756b3fcbcf961f4d8bf3901100187d2e05408fa5a579d657889ce2dd0be06ce18fe39170e3c3dc26d9a67892b5d49116c7906aa1de14bf6642fe7a078020f0cf3a5c6a186913e29803cf7a4a6c7439cf562ddbaaa65d4f61ba5d11a859f519371ce803c47f10dca269fc8e02d9f63b0d6753e0cfe9b49affdb261bd7fe1239b6fba7dbcdcdd07e6575da355f45bb5eab7668b579427128221c4ae3204b9a0c6f9cfc201f90f0baafaf7424f8423fa28102aa2d3ed06fe93e5d5b39cefdad9e9ceaa8418dc6f65e2cd38ab2c1884ce463d5f435c4f0654ded22509161af882f0dc83187e12dd0b22b5447d2b79cd349c56d1846ffecee4f0d94a91cc8ecbf96d858a4795bb201e46c60e9e4b68125a1eeb6908e16af3d08aa50b08942856e5557924534f7bd2639cdb14b907a7598403001ebfa8bb4c79d6e2465ddcfe0c210a5965cd25632670200a7e2206f9c849d0ce9b254bd9dcecbcc086db2fc099c5eb2ef41b02e92c694a7c8f2bfffb5c670ca475e88b5b8c657dfc9b63aa75f6c1b11b3b5a300ace66a0d90b3d70c6845f9e4b21f82f17e0dfab46f79f58e7ee6405175f910321be3046e1034b225b7c1be378204057d8335a6ebbd396116af8297aeadc460bcada72c84ed1ca22ccb7d84d99193ef323d289f777b274287ca5c033bb9b6e7f700467ba8bf3233c3013c5096cbf22ec14f55a1eb214c740f06f711b6786e08a7d931e8c219e8d21d8cf6204e0e6f233460fdddf4647b72a4375f374f8c40133d1002836c757723ec7f9aa3945e7173aa5adac5a6169c65698c59d276734315d9d7246e2ad1032b5a73d4f292041c45b27b1a52ae909a8ae89128c536288eb7289ef68188e411b133da664dbd545bb39180291ef5ffffa7633545335e021a76911270e827e0031c39f9a54d1ce5f84e350fe50d4be9352f63546ec62600c6c8e014b06" + "value_hex": "f51e319abdeaaae207f31b53703f67d8aa0f9d69ec81dbdc2545ae48da9d164aa09e497ff72886e4c6827594c5ec93ac44837a62fe445ff01b225668835b946c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000cc864185c22119f144442b7ebb03355b47601704f13e81759ae9dfb73de5412b9e256fe3fef2930ef90f91e5e731235c80f059843aaeed4215bbdb1e20c47f44862dd2ce864c8ecf9ed831aae5ba4daedfe47de09e9f60bd13c6cf37d457875fb26ff4fb6ad244a24c51bc5fb5d1d96d2da3ff81a49e7897a3e7f336c5f31a4618b9031e8721528fdc8e032e89db8b74c39d2381c1ab91ebc3c665e73251f9017028e395807a9cb359365edcf4015f8f739603ef181d540e3b4b81955553b9030400e89d8cf64413a6ff7ea09a0a0e8c120f4f75d718ad4df1adbd7e3d3a3305e0598c18aef7243258bf831bffc3a2c180dfa824f64a8aaa409a11e656bd7e6078e7d6c079be52006a0c34a496d7ba0d9296607cbbcc8a961bd825f9505e241f926f3d225d6252b9b594a9370ccc73a514f5b711d8d573a8b34090acd9ac4a775aa7144deedd9d6ade1b7e0146dd2d4aa746d151517333b5ed2ff337839cd8507a6ce7c950b74a273730f2b79040249959faf816da5ca34f11071678eadf3d05cc13f8e883b5aad7d148eb8d69d5a21045c88d99642588108099b8345b0e9e7af8ed7d8bc73afca6cbc8fc93cb61d6c42b218da04755439afa9ba1d7c47adf04f08b3b6c678fe7e48efd74a169cc726011126df869be8ac403208a9ba19ac90e38410f79f62910e0f7a967aeb0c755f6be9085b95fe6b864cfc2b6d6f64e177b18a21e1b5518074b8d76d0fadbd4e1143b85bf9c925bee2410f4c4ff753f0e2e546bebc1320c2f03e8e52a28d7f5021ddccb2772a82b48947233961c92d3b34e38279db14c53defdb596cc9fb93c7f8c28640790ccedc5a7c47033a2ae22f01322a17223ca6874374509d41143ea62473e56dad132ccf880750f484b5c08eb5f443830da4eff11d586623df4247a1a77f7ec0a4d73e071db1b7501cb292f794e0bd67580739d64cc0208f5f326f7999901c1bbf1667e27682bd80b5b7654890325afa2cb28e069677ebc69b37ea9a1fb48f8253055c1b1b1ef699fd33fdbba00" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -1890,7 +1890,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "dcf2d46ae964b49ba3e3db3f8b6470e7f8353e09fc45f279b4935a8eabb30b3d7471604546ee3084fb1cef0aa9798ddcef4694bac9091adf5eda3b0345df7d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000bce867cc3281fe0ede7d916e12905939edf93bd500f925a6d0f46e8c03c0de1288935a3c1760f8f36f1f1535aabeb04990616f3f850bd6c1d97756b3fcbcf961f4d8bf3901100187d2e05408fa5a579d657889ce2dd0be06ce18fe39170e3c3dc26d9a67892b5d49116c7906aa1de14bf6642fe7a078020f0cf3a5c6a186913e29803cf7a4a6c7439cf562ddbaaa65d4f61ba5d11a859f519371ce803c47f10dca269fc8e02d9f63b0d6753e0cfe9b49affdb261bd7fe1239b6fba7dbcdcdd07e6575da355f45bb5eab7668b579427128221c4ae3204b9a0c6f9cfc201f90f0baafaf7424f8423fa28102aa2d3ed06fe93e5d5b39cefdad9e9ceaa8418dc6f65e2cd38ab2c1884ce463d5f435c4f0654ded22509161af882f0dc83187e12dd0b22b5447d2b79cd349c56d1846ffecee4f0d94a91cc8ecbf96d858a4795bb201e46c60e9e4b68125a1eeb6908e16af3d08aa50b08942856e5557924534f7bd2639cdb14b907a7598403001ebfa8bb4c79d6e2465ddcfe0c210a5965cd25632670200a7e2206f9c849d0ce9b254bd9dcecbcc086db2fc099c5eb2ef41b02e92c694a7c8f2bfffb5c670ca475e88b5b8c657dfc9b63aa75f6c1b11b3b5a300ace66a0d90b3d70c6845f9e4b21f82f17e0dfab46f79f58e7ee6405175f910321be3046e1034b225b7c1be378204057d8335a6ebbd396116af8297aeadc460bcada72c84ed1ca22ccb7d84d99193ef323d289f777b274287ca5c033bb9b6e7f700467ba8bf3233c3013c5096cbf22ec14f55a1eb214c740f06f711b6786e08a7d931e8c219e8d21d8cf6204e0e6f233460fdddf4647b72a4375f374f8c40133d1002836c757723ec7f9aa3945e7173aa5adac5a6169c65698c59d276734315d9d7246e2ad1032b5a73d4f292041c45b27b1a52ae909a8ae89128c536288eb7289ef68188e411b133da664dbd545bb39180291ef5ffffa7633545335e021a76911270e827e0031c39f9a54d1ce5f84e350fe50d4be9352f63546ec62600c6c8e01" + "value_hex": "f41e319abdeaaae207f31b53703f67d8aa0f9d69ec81dbdc2545ae48da9d164aa09e497ff72886e4c6827594c5ec93ac44837a62fe445ff01b225668835b946c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000cc864185c22119f144442b7ebb03355b47601704f13e81759ae9dfb73de5412b9e256fe3fef2930ef90f91e5e731235c80f059843aaeed4215bbdb1e20c47f44862dd2ce864c8ecf9ed831aae5ba4daedfe47de09e9f60bd13c6cf37d457875fb26ff4fb6ad244a24c51bc5fb5d1d96d2da3ff81a49e7897a3e7f336c5f31a4618b9031e8721528fdc8e032e89db8b74c39d2381c1ab91ebc3c665e73251f9017028e395807a9cb359365edcf4015f8f739603ef181d540e3b4b81955553b9030400e89d8cf64413a6ff7ea09a0a0e8c120f4f75d718ad4df1adbd7e3d3a3305e0598c18aef7243258bf831bffc3a2c180dfa824f64a8aaa409a11e656bd7e6078e7d6c079be52006a0c34a496d7ba0d9296607cbbcc8a961bd825f9505e241f926f3d225d6252b9b594a9370ccc73a514f5b711d8d573a8b34090acd9ac4a775aa7144deedd9d6ade1b7e0146dd2d4aa746d151517333b5ed2ff337839cd8507a6ce7c950b74a273730f2b79040249959faf816da5ca34f11071678eadf3d05cc13f8e883b5aad7d148eb8d69d5a21045c88d99642588108099b8345b0e9e7af8ed7d8bc73afca6cbc8fc93cb61d6c42b218da04755439afa9ba1d7c47adf04f08b3b6c678fe7e48efd74a169cc726011126df869be8ac403208a9ba19ac90e38410f79f62910e0f7a967aeb0c755f6be9085b95fe6b864cfc2b6d6f64e177b18a21e1b5518074b8d76d0fadbd4e1143b85bf9c925bee2410f4c4ff753f0e2e546bebc1320c2f03e8e52a28d7f5021ddccb2772a82b48947233961c92d3b34e38279db14c53defdb596cc9fb93c7f8c28640790ccedc5a7c47033a2ae22f01322a17223ca6874374509d41143ea62473e56dad132ccf880750f484b5c08eb5f443830da4eff11d586623df4247a1a77f7ec0a4d73e071db1b7501cb292f794e0bd67580739d64cc0208f5f326f7999901c1bbf1667e27682bd80b5b7654890325afa2cb28e069677ebc69b37ea9a1fb48f8253055c1b1b1ef699fd33fdb" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -1910,7 +1910,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "dcf2d46ae964b49ba3e3db3f8b6470e7f8353e09fc45f279b4935a8eabb30b3d7471604546ee3084fb1cef0aa9798ddcef4694bac9091adf5eda3b0345df7d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000bce867cc3281fe0ede7d916e12905939edf93bd500f925a6d0f46e8c03c0de1288935a3c1760f8f36f1f1535aabeb04990616f3f850bd6c1d97756b3fcbcf961f4d8bf3901100187d2e05408fa5a579d657889ce2dd0be06ce18fe39170e3c3dc26d9a67892b5d49116c7906aa1de14bf6642fe7a078020f0cf3a5c6a186913e29803cf7a4a6c7439cf562ddbaaa65d4f61ba5d11a859f519371ce803c47f10dca269fc8e02d9f63b0d6753e0cfe9b49affdb261bd7fe1239b6fba7dbcdcdd07e6575da355f45bb5eab7668b579427128221c4ae3204b9a0c6f9cfc201f90f0baafaf7424f8423fa28102aa2d3ed06fe93e5d5b39cefdad9e9ceaa8418dc6f65e2cd38ab2c1884ce463d5f435c4f0654ded22509161af882f0dc83187e12dd0b22b5447d2b79cd349c56d1846ffecee4f0d94a91cc8ecbf96d858a4795bb201e46c60e9e4b68125a1eeb6908e16af3d08aa50b08942856e5557924534f7bd2639cdb14b907a7598403001ebfa8bb4c79d6e2465ddcfe0c210a5965cd25632670200a7e2206f9c849d0ce9b254bd9dcecbcc086db2fc099c5eb2ef41b02e92c694a7c8f2bfffb5c670ca475e88b5b8c657dfc9b63aa75f6c1b11b3b5a300ace66a0d90b3d70c6845f9e4b21f82f17e0dfab46f79f58e7ee6405175f910321be3046e1034b225b7c1be378204057d8335a6ebbd396116af8297aeadc460bcada72c84ed1ca22ccb7d84d99193ef323d289f777b274287ca5c033bb9b6e7f700467ba8bf3233c3013c5096cbf22ec14f55a1eb214c740f06f711b6786e08a7d931e8c219e8d21d8cf6204e0e6f233460fdddf4647b72a4375f374f8c40133d1002836c757723ec7f9aa3945e7173aa5adac5a6169c65698c59d276734315d9d7246e2ad1032b5a73d4f292041c45b27b1a52ae909a8ae89128c536288eb7289ef68188e411b133da664dbd545bb39180291ef5ffffa7633545335e021a76911270e827e0031c39f9a54d1ce5f84e350fe50d4be9352f63546ec62600c6c8e014b07" + "value_hex": "f41e319abdeaaae207f31b53703f67d8aa0f9d69ec81dbdc2545ae48da9d164aa09e497ff72886e4c6827594c5ec93ac44837a62fe445ff01b225668835b946c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000cc864185c22119f144442b7ebb03355b47601704f13e81759ae9dfb73de5412b9e256fe3fef2930ef90f91e5e731235c80f059843aaeed4215bbdb1e20c47f44862dd2ce864c8ecf9ed831aae5ba4daedfe47de09e9f60bd13c6cf37d457875fb26ff4fb6ad244a24c51bc5fb5d1d96d2da3ff81a49e7897a3e7f336c5f31a4618b9031e8721528fdc8e032e89db8b74c39d2381c1ab91ebc3c665e73251f9017028e395807a9cb359365edcf4015f8f739603ef181d540e3b4b81955553b9030400e89d8cf64413a6ff7ea09a0a0e8c120f4f75d718ad4df1adbd7e3d3a3305e0598c18aef7243258bf831bffc3a2c180dfa824f64a8aaa409a11e656bd7e6078e7d6c079be52006a0c34a496d7ba0d9296607cbbcc8a961bd825f9505e241f926f3d225d6252b9b594a9370ccc73a514f5b711d8d573a8b34090acd9ac4a775aa7144deedd9d6ade1b7e0146dd2d4aa746d151517333b5ed2ff337839cd8507a6ce7c950b74a273730f2b79040249959faf816da5ca34f11071678eadf3d05cc13f8e883b5aad7d148eb8d69d5a21045c88d99642588108099b8345b0e9e7af8ed7d8bc73afca6cbc8fc93cb61d6c42b218da04755439afa9ba1d7c47adf04f08b3b6c678fe7e48efd74a169cc726011126df869be8ac403208a9ba19ac90e38410f79f62910e0f7a967aeb0c755f6be9085b95fe6b864cfc2b6d6f64e177b18a21e1b5518074b8d76d0fadbd4e1143b85bf9c925bee2410f4c4ff753f0e2e546bebc1320c2f03e8e52a28d7f5021ddccb2772a82b48947233961c92d3b34e38279db14c53defdb596cc9fb93c7f8c28640790ccedc5a7c47033a2ae22f01322a17223ca6874374509d41143ea62473e56dad132ccf880750f484b5c08eb5f443830da4eff11d586623df4247a1a77f7ec0a4d73e071db1b7501cb292f794e0bd67580739d64cc0208f5f326f7999901c1bbf1667e27682bd80b5b7654890325afa2cb28e069677ebc69b37ea9a1fb48f8253055c1b1b1ef699fd33fdbba01" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -1922,15 +1922,15 @@ "family": "transfer_composite", "expected_valid": true, "payload": { - "equality_proof_data_hex": "ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268de4c3d91066bdd05ab31d6a139d6b002005efc0d55a70c5393b9faf7381053212eafff6b28c62f72126419f08dd316bb428b1c00c8f7ab9650f089ac72f3ad32dcf2d46ae964b49ba3e3db3f8b6470e7f8353e09fc45f279b4935a8eabb30b3d006ad1b0d780388c8ea4a5eeb34818be5691939fc4ae0092463fe0676bfb0b1dd872ba0af3cb19ec24071a4f2f0c3f3dd98e4019156b4855156f4be14d1a735c546f929613a02d8980d27d8db1062cd737a915c59a6573eb1463da6a4d3ee745e34157f96332af5aff9c6a383c438c48fc9986ca37ede30fb33c378a670bcc0085b4f5144d663c5ffac0afba1d4c3e4eb13f8230682ac14f28869fb8dcc22e01673982910c30ca1e2a8bdf237560a877c12a6419d407ab9466e15fb5e179c70b", - "range_proof_data_hex": "dcf2d46ae964b49ba3e3db3f8b6470e7f8353e09fc45f279b4935a8eabb30b3d7471604546ee3084fb1cef0aa9798ddcef4694bac9091adf5eda3b0345df7d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000bce867cc3281fe0ede7d916e12905939edf93bd500f925a6d0f46e8c03c0de1288935a3c1760f8f36f1f1535aabeb04990616f3f850bd6c1d97756b3fcbcf961f4d8bf3901100187d2e05408fa5a579d657889ce2dd0be06ce18fe39170e3c3dc26d9a67892b5d49116c7906aa1de14bf6642fe7a078020f0cf3a5c6a186913e29803cf7a4a6c7439cf562ddbaaa65d4f61ba5d11a859f519371ce803c47f10dca269fc8e02d9f63b0d6753e0cfe9b49affdb261bd7fe1239b6fba7dbcdcdd07e6575da355f45bb5eab7668b579427128221c4ae3204b9a0c6f9cfc201f90f0baafaf7424f8423fa28102aa2d3ed06fe93e5d5b39cefdad9e9ceaa8418dc6f65e2cd38ab2c1884ce463d5f435c4f0654ded22509161af882f0dc83187e12dd0b22b5447d2b79cd349c56d1846ffecee4f0d94a91cc8ecbf96d858a4795bb201e46c60e9e4b68125a1eeb6908e16af3d08aa50b08942856e5557924534f7bd2639cdb14b907a7598403001ebfa8bb4c79d6e2465ddcfe0c210a5965cd25632670200a7e2206f9c849d0ce9b254bd9dcecbcc086db2fc099c5eb2ef41b02e92c694a7c8f2bfffb5c670ca475e88b5b8c657dfc9b63aa75f6c1b11b3b5a300ace66a0d90b3d70c6845f9e4b21f82f17e0dfab46f79f58e7ee6405175f910321be3046e1034b225b7c1be378204057d8335a6ebbd396116af8297aeadc460bcada72c84ed1ca22ccb7d84d99193ef323d289f777b274287ca5c033bb9b6e7f700467ba8bf3233c3013c5096cbf22ec14f55a1eb214c740f06f711b6786e08a7d931e8c219e8d21d8cf6204e0e6f233460fdddf4647b72a4375f374f8c40133d1002836c757723ec7f9aa3945e7173aa5adac5a6169c65698c59d276734315d9d7246e2ad1032b5a73d4f292041c45b27b1a52ae909a8ae89128c536288eb7289ef68188e411b133da664dbd545bb39180291ef5ffffa7633545335e021a76911270e827e0031c39f9a54d1ce5f84e350fe50d4be9352f63546ec62600c6c8e014b06", - "validity_proof_data_hex": "ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d2685e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b7471604546ee3084fb1cef0aa9798ddcef4694bac9091adf5eda3b0345df7d0dc68237cff9e617f3bb3ed7438f41157147fa42ee952b4969f4041a578264124b3ce1d340532dbd4c3adca7406f7802931bffec088921469404341b2f0be89420463a818b1b7c56ae0ad2f4a77c05b5c9cbf43be703f6b577b184e1ee5ccd5925983c8b9dbd222aaa8920b6ba22996d6c14aeab4f30a6005368e1ef6cc0ed3a718e2ba227b1c02b5d0a4b249bf21664d9e92e9a8a6222933a9ee629d2c0d6c110188332a15c29fcf21f666ff96566f21c43b6e3c9334709e666e1951515317801c4ab1c0d184bd22d70b5111993a9fa1e131978e5af49b65ffcc4b6bb0dd7c04f88704f81171cba1f4433f9a8c5024be7f0b272aa2af0552fa2dd726dcc1fbc101ffd760a403c13886c618b9ac8e3cdb73a6e1883038363634054dba8e7b0a30bf63844abacf3e2b80d8ea0cae99aa171b88f02d4be534886df9e1f62ca86f60e" + "equality_proof_data_hex": "aaccc8b2f111925812d3c79c9eff877635229ef0e4e1fb65e11f390bc7b2e86552388f9c12c9be4daab62f9a007c034be768d0efe0268a1362601b70d6550a6a58603160836db21c4cb11e05c7171f99eaa7f89e860c3526627be4b26ea9a721da2e972750b4f512b74a542e21911228d159384f5d3f816954671f6b2b98e300bce917390969c1f61afa0d1397dc0d47b09b97ac5341f9c00bcb39259e799417d6474e9675d713852f5ac1cde2fd72f0a26bf0a0eab544dffd3b160a4264e32c7403a38700d618f47a1caa0ffd1fad6d031bab5ab80c16a960920bc418282215283062e3dfb503ebba5bd13f098d3886618f0a21f4a86d1a55785e70b0f5e20927ccd637ccdd08741af12522954e6cb8d6b1b335417fca431d95a3a355668c03070fe43fce5d9264e7f37d9a11659d228af48b0ab765337afe0432160f045b00", + "range_proof_data_hex": "da2e972750b4f512b74a542e21911228d159384f5d3f816954671f6b2b98e30010e0adc8702488ebce88a79cba3d9062490e0306f0b0d5a8b47684231a44d262000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404000000000000034377c4007a40fc5df7b54063cfede40fbc2c11d1b878eaa1c7330886aec81092e0cfd9d728f7d86045dcf5590ef64178ca68605682e00d92f8b2355cf2565156e7002ca0964193d7b70c5087977bca2f685c495aea7a74eb8afd37b3ff6b529fc046ece677b3bd1c5394c4d551356bcdb0fb3f33cfdcb56a393aae89dd3025608c2b34477ea80ab62f27271305ea9aaec7fe82258cffd2582ebd1cf8370290fe67d670ff92019c2d7aa180f6ab24f0216845864bfa29b16fe0a175a30c4a0072b7b0e2e4ccdb16213f5f5b9cd2a86f355194150561cbe3b16ee55e98ac7580aae0c9e18ca94d66b296c1aac0d6a436c597445d1492929c9443d106aa1c31f74fce95e7387bf9273e28845549f5436e5b70419defb3af373fce05b12d16b856fba9abef1d972c98a11a4bff657ff9dc629a229feee28c0bb534fa895c459636944783010bb0c12385ee04bcbf9cc4f730257a2aca8cae7089adc6f02d96a89595014134c1820ff5d66afc6c0052ce3ca3e9bf15e8348adade606ace7c5a9ae5fe82687ec36e329c0e0796b3e5c1b4d0b9fe27c5a5b38d2a1255cf1c14f32212ece6ab634937da56bf768a4a42d3e985c91337514fbaa3572f0f60c8089d8d65184ab66e5e24a3972fedb4f8ce7ead5c0c63d44aa99ec6d4b7b7bf260b8895e3c64da72ada36b392a0fb81671bce5f518cb5a09ed6482e79dc1179b1af5958158b8e77dd455934cc113a4b447d71a45d81a12507c57d86616826b8615c24ae42c5233bbfc70e48fa253d8121144fcc794a4864cc43ee4fdb8ccf48de90ef1ce12b8f9b8aa9d43a71f167522a41aacabfdd53ba55d5934b6a25ef4fbb84c9f6951d85768c18b43ddbcc97b6f1634f66d6d3650101cfd8c03aeda59ce1e8fa29f1a14ab8fe964e9c49f8b566d6f1af4da28db09a6fb79bc6dc3eee1a17b82dea6639e4ac4502691d6e3508a672e09f67be2cb9cae0596b3ab867928354cfa876e0604f61b96c1b208c43cbc01b19e0abfc566964c2aa46c6559820be31168bda602", + "validity_proof_data_hex": "aaccc8b2f111925812d3c79c9eff877635229ef0e4e1fb65e11f390bc7b2e865d4508ad57e19936d09a2584f4b537b138dad4ae24fd0274a25fa67f16cff945b10e0adc8702488ebce88a79cba3d9062490e0306f0b0d5a8b47684231a44d26222934aefd212c15c2e42427f38703bfcbfa6ce7267743fee9b33246105320e577252faab6a2426ff2b1d71767506f2196d994b7b9378f2a13b5652c933c6d640aca9e65f360ce07a7ea048cb7fb527890633dbeb8cbc3868e0e388e9c25d095e86e8558816dc1072c4eac2b290081cc09a9712808ff0d9429124b1931d8edf09a239f62fd5e454adcd1d24c7c7861d8b385706f6264e280e667c9017e00c157206f22f2dc6d309993aafd359ed81b30277edc40207b669e5f3fbbcb2c53a8e6e1ecd3c2323c77792acef8ef8ea15522fe528da9822ad923ae09d62907ba639081876c237bf9c9168c465ee07f240d7694c9297a86eb6f2efa89518adc78b3922c008f1ba19fe1050ee1a31a4c6c60e504d99b82245502872559de84f6387760969cb12bd52d16f7ab00a8f0de2cc71f6910a5745f9d7e62c4666f144ccb49d03" }, "binding": { - "current_balance_commitment_hex": "04c1d0c616538a2f3194b61d408f29b58a1a2ad85901cce5d0e2e4c9ac2cb93a", - "current_balance_handle_hex": "e8f4bc5bba3f5319bfdcbb68ddd842f749ebf4497c78ee50f84eb89693858355", - "recipient_pubkey_hex": "5e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b", - "sender_pubkey_hex": "ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268" + "current_balance_commitment_hex": "501bbfcea3ab6a1103204b3c7085a4b51c5245f1caf87184e6be86e45955e407", + "current_balance_handle_hex": "f66fa1b66dee305b5d2f02e19ab89c90de7567d8c7970e44f605da5e6473a46f", + "recipient_pubkey_hex": "d4508ad57e19936d09a2584f4b537b138dad4ae24fd0274a25fa67f16cff945b", + "sender_pubkey_hex": "aaccc8b2f111925812d3c79c9eff877635229ef0e4e1fb65e11f390bc7b2e865" }, "mutations": [ { @@ -1948,7 +1948,7 @@ "op": "bitflip", "target": "binding.sender_pubkey_hex", "params": { - "value_hex": "ebd02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268" + "value_hex": "abccc8b2f111925812d3c79c9eff877635229ef0e4e1fb65e11f390bc7b2e865" }, "expected_valid": false, "expected_error_contains": "failed" @@ -1958,7 +1958,7 @@ "op": "bitflip", "target": "binding.recipient_pubkey_hex", "params": { - "value_hex": "5f06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b" + "value_hex": "d5508ad57e19936d09a2584f4b537b138dad4ae24fd0274a25fa67f16cff945b" }, "expected_valid": false, "expected_error_contains": "failed" @@ -1978,7 +1978,7 @@ "op": "truncate", "target": "payload.range_proof_data_hex", "params": { - "value_hex": "dcf2d46ae964b49ba3e3db3f8b6470e7f8353e09fc45f279b4935a8eabb30b3d7471604546ee3084fb1cef0aa9798ddcef4694bac9091adf5eda3b0345df7d0d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004040000000000000bce867cc3281fe0ede7d916e12905939edf93bd500f925a6d0f46e8c03c0de1288935a3c1760f8f36f1f1535aabeb04990616f3f850bd6c1d97756b3fcbcf961f4d8bf3901100187d2e05408fa5a579d657889ce2dd0be06ce18fe39170e3c3dc26d9a67892b5d49116c7906aa1de14bf6642fe7a078020f0cf3a5c6a186913e29803cf7a4a6c7439cf562ddbaaa65d4f61ba5d11a859f519371ce803c47f10dca269fc8e02d9f63b0d6753e0cfe9b49affdb261bd7fe1239b6fba7dbcdcdd07e6575da355f45bb5eab7668b579427128221c4ae3204b9a0c6f9cfc201f90f0baafaf7424f8423fa28102aa2d3ed06fe93e5d5b39cefdad9e9ceaa8418dc6f65e2cd38ab2c1884ce463d5f435c4f0654ded22509161af882f0dc83187e12dd0b22b5447d2b79cd349c56d1846ffecee4f0d94a91cc8ecbf96d858a4795bb201e46c60e9e4b68125a1eeb6908e16af3d08aa50b08942856e5557924534f7bd2639cdb14b907a7598403001ebfa8bb4c79d6e2465ddcfe0c210a5965cd25632670200a7e2206f9c849d0ce9b254bd9dcecbcc086db2fc099c5eb2ef41b02e92c694a7c8f2bfffb5c670ca475e88b5b8c657dfc9b63aa75f6c1b11b3b5a300ace66a0d90b3d70c6845f9e4b21f82f17e0dfab46f79f58e7ee6405175f910321be3046e1034b225b7c1be378204057d8335a6ebbd396116af8297aeadc460bcada72c84ed1ca22ccb7d84d99193ef323d289f777b274287ca5c033bb9b6e7f700467ba8bf3233c3013c5096cbf22ec14f55a1eb214c740f06f711b6786e08a7d931e8c219e8d21d8cf6204e0e6f233460fdddf4647b72a4375f374f8c40133d1002836c757723ec7f9aa3945e7173aa5adac5a6169c65698c59d276734315d9d7246e2ad1032b5a73d4f292041c45b27b1a52ae909a8ae89128c536288eb7289ef68188e411b133da664dbd545bb39180291ef5ffffa7633545335e021a76911270e827e0031c39f9a54d1ce5f84e350fe50d4be9352f63546ec62600c6c8e01" + "value_hex": "da2e972750b4f512b74a542e21911228d159384f5d3f816954671f6b2b98e30010e0adc8702488ebce88a79cba3d9062490e0306f0b0d5a8b47684231a44d262000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000404000000000000034377c4007a40fc5df7b54063cfede40fbc2c11d1b878eaa1c7330886aec81092e0cfd9d728f7d86045dcf5590ef64178ca68605682e00d92f8b2355cf2565156e7002ca0964193d7b70c5087977bca2f685c495aea7a74eb8afd37b3ff6b529fc046ece677b3bd1c5394c4d551356bcdb0fb3f33cfdcb56a393aae89dd3025608c2b34477ea80ab62f27271305ea9aaec7fe82258cffd2582ebd1cf8370290fe67d670ff92019c2d7aa180f6ab24f0216845864bfa29b16fe0a175a30c4a0072b7b0e2e4ccdb16213f5f5b9cd2a86f355194150561cbe3b16ee55e98ac7580aae0c9e18ca94d66b296c1aac0d6a436c597445d1492929c9443d106aa1c31f74fce95e7387bf9273e28845549f5436e5b70419defb3af373fce05b12d16b856fba9abef1d972c98a11a4bff657ff9dc629a229feee28c0bb534fa895c459636944783010bb0c12385ee04bcbf9cc4f730257a2aca8cae7089adc6f02d96a89595014134c1820ff5d66afc6c0052ce3ca3e9bf15e8348adade606ace7c5a9ae5fe82687ec36e329c0e0796b3e5c1b4d0b9fe27c5a5b38d2a1255cf1c14f32212ece6ab634937da56bf768a4a42d3e985c91337514fbaa3572f0f60c8089d8d65184ab66e5e24a3972fedb4f8ce7ead5c0c63d44aa99ec6d4b7b7bf260b8895e3c64da72ada36b392a0fb81671bce5f518cb5a09ed6482e79dc1179b1af5958158b8e77dd455934cc113a4b447d71a45d81a12507c57d86616826b8615c24ae42c5233bbfc70e48fa253d8121144fcc794a4864cc43ee4fdb8ccf48de90ef1ce12b8f9b8aa9d43a71f167522a41aacabfdd53ba55d5934b6a25ef4fbb84c9f6951d85768c18b43ddbcc97b6f1634f66d6d3650101cfd8c03aeda59ce1e8fa29f1a14ab8fe964e9c49f8b566d6f1af4da28db09a6fb79bc6dc3eee1a17b82dea6639e4ac4502691d6e3508a672e09f67be2cb9cae0596b3ab867928354cfa876e0604f61b96c1b208c43cbc01b19e0abfc566964c2aa46c6559820be31168bd" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -1990,7 +1990,7 @@ "family": "withdraw_range", "expected_valid": true, "payload": { - "proof_data_hex": "f44d37949bc5598aefd84df2e25e58f46d6a44128a54dfdab0a9faeb6802a223000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000da2168975dbddce0d9cadee80f71c683d44cf0ac2e9c2a09d127a20f2252ef503231c4444cd436daedee15fddfe14bdfb881bbc4db6ed27ebcd88df7f4d0a94f9899c80084e97e257d1c9125dd152caedc934930f4c73889f8b1d67f958c9b028c7661bf4e5e07d08b3941be61e6baafc15df117624b5eaa088028dc4a7ede4d9b694d82a899bcc9aee8b35fa2c9c8ea91fea7f9c73234dc077ef887ed78f50715e900950cdc789be950c71b32284369eb5e96bd1260a4a1bca08dcd5d08600fa1699b0e09342282fe22a3f158cb4b56f13f00bd34896d808fbdcb9cb46454025edb2d5b05a187edda567537c1f66bb781f24cc65f1793f9510908cf47f6ec7a405c1b6ccd943992ad20ff8ef0f278d1fd9628394a6f41980206d02d7b2ca37cee4259919692ca1b868c2bca39411724fc3082bbda3de13e32a639a26de571204463348d985ac97a270f66fb1a373996f4ff5484fd07a6065e26b12bc32e03210e91d6a6ccae8c187ad9060b60400b9ac5fd36c4b4b4c42575067453029c8f7ede4e1ce0033a26437139ae0c3e4a3f1bd1cf44beb7a9694ab76f17e54bff313d3897205f1cef1b0837fe73ce92b70b4d0d0ab4dbb967218253eaf2106769fc1d3e70650a0889f3abd96fd6fca4ac903079c2ddf404af33ca5c206c259dcae67430cc508256f675c6dbf607e186946128fe41f2aa3da5649852b934d68489a6355ac7d46c6196a77b77a93cc4efd4d55fd574061923772b1f8dac2796742a443d405a6a9cfbaad2fc3a598b9dffb827485edf4a477e6287881f99a052800c7f7e947957dc77eb65a19abcaab3764866ffdb9d740a87afa0a748f3fc4a880edb7071d74b2981cebc5118fc85c086568ddb29c212d0218075d2d789baa2972a0e01ba30337d81cb6d012e79074ee5846c681941c3da4e2c6b2b97686bcc67dc7105" + "proof_data_hex": "4e32d3ef320f1cf4d9d86ba2d3eefa3ec9b415215a154a4cc84d5ef58b4f612a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000145ed9f2d9a0029f7f2515a7b183e81c810d14b76a665184219748b5da5fbe297622c307679968e2c8d8b26f450385d17ce0eced453b08dd3e0cb94773ae0b798c0e88f0869d4773d2c4b4feed7cb9c1a8f65f3353ffbd109c6a56d9a9bea35d16c068f554bcb1f1cd6c9853c63d48883cad868150e2abdfedc5a0c22227b72e74ce6e147b94ddd58508ac0a2770334d8531e6b08734c1a707a44af169833c0f04a203e07b966f5fcd758a69fdf06d745aab456060b82eae57b5da0d36884a024c66c4454cc3c4517f93d4a0d6a82f0f1c109aa78be9d10dba040207cb8d320f863022ae51e6f2d4478934668cd95cb2d97c5367fcae7ff501289031a1dd0a2f5296d16f25dbbfd9d0820ae9ce5471b300e57c6cda41ad38c7dfd21a768ea57de684c37937f291a0ddb99bae964ad27acb23a541529d5fe378c557d62f2a477fe6567600f1b8404b9d75d08e91e400caa2a22e16a9c7d7848e4f874eb9acb02f56cb20eef7684a36e83a56a88cb5c3f2022b83843fd51f782dabf4c3a572eb29269fe51ad94aeef16343353ffeb563123bd7d3dfb553b6e4a0f904247d7b6a3796228eb9d33b358f560fe5de13edcc93be6358968af912180e3144afe2ea121bea3e19b6b433712eec274ce5df2d738bc56338854355c28a5ad2fda8e9f7d566321b1af94770a1ecc5e32b12a6d4e455d6c926156d578289a923c536cc2e60629caebbc5f7468bb8567aa27c3d0515bdb561ace96c53fc519deb0103cbc56e1ed251536bc46bc0160a87d233cb1e3dadb852532a910c8b8dccefcab92180117b30bc66beac05c2a2c0a3a3aa9a08f1e4745e72897d939165e49f1290604aab1a8e2cd0129fe92c4a256b6da465841c0ea78ec6120dcd5ef57c1663d9d3cf210a67b00d893d5c6cb66df18cdf52dfd15f3b351f133bac1ceb08374b317a1f5b01" }, "mutations": [ { @@ -1998,7 +1998,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "f54d37949bc5598aefd84df2e25e58f46d6a44128a54dfdab0a9faeb6802a223000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000da2168975dbddce0d9cadee80f71c683d44cf0ac2e9c2a09d127a20f2252ef503231c4444cd436daedee15fddfe14bdfb881bbc4db6ed27ebcd88df7f4d0a94f9899c80084e97e257d1c9125dd152caedc934930f4c73889f8b1d67f958c9b028c7661bf4e5e07d08b3941be61e6baafc15df117624b5eaa088028dc4a7ede4d9b694d82a899bcc9aee8b35fa2c9c8ea91fea7f9c73234dc077ef887ed78f50715e900950cdc789be950c71b32284369eb5e96bd1260a4a1bca08dcd5d08600fa1699b0e09342282fe22a3f158cb4b56f13f00bd34896d808fbdcb9cb46454025edb2d5b05a187edda567537c1f66bb781f24cc65f1793f9510908cf47f6ec7a405c1b6ccd943992ad20ff8ef0f278d1fd9628394a6f41980206d02d7b2ca37cee4259919692ca1b868c2bca39411724fc3082bbda3de13e32a639a26de571204463348d985ac97a270f66fb1a373996f4ff5484fd07a6065e26b12bc32e03210e91d6a6ccae8c187ad9060b60400b9ac5fd36c4b4b4c42575067453029c8f7ede4e1ce0033a26437139ae0c3e4a3f1bd1cf44beb7a9694ab76f17e54bff313d3897205f1cef1b0837fe73ce92b70b4d0d0ab4dbb967218253eaf2106769fc1d3e70650a0889f3abd96fd6fca4ac903079c2ddf404af33ca5c206c259dcae67430cc508256f675c6dbf607e186946128fe41f2aa3da5649852b934d68489a6355ac7d46c6196a77b77a93cc4efd4d55fd574061923772b1f8dac2796742a443d405a6a9cfbaad2fc3a598b9dffb827485edf4a477e6287881f99a052800c7f7e947957dc77eb65a19abcaab3764866ffdb9d740a87afa0a748f3fc4a880edb7071d74b2981cebc5118fc85c086568ddb29c212d0218075d2d789baa2972a0e01ba30337d81cb6d012e79074ee5846c681941c3da4e2c6b2b97686bcc67dc7105" + "value_hex": "4f32d3ef320f1cf4d9d86ba2d3eefa3ec9b415215a154a4cc84d5ef58b4f612a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000145ed9f2d9a0029f7f2515a7b183e81c810d14b76a665184219748b5da5fbe297622c307679968e2c8d8b26f450385d17ce0eced453b08dd3e0cb94773ae0b798c0e88f0869d4773d2c4b4feed7cb9c1a8f65f3353ffbd109c6a56d9a9bea35d16c068f554bcb1f1cd6c9853c63d48883cad868150e2abdfedc5a0c22227b72e74ce6e147b94ddd58508ac0a2770334d8531e6b08734c1a707a44af169833c0f04a203e07b966f5fcd758a69fdf06d745aab456060b82eae57b5da0d36884a024c66c4454cc3c4517f93d4a0d6a82f0f1c109aa78be9d10dba040207cb8d320f863022ae51e6f2d4478934668cd95cb2d97c5367fcae7ff501289031a1dd0a2f5296d16f25dbbfd9d0820ae9ce5471b300e57c6cda41ad38c7dfd21a768ea57de684c37937f291a0ddb99bae964ad27acb23a541529d5fe378c557d62f2a477fe6567600f1b8404b9d75d08e91e400caa2a22e16a9c7d7848e4f874eb9acb02f56cb20eef7684a36e83a56a88cb5c3f2022b83843fd51f782dabf4c3a572eb29269fe51ad94aeef16343353ffeb563123bd7d3dfb553b6e4a0f904247d7b6a3796228eb9d33b358f560fe5de13edcc93be6358968af912180e3144afe2ea121bea3e19b6b433712eec274ce5df2d738bc56338854355c28a5ad2fda8e9f7d566321b1af94770a1ecc5e32b12a6d4e455d6c926156d578289a923c536cc2e60629caebbc5f7468bb8567aa27c3d0515bdb561ace96c53fc519deb0103cbc56e1ed251536bc46bc0160a87d233cb1e3dadb852532a910c8b8dccefcab92180117b30bc66beac05c2a2c0a3a3aa9a08f1e4745e72897d939165e49f1290604aab1a8e2cd0129fe92c4a256b6da465841c0ea78ec6120dcd5ef57c1663d9d3cf210a67b00d893d5c6cb66df18cdf52dfd15f3b351f133bac1ceb08374b317a1f5b01" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -2008,7 +2008,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "f44d37949bc5598aefd84df2e25e58f46d6a44128a54dfdab0a9faeb6802a223000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000da2168975dbddce0d9cadee80f71c683d44cf0ac2e9c2a09d127a20f2252ef503231c4444cd436daedee15fddfe14bdfb881bbc4db6ed27ebcd88df7f4d0a94f9899c80084e97e257d1c9125dd152caedc934930f4c73889f8b1d67f958c9b028c7661bf4e5e07d08b3941be61e6baafc15df117624b5eaa088028dc4a7ede4d9b694d82a899bcc9aee8b35fa2c9c8ea91fea7f9c73234dc077ef887ed78f50715e900950cdc789be950c71b32284369eb5e96bd1260a4a1bca08dcd5d08600fa1699b0e09342282fe22a3f158cb4b56f13f00bd34896d808fbdcb9cb46454025edb2d5b05a187edda567537c1f66bb781f24cc65f1793f9510908cf47f6ec7a405c1b6ccd943992ad20ff8ef0f278d1fd9628394a6f41980206d02d7b2ca37cee4259919692ca1b868c2bca39411724fc3082bbda3de13e32a639a26de571204463348d985ac97a270f66fb1a373996f4ff5484fd07a6065e26b12bc32e03210e91d6a6ccae8c187ad9060b60400b9ac5fd36c4b4b4c42575067453029c8f7ede4e1ce0033a26437139ae0c3e4a3f1bd1cf44beb7a9694ab76f17e54bff313d3897205f1cef1b0837fe73ce92b70b4d0d0ab4dbb967218253eaf2106769fc1d3e70650a0889f3abd96fd6fca4ac903079c2ddf404af33ca5c206c259dcae67430cc508256f675c6dbf607e186946128fe41f2aa3da5649852b934d68489a6355ac7d46c6196a77b77a93cc4efd4d55fd574061923772b1f8dac2796742a443d405a6a9cfbaad2fc3a598b9dffb827485edf4a477e6287881f99a052800c7f7e947957dc77eb65a19abcaab3764866ffdb9d740a87afa0a748f3fc4a880edb7071d74b2981cebc5118fc85c086568ddb29c212d0218075d2d789baa2972a0e01ba30337d81cb6d012e79074ee5846c681941c3da4e2c6b2b97686bcc67dc" + "value_hex": "4e32d3ef320f1cf4d9d86ba2d3eefa3ec9b415215a154a4cc84d5ef58b4f612a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000145ed9f2d9a0029f7f2515a7b183e81c810d14b76a665184219748b5da5fbe297622c307679968e2c8d8b26f450385d17ce0eced453b08dd3e0cb94773ae0b798c0e88f0869d4773d2c4b4feed7cb9c1a8f65f3353ffbd109c6a56d9a9bea35d16c068f554bcb1f1cd6c9853c63d48883cad868150e2abdfedc5a0c22227b72e74ce6e147b94ddd58508ac0a2770334d8531e6b08734c1a707a44af169833c0f04a203e07b966f5fcd758a69fdf06d745aab456060b82eae57b5da0d36884a024c66c4454cc3c4517f93d4a0d6a82f0f1c109aa78be9d10dba040207cb8d320f863022ae51e6f2d4478934668cd95cb2d97c5367fcae7ff501289031a1dd0a2f5296d16f25dbbfd9d0820ae9ce5471b300e57c6cda41ad38c7dfd21a768ea57de684c37937f291a0ddb99bae964ad27acb23a541529d5fe378c557d62f2a477fe6567600f1b8404b9d75d08e91e400caa2a22e16a9c7d7848e4f874eb9acb02f56cb20eef7684a36e83a56a88cb5c3f2022b83843fd51f782dabf4c3a572eb29269fe51ad94aeef16343353ffeb563123bd7d3dfb553b6e4a0f904247d7b6a3796228eb9d33b358f560fe5de13edcc93be6358968af912180e3144afe2ea121bea3e19b6b433712eec274ce5df2d738bc56338854355c28a5ad2fda8e9f7d566321b1af94770a1ecc5e32b12a6d4e455d6c926156d578289a923c536cc2e60629caebbc5f7468bb8567aa27c3d0515bdb561ace96c53fc519deb0103cbc56e1ed251536bc46bc0160a87d233cb1e3dadb852532a910c8b8dccefcab92180117b30bc66beac05c2a2c0a3a3aa9a08f1e4745e72897d939165e49f1290604aab1a8e2cd0129fe92c4a256b6da465841c0ea78ec6120dcd5ef57c1663d9d3cf210a67b00d893d5c6cb66df18cdf52dfd15f3b351f133bac1ceb08374b317a1f" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -2028,7 +2028,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "f44d37949bc5598aefd84df2e25e58f46d6a44128a54dfdab0a9faeb6802a223000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000da2168975dbddce0d9cadee80f71c683d44cf0ac2e9c2a09d127a20f2252ef503231c4444cd436daedee15fddfe14bdfb881bbc4db6ed27ebcd88df7f4d0a94f9899c80084e97e257d1c9125dd152caedc934930f4c73889f8b1d67f958c9b028c7661bf4e5e07d08b3941be61e6baafc15df117624b5eaa088028dc4a7ede4d9b694d82a899bcc9aee8b35fa2c9c8ea91fea7f9c73234dc077ef887ed78f50715e900950cdc789be950c71b32284369eb5e96bd1260a4a1bca08dcd5d08600fa1699b0e09342282fe22a3f158cb4b56f13f00bd34896d808fbdcb9cb46454025edb2d5b05a187edda567537c1f66bb781f24cc65f1793f9510908cf47f6ec7a405c1b6ccd943992ad20ff8ef0f278d1fd9628394a6f41980206d02d7b2ca37cee4259919692ca1b868c2bca39411724fc3082bbda3de13e32a639a26de571204463348d985ac97a270f66fb1a373996f4ff5484fd07a6065e26b12bc32e03210e91d6a6ccae8c187ad9060b60400b9ac5fd36c4b4b4c42575067453029c8f7ede4e1ce0033a26437139ae0c3e4a3f1bd1cf44beb7a9694ab76f17e54bff313d3897205f1cef1b0837fe73ce92b70b4d0d0ab4dbb967218253eaf2106769fc1d3e70650a0889f3abd96fd6fca4ac903079c2ddf404af33ca5c206c259dcae67430cc508256f675c6dbf607e186946128fe41f2aa3da5649852b934d68489a6355ac7d46c6196a77b77a93cc4efd4d55fd574061923772b1f8dac2796742a443d405a6a9cfbaad2fc3a598b9dffb827485edf4a477e6287881f99a052800c7f7e947957dc77eb65a19abcaab3764866ffdb9d740a87afa0a748f3fc4a880edb7071d74b2981cebc5118fc85c086568ddb29c212d0218075d2d789baa2972a0e01ba30337d81cb6d012e79074ee5846c681941c3da4e2c6b2b97686bcc67dc7104" + "value_hex": "4e32d3ef320f1cf4d9d86ba2d3eefa3ec9b415215a154a4cc84d5ef58b4f612a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000145ed9f2d9a0029f7f2515a7b183e81c810d14b76a665184219748b5da5fbe297622c307679968e2c8d8b26f450385d17ce0eced453b08dd3e0cb94773ae0b798c0e88f0869d4773d2c4b4feed7cb9c1a8f65f3353ffbd109c6a56d9a9bea35d16c068f554bcb1f1cd6c9853c63d48883cad868150e2abdfedc5a0c22227b72e74ce6e147b94ddd58508ac0a2770334d8531e6b08734c1a707a44af169833c0f04a203e07b966f5fcd758a69fdf06d745aab456060b82eae57b5da0d36884a024c66c4454cc3c4517f93d4a0d6a82f0f1c109aa78be9d10dba040207cb8d320f863022ae51e6f2d4478934668cd95cb2d97c5367fcae7ff501289031a1dd0a2f5296d16f25dbbfd9d0820ae9ce5471b300e57c6cda41ad38c7dfd21a768ea57de684c37937f291a0ddb99bae964ad27acb23a541529d5fe378c557d62f2a477fe6567600f1b8404b9d75d08e91e400caa2a22e16a9c7d7848e4f874eb9acb02f56cb20eef7684a36e83a56a88cb5c3f2022b83843fd51f782dabf4c3a572eb29269fe51ad94aeef16343353ffeb563123bd7d3dfb553b6e4a0f904247d7b6a3796228eb9d33b358f560fe5de13edcc93be6358968af912180e3144afe2ea121bea3e19b6b433712eec274ce5df2d738bc56338854355c28a5ad2fda8e9f7d566321b1af94770a1ecc5e32b12a6d4e455d6c926156d578289a923c536cc2e60629caebbc5f7468bb8567aa27c3d0515bdb561ace96c53fc519deb0103cbc56e1ed251536bc46bc0160a87d233cb1e3dadb852532a910c8b8dccefcab92180117b30bc66beac05c2a2c0a3a3aa9a08f1e4745e72897d939165e49f1290604aab1a8e2cd0129fe92c4a256b6da465841c0ea78ec6120dcd5ef57c1663d9d3cf210a67b00d893d5c6cb66df18cdf52dfd15f3b351f133bac1ceb08374b317a1f5b00" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -2040,14 +2040,14 @@ "family": "withdraw_composite", "expected_valid": true, "payload": { - "equality_proof_data_hex": "9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d8c6085a3610cefb5a9732a465b643d40218ffddc5b3ab367285b880da8f9653fe4bdebf1223efd5f309d91b052a13b2a52019103dc7cc8183d5a52da13cf9158f44d37949bc5598aefd84df2e25e58f46d6a44128a54dfdab0a9faeb6802a223000000000000000002f7cd7ca8ea8397c6dbf4bca72e1f24345eddf449dc8d1a7caf7fc105642a5fd22fc768ed0dbae6f4b31e0172c60edc7f6ce097279ec8d97cee9e3f60ff1165c8c7dbfc6aa5409ebf10c01f7a95de316096a5f99333cadf2df51ab7cf2dec313a83bd38cea682130d3d58e15b4409a5f62497ff44e504328e900511a0eb850f7edcce18a7022278b96a6b5944e79752e4b2747082c8faceb60ffba9e74d99060614b3bc1d228d308ca93c768d58d5becfa27c68bbc69798c1f4089d4a53b501", - "range_proof_data_hex": "f44d37949bc5598aefd84df2e25e58f46d6a44128a54dfdab0a9faeb6802a223000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000da2168975dbddce0d9cadee80f71c683d44cf0ac2e9c2a09d127a20f2252ef503231c4444cd436daedee15fddfe14bdfb881bbc4db6ed27ebcd88df7f4d0a94f9899c80084e97e257d1c9125dd152caedc934930f4c73889f8b1d67f958c9b028c7661bf4e5e07d08b3941be61e6baafc15df117624b5eaa088028dc4a7ede4d9b694d82a899bcc9aee8b35fa2c9c8ea91fea7f9c73234dc077ef887ed78f50715e900950cdc789be950c71b32284369eb5e96bd1260a4a1bca08dcd5d08600fa1699b0e09342282fe22a3f158cb4b56f13f00bd34896d808fbdcb9cb46454025edb2d5b05a187edda567537c1f66bb781f24cc65f1793f9510908cf47f6ec7a405c1b6ccd943992ad20ff8ef0f278d1fd9628394a6f41980206d02d7b2ca37cee4259919692ca1b868c2bca39411724fc3082bbda3de13e32a639a26de571204463348d985ac97a270f66fb1a373996f4ff5484fd07a6065e26b12bc32e03210e91d6a6ccae8c187ad9060b60400b9ac5fd36c4b4b4c42575067453029c8f7ede4e1ce0033a26437139ae0c3e4a3f1bd1cf44beb7a9694ab76f17e54bff313d3897205f1cef1b0837fe73ce92b70b4d0d0ab4dbb967218253eaf2106769fc1d3e70650a0889f3abd96fd6fca4ac903079c2ddf404af33ca5c206c259dcae67430cc508256f675c6dbf607e186946128fe41f2aa3da5649852b934d68489a6355ac7d46c6196a77b77a93cc4efd4d55fd574061923772b1f8dac2796742a443d405a6a9cfbaad2fc3a598b9dffb827485edf4a477e6287881f99a052800c7f7e947957dc77eb65a19abcaab3764866ffdb9d740a87afa0a748f3fc4a880edb7071d74b2981cebc5118fc85c086568ddb29c212d0218075d2d789baa2972a0e01ba30337d81cb6d012e79074ee5846c681941c3da4e2c6b2b97686bcc67dc7105" + "equality_proof_data_hex": "fc2feed40d061ed35d415b503503273e201d99441a470b43c64e64870c6bb02ea2514532992ca4196c6df5ecf68d05fbcb74726a048fe3ad78a581e0ce579e61e07cb4444c9a6422d6b918919a4f5297fd60850509b3d76327a510429d532e6e8ea02198dfd8f5467959cc08548eca5ab6030b2f350181920b3f4b74044a124d000000000000000028f513ad6c42b8e33389e242ede7bebc5082dcd04628e54d87ad493e8110be4a066b1aa365fbbb3aa95dee3a2fdd0e1687b2214d028204a86960345d79f10f0dd033c028e9ecd24483c05e84bd71f558eb8e4634370e551783dd7f10ee7a8d3f2512e36d9c41fd381647b75b0a1510ebf682d8b58362cdde9dca46c5f76732009287b2d8986270b0e22660b582b877366b28cdc8074eb05d689ffe79e8905d0e51e04b4077bf0cd5a19ac40e69c89d9c153e678ece7976e2d933e4efcec5be0a", + "range_proof_data_hex": "8ea02198dfd8f5467959cc08548eca5ab6030b2f350181920b3f4b74044a124d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000008093cfb3136f1e5070371ebe1daf3a1d458fb7b69a2c57da91d0db89f371452b82670053e79ccb96772e1754197d54486ab192c5f440ec73005c7cd4c2d8467c302c0daa9fd778e43c148a6a3fcb79f00be88496ab38b7d4fbf82348a19d41059eef41e6c11feffb546ceba1779cd98b2d52c04dadcf9b31e2acd02e11b8342ee88e04b059d6a8e00ee9d7bd948fed6bbf2633660efcd900803a7ccd7d221a0f2394adf913dc50e154fadcddb90b60f1f7f469cb835a0160b447569cb46be703de04b371f01b57c164993ef560cdcca5ab12bc95c35a4ba84dc2abd98274a102446886ff94916e0178b345029c4d40b3989d95153ea4631d8d45a2a53aad0c721807647524bbb31937cd79d389925e829c703260ee25be6928a3c05a88dfab1872d9b5aaf9bf81f924eccc979b51cc1e53fef6ef54a5da0de248d2484c025867c0056b67b36cea37c0ef239c11f63ba421d0cc874c0ec49440b0f31a5d2cc34f80c19ea6ead31f9cdffff9b87c5987b81823e1bf53f71b8c30db891ef7844e69fac131586c4515f20d1485d35d279201feb2c4c962a37bee492874deee927a332abcb1f8ff096f00b2eb59171021c62cdd2ef626c41b9a6484ae8e543862ae7db40e29db9344c0c299496b2ea28c94338f691d03dcb191129ab28dabd946705c08c0baa9709348846644c0f2d0d1604f79080aba27ba389a7d80134fb9df2771dcf82b628500d7f1f491d78366e6dc7ffca993bc8535f845011e47a6339ecb0e68c98d8b2a5e749a85eaeb3b167987de2086c0585025436b339aa1acf19e514586f524728fae4f487cc25810ccdf3328f1b479f0d46079de8c6841d26ea0456d1162ea307c9e3070ed1abe1f79cf80b9210f9933d59dfeff32a30319b3a39007f02dc2c3d5b47ddde5e2b0a7a121cc0b89a91eaeda3cbe9c46f292a90fdddd09" }, "binding": { - "ciphertext_commitment_hex": "8c6085a3610cefb5a9732a465b643d40218ffddc5b3ab367285b880da8f9653f", - "ciphertext_handle_hex": "e4bdebf1223efd5f309d91b052a13b2a52019103dc7cc8183d5a52da13cf9158", + "ciphertext_commitment_hex": "a2514532992ca4196c6df5ecf68d05fbcb74726a048fe3ad78a581e0ce579e61", + "ciphertext_handle_hex": "e07cb4444c9a6422d6b918919a4f5297fd60850509b3d76327a510429d532e6e", "expected_nonce_u64": 0, - "user_pubkey_hex": "9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d" + "user_pubkey_hex": "fc2feed40d061ed35d415b503503273e201d99441a470b43c64e64870c6bb02e" }, "mutations": [ { @@ -2075,7 +2075,7 @@ "op": "bitflip", "target": "binding.user_pubkey_hex", "params": { - "value_hex": "9b8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d" + "value_hex": "fd2feed40d061ed35d415b503503273e201d99441a470b43c64e64870c6bb02e" }, "expected_valid": false, "expected_error_contains": "failed" @@ -2085,7 +2085,7 @@ "op": "truncate", "target": "payload.equality_proof_data_hex", "params": { - "value_hex": "9a8ee8d66ad0522bc0da682d3135d5c6c76c2a3b0bd863be3933095ce6c2fc5d8c6085a3610cefb5a9732a465b643d40218ffddc5b3ab367285b880da8f9653fe4bdebf1223efd5f309d91b052a13b2a52019103dc7cc8183d5a52da13cf9158f44d37949bc5598aefd84df2e25e58f46d6a44128a54dfdab0a9faeb6802a223000000000000000002f7cd7ca8ea8397c6dbf4bca72e1f24345eddf449dc8d1a7caf7fc105642a5fd22fc768ed0dbae6f4b31e0172c60edc7f6ce097279ec8d97cee9e3f60ff1165c8c7dbfc6aa5409ebf10c01f7a95de316096a5f99333cadf2df51ab7cf2dec313a83bd38cea682130d3d58e15b4409a5f62497ff44e504328e900511a0eb850f7edcce18a7022278b96a6b5944e79752e4b2747082c8faceb60ffba9e74d99060614b3bc1d228d308ca93c768d58d5becfa27c68bbc69798c1f4089d4a53" + "value_hex": "fc2feed40d061ed35d415b503503273e201d99441a470b43c64e64870c6bb02ea2514532992ca4196c6df5ecf68d05fbcb74726a048fe3ad78a581e0ce579e61e07cb4444c9a6422d6b918919a4f5297fd60850509b3d76327a510429d532e6e8ea02198dfd8f5467959cc08548eca5ab6030b2f350181920b3f4b74044a124d000000000000000028f513ad6c42b8e33389e242ede7bebc5082dcd04628e54d87ad493e8110be4a066b1aa365fbbb3aa95dee3a2fdd0e1687b2214d028204a86960345d79f10f0dd033c028e9ecd24483c05e84bd71f558eb8e4634370e551783dd7f10ee7a8d3f2512e36d9c41fd381647b75b0a1510ebf682d8b58362cdde9dca46c5f76732009287b2d8986270b0e22660b582b877366b28cdc8074eb05d689ffe79e8905d0e51e04b4077bf0cd5a19ac40e69c89d9c153e678ece7976e2d933e4efcec5" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -2107,7 +2107,7 @@ "family": "withdraw_range", "expected_valid": true, "payload": { - "proof_data_hex": "188711ac7b46b168d13358ef1eaef4feebeaa6e54d50ced3dfaed7603aa0b91d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100000000000000c45fdbe02d3fda8ced4e4858a8903b674f9fd2fce269b6f8dcb162da307b4e7264ed89dde3105f31b7d73cfc7545b73a4074fa7fb8962ab7d16ac4f3cb580b62ba61519ceae40a379a628c95f2dd1f904aba4066a327f29252dd6b0be9635b1ede64c4c64f39f806189343860ed8aeee0d7317d774cefa09f86a418293afb234c382d52cd7522db9cbceb1a3242bbe9d924a0bd4cbd281848f14b0a39bfec3068d86ea9f48e2857f9bead8b284b92e2f2493984067edb41153e0ae428cc7b3086b7d95059afc0dc8ddea68a10d3f9f85bbb10618d4ca64ba5fb08bec11c6c20e78281fd14d568e19b37de57f26e65e8ce203bc5db74df4b1518167bafe01487d9c851012aab4cc11d0e3a53725426b45a70a95d9f6a1d3707c93bb95f0459f1d50f456d67f4ce0ce765847fb4a0b13f255857e29d57c1823bb14902842bd4751341b40f742e8d6103add51efa067fca95b4115f2c391a7b8bdafb02ddc794c1a80123a8d3d5a880a431465234cbe7cbfa9a3668c2b4f73a4c6597e7d96d1b10b7adee5ad9448f122b9b8b5ab768d1b53035aed8a96665684405768ab8f31303814aca5ec5ec8fcf7f181d505f538df151f97d2147d42fa31b1871a784bc660098ef99ba81e872ac3b9be265a393e01fd31d962bb3cfc6c90170329cf1b3df5409c01f0183ded52b6b7f701e21b5af70fe155bd143c844395a8e0783f2a55d17142ed66b9f0fa5f35b21580c6dbd76c909373c8e5e125abd44013f75f2aa0d441fed88e90851d07228be2c92113826237f5ce59bb368b08395b379aa5c7face710aef1a75671ab8eafd843bcd03c958c33831707c947cfd53881635097136682dcfd7947097fc9fd4b6198f3146fda8b120f7ff4dcca4e5a067b9fec213b42003820e8af241d961ef60e2157f53ea8800b0f28fc5a3c5156641de08e17a464208" + "proof_data_hex": "6e092b8b9a736a08825e73e0129445798ca5d385d3b918af9571dc8a61517d46000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100000000000000640c8cc35f4c2300a5c67c09609b8714a8bdf6339a82d37614e9d805869c530a5e7660f969839da4fb7771770d8e9437235fd2169a4511354cfa0b3c18596666000fdea77262f3e57e20483e9f3c5ad4f037efc716607f32a097ac2a73933e6a00abf5912b47417b0ff85575ec844c7b9b4d1ba820c056f183ddfdafd8e5961593061f4fdfa254166a8a23a8c9b42020e1e044cae6bcc165b443ab9c8b2d69042d5dab225bf7a3061d796ea4d394a03e80e3fe255e9992df418a109dda49b606a0e78ef05d0f2eeb87cac42b335e09ad5b9ec2f0e975cce939c981995d6bfd02aa7939b5ac220f15072747432b9a849de0aef1ad7bea8d57db8cc55892d88b7024366e33c805a36405e287a03193005c84a4723ec02a17c76d6a3bbfc4e8675412d77df01b9f9b31e560cd460799ef8fae2ea455a4863f5ad3dbb37d658de2352c375bb0a6b2278dbfa7045f5f1ca10a4bb7745a837c95c07ee41046916b720b48792a97e924de46075307c9a3d2b7b84897b30e487fd3db9d7c4fcd71c1d2302cd41dc981252ba93d0778e4f61cd24375d32921343c3bc2d7b156566cf435003a20585c1f6ad812ccf366a8ebcc49611adb7721a76389551fae1cff92550a1ea889afdf18bd09579692cb67ee044b39cdaf5194cde4a4466c55c66ce068327bb24a9e66d1dd18dddf87770c2c7355d43ee4b01bba40638b69b6f880f6e7f30640e37deaa61e37205b15ff411ea09528977c1037bd00736aded093b1ba009804dcea99d58ad234d2459e244b18eaa4d530ee4af699c8f5f098be4404cdfc4468fe547b8328209b3c080dd8a90c1b89b063589527b4957005e9012d51f2df625dd0b2479cdb6ec69a97efee4736fb2c308e28d930bf482fdc2b08a21a2c09a30e06eff51633d8c53f0d26274da3449c4828ae246c1bfa6d085cc0563affee250e" }, "mutations": [ { @@ -2115,7 +2115,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "198711ac7b46b168d13358ef1eaef4feebeaa6e54d50ced3dfaed7603aa0b91d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100000000000000c45fdbe02d3fda8ced4e4858a8903b674f9fd2fce269b6f8dcb162da307b4e7264ed89dde3105f31b7d73cfc7545b73a4074fa7fb8962ab7d16ac4f3cb580b62ba61519ceae40a379a628c95f2dd1f904aba4066a327f29252dd6b0be9635b1ede64c4c64f39f806189343860ed8aeee0d7317d774cefa09f86a418293afb234c382d52cd7522db9cbceb1a3242bbe9d924a0bd4cbd281848f14b0a39bfec3068d86ea9f48e2857f9bead8b284b92e2f2493984067edb41153e0ae428cc7b3086b7d95059afc0dc8ddea68a10d3f9f85bbb10618d4ca64ba5fb08bec11c6c20e78281fd14d568e19b37de57f26e65e8ce203bc5db74df4b1518167bafe01487d9c851012aab4cc11d0e3a53725426b45a70a95d9f6a1d3707c93bb95f0459f1d50f456d67f4ce0ce765847fb4a0b13f255857e29d57c1823bb14902842bd4751341b40f742e8d6103add51efa067fca95b4115f2c391a7b8bdafb02ddc794c1a80123a8d3d5a880a431465234cbe7cbfa9a3668c2b4f73a4c6597e7d96d1b10b7adee5ad9448f122b9b8b5ab768d1b53035aed8a96665684405768ab8f31303814aca5ec5ec8fcf7f181d505f538df151f97d2147d42fa31b1871a784bc660098ef99ba81e872ac3b9be265a393e01fd31d962bb3cfc6c90170329cf1b3df5409c01f0183ded52b6b7f701e21b5af70fe155bd143c844395a8e0783f2a55d17142ed66b9f0fa5f35b21580c6dbd76c909373c8e5e125abd44013f75f2aa0d441fed88e90851d07228be2c92113826237f5ce59bb368b08395b379aa5c7face710aef1a75671ab8eafd843bcd03c958c33831707c947cfd53881635097136682dcfd7947097fc9fd4b6198f3146fda8b120f7ff4dcca4e5a067b9fec213b42003820e8af241d961ef60e2157f53ea8800b0f28fc5a3c5156641de08e17a464208" + "value_hex": "6f092b8b9a736a08825e73e0129445798ca5d385d3b918af9571dc8a61517d46000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100000000000000640c8cc35f4c2300a5c67c09609b8714a8bdf6339a82d37614e9d805869c530a5e7660f969839da4fb7771770d8e9437235fd2169a4511354cfa0b3c18596666000fdea77262f3e57e20483e9f3c5ad4f037efc716607f32a097ac2a73933e6a00abf5912b47417b0ff85575ec844c7b9b4d1ba820c056f183ddfdafd8e5961593061f4fdfa254166a8a23a8c9b42020e1e044cae6bcc165b443ab9c8b2d69042d5dab225bf7a3061d796ea4d394a03e80e3fe255e9992df418a109dda49b606a0e78ef05d0f2eeb87cac42b335e09ad5b9ec2f0e975cce939c981995d6bfd02aa7939b5ac220f15072747432b9a849de0aef1ad7bea8d57db8cc55892d88b7024366e33c805a36405e287a03193005c84a4723ec02a17c76d6a3bbfc4e8675412d77df01b9f9b31e560cd460799ef8fae2ea455a4863f5ad3dbb37d658de2352c375bb0a6b2278dbfa7045f5f1ca10a4bb7745a837c95c07ee41046916b720b48792a97e924de46075307c9a3d2b7b84897b30e487fd3db9d7c4fcd71c1d2302cd41dc981252ba93d0778e4f61cd24375d32921343c3bc2d7b156566cf435003a20585c1f6ad812ccf366a8ebcc49611adb7721a76389551fae1cff92550a1ea889afdf18bd09579692cb67ee044b39cdaf5194cde4a4466c55c66ce068327bb24a9e66d1dd18dddf87770c2c7355d43ee4b01bba40638b69b6f880f6e7f30640e37deaa61e37205b15ff411ea09528977c1037bd00736aded093b1ba009804dcea99d58ad234d2459e244b18eaa4d530ee4af699c8f5f098be4404cdfc4468fe547b8328209b3c080dd8a90c1b89b063589527b4957005e9012d51f2df625dd0b2479cdb6ec69a97efee4736fb2c308e28d930bf482fdc2b08a21a2c09a30e06eff51633d8c53f0d26274da3449c4828ae246c1bfa6d085cc0563affee250e" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -2125,7 +2125,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "188711ac7b46b168d13358ef1eaef4feebeaa6e54d50ced3dfaed7603aa0b91d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100000000000000c45fdbe02d3fda8ced4e4858a8903b674f9fd2fce269b6f8dcb162da307b4e7264ed89dde3105f31b7d73cfc7545b73a4074fa7fb8962ab7d16ac4f3cb580b62ba61519ceae40a379a628c95f2dd1f904aba4066a327f29252dd6b0be9635b1ede64c4c64f39f806189343860ed8aeee0d7317d774cefa09f86a418293afb234c382d52cd7522db9cbceb1a3242bbe9d924a0bd4cbd281848f14b0a39bfec3068d86ea9f48e2857f9bead8b284b92e2f2493984067edb41153e0ae428cc7b3086b7d95059afc0dc8ddea68a10d3f9f85bbb10618d4ca64ba5fb08bec11c6c20e78281fd14d568e19b37de57f26e65e8ce203bc5db74df4b1518167bafe01487d9c851012aab4cc11d0e3a53725426b45a70a95d9f6a1d3707c93bb95f0459f1d50f456d67f4ce0ce765847fb4a0b13f255857e29d57c1823bb14902842bd4751341b40f742e8d6103add51efa067fca95b4115f2c391a7b8bdafb02ddc794c1a80123a8d3d5a880a431465234cbe7cbfa9a3668c2b4f73a4c6597e7d96d1b10b7adee5ad9448f122b9b8b5ab768d1b53035aed8a96665684405768ab8f31303814aca5ec5ec8fcf7f181d505f538df151f97d2147d42fa31b1871a784bc660098ef99ba81e872ac3b9be265a393e01fd31d962bb3cfc6c90170329cf1b3df5409c01f0183ded52b6b7f701e21b5af70fe155bd143c844395a8e0783f2a55d17142ed66b9f0fa5f35b21580c6dbd76c909373c8e5e125abd44013f75f2aa0d441fed88e90851d07228be2c92113826237f5ce59bb368b08395b379aa5c7face710aef1a75671ab8eafd843bcd03c958c33831707c947cfd53881635097136682dcfd7947097fc9fd4b6198f3146fda8b120f7ff4dcca4e5a067b9fec213b42003820e8af241d961ef60e2157f53ea8800b0f28fc5a3c5156641de08e17a46" + "value_hex": "6e092b8b9a736a08825e73e0129445798ca5d385d3b918af9571dc8a61517d46000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100000000000000640c8cc35f4c2300a5c67c09609b8714a8bdf6339a82d37614e9d805869c530a5e7660f969839da4fb7771770d8e9437235fd2169a4511354cfa0b3c18596666000fdea77262f3e57e20483e9f3c5ad4f037efc716607f32a097ac2a73933e6a00abf5912b47417b0ff85575ec844c7b9b4d1ba820c056f183ddfdafd8e5961593061f4fdfa254166a8a23a8c9b42020e1e044cae6bcc165b443ab9c8b2d69042d5dab225bf7a3061d796ea4d394a03e80e3fe255e9992df418a109dda49b606a0e78ef05d0f2eeb87cac42b335e09ad5b9ec2f0e975cce939c981995d6bfd02aa7939b5ac220f15072747432b9a849de0aef1ad7bea8d57db8cc55892d88b7024366e33c805a36405e287a03193005c84a4723ec02a17c76d6a3bbfc4e8675412d77df01b9f9b31e560cd460799ef8fae2ea455a4863f5ad3dbb37d658de2352c375bb0a6b2278dbfa7045f5f1ca10a4bb7745a837c95c07ee41046916b720b48792a97e924de46075307c9a3d2b7b84897b30e487fd3db9d7c4fcd71c1d2302cd41dc981252ba93d0778e4f61cd24375d32921343c3bc2d7b156566cf435003a20585c1f6ad812ccf366a8ebcc49611adb7721a76389551fae1cff92550a1ea889afdf18bd09579692cb67ee044b39cdaf5194cde4a4466c55c66ce068327bb24a9e66d1dd18dddf87770c2c7355d43ee4b01bba40638b69b6f880f6e7f30640e37deaa61e37205b15ff411ea09528977c1037bd00736aded093b1ba009804dcea99d58ad234d2459e244b18eaa4d530ee4af699c8f5f098be4404cdfc4468fe547b8328209b3c080dd8a90c1b89b063589527b4957005e9012d51f2df625dd0b2479cdb6ec69a97efee4736fb2c308e28d930bf482fdc2b08a21a2c09a30e06eff51633d8c53f0d26274da3449c4828ae246c1bfa6d085cc0563affee" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -2145,7 +2145,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "188711ac7b46b168d13358ef1eaef4feebeaa6e54d50ced3dfaed7603aa0b91d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100000000000000c45fdbe02d3fda8ced4e4858a8903b674f9fd2fce269b6f8dcb162da307b4e7264ed89dde3105f31b7d73cfc7545b73a4074fa7fb8962ab7d16ac4f3cb580b62ba61519ceae40a379a628c95f2dd1f904aba4066a327f29252dd6b0be9635b1ede64c4c64f39f806189343860ed8aeee0d7317d774cefa09f86a418293afb234c382d52cd7522db9cbceb1a3242bbe9d924a0bd4cbd281848f14b0a39bfec3068d86ea9f48e2857f9bead8b284b92e2f2493984067edb41153e0ae428cc7b3086b7d95059afc0dc8ddea68a10d3f9f85bbb10618d4ca64ba5fb08bec11c6c20e78281fd14d568e19b37de57f26e65e8ce203bc5db74df4b1518167bafe01487d9c851012aab4cc11d0e3a53725426b45a70a95d9f6a1d3707c93bb95f0459f1d50f456d67f4ce0ce765847fb4a0b13f255857e29d57c1823bb14902842bd4751341b40f742e8d6103add51efa067fca95b4115f2c391a7b8bdafb02ddc794c1a80123a8d3d5a880a431465234cbe7cbfa9a3668c2b4f73a4c6597e7d96d1b10b7adee5ad9448f122b9b8b5ab768d1b53035aed8a96665684405768ab8f31303814aca5ec5ec8fcf7f181d505f538df151f97d2147d42fa31b1871a784bc660098ef99ba81e872ac3b9be265a393e01fd31d962bb3cfc6c90170329cf1b3df5409c01f0183ded52b6b7f701e21b5af70fe155bd143c844395a8e0783f2a55d17142ed66b9f0fa5f35b21580c6dbd76c909373c8e5e125abd44013f75f2aa0d441fed88e90851d07228be2c92113826237f5ce59bb368b08395b379aa5c7face710aef1a75671ab8eafd843bcd03c958c33831707c947cfd53881635097136682dcfd7947097fc9fd4b6198f3146fda8b120f7ff4dcca4e5a067b9fec213b42003820e8af241d961ef60e2157f53ea8800b0f28fc5a3c5156641de08e17a464209" + "value_hex": "6e092b8b9a736a08825e73e0129445798ca5d385d3b918af9571dc8a61517d46000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100000000000000640c8cc35f4c2300a5c67c09609b8714a8bdf6339a82d37614e9d805869c530a5e7660f969839da4fb7771770d8e9437235fd2169a4511354cfa0b3c18596666000fdea77262f3e57e20483e9f3c5ad4f037efc716607f32a097ac2a73933e6a00abf5912b47417b0ff85575ec844c7b9b4d1ba820c056f183ddfdafd8e5961593061f4fdfa254166a8a23a8c9b42020e1e044cae6bcc165b443ab9c8b2d69042d5dab225bf7a3061d796ea4d394a03e80e3fe255e9992df418a109dda49b606a0e78ef05d0f2eeb87cac42b335e09ad5b9ec2f0e975cce939c981995d6bfd02aa7939b5ac220f15072747432b9a849de0aef1ad7bea8d57db8cc55892d88b7024366e33c805a36405e287a03193005c84a4723ec02a17c76d6a3bbfc4e8675412d77df01b9f9b31e560cd460799ef8fae2ea455a4863f5ad3dbb37d658de2352c375bb0a6b2278dbfa7045f5f1ca10a4bb7745a837c95c07ee41046916b720b48792a97e924de46075307c9a3d2b7b84897b30e487fd3db9d7c4fcd71c1d2302cd41dc981252ba93d0778e4f61cd24375d32921343c3bc2d7b156566cf435003a20585c1f6ad812ccf366a8ebcc49611adb7721a76389551fae1cff92550a1ea889afdf18bd09579692cb67ee044b39cdaf5194cde4a4466c55c66ce068327bb24a9e66d1dd18dddf87770c2c7355d43ee4b01bba40638b69b6f880f6e7f30640e37deaa61e37205b15ff411ea09528977c1037bd00736aded093b1ba009804dcea99d58ad234d2459e244b18eaa4d530ee4af699c8f5f098be4404cdfc4468fe547b8328209b3c080dd8a90c1b89b063589527b4957005e9012d51f2df625dd0b2479cdb6ec69a97efee4736fb2c308e28d930bf482fdc2b08a21a2c09a30e06eff51633d8c53f0d26274da3449c4828ae246c1bfa6d085cc0563affee250f" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -2157,14 +2157,14 @@ "family": "withdraw_composite", "expected_valid": true, "payload": { - "equality_proof_data_hex": "40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c22013a79a452cf5af39c415bf56f1548c33d3e1023aee59af378bf47afab85e01708441927e3e6b63be38a1465c8cc63ea666306a1d3fb70cecec4e8b62d5465c000188711ac7b46b168d13358ef1eaef4feebeaa6e54d50ced3dfaed7603aa0b91d010000000000000030b30d9d4cf91579ac38361021b7f26f5aa5e814667356f8a959eb0aebec514aae9a173ab28deb39a919fcf818bf7db2f426ba9d68d26485bd37a9f21af8520914ac5b8522c4f1152101e1167824a522fdd768131e7c695dc7b09b0171512804c984ad636996341fd956bd700ef2fa605172922115d02f2559921d8541ebb40846e63e0667624366b21f5af2a11ef064e3f86cba8a653d49f946d58fa9b9980cda1ec85cf90e043325600e2b0efaeae8ad9d29d99d2f1018dbfddf37038de20e", - "range_proof_data_hex": "188711ac7b46b168d13358ef1eaef4feebeaa6e54d50ced3dfaed7603aa0b91d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100000000000000c45fdbe02d3fda8ced4e4858a8903b674f9fd2fce269b6f8dcb162da307b4e7264ed89dde3105f31b7d73cfc7545b73a4074fa7fb8962ab7d16ac4f3cb580b62ba61519ceae40a379a628c95f2dd1f904aba4066a327f29252dd6b0be9635b1ede64c4c64f39f806189343860ed8aeee0d7317d774cefa09f86a418293afb234c382d52cd7522db9cbceb1a3242bbe9d924a0bd4cbd281848f14b0a39bfec3068d86ea9f48e2857f9bead8b284b92e2f2493984067edb41153e0ae428cc7b3086b7d95059afc0dc8ddea68a10d3f9f85bbb10618d4ca64ba5fb08bec11c6c20e78281fd14d568e19b37de57f26e65e8ce203bc5db74df4b1518167bafe01487d9c851012aab4cc11d0e3a53725426b45a70a95d9f6a1d3707c93bb95f0459f1d50f456d67f4ce0ce765847fb4a0b13f255857e29d57c1823bb14902842bd4751341b40f742e8d6103add51efa067fca95b4115f2c391a7b8bdafb02ddc794c1a80123a8d3d5a880a431465234cbe7cbfa9a3668c2b4f73a4c6597e7d96d1b10b7adee5ad9448f122b9b8b5ab768d1b53035aed8a96665684405768ab8f31303814aca5ec5ec8fcf7f181d505f538df151f97d2147d42fa31b1871a784bc660098ef99ba81e872ac3b9be265a393e01fd31d962bb3cfc6c90170329cf1b3df5409c01f0183ded52b6b7f701e21b5af70fe155bd143c844395a8e0783f2a55d17142ed66b9f0fa5f35b21580c6dbd76c909373c8e5e125abd44013f75f2aa0d441fed88e90851d07228be2c92113826237f5ce59bb368b08395b379aa5c7face710aef1a75671ab8eafd843bcd03c958c33831707c947cfd53881635097136682dcfd7947097fc9fd4b6198f3146fda8b120f7ff4dcca4e5a067b9fec213b42003820e8af241d961ef60e2157f53ea8800b0f28fc5a3c5156641de08e17a464208" + "equality_proof_data_hex": "367592922b37fa321fc37bc38bf434685507162e731982c1b188fba562ae3472aa2182abeeeb9c34b64ada2d0ea0e81122f816c8a62240fad513f8ef657a94216a12a8571e4074ec3c06d10b4ea4470124a0e796955a3400b0df060b3a45f45fd8e81fe4f2befc4bf0d255587feb3bb3f14dedf35220b5c3b0a6e0810cfbf54c0100000000000000bcb772dbd1e9292e650582c4b56fad3a4a6a7bb02b876b6a9d28bdd51cbf2030564f8c02f2f0dfaf1d23bc5ae5f2755812a168d0afed0b6ea09a9b813b802c58ca2e143d45ad35b61e0070bc097b030688cc39d94824049486c28ce93c723c425f98e7d0a3512fa2c41aea836d731a5a93068354fcd65fdc4c99a8ab6badb40d744530a359adb2a272e31e71e62d8a0157e0794a7afa316f9fd6316106a5af02165dd49f3a2a6a2bb50e59c9a6530973c6120722e819cfa0619fc1a2a947bb05", + "range_proof_data_hex": "d8e81fe4f2befc4bf0d255587feb3bb3f14dedf35220b5c3b0a6e0810cfbf54c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100000000000000b834a205de28bc0e6a37556d98848c9a21b0461d3b8393e44a99b78e3588dd40fe8ccd851be668441160b15b933687af734ef62e96d28e42bc2bd42630e85f5c82ea222c0e66cacf833ceadda3badffe94bc46f78791fff80d806365a3553c15a460fd47401cb117fb274b6b0688f6d3f6d68bfa35245bd94d3f881f68735a67cf1e22fdc718a4895d9442cb33d5c95b7f57f3712298a4422ac14f83afff2d04d144980a5e567e7080eddad322e68400036eff8b0bd8f534a3d253e93f2a870aad5feef13d73a5858f8172b8264b93aef50065a7296befaca7ec4b46cfcea5087c87cfbb6869b776f8667c17dfa2e830a2ddeb7ae1efeea7584ff6107f98d22ac6feb8097010954c18a13a189bd80c22b16212f8ce2acf1b3f129ffbc7528d11cce9a836a0d0fb33fdc6ecb04be808d2adf9ae21f993155198b3f41a9379012d429484df66352cfd3d04886984441713dde96583a6540f86990fd56e6545f317c0b08b0e4e7034ce049fa3bb273ca7d304b86d6322f69e4a633544d361d5e20cbeef8e552f5c5eabf50db385e078b734910b31051816b7921025138a04d0d406a0602cdde53b78e0cf8d9e82321e1a83c5b120a66ff40abd11fdbbf3b60ad77fec7af53f83bf73523d34d571b8e3921ea51d376f83c5337334fc5263e7bdd916e06facd3d196bc1d80e9553d933ea90261fda6fb7e51e84d5cbf3cb74c32b53b7847cca8fbc4ad46ac8759141ee8aa540f460fa8115e03bced00f384f1791f4b8028c9e64ce24858ee68d11775484d5cc9d1e755474c981aab5b133d59cb7d32ace9c0ac2d5ee84f34bb01060e262d8e4b16b49b4c42ffce52714a1952fff3038529dc836f04c0d6e0139ba8ed679efac6fc57fc4cb5567c26185c556991e20b202232a11ad89515fe55089ac3d378f000888d8a08fce1b6e7557f2b0180700f" }, "binding": { - "ciphertext_commitment_hex": "3a79a452cf5af39c415bf56f1548c33d3e1023aee59af378bf47afab85e01708", - "ciphertext_handle_hex": "441927e3e6b63be38a1465c8cc63ea666306a1d3fb70cecec4e8b62d5465c000", + "ciphertext_commitment_hex": "aa2182abeeeb9c34b64ada2d0ea0e81122f816c8a62240fad513f8ef657a9421", + "ciphertext_handle_hex": "6a12a8571e4074ec3c06d10b4ea4470124a0e796955a3400b0df060b3a45f45f", "expected_nonce_u64": 1, - "user_pubkey_hex": "40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c2201" + "user_pubkey_hex": "367592922b37fa321fc37bc38bf434685507162e731982c1b188fba562ae3472" }, "mutations": [ { @@ -2192,7 +2192,7 @@ "op": "bitflip", "target": "binding.user_pubkey_hex", "params": { - "value_hex": "41b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c2201" + "value_hex": "377592922b37fa321fc37bc38bf434685507162e731982c1b188fba562ae3472" }, "expected_valid": false, "expected_error_contains": "failed" @@ -2202,7 +2202,7 @@ "op": "truncate", "target": "payload.equality_proof_data_hex", "params": { - "value_hex": "40b7e02d4017ef609f33aa0c798c15eab7b2855bcb1c1dd8f84ecf5cfc5c22013a79a452cf5af39c415bf56f1548c33d3e1023aee59af378bf47afab85e01708441927e3e6b63be38a1465c8cc63ea666306a1d3fb70cecec4e8b62d5465c000188711ac7b46b168d13358ef1eaef4feebeaa6e54d50ced3dfaed7603aa0b91d010000000000000030b30d9d4cf91579ac38361021b7f26f5aa5e814667356f8a959eb0aebec514aae9a173ab28deb39a919fcf818bf7db2f426ba9d68d26485bd37a9f21af8520914ac5b8522c4f1152101e1167824a522fdd768131e7c695dc7b09b0171512804c984ad636996341fd956bd700ef2fa605172922115d02f2559921d8541ebb40846e63e0667624366b21f5af2a11ef064e3f86cba8a653d49f946d58fa9b9980cda1ec85cf90e043325600e2b0efaeae8ad9d29d99d2f1018dbfddf37038d" + "value_hex": "367592922b37fa321fc37bc38bf434685507162e731982c1b188fba562ae3472aa2182abeeeb9c34b64ada2d0ea0e81122f816c8a62240fad513f8ef657a94216a12a8571e4074ec3c06d10b4ea4470124a0e796955a3400b0df060b3a45f45fd8e81fe4f2befc4bf0d255587feb3bb3f14dedf35220b5c3b0a6e0810cfbf54c0100000000000000bcb772dbd1e9292e650582c4b56fad3a4a6a7bb02b876b6a9d28bdd51cbf2030564f8c02f2f0dfaf1d23bc5ae5f2755812a168d0afed0b6ea09a9b813b802c58ca2e143d45ad35b61e0070bc097b030688cc39d94824049486c28ce93c723c425f98e7d0a3512fa2c41aea836d731a5a93068354fcd65fdc4c99a8ab6badb40d744530a359adb2a272e31e71e62d8a0157e0794a7afa316f9fd6316106a5af02165dd49f3a2a6a2bb50e59c9a6530973c6120722e819cfa0619fc1a2a947" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -2224,7 +2224,7 @@ "family": "withdraw_range", "expected_valid": true, "payload": { - "proof_data_hex": "d64cb89601298f7e092b751c0f61d23b21f213d42d6e1133dc8b34ecc07c827f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000200000000000000447231f6eee415d8f5028e81a963d7efd7fd2c9a3f3f8d0a88b23b0cb1e76d2f0a837ffa68833f77fe9ea48d9cd6b14d84b5ab7f19e46c61e85beb306a98b92ec29ed01998f4752925f9d3a1af774bdbe9abe92e82c6fe01957c72ea001f382432196742dd0e6027522a66b5bb233bcc22aa2e5b5dfc38898da0100be728d54173768725f33325e6dde51c257922fd5120db6ed42ee8e394eca301721ded3409d22090e9ef6c8df933b8839687e68a9dd39230aed5c2a7eb4082498d58e5c50bf5430120a17162ccce70d717ce8914203a483150463961e480254c768607680f9642152bee91cac05c3f2d56cb6d41460d58b18440d1be319e065f3aee1c6873781cabe1c57dadbbe5f906e3a574d33c76c1fb24b96efa8335a486023fd8fd63f072257064dce7f3db251744e59b94ac06e135aee59dcfc9802a0e7ffea77f12820d7f6e60318ff49e2a9501062b93c580bb09116e22a2d74ea3e4b7ac14fb041c8d2271da4953b088a351da93c435c1b1b3efdc11fa95636316ccad3aeed1450467b4d20240aec8377fce0d9c9200527efdffef25cac65d9dc15dc237e1391fc8d2b7feacf23ac90c6bdba9edef35513dca897543a338fe6e462bc793cc165f103f2630c8a32016f114980a50629c7d5548ae56d36b093811dccb4e8034b8666e25a2a7db74843e8a477dc0b2c65587ad854f556424c18d580a8842455a183deeb5915b2f4ea649b4bde12c9413b061f3234b69455651b5cb43088cf825d6398abdfca0c332b9708bac53618b65609ad18096f409329777034424c1e429cf65d898b6cdb035a9a5057c11739cbca9bb576fda1f16134cac615e701bbc453146e7d5d799bf88dd50d951ee859115fd358525c388d67b27080a03c3f13bd09f07dd07afc27507932abc82c96c2c8e76ad82217c91f9b06abe8142a1631ce07f03" + "proof_data_hex": "30003c078bd0796f95390bafbbd26104608d105a72cd23881bc7eef5348df608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000200000000000000901322ffcc178d0016e1ebcd9cea3264c3510c9758c9f8c0a19ee8796903226e028ab8e3f37bc5251a4fb8459954cb45bf7c0299915b62c37c15c94c27dc9e5092308758d06632f4010f533a5db1e0efaf6b7876af8bc08a7f86c7f96bfcf11e64d998e1537c79dfe2518130fee7b52dd96f053a438efe0df983bd1a1f65963343c4fe121ba884fa6a20c5a412b3e3abd784d82cb71c86b2846f5e79bbb52306bb7f9286221a277da7e16c6ea18c7d2cfd6b9e9e202694cb1d5f0e4ff582b60156215105d14c5b2c21bf1c09a6d2dca3e416a1eec62d2c6a6dce5bbcd5de5c067ed27b926636ec32245099dfb50476a0f5a50b29d39fad3ce11cffa53d03e1064c041959638b9841d320e29e274653697c32222916b6ff8228849e00edcaa9614a5bc5dc949ffa5b452ecf1fcf8ba79011090f098b367989f0c9cd37f6b2c15e68cae89efbb257a2598a91c64f0b21e66e43712b6bc508529c256538fc8ac862068150ea718109362f928311b46e733820b3244de6520160d29b71a371324d54aa4d24c54c743ba9d2abef147fa9c9b8b2a35c3f0b2898b22477e8f8aaa3255b3ccd606f0321d13ff2b5ff8be10da169ece9238295e5a6c33dff327b239b4c2de43fd59899a81df36b741909657bcc41c2a88fc1fc4db38a029aed73e732e6286cf3bb27d1c4188ed4845015d88b4212218df14086efa8d52932761a58bcca1e16776ecb9e820bc9004244f367b86aa2a01821b8da2b881340cfc7c624bbf5551216065fc3b0d73f751269e5c102d9cbc570793b6696f7826ffa5eb26f994757e8fe8567d258c10627bffd8d9ac60e752ef58a99185578d3572a4703444c3c019e670da9e8649b86efa341326f52d28921f483d58fab53b162d5ee592b333608898ba91a77428a1bfb24db8b37ff416174abbd95d1d040b7082c3b542aeeea0d" }, "mutations": [ { @@ -2232,7 +2232,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "d74cb89601298f7e092b751c0f61d23b21f213d42d6e1133dc8b34ecc07c827f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000200000000000000447231f6eee415d8f5028e81a963d7efd7fd2c9a3f3f8d0a88b23b0cb1e76d2f0a837ffa68833f77fe9ea48d9cd6b14d84b5ab7f19e46c61e85beb306a98b92ec29ed01998f4752925f9d3a1af774bdbe9abe92e82c6fe01957c72ea001f382432196742dd0e6027522a66b5bb233bcc22aa2e5b5dfc38898da0100be728d54173768725f33325e6dde51c257922fd5120db6ed42ee8e394eca301721ded3409d22090e9ef6c8df933b8839687e68a9dd39230aed5c2a7eb4082498d58e5c50bf5430120a17162ccce70d717ce8914203a483150463961e480254c768607680f9642152bee91cac05c3f2d56cb6d41460d58b18440d1be319e065f3aee1c6873781cabe1c57dadbbe5f906e3a574d33c76c1fb24b96efa8335a486023fd8fd63f072257064dce7f3db251744e59b94ac06e135aee59dcfc9802a0e7ffea77f12820d7f6e60318ff49e2a9501062b93c580bb09116e22a2d74ea3e4b7ac14fb041c8d2271da4953b088a351da93c435c1b1b3efdc11fa95636316ccad3aeed1450467b4d20240aec8377fce0d9c9200527efdffef25cac65d9dc15dc237e1391fc8d2b7feacf23ac90c6bdba9edef35513dca897543a338fe6e462bc793cc165f103f2630c8a32016f114980a50629c7d5548ae56d36b093811dccb4e8034b8666e25a2a7db74843e8a477dc0b2c65587ad854f556424c18d580a8842455a183deeb5915b2f4ea649b4bde12c9413b061f3234b69455651b5cb43088cf825d6398abdfca0c332b9708bac53618b65609ad18096f409329777034424c1e429cf65d898b6cdb035a9a5057c11739cbca9bb576fda1f16134cac615e701bbc453146e7d5d799bf88dd50d951ee859115fd358525c388d67b27080a03c3f13bd09f07dd07afc27507932abc82c96c2c8e76ad82217c91f9b06abe8142a1631ce07f03" + "value_hex": "31003c078bd0796f95390bafbbd26104608d105a72cd23881bc7eef5348df608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000200000000000000901322ffcc178d0016e1ebcd9cea3264c3510c9758c9f8c0a19ee8796903226e028ab8e3f37bc5251a4fb8459954cb45bf7c0299915b62c37c15c94c27dc9e5092308758d06632f4010f533a5db1e0efaf6b7876af8bc08a7f86c7f96bfcf11e64d998e1537c79dfe2518130fee7b52dd96f053a438efe0df983bd1a1f65963343c4fe121ba884fa6a20c5a412b3e3abd784d82cb71c86b2846f5e79bbb52306bb7f9286221a277da7e16c6ea18c7d2cfd6b9e9e202694cb1d5f0e4ff582b60156215105d14c5b2c21bf1c09a6d2dca3e416a1eec62d2c6a6dce5bbcd5de5c067ed27b926636ec32245099dfb50476a0f5a50b29d39fad3ce11cffa53d03e1064c041959638b9841d320e29e274653697c32222916b6ff8228849e00edcaa9614a5bc5dc949ffa5b452ecf1fcf8ba79011090f098b367989f0c9cd37f6b2c15e68cae89efbb257a2598a91c64f0b21e66e43712b6bc508529c256538fc8ac862068150ea718109362f928311b46e733820b3244de6520160d29b71a371324d54aa4d24c54c743ba9d2abef147fa9c9b8b2a35c3f0b2898b22477e8f8aaa3255b3ccd606f0321d13ff2b5ff8be10da169ece9238295e5a6c33dff327b239b4c2de43fd59899a81df36b741909657bcc41c2a88fc1fc4db38a029aed73e732e6286cf3bb27d1c4188ed4845015d88b4212218df14086efa8d52932761a58bcca1e16776ecb9e820bc9004244f367b86aa2a01821b8da2b881340cfc7c624bbf5551216065fc3b0d73f751269e5c102d9cbc570793b6696f7826ffa5eb26f994757e8fe8567d258c10627bffd8d9ac60e752ef58a99185578d3572a4703444c3c019e670da9e8649b86efa341326f52d28921f483d58fab53b162d5ee592b333608898ba91a77428a1bfb24db8b37ff416174abbd95d1d040b7082c3b542aeeea0d" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -2242,7 +2242,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "d64cb89601298f7e092b751c0f61d23b21f213d42d6e1133dc8b34ecc07c827f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000200000000000000447231f6eee415d8f5028e81a963d7efd7fd2c9a3f3f8d0a88b23b0cb1e76d2f0a837ffa68833f77fe9ea48d9cd6b14d84b5ab7f19e46c61e85beb306a98b92ec29ed01998f4752925f9d3a1af774bdbe9abe92e82c6fe01957c72ea001f382432196742dd0e6027522a66b5bb233bcc22aa2e5b5dfc38898da0100be728d54173768725f33325e6dde51c257922fd5120db6ed42ee8e394eca301721ded3409d22090e9ef6c8df933b8839687e68a9dd39230aed5c2a7eb4082498d58e5c50bf5430120a17162ccce70d717ce8914203a483150463961e480254c768607680f9642152bee91cac05c3f2d56cb6d41460d58b18440d1be319e065f3aee1c6873781cabe1c57dadbbe5f906e3a574d33c76c1fb24b96efa8335a486023fd8fd63f072257064dce7f3db251744e59b94ac06e135aee59dcfc9802a0e7ffea77f12820d7f6e60318ff49e2a9501062b93c580bb09116e22a2d74ea3e4b7ac14fb041c8d2271da4953b088a351da93c435c1b1b3efdc11fa95636316ccad3aeed1450467b4d20240aec8377fce0d9c9200527efdffef25cac65d9dc15dc237e1391fc8d2b7feacf23ac90c6bdba9edef35513dca897543a338fe6e462bc793cc165f103f2630c8a32016f114980a50629c7d5548ae56d36b093811dccb4e8034b8666e25a2a7db74843e8a477dc0b2c65587ad854f556424c18d580a8842455a183deeb5915b2f4ea649b4bde12c9413b061f3234b69455651b5cb43088cf825d6398abdfca0c332b9708bac53618b65609ad18096f409329777034424c1e429cf65d898b6cdb035a9a5057c11739cbca9bb576fda1f16134cac615e701bbc453146e7d5d799bf88dd50d951ee859115fd358525c388d67b27080a03c3f13bd09f07dd07afc27507932abc82c96c2c8e76ad82217c91f9b06abe8142a1631ce0" + "value_hex": "30003c078bd0796f95390bafbbd26104608d105a72cd23881bc7eef5348df608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000200000000000000901322ffcc178d0016e1ebcd9cea3264c3510c9758c9f8c0a19ee8796903226e028ab8e3f37bc5251a4fb8459954cb45bf7c0299915b62c37c15c94c27dc9e5092308758d06632f4010f533a5db1e0efaf6b7876af8bc08a7f86c7f96bfcf11e64d998e1537c79dfe2518130fee7b52dd96f053a438efe0df983bd1a1f65963343c4fe121ba884fa6a20c5a412b3e3abd784d82cb71c86b2846f5e79bbb52306bb7f9286221a277da7e16c6ea18c7d2cfd6b9e9e202694cb1d5f0e4ff582b60156215105d14c5b2c21bf1c09a6d2dca3e416a1eec62d2c6a6dce5bbcd5de5c067ed27b926636ec32245099dfb50476a0f5a50b29d39fad3ce11cffa53d03e1064c041959638b9841d320e29e274653697c32222916b6ff8228849e00edcaa9614a5bc5dc949ffa5b452ecf1fcf8ba79011090f098b367989f0c9cd37f6b2c15e68cae89efbb257a2598a91c64f0b21e66e43712b6bc508529c256538fc8ac862068150ea718109362f928311b46e733820b3244de6520160d29b71a371324d54aa4d24c54c743ba9d2abef147fa9c9b8b2a35c3f0b2898b22477e8f8aaa3255b3ccd606f0321d13ff2b5ff8be10da169ece9238295e5a6c33dff327b239b4c2de43fd59899a81df36b741909657bcc41c2a88fc1fc4db38a029aed73e732e6286cf3bb27d1c4188ed4845015d88b4212218df14086efa8d52932761a58bcca1e16776ecb9e820bc9004244f367b86aa2a01821b8da2b881340cfc7c624bbf5551216065fc3b0d73f751269e5c102d9cbc570793b6696f7826ffa5eb26f994757e8fe8567d258c10627bffd8d9ac60e752ef58a99185578d3572a4703444c3c019e670da9e8649b86efa341326f52d28921f483d58fab53b162d5ee592b333608898ba91a77428a1bfb24db8b37ff416174abbd95d1d040b7082c3b542aee" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -2262,7 +2262,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "d64cb89601298f7e092b751c0f61d23b21f213d42d6e1133dc8b34ecc07c827f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000200000000000000447231f6eee415d8f5028e81a963d7efd7fd2c9a3f3f8d0a88b23b0cb1e76d2f0a837ffa68833f77fe9ea48d9cd6b14d84b5ab7f19e46c61e85beb306a98b92ec29ed01998f4752925f9d3a1af774bdbe9abe92e82c6fe01957c72ea001f382432196742dd0e6027522a66b5bb233bcc22aa2e5b5dfc38898da0100be728d54173768725f33325e6dde51c257922fd5120db6ed42ee8e394eca301721ded3409d22090e9ef6c8df933b8839687e68a9dd39230aed5c2a7eb4082498d58e5c50bf5430120a17162ccce70d717ce8914203a483150463961e480254c768607680f9642152bee91cac05c3f2d56cb6d41460d58b18440d1be319e065f3aee1c6873781cabe1c57dadbbe5f906e3a574d33c76c1fb24b96efa8335a486023fd8fd63f072257064dce7f3db251744e59b94ac06e135aee59dcfc9802a0e7ffea77f12820d7f6e60318ff49e2a9501062b93c580bb09116e22a2d74ea3e4b7ac14fb041c8d2271da4953b088a351da93c435c1b1b3efdc11fa95636316ccad3aeed1450467b4d20240aec8377fce0d9c9200527efdffef25cac65d9dc15dc237e1391fc8d2b7feacf23ac90c6bdba9edef35513dca897543a338fe6e462bc793cc165f103f2630c8a32016f114980a50629c7d5548ae56d36b093811dccb4e8034b8666e25a2a7db74843e8a477dc0b2c65587ad854f556424c18d580a8842455a183deeb5915b2f4ea649b4bde12c9413b061f3234b69455651b5cb43088cf825d6398abdfca0c332b9708bac53618b65609ad18096f409329777034424c1e429cf65d898b6cdb035a9a5057c11739cbca9bb576fda1f16134cac615e701bbc453146e7d5d799bf88dd50d951ee859115fd358525c388d67b27080a03c3f13bd09f07dd07afc27507932abc82c96c2c8e76ad82217c91f9b06abe8142a1631ce07f02" + "value_hex": "30003c078bd0796f95390bafbbd26104608d105a72cd23881bc7eef5348df608000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000200000000000000901322ffcc178d0016e1ebcd9cea3264c3510c9758c9f8c0a19ee8796903226e028ab8e3f37bc5251a4fb8459954cb45bf7c0299915b62c37c15c94c27dc9e5092308758d06632f4010f533a5db1e0efaf6b7876af8bc08a7f86c7f96bfcf11e64d998e1537c79dfe2518130fee7b52dd96f053a438efe0df983bd1a1f65963343c4fe121ba884fa6a20c5a412b3e3abd784d82cb71c86b2846f5e79bbb52306bb7f9286221a277da7e16c6ea18c7d2cfd6b9e9e202694cb1d5f0e4ff582b60156215105d14c5b2c21bf1c09a6d2dca3e416a1eec62d2c6a6dce5bbcd5de5c067ed27b926636ec32245099dfb50476a0f5a50b29d39fad3ce11cffa53d03e1064c041959638b9841d320e29e274653697c32222916b6ff8228849e00edcaa9614a5bc5dc949ffa5b452ecf1fcf8ba79011090f098b367989f0c9cd37f6b2c15e68cae89efbb257a2598a91c64f0b21e66e43712b6bc508529c256538fc8ac862068150ea718109362f928311b46e733820b3244de6520160d29b71a371324d54aa4d24c54c743ba9d2abef147fa9c9b8b2a35c3f0b2898b22477e8f8aaa3255b3ccd606f0321d13ff2b5ff8be10da169ece9238295e5a6c33dff327b239b4c2de43fd59899a81df36b741909657bcc41c2a88fc1fc4db38a029aed73e732e6286cf3bb27d1c4188ed4845015d88b4212218df14086efa8d52932761a58bcca1e16776ecb9e820bc9004244f367b86aa2a01821b8da2b881340cfc7c624bbf5551216065fc3b0d73f751269e5c102d9cbc570793b6696f7826ffa5eb26f994757e8fe8567d258c10627bffd8d9ac60e752ef58a99185578d3572a4703444c3c019e670da9e8649b86efa341326f52d28921f483d58fab53b162d5ee592b333608898ba91a77428a1bfb24db8b37ff416174abbd95d1d040b7082c3b542aeeea0c" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -2274,14 +2274,14 @@ "family": "withdraw_composite", "expected_valid": true, "payload": { - "equality_proof_data_hex": "1ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c66784241e094a7db00b615ef236719fa2160f2ccef7dda4a3920420c995741356416b65de908173d7c5d2ba81768e269d40fa9a01f1256ac7c848e096a98a8a7625924ad64cb89601298f7e092b751c0f61d23b21f213d42d6e1133dc8b34ecc07c827f02000000000000005689226d58a399c78c5339f062f51d6958016c9ff4304278f97bf7467181a10ff8c25fb2898aeea28140f35fab658f69a294da06176b9ca3b42975180103cc51eef9862c8d6dc93747d9e2ebe80dfb9f31f77da9cc39e1549aeffdb797d948557ca8c4c0c37439a00803c5a39c859ce7e2851a78f828d2f05cf8c6b0df781a0477d60a6ee42bfac196f9c2be65629f831a7dd3980d495d51c3a7c9150c6ded04f1e0200c4a4f950ad1739fbf7a65cc0324aeffe49a637baa310a4e221be73b09", - "range_proof_data_hex": "d64cb89601298f7e092b751c0f61d23b21f213d42d6e1133dc8b34ecc07c827f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000200000000000000447231f6eee415d8f5028e81a963d7efd7fd2c9a3f3f8d0a88b23b0cb1e76d2f0a837ffa68833f77fe9ea48d9cd6b14d84b5ab7f19e46c61e85beb306a98b92ec29ed01998f4752925f9d3a1af774bdbe9abe92e82c6fe01957c72ea001f382432196742dd0e6027522a66b5bb233bcc22aa2e5b5dfc38898da0100be728d54173768725f33325e6dde51c257922fd5120db6ed42ee8e394eca301721ded3409d22090e9ef6c8df933b8839687e68a9dd39230aed5c2a7eb4082498d58e5c50bf5430120a17162ccce70d717ce8914203a483150463961e480254c768607680f9642152bee91cac05c3f2d56cb6d41460d58b18440d1be319e065f3aee1c6873781cabe1c57dadbbe5f906e3a574d33c76c1fb24b96efa8335a486023fd8fd63f072257064dce7f3db251744e59b94ac06e135aee59dcfc9802a0e7ffea77f12820d7f6e60318ff49e2a9501062b93c580bb09116e22a2d74ea3e4b7ac14fb041c8d2271da4953b088a351da93c435c1b1b3efdc11fa95636316ccad3aeed1450467b4d20240aec8377fce0d9c9200527efdffef25cac65d9dc15dc237e1391fc8d2b7feacf23ac90c6bdba9edef35513dca897543a338fe6e462bc793cc165f103f2630c8a32016f114980a50629c7d5548ae56d36b093811dccb4e8034b8666e25a2a7db74843e8a477dc0b2c65587ad854f556424c18d580a8842455a183deeb5915b2f4ea649b4bde12c9413b061f3234b69455651b5cb43088cf825d6398abdfca0c332b9708bac53618b65609ad18096f409329777034424c1e429cf65d898b6cdb035a9a5057c11739cbca9bb576fda1f16134cac615e701bbc453146e7d5d799bf88dd50d951ee859115fd358525c388d67b27080a03c3f13bd09f07dd07afc27507932abc82c96c2c8e76ad82217c91f9b06abe8142a1631ce07f03" + "equality_proof_data_hex": "9446fe67f5a6f4c607a9aff001fc39dba92ce6174ad9f219b07dcf312f672a7a8aaf81e2c571336f95d42b2b0da6759a71c4e1e97df825a3158668310e87b5632e8f460ba8939242a4fc1e064b379ef678e49164ff0208724f0707ac8457a364faa8fbde851fef8cca84da97595f03fe512f8103d7a31f21804141891c2ed0560200000000000000029ea267b83a524f3b911082945d22a3dc1d76ef5358e5f11d9b09a28ffc130a2a4ff8a8b1ec41405e4a3c0674acf954d62723c753d230397a555f6c5667c971ba24247206bd50cf22b7a9c4f04ab34610c5d4bc77d48b5ac9435aad555e493687a3e74684736ac36aa97e5dce372ae75119fa3d4a3d835d8efb0b4a5eeb9d06a22a6e52183d59760a6853e13b5e6eab4424c55481c1847ed90ca30a9d1ae604eb54105aa732780779c84aee2ab4d765e96918eb6819a5d5df7d9a26c14caa07", + "range_proof_data_hex": "faa8fbde851fef8cca84da97595f03fe512f8103d7a31f21804141891c2ed056000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000200000000000000d22dc7298efeec983a2a0e625502379e77553c13340002ca1ff845697258ac2518b38d450be4995407864be50af7f391e5080cf4f606a3765922803d52c57950c023a0229e73a8db5966dee6697f07963478b2345dde17568a58d89288ac840ca03b1ac2bf2030fb41a8a15fc33ac491830fedd879818f0b9efaa1663f256b3dc212a47d1e2fd5342cb836711077bb81dd20a948fe24000b8fe0da80452623045a3d3a95ec0d50175eb07fa6cbe5f59dafd4991c2238aa4ba0f848db0fbff2062879b9722d1a730df08bfbb0a62dc7110a61c8a32247445271ec47dd62b0fe0950169982db92663af2a79879770cf3b5a4f26b871d342f03bd542a157e20bd498ae3482f5f207924df5c96d5d8594e26c60d4c596ce86d60a9fa7b83aa1c1d21de2c89db57f0adfb86bd2435e4df5e2c274fc86853b53930a80562a584acb46178184f4cac275bdd020e0de420787c533c495ad5cec6074c0386b27493a5754b5c0cefd99f08b36ad21b841eebbfb1059b8dd8d56ed917c5336807d496161d3fe0ee559857d5bbc590bf3d6e1ec688a7a065277355e449c1ba0b63d18ef116705ac272dd7762080f1beb25f980027b16c69e589a98b51c86e8cdacf275852e2fe85aff55a24c519ce13ac668850025598d947cfe17ddc921f4056ea10d10235d2ebe43d075b244f2a88ef0d1f40515c27d89b98acd389033d337b5e6ce29ea6ff425812c37df880456255def90b0596112cecee612f60b5ff7af8601a85cfa0c4268ec44e29469b342bca3b975d526a1e88c320a2d46553f047b263edfda3106f455ada4e26203c6fb0b09a4f533cc6f4130fcfb728a54e57615acaef8f86b5b2699e40e3636d51393b20cdc82ae866d945c67700c239ae8c32ade21672fdf007a739851e644993651ee480d8b94e0c5e5b86621e983c24bf07a761ec3765302" }, "binding": { - "ciphertext_commitment_hex": "1e094a7db00b615ef236719fa2160f2ccef7dda4a3920420c995741356416b65", - "ciphertext_handle_hex": "de908173d7c5d2ba81768e269d40fa9a01f1256ac7c848e096a98a8a7625924a", + "ciphertext_commitment_hex": "8aaf81e2c571336f95d42b2b0da6759a71c4e1e97df825a3158668310e87b563", + "ciphertext_handle_hex": "2e8f460ba8939242a4fc1e064b379ef678e49164ff0208724f0707ac8457a364", "expected_nonce_u64": 2, - "user_pubkey_hex": "1ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c6678424" + "user_pubkey_hex": "9446fe67f5a6f4c607a9aff001fc39dba92ce6174ad9f219b07dcf312f672a7a" }, "mutations": [ { @@ -2309,7 +2309,7 @@ "op": "bitflip", "target": "binding.user_pubkey_hex", "params": { - "value_hex": "1bda8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c6678424" + "value_hex": "9546fe67f5a6f4c607a9aff001fc39dba92ce6174ad9f219b07dcf312f672a7a" }, "expected_valid": false, "expected_error_contains": "failed" @@ -2319,7 +2319,7 @@ "op": "truncate", "target": "payload.equality_proof_data_hex", "params": { - "value_hex": "1ada8c7aa518bf8402bf8cfea951d0d13c04b27921501dea86bb1fa4c66784241e094a7db00b615ef236719fa2160f2ccef7dda4a3920420c995741356416b65de908173d7c5d2ba81768e269d40fa9a01f1256ac7c848e096a98a8a7625924ad64cb89601298f7e092b751c0f61d23b21f213d42d6e1133dc8b34ecc07c827f02000000000000005689226d58a399c78c5339f062f51d6958016c9ff4304278f97bf7467181a10ff8c25fb2898aeea28140f35fab658f69a294da06176b9ca3b42975180103cc51eef9862c8d6dc93747d9e2ebe80dfb9f31f77da9cc39e1549aeffdb797d948557ca8c4c0c37439a00803c5a39c859ce7e2851a78f828d2f05cf8c6b0df781a0477d60a6ee42bfac196f9c2be65629f831a7dd3980d495d51c3a7c9150c6ded04f1e0200c4a4f950ad1739fbf7a65cc0324aeffe49a637baa310a4e221be7" + "value_hex": "9446fe67f5a6f4c607a9aff001fc39dba92ce6174ad9f219b07dcf312f672a7a8aaf81e2c571336f95d42b2b0da6759a71c4e1e97df825a3158668310e87b5632e8f460ba8939242a4fc1e064b379ef678e49164ff0208724f0707ac8457a364faa8fbde851fef8cca84da97595f03fe512f8103d7a31f21804141891c2ed0560200000000000000029ea267b83a524f3b911082945d22a3dc1d76ef5358e5f11d9b09a28ffc130a2a4ff8a8b1ec41405e4a3c0674acf954d62723c753d230397a555f6c5667c971ba24247206bd50cf22b7a9c4f04ab34610c5d4bc77d48b5ac9435aad555e493687a3e74684736ac36aa97e5dce372ae75119fa3d4a3d835d8efb0b4a5eeb9d06a22a6e52183d59760a6853e13b5e6eab4424c55481c1847ed90ca30a9d1ae604eb54105aa732780779c84aee2ab4d765e96918eb6819a5d5df7d9a26c14c" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -2341,7 +2341,7 @@ "family": "withdraw_range", "expected_valid": true, "payload": { - "proof_data_hex": "fc8d266cab7e55456039be7dbc582f24d057dc5b2461c419acd51c0ea640ae5a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000500000000000000bc102d03d79b52619082709e593ee099b0c668fad0b7927deb993c7138f90b48d457239a4047f3564fd4937894b91656aac5d4fd16b473faeeb641f1633e6f0c36cb68fa648bc5b09783f777586c78a76c9c3eb48a5455b607e737d2a08433011aff5f2f003a8170545fe4deb3944d2e3f1f6524b82f8de212960fb9e7ca3058f4860390b8d00e2b71feb38a3f66dd96ca1d8a68adf28c410bfc4b564da8920a52908bdbed3ef763696da10e68e911fc79891b5d85adb8b967d6b76b27a7d70381e9352fc35f8253403d19d0458f965142537e141b26036e77afbf6c45fba40aac2b3d763a85c28ae88a58a0ed2abb1ca1712af474baef9924252ab1d5899e0718a66f04096f54ca8e2b0956026e5d7c06bb241a813838d00bbde71b6129744420074708fe35b028c55214fcb63d9b5d9b416bbd709705d3578bd26cf8e0b9362ececb8bda766c7158eb1374e52b163206f73c4071b99e8521dbd6c5a7c36c050e6a41ecd15ad46f14e26285090393cc991b55be3e0b930903aa21931556973998d950accaf9f456a07e67fd31dcb119d7922eb899b1229545e57a275219750950afbebf352d006850025a9acfccff025862007a191571ecf9717fdc504d155e7c13c58de6e65434c4152713f68b5f78edfef9cc326610d68d14fb482037d718d4d3980c35e2f712cb832592efd3d7634594f6c28aa10f2b1eb384d9c4a4997154c5b5ff76ca016503d7870930d22deb3fe57de992e955d1bdacd6d22c9b493da482df0f67fd0efb2f4c9361454474e94dcda5cf1c2cf8aab115cb280f09a646729ff46df046b23bcb553975e1ee72d4606dbb555972353fe2097223bc2ee84b1336018c443e3ec085d44e0c4f93b5dab33ba1bfb5b558be2a2ef88e7f3c6d0b02913b2d1b3ae99bf3d0e29dfc54230ac9e0b498dbc967c5288e23f50471be04" + "proof_data_hex": "5459b475f0f6fe15ab222115b3c747b7a61942d18936d40f979fa73723f10f6400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000050000000000000034b8d7eb4036fed332281d43e5a820bdb7c79c415dc13df54333ff0d8960833eec72d199825860cc24e1c5649392c3eeeb4d988540594fea6c12cacff5eaa26ee47668177c64136e0b21cd77b975cfd364f1a32824e6fe7b2a589364b8facf0e5e831a50afbc577f5b0f460c66c4ad27f30fe857c81b2452321f1e92e85de87d37aeaff3597f0f8117f23f30dabfcbee0e0821331dc9ec4cafc239e19d8118008e2103913d61087be0038cadcba54091d6dfe0ac3b170f39bbea244060817b05231c7288c0fcf3f76b4cc1291b318f8cd4f844317856c2b645c5c01a0da0e600e4a60a2c09e41431cdf4fca0cc759bccf8beda470bb7f88a9eed41064bcb1f70282667067c6250520061940a16fa77abacda1ef5292bca6134c8eef829f94f512a1cb511ab7d81cfb44bed0bd9030b8f0412daeb65a684bcbc1b14cc85e0312052eac0dde59548b997da6a41bc9d7d38bbe9dfa075eb9e05680197ca2d4b9938d4cba9f2c85f18432cddda842f611c9f9fe7cb34d137c2f99050c1154532242744443e8c995ba054232c543578681db4e176e1a54db833c754c546e87a51410dd42982fd7d43791e22044f1c994ae96a624321ff29ddb573294b28e5692af43dfc03a1f37df9de06df903e281b2f1c3611ce8bced86a7df6d03f56280f11713f76407401b54ed3e6251aaa67c8197fa97ecb80a48383f87b2466e40dbada781ed0addbec8a93234267d6fc894cf08693b2f44aa94028193c98d90ba1a2f57766c664bd861d2a2f77b233affd04308381a16548670b24cf8ff47edff0aaac0e4c8c4e9bb68f5113599f3c35cb6f90663c78d689712e0604d0768c1230bf73d2037a232b81845fdb95f61708baa249827e1bcac12b8c04dc98da0e0039aa36950b6a80575832cc7288a0159973703e653edd1482ab55ef0432d670305424ede60b" }, "mutations": [ { @@ -2349,7 +2349,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "fd8d266cab7e55456039be7dbc582f24d057dc5b2461c419acd51c0ea640ae5a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000500000000000000bc102d03d79b52619082709e593ee099b0c668fad0b7927deb993c7138f90b48d457239a4047f3564fd4937894b91656aac5d4fd16b473faeeb641f1633e6f0c36cb68fa648bc5b09783f777586c78a76c9c3eb48a5455b607e737d2a08433011aff5f2f003a8170545fe4deb3944d2e3f1f6524b82f8de212960fb9e7ca3058f4860390b8d00e2b71feb38a3f66dd96ca1d8a68adf28c410bfc4b564da8920a52908bdbed3ef763696da10e68e911fc79891b5d85adb8b967d6b76b27a7d70381e9352fc35f8253403d19d0458f965142537e141b26036e77afbf6c45fba40aac2b3d763a85c28ae88a58a0ed2abb1ca1712af474baef9924252ab1d5899e0718a66f04096f54ca8e2b0956026e5d7c06bb241a813838d00bbde71b6129744420074708fe35b028c55214fcb63d9b5d9b416bbd709705d3578bd26cf8e0b9362ececb8bda766c7158eb1374e52b163206f73c4071b99e8521dbd6c5a7c36c050e6a41ecd15ad46f14e26285090393cc991b55be3e0b930903aa21931556973998d950accaf9f456a07e67fd31dcb119d7922eb899b1229545e57a275219750950afbebf352d006850025a9acfccff025862007a191571ecf9717fdc504d155e7c13c58de6e65434c4152713f68b5f78edfef9cc326610d68d14fb482037d718d4d3980c35e2f712cb832592efd3d7634594f6c28aa10f2b1eb384d9c4a4997154c5b5ff76ca016503d7870930d22deb3fe57de992e955d1bdacd6d22c9b493da482df0f67fd0efb2f4c9361454474e94dcda5cf1c2cf8aab115cb280f09a646729ff46df046b23bcb553975e1ee72d4606dbb555972353fe2097223bc2ee84b1336018c443e3ec085d44e0c4f93b5dab33ba1bfb5b558be2a2ef88e7f3c6d0b02913b2d1b3ae99bf3d0e29dfc54230ac9e0b498dbc967c5288e23f50471be04" + "value_hex": "5559b475f0f6fe15ab222115b3c747b7a61942d18936d40f979fa73723f10f6400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000050000000000000034b8d7eb4036fed332281d43e5a820bdb7c79c415dc13df54333ff0d8960833eec72d199825860cc24e1c5649392c3eeeb4d988540594fea6c12cacff5eaa26ee47668177c64136e0b21cd77b975cfd364f1a32824e6fe7b2a589364b8facf0e5e831a50afbc577f5b0f460c66c4ad27f30fe857c81b2452321f1e92e85de87d37aeaff3597f0f8117f23f30dabfcbee0e0821331dc9ec4cafc239e19d8118008e2103913d61087be0038cadcba54091d6dfe0ac3b170f39bbea244060817b05231c7288c0fcf3f76b4cc1291b318f8cd4f844317856c2b645c5c01a0da0e600e4a60a2c09e41431cdf4fca0cc759bccf8beda470bb7f88a9eed41064bcb1f70282667067c6250520061940a16fa77abacda1ef5292bca6134c8eef829f94f512a1cb511ab7d81cfb44bed0bd9030b8f0412daeb65a684bcbc1b14cc85e0312052eac0dde59548b997da6a41bc9d7d38bbe9dfa075eb9e05680197ca2d4b9938d4cba9f2c85f18432cddda842f611c9f9fe7cb34d137c2f99050c1154532242744443e8c995ba054232c543578681db4e176e1a54db833c754c546e87a51410dd42982fd7d43791e22044f1c994ae96a624321ff29ddb573294b28e5692af43dfc03a1f37df9de06df903e281b2f1c3611ce8bced86a7df6d03f56280f11713f76407401b54ed3e6251aaa67c8197fa97ecb80a48383f87b2466e40dbada781ed0addbec8a93234267d6fc894cf08693b2f44aa94028193c98d90ba1a2f57766c664bd861d2a2f77b233affd04308381a16548670b24cf8ff47edff0aaac0e4c8c4e9bb68f5113599f3c35cb6f90663c78d689712e0604d0768c1230bf73d2037a232b81845fdb95f61708baa249827e1bcac12b8c04dc98da0e0039aa36950b6a80575832cc7288a0159973703e653edd1482ab55ef0432d670305424ede60b" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -2359,7 +2359,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "fc8d266cab7e55456039be7dbc582f24d057dc5b2461c419acd51c0ea640ae5a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000500000000000000bc102d03d79b52619082709e593ee099b0c668fad0b7927deb993c7138f90b48d457239a4047f3564fd4937894b91656aac5d4fd16b473faeeb641f1633e6f0c36cb68fa648bc5b09783f777586c78a76c9c3eb48a5455b607e737d2a08433011aff5f2f003a8170545fe4deb3944d2e3f1f6524b82f8de212960fb9e7ca3058f4860390b8d00e2b71feb38a3f66dd96ca1d8a68adf28c410bfc4b564da8920a52908bdbed3ef763696da10e68e911fc79891b5d85adb8b967d6b76b27a7d70381e9352fc35f8253403d19d0458f965142537e141b26036e77afbf6c45fba40aac2b3d763a85c28ae88a58a0ed2abb1ca1712af474baef9924252ab1d5899e0718a66f04096f54ca8e2b0956026e5d7c06bb241a813838d00bbde71b6129744420074708fe35b028c55214fcb63d9b5d9b416bbd709705d3578bd26cf8e0b9362ececb8bda766c7158eb1374e52b163206f73c4071b99e8521dbd6c5a7c36c050e6a41ecd15ad46f14e26285090393cc991b55be3e0b930903aa21931556973998d950accaf9f456a07e67fd31dcb119d7922eb899b1229545e57a275219750950afbebf352d006850025a9acfccff025862007a191571ecf9717fdc504d155e7c13c58de6e65434c4152713f68b5f78edfef9cc326610d68d14fb482037d718d4d3980c35e2f712cb832592efd3d7634594f6c28aa10f2b1eb384d9c4a4997154c5b5ff76ca016503d7870930d22deb3fe57de992e955d1bdacd6d22c9b493da482df0f67fd0efb2f4c9361454474e94dcda5cf1c2cf8aab115cb280f09a646729ff46df046b23bcb553975e1ee72d4606dbb555972353fe2097223bc2ee84b1336018c443e3ec085d44e0c4f93b5dab33ba1bfb5b558be2a2ef88e7f3c6d0b02913b2d1b3ae99bf3d0e29dfc54230ac9e0b498dbc967c5288e23f50471" + "value_hex": "5459b475f0f6fe15ab222115b3c747b7a61942d18936d40f979fa73723f10f6400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000050000000000000034b8d7eb4036fed332281d43e5a820bdb7c79c415dc13df54333ff0d8960833eec72d199825860cc24e1c5649392c3eeeb4d988540594fea6c12cacff5eaa26ee47668177c64136e0b21cd77b975cfd364f1a32824e6fe7b2a589364b8facf0e5e831a50afbc577f5b0f460c66c4ad27f30fe857c81b2452321f1e92e85de87d37aeaff3597f0f8117f23f30dabfcbee0e0821331dc9ec4cafc239e19d8118008e2103913d61087be0038cadcba54091d6dfe0ac3b170f39bbea244060817b05231c7288c0fcf3f76b4cc1291b318f8cd4f844317856c2b645c5c01a0da0e600e4a60a2c09e41431cdf4fca0cc759bccf8beda470bb7f88a9eed41064bcb1f70282667067c6250520061940a16fa77abacda1ef5292bca6134c8eef829f94f512a1cb511ab7d81cfb44bed0bd9030b8f0412daeb65a684bcbc1b14cc85e0312052eac0dde59548b997da6a41bc9d7d38bbe9dfa075eb9e05680197ca2d4b9938d4cba9f2c85f18432cddda842f611c9f9fe7cb34d137c2f99050c1154532242744443e8c995ba054232c543578681db4e176e1a54db833c754c546e87a51410dd42982fd7d43791e22044f1c994ae96a624321ff29ddb573294b28e5692af43dfc03a1f37df9de06df903e281b2f1c3611ce8bced86a7df6d03f56280f11713f76407401b54ed3e6251aaa67c8197fa97ecb80a48383f87b2466e40dbada781ed0addbec8a93234267d6fc894cf08693b2f44aa94028193c98d90ba1a2f57766c664bd861d2a2f77b233affd04308381a16548670b24cf8ff47edff0aaac0e4c8c4e9bb68f5113599f3c35cb6f90663c78d689712e0604d0768c1230bf73d2037a232b81845fdb95f61708baa249827e1bcac12b8c04dc98da0e0039aa36950b6a80575832cc7288a0159973703e653edd1482ab55ef0432d670305424ed" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -2379,7 +2379,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "fc8d266cab7e55456039be7dbc582f24d057dc5b2461c419acd51c0ea640ae5a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000500000000000000bc102d03d79b52619082709e593ee099b0c668fad0b7927deb993c7138f90b48d457239a4047f3564fd4937894b91656aac5d4fd16b473faeeb641f1633e6f0c36cb68fa648bc5b09783f777586c78a76c9c3eb48a5455b607e737d2a08433011aff5f2f003a8170545fe4deb3944d2e3f1f6524b82f8de212960fb9e7ca3058f4860390b8d00e2b71feb38a3f66dd96ca1d8a68adf28c410bfc4b564da8920a52908bdbed3ef763696da10e68e911fc79891b5d85adb8b967d6b76b27a7d70381e9352fc35f8253403d19d0458f965142537e141b26036e77afbf6c45fba40aac2b3d763a85c28ae88a58a0ed2abb1ca1712af474baef9924252ab1d5899e0718a66f04096f54ca8e2b0956026e5d7c06bb241a813838d00bbde71b6129744420074708fe35b028c55214fcb63d9b5d9b416bbd709705d3578bd26cf8e0b9362ececb8bda766c7158eb1374e52b163206f73c4071b99e8521dbd6c5a7c36c050e6a41ecd15ad46f14e26285090393cc991b55be3e0b930903aa21931556973998d950accaf9f456a07e67fd31dcb119d7922eb899b1229545e57a275219750950afbebf352d006850025a9acfccff025862007a191571ecf9717fdc504d155e7c13c58de6e65434c4152713f68b5f78edfef9cc326610d68d14fb482037d718d4d3980c35e2f712cb832592efd3d7634594f6c28aa10f2b1eb384d9c4a4997154c5b5ff76ca016503d7870930d22deb3fe57de992e955d1bdacd6d22c9b493da482df0f67fd0efb2f4c9361454474e94dcda5cf1c2cf8aab115cb280f09a646729ff46df046b23bcb553975e1ee72d4606dbb555972353fe2097223bc2ee84b1336018c443e3ec085d44e0c4f93b5dab33ba1bfb5b558be2a2ef88e7f3c6d0b02913b2d1b3ae99bf3d0e29dfc54230ac9e0b498dbc967c5288e23f50471be05" + "value_hex": "5459b475f0f6fe15ab222115b3c747b7a61942d18936d40f979fa73723f10f6400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000050000000000000034b8d7eb4036fed332281d43e5a820bdb7c79c415dc13df54333ff0d8960833eec72d199825860cc24e1c5649392c3eeeb4d988540594fea6c12cacff5eaa26ee47668177c64136e0b21cd77b975cfd364f1a32824e6fe7b2a589364b8facf0e5e831a50afbc577f5b0f460c66c4ad27f30fe857c81b2452321f1e92e85de87d37aeaff3597f0f8117f23f30dabfcbee0e0821331dc9ec4cafc239e19d8118008e2103913d61087be0038cadcba54091d6dfe0ac3b170f39bbea244060817b05231c7288c0fcf3f76b4cc1291b318f8cd4f844317856c2b645c5c01a0da0e600e4a60a2c09e41431cdf4fca0cc759bccf8beda470bb7f88a9eed41064bcb1f70282667067c6250520061940a16fa77abacda1ef5292bca6134c8eef829f94f512a1cb511ab7d81cfb44bed0bd9030b8f0412daeb65a684bcbc1b14cc85e0312052eac0dde59548b997da6a41bc9d7d38bbe9dfa075eb9e05680197ca2d4b9938d4cba9f2c85f18432cddda842f611c9f9fe7cb34d137c2f99050c1154532242744443e8c995ba054232c543578681db4e176e1a54db833c754c546e87a51410dd42982fd7d43791e22044f1c994ae96a624321ff29ddb573294b28e5692af43dfc03a1f37df9de06df903e281b2f1c3611ce8bced86a7df6d03f56280f11713f76407401b54ed3e6251aaa67c8197fa97ecb80a48383f87b2466e40dbada781ed0addbec8a93234267d6fc894cf08693b2f44aa94028193c98d90ba1a2f57766c664bd861d2a2f77b233affd04308381a16548670b24cf8ff47edff0aaac0e4c8c4e9bb68f5113599f3c35cb6f90663c78d689712e0604d0768c1230bf73d2037a232b81845fdb95f61708baa249827e1bcac12b8c04dc98da0e0039aa36950b6a80575832cc7288a0159973703e653edd1482ab55ef0432d670305424ede60a" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -2391,14 +2391,14 @@ "family": "withdraw_composite", "expected_valid": true, "payload": { - "equality_proof_data_hex": "36d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e3174ee9c491a45330ca8447c8c3b1e1b1e1c3e31e8e8e7187fedb1430896adf80587a7f13ab2b2da1f060be02eb4c9fcaca9bed78a05b802d02cfeb0a9e26563a19fc8d266cab7e55456039be7dbc582f24d057dc5b2461c419acd51c0ea640ae5a05000000000000000ed74ab32bfe88fd151ff9e74f655d935fa4d81209b3c993a14c084916de6940a2d7027b6a245eb23cfaae0418467d299597bc93676822d71518498413e65170c0d68103c0f8a81f385bb4d57ad30f7bd7fe75d1198c285148b835ed8ced4852776327907076f40a434bd8ac727a227f4fb4b87f7e81923175ed6e47db29dd0d27183517d89be6bbfea525adb2f8d1376decbb391c400c7dc5d239e42939d503bb09d1c0497b122ebd7c1929c3659fbc75f815703a49178df2212a4777d46008", - "range_proof_data_hex": "fc8d266cab7e55456039be7dbc582f24d057dc5b2461c419acd51c0ea640ae5a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000500000000000000bc102d03d79b52619082709e593ee099b0c668fad0b7927deb993c7138f90b48d457239a4047f3564fd4937894b91656aac5d4fd16b473faeeb641f1633e6f0c36cb68fa648bc5b09783f777586c78a76c9c3eb48a5455b607e737d2a08433011aff5f2f003a8170545fe4deb3944d2e3f1f6524b82f8de212960fb9e7ca3058f4860390b8d00e2b71feb38a3f66dd96ca1d8a68adf28c410bfc4b564da8920a52908bdbed3ef763696da10e68e911fc79891b5d85adb8b967d6b76b27a7d70381e9352fc35f8253403d19d0458f965142537e141b26036e77afbf6c45fba40aac2b3d763a85c28ae88a58a0ed2abb1ca1712af474baef9924252ab1d5899e0718a66f04096f54ca8e2b0956026e5d7c06bb241a813838d00bbde71b6129744420074708fe35b028c55214fcb63d9b5d9b416bbd709705d3578bd26cf8e0b9362ececb8bda766c7158eb1374e52b163206f73c4071b99e8521dbd6c5a7c36c050e6a41ecd15ad46f14e26285090393cc991b55be3e0b930903aa21931556973998d950accaf9f456a07e67fd31dcb119d7922eb899b1229545e57a275219750950afbebf352d006850025a9acfccff025862007a191571ecf9717fdc504d155e7c13c58de6e65434c4152713f68b5f78edfef9cc326610d68d14fb482037d718d4d3980c35e2f712cb832592efd3d7634594f6c28aa10f2b1eb384d9c4a4997154c5b5ff76ca016503d7870930d22deb3fe57de992e955d1bdacd6d22c9b493da482df0f67fd0efb2f4c9361454474e94dcda5cf1c2cf8aab115cb280f09a646729ff46df046b23bcb553975e1ee72d4606dbb555972353fe2097223bc2ee84b1336018c443e3ec085d44e0c4f93b5dab33ba1bfb5b558be2a2ef88e7f3c6d0b02913b2d1b3ae99bf3d0e29dfc54230ac9e0b498dbc967c5288e23f50471be04" + "equality_proof_data_hex": "b0aea323b18453bbf74f03044da9dd93e19f5f50bd125f8d376ae6dc74d357013cf9e4bd2866c8030344d5e24bea7c99b12bb2c95f6c63954462c8861e29c66c14c91b1f097ad9da08b8a737fb4f5fccd3371132c5f511288919d8e7b474af79a2ea3f412f5e14aaf28ed87ecd4bb9d96e1b2cc4f3ab1258ad7e21407cd0fe050500000000000000d6d8ad2e2feceeb678f48133e3d01f47db614dea2d95d0cd5b723e85790a66590a45fffbcf9c12c896323c448c1d49586db141bad052a98c46f358aa2cb2c6086abd5a14bea1cea8a726cf506fa2d2d6f8ca0495cb0a0d5d4a258bd16185283b0305eb1fceedc2225842bc22ed5780bb28f6272c0bd65ae20a53f0ee1e9d8a0ee845b1a28ddff2b05800a41b873bf42243818622352b725bbdcb79fddd1245001282bd11bc847b8888f723ee2e378ada882ece6b161b34689274e5d4823fdc07", + "range_proof_data_hex": "a2ea3f412f5e14aaf28ed87ecd4bb9d96e1b2cc4f3ab1258ad7e21407cd0fe0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000050000000000000030fe7e27015efb40f31a3c6cc3c3b5159a340f8778b562f2b25a77f8f961701b52a6e1735a97d7aa43c5dc4de686607e666bdd490944dc14d8437a029d5b3b08b85ef97a52a417af093e8da28ed5776b557a8298066d919c66da6d4e5328231664b59b53f8d2ad7e5ee7f409377c516735bda36aa74f94af1173acdd17637a68ca470b4d265c0f6dd9504e6a2225c284fb25ca6ddc2f5ab305da1c569e7a1509d39afc8859f68b94bd8284869d899011ed8183f2ecf45a985ace858291e86d06d16b5ed1bc06ec0708d341499d873d0df19af1f7b8cf82ce6e312e03279f9901fe4e850b9048623c0af82fe448cd87f2e3e56d74a1ae8574909776188eb7e4748af42a2e766e6d1c67985337ff93a0c04319b9c36ac39a77a486f367fda68a5dca579a81ea3c7d96fed17cd26c2a19f5edc0099b30e7e7759913dddb9dc17d404ccb156d3aacc9107eb5bdda3d54c1990d3652a2593dd615f0eb9c1d9ff3c646701cd3394cc55c47aa254e08c943db2dd4e228122accde2e4154d9bcefa96e411aef61be1510086df210fc975cf8dd69f129fc19bce90b59d43a39ef36465d0ac8225eded020f328c4e24fd2a5a80960e01987a88a9954b7910cccec634b0d7996a21e3f181207812f8b8d876e1d0b264ca19189ed855d1507ecefbfd80846239e1ec5ba1f92484f39cf8b349633e5ca55ecdb65506a949958c220a9ffe0655c0c3ad7352c172b5b93e39899a3542f786a135d056101983f5a60d1db7c7db5395c76e06cc65941227bf69524cd56bbf669d900dec11af4d47d5d415d520e82219ecdcac97751dbb627272201db4c90b49c610c2e5a4e82ac1e8b7588c0d1627ff4043b20fe9caae65059b47695a8ca27af8934026bcd2bba6650fe173253e80eb3aabd4de5c9e2477af27ddece684369fb8689fded8a9b235266d620c01da601" }, "binding": { - "ciphertext_commitment_hex": "4ee9c491a45330ca8447c8c3b1e1b1e1c3e31e8e8e7187fedb1430896adf8058", - "ciphertext_handle_hex": "7a7f13ab2b2da1f060be02eb4c9fcaca9bed78a05b802d02cfeb0a9e26563a19", + "ciphertext_commitment_hex": "3cf9e4bd2866c8030344d5e24bea7c99b12bb2c95f6c63954462c8861e29c66c", + "ciphertext_handle_hex": "14c91b1f097ad9da08b8a737fb4f5fccd3371132c5f511288919d8e7b474af79", "expected_nonce_u64": 5, - "user_pubkey_hex": "36d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317" + "user_pubkey_hex": "b0aea323b18453bbf74f03044da9dd93e19f5f50bd125f8d376ae6dc74d35701" }, "mutations": [ { @@ -2426,7 +2426,7 @@ "op": "bitflip", "target": "binding.user_pubkey_hex", "params": { - "value_hex": "37d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e317" + "value_hex": "b1aea323b18453bbf74f03044da9dd93e19f5f50bd125f8d376ae6dc74d35701" }, "expected_valid": false, "expected_error_contains": "failed" @@ -2436,7 +2436,7 @@ "op": "truncate", "target": "payload.equality_proof_data_hex", "params": { - "value_hex": "36d96b4d88bce44f5754d415df3fa4e77b635a8cd6bcfea008d03daeabb4e3174ee9c491a45330ca8447c8c3b1e1b1e1c3e31e8e8e7187fedb1430896adf80587a7f13ab2b2da1f060be02eb4c9fcaca9bed78a05b802d02cfeb0a9e26563a19fc8d266cab7e55456039be7dbc582f24d057dc5b2461c419acd51c0ea640ae5a05000000000000000ed74ab32bfe88fd151ff9e74f655d935fa4d81209b3c993a14c084916de6940a2d7027b6a245eb23cfaae0418467d299597bc93676822d71518498413e65170c0d68103c0f8a81f385bb4d57ad30f7bd7fe75d1198c285148b835ed8ced4852776327907076f40a434bd8ac727a227f4fb4b87f7e81923175ed6e47db29dd0d27183517d89be6bbfea525adb2f8d1376decbb391c400c7dc5d239e42939d503bb09d1c0497b122ebd7c1929c3659fbc75f815703a49178df2212a4777d4" + "value_hex": "b0aea323b18453bbf74f03044da9dd93e19f5f50bd125f8d376ae6dc74d357013cf9e4bd2866c8030344d5e24bea7c99b12bb2c95f6c63954462c8861e29c66c14c91b1f097ad9da08b8a737fb4f5fccd3371132c5f511288919d8e7b474af79a2ea3f412f5e14aaf28ed87ecd4bb9d96e1b2cc4f3ab1258ad7e21407cd0fe050500000000000000d6d8ad2e2feceeb678f48133e3d01f47db614dea2d95d0cd5b723e85790a66590a45fffbcf9c12c896323c448c1d49586db141bad052a98c46f358aa2cb2c6086abd5a14bea1cea8a726cf506fa2d2d6f8ca0495cb0a0d5d4a258bd16185283b0305eb1fceedc2225842bc22ed5780bb28f6272c0bd65ae20a53f0ee1e9d8a0ee845b1a28ddff2b05800a41b873bf42243818622352b725bbdcb79fddd1245001282bd11bc847b8888f723ee2e378ada882ece6b161b34689274e5d4823f" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -2458,7 +2458,7 @@ "family": "withdraw_range", "expected_valid": true, "payload": { - "proof_data_hex": "aa9b0bf46d3d88372806dea1bc8f04f031c42753d0f41137f40e3b9f403afc470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000013000000000000004825cf1cf7fda9b07c5e31f3523330eb34088ea129cc7a70ce6f143017261b765ef97df969659664695ac42bedc1b0bc852026a00942e43cfce6021acfed82350c189b9a79ba802fe38fbcd13099d70d1b54e97b0ec36c017a93e2a7bf349042f21c8b70b1ebda65a0386c2939c49e24182777a9d2ddd7808c36a5181b821346a32ceb9418db29c4471e6dfe0307ca9e4c3f04601f1d39513440c3927be4950b2daf6bdc59bf519f7ed234dd49386ec529f0fa5b775f7da39b0d82a52c51fe0d5f3cd9be8357a074dfef74c14e45d8c8979e92f09f5655e883da9a2f3d0dbf0d20f32340fd56e368ad4011f4ecbec9f22579ba85efffd564b9b27d27d9700965f2ed105016893b0fe76047a4f44740293476f64f0ecd3c1e3bf38aef9e59904af8b31ce61d3f162dda70ce78496f24b68fc8f225707a67d0bd2b6d13ea56f1066408884baa2802935da295a83be37ae89bbae08a517784307bb5b9cb9edabe192aeb28663fc206ec4cefdd8e1e615eb40bc03137ab5fd90f5544c4d2e3241063c4192cc1990bade70a75846b0551ecfaa30de4ad708d72c177d482dad166b71b16a2336ee28f3e7906eb3bd37512cd566d301c900e9526ca5d0a3464ff0d061afa25546744b61da40c796954a8b7c5b42ea2ef9140c67ee8f2adfded81501d6768d04d1a2dd02c0ff3d69b4aa8f62bddb972e7d31c66f01e57c033d2dd58a409908363a64b52b8627ab290f0f52710f79ee9218feb6fb5d0613e76a103c6483d6a402ec59254909f74e20fe28b6ae181de12eeed18c562c8614ea9fdb084fa2ea814bb03180dfe4be27c04f327458cec7a483653942ef05710f8ce892bea0e7726e89b9ff67af74182ab5fb9c86f87daef6c929baefbba7c796edd1a67e60b09e57f6d7f2b73d5ab25869e9f8a770783b70180d9d8609b246cba30b7a36f5506" + "proof_data_hex": "587cb830512e5cfb920d983f0e35261ab77e2615e2317c2f947503923704bc3d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000130000000000000054bf71c07d968cc9cfa12defb89fd2c1e24a06dc478310a212fff02d733a7503cc8745c6da413f1180d0bbdd269dc54e2d6e04e8469a87d7eb63a366f39d6a3d043d4ac9392a6c1a019be023febaf702e2a98375eec8d2e59240aba343a58c4290955b07b40ee71c678d3d2680ceaa68eaab6ed93390b41550716c90c84a372348199d74ce3329baf99ce2effe422bcdbe95e2839b3797a5da2ef20e97cca80bc1457936a6266e890aac31fa7ff9eee292d40c45650c5f55b93e0358e3781006933a8d6e3c8feb5d5173ae39dea89592ee94ccea42a5ef25cfa97298aa02020036a7c3ec5aa1fc3c4690db46f2d2c24cbff8bcae0e36309354cbb60a5a876346d80ab37a26970ac4263e3151cae7600011182f5b7012d9ad6a94f41e1c36e05d2a13950f332d7241c6dbc3930bdbdafed96fb67312c1e1eed805ae8cf1136939460ed2214e6f7248c53bb0b9ac56ad1bc285636e44327183a7406483d5b76d4ed6ff6acc9e0099f25f10c3137829976ed2ddc412e2f08777c30ea53e4055a669eeb3f05ad0bf4ebab58caddc615b7a23291ee3a2c64e4bf99398f8ea27596b12a2ca4d82f82deb93c0549700437b4b54d4f404106e4d8d384b00309c96df017366db95e3616a1590797dc606d10798f49f9ccabcd01e2c17586ba3115a3408402664e7eca5d4dba45f44a9790d57f7d5a5296bd40c094541227bd776a273f435d2d0d64e3a10e3b96d8bb0548f02913ea0f128a335929c4b3a693a185b6b9a662e8300b2b182dd9afd2c533ef4187edbc0ff790e2a1ab0b5c59eb354418c3b1ae63b0b95253b0801021c133f0cfd15a32f59d891b5e7fe294cceb4e7ec3eff7f960871a0fed7a991b1cf26aa0bfdaf6af54a0178c0330b5e50ad5b5875367f071566a5bbad424cc4515cca240b35517619acf9fd2215a31204b22d62b0773e05" }, "mutations": [ { @@ -2466,7 +2466,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "ab9b0bf46d3d88372806dea1bc8f04f031c42753d0f41137f40e3b9f403afc470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000013000000000000004825cf1cf7fda9b07c5e31f3523330eb34088ea129cc7a70ce6f143017261b765ef97df969659664695ac42bedc1b0bc852026a00942e43cfce6021acfed82350c189b9a79ba802fe38fbcd13099d70d1b54e97b0ec36c017a93e2a7bf349042f21c8b70b1ebda65a0386c2939c49e24182777a9d2ddd7808c36a5181b821346a32ceb9418db29c4471e6dfe0307ca9e4c3f04601f1d39513440c3927be4950b2daf6bdc59bf519f7ed234dd49386ec529f0fa5b775f7da39b0d82a52c51fe0d5f3cd9be8357a074dfef74c14e45d8c8979e92f09f5655e883da9a2f3d0dbf0d20f32340fd56e368ad4011f4ecbec9f22579ba85efffd564b9b27d27d9700965f2ed105016893b0fe76047a4f44740293476f64f0ecd3c1e3bf38aef9e59904af8b31ce61d3f162dda70ce78496f24b68fc8f225707a67d0bd2b6d13ea56f1066408884baa2802935da295a83be37ae89bbae08a517784307bb5b9cb9edabe192aeb28663fc206ec4cefdd8e1e615eb40bc03137ab5fd90f5544c4d2e3241063c4192cc1990bade70a75846b0551ecfaa30de4ad708d72c177d482dad166b71b16a2336ee28f3e7906eb3bd37512cd566d301c900e9526ca5d0a3464ff0d061afa25546744b61da40c796954a8b7c5b42ea2ef9140c67ee8f2adfded81501d6768d04d1a2dd02c0ff3d69b4aa8f62bddb972e7d31c66f01e57c033d2dd58a409908363a64b52b8627ab290f0f52710f79ee9218feb6fb5d0613e76a103c6483d6a402ec59254909f74e20fe28b6ae181de12eeed18c562c8614ea9fdb084fa2ea814bb03180dfe4be27c04f327458cec7a483653942ef05710f8ce892bea0e7726e89b9ff67af74182ab5fb9c86f87daef6c929baefbba7c796edd1a67e60b09e57f6d7f2b73d5ab25869e9f8a770783b70180d9d8609b246cba30b7a36f5506" + "value_hex": "597cb830512e5cfb920d983f0e35261ab77e2615e2317c2f947503923704bc3d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000130000000000000054bf71c07d968cc9cfa12defb89fd2c1e24a06dc478310a212fff02d733a7503cc8745c6da413f1180d0bbdd269dc54e2d6e04e8469a87d7eb63a366f39d6a3d043d4ac9392a6c1a019be023febaf702e2a98375eec8d2e59240aba343a58c4290955b07b40ee71c678d3d2680ceaa68eaab6ed93390b41550716c90c84a372348199d74ce3329baf99ce2effe422bcdbe95e2839b3797a5da2ef20e97cca80bc1457936a6266e890aac31fa7ff9eee292d40c45650c5f55b93e0358e3781006933a8d6e3c8feb5d5173ae39dea89592ee94ccea42a5ef25cfa97298aa02020036a7c3ec5aa1fc3c4690db46f2d2c24cbff8bcae0e36309354cbb60a5a876346d80ab37a26970ac4263e3151cae7600011182f5b7012d9ad6a94f41e1c36e05d2a13950f332d7241c6dbc3930bdbdafed96fb67312c1e1eed805ae8cf1136939460ed2214e6f7248c53bb0b9ac56ad1bc285636e44327183a7406483d5b76d4ed6ff6acc9e0099f25f10c3137829976ed2ddc412e2f08777c30ea53e4055a669eeb3f05ad0bf4ebab58caddc615b7a23291ee3a2c64e4bf99398f8ea27596b12a2ca4d82f82deb93c0549700437b4b54d4f404106e4d8d384b00309c96df017366db95e3616a1590797dc606d10798f49f9ccabcd01e2c17586ba3115a3408402664e7eca5d4dba45f44a9790d57f7d5a5296bd40c094541227bd776a273f435d2d0d64e3a10e3b96d8bb0548f02913ea0f128a335929c4b3a693a185b6b9a662e8300b2b182dd9afd2c533ef4187edbc0ff790e2a1ab0b5c59eb354418c3b1ae63b0b95253b0801021c133f0cfd15a32f59d891b5e7fe294cceb4e7ec3eff7f960871a0fed7a991b1cf26aa0bfdaf6af54a0178c0330b5e50ad5b5875367f071566a5bbad424cc4515cca240b35517619acf9fd2215a31204b22d62b0773e05" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -2476,7 +2476,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "aa9b0bf46d3d88372806dea1bc8f04f031c42753d0f41137f40e3b9f403afc470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000013000000000000004825cf1cf7fda9b07c5e31f3523330eb34088ea129cc7a70ce6f143017261b765ef97df969659664695ac42bedc1b0bc852026a00942e43cfce6021acfed82350c189b9a79ba802fe38fbcd13099d70d1b54e97b0ec36c017a93e2a7bf349042f21c8b70b1ebda65a0386c2939c49e24182777a9d2ddd7808c36a5181b821346a32ceb9418db29c4471e6dfe0307ca9e4c3f04601f1d39513440c3927be4950b2daf6bdc59bf519f7ed234dd49386ec529f0fa5b775f7da39b0d82a52c51fe0d5f3cd9be8357a074dfef74c14e45d8c8979e92f09f5655e883da9a2f3d0dbf0d20f32340fd56e368ad4011f4ecbec9f22579ba85efffd564b9b27d27d9700965f2ed105016893b0fe76047a4f44740293476f64f0ecd3c1e3bf38aef9e59904af8b31ce61d3f162dda70ce78496f24b68fc8f225707a67d0bd2b6d13ea56f1066408884baa2802935da295a83be37ae89bbae08a517784307bb5b9cb9edabe192aeb28663fc206ec4cefdd8e1e615eb40bc03137ab5fd90f5544c4d2e3241063c4192cc1990bade70a75846b0551ecfaa30de4ad708d72c177d482dad166b71b16a2336ee28f3e7906eb3bd37512cd566d301c900e9526ca5d0a3464ff0d061afa25546744b61da40c796954a8b7c5b42ea2ef9140c67ee8f2adfded81501d6768d04d1a2dd02c0ff3d69b4aa8f62bddb972e7d31c66f01e57c033d2dd58a409908363a64b52b8627ab290f0f52710f79ee9218feb6fb5d0613e76a103c6483d6a402ec59254909f74e20fe28b6ae181de12eeed18c562c8614ea9fdb084fa2ea814bb03180dfe4be27c04f327458cec7a483653942ef05710f8ce892bea0e7726e89b9ff67af74182ab5fb9c86f87daef6c929baefbba7c796edd1a67e60b09e57f6d7f2b73d5ab25869e9f8a770783b70180d9d8609b246cba30b7a36f" + "value_hex": "587cb830512e5cfb920d983f0e35261ab77e2615e2317c2f947503923704bc3d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000130000000000000054bf71c07d968cc9cfa12defb89fd2c1e24a06dc478310a212fff02d733a7503cc8745c6da413f1180d0bbdd269dc54e2d6e04e8469a87d7eb63a366f39d6a3d043d4ac9392a6c1a019be023febaf702e2a98375eec8d2e59240aba343a58c4290955b07b40ee71c678d3d2680ceaa68eaab6ed93390b41550716c90c84a372348199d74ce3329baf99ce2effe422bcdbe95e2839b3797a5da2ef20e97cca80bc1457936a6266e890aac31fa7ff9eee292d40c45650c5f55b93e0358e3781006933a8d6e3c8feb5d5173ae39dea89592ee94ccea42a5ef25cfa97298aa02020036a7c3ec5aa1fc3c4690db46f2d2c24cbff8bcae0e36309354cbb60a5a876346d80ab37a26970ac4263e3151cae7600011182f5b7012d9ad6a94f41e1c36e05d2a13950f332d7241c6dbc3930bdbdafed96fb67312c1e1eed805ae8cf1136939460ed2214e6f7248c53bb0b9ac56ad1bc285636e44327183a7406483d5b76d4ed6ff6acc9e0099f25f10c3137829976ed2ddc412e2f08777c30ea53e4055a669eeb3f05ad0bf4ebab58caddc615b7a23291ee3a2c64e4bf99398f8ea27596b12a2ca4d82f82deb93c0549700437b4b54d4f404106e4d8d384b00309c96df017366db95e3616a1590797dc606d10798f49f9ccabcd01e2c17586ba3115a3408402664e7eca5d4dba45f44a9790d57f7d5a5296bd40c094541227bd776a273f435d2d0d64e3a10e3b96d8bb0548f02913ea0f128a335929c4b3a693a185b6b9a662e8300b2b182dd9afd2c533ef4187edbc0ff790e2a1ab0b5c59eb354418c3b1ae63b0b95253b0801021c133f0cfd15a32f59d891b5e7fe294cceb4e7ec3eff7f960871a0fed7a991b1cf26aa0bfdaf6af54a0178c0330b5e50ad5b5875367f071566a5bbad424cc4515cca240b35517619acf9fd2215a31204b22d62b077" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -2496,7 +2496,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "aa9b0bf46d3d88372806dea1bc8f04f031c42753d0f41137f40e3b9f403afc470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000013000000000000004825cf1cf7fda9b07c5e31f3523330eb34088ea129cc7a70ce6f143017261b765ef97df969659664695ac42bedc1b0bc852026a00942e43cfce6021acfed82350c189b9a79ba802fe38fbcd13099d70d1b54e97b0ec36c017a93e2a7bf349042f21c8b70b1ebda65a0386c2939c49e24182777a9d2ddd7808c36a5181b821346a32ceb9418db29c4471e6dfe0307ca9e4c3f04601f1d39513440c3927be4950b2daf6bdc59bf519f7ed234dd49386ec529f0fa5b775f7da39b0d82a52c51fe0d5f3cd9be8357a074dfef74c14e45d8c8979e92f09f5655e883da9a2f3d0dbf0d20f32340fd56e368ad4011f4ecbec9f22579ba85efffd564b9b27d27d9700965f2ed105016893b0fe76047a4f44740293476f64f0ecd3c1e3bf38aef9e59904af8b31ce61d3f162dda70ce78496f24b68fc8f225707a67d0bd2b6d13ea56f1066408884baa2802935da295a83be37ae89bbae08a517784307bb5b9cb9edabe192aeb28663fc206ec4cefdd8e1e615eb40bc03137ab5fd90f5544c4d2e3241063c4192cc1990bade70a75846b0551ecfaa30de4ad708d72c177d482dad166b71b16a2336ee28f3e7906eb3bd37512cd566d301c900e9526ca5d0a3464ff0d061afa25546744b61da40c796954a8b7c5b42ea2ef9140c67ee8f2adfded81501d6768d04d1a2dd02c0ff3d69b4aa8f62bddb972e7d31c66f01e57c033d2dd58a409908363a64b52b8627ab290f0f52710f79ee9218feb6fb5d0613e76a103c6483d6a402ec59254909f74e20fe28b6ae181de12eeed18c562c8614ea9fdb084fa2ea814bb03180dfe4be27c04f327458cec7a483653942ef05710f8ce892bea0e7726e89b9ff67af74182ab5fb9c86f87daef6c929baefbba7c796edd1a67e60b09e57f6d7f2b73d5ab25869e9f8a770783b70180d9d8609b246cba30b7a36f5507" + "value_hex": "587cb830512e5cfb920d983f0e35261ab77e2615e2317c2f947503923704bc3d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000130000000000000054bf71c07d968cc9cfa12defb89fd2c1e24a06dc478310a212fff02d733a7503cc8745c6da413f1180d0bbdd269dc54e2d6e04e8469a87d7eb63a366f39d6a3d043d4ac9392a6c1a019be023febaf702e2a98375eec8d2e59240aba343a58c4290955b07b40ee71c678d3d2680ceaa68eaab6ed93390b41550716c90c84a372348199d74ce3329baf99ce2effe422bcdbe95e2839b3797a5da2ef20e97cca80bc1457936a6266e890aac31fa7ff9eee292d40c45650c5f55b93e0358e3781006933a8d6e3c8feb5d5173ae39dea89592ee94ccea42a5ef25cfa97298aa02020036a7c3ec5aa1fc3c4690db46f2d2c24cbff8bcae0e36309354cbb60a5a876346d80ab37a26970ac4263e3151cae7600011182f5b7012d9ad6a94f41e1c36e05d2a13950f332d7241c6dbc3930bdbdafed96fb67312c1e1eed805ae8cf1136939460ed2214e6f7248c53bb0b9ac56ad1bc285636e44327183a7406483d5b76d4ed6ff6acc9e0099f25f10c3137829976ed2ddc412e2f08777c30ea53e4055a669eeb3f05ad0bf4ebab58caddc615b7a23291ee3a2c64e4bf99398f8ea27596b12a2ca4d82f82deb93c0549700437b4b54d4f404106e4d8d384b00309c96df017366db95e3616a1590797dc606d10798f49f9ccabcd01e2c17586ba3115a3408402664e7eca5d4dba45f44a9790d57f7d5a5296bd40c094541227bd776a273f435d2d0d64e3a10e3b96d8bb0548f02913ea0f128a335929c4b3a693a185b6b9a662e8300b2b182dd9afd2c533ef4187edbc0ff790e2a1ab0b5c59eb354418c3b1ae63b0b95253b0801021c133f0cfd15a32f59d891b5e7fe294cceb4e7ec3eff7f960871a0fed7a991b1cf26aa0bfdaf6af54a0178c0330b5e50ad5b5875367f071566a5bbad424cc4515cca240b35517619acf9fd2215a31204b22d62b0773e04" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -2508,14 +2508,14 @@ "family": "withdraw_composite", "expected_valid": true, "payload": { - "equality_proof_data_hex": "f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a76386d0a32762487a234e5305cc5d1bcdad2cd7c56984d80349d27936722b112601870b78302596be0d48ee190d4a84b21449e7a3016c82373a8530ec936897f56aa9b0bf46d3d88372806dea1bc8f04f031c42753d0f41137f40e3b9f403afc4713000000000000006ea3d669961e8041e5dce661a33a55e54f04093bbb430da98d2ac11418e90a6ac801255c7d933466e4d34cb797eb00c1c59b0762f89fe5ba9d1bf5cd91cb8f382e593d81568340de79ceaf548ab484c540ba71267e94bfbe5142ae3aa56f76130963a9cf8df5bc005357fffc6fbfaceba256e1be78fecae4333dadc65ecc110f1b7a6a7b2f08b231d76544e4626c9777f8881e7ca591b8fb60dcc97c8ca6d0037975a887164aeb27cbc1608eea98b3fa3bbabd819c4460958e39d422f3861d00", - "range_proof_data_hex": "aa9b0bf46d3d88372806dea1bc8f04f031c42753d0f41137f40e3b9f403afc470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000013000000000000004825cf1cf7fda9b07c5e31f3523330eb34088ea129cc7a70ce6f143017261b765ef97df969659664695ac42bedc1b0bc852026a00942e43cfce6021acfed82350c189b9a79ba802fe38fbcd13099d70d1b54e97b0ec36c017a93e2a7bf349042f21c8b70b1ebda65a0386c2939c49e24182777a9d2ddd7808c36a5181b821346a32ceb9418db29c4471e6dfe0307ca9e4c3f04601f1d39513440c3927be4950b2daf6bdc59bf519f7ed234dd49386ec529f0fa5b775f7da39b0d82a52c51fe0d5f3cd9be8357a074dfef74c14e45d8c8979e92f09f5655e883da9a2f3d0dbf0d20f32340fd56e368ad4011f4ecbec9f22579ba85efffd564b9b27d27d9700965f2ed105016893b0fe76047a4f44740293476f64f0ecd3c1e3bf38aef9e59904af8b31ce61d3f162dda70ce78496f24b68fc8f225707a67d0bd2b6d13ea56f1066408884baa2802935da295a83be37ae89bbae08a517784307bb5b9cb9edabe192aeb28663fc206ec4cefdd8e1e615eb40bc03137ab5fd90f5544c4d2e3241063c4192cc1990bade70a75846b0551ecfaa30de4ad708d72c177d482dad166b71b16a2336ee28f3e7906eb3bd37512cd566d301c900e9526ca5d0a3464ff0d061afa25546744b61da40c796954a8b7c5b42ea2ef9140c67ee8f2adfded81501d6768d04d1a2dd02c0ff3d69b4aa8f62bddb972e7d31c66f01e57c033d2dd58a409908363a64b52b8627ab290f0f52710f79ee9218feb6fb5d0613e76a103c6483d6a402ec59254909f74e20fe28b6ae181de12eeed18c562c8614ea9fdb084fa2ea814bb03180dfe4be27c04f327458cec7a483653942ef05710f8ce892bea0e7726e89b9ff67af74182ab5fb9c86f87daef6c929baefbba7c796edd1a67e60b09e57f6d7f2b73d5ab25869e9f8a770783b70180d9d8609b246cba30b7a36f5506" + "equality_proof_data_hex": "e22809202e4d8f13770e8bcb5f37c5e6e18c122e2cd0c6d09b57c4517cfc095564ba33808b56f6832516d90d799b9372dd032b01c3fddc29d26eb8ff669f1667c21269e7a145ef209c19c42a637bd515e1c6e4f16bcf8eb3830f61e208d43c5c1ce9d706d3767a820609c0ae7394f2abea6d14b4c78b12acb7c34d4c169d163213000000000000005479e4fc7d973a120b32ff8bbe7649cb0d3bfa4c15f9eddb2913f52c486b091ad85c792ed6eaf599c42d85375905b4788314ada2c17b5e63b80b5c3ccd14034d02666785b22d9e3ee8210f12226ebb3867419f94e026e095922747698d15967055896bfa1f677628783bcbe784a2efc175df49ec4f3dd4291a29cdc767ad8a08f26d4a224e6423326b29bfd318fd7eb70f8a9002827f948879ee015448aa0b07b0f5ce6b52d28540ed4c205da7adce178b7902f183ee6f55825792afefc91b02", + "range_proof_data_hex": "1ce9d706d3767a820609c0ae7394f2abea6d14b4c78b12acb7c34d4c169d163200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000130000000000000086ffea97e58622a5bff4ff86392c326fe71d56d24fe8128171c8887f0022a95a7c377a76b0a422e0eb3549a3acae02aa315dd864c279c8d024c9bd6fcaf4d256f42e26318ec94940e04f1a658190e7daee26bf7a91da2835e4cc016c8036f11282d1b09c57b49536f0c1530865deed66e5123e69f2b7e327a46fbfc16a4c8f2be978e4926d08c45cfd6e8c262fa26abf23324b1438410b6271229e63cee0630860b3ff2cefdd55e047c71f4010b370f34cc6caeab1d39dfd5011ed09d379620438a9452507bd5c4817f73885dec62b9b19aa53b5fee7baa52525b6377fbe0803f89ae41d2323154a7b117bb793603e8085dfc56606d90fb3067f7cd95fc2ba26ea2e9391b54f8015d6f0bc98631d59636434a3a9769a32ae45fc7ed280b6d5578662c99212af7a1830b0513b0577843287f76d4e4f96bb15ad294c718ed3471ee048db91c0d94deb99c7adf35efe9bc73488a9fcd2d305bed2912a78acfff825467e27d6f24887b9d22aead395aebaa8c8127ac106055dc0a1337746d1183c05f65660e28702bf34a0db2f95888f5aea2b47e538d3bb9ebfd752baaffdc35e617ae061ac5a50ea499bac3296671848fbae30eaf3b711061cc38d920c0b4afe11261381740f83f1c37af93cf2bf399fe24444014ed9fe2094b595443a6b21c954d49c1dedcd592ab918a175be3b78a53851777d5ed955449e9c352dc35d663b62427f64804fe787c6cc747d4efd7a04ae9bb3106af54c0b0e79b50bf603424623a44544f905c557bcc0139e58a711e5c292e3c7ae63db9a1a172f8b813dc5fe61c854affb5ff303cb92d138c1ef4316ad58f2cbcf06c990dc3cb44323a78f0c079fa988c4fefe505bf9f222c0abf89159b39aaffdaa662a24dcca219a3ee05c0b4604c4093d738de1099fee57896bd49ad5391858ea75fc13bed4b70c5ae70a0e" }, "binding": { - "ciphertext_commitment_hex": "386d0a32762487a234e5305cc5d1bcdad2cd7c56984d80349d27936722b11260", - "ciphertext_handle_hex": "1870b78302596be0d48ee190d4a84b21449e7a3016c82373a8530ec936897f56", + "ciphertext_commitment_hex": "64ba33808b56f6832516d90d799b9372dd032b01c3fddc29d26eb8ff669f1667", + "ciphertext_handle_hex": "c21269e7a145ef209c19c42a637bd515e1c6e4f16bcf8eb3830f61e208d43c5c", "expected_nonce_u64": 19, - "user_pubkey_hex": "f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a76" + "user_pubkey_hex": "e22809202e4d8f13770e8bcb5f37c5e6e18c122e2cd0c6d09b57c4517cfc0955" }, "mutations": [ { @@ -2543,7 +2543,7 @@ "op": "bitflip", "target": "binding.user_pubkey_hex", "params": { - "value_hex": "f95e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a76" + "value_hex": "e32809202e4d8f13770e8bcb5f37c5e6e18c122e2cd0c6d09b57c4517cfc0955" }, "expected_valid": false, "expected_error_contains": "failed" @@ -2553,7 +2553,7 @@ "op": "truncate", "target": "payload.equality_proof_data_hex", "params": { - "value_hex": "f85e03764267f6a2bf70ae9dce2af8a721bcfa97ad0146f54dc3475553120a76386d0a32762487a234e5305cc5d1bcdad2cd7c56984d80349d27936722b112601870b78302596be0d48ee190d4a84b21449e7a3016c82373a8530ec936897f56aa9b0bf46d3d88372806dea1bc8f04f031c42753d0f41137f40e3b9f403afc4713000000000000006ea3d669961e8041e5dce661a33a55e54f04093bbb430da98d2ac11418e90a6ac801255c7d933466e4d34cb797eb00c1c59b0762f89fe5ba9d1bf5cd91cb8f382e593d81568340de79ceaf548ab484c540ba71267e94bfbe5142ae3aa56f76130963a9cf8df5bc005357fffc6fbfaceba256e1be78fecae4333dadc65ecc110f1b7a6a7b2f08b231d76544e4626c9777f8881e7ca591b8fb60dcc97c8ca6d0037975a887164aeb27cbc1608eea98b3fa3bbabd819c4460958e39d422f386" + "value_hex": "e22809202e4d8f13770e8bcb5f37c5e6e18c122e2cd0c6d09b57c4517cfc095564ba33808b56f6832516d90d799b9372dd032b01c3fddc29d26eb8ff669f1667c21269e7a145ef209c19c42a637bd515e1c6e4f16bcf8eb3830f61e208d43c5c1ce9d706d3767a820609c0ae7394f2abea6d14b4c78b12acb7c34d4c169d163213000000000000005479e4fc7d973a120b32ff8bbe7649cb0d3bfa4c15f9eddb2913f52c486b091ad85c792ed6eaf599c42d85375905b4788314ada2c17b5e63b80b5c3ccd14034d02666785b22d9e3ee8210f12226ebb3867419f94e026e095922747698d15967055896bfa1f677628783bcbe784a2efc175df49ec4f3dd4291a29cdc767ad8a08f26d4a224e6423326b29bfd318fd7eb70f8a9002827f948879ee015448aa0b07b0f5ce6b52d28540ed4c205da7adce178b7902f183ee6f55825792afefc9" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -2575,7 +2575,7 @@ "family": "withdraw_range", "expected_valid": true, "payload": { - "proof_data_hex": "daf6b85b7d9173a3cb33f923cb6da69fc74276fec78a8ef6aac30e723be07156000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100010000000000dcb115507afdd3baf0347fb8de810c66393f569dc88610609fc17e944145c11a601a343741a68462549db59023b6125bc152bdded2f0c04ffe4e3a4eba2c0a107af546637619f572bcc9e7d9ca66f2aca4d3359f3d182ba1cb76986cc3c1785d8820e5a91d3821357680bc77d2e448e00e1840edec51c3fb0dfd685bbb87ae2b1502b93e04051f572bc96430ad0633db3016518882d851c66102515248ee8706d79a69771903712c9286b005baf511fa7c1345428cb56742442c8a9d4568cf0f0ec3480e24b2a4d4316c407cd7e8f00d09080b5c3fcf796ae6ff6d1c30c9720c404c525b65bd7c4f12b9671b0d784eafeb61fe0f894ca67344336035b569161b3ce7e246ff44306ea71884de8b1d40ea21e61250510f9c4bba3f8e3d8537002b98eb882ff94a342e3ce9de6101ec6f32c282987ca39afcfd3f1949d0d6c4b65b08a174bb5259771c9e90d0a246a8c78ae2e20421c62046fb2c57d4625d9162449ade9f2b2234867623040e146c90a3ddd4a28cfad7c06ac455adec9a5a4e3a7aa68476f06462f54f2f05e0b8da117024b6aac1eed04a46507af8eaccd7a18c2406b1a52b6a33f5e7f9de6461e6defa2b6753cb1ca1d66b97d2d9a659b2f67b15b85bc186572839ca7fce150d4fb94abd62d2af9e27c33b329d868d303826cc7566a00db967044c5b279be33bafdf2d4a8af11a402bee57457eb8f61f7592103af895f4bea63bd095c80583f4f8175b1e09fa5fe98de30d71891756902b6f0718ea90a8d06a500157dcc43e58dbc06c3ddc0b5c6122c04a787c62b87d3cf2ce000a25425fac59760e9ae31dba8c716a429c4a2f3a2fede5fe9b381ea56e89bc3875529e4975373bf9d3a2528f7267eeda2401a0b2c1c37fcef26b38e4ec84680d2601e68a826d35048d97211d85309d3d3e52c1a6d73c410041fb0d8b0e15c70f" + "proof_data_hex": "48089c67776a07a59aca28496e13244ceec0484a4c9af83371b6f25781bbbf7a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100010000000000d8ca34cc1875bbd8568fc7e5dec9ce3438ee65feee607cc5eae15f631b76c07ba42d86bd1616510cce8d628d9d2d66812f61090380a34d6760904fe89e47942456904c53d93c34c9b05400efe33014a4efb7cf0ecba18ff90a536b9b76b877038a4a4a7fc0a2c75b01f3f8baabe61db7cd97ac8faad510bdc5febd486d55091ff6abbe65670a0053fa3f91af1d5e1f1d7a129a0f3a2ee59228b988ecedf195085a4e4b3dafd2dc2e283fee1d627cb054671ae9120e0e11e279e904e4d828800858136f64b7087f2e0a8d943cc1af189e88bf8bed39e0823f3cfe0d85e067980be873c0e9d4c2c7e25e3c7b2426697a034e6fd3805a5a1ea24b7e39f5f34288708cf8cd9d1e3534f0264c4971746f159e6f2538623e33892576bddfb28781e34f2c515aa7cdcd392405dfac7f88b90d1e6750ac77d60dc397b39753cead7de02516f94bbd2ffed93f853f0accfeb2ffee5dd6c04f4069291040ca71d742f56870fead1614eb4832e5773b8b4f7453e829103aeddd620aff292bb2c2da602a316ea85e2d04c8d6483ea285c35c7bce565f3ccc5de4983f82004c49a8f80497db1800d7e1ec9ac3693fd82f19505da34248a3d5b7bd8036e3a01b8b844fd9e1d43cce4332bfd96d71d50c86db9d57998a91b2bb53b0a717bae9012edf884bc6b41102643d18262983a318f4af5a7e8fd93b1d642a998c3aa094e6a7aae04dd80f10782b208492872b587ef7b7631b2586df7f4f436cc0509336251f4503e1f4c80e966b59a6f0bed35452de8fc0bf8b48f5ef19dfeef4a78778b2adf689be4d486ca8c63719363d36ae82a77ae8ffccb599c65b19c2364c804cb52b3ca5484da033cb399f426b25e37423c31b24e95cabab9cf8e3d226ad39d8d2c4a8e1b4d19f036b9833ec6e3b0af4a69fe41b462362296468d8b390924cbbd94216262778e50e" }, "mutations": [ { @@ -2583,7 +2583,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "dbf6b85b7d9173a3cb33f923cb6da69fc74276fec78a8ef6aac30e723be07156000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100010000000000dcb115507afdd3baf0347fb8de810c66393f569dc88610609fc17e944145c11a601a343741a68462549db59023b6125bc152bdded2f0c04ffe4e3a4eba2c0a107af546637619f572bcc9e7d9ca66f2aca4d3359f3d182ba1cb76986cc3c1785d8820e5a91d3821357680bc77d2e448e00e1840edec51c3fb0dfd685bbb87ae2b1502b93e04051f572bc96430ad0633db3016518882d851c66102515248ee8706d79a69771903712c9286b005baf511fa7c1345428cb56742442c8a9d4568cf0f0ec3480e24b2a4d4316c407cd7e8f00d09080b5c3fcf796ae6ff6d1c30c9720c404c525b65bd7c4f12b9671b0d784eafeb61fe0f894ca67344336035b569161b3ce7e246ff44306ea71884de8b1d40ea21e61250510f9c4bba3f8e3d8537002b98eb882ff94a342e3ce9de6101ec6f32c282987ca39afcfd3f1949d0d6c4b65b08a174bb5259771c9e90d0a246a8c78ae2e20421c62046fb2c57d4625d9162449ade9f2b2234867623040e146c90a3ddd4a28cfad7c06ac455adec9a5a4e3a7aa68476f06462f54f2f05e0b8da117024b6aac1eed04a46507af8eaccd7a18c2406b1a52b6a33f5e7f9de6461e6defa2b6753cb1ca1d66b97d2d9a659b2f67b15b85bc186572839ca7fce150d4fb94abd62d2af9e27c33b329d868d303826cc7566a00db967044c5b279be33bafdf2d4a8af11a402bee57457eb8f61f7592103af895f4bea63bd095c80583f4f8175b1e09fa5fe98de30d71891756902b6f0718ea90a8d06a500157dcc43e58dbc06c3ddc0b5c6122c04a787c62b87d3cf2ce000a25425fac59760e9ae31dba8c716a429c4a2f3a2fede5fe9b381ea56e89bc3875529e4975373bf9d3a2528f7267eeda2401a0b2c1c37fcef26b38e4ec84680d2601e68a826d35048d97211d85309d3d3e52c1a6d73c410041fb0d8b0e15c70f" + "value_hex": "49089c67776a07a59aca28496e13244ceec0484a4c9af83371b6f25781bbbf7a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100010000000000d8ca34cc1875bbd8568fc7e5dec9ce3438ee65feee607cc5eae15f631b76c07ba42d86bd1616510cce8d628d9d2d66812f61090380a34d6760904fe89e47942456904c53d93c34c9b05400efe33014a4efb7cf0ecba18ff90a536b9b76b877038a4a4a7fc0a2c75b01f3f8baabe61db7cd97ac8faad510bdc5febd486d55091ff6abbe65670a0053fa3f91af1d5e1f1d7a129a0f3a2ee59228b988ecedf195085a4e4b3dafd2dc2e283fee1d627cb054671ae9120e0e11e279e904e4d828800858136f64b7087f2e0a8d943cc1af189e88bf8bed39e0823f3cfe0d85e067980be873c0e9d4c2c7e25e3c7b2426697a034e6fd3805a5a1ea24b7e39f5f34288708cf8cd9d1e3534f0264c4971746f159e6f2538623e33892576bddfb28781e34f2c515aa7cdcd392405dfac7f88b90d1e6750ac77d60dc397b39753cead7de02516f94bbd2ffed93f853f0accfeb2ffee5dd6c04f4069291040ca71d742f56870fead1614eb4832e5773b8b4f7453e829103aeddd620aff292bb2c2da602a316ea85e2d04c8d6483ea285c35c7bce565f3ccc5de4983f82004c49a8f80497db1800d7e1ec9ac3693fd82f19505da34248a3d5b7bd8036e3a01b8b844fd9e1d43cce4332bfd96d71d50c86db9d57998a91b2bb53b0a717bae9012edf884bc6b41102643d18262983a318f4af5a7e8fd93b1d642a998c3aa094e6a7aae04dd80f10782b208492872b587ef7b7631b2586df7f4f436cc0509336251f4503e1f4c80e966b59a6f0bed35452de8fc0bf8b48f5ef19dfeef4a78778b2adf689be4d486ca8c63719363d36ae82a77ae8ffccb599c65b19c2364c804cb52b3ca5484da033cb399f426b25e37423c31b24e95cabab9cf8e3d226ad39d8d2c4a8e1b4d19f036b9833ec6e3b0af4a69fe41b462362296468d8b390924cbbd94216262778e50e" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -2593,7 +2593,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "daf6b85b7d9173a3cb33f923cb6da69fc74276fec78a8ef6aac30e723be07156000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100010000000000dcb115507afdd3baf0347fb8de810c66393f569dc88610609fc17e944145c11a601a343741a68462549db59023b6125bc152bdded2f0c04ffe4e3a4eba2c0a107af546637619f572bcc9e7d9ca66f2aca4d3359f3d182ba1cb76986cc3c1785d8820e5a91d3821357680bc77d2e448e00e1840edec51c3fb0dfd685bbb87ae2b1502b93e04051f572bc96430ad0633db3016518882d851c66102515248ee8706d79a69771903712c9286b005baf511fa7c1345428cb56742442c8a9d4568cf0f0ec3480e24b2a4d4316c407cd7e8f00d09080b5c3fcf796ae6ff6d1c30c9720c404c525b65bd7c4f12b9671b0d784eafeb61fe0f894ca67344336035b569161b3ce7e246ff44306ea71884de8b1d40ea21e61250510f9c4bba3f8e3d8537002b98eb882ff94a342e3ce9de6101ec6f32c282987ca39afcfd3f1949d0d6c4b65b08a174bb5259771c9e90d0a246a8c78ae2e20421c62046fb2c57d4625d9162449ade9f2b2234867623040e146c90a3ddd4a28cfad7c06ac455adec9a5a4e3a7aa68476f06462f54f2f05e0b8da117024b6aac1eed04a46507af8eaccd7a18c2406b1a52b6a33f5e7f9de6461e6defa2b6753cb1ca1d66b97d2d9a659b2f67b15b85bc186572839ca7fce150d4fb94abd62d2af9e27c33b329d868d303826cc7566a00db967044c5b279be33bafdf2d4a8af11a402bee57457eb8f61f7592103af895f4bea63bd095c80583f4f8175b1e09fa5fe98de30d71891756902b6f0718ea90a8d06a500157dcc43e58dbc06c3ddc0b5c6122c04a787c62b87d3cf2ce000a25425fac59760e9ae31dba8c716a429c4a2f3a2fede5fe9b381ea56e89bc3875529e4975373bf9d3a2528f7267eeda2401a0b2c1c37fcef26b38e4ec84680d2601e68a826d35048d97211d85309d3d3e52c1a6d73c410041fb0d8b0e15" + "value_hex": "48089c67776a07a59aca28496e13244ceec0484a4c9af83371b6f25781bbbf7a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100010000000000d8ca34cc1875bbd8568fc7e5dec9ce3438ee65feee607cc5eae15f631b76c07ba42d86bd1616510cce8d628d9d2d66812f61090380a34d6760904fe89e47942456904c53d93c34c9b05400efe33014a4efb7cf0ecba18ff90a536b9b76b877038a4a4a7fc0a2c75b01f3f8baabe61db7cd97ac8faad510bdc5febd486d55091ff6abbe65670a0053fa3f91af1d5e1f1d7a129a0f3a2ee59228b988ecedf195085a4e4b3dafd2dc2e283fee1d627cb054671ae9120e0e11e279e904e4d828800858136f64b7087f2e0a8d943cc1af189e88bf8bed39e0823f3cfe0d85e067980be873c0e9d4c2c7e25e3c7b2426697a034e6fd3805a5a1ea24b7e39f5f34288708cf8cd9d1e3534f0264c4971746f159e6f2538623e33892576bddfb28781e34f2c515aa7cdcd392405dfac7f88b90d1e6750ac77d60dc397b39753cead7de02516f94bbd2ffed93f853f0accfeb2ffee5dd6c04f4069291040ca71d742f56870fead1614eb4832e5773b8b4f7453e829103aeddd620aff292bb2c2da602a316ea85e2d04c8d6483ea285c35c7bce565f3ccc5de4983f82004c49a8f80497db1800d7e1ec9ac3693fd82f19505da34248a3d5b7bd8036e3a01b8b844fd9e1d43cce4332bfd96d71d50c86db9d57998a91b2bb53b0a717bae9012edf884bc6b41102643d18262983a318f4af5a7e8fd93b1d642a998c3aa094e6a7aae04dd80f10782b208492872b587ef7b7631b2586df7f4f436cc0509336251f4503e1f4c80e966b59a6f0bed35452de8fc0bf8b48f5ef19dfeef4a78778b2adf689be4d486ca8c63719363d36ae82a77ae8ffccb599c65b19c2364c804cb52b3ca5484da033cb399f426b25e37423c31b24e95cabab9cf8e3d226ad39d8d2c4a8e1b4d19f036b9833ec6e3b0af4a69fe41b462362296468d8b390924cbbd94216262778" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -2613,7 +2613,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "daf6b85b7d9173a3cb33f923cb6da69fc74276fec78a8ef6aac30e723be07156000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100010000000000dcb115507afdd3baf0347fb8de810c66393f569dc88610609fc17e944145c11a601a343741a68462549db59023b6125bc152bdded2f0c04ffe4e3a4eba2c0a107af546637619f572bcc9e7d9ca66f2aca4d3359f3d182ba1cb76986cc3c1785d8820e5a91d3821357680bc77d2e448e00e1840edec51c3fb0dfd685bbb87ae2b1502b93e04051f572bc96430ad0633db3016518882d851c66102515248ee8706d79a69771903712c9286b005baf511fa7c1345428cb56742442c8a9d4568cf0f0ec3480e24b2a4d4316c407cd7e8f00d09080b5c3fcf796ae6ff6d1c30c9720c404c525b65bd7c4f12b9671b0d784eafeb61fe0f894ca67344336035b569161b3ce7e246ff44306ea71884de8b1d40ea21e61250510f9c4bba3f8e3d8537002b98eb882ff94a342e3ce9de6101ec6f32c282987ca39afcfd3f1949d0d6c4b65b08a174bb5259771c9e90d0a246a8c78ae2e20421c62046fb2c57d4625d9162449ade9f2b2234867623040e146c90a3ddd4a28cfad7c06ac455adec9a5a4e3a7aa68476f06462f54f2f05e0b8da117024b6aac1eed04a46507af8eaccd7a18c2406b1a52b6a33f5e7f9de6461e6defa2b6753cb1ca1d66b97d2d9a659b2f67b15b85bc186572839ca7fce150d4fb94abd62d2af9e27c33b329d868d303826cc7566a00db967044c5b279be33bafdf2d4a8af11a402bee57457eb8f61f7592103af895f4bea63bd095c80583f4f8175b1e09fa5fe98de30d71891756902b6f0718ea90a8d06a500157dcc43e58dbc06c3ddc0b5c6122c04a787c62b87d3cf2ce000a25425fac59760e9ae31dba8c716a429c4a2f3a2fede5fe9b381ea56e89bc3875529e4975373bf9d3a2528f7267eeda2401a0b2c1c37fcef26b38e4ec84680d2601e68a826d35048d97211d85309d3d3e52c1a6d73c410041fb0d8b0e15c70e" + "value_hex": "48089c67776a07a59aca28496e13244ceec0484a4c9af83371b6f25781bbbf7a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100010000000000d8ca34cc1875bbd8568fc7e5dec9ce3438ee65feee607cc5eae15f631b76c07ba42d86bd1616510cce8d628d9d2d66812f61090380a34d6760904fe89e47942456904c53d93c34c9b05400efe33014a4efb7cf0ecba18ff90a536b9b76b877038a4a4a7fc0a2c75b01f3f8baabe61db7cd97ac8faad510bdc5febd486d55091ff6abbe65670a0053fa3f91af1d5e1f1d7a129a0f3a2ee59228b988ecedf195085a4e4b3dafd2dc2e283fee1d627cb054671ae9120e0e11e279e904e4d828800858136f64b7087f2e0a8d943cc1af189e88bf8bed39e0823f3cfe0d85e067980be873c0e9d4c2c7e25e3c7b2426697a034e6fd3805a5a1ea24b7e39f5f34288708cf8cd9d1e3534f0264c4971746f159e6f2538623e33892576bddfb28781e34f2c515aa7cdcd392405dfac7f88b90d1e6750ac77d60dc397b39753cead7de02516f94bbd2ffed93f853f0accfeb2ffee5dd6c04f4069291040ca71d742f56870fead1614eb4832e5773b8b4f7453e829103aeddd620aff292bb2c2da602a316ea85e2d04c8d6483ea285c35c7bce565f3ccc5de4983f82004c49a8f80497db1800d7e1ec9ac3693fd82f19505da34248a3d5b7bd8036e3a01b8b844fd9e1d43cce4332bfd96d71d50c86db9d57998a91b2bb53b0a717bae9012edf884bc6b41102643d18262983a318f4af5a7e8fd93b1d642a998c3aa094e6a7aae04dd80f10782b208492872b587ef7b7631b2586df7f4f436cc0509336251f4503e1f4c80e966b59a6f0bed35452de8fc0bf8b48f5ef19dfeef4a78778b2adf689be4d486ca8c63719363d36ae82a77ae8ffccb599c65b19c2364c804cb52b3ca5484da033cb399f426b25e37423c31b24e95cabab9cf8e3d226ad39d8d2c4a8e1b4d19f036b9833ec6e3b0af4a69fe41b462362296468d8b390924cbbd94216262778e50f" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -2625,14 +2625,14 @@ "family": "withdraw_composite", "expected_valid": true, "payload": { - "equality_proof_data_hex": "30943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de62146e179d05cb4a48da5a4e4fff76ffbb088647694e394b1610c25c92ebc72ac1277cf07a72b9ca39a89968d2b31bd8bb1d95e02d8989569e1b1b33572cf4111135daf6b85b7d9173a3cb33f923cb6da69fc74276fec78a8ef6aac30e723be071560100010000000000fad6d58493e75df68c80373c5ea92bb6990522f972467989f385df7e1f551108ea442bcf11501bd427a2af6f8a58479c296fed6910c76c40d7db933a1a3a3b13a628794838b8df2f1664387635866ad14092fd92c27a136a8a2ebc38d8ea655c2cc09353492bbd37cc5e360a62c06da3822c9f5742ca31211ad18923d185ab022b66f57eb7a205e6df7c837cbe79da383ab3186bbc61ec575e6b41fdf9a2ac0384b03c382746d8977386e9528d2698f30f2c27999232d120bf1a9d3ca4913803", - "range_proof_data_hex": "daf6b85b7d9173a3cb33f923cb6da69fc74276fec78a8ef6aac30e723be07156000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100010000000000dcb115507afdd3baf0347fb8de810c66393f569dc88610609fc17e944145c11a601a343741a68462549db59023b6125bc152bdded2f0c04ffe4e3a4eba2c0a107af546637619f572bcc9e7d9ca66f2aca4d3359f3d182ba1cb76986cc3c1785d8820e5a91d3821357680bc77d2e448e00e1840edec51c3fb0dfd685bbb87ae2b1502b93e04051f572bc96430ad0633db3016518882d851c66102515248ee8706d79a69771903712c9286b005baf511fa7c1345428cb56742442c8a9d4568cf0f0ec3480e24b2a4d4316c407cd7e8f00d09080b5c3fcf796ae6ff6d1c30c9720c404c525b65bd7c4f12b9671b0d784eafeb61fe0f894ca67344336035b569161b3ce7e246ff44306ea71884de8b1d40ea21e61250510f9c4bba3f8e3d8537002b98eb882ff94a342e3ce9de6101ec6f32c282987ca39afcfd3f1949d0d6c4b65b08a174bb5259771c9e90d0a246a8c78ae2e20421c62046fb2c57d4625d9162449ade9f2b2234867623040e146c90a3ddd4a28cfad7c06ac455adec9a5a4e3a7aa68476f06462f54f2f05e0b8da117024b6aac1eed04a46507af8eaccd7a18c2406b1a52b6a33f5e7f9de6461e6defa2b6753cb1ca1d66b97d2d9a659b2f67b15b85bc186572839ca7fce150d4fb94abd62d2af9e27c33b329d868d303826cc7566a00db967044c5b279be33bafdf2d4a8af11a402bee57457eb8f61f7592103af895f4bea63bd095c80583f4f8175b1e09fa5fe98de30d71891756902b6f0718ea90a8d06a500157dcc43e58dbc06c3ddc0b5c6122c04a787c62b87d3cf2ce000a25425fac59760e9ae31dba8c716a429c4a2f3a2fede5fe9b381ea56e89bc3875529e4975373bf9d3a2528f7267eeda2401a0b2c1c37fcef26b38e4ec84680d2601e68a826d35048d97211d85309d3d3e52c1a6d73c410041fb0d8b0e15c70f" + "equality_proof_data_hex": "92d8c7b5d6906b6f027c99e3e28f632cebf1da7aca95a70f1b823edeef6788179803439f982b0455d36e0c9219e8c76f08dafe3354e092dcfcf509c0d6df312d3ce1e553a51ab529ec1b9765762b32728b0ef145da3ad45a21cbbc1eadf6090a4a33564b8905245619ce873f0c7bac40aa19534c3ac6b9cbd642edb9adc6a0480100010000000000b4bcc0641545116c5306bd29f7732ed514369f2092af07d16d14e6dcc499dc3c98f419e9f952b386f68e78632bba63305f458dfd36aba9457447e5f644eaea5b42bb17ece6ff730ab3190331cf3d09e73a2737a5e5e62607f4379adf6ab62a17f8d0ca2e1e1f8c2fe2b4339d38dd676c088f66692daf819e2fd5e6d6c2600f04e596810236dc90c3d46d0975483033f9162393b67542288781cad03132563a07ec83bde7c37f53272421705bd4dbede3a66cb7cf1029e38e662c423e246a4b0b", + "range_proof_data_hex": "4a33564b8905245619ce873f0c7bac40aa19534c3ac6b9cbd642edb9adc6a048000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000100010000000000085ca197bf5f0dc1742de2690d33949db1173012da200858f445fe09c1c14050ec29c447355894241933a9347f93897b2982e07e887cc26ffd693ff314205a2c76b0ad389f384e0f4c4d1670680ddcdda923899c50a391c937a1143c2ff153141e8253229e9a24ccf3627e02336f5c39193f0d4f0c2d04bbf7fca77b0563ef61ed0a63fccbb95d749b7936a655907fb83983f493dd71735e1467d28eac58530a6ab8676fcc571d7a3aa2e501bdd8ba3836ddb360c68652bb2caf0166d485fb08f593f59a38ff60860886031cff1ffb5138f4f0c7e45ccc1a51e682ffe59d3c0186bc62c6532804dfead419b4ce1f89b9eb9ce1e8b2e9f5ad19f669647f4bfb503c64ff9c89b496cf0d4e43fbac3a075ec83423043cebab183609966973630844da4b3ca1929cb0dc8ae15bf951e0d5f2011afcd87823c6ef4fd8ca16e3c6ee0b50c85cf765dcef1e16590cf2a9847eda31bdec3f9383787c509fef5146525f33209817d4ca3b0ee8d3ef7682338eacce388e992d569a218de411cf1f001df009be12be04a5aa22928f82fc131c04b2d6768650c08e3fb305d4ff185582f73e140a108c5bc06d9ba734c7b79a9f638568a7270558e500b70066cc620942583b1d5858ed5c828644c051747533cde779d94f668f6e0a7b3afcf85844d8f110ad4e86a43c2e9019edf07e30616f6ae7a06f851c526697cbb85b509f96fd9eb68449921c4c0ac2fbc9544932c5adbe1bce6ec3ec63945b6e72bd99ebb30dfc5a7c11ecb53b00130edb0cc25f6142bc2e066f27850b66d0cc94ce0732a2856abc615e5cff35209a8819dabb05955510055193bd73e65bde244b83ee233bb730d7b95e77011f4c02a0ce454782d9f09e186fb89b438dd9f079cea54622bd9e26eeeb0bf91521cb12d1e46c3b84567cffe4a90f641eace03c4278cb767b8d7df9de9405" }, "binding": { - "ciphertext_commitment_hex": "6e179d05cb4a48da5a4e4fff76ffbb088647694e394b1610c25c92ebc72ac127", - "ciphertext_handle_hex": "7cf07a72b9ca39a89968d2b31bd8bb1d95e02d8989569e1b1b33572cf4111135", + "ciphertext_commitment_hex": "9803439f982b0455d36e0c9219e8c76f08dafe3354e092dcfcf509c0d6df312d", + "ciphertext_handle_hex": "3ce1e553a51ab529ec1b9765762b32728b0ef145da3ad45a21cbbc1eadf6090a", "expected_nonce_u64": 65537, - "user_pubkey_hex": "30943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214" + "user_pubkey_hex": "92d8c7b5d6906b6f027c99e3e28f632cebf1da7aca95a70f1b823edeef678817" }, "mutations": [ { @@ -2660,7 +2660,7 @@ "op": "bitflip", "target": "binding.user_pubkey_hex", "params": { - "value_hex": "31943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de6214" + "value_hex": "93d8c7b5d6906b6f027c99e3e28f632cebf1da7aca95a70f1b823edeef678817" }, "expected_valid": false, "expected_error_contains": "failed" @@ -2670,7 +2670,7 @@ "op": "truncate", "target": "payload.equality_proof_data_hex", "params": { - "value_hex": "30943df30dfaaceca52cc26c92c0f32f8697a5622a07620953bd911a79de62146e179d05cb4a48da5a4e4fff76ffbb088647694e394b1610c25c92ebc72ac1277cf07a72b9ca39a89968d2b31bd8bb1d95e02d8989569e1b1b33572cf4111135daf6b85b7d9173a3cb33f923cb6da69fc74276fec78a8ef6aac30e723be071560100010000000000fad6d58493e75df68c80373c5ea92bb6990522f972467989f385df7e1f551108ea442bcf11501bd427a2af6f8a58479c296fed6910c76c40d7db933a1a3a3b13a628794838b8df2f1664387635866ad14092fd92c27a136a8a2ebc38d8ea655c2cc09353492bbd37cc5e360a62c06da3822c9f5742ca31211ad18923d185ab022b66f57eb7a205e6df7c837cbe79da383ab3186bbc61ec575e6b41fdf9a2ac0384b03c382746d8977386e9528d2698f30f2c27999232d120bf1a9d3ca491" + "value_hex": "92d8c7b5d6906b6f027c99e3e28f632cebf1da7aca95a70f1b823edeef6788179803439f982b0455d36e0c9219e8c76f08dafe3354e092dcfcf509c0d6df312d3ce1e553a51ab529ec1b9765762b32728b0ef145da3ad45a21cbbc1eadf6090a4a33564b8905245619ce873f0c7bac40aa19534c3ac6b9cbd642edb9adc6a0480100010000000000b4bcc0641545116c5306bd29f7732ed514369f2092af07d16d14e6dcc499dc3c98f419e9f952b386f68e78632bba63305f458dfd36aba9457447e5f644eaea5b42bb17ece6ff730ab3190331cf3d09e73a2737a5e5e62607f4379adf6ab62a17f8d0ca2e1e1f8c2fe2b4339d38dd676c088f66692daf819e2fd5e6d6c2600f04e596810236dc90c3d46d0975483033f9162393b67542288781cad03132563a07ec83bde7c37f53272421705bd4dbede3a66cb7cf1029e38e662c423e246a" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -2692,7 +2692,7 @@ "family": "withdraw_range", "expected_valid": true, "payload": { - "proof_data_hex": "6a1b0c293da2178f571ab7a0215d894bdba11c87679e72d59d503042c2ae33280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000043420f0000000000505ab3571594608ff266f49bf64b5d10d334b26ef34f2bc6231e960c341579374caf64ee398f5f425b0772524e8571f54a291ba0ec2910f93a1d28438d77d013debea25087da4deea666146e0a0c7b4b227a8f8ad10874586e51918f526fb26b045acd926aaa10df3f065be59bc5c444ee5a703234d9162b279209ed9f03546d7be6fe488aa7e2bf767f532457c72083ded90042db22346f60e6f217590e6d051b694075b6c1751cc647a0308a1d2fc9130e29e668b465cd94484ba31a06240aa47b7766b0439fa43f860fc1167469d5dbbc6fad8285ef696619e3f5024b310a208ea0ff4a6c44d23786aa3f43af26ad34ada5edb879f75f97250633aec28e637c9aaf6986909662070d3747de72c8cf04594ed21d6ff2f62cbf08aac20a8528a85231d873c91ffdfe5c196feff231dcacd24c31f998715d1967f42d5114b0486af08a3b9efeb0670bbcd8a2c52644aed881c9502db1ad3b740a16e3f981881028831ba5eb4e3ce6fff642d30a6ddb2ba84c700968a649bf4c58bf7ec7abd14cb68c66c7acfc7c6ad0fbc79706a4f0e66c63c6ea93aa6b9ddd89e0d4a1ba02249602fa7a5fbc568084c7c403210d797e206b45d70f1608d6da2423fae47eda31de3a7e9a96ba58e1d9b7a4a38121188b6d287191862fd64c218cfbaec149df0b502168248912a6d018f0d58026a1bcf4db75e22220cc3f760b3d53494a8c5e67dc2c62a68e8338ab5ace39eabf1ce73b1b95ccef2f90dd6361a7b0fee390222228adb7579e1bf7e310f9e1e07e7527190fe93a474eda521e9356b0cf723b12209412e7f765352669621c11b7d23f0c831cf35cd28e688d380b0b9ac2d8bf5176287cc5dbc33f528c63486df48b4b0a1467cb9743dc99d310662592c7927c2a0fed2301aa0b67c7cbed0b70b33032635fefe03bd448a8993212f38bf21533440c" + "proof_data_hex": "b4f5d8079c2971060f8f5475a1caa98477ea3deb32f1f8c7e998b00235e180040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000043420f00000000002486f71ac72f60765f0c80a63a1bf49439be9e14fb870b37d0745477d32cc71bb2769f24806a264554a2455c02a7be484ae81f9fd32c075eb020c8b979c1225ac0450aa5d904a1968a2b2240524d19430912392accd203490f78bd15f4a74c1d6435e7c88e5e4dbebabc1809b493509a2788d07657030774b960e91463ee35649211e78e5b80d80e0d7651c384b21b0be1e5f7e0d961f727adf066fdf94a710a084a6349297a624f67d3bbe9f311f2dfd6a2e435dc8159a9f7a51e40142469075e83036cae1edf8fc77b6c5c63f4c825c2484d5d131047fffe6f1c3634ff86030c0ebc64cf91bfe407c8b15ab0d92d658a37ac756766196bcb1761d101341658bcaf3e73f2dd319ff51f5bfea9f6d7489b63db1831174661434301ba5981ba79145978abbc2c29556a461d26145f7c39e2a3909ebb3657667b26335975567e33200f8896b47c7fb52de2d41ad1d344df57c8f6d66bec0601e6f1a89022c1b45a62624f1cc822f977e7258445469a909e03415dfb6a870f138bba8eb6d934e4389840af3a6e616faaf989ff3c33d60a75326e4136b29b75d33317146ec1e2f90310a13e698474e98c77dd79a0429dde186a1e165806ccf6c848a12c1834f0f23df614b4addecd239497ae535ef965a8da9c7a1695fd0de9a8c65db7fda33745056a1ac9a9a5af4090a2b9e9eaae54a5a16da3d84704a1e51f4dfd4062f4b8ea693a40d7f1a51f632ac554c046e80607da86c763e4741ea2cc16f637763d275c448ca905e7ee0736579affc9079cc621bfc51f0af81c918bbbe37bcd2bc48f767cf057c3cac736435e69d59cbc401d813c41b2134cf189c538dbe7904d703b8f6a329bca01aadebf6ce2ef2eafeeba1c5074a668256d4bd3f07f15af03a045560f0b2bdf44fda4ae20699fe364572f0b8adca71d0f220b3271cc7f1a9d8c096d0b" }, "mutations": [ { @@ -2700,7 +2700,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "6b1b0c293da2178f571ab7a0215d894bdba11c87679e72d59d503042c2ae33280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000043420f0000000000505ab3571594608ff266f49bf64b5d10d334b26ef34f2bc6231e960c341579374caf64ee398f5f425b0772524e8571f54a291ba0ec2910f93a1d28438d77d013debea25087da4deea666146e0a0c7b4b227a8f8ad10874586e51918f526fb26b045acd926aaa10df3f065be59bc5c444ee5a703234d9162b279209ed9f03546d7be6fe488aa7e2bf767f532457c72083ded90042db22346f60e6f217590e6d051b694075b6c1751cc647a0308a1d2fc9130e29e668b465cd94484ba31a06240aa47b7766b0439fa43f860fc1167469d5dbbc6fad8285ef696619e3f5024b310a208ea0ff4a6c44d23786aa3f43af26ad34ada5edb879f75f97250633aec28e637c9aaf6986909662070d3747de72c8cf04594ed21d6ff2f62cbf08aac20a8528a85231d873c91ffdfe5c196feff231dcacd24c31f998715d1967f42d5114b0486af08a3b9efeb0670bbcd8a2c52644aed881c9502db1ad3b740a16e3f981881028831ba5eb4e3ce6fff642d30a6ddb2ba84c700968a649bf4c58bf7ec7abd14cb68c66c7acfc7c6ad0fbc79706a4f0e66c63c6ea93aa6b9ddd89e0d4a1ba02249602fa7a5fbc568084c7c403210d797e206b45d70f1608d6da2423fae47eda31de3a7e9a96ba58e1d9b7a4a38121188b6d287191862fd64c218cfbaec149df0b502168248912a6d018f0d58026a1bcf4db75e22220cc3f760b3d53494a8c5e67dc2c62a68e8338ab5ace39eabf1ce73b1b95ccef2f90dd6361a7b0fee390222228adb7579e1bf7e310f9e1e07e7527190fe93a474eda521e9356b0cf723b12209412e7f765352669621c11b7d23f0c831cf35cd28e688d380b0b9ac2d8bf5176287cc5dbc33f528c63486df48b4b0a1467cb9743dc99d310662592c7927c2a0fed2301aa0b67c7cbed0b70b33032635fefe03bd448a8993212f38bf21533440c" + "value_hex": "b5f5d8079c2971060f8f5475a1caa98477ea3deb32f1f8c7e998b00235e180040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000043420f00000000002486f71ac72f60765f0c80a63a1bf49439be9e14fb870b37d0745477d32cc71bb2769f24806a264554a2455c02a7be484ae81f9fd32c075eb020c8b979c1225ac0450aa5d904a1968a2b2240524d19430912392accd203490f78bd15f4a74c1d6435e7c88e5e4dbebabc1809b493509a2788d07657030774b960e91463ee35649211e78e5b80d80e0d7651c384b21b0be1e5f7e0d961f727adf066fdf94a710a084a6349297a624f67d3bbe9f311f2dfd6a2e435dc8159a9f7a51e40142469075e83036cae1edf8fc77b6c5c63f4c825c2484d5d131047fffe6f1c3634ff86030c0ebc64cf91bfe407c8b15ab0d92d658a37ac756766196bcb1761d101341658bcaf3e73f2dd319ff51f5bfea9f6d7489b63db1831174661434301ba5981ba79145978abbc2c29556a461d26145f7c39e2a3909ebb3657667b26335975567e33200f8896b47c7fb52de2d41ad1d344df57c8f6d66bec0601e6f1a89022c1b45a62624f1cc822f977e7258445469a909e03415dfb6a870f138bba8eb6d934e4389840af3a6e616faaf989ff3c33d60a75326e4136b29b75d33317146ec1e2f90310a13e698474e98c77dd79a0429dde186a1e165806ccf6c848a12c1834f0f23df614b4addecd239497ae535ef965a8da9c7a1695fd0de9a8c65db7fda33745056a1ac9a9a5af4090a2b9e9eaae54a5a16da3d84704a1e51f4dfd4062f4b8ea693a40d7f1a51f632ac554c046e80607da86c763e4741ea2cc16f637763d275c448ca905e7ee0736579affc9079cc621bfc51f0af81c918bbbe37bcd2bc48f767cf057c3cac736435e69d59cbc401d813c41b2134cf189c538dbe7904d703b8f6a329bca01aadebf6ce2ef2eafeeba1c5074a668256d4bd3f07f15af03a045560f0b2bdf44fda4ae20699fe364572f0b8adca71d0f220b3271cc7f1a9d8c096d0b" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -2710,7 +2710,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "6a1b0c293da2178f571ab7a0215d894bdba11c87679e72d59d503042c2ae33280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000043420f0000000000505ab3571594608ff266f49bf64b5d10d334b26ef34f2bc6231e960c341579374caf64ee398f5f425b0772524e8571f54a291ba0ec2910f93a1d28438d77d013debea25087da4deea666146e0a0c7b4b227a8f8ad10874586e51918f526fb26b045acd926aaa10df3f065be59bc5c444ee5a703234d9162b279209ed9f03546d7be6fe488aa7e2bf767f532457c72083ded90042db22346f60e6f217590e6d051b694075b6c1751cc647a0308a1d2fc9130e29e668b465cd94484ba31a06240aa47b7766b0439fa43f860fc1167469d5dbbc6fad8285ef696619e3f5024b310a208ea0ff4a6c44d23786aa3f43af26ad34ada5edb879f75f97250633aec28e637c9aaf6986909662070d3747de72c8cf04594ed21d6ff2f62cbf08aac20a8528a85231d873c91ffdfe5c196feff231dcacd24c31f998715d1967f42d5114b0486af08a3b9efeb0670bbcd8a2c52644aed881c9502db1ad3b740a16e3f981881028831ba5eb4e3ce6fff642d30a6ddb2ba84c700968a649bf4c58bf7ec7abd14cb68c66c7acfc7c6ad0fbc79706a4f0e66c63c6ea93aa6b9ddd89e0d4a1ba02249602fa7a5fbc568084c7c403210d797e206b45d70f1608d6da2423fae47eda31de3a7e9a96ba58e1d9b7a4a38121188b6d287191862fd64c218cfbaec149df0b502168248912a6d018f0d58026a1bcf4db75e22220cc3f760b3d53494a8c5e67dc2c62a68e8338ab5ace39eabf1ce73b1b95ccef2f90dd6361a7b0fee390222228adb7579e1bf7e310f9e1e07e7527190fe93a474eda521e9356b0cf723b12209412e7f765352669621c11b7d23f0c831cf35cd28e688d380b0b9ac2d8bf5176287cc5dbc33f528c63486df48b4b0a1467cb9743dc99d310662592c7927c2a0fed2301aa0b67c7cbed0b70b33032635fefe03bd448a8993212f38bf21533" + "value_hex": "b4f5d8079c2971060f8f5475a1caa98477ea3deb32f1f8c7e998b00235e180040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000043420f00000000002486f71ac72f60765f0c80a63a1bf49439be9e14fb870b37d0745477d32cc71bb2769f24806a264554a2455c02a7be484ae81f9fd32c075eb020c8b979c1225ac0450aa5d904a1968a2b2240524d19430912392accd203490f78bd15f4a74c1d6435e7c88e5e4dbebabc1809b493509a2788d07657030774b960e91463ee35649211e78e5b80d80e0d7651c384b21b0be1e5f7e0d961f727adf066fdf94a710a084a6349297a624f67d3bbe9f311f2dfd6a2e435dc8159a9f7a51e40142469075e83036cae1edf8fc77b6c5c63f4c825c2484d5d131047fffe6f1c3634ff86030c0ebc64cf91bfe407c8b15ab0d92d658a37ac756766196bcb1761d101341658bcaf3e73f2dd319ff51f5bfea9f6d7489b63db1831174661434301ba5981ba79145978abbc2c29556a461d26145f7c39e2a3909ebb3657667b26335975567e33200f8896b47c7fb52de2d41ad1d344df57c8f6d66bec0601e6f1a89022c1b45a62624f1cc822f977e7258445469a909e03415dfb6a870f138bba8eb6d934e4389840af3a6e616faaf989ff3c33d60a75326e4136b29b75d33317146ec1e2f90310a13e698474e98c77dd79a0429dde186a1e165806ccf6c848a12c1834f0f23df614b4addecd239497ae535ef965a8da9c7a1695fd0de9a8c65db7fda33745056a1ac9a9a5af4090a2b9e9eaae54a5a16da3d84704a1e51f4dfd4062f4b8ea693a40d7f1a51f632ac554c046e80607da86c763e4741ea2cc16f637763d275c448ca905e7ee0736579affc9079cc621bfc51f0af81c918bbbe37bcd2bc48f767cf057c3cac736435e69d59cbc401d813c41b2134cf189c538dbe7904d703b8f6a329bca01aadebf6ce2ef2eafeeba1c5074a668256d4bd3f07f15af03a045560f0b2bdf44fda4ae20699fe364572f0b8adca71d0f220b3271cc7f1a9d8c09" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -2730,7 +2730,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "6a1b0c293da2178f571ab7a0215d894bdba11c87679e72d59d503042c2ae33280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000043420f0000000000505ab3571594608ff266f49bf64b5d10d334b26ef34f2bc6231e960c341579374caf64ee398f5f425b0772524e8571f54a291ba0ec2910f93a1d28438d77d013debea25087da4deea666146e0a0c7b4b227a8f8ad10874586e51918f526fb26b045acd926aaa10df3f065be59bc5c444ee5a703234d9162b279209ed9f03546d7be6fe488aa7e2bf767f532457c72083ded90042db22346f60e6f217590e6d051b694075b6c1751cc647a0308a1d2fc9130e29e668b465cd94484ba31a06240aa47b7766b0439fa43f860fc1167469d5dbbc6fad8285ef696619e3f5024b310a208ea0ff4a6c44d23786aa3f43af26ad34ada5edb879f75f97250633aec28e637c9aaf6986909662070d3747de72c8cf04594ed21d6ff2f62cbf08aac20a8528a85231d873c91ffdfe5c196feff231dcacd24c31f998715d1967f42d5114b0486af08a3b9efeb0670bbcd8a2c52644aed881c9502db1ad3b740a16e3f981881028831ba5eb4e3ce6fff642d30a6ddb2ba84c700968a649bf4c58bf7ec7abd14cb68c66c7acfc7c6ad0fbc79706a4f0e66c63c6ea93aa6b9ddd89e0d4a1ba02249602fa7a5fbc568084c7c403210d797e206b45d70f1608d6da2423fae47eda31de3a7e9a96ba58e1d9b7a4a38121188b6d287191862fd64c218cfbaec149df0b502168248912a6d018f0d58026a1bcf4db75e22220cc3f760b3d53494a8c5e67dc2c62a68e8338ab5ace39eabf1ce73b1b95ccef2f90dd6361a7b0fee390222228adb7579e1bf7e310f9e1e07e7527190fe93a474eda521e9356b0cf723b12209412e7f765352669621c11b7d23f0c831cf35cd28e688d380b0b9ac2d8bf5176287cc5dbc33f528c63486df48b4b0a1467cb9743dc99d310662592c7927c2a0fed2301aa0b67c7cbed0b70b33032635fefe03bd448a8993212f38bf21533440d" + "value_hex": "b4f5d8079c2971060f8f5475a1caa98477ea3deb32f1f8c7e998b00235e180040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000043420f00000000002486f71ac72f60765f0c80a63a1bf49439be9e14fb870b37d0745477d32cc71bb2769f24806a264554a2455c02a7be484ae81f9fd32c075eb020c8b979c1225ac0450aa5d904a1968a2b2240524d19430912392accd203490f78bd15f4a74c1d6435e7c88e5e4dbebabc1809b493509a2788d07657030774b960e91463ee35649211e78e5b80d80e0d7651c384b21b0be1e5f7e0d961f727adf066fdf94a710a084a6349297a624f67d3bbe9f311f2dfd6a2e435dc8159a9f7a51e40142469075e83036cae1edf8fc77b6c5c63f4c825c2484d5d131047fffe6f1c3634ff86030c0ebc64cf91bfe407c8b15ab0d92d658a37ac756766196bcb1761d101341658bcaf3e73f2dd319ff51f5bfea9f6d7489b63db1831174661434301ba5981ba79145978abbc2c29556a461d26145f7c39e2a3909ebb3657667b26335975567e33200f8896b47c7fb52de2d41ad1d344df57c8f6d66bec0601e6f1a89022c1b45a62624f1cc822f977e7258445469a909e03415dfb6a870f138bba8eb6d934e4389840af3a6e616faaf989ff3c33d60a75326e4136b29b75d33317146ec1e2f90310a13e698474e98c77dd79a0429dde186a1e165806ccf6c848a12c1834f0f23df614b4addecd239497ae535ef965a8da9c7a1695fd0de9a8c65db7fda33745056a1ac9a9a5af4090a2b9e9eaae54a5a16da3d84704a1e51f4dfd4062f4b8ea693a40d7f1a51f632ac554c046e80607da86c763e4741ea2cc16f637763d275c448ca905e7ee0736579affc9079cc621bfc51f0af81c918bbbe37bcd2bc48f767cf057c3cac736435e69d59cbc401d813c41b2134cf189c538dbe7904d703b8f6a329bca01aadebf6ce2ef2eafeeba1c5074a668256d4bd3f07f15af03a045560f0b2bdf44fda4ae20699fe364572f0b8adca71d0f220b3271cc7f1a9d8c096d0a" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -2742,14 +2742,14 @@ "family": "withdraw_composite", "expected_valid": true, "payload": { - "equality_proof_data_hex": "aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245262a484e5e4cbeb40ea1e1476916e31fd242721b9079a02d056ec016806da87ec6189216eb993d81636a6087eb30abbf58e9b1b44f721a4bc36115887f9d09456a1b0c293da2178f571ab7a0215d894bdba11c87679e72d59d503042c2ae332843420f00000000007c60353575cbc42b12870066826d22e401fd4b09d4526cd036b6930a10fec87b647e4d3806c34db8328893986ea1319f5f34525c359e919f47dd3b6cef14430886b3a085a1e01d2daf37009ece25a4eff4ab5368269f71ef56a2161ef3f4ec54e9e85fe1bc546e837f801e915c12fb2faccac1c804fdbc7f4e7433c296d34806b237b49930e90e7bcf153423a7e5f71cbbea95cd3d88a6cece9b316055286008efd12f492acc29685d3db091c7385e4f4872b5e3d7b5bd4210a1f7aa140a4d0a", - "range_proof_data_hex": "6a1b0c293da2178f571ab7a0215d894bdba11c87679e72d59d503042c2ae33280000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000043420f0000000000505ab3571594608ff266f49bf64b5d10d334b26ef34f2bc6231e960c341579374caf64ee398f5f425b0772524e8571f54a291ba0ec2910f93a1d28438d77d013debea25087da4deea666146e0a0c7b4b227a8f8ad10874586e51918f526fb26b045acd926aaa10df3f065be59bc5c444ee5a703234d9162b279209ed9f03546d7be6fe488aa7e2bf767f532457c72083ded90042db22346f60e6f217590e6d051b694075b6c1751cc647a0308a1d2fc9130e29e668b465cd94484ba31a06240aa47b7766b0439fa43f860fc1167469d5dbbc6fad8285ef696619e3f5024b310a208ea0ff4a6c44d23786aa3f43af26ad34ada5edb879f75f97250633aec28e637c9aaf6986909662070d3747de72c8cf04594ed21d6ff2f62cbf08aac20a8528a85231d873c91ffdfe5c196feff231dcacd24c31f998715d1967f42d5114b0486af08a3b9efeb0670bbcd8a2c52644aed881c9502db1ad3b740a16e3f981881028831ba5eb4e3ce6fff642d30a6ddb2ba84c700968a649bf4c58bf7ec7abd14cb68c66c7acfc7c6ad0fbc79706a4f0e66c63c6ea93aa6b9ddd89e0d4a1ba02249602fa7a5fbc568084c7c403210d797e206b45d70f1608d6da2423fae47eda31de3a7e9a96ba58e1d9b7a4a38121188b6d287191862fd64c218cfbaec149df0b502168248912a6d018f0d58026a1bcf4db75e22220cc3f760b3d53494a8c5e67dc2c62a68e8338ab5ace39eabf1ce73b1b95ccef2f90dd6361a7b0fee390222228adb7579e1bf7e310f9e1e07e7527190fe93a474eda521e9356b0cf723b12209412e7f765352669621c11b7d23f0c831cf35cd28e688d380b0b9ac2d8bf5176287cc5dbc33f528c63486df48b4b0a1467cb9743dc99d310662592c7927c2a0fed2301aa0b67c7cbed0b70b33032635fefe03bd448a8993212f38bf21533440c" + "equality_proof_data_hex": "269b2044cea025efee559e615a04a71461ce2112778ecd73e0d41b74d3a6111a789fe63478b5c29922a32676a1d4a5333e572fcb7e7b67974d7bea1a5e52fd0e8e1876ad2b15e59b17f662506ad05bcf99c5cab7713af26bc8aa341ac5d6db7dd0cd46cdbeebff31b410fc355da490e4d6186e4486a7e63228f38db43326651743420f0000000000c0c7ebff83cdb6ee01c7fd88d0fb6668e2548059cbaf791b4cae327cc63b15794608d9a0223b6837f8cf14130efaf10a62461e356e2bb76ae0aa2709d97fe55cc62cb5b27563ecb27bae302cd3a462d49f8147c153fd4c03f7e75fdacf525e19ec2f649f4de6d5a34783887d1c8ef1f744cc4963bb07bf127f5564666c4b890b6c42b9cafd27d4e92de242192bbcc99a13323f491f50e0d345670b95473dbc0ea0e5f7483a41fba50ba86762e01594f55c4424231428fcedb8c8c3bccae3810d", + "range_proof_data_hex": "d0cd46cdbeebff31b410fc355da490e4d6186e4486a7e63228f38db4332665170000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000043420f000000000064d80e95882a95a565e651fbeca5b98216318d0d3734533b143ff7acbcd4be3c2ca92d9d23f0b3f6a397f9386a2efdfffd4113e38bb92382371f8905b6e3193066e43e7d9ecdf13d04d2040cb81050ef33648308d512d09b8a5e056fcd148565e0585ab95da4bde767ca7c5d25f5c2ad2ecf2f79ee8dc17d1e36521cc23d2f087a79a7053adb215e9f1dce3a0b428143c7c65cdd2402189fab4d7626279e590ce5b65c8b78d1f08983e8e64a9d434fd47afe3892539b25300a3c60e16f822303260488c904433b3315ada3cab733d5ce8651baad5f26d18e7f97887bac60410b1cb2a599efcb3f86cf78e0c73aaca6e1045821eb2a05d2c1d90dffc6815dc4136494daa6b9ac727ce81dfe50223629a1654688062661e318cdc1f7378494f11e9a57e087e2295c791a59bd1c69cc0b8525947b848aadd539c564dbb09ae0d3733412b09cdb18950bd075180db31ca088cd0895d4283e4acd3a831420a0d77268e6d7b4a3888feae1da82d42bb329a211745072a31c6e4c0995130d37f604916f96865cc78959d6459943548d6fca0112fe92503f45eb5e3db90e38859614034456f3596ac73b00a119b789985bba22fd7ea922a35d192e2731a219991e96de4af2cec4161a9bdbf24bf4066a1c1a4fb712bfc855e286b7b1dc4665aaed4e455352fe77cf1d29849af08d5da1ecc8f2ea565557186cd15231aae4f60f358f6b05a487878f94253e6447bb014a4f99e2a4a5f85beaf7c78a46b023502476b0620d70f1008b3509c4288a9306fc0c8c4d6e797e1e98de96ed56a6c3ce00dde3ec19261063fcc7c45e68c7898022b45921ccc832d3c4d4eb7210c4cd46f1882fbc78ac135a923766929f67962d84ec0e5aaac5234b7c83408a635adba327b7c47901f1fa2799af59db961892483b020e2882b2205a6bd517bededbcc8a429ab3f30c" }, "binding": { - "ciphertext_commitment_hex": "262a484e5e4cbeb40ea1e1476916e31fd242721b9079a02d056ec016806da87e", - "ciphertext_handle_hex": "c6189216eb993d81636a6087eb30abbf58e9b1b44f721a4bc36115887f9d0945", + "ciphertext_commitment_hex": "789fe63478b5c29922a32676a1d4a5333e572fcb7e7b67974d7bea1a5e52fd0e", + "ciphertext_handle_hex": "8e1876ad2b15e59b17f662506ad05bcf99c5cab7713af26bc8aa341ac5d6db7d", "expected_nonce_u64": 1000003, - "user_pubkey_hex": "aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245" + "user_pubkey_hex": "269b2044cea025efee559e615a04a71461ce2112778ecd73e0d41b74d3a6111a" }, "mutations": [ { @@ -2777,7 +2777,7 @@ "op": "bitflip", "target": "binding.user_pubkey_hex", "params": { - "value_hex": "afec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245" + "value_hex": "279b2044cea025efee559e615a04a71461ce2112778ecd73e0d41b74d3a6111a" }, "expected_valid": false, "expected_error_contains": "failed" @@ -2787,7 +2787,7 @@ "op": "truncate", "target": "payload.equality_proof_data_hex", "params": { - "value_hex": "aeec41144ce3a911e82e269aa75ed7f11804ba9fa7b29f664d96c3c792373245262a484e5e4cbeb40ea1e1476916e31fd242721b9079a02d056ec016806da87ec6189216eb993d81636a6087eb30abbf58e9b1b44f721a4bc36115887f9d09456a1b0c293da2178f571ab7a0215d894bdba11c87679e72d59d503042c2ae332843420f00000000007c60353575cbc42b12870066826d22e401fd4b09d4526cd036b6930a10fec87b647e4d3806c34db8328893986ea1319f5f34525c359e919f47dd3b6cef14430886b3a085a1e01d2daf37009ece25a4eff4ab5368269f71ef56a2161ef3f4ec54e9e85fe1bc546e837f801e915c12fb2faccac1c804fdbc7f4e7433c296d34806b237b49930e90e7bcf153423a7e5f71cbbea95cd3d88a6cece9b316055286008efd12f492acc29685d3db091c7385e4f4872b5e3d7b5bd4210a1f7aa140a" + "value_hex": "269b2044cea025efee559e615a04a71461ce2112778ecd73e0d41b74d3a6111a789fe63478b5c29922a32676a1d4a5333e572fcb7e7b67974d7bea1a5e52fd0e8e1876ad2b15e59b17f662506ad05bcf99c5cab7713af26bc8aa341ac5d6db7dd0cd46cdbeebff31b410fc355da490e4d6186e4486a7e63228f38db43326651743420f0000000000c0c7ebff83cdb6ee01c7fd88d0fb6668e2548059cbaf791b4cae327cc63b15794608d9a0223b6837f8cf14130efaf10a62461e356e2bb76ae0aa2709d97fe55cc62cb5b27563ecb27bae302cd3a462d49f8147c153fd4c03f7e75fdacf525e19ec2f649f4de6d5a34783887d1c8ef1f744cc4963bb07bf127f5564666c4b890b6c42b9cafd27d4e92de242192bbcc99a13323f491f50e0d345670b95473dbc0ea0e5f7483a41fba50ba86762e01594f55c4424231428fcedb8c8c3bccae3" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -2809,7 +2809,7 @@ "family": "withdraw_range", "expected_valid": true, "payload": { - "proof_data_hex": "3e6d192dc8efc15927eff7e5363d71a8c0057a38853f6c490d6016da04b1813a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000004b548900000000002cc79f344939169a0b4f24406f549b8cef5cd0eeb5a7def49b342f92c8536a140e2db6a829cdb3d8db3d663b22716831144356c32a65dd8a858971c96c3347642eae6e43472011a06ca28def30f132a555abcb2ba43b3304236c1f904f665b3854e08c47b7ea102a0057790afa4741df0d37982f7dfae06ee46e230a3c996f3fa3101ae7d932365915ead26c2c1af2d13500b5e15ff0a72046bd546519d2500b6335e866af34051d69da1e54741105e0d1cd02a7fd94a610fa0141d9696aa60b509db8636aa21af13eb88aa6869b49fa6b9e955ac3a2a3e9626a0316d911d70f1242d3606a97445d529604f4a3d0d7c9cd0bf25fa120b4fa186b10b3ee4c8572c4727c2a5385214213d9056ecfe3f59a10bc70552a54cd381562a67f5b4fea26e49bee916e387a3f63141bdfb5786e9685e67050143ea8caefbc27ee15449d17025ecaccf36e9f68b709ffa353238832d04e170c43d728d80e036b7ab4432f6d7c9070d3dce9c5bb131523aba8943479f961725c32e80413e4363d375f52207bd8538c7b6156eec66ddbc14f6701511b6ff85fb96518cbccfc51262ae09c0f401c1b21f2bfdb8dba0c2123582b65f6988038ddb1e98d8cb22f6b3394aa924022e824b862c353e0e66058d699e1cf088625672daaaee9642a69f1b166ba1b77522cb185f46161a3e21611a31d25aa64b10e2845bf477494d4f4ffc1d53ac80f71caadb12a5c3d7d6d953fa5df568ec13aa3893bc682494b47e310897832bd115ffcfdd5726066a8e03cd81aa37df3041fc6f4e222491e802ab3e00d6bbac48351023e3b0e2278cac9a474155c49a0530b6036abb0425c2d9341142ef6ee455101a3e8fb451fb284af6bb87531def9081ecfc13a8f670566722fbad8b56e5f4b045086a7328c9646f02d60ae2973fbd2e847c99b78c31e06e6145d16b2d0467b01" + "proof_data_hex": "90207048b4686edf0117587f732a7c765ab86f5c62d30d8b6dde2df1a0b4eb5d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000004b54890000000000a02f26054af2f7f17732ba52e76b80a4146a82bf537eeb1bb18e7f828ae170704efd256c8265cdf7dd3398fcfbc401c4023faf24dc5a9b0c4668e4c529d54f61f451858c3efbd0935f630d3a71dde5855e9afa1644d7307e7d716dd55b193e3e943f4cdb91c6e39f59ae9f360106d78e6f323512a1a0969fe38bb6a35f2d2d77a26c1c63b98cd5addd415adf14671f0fa4bacaecc50d235634f3fac123ebf80f9cce1d7f209707aba8fce92045035bc4382c19c771e5d44bf5095e406deabf0439889496b5f56af57493240955bb5fc4b98443bfebc2b4da77830c6f41e7850dead648fba2a7ddbf2589d76a39d39505898add1dac3805caa3f77458d551a669c621f3d3d2c40166a1471e55c1e5a4f40c5cf58995cacf593eb1947a850b3d5bb692d762c2144925cc2c6b190c104955929e8fab0ab64c137100954ef0955245d8e1d02145b27cc0969c8b3d0ec509343929a2b0b19e6c540c69c548b5ddf614bc783f1b5dbc5767a73ab6104c25024fd495181b348b89d69cf31964d5a9ca4c8a05096ca28a5b7dfffd8d4a16ae49f0f42da1910e4c490f352e889c5ee16771a8f19254ffa0f9c4478bf5175d3cdb39af189ced8932f36aa9b37be815efcb53c0c493fcc7fde6503777740bd5f7c84105073c570cf127698ed61711723b2b053c8559faf46bb823edf2bd4c39a8e0f44fd0d30a6b961b626d3196d9f8ac636bc0d3c372dff618535930b144b02fe81af65a75c272271383aa3062f7de53484998952f250881daee63e9eda2a83b43b4a3faa9d0e571148fb77edac1b8823640784e675733ce1f9eee99b80e7555a72fdd83a9b404f893b28dbf646790cb0d38db75109329824f428d19f9d591d231297e9a732eaa2ee8454c842a018fcd2701a965f4af43aca95d0ee3ed840605a1ec889462d2df9fae1e00b975631c9f4503" }, "mutations": [ { @@ -2817,7 +2817,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "3f6d192dc8efc15927eff7e5363d71a8c0057a38853f6c490d6016da04b1813a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000004b548900000000002cc79f344939169a0b4f24406f549b8cef5cd0eeb5a7def49b342f92c8536a140e2db6a829cdb3d8db3d663b22716831144356c32a65dd8a858971c96c3347642eae6e43472011a06ca28def30f132a555abcb2ba43b3304236c1f904f665b3854e08c47b7ea102a0057790afa4741df0d37982f7dfae06ee46e230a3c996f3fa3101ae7d932365915ead26c2c1af2d13500b5e15ff0a72046bd546519d2500b6335e866af34051d69da1e54741105e0d1cd02a7fd94a610fa0141d9696aa60b509db8636aa21af13eb88aa6869b49fa6b9e955ac3a2a3e9626a0316d911d70f1242d3606a97445d529604f4a3d0d7c9cd0bf25fa120b4fa186b10b3ee4c8572c4727c2a5385214213d9056ecfe3f59a10bc70552a54cd381562a67f5b4fea26e49bee916e387a3f63141bdfb5786e9685e67050143ea8caefbc27ee15449d17025ecaccf36e9f68b709ffa353238832d04e170c43d728d80e036b7ab4432f6d7c9070d3dce9c5bb131523aba8943479f961725c32e80413e4363d375f52207bd8538c7b6156eec66ddbc14f6701511b6ff85fb96518cbccfc51262ae09c0f401c1b21f2bfdb8dba0c2123582b65f6988038ddb1e98d8cb22f6b3394aa924022e824b862c353e0e66058d699e1cf088625672daaaee9642a69f1b166ba1b77522cb185f46161a3e21611a31d25aa64b10e2845bf477494d4f4ffc1d53ac80f71caadb12a5c3d7d6d953fa5df568ec13aa3893bc682494b47e310897832bd115ffcfdd5726066a8e03cd81aa37df3041fc6f4e222491e802ab3e00d6bbac48351023e3b0e2278cac9a474155c49a0530b6036abb0425c2d9341142ef6ee455101a3e8fb451fb284af6bb87531def9081ecfc13a8f670566722fbad8b56e5f4b045086a7328c9646f02d60ae2973fbd2e847c99b78c31e06e6145d16b2d0467b01" + "value_hex": "91207048b4686edf0117587f732a7c765ab86f5c62d30d8b6dde2df1a0b4eb5d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000004b54890000000000a02f26054af2f7f17732ba52e76b80a4146a82bf537eeb1bb18e7f828ae170704efd256c8265cdf7dd3398fcfbc401c4023faf24dc5a9b0c4668e4c529d54f61f451858c3efbd0935f630d3a71dde5855e9afa1644d7307e7d716dd55b193e3e943f4cdb91c6e39f59ae9f360106d78e6f323512a1a0969fe38bb6a35f2d2d77a26c1c63b98cd5addd415adf14671f0fa4bacaecc50d235634f3fac123ebf80f9cce1d7f209707aba8fce92045035bc4382c19c771e5d44bf5095e406deabf0439889496b5f56af57493240955bb5fc4b98443bfebc2b4da77830c6f41e7850dead648fba2a7ddbf2589d76a39d39505898add1dac3805caa3f77458d551a669c621f3d3d2c40166a1471e55c1e5a4f40c5cf58995cacf593eb1947a850b3d5bb692d762c2144925cc2c6b190c104955929e8fab0ab64c137100954ef0955245d8e1d02145b27cc0969c8b3d0ec509343929a2b0b19e6c540c69c548b5ddf614bc783f1b5dbc5767a73ab6104c25024fd495181b348b89d69cf31964d5a9ca4c8a05096ca28a5b7dfffd8d4a16ae49f0f42da1910e4c490f352e889c5ee16771a8f19254ffa0f9c4478bf5175d3cdb39af189ced8932f36aa9b37be815efcb53c0c493fcc7fde6503777740bd5f7c84105073c570cf127698ed61711723b2b053c8559faf46bb823edf2bd4c39a8e0f44fd0d30a6b961b626d3196d9f8ac636bc0d3c372dff618535930b144b02fe81af65a75c272271383aa3062f7de53484998952f250881daee63e9eda2a83b43b4a3faa9d0e571148fb77edac1b8823640784e675733ce1f9eee99b80e7555a72fdd83a9b404f893b28dbf646790cb0d38db75109329824f428d19f9d591d231297e9a732eaa2ee8454c842a018fcd2701a965f4af43aca95d0ee3ed840605a1ec889462d2df9fae1e00b975631c9f4503" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -2827,7 +2827,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "3e6d192dc8efc15927eff7e5363d71a8c0057a38853f6c490d6016da04b1813a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000004b548900000000002cc79f344939169a0b4f24406f549b8cef5cd0eeb5a7def49b342f92c8536a140e2db6a829cdb3d8db3d663b22716831144356c32a65dd8a858971c96c3347642eae6e43472011a06ca28def30f132a555abcb2ba43b3304236c1f904f665b3854e08c47b7ea102a0057790afa4741df0d37982f7dfae06ee46e230a3c996f3fa3101ae7d932365915ead26c2c1af2d13500b5e15ff0a72046bd546519d2500b6335e866af34051d69da1e54741105e0d1cd02a7fd94a610fa0141d9696aa60b509db8636aa21af13eb88aa6869b49fa6b9e955ac3a2a3e9626a0316d911d70f1242d3606a97445d529604f4a3d0d7c9cd0bf25fa120b4fa186b10b3ee4c8572c4727c2a5385214213d9056ecfe3f59a10bc70552a54cd381562a67f5b4fea26e49bee916e387a3f63141bdfb5786e9685e67050143ea8caefbc27ee15449d17025ecaccf36e9f68b709ffa353238832d04e170c43d728d80e036b7ab4432f6d7c9070d3dce9c5bb131523aba8943479f961725c32e80413e4363d375f52207bd8538c7b6156eec66ddbc14f6701511b6ff85fb96518cbccfc51262ae09c0f401c1b21f2bfdb8dba0c2123582b65f6988038ddb1e98d8cb22f6b3394aa924022e824b862c353e0e66058d699e1cf088625672daaaee9642a69f1b166ba1b77522cb185f46161a3e21611a31d25aa64b10e2845bf477494d4f4ffc1d53ac80f71caadb12a5c3d7d6d953fa5df568ec13aa3893bc682494b47e310897832bd115ffcfdd5726066a8e03cd81aa37df3041fc6f4e222491e802ab3e00d6bbac48351023e3b0e2278cac9a474155c49a0530b6036abb0425c2d9341142ef6ee455101a3e8fb451fb284af6bb87531def9081ecfc13a8f670566722fbad8b56e5f4b045086a7328c9646f02d60ae2973fbd2e847c99b78c31e06e6145d16b2d046" + "value_hex": "90207048b4686edf0117587f732a7c765ab86f5c62d30d8b6dde2df1a0b4eb5d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000004b54890000000000a02f26054af2f7f17732ba52e76b80a4146a82bf537eeb1bb18e7f828ae170704efd256c8265cdf7dd3398fcfbc401c4023faf24dc5a9b0c4668e4c529d54f61f451858c3efbd0935f630d3a71dde5855e9afa1644d7307e7d716dd55b193e3e943f4cdb91c6e39f59ae9f360106d78e6f323512a1a0969fe38bb6a35f2d2d77a26c1c63b98cd5addd415adf14671f0fa4bacaecc50d235634f3fac123ebf80f9cce1d7f209707aba8fce92045035bc4382c19c771e5d44bf5095e406deabf0439889496b5f56af57493240955bb5fc4b98443bfebc2b4da77830c6f41e7850dead648fba2a7ddbf2589d76a39d39505898add1dac3805caa3f77458d551a669c621f3d3d2c40166a1471e55c1e5a4f40c5cf58995cacf593eb1947a850b3d5bb692d762c2144925cc2c6b190c104955929e8fab0ab64c137100954ef0955245d8e1d02145b27cc0969c8b3d0ec509343929a2b0b19e6c540c69c548b5ddf614bc783f1b5dbc5767a73ab6104c25024fd495181b348b89d69cf31964d5a9ca4c8a05096ca28a5b7dfffd8d4a16ae49f0f42da1910e4c490f352e889c5ee16771a8f19254ffa0f9c4478bf5175d3cdb39af189ced8932f36aa9b37be815efcb53c0c493fcc7fde6503777740bd5f7c84105073c570cf127698ed61711723b2b053c8559faf46bb823edf2bd4c39a8e0f44fd0d30a6b961b626d3196d9f8ac636bc0d3c372dff618535930b144b02fe81af65a75c272271383aa3062f7de53484998952f250881daee63e9eda2a83b43b4a3faa9d0e571148fb77edac1b8823640784e675733ce1f9eee99b80e7555a72fdd83a9b404f893b28dbf646790cb0d38db75109329824f428d19f9d591d231297e9a732eaa2ee8454c842a018fcd2701a965f4af43aca95d0ee3ed840605a1ec889462d2df9fae1e00b975631c9f" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -2847,7 +2847,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "3e6d192dc8efc15927eff7e5363d71a8c0057a38853f6c490d6016da04b1813a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000004b548900000000002cc79f344939169a0b4f24406f549b8cef5cd0eeb5a7def49b342f92c8536a140e2db6a829cdb3d8db3d663b22716831144356c32a65dd8a858971c96c3347642eae6e43472011a06ca28def30f132a555abcb2ba43b3304236c1f904f665b3854e08c47b7ea102a0057790afa4741df0d37982f7dfae06ee46e230a3c996f3fa3101ae7d932365915ead26c2c1af2d13500b5e15ff0a72046bd546519d2500b6335e866af34051d69da1e54741105e0d1cd02a7fd94a610fa0141d9696aa60b509db8636aa21af13eb88aa6869b49fa6b9e955ac3a2a3e9626a0316d911d70f1242d3606a97445d529604f4a3d0d7c9cd0bf25fa120b4fa186b10b3ee4c8572c4727c2a5385214213d9056ecfe3f59a10bc70552a54cd381562a67f5b4fea26e49bee916e387a3f63141bdfb5786e9685e67050143ea8caefbc27ee15449d17025ecaccf36e9f68b709ffa353238832d04e170c43d728d80e036b7ab4432f6d7c9070d3dce9c5bb131523aba8943479f961725c32e80413e4363d375f52207bd8538c7b6156eec66ddbc14f6701511b6ff85fb96518cbccfc51262ae09c0f401c1b21f2bfdb8dba0c2123582b65f6988038ddb1e98d8cb22f6b3394aa924022e824b862c353e0e66058d699e1cf088625672daaaee9642a69f1b166ba1b77522cb185f46161a3e21611a31d25aa64b10e2845bf477494d4f4ffc1d53ac80f71caadb12a5c3d7d6d953fa5df568ec13aa3893bc682494b47e310897832bd115ffcfdd5726066a8e03cd81aa37df3041fc6f4e222491e802ab3e00d6bbac48351023e3b0e2278cac9a474155c49a0530b6036abb0425c2d9341142ef6ee455101a3e8fb451fb284af6bb87531def9081ecfc13a8f670566722fbad8b56e5f4b045086a7328c9646f02d60ae2973fbd2e847c99b78c31e06e6145d16b2d0467b00" + "value_hex": "90207048b4686edf0117587f732a7c765ab86f5c62d30d8b6dde2df1a0b4eb5d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000004b54890000000000a02f26054af2f7f17732ba52e76b80a4146a82bf537eeb1bb18e7f828ae170704efd256c8265cdf7dd3398fcfbc401c4023faf24dc5a9b0c4668e4c529d54f61f451858c3efbd0935f630d3a71dde5855e9afa1644d7307e7d716dd55b193e3e943f4cdb91c6e39f59ae9f360106d78e6f323512a1a0969fe38bb6a35f2d2d77a26c1c63b98cd5addd415adf14671f0fa4bacaecc50d235634f3fac123ebf80f9cce1d7f209707aba8fce92045035bc4382c19c771e5d44bf5095e406deabf0439889496b5f56af57493240955bb5fc4b98443bfebc2b4da77830c6f41e7850dead648fba2a7ddbf2589d76a39d39505898add1dac3805caa3f77458d551a669c621f3d3d2c40166a1471e55c1e5a4f40c5cf58995cacf593eb1947a850b3d5bb692d762c2144925cc2c6b190c104955929e8fab0ab64c137100954ef0955245d8e1d02145b27cc0969c8b3d0ec509343929a2b0b19e6c540c69c548b5ddf614bc783f1b5dbc5767a73ab6104c25024fd495181b348b89d69cf31964d5a9ca4c8a05096ca28a5b7dfffd8d4a16ae49f0f42da1910e4c490f352e889c5ee16771a8f19254ffa0f9c4478bf5175d3cdb39af189ced8932f36aa9b37be815efcb53c0c493fcc7fde6503777740bd5f7c84105073c570cf127698ed61711723b2b053c8559faf46bb823edf2bd4c39a8e0f44fd0d30a6b961b626d3196d9f8ac636bc0d3c372dff618535930b144b02fe81af65a75c272271383aa3062f7de53484998952f250881daee63e9eda2a83b43b4a3faa9d0e571148fb77edac1b8823640784e675733ce1f9eee99b80e7555a72fdd83a9b404f893b28dbf646790cb0d38db75109329824f428d19f9d591d231297e9a732eaa2ee8454c842a018fcd2701a965f4af43aca95d0ee3ed840605a1ec889462d2df9fae1e00b975631c9f4502" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -2859,14 +2859,14 @@ "family": "withdraw_composite", "expected_valid": true, "payload": { - "equality_proof_data_hex": "ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268dcb2150e7ff8397a4b0542bad139c290d68f2c3a145eb184c2da5afe9955ae3a56af56c138c26add05fcb9cd851e78693418f37471644db2780c3135e9f20a7b3e6d192dc8efc15927eff7e5363d71a8c0057a38853f6c490d6016da04b1813a4b548900000000009677b4bb4036f044f409dfc76544f9feb221b1ca526e89901bc34aa4d25ff17e5c8a4229fc0e2fb318a326b89c8a8b8ee9d754c8e9262186e1e600953ae29b7006d22d5d6e7a095e3f59743cd8c4a0a50493947b2d27378f311e0cea68ae46165a7cd6c9e8355003ce48d3a201c107dc8969b577df2ddb2fe0e1e9f08113690de8e3e20f4ce5fae7ef77adb3ec10994348761ce8626a38f851d3a736063be902b52dc08c6a43dfc160f2d2532ad89468cf66145f848e66538153eb9851de4c0a", - "range_proof_data_hex": "3e6d192dc8efc15927eff7e5363d71a8c0057a38853f6c490d6016da04b1813a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000004b548900000000002cc79f344939169a0b4f24406f549b8cef5cd0eeb5a7def49b342f92c8536a140e2db6a829cdb3d8db3d663b22716831144356c32a65dd8a858971c96c3347642eae6e43472011a06ca28def30f132a555abcb2ba43b3304236c1f904f665b3854e08c47b7ea102a0057790afa4741df0d37982f7dfae06ee46e230a3c996f3fa3101ae7d932365915ead26c2c1af2d13500b5e15ff0a72046bd546519d2500b6335e866af34051d69da1e54741105e0d1cd02a7fd94a610fa0141d9696aa60b509db8636aa21af13eb88aa6869b49fa6b9e955ac3a2a3e9626a0316d911d70f1242d3606a97445d529604f4a3d0d7c9cd0bf25fa120b4fa186b10b3ee4c8572c4727c2a5385214213d9056ecfe3f59a10bc70552a54cd381562a67f5b4fea26e49bee916e387a3f63141bdfb5786e9685e67050143ea8caefbc27ee15449d17025ecaccf36e9f68b709ffa353238832d04e170c43d728d80e036b7ab4432f6d7c9070d3dce9c5bb131523aba8943479f961725c32e80413e4363d375f52207bd8538c7b6156eec66ddbc14f6701511b6ff85fb96518cbccfc51262ae09c0f401c1b21f2bfdb8dba0c2123582b65f6988038ddb1e98d8cb22f6b3394aa924022e824b862c353e0e66058d699e1cf088625672daaaee9642a69f1b166ba1b77522cb185f46161a3e21611a31d25aa64b10e2845bf477494d4f4ffc1d53ac80f71caadb12a5c3d7d6d953fa5df568ec13aa3893bc682494b47e310897832bd115ffcfdd5726066a8e03cd81aa37df3041fc6f4e222491e802ab3e00d6bbac48351023e3b0e2278cac9a474155c49a0530b6036abb0425c2d9341142ef6ee455101a3e8fb451fb284af6bb87531def9081ecfc13a8f670566722fbad8b56e5f4b045086a7328c9646f02d60ae2973fbd2e847c99b78c31e06e6145d16b2d0467b01" + "equality_proof_data_hex": "aaccc8b2f111925812d3c79c9eff877635229ef0e4e1fb65e11f390bc7b2e86554f98649a259f85e83a14d2917f72d39ee40d6c65ebba322a9b83bfa883c1a47a231a79d6b8903b8b94fd065f45423563a2faeda121d74c1650b0f2e639a8470d2e7d45c28711c7eb805963b8fc11b6b5605dcbd9aa008ab95acef76dcfd75494b54890000000000be62b33430a5fc0f20dfa46ed909266637d629a00d3c7989f074dba1bcabe201c8d929df5d9e1722ca531d988da4f8becec6c0cb0fb453dc5b27cc8d0a91455196bc03dcace14c943b511fcc529f5e4ef68e2dbba501738ed16ea0e7e266e37c4879eaef1b5c0ee82f0539c9724b2da12c54aa6ca18e323079d66062e917d30f8c6d83e1bc07871945654eb19994d78f22202fddf31464b8478e784518e60a0a52a9ac0a818907aa166b1368c69b174e753c9f54bcbb3642727750be85de750b", + "range_proof_data_hex": "d2e7d45c28711c7eb805963b8fc11b6b5605dcbd9aa008ab95acef76dcfd7549000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000004b548900000000005ef78f2dad30cd4089d5135c5f1ee82c5a7ada99225a39097afd96a35c46b662705cfc8c5cb3f8fde68b0878ac8e351fbf81fca85b23bcb8b63f1602392b6f1ec027259f0880c96ae78b98648c4fe75026b2bbe32c988934e9639e6e19416c449845647dc832d3dd72bcaa8a57fc1899befe6605f62467009b2383548d740643f9a51665f45c1125f1ed2e330d512a48b503eaf895d3e3a76dff768e4423ec03b7382990ebbbd16e8593d0ec7f84fe08df0b5b7e2080f6b862f3e6e8e959ff0508feeed75799346d651eed46a0fc7a002f3f0941b9fd65fc9e3923905c38a107a68bd3c58908d87703e6fa294e39472b7af4e059d65772a67046bbd25222e8230ee3a8471253ff6f4ab916a7618054ea056477f76a5fbb38e559fae1b0202a28724bc87a787de4407a558f0c06d7a857bfeb69e178eb016b3c0ddce3550c702caaf151566b257417a62e15cb17b114caa9c0376969c22878a198b73141a9d44994844493080141b83ea8c62de8033836d08c81b1998fb8f93e6b3a9aeb05c50e0ad0bce90af4b26a74d385dabf3a4d6899fcd07ba61ffc6ce4b7010a6cbb7845eee5bcbb2364c6eacc120744faa582aa0cb1664add6656f7db7008792ae9f87f146c5d46bf8bee04835ebc550bdb271e1cb9506fc29f9f04638e40f123ee5765bad12bb9d89480fb35850ea5339d6d77d3296b85beb09ee14bb248c4d1de907d66b18b1c390a8218d0d622720530e42f3d5055045416c474cbec95a969254f48be3725feb8f26a6ea10d1a7b5582bceb46759ac3e9ba031a58fa266a306443704eb65b056cc9e4f6e262cf0f8eaf27812f57c97cec6ca89416d50b76ac123a4ab66db00249500f61ca154889163ce61f2b97efa1bc88f704a5c3904e03f5e30ed8980934144aca732fb59397a81ed55255d270fa3cfad84b90df1ef9c676d90e" }, "binding": { - "ciphertext_commitment_hex": "dcb2150e7ff8397a4b0542bad139c290d68f2c3a145eb184c2da5afe9955ae3a", - "ciphertext_handle_hex": "56af56c138c26add05fcb9cd851e78693418f37471644db2780c3135e9f20a7b", + "ciphertext_commitment_hex": "54f98649a259f85e83a14d2917f72d39ee40d6c65ebba322a9b83bfa883c1a47", + "ciphertext_handle_hex": "a231a79d6b8903b8b94fd065f45423563a2faeda121d74c1650b0f2e639a8470", "expected_nonce_u64": 9000011, - "user_pubkey_hex": "ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268" + "user_pubkey_hex": "aaccc8b2f111925812d3c79c9eff877635229ef0e4e1fb65e11f390bc7b2e865" }, "mutations": [ { @@ -2894,7 +2894,7 @@ "op": "bitflip", "target": "binding.user_pubkey_hex", "params": { - "value_hex": "ebd02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268" + "value_hex": "abccc8b2f111925812d3c79c9eff877635229ef0e4e1fb65e11f390bc7b2e865" }, "expected_valid": false, "expected_error_contains": "failed" @@ -2904,7 +2904,7 @@ "op": "truncate", "target": "payload.equality_proof_data_hex", "params": { - "value_hex": "ead02d39a1667132ff0bda3eca68794a37cc254bff5cb4e71a485eb43089d268dcb2150e7ff8397a4b0542bad139c290d68f2c3a145eb184c2da5afe9955ae3a56af56c138c26add05fcb9cd851e78693418f37471644db2780c3135e9f20a7b3e6d192dc8efc15927eff7e5363d71a8c0057a38853f6c490d6016da04b1813a4b548900000000009677b4bb4036f044f409dfc76544f9feb221b1ca526e89901bc34aa4d25ff17e5c8a4229fc0e2fb318a326b89c8a8b8ee9d754c8e9262186e1e600953ae29b7006d22d5d6e7a095e3f59743cd8c4a0a50493947b2d27378f311e0cea68ae46165a7cd6c9e8355003ce48d3a201c107dc8969b577df2ddb2fe0e1e9f08113690de8e3e20f4ce5fae7ef77adb3ec10994348761ce8626a38f851d3a736063be902b52dc08c6a43dfc160f2d2532ad89468cf66145f848e66538153eb9851de" + "value_hex": "aaccc8b2f111925812d3c79c9eff877635229ef0e4e1fb65e11f390bc7b2e86554f98649a259f85e83a14d2917f72d39ee40d6c65ebba322a9b83bfa883c1a47a231a79d6b8903b8b94fd065f45423563a2faeda121d74c1650b0f2e639a8470d2e7d45c28711c7eb805963b8fc11b6b5605dcbd9aa008ab95acef76dcfd75494b54890000000000be62b33430a5fc0f20dfa46ed909266637d629a00d3c7989f074dba1bcabe201c8d929df5d9e1722ca531d988da4f8becec6c0cb0fb453dc5b27cc8d0a91455196bc03dcace14c943b511fcc529f5e4ef68e2dbba501738ed16ea0e7e266e37c4879eaef1b5c0ee82f0539c9724b2da12c54aa6ca18e323079d66062e917d30f8c6d83e1bc07871945654eb19994d78f22202fddf31464b8478e784518e60a0a52a9ac0a818907aa166b1368c69b174e753c9f54bcbb3642727750be85de" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -2926,7 +2926,7 @@ "family": "withdraw_range", "expected_valid": true, "payload": { - "proof_data_hex": "52dd57ed47b0c95a9e366fbc4239ac260c1532e600d1a8e8eb4c268c55a1b958000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000080b8941de7c1b7e2f97ca38af946dd1ef79d257d655a457c56f4050e513f489e6890c53112bb1c67ec48966084c65c4b453b7a405c6ef184edc9c7e6489e9cbd72a2e3f663ca8638a5c03c99a36be5ff26e98c9338384bc040c025160e69e6ec166a087db3f1563bbf5e5e731bfa3d15bf796a60476b8ad0654930d30f2fdef37d9a032894ebbc066a0bf2e81538601a6f9e4256eada2131770ffdfb2a913c6b0ef85a611a5328a4d568f95e3810a8f37d4317f4db06da691da8c1408e4388a90b375b09ea8d0150e546f46df404593cab67f85357c82790c3777cd84d4c52cd0e3e7f4a179c40f6873aee43e7f984e5af274f2b052aed45acad1bfddbb7246f3e940a9c2edb004bc07b7ca17a246d46738214e8d95d360dd52b8a4329deaf4f204e1d617bdb5a52ebfaffac943de64643a2dcd146d90aaae5e15eeebf503aa47402ae31a69b8601eb48f1922f7c3e4ba30611a80ce2a4798efa11a44efd9b272f3ae4038489e06b14a98899f232c92f65dc53ab677c851f094f27e24e5d1b182166ca3b81eaa91be56bba78c1c3c8f2c26499e2f1ded4087896184b59beecac08102ba82b2169478232200a45e87a3c1556110fe711bdbc8eada16f13328db111aaf693f713f80713f54cf4c8681d1588c049452a27d3deb278c1ec3d7023160acc22ee486f25f175c6646f3acdf034e20150f818df3feb53e0d721abbade5737bcccd81f4c7f6df78cee39d07f29193d289f93a338260c0db26eab2b72222e4a8e30f3585cc5d309fdefdec497c1ccbd260e5fd623f55ef6988c769b09388059e622f5e85c5e3ded5be4e3a5596b7355f456845c88fb166c41e30ed40552a93fa3966d2b07018552326e3e86b28cae0fb8a8393cd09b5d6074e35d3808316c033433c9b7c9f2d484e951a11a31c68cf9bcadd02a82c1a35191d6ed48559bcd0b" + "proof_data_hex": "cc64f4a83c7701e907e9711217144365d0c20c25b85569a14d03ce042f62c409000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000080f4fd5599a74cd57b4c4d3672f473a0581bc456571b3ae3d596bf0fe4273ce1067e0c233328852455dad1e42f9c679fdf68200c08b135b60f03d6df763c2c2b0da613daf41577854035d74931c06d7ba2a1b60796b39211688d98bf7e7e63875caadd035720759a53e77d1c71ba90820183e97e342982f1e42a6ab5c57b5303437b531f36bb2e61ac317b14075a6bfa97503f62d1333d77bf8f497cba748b640fef184f9d5106f411746407ed0f957a669bcb67ee9278bf019c7496a7d202740aab87049ca16202df57c2e40c321dfd12b34c1fffa6494879e43e5e45b20706005ea922625b06f6aebca92e2bec48737484831970b93c9aae422571811ef8480d2401faec196536eec87cc49c6f71a9b4c44a0f454fc45b5a391f2e44174d7060a69c000f203e7527b8f2ac9a3eb8166d7a330fd3b50df386f7d38f72fbace74e8005664b0826bdc7c9a22cc915facda0192c236c07a818f00c098db2992e2550201a7d128da2e8397dbed3b81b5ebd3fdd023bc77817ed056728f75656124d587400cede988eb29d6991caceaa7d83b450821fd6bc14aa192f7a5032ca440f6196e2dff2a1be7f6015fab1a2c6c0166be95995dd5bdb1f6853186be3fa0bec70dc347a133ca2a3f304efcde036749a8aacbd430fcade9739955fd10034413823ca04acd2d74b2f27b2f33ce326bc16881139609586e3201d9928df12b6666f4e6c00f261a3eaa9f86da89c3ad4d4eaf2c50ceb7674c52b220481322824d9ad4aee0a4b9c87717b75d3f52651163e08cb8fa10a89366d9363e89ef7c0960c0320d8fa276ed48dcca523a5139b9abbf17be5ca794a090e7b7bf42e5aab7d16817166d0d5b9ef63892aec78564dbae5928b74be08eec1c7b4cea8ec6ec3e23b94001df679826a8b0b77e6740fa4d7e13a545fd4ab3cf1ced3cfdda33e91129fb408" }, "mutations": [ { @@ -2934,7 +2934,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "53dd57ed47b0c95a9e366fbc4239ac260c1532e600d1a8e8eb4c268c55a1b958000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000080b8941de7c1b7e2f97ca38af946dd1ef79d257d655a457c56f4050e513f489e6890c53112bb1c67ec48966084c65c4b453b7a405c6ef184edc9c7e6489e9cbd72a2e3f663ca8638a5c03c99a36be5ff26e98c9338384bc040c025160e69e6ec166a087db3f1563bbf5e5e731bfa3d15bf796a60476b8ad0654930d30f2fdef37d9a032894ebbc066a0bf2e81538601a6f9e4256eada2131770ffdfb2a913c6b0ef85a611a5328a4d568f95e3810a8f37d4317f4db06da691da8c1408e4388a90b375b09ea8d0150e546f46df404593cab67f85357c82790c3777cd84d4c52cd0e3e7f4a179c40f6873aee43e7f984e5af274f2b052aed45acad1bfddbb7246f3e940a9c2edb004bc07b7ca17a246d46738214e8d95d360dd52b8a4329deaf4f204e1d617bdb5a52ebfaffac943de64643a2dcd146d90aaae5e15eeebf503aa47402ae31a69b8601eb48f1922f7c3e4ba30611a80ce2a4798efa11a44efd9b272f3ae4038489e06b14a98899f232c92f65dc53ab677c851f094f27e24e5d1b182166ca3b81eaa91be56bba78c1c3c8f2c26499e2f1ded4087896184b59beecac08102ba82b2169478232200a45e87a3c1556110fe711bdbc8eada16f13328db111aaf693f713f80713f54cf4c8681d1588c049452a27d3deb278c1ec3d7023160acc22ee486f25f175c6646f3acdf034e20150f818df3feb53e0d721abbade5737bcccd81f4c7f6df78cee39d07f29193d289f93a338260c0db26eab2b72222e4a8e30f3585cc5d309fdefdec497c1ccbd260e5fd623f55ef6988c769b09388059e622f5e85c5e3ded5be4e3a5596b7355f456845c88fb166c41e30ed40552a93fa3966d2b07018552326e3e86b28cae0fb8a8393cd09b5d6074e35d3808316c033433c9b7c9f2d484e951a11a31c68cf9bcadd02a82c1a35191d6ed48559bcd0b" + "value_hex": "cd64f4a83c7701e907e9711217144365d0c20c25b85569a14d03ce042f62c409000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000080f4fd5599a74cd57b4c4d3672f473a0581bc456571b3ae3d596bf0fe4273ce1067e0c233328852455dad1e42f9c679fdf68200c08b135b60f03d6df763c2c2b0da613daf41577854035d74931c06d7ba2a1b60796b39211688d98bf7e7e63875caadd035720759a53e77d1c71ba90820183e97e342982f1e42a6ab5c57b5303437b531f36bb2e61ac317b14075a6bfa97503f62d1333d77bf8f497cba748b640fef184f9d5106f411746407ed0f957a669bcb67ee9278bf019c7496a7d202740aab87049ca16202df57c2e40c321dfd12b34c1fffa6494879e43e5e45b20706005ea922625b06f6aebca92e2bec48737484831970b93c9aae422571811ef8480d2401faec196536eec87cc49c6f71a9b4c44a0f454fc45b5a391f2e44174d7060a69c000f203e7527b8f2ac9a3eb8166d7a330fd3b50df386f7d38f72fbace74e8005664b0826bdc7c9a22cc915facda0192c236c07a818f00c098db2992e2550201a7d128da2e8397dbed3b81b5ebd3fdd023bc77817ed056728f75656124d587400cede988eb29d6991caceaa7d83b450821fd6bc14aa192f7a5032ca440f6196e2dff2a1be7f6015fab1a2c6c0166be95995dd5bdb1f6853186be3fa0bec70dc347a133ca2a3f304efcde036749a8aacbd430fcade9739955fd10034413823ca04acd2d74b2f27b2f33ce326bc16881139609586e3201d9928df12b6666f4e6c00f261a3eaa9f86da89c3ad4d4eaf2c50ceb7674c52b220481322824d9ad4aee0a4b9c87717b75d3f52651163e08cb8fa10a89366d9363e89ef7c0960c0320d8fa276ed48dcca523a5139b9abbf17be5ca794a090e7b7bf42e5aab7d16817166d0d5b9ef63892aec78564dbae5928b74be08eec1c7b4cea8ec6ec3e23b94001df679826a8b0b77e6740fa4d7e13a545fd4ab3cf1ced3cfdda33e91129fb408" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -2944,7 +2944,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "52dd57ed47b0c95a9e366fbc4239ac260c1532e600d1a8e8eb4c268c55a1b958000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000080b8941de7c1b7e2f97ca38af946dd1ef79d257d655a457c56f4050e513f489e6890c53112bb1c67ec48966084c65c4b453b7a405c6ef184edc9c7e6489e9cbd72a2e3f663ca8638a5c03c99a36be5ff26e98c9338384bc040c025160e69e6ec166a087db3f1563bbf5e5e731bfa3d15bf796a60476b8ad0654930d30f2fdef37d9a032894ebbc066a0bf2e81538601a6f9e4256eada2131770ffdfb2a913c6b0ef85a611a5328a4d568f95e3810a8f37d4317f4db06da691da8c1408e4388a90b375b09ea8d0150e546f46df404593cab67f85357c82790c3777cd84d4c52cd0e3e7f4a179c40f6873aee43e7f984e5af274f2b052aed45acad1bfddbb7246f3e940a9c2edb004bc07b7ca17a246d46738214e8d95d360dd52b8a4329deaf4f204e1d617bdb5a52ebfaffac943de64643a2dcd146d90aaae5e15eeebf503aa47402ae31a69b8601eb48f1922f7c3e4ba30611a80ce2a4798efa11a44efd9b272f3ae4038489e06b14a98899f232c92f65dc53ab677c851f094f27e24e5d1b182166ca3b81eaa91be56bba78c1c3c8f2c26499e2f1ded4087896184b59beecac08102ba82b2169478232200a45e87a3c1556110fe711bdbc8eada16f13328db111aaf693f713f80713f54cf4c8681d1588c049452a27d3deb278c1ec3d7023160acc22ee486f25f175c6646f3acdf034e20150f818df3feb53e0d721abbade5737bcccd81f4c7f6df78cee39d07f29193d289f93a338260c0db26eab2b72222e4a8e30f3585cc5d309fdefdec497c1ccbd260e5fd623f55ef6988c769b09388059e622f5e85c5e3ded5be4e3a5596b7355f456845c88fb166c41e30ed40552a93fa3966d2b07018552326e3e86b28cae0fb8a8393cd09b5d6074e35d3808316c033433c9b7c9f2d484e951a11a31c68cf9bcadd02a82c1a35191d6ed48559b" + "value_hex": "cc64f4a83c7701e907e9711217144365d0c20c25b85569a14d03ce042f62c409000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000080f4fd5599a74cd57b4c4d3672f473a0581bc456571b3ae3d596bf0fe4273ce1067e0c233328852455dad1e42f9c679fdf68200c08b135b60f03d6df763c2c2b0da613daf41577854035d74931c06d7ba2a1b60796b39211688d98bf7e7e63875caadd035720759a53e77d1c71ba90820183e97e342982f1e42a6ab5c57b5303437b531f36bb2e61ac317b14075a6bfa97503f62d1333d77bf8f497cba748b640fef184f9d5106f411746407ed0f957a669bcb67ee9278bf019c7496a7d202740aab87049ca16202df57c2e40c321dfd12b34c1fffa6494879e43e5e45b20706005ea922625b06f6aebca92e2bec48737484831970b93c9aae422571811ef8480d2401faec196536eec87cc49c6f71a9b4c44a0f454fc45b5a391f2e44174d7060a69c000f203e7527b8f2ac9a3eb8166d7a330fd3b50df386f7d38f72fbace74e8005664b0826bdc7c9a22cc915facda0192c236c07a818f00c098db2992e2550201a7d128da2e8397dbed3b81b5ebd3fdd023bc77817ed056728f75656124d587400cede988eb29d6991caceaa7d83b450821fd6bc14aa192f7a5032ca440f6196e2dff2a1be7f6015fab1a2c6c0166be95995dd5bdb1f6853186be3fa0bec70dc347a133ca2a3f304efcde036749a8aacbd430fcade9739955fd10034413823ca04acd2d74b2f27b2f33ce326bc16881139609586e3201d9928df12b6666f4e6c00f261a3eaa9f86da89c3ad4d4eaf2c50ceb7674c52b220481322824d9ad4aee0a4b9c87717b75d3f52651163e08cb8fa10a89366d9363e89ef7c0960c0320d8fa276ed48dcca523a5139b9abbf17be5ca794a090e7b7bf42e5aab7d16817166d0d5b9ef63892aec78564dbae5928b74be08eec1c7b4cea8ec6ec3e23b94001df679826a8b0b77e6740fa4d7e13a545fd4ab3cf1ced3cfdda33e91129f" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -2964,7 +2964,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "52dd57ed47b0c95a9e366fbc4239ac260c1532e600d1a8e8eb4c268c55a1b958000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000080b8941de7c1b7e2f97ca38af946dd1ef79d257d655a457c56f4050e513f489e6890c53112bb1c67ec48966084c65c4b453b7a405c6ef184edc9c7e6489e9cbd72a2e3f663ca8638a5c03c99a36be5ff26e98c9338384bc040c025160e69e6ec166a087db3f1563bbf5e5e731bfa3d15bf796a60476b8ad0654930d30f2fdef37d9a032894ebbc066a0bf2e81538601a6f9e4256eada2131770ffdfb2a913c6b0ef85a611a5328a4d568f95e3810a8f37d4317f4db06da691da8c1408e4388a90b375b09ea8d0150e546f46df404593cab67f85357c82790c3777cd84d4c52cd0e3e7f4a179c40f6873aee43e7f984e5af274f2b052aed45acad1bfddbb7246f3e940a9c2edb004bc07b7ca17a246d46738214e8d95d360dd52b8a4329deaf4f204e1d617bdb5a52ebfaffac943de64643a2dcd146d90aaae5e15eeebf503aa47402ae31a69b8601eb48f1922f7c3e4ba30611a80ce2a4798efa11a44efd9b272f3ae4038489e06b14a98899f232c92f65dc53ab677c851f094f27e24e5d1b182166ca3b81eaa91be56bba78c1c3c8f2c26499e2f1ded4087896184b59beecac08102ba82b2169478232200a45e87a3c1556110fe711bdbc8eada16f13328db111aaf693f713f80713f54cf4c8681d1588c049452a27d3deb278c1ec3d7023160acc22ee486f25f175c6646f3acdf034e20150f818df3feb53e0d721abbade5737bcccd81f4c7f6df78cee39d07f29193d289f93a338260c0db26eab2b72222e4a8e30f3585cc5d309fdefdec497c1ccbd260e5fd623f55ef6988c769b09388059e622f5e85c5e3ded5be4e3a5596b7355f456845c88fb166c41e30ed40552a93fa3966d2b07018552326e3e86b28cae0fb8a8393cd09b5d6074e35d3808316c033433c9b7c9f2d484e951a11a31c68cf9bcadd02a82c1a35191d6ed48559bcd0a" + "value_hex": "cc64f4a83c7701e907e9711217144365d0c20c25b85569a14d03ce042f62c409000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000080f4fd5599a74cd57b4c4d3672f473a0581bc456571b3ae3d596bf0fe4273ce1067e0c233328852455dad1e42f9c679fdf68200c08b135b60f03d6df763c2c2b0da613daf41577854035d74931c06d7ba2a1b60796b39211688d98bf7e7e63875caadd035720759a53e77d1c71ba90820183e97e342982f1e42a6ab5c57b5303437b531f36bb2e61ac317b14075a6bfa97503f62d1333d77bf8f497cba748b640fef184f9d5106f411746407ed0f957a669bcb67ee9278bf019c7496a7d202740aab87049ca16202df57c2e40c321dfd12b34c1fffa6494879e43e5e45b20706005ea922625b06f6aebca92e2bec48737484831970b93c9aae422571811ef8480d2401faec196536eec87cc49c6f71a9b4c44a0f454fc45b5a391f2e44174d7060a69c000f203e7527b8f2ac9a3eb8166d7a330fd3b50df386f7d38f72fbace74e8005664b0826bdc7c9a22cc915facda0192c236c07a818f00c098db2992e2550201a7d128da2e8397dbed3b81b5ebd3fdd023bc77817ed056728f75656124d587400cede988eb29d6991caceaa7d83b450821fd6bc14aa192f7a5032ca440f6196e2dff2a1be7f6015fab1a2c6c0166be95995dd5bdb1f6853186be3fa0bec70dc347a133ca2a3f304efcde036749a8aacbd430fcade9739955fd10034413823ca04acd2d74b2f27b2f33ce326bc16881139609586e3201d9928df12b6666f4e6c00f261a3eaa9f86da89c3ad4d4eaf2c50ceb7674c52b220481322824d9ad4aee0a4b9c87717b75d3f52651163e08cb8fa10a89366d9363e89ef7c0960c0320d8fa276ed48dcca523a5139b9abbf17be5ca794a090e7b7bf42e5aab7d16817166d0d5b9ef63892aec78564dbae5928b74be08eec1c7b4cea8ec6ec3e23b94001df679826a8b0b77e6740fa4d7e13a545fd4ab3cf1ced3cfdda33e91129fb409" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -2976,14 +2976,14 @@ "family": "withdraw_composite", "expected_valid": true, "payload": { - "equality_proof_data_hex": "5e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b203f5513d3e630a3a324d933fab83be829bde21eb7b451273380597ba24c9c659eb1cdeeee42f4d13a42a61cb1c359c5a943fdf22b74e515b9e49a48eb5b2e4552dd57ed47b0c95a9e366fbc4239ac260c1532e600d1a8e8eb4c268c55a1b9580000000000000080bab95b9f9f4a4a9d8a26dbdd23dd4661cf41b7265994f26964a0d7589e1d7f426626f9293b66cf40198c2aee42c0d0ef89fd363b911720492e1cd1d1f9fe5f4df6780f56d0972242afe0ae9c9c5825479e61ed043e58949291d988a36d34be1a2259fdc9862397d309313a2395670d813e84e515a86f2bf96d1a81d76d4d6102ff987ef395562be84c6c70d3734108a6465cf0d893ec377712430918d4fe7e0998c67f145e7fa45ac21c35814223b57e13be107c70cd68b555ff7cee25ce8c05", - "range_proof_data_hex": "52dd57ed47b0c95a9e366fbc4239ac260c1532e600d1a8e8eb4c268c55a1b958000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000080b8941de7c1b7e2f97ca38af946dd1ef79d257d655a457c56f4050e513f489e6890c53112bb1c67ec48966084c65c4b453b7a405c6ef184edc9c7e6489e9cbd72a2e3f663ca8638a5c03c99a36be5ff26e98c9338384bc040c025160e69e6ec166a087db3f1563bbf5e5e731bfa3d15bf796a60476b8ad0654930d30f2fdef37d9a032894ebbc066a0bf2e81538601a6f9e4256eada2131770ffdfb2a913c6b0ef85a611a5328a4d568f95e3810a8f37d4317f4db06da691da8c1408e4388a90b375b09ea8d0150e546f46df404593cab67f85357c82790c3777cd84d4c52cd0e3e7f4a179c40f6873aee43e7f984e5af274f2b052aed45acad1bfddbb7246f3e940a9c2edb004bc07b7ca17a246d46738214e8d95d360dd52b8a4329deaf4f204e1d617bdb5a52ebfaffac943de64643a2dcd146d90aaae5e15eeebf503aa47402ae31a69b8601eb48f1922f7c3e4ba30611a80ce2a4798efa11a44efd9b272f3ae4038489e06b14a98899f232c92f65dc53ab677c851f094f27e24e5d1b182166ca3b81eaa91be56bba78c1c3c8f2c26499e2f1ded4087896184b59beecac08102ba82b2169478232200a45e87a3c1556110fe711bdbc8eada16f13328db111aaf693f713f80713f54cf4c8681d1588c049452a27d3deb278c1ec3d7023160acc22ee486f25f175c6646f3acdf034e20150f818df3feb53e0d721abbade5737bcccd81f4c7f6df78cee39d07f29193d289f93a338260c0db26eab2b72222e4a8e30f3585cc5d309fdefdec497c1ccbd260e5fd623f55ef6988c769b09388059e622f5e85c5e3ded5be4e3a5596b7355f456845c88fb166c41e30ed40552a93fa3966d2b07018552326e3e86b28cae0fb8a8393cd09b5d6074e35d3808316c033433c9b7c9f2d484e951a11a31c68cf9bcadd02a82c1a35191d6ed48559bcd0b" + "equality_proof_data_hex": "d4508ad57e19936d09a2584f4b537b138dad4ae24fd0274a25fa67f16cff945bf042e0b9d9fc141c895045ad93b59c363340ae8588d85d510fbcb1ff32b1af3e548cf55ce1f7719368cee0b66d6b825351df240b5989b6d1a341af5be086d131b89b086c4fc93fd651e24e509cae024e72c670324d0ff10343a809b75488743900000000000000804e63b3f9b69b8b71e7406a281f01725ed6fa00b46e39812a3d5fb831934344515a49e98376320bbd90013771fc5bbaebc1020a8486baa5dae03de3a2d1bf95117661302f0fdf3fef19622e2d7a03abb97bdc0f2ef5e328655a88b99cdf313848bba1fd8078cb0d3c9870911f644b37084f22431a50bb0cc3356e894a9e5177035974434164596ab6e3dec8a8cb8eace8e4ce76e2ebb1f4d33bbd209e1faa340e99d471aec0558e858defff7c1243d289e9146c6ff279f4e12c62b95cd9fa1c0a", + "range_proof_data_hex": "b89b086c4fc93fd651e24e509cae024e72c670324d0ff10343a809b754887439000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000080d2391839dc9fb76d9aa88b82354d4c13316118d160c8715da72c5c6ccae057747c05342819cc8ba44e90970a574229f0771696da78ef38e0452c142770673164a81b9f2e36f9bc596280502771c8a57ff1bd4dd3b1a0a43bdab075a8181d270fe2751a04f52abfac307e7db7369f2dd1472b40d2b3e24b7df5e6457055c2fa56c574d7c2d68aeacdb805b0f3a07d3dc0ab35b52f453f4956d0d6d5e4dbf42f077acddff721f679f47886e30c3574653300c1c64179066b5f81a120af7ba60509d4b5e79665b4f6d311755a63e8bec4a21ee5aecd2a6964c362cba968815ea907bcc28d0c55c448c466dfba3f3f79d704ee7a79ebfd441028b7b581c92841f7690a108f4c3d4a854443d78edfc9d27e77b699072fbd579ea22d4a61ab64e2211b189c5c76495ceb1dde629644be56c7f70a548e56eaba705f097a48f30e1fe2168e38f1f7548c51b5ce65217cafc009d2d8573258f5256337883c77d04f7f9031fa1ed7fd6bf62a7220cd719a90ca3a328e76e411d2b8c8ddd3cdf20dca6c812bb49306ca43294892d25a915ba7d877874a8cb11dc752dff85822b6936c7bd76f1aae58cca2d9f34e4015c97947dfddddfb870b3dfff1e56b99cc2edbb0368a1cac847840bc32918fa249cf44f866c7915a7e26fb15208eb40e354add3c6d0c5098df7ede2c4fb630ca3eb3e40b8f58dbb4910f4087c1583f794587429e6f6973ea18c7f06d4241d22d616368ad893c4736ca90ff98bc54630520354886d33b3ac8a17541f45b7955e5ddad906bd0f45c6e75c0d69d308a3ba400ba3fa2f70c6b502212492e78bae0beb5c6a1167af27d5ef13d118c5c0027605dfcc98431f9791ecb2fa3e5da4404415ae77e5bf7a4f9792f3d195eaf8ae428ad4daac4e3d4036e8309f956d565919d70a9f248bf8dff93b2d4a45d9ceb3cf037da6c587c1e0c" }, "binding": { - "ciphertext_commitment_hex": "203f5513d3e630a3a324d933fab83be829bde21eb7b451273380597ba24c9c65", - "ciphertext_handle_hex": "9eb1cdeeee42f4d13a42a61cb1c359c5a943fdf22b74e515b9e49a48eb5b2e45", + "ciphertext_commitment_hex": "f042e0b9d9fc141c895045ad93b59c363340ae8588d85d510fbcb1ff32b1af3e", + "ciphertext_handle_hex": "548cf55ce1f7719368cee0b66d6b825351df240b5989b6d1a341af5be086d131", "expected_nonce_u64": 9223372036854775808, - "user_pubkey_hex": "5e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b" + "user_pubkey_hex": "d4508ad57e19936d09a2584f4b537b138dad4ae24fd0274a25fa67f16cff945b" }, "mutations": [ { @@ -3011,7 +3011,7 @@ "op": "bitflip", "target": "binding.user_pubkey_hex", "params": { - "value_hex": "5f06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b" + "value_hex": "d5508ad57e19936d09a2584f4b537b138dad4ae24fd0274a25fa67f16cff945b" }, "expected_valid": false, "expected_error_contains": "failed" @@ -3021,7 +3021,7 @@ "op": "truncate", "target": "payload.equality_proof_data_hex", "params": { - "value_hex": "5e06667599faed020e9ef12b211963612709d7ae72c015c203326a7bdbcd870b203f5513d3e630a3a324d933fab83be829bde21eb7b451273380597ba24c9c659eb1cdeeee42f4d13a42a61cb1c359c5a943fdf22b74e515b9e49a48eb5b2e4552dd57ed47b0c95a9e366fbc4239ac260c1532e600d1a8e8eb4c268c55a1b9580000000000000080bab95b9f9f4a4a9d8a26dbdd23dd4661cf41b7265994f26964a0d7589e1d7f426626f9293b66cf40198c2aee42c0d0ef89fd363b911720492e1cd1d1f9fe5f4df6780f56d0972242afe0ae9c9c5825479e61ed043e58949291d988a36d34be1a2259fdc9862397d309313a2395670d813e84e515a86f2bf96d1a81d76d4d6102ff987ef395562be84c6c70d3734108a6465cf0d893ec377712430918d4fe7e0998c67f145e7fa45ac21c35814223b57e13be107c70cd68b555ff7cee25ce" + "value_hex": "d4508ad57e19936d09a2584f4b537b138dad4ae24fd0274a25fa67f16cff945bf042e0b9d9fc141c895045ad93b59c363340ae8588d85d510fbcb1ff32b1af3e548cf55ce1f7719368cee0b66d6b825351df240b5989b6d1a341af5be086d131b89b086c4fc93fd651e24e509cae024e72c670324d0ff10343a809b75488743900000000000000804e63b3f9b69b8b71e7406a281f01725ed6fa00b46e39812a3d5fb831934344515a49e98376320bbd90013771fc5bbaebc1020a8486baa5dae03de3a2d1bf95117661302f0fdf3fef19622e2d7a03abb97bdc0f2ef5e328655a88b99cdf313848bba1fd8078cb0d3c9870911f644b37084f22431a50bb0cc3356e894a9e5177035974434164596ab6e3dec8a8cb8eace8e4ce76e2ebb1f4d33bbd209e1faa340e99d471aec0558e858defff7c1243d289e9146c6ff279f4e12c62b95cd9fa" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -3043,7 +3043,7 @@ "family": "withdraw_range", "expected_valid": true, "payload": { - "proof_data_hex": "c88ec8dc255d2667627ecd06acf71cc543fddaeb180573e3cc6b55f2e59b5b39000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000001100000000000080eee9633ad3aefa0ee13ec7d24bf8f480cb6adf1afefc184bf552c212ec30d21cf625ce4bf963e17604b0df60a8e05a76891b3fd12a3a359b14323537a8e8ec14dac0e9ff757d433b6af765e5ea29fa51b3d0ee989d8f952079f2d400e2c98778b0d04c1be4c62d246fa592f0dfb67b83a02a8d0405c5e68fce4c648058a76f39813a4108dcce3eaefde729c952ea7e9279074c0d1d5576d1ab2dd711bf7d3d045f6be2f3e64f29199dbeb2776283d013190c932b0cd53c202af677154d49430a61e783a7847b758c948605c56a390f4a29fac458bc71a41bde1c20275060bb09a0cf63cbeddf5cc16427a2f3c47c2f5bbc0f817caf4599d8e5b685adf698682ffc62b9e7ae839bed2276129dc7e360bc39bb7a0224a8602bb887dc80390f023e186ae0d8da4f5733e7b0cf0c758dbd9cf8beb8d1fa4d815c5e85a68a239c361df81644bedbf0559acdb31ba912a59b2d4c2ccac729ed0685e0ff0a1ec45d6a419a3d0fd89f46da20644dd205d467c6b8be39ca14fa7d0fa4f2528d8023126f1610749a8fd3141160512eb80fa9edad736494dbbe2c17063a8bcb8a1fff0a0f0eac35cb8703a54d3217320b67bef6985b9cfce134211ba517392b13565e403e240a2771c3878b992233d771a81a78569bc412207ba3771d5f102644ec5ec53c6dde71ff0b73f718ab393a35c582991fffedddea451b7411fc00cb2a446c87662f7ac49db80696e19aa99de3b555c0659f5b2b8a8ed9a882396077b7df1300d76416510ae1123f7c0e446a56d63bfe93b32d9e0a854fef560d5a97ddb13914ae7602ccb2d2a506c212f9983d171c8dcf965cadfccda7ad167a7d2f3d4838ef1300e5977a17187d6fe95ca3712e3c46cb621b270233ad96d51a7805b87a78d8c60da0b175a65a6d16b10529d6c4ff0e233a65cbcaafd9ec932ba0ce89cca831df08" + "proof_data_hex": "16af33e423b0ff29ece3ee624ce1b4333c82721b313b23ac6ad6232caf3b0a1e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000011000000000000805635632b3c50cd1283476b154ea67b2a3be90c9b5fb1c77415a06b9ca9683e167299e165bed2449c9e9c6585046e75d556e45bbb41635de0ee1d2b909a2962742024f245ca0d2a4e2f16e819b14da263943f4a5614771c98feb8cb4b73b98e1d9ad3bd2b6bb8cf6f5a51f63d4c5811edf9a644dcf1b773ca0e54e80101b89b2b4f63f248f621ce8b3fd2764582033e36e31b7cc60b95bf2acca9b2e43ebb750c1ee062da555e76878c6daa3a251a53137dec828d87425adb12819ce522c6540040b50cdbedb4c441e52db39970cb8f1c70739ba36334216e66427d2a96f9d2085a67aa3e81de724b064023b446cf9ce4fc73d55ae0ab1d5c71c1dc666a59e35e886ec8b620ef798f49c1564bbaee590e770c916f109a6dbbf588ae4beb190d3d8887e85aeb5810a5a22dbbe105080d918030b1581b7fe2099ac15a77d2897d1326c0cba2948b1a94189a18f8b1056de2b5b97377e3490c6046c62b64789d607b3cfb8eda01afd0d4a29224be23c922344b76ee61415b7fb59d885358be1fb62db62d3d015490cc64562c70fdc6afcbf12ec83e7ba02fca75c7e266a6cb9aa35252b1784a7b3a8c06f6675eb27eaecfc6802717d93c4a17405902d9263c6a2e6c92103f7603b8f2a22953437214e878464c4e551bf0d46b0e01ad1b399fa2024c54913bc3df5724960a856cb1db98b6c93d68fa92813bf47a01793a4b5b137c131e6835ab5f6b8747e8f44465b9e118e9b84d7840fd3eb6ad02b5c2066b8b6340d45a73f0ca1108745ed15c7893fe9e3e89fb2ca692a2fef68905e58628d5a61c90843f1f724a412817fcb144bda5c834c854a2fa5328b79d4bde4dfad8388212a6e68550069cc2cb169a60fea624b57789257071d5fb7c4160b2908965bfcf081af45adcf3a52e35454ab2365021074bf982aefd63a60ea32aecb42afef7bc0d" }, "mutations": [ { @@ -3051,7 +3051,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "c98ec8dc255d2667627ecd06acf71cc543fddaeb180573e3cc6b55f2e59b5b39000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000001100000000000080eee9633ad3aefa0ee13ec7d24bf8f480cb6adf1afefc184bf552c212ec30d21cf625ce4bf963e17604b0df60a8e05a76891b3fd12a3a359b14323537a8e8ec14dac0e9ff757d433b6af765e5ea29fa51b3d0ee989d8f952079f2d400e2c98778b0d04c1be4c62d246fa592f0dfb67b83a02a8d0405c5e68fce4c648058a76f39813a4108dcce3eaefde729c952ea7e9279074c0d1d5576d1ab2dd711bf7d3d045f6be2f3e64f29199dbeb2776283d013190c932b0cd53c202af677154d49430a61e783a7847b758c948605c56a390f4a29fac458bc71a41bde1c20275060bb09a0cf63cbeddf5cc16427a2f3c47c2f5bbc0f817caf4599d8e5b685adf698682ffc62b9e7ae839bed2276129dc7e360bc39bb7a0224a8602bb887dc80390f023e186ae0d8da4f5733e7b0cf0c758dbd9cf8beb8d1fa4d815c5e85a68a239c361df81644bedbf0559acdb31ba912a59b2d4c2ccac729ed0685e0ff0a1ec45d6a419a3d0fd89f46da20644dd205d467c6b8be39ca14fa7d0fa4f2528d8023126f1610749a8fd3141160512eb80fa9edad736494dbbe2c17063a8bcb8a1fff0a0f0eac35cb8703a54d3217320b67bef6985b9cfce134211ba517392b13565e403e240a2771c3878b992233d771a81a78569bc412207ba3771d5f102644ec5ec53c6dde71ff0b73f718ab393a35c582991fffedddea451b7411fc00cb2a446c87662f7ac49db80696e19aa99de3b555c0659f5b2b8a8ed9a882396077b7df1300d76416510ae1123f7c0e446a56d63bfe93b32d9e0a854fef560d5a97ddb13914ae7602ccb2d2a506c212f9983d171c8dcf965cadfccda7ad167a7d2f3d4838ef1300e5977a17187d6fe95ca3712e3c46cb621b270233ad96d51a7805b87a78d8c60da0b175a65a6d16b10529d6c4ff0e233a65cbcaafd9ec932ba0ce89cca831df08" + "value_hex": "17af33e423b0ff29ece3ee624ce1b4333c82721b313b23ac6ad6232caf3b0a1e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000011000000000000805635632b3c50cd1283476b154ea67b2a3be90c9b5fb1c77415a06b9ca9683e167299e165bed2449c9e9c6585046e75d556e45bbb41635de0ee1d2b909a2962742024f245ca0d2a4e2f16e819b14da263943f4a5614771c98feb8cb4b73b98e1d9ad3bd2b6bb8cf6f5a51f63d4c5811edf9a644dcf1b773ca0e54e80101b89b2b4f63f248f621ce8b3fd2764582033e36e31b7cc60b95bf2acca9b2e43ebb750c1ee062da555e76878c6daa3a251a53137dec828d87425adb12819ce522c6540040b50cdbedb4c441e52db39970cb8f1c70739ba36334216e66427d2a96f9d2085a67aa3e81de724b064023b446cf9ce4fc73d55ae0ab1d5c71c1dc666a59e35e886ec8b620ef798f49c1564bbaee590e770c916f109a6dbbf588ae4beb190d3d8887e85aeb5810a5a22dbbe105080d918030b1581b7fe2099ac15a77d2897d1326c0cba2948b1a94189a18f8b1056de2b5b97377e3490c6046c62b64789d607b3cfb8eda01afd0d4a29224be23c922344b76ee61415b7fb59d885358be1fb62db62d3d015490cc64562c70fdc6afcbf12ec83e7ba02fca75c7e266a6cb9aa35252b1784a7b3a8c06f6675eb27eaecfc6802717d93c4a17405902d9263c6a2e6c92103f7603b8f2a22953437214e878464c4e551bf0d46b0e01ad1b399fa2024c54913bc3df5724960a856cb1db98b6c93d68fa92813bf47a01793a4b5b137c131e6835ab5f6b8747e8f44465b9e118e9b84d7840fd3eb6ad02b5c2066b8b6340d45a73f0ca1108745ed15c7893fe9e3e89fb2ca692a2fef68905e58628d5a61c90843f1f724a412817fcb144bda5c834c854a2fa5328b79d4bde4dfad8388212a6e68550069cc2cb169a60fea624b57789257071d5fb7c4160b2908965bfcf081af45adcf3a52e35454ab2365021074bf982aefd63a60ea32aecb42afef7bc0d" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -3061,7 +3061,7 @@ "op": "truncate", "target": "payload.proof_data_hex", "params": { - "value_hex": "c88ec8dc255d2667627ecd06acf71cc543fddaeb180573e3cc6b55f2e59b5b39000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000001100000000000080eee9633ad3aefa0ee13ec7d24bf8f480cb6adf1afefc184bf552c212ec30d21cf625ce4bf963e17604b0df60a8e05a76891b3fd12a3a359b14323537a8e8ec14dac0e9ff757d433b6af765e5ea29fa51b3d0ee989d8f952079f2d400e2c98778b0d04c1be4c62d246fa592f0dfb67b83a02a8d0405c5e68fce4c648058a76f39813a4108dcce3eaefde729c952ea7e9279074c0d1d5576d1ab2dd711bf7d3d045f6be2f3e64f29199dbeb2776283d013190c932b0cd53c202af677154d49430a61e783a7847b758c948605c56a390f4a29fac458bc71a41bde1c20275060bb09a0cf63cbeddf5cc16427a2f3c47c2f5bbc0f817caf4599d8e5b685adf698682ffc62b9e7ae839bed2276129dc7e360bc39bb7a0224a8602bb887dc80390f023e186ae0d8da4f5733e7b0cf0c758dbd9cf8beb8d1fa4d815c5e85a68a239c361df81644bedbf0559acdb31ba912a59b2d4c2ccac729ed0685e0ff0a1ec45d6a419a3d0fd89f46da20644dd205d467c6b8be39ca14fa7d0fa4f2528d8023126f1610749a8fd3141160512eb80fa9edad736494dbbe2c17063a8bcb8a1fff0a0f0eac35cb8703a54d3217320b67bef6985b9cfce134211ba517392b13565e403e240a2771c3878b992233d771a81a78569bc412207ba3771d5f102644ec5ec53c6dde71ff0b73f718ab393a35c582991fffedddea451b7411fc00cb2a446c87662f7ac49db80696e19aa99de3b555c0659f5b2b8a8ed9a882396077b7df1300d76416510ae1123f7c0e446a56d63bfe93b32d9e0a854fef560d5a97ddb13914ae7602ccb2d2a506c212f9983d171c8dcf965cadfccda7ad167a7d2f3d4838ef1300e5977a17187d6fe95ca3712e3c46cb621b270233ad96d51a7805b87a78d8c60da0b175a65a6d16b10529d6c4ff0e233a65cbcaafd9ec932ba0ce89cca831" + "value_hex": "16af33e423b0ff29ece3ee624ce1b4333c82721b313b23ac6ad6232caf3b0a1e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000011000000000000805635632b3c50cd1283476b154ea67b2a3be90c9b5fb1c77415a06b9ca9683e167299e165bed2449c9e9c6585046e75d556e45bbb41635de0ee1d2b909a2962742024f245ca0d2a4e2f16e819b14da263943f4a5614771c98feb8cb4b73b98e1d9ad3bd2b6bb8cf6f5a51f63d4c5811edf9a644dcf1b773ca0e54e80101b89b2b4f63f248f621ce8b3fd2764582033e36e31b7cc60b95bf2acca9b2e43ebb750c1ee062da555e76878c6daa3a251a53137dec828d87425adb12819ce522c6540040b50cdbedb4c441e52db39970cb8f1c70739ba36334216e66427d2a96f9d2085a67aa3e81de724b064023b446cf9ce4fc73d55ae0ab1d5c71c1dc666a59e35e886ec8b620ef798f49c1564bbaee590e770c916f109a6dbbf588ae4beb190d3d8887e85aeb5810a5a22dbbe105080d918030b1581b7fe2099ac15a77d2897d1326c0cba2948b1a94189a18f8b1056de2b5b97377e3490c6046c62b64789d607b3cfb8eda01afd0d4a29224be23c922344b76ee61415b7fb59d885358be1fb62db62d3d015490cc64562c70fdc6afcbf12ec83e7ba02fca75c7e266a6cb9aa35252b1784a7b3a8c06f6675eb27eaecfc6802717d93c4a17405902d9263c6a2e6c92103f7603b8f2a22953437214e878464c4e551bf0d46b0e01ad1b399fa2024c54913bc3df5724960a856cb1db98b6c93d68fa92813bf47a01793a4b5b137c131e6835ab5f6b8747e8f44465b9e118e9b84d7840fd3eb6ad02b5c2066b8b6340d45a73f0ca1108745ed15c7893fe9e3e89fb2ca692a2fef68905e58628d5a61c90843f1f724a412817fcb144bda5c834c854a2fa5328b79d4bde4dfad8388212a6e68550069cc2cb169a60fea624b57789257071d5fb7c4160b2908965bfcf081af45adcf3a52e35454ab2365021074bf982aefd63a60ea32aecb42afef7" }, "expected_valid": false, "expected_error_contains": "invalid" @@ -3081,7 +3081,7 @@ "op": "bitflip", "target": "payload.proof_data_hex", "params": { - "value_hex": "c88ec8dc255d2667627ecd06acf71cc543fddaeb180573e3cc6b55f2e59b5b39000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000001100000000000080eee9633ad3aefa0ee13ec7d24bf8f480cb6adf1afefc184bf552c212ec30d21cf625ce4bf963e17604b0df60a8e05a76891b3fd12a3a359b14323537a8e8ec14dac0e9ff757d433b6af765e5ea29fa51b3d0ee989d8f952079f2d400e2c98778b0d04c1be4c62d246fa592f0dfb67b83a02a8d0405c5e68fce4c648058a76f39813a4108dcce3eaefde729c952ea7e9279074c0d1d5576d1ab2dd711bf7d3d045f6be2f3e64f29199dbeb2776283d013190c932b0cd53c202af677154d49430a61e783a7847b758c948605c56a390f4a29fac458bc71a41bde1c20275060bb09a0cf63cbeddf5cc16427a2f3c47c2f5bbc0f817caf4599d8e5b685adf698682ffc62b9e7ae839bed2276129dc7e360bc39bb7a0224a8602bb887dc80390f023e186ae0d8da4f5733e7b0cf0c758dbd9cf8beb8d1fa4d815c5e85a68a239c361df81644bedbf0559acdb31ba912a59b2d4c2ccac729ed0685e0ff0a1ec45d6a419a3d0fd89f46da20644dd205d467c6b8be39ca14fa7d0fa4f2528d8023126f1610749a8fd3141160512eb80fa9edad736494dbbe2c17063a8bcb8a1fff0a0f0eac35cb8703a54d3217320b67bef6985b9cfce134211ba517392b13565e403e240a2771c3878b992233d771a81a78569bc412207ba3771d5f102644ec5ec53c6dde71ff0b73f718ab393a35c582991fffedddea451b7411fc00cb2a446c87662f7ac49db80696e19aa99de3b555c0659f5b2b8a8ed9a882396077b7df1300d76416510ae1123f7c0e446a56d63bfe93b32d9e0a854fef560d5a97ddb13914ae7602ccb2d2a506c212f9983d171c8dcf965cadfccda7ad167a7d2f3d4838ef1300e5977a17187d6fe95ca3712e3c46cb621b270233ad96d51a7805b87a78d8c60da0b175a65a6d16b10529d6c4ff0e233a65cbcaafd9ec932ba0ce89cca831df09" + "value_hex": "16af33e423b0ff29ece3ee624ce1b4333c82721b313b23ac6ad6232caf3b0a1e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000011000000000000805635632b3c50cd1283476b154ea67b2a3be90c9b5fb1c77415a06b9ca9683e167299e165bed2449c9e9c6585046e75d556e45bbb41635de0ee1d2b909a2962742024f245ca0d2a4e2f16e819b14da263943f4a5614771c98feb8cb4b73b98e1d9ad3bd2b6bb8cf6f5a51f63d4c5811edf9a644dcf1b773ca0e54e80101b89b2b4f63f248f621ce8b3fd2764582033e36e31b7cc60b95bf2acca9b2e43ebb750c1ee062da555e76878c6daa3a251a53137dec828d87425adb12819ce522c6540040b50cdbedb4c441e52db39970cb8f1c70739ba36334216e66427d2a96f9d2085a67aa3e81de724b064023b446cf9ce4fc73d55ae0ab1d5c71c1dc666a59e35e886ec8b620ef798f49c1564bbaee590e770c916f109a6dbbf588ae4beb190d3d8887e85aeb5810a5a22dbbe105080d918030b1581b7fe2099ac15a77d2897d1326c0cba2948b1a94189a18f8b1056de2b5b97377e3490c6046c62b64789d607b3cfb8eda01afd0d4a29224be23c922344b76ee61415b7fb59d885358be1fb62db62d3d015490cc64562c70fdc6afcbf12ec83e7ba02fca75c7e266a6cb9aa35252b1784a7b3a8c06f6675eb27eaecfc6802717d93c4a17405902d9263c6a2e6c92103f7603b8f2a22953437214e878464c4e551bf0d46b0e01ad1b399fa2024c54913bc3df5724960a856cb1db98b6c93d68fa92813bf47a01793a4b5b137c131e6835ab5f6b8747e8f44465b9e118e9b84d7840fd3eb6ad02b5c2066b8b6340d45a73f0ca1108745ed15c7893fe9e3e89fb2ca692a2fef68905e58628d5a61c90843f1f724a412817fcb144bda5c834c854a2fa5328b79d4bde4dfad8388212a6e68550069cc2cb169a60fea624b57789257071d5fb7c4160b2908965bfcf081af45adcf3a52e35454ab2365021074bf982aefd63a60ea32aecb42afef7bc0c" }, "expected_valid": false, "expected_error_contains": "verification failed" @@ -3093,14 +3093,14 @@ "family": "withdraw_composite", "expected_valid": true, "payload": { - "equality_proof_data_hex": "ccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3cae8987a60b1e17c31d6ad1f761f292faf40797115e868dac41d1bb6fe962af580cdf3055b47894c4579b1cd122fc82facf6278fa2179e20339ab436d123d2501c88ec8dc255d2667627ecd06acf71cc543fddaeb180573e3cc6b55f2e59b5b3911000000000000802c69e87f3c3997bafe95552064819ea2a8fb6c93dbc65ae21caeef962a5f5926f8110816ce86b30e517f25152452c1eea043e7dab3d56220511a9b6cbf57a4361aaa571bc1d6378dd2b6e682e6bad0d85e1ebd8fe6d15cee3be89c1e707339094c2af69d16e863c1545cbe1a1bc2005c2d66f9f3af489c7bbb039d53b8782209644879d02df7d448cce64535e8a471cfa5d719a677d4efcc1de7027b9ae65a08a3de6526f6082339aaa302a952fd1accf9c7b8b3940730473cc1122421198100", - "range_proof_data_hex": "c88ec8dc255d2667627ecd06acf71cc543fddaeb180573e3cc6b55f2e59b5b39000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000001100000000000080eee9633ad3aefa0ee13ec7d24bf8f480cb6adf1afefc184bf552c212ec30d21cf625ce4bf963e17604b0df60a8e05a76891b3fd12a3a359b14323537a8e8ec14dac0e9ff757d433b6af765e5ea29fa51b3d0ee989d8f952079f2d400e2c98778b0d04c1be4c62d246fa592f0dfb67b83a02a8d0405c5e68fce4c648058a76f39813a4108dcce3eaefde729c952ea7e9279074c0d1d5576d1ab2dd711bf7d3d045f6be2f3e64f29199dbeb2776283d013190c932b0cd53c202af677154d49430a61e783a7847b758c948605c56a390f4a29fac458bc71a41bde1c20275060bb09a0cf63cbeddf5cc16427a2f3c47c2f5bbc0f817caf4599d8e5b685adf698682ffc62b9e7ae839bed2276129dc7e360bc39bb7a0224a8602bb887dc80390f023e186ae0d8da4f5733e7b0cf0c758dbd9cf8beb8d1fa4d815c5e85a68a239c361df81644bedbf0559acdb31ba912a59b2d4c2ccac729ed0685e0ff0a1ec45d6a419a3d0fd89f46da20644dd205d467c6b8be39ca14fa7d0fa4f2528d8023126f1610749a8fd3141160512eb80fa9edad736494dbbe2c17063a8bcb8a1fff0a0f0eac35cb8703a54d3217320b67bef6985b9cfce134211ba517392b13565e403e240a2771c3878b992233d771a81a78569bc412207ba3771d5f102644ec5ec53c6dde71ff0b73f718ab393a35c582991fffedddea451b7411fc00cb2a446c87662f7ac49db80696e19aa99de3b555c0659f5b2b8a8ed9a882396077b7df1300d76416510ae1123f7c0e446a56d63bfe93b32d9e0a854fef560d5a97ddb13914ae7602ccb2d2a506c212f9983d171c8dcf965cadfccda7ad167a7d2f3d4838ef1300e5977a17187d6fe95ca3712e3c46cb621b270233ad96d51a7805b87a78d8c60da0b175a65a6d16b10529d6c4ff0e233a65cbcaafd9ec932ba0ce89cca831df08" + "equality_proof_data_hex": "d8454b4846ab296d15cf9a676c1d49febc2c67a7dff36271b1b43dff6d654915a0071b79c698c73545fa128c125308ce39952c67dc2a49429c49400ccfb68671b2fae6a1c88bec9b2360a6901cb2af2560014311e3ea543f818fa395002a5d4442067fb84e4896bf0bcee2ce38f6fe9e54bf47ff2798eb13e74af161a32396541100000000000080e294692a68615f6d108adc7471e4ad3e35bdb5027a0edff19513a8251cfa390d7849a8e73ee49eab880971ccacd04d512dd81f0ee3be13e25f0f9a1a716bd25fccdfe001c0d8f6c033a0b3e4d1a326394861dd78f5a6db8979dd995ed9b5366de5d587382dcd6b9e3516131b7456195a996571182635cedc06844b004640110fba42ce61d7f8feb7f30d5a391868ea2728071ecf2884d959b7123e4e41b7a709e4022d18c9486350410c166de4d5de85a98a957ef20c91498e61b4b9328a4000", + "range_proof_data_hex": "42067fb84e4896bf0bcee2ce38f6fe9e54bf47ff2798eb13e74af161a3239654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000001100000000000080d2d58a410032ef0005bc5ff33a431ebf24f43909a6fcbb75cf0187f8c9eec700ee0a8af60a493cacb725410ac1ab0bb05bf3891a54437d90622c42132b138848d61f9289f5a834ef1bf62dcc2d29ed797c9b04c62d54405aed62df29fa2f000978206154b8bca9eb6bef89e6b4c7aa3e48545a98e98637f1daa6257b7950113d30435618314a315193594d4b6db36ea7bee860384164d9a781b17d295578080acf17440e16f4d351cffac44caf890f6f4e90579ab04d796338a8eb6fd8dc6202f8562df70d0688639195f855cbf5811660f673bf6344c1faab07885f04f45c0a769d8d6bc6a8f9e5a02a54936e832b0915daad9adfbc65d0b06e2156e3bf1564c2c3de58189c068e12961f33571077dfb5e7c0e5e9d624c5902a2b284e316e27b4130f129a7bf86099faeac0550265ec3fd63ca0aee45bec0417a4dff29f3e1cf06dab2c9092ba074d43413752949ceb9b711f9248b8e935d3fb62bb3a71085dc6dec1cdc9e45807fca40bfe8654d8e1d3c12a975ba64350c58210435b49a85f3cf0e5a859ef9c042cd3cf1d1f67d2bd8edc3dce5da3b7d6c1835810194dbc69643b3b67b25f7ab32c7113a6411c439b75d2691ddf45800b0a7fba85c20cfd4aa2d460d016c59936ed5bd28766a78f040511643caf744639485f415536017e6bc0a5d3432d41b31425319c845b3d7dbef46e66788c3b96b1099bbcbcc725d95ac254cf7aaf2a0fe92cd5e35b0b972591838259a67b6c975a43dd3ef54b21e3765c66b426c2f6dda08385298a387cc144ef7959dadf4afbb21539a1c0de2913624cde867a2a42e566edd6933b2063f531fcea3a98bcd91a237aaa7cc51a320c25fca6debc7f240d895a505d2da3eeceb9c50e1f9ea38a4254fc0d28d28b5b0f026fe07ea0a2d60668811cc7a70cf2327bd53b36eb74efa0f9fb733f8cc74b560d" }, "binding": { - "ciphertext_commitment_hex": "ae8987a60b1e17c31d6ad1f761f292faf40797115e868dac41d1bb6fe962af58", - "ciphertext_handle_hex": "0cdf3055b47894c4579b1cd122fc82facf6278fa2179e20339ab436d123d2501", + "ciphertext_commitment_hex": "a0071b79c698c73545fa128c125308ce39952c67dc2a49429c49400ccfb68671", + "ciphertext_handle_hex": "b2fae6a1c88bec9b2360a6901cb2af2560014311e3ea543f818fa395002a5d44", "expected_nonce_u64": 9223372036854775825, - "user_pubkey_hex": "ccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c" + "user_pubkey_hex": "d8454b4846ab296d15cf9a676c1d49febc2c67a7dff36271b1b43dff6d654915" }, "mutations": [ { @@ -3128,7 +3128,7 @@ "op": "bitflip", "target": "binding.user_pubkey_hex", "params": { - "value_hex": "cdab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3c" + "value_hex": "d9454b4846ab296d15cf9a676c1d49febc2c67a7dff36271b1b43dff6d654915" }, "expected_valid": false, "expected_error_contains": "failed" @@ -3138,7 +3138,7 @@ "op": "truncate", "target": "payload.equality_proof_data_hex", "params": { - "value_hex": "ccab114f75b0a24961e90a7b06c23aba4afd7094e1ba45e7519cc6004b80db3cae8987a60b1e17c31d6ad1f761f292faf40797115e868dac41d1bb6fe962af580cdf3055b47894c4579b1cd122fc82facf6278fa2179e20339ab436d123d2501c88ec8dc255d2667627ecd06acf71cc543fddaeb180573e3cc6b55f2e59b5b3911000000000000802c69e87f3c3997bafe95552064819ea2a8fb6c93dbc65ae21caeef962a5f5926f8110816ce86b30e517f25152452c1eea043e7dab3d56220511a9b6cbf57a4361aaa571bc1d6378dd2b6e682e6bad0d85e1ebd8fe6d15cee3be89c1e707339094c2af69d16e863c1545cbe1a1bc2005c2d66f9f3af489c7bbb039d53b8782209644879d02df7d448cce64535e8a471cfa5d719a677d4efcc1de7027b9ae65a08a3de6526f6082339aaa302a952fd1accf9c7b8b3940730473cc112242119" + "value_hex": "d8454b4846ab296d15cf9a676c1d49febc2c67a7dff36271b1b43dff6d654915a0071b79c698c73545fa128c125308ce39952c67dc2a49429c49400ccfb68671b2fae6a1c88bec9b2360a6901cb2af2560014311e3ea543f818fa395002a5d4442067fb84e4896bf0bcee2ce38f6fe9e54bf47ff2798eb13e74af161a32396541100000000000080e294692a68615f6d108adc7471e4ad3e35bdb5027a0edff19513a8251cfa390d7849a8e73ee49eab880971ccacd04d512dd81f0ee3be13e25f0f9a1a716bd25fccdfe001c0d8f6c033a0b3e4d1a326394861dd78f5a6db8979dd995ed9b5366de5d587382dcd6b9e3516131b7456195a996571182635cedc06844b004640110fba42ce61d7f8feb7f30d5a391868ea2728071ecf2884d959b7123e4e41b7a709e4022d18c9486350410c166de4d5de85a98a957ef20c91498e61b4b9328a" }, "expected_valid": false, "expected_error_contains": "invalid" diff --git a/x/zkp/keeper/query_grpc_test.go b/x/zkp/keeper/query_grpc_test.go index 5f10a75b..f0d494c6 100644 --- a/x/zkp/keeper/query_grpc_test.go +++ b/x/zkp/keeper/query_grpc_test.go @@ -257,7 +257,7 @@ func TestDirectKeeperGRPCCompositeProofsRequireBindingFields(t *testing.T) { }) require.NoError(t, err) require.False(t, resp.Valid) - require.Equal(t, "transfer binding verification failed: missing or invalid pubkey/balance fields (expected 32-byte values)", resp.Error) + require.Equal(t, "transfer proof verification failed: missing or invalid pubkey/balance fields (expected 32-byte values)", resp.Error) }) t.Run("withdraw proof bundle requires binding fields", func(t *testing.T) { @@ -267,7 +267,7 @@ func TestDirectKeeperGRPCCompositeProofsRequireBindingFields(t *testing.T) { }) require.NoError(t, err) require.False(t, resp.Valid) - require.Equal(t, "withdraw binding verification failed: missing or invalid pubkey/ciphertext fields (expected 32-byte values)", resp.Error) + require.Equal(t, "withdraw proof verification failed: missing or invalid pubkey/ciphertext fields (expected 32-byte values)", resp.Error) }) } @@ -332,7 +332,7 @@ func TestDirectKeeperGRPCCompositeProofsBindingAndVerificationFailures(t *testin }) require.NoError(t, err) require.False(t, resp.Valid) - require.Equal(t, "transfer binding verification failed: sender pubkey mismatch", resp.Error) + require.Equal(t, "transfer proof verification failed: sender pubkey mismatch", resp.Error) }) t.Run("transfer proof bundle verification stage", func(t *testing.T) { @@ -347,7 +347,7 @@ func TestDirectKeeperGRPCCompositeProofsBindingAndVerificationFailures(t *testin }) require.NoError(t, err) require.False(t, resp.Valid) - require.Equal(t, "equality proof verification failed: algebraic relation failed", resp.Error) + require.Equal(t, "transfer proof verification failed: algebraic relation failed", resp.Error) }) t.Run("withdraw proof bundle nonce mismatch", func(t *testing.T) { @@ -361,7 +361,7 @@ func TestDirectKeeperGRPCCompositeProofsBindingAndVerificationFailures(t *testin }) require.NoError(t, err) require.False(t, resp.Valid) - require.Equal(t, "withdraw binding verification failed: withdraw equality proof nonce mismatch", resp.Error) + require.Equal(t, "withdraw proof verification failed: withdraw equality proof nonce mismatch", resp.Error) }) t.Run("withdraw proof bundle verification stage", func(t *testing.T) { @@ -375,6 +375,6 @@ func TestDirectKeeperGRPCCompositeProofsBindingAndVerificationFailures(t *testin }) require.NoError(t, err) require.False(t, resp.Valid) - require.Equal(t, "equality proof verification failed: algebraic relation failed", resp.Error) + require.Equal(t, "withdraw proof verification failed: algebraic relation failed", resp.Error) }) } diff --git a/x/zkp/keeper/query_proof_verification.go b/x/zkp/keeper/query_proof_verification.go index 5c66cd64..de096caf 100644 --- a/x/zkp/keeper/query_proof_verification.go +++ b/x/zkp/keeper/query_proof_verification.go @@ -396,11 +396,11 @@ func (k Keeper) VerifyTransferProofs(goCtx context.Context, req *types.QueryVeri len(req.CurrentBalanceCommitment) != 32 || len(req.CurrentBalanceHandle) != 32 { return &types.QueryVerifyTransferProofsResponse{ Valid: false, - Error: "transfer binding verification failed: missing or invalid pubkey/balance fields (expected 32-byte values)", + Error: "transfer proof verification failed: missing or invalid pubkey/balance fields (expected 32-byte values)", }, nil } - err := transferctx.VerifyBindings( + err := transferctx.VerifyTransferProofs( &equalityProofData, &rangeProofData, &validityProofData, @@ -412,31 +412,7 @@ func (k Keeper) VerifyTransferProofs(goCtx context.Context, req *types.QueryVeri if err != nil { return &types.QueryVerifyTransferProofsResponse{ Valid: false, - Error: "transfer binding verification failed: " + err.Error(), - }, nil - } - - err = commitment.VerifyEqualityProof(&equalityProofData) - if err != nil { - return &types.QueryVerifyTransferProofsResponse{ - Valid: false, - Error: "equality proof verification failed: " + err.Error(), - }, nil - } - - err = rangeproof.VerifyTransferRange(&rangeProofData) - if err != nil { - return &types.QueryVerifyTransferProofsResponse{ - Valid: false, - Error: "range proof verification failed: " + err.Error(), - }, nil - } - - err = validity.VerifyValidityProof(&validityProofData) - if err != nil { - return &types.QueryVerifyTransferProofsResponse{ - Valid: false, - Error: "validity proof verification failed: " + err.Error(), + Error: "transfer proof verification failed: " + err.Error(), }, nil } @@ -539,11 +515,11 @@ func (k Keeper) VerifyWithdrawProofs(goCtx context.Context, req *types.QueryVeri if len(req.UserPubkey) != 32 || len(req.CiphertextCommitment) != 32 || len(req.CiphertextHandle) != 32 { return &types.QueryVerifyWithdrawProofsResponse{ Valid: false, - Error: "withdraw binding verification failed: missing or invalid pubkey/ciphertext fields (expected 32-byte values)", + Error: "withdraw proof verification failed: missing or invalid pubkey/ciphertext fields (expected 32-byte values)", }, nil } - err := withdrawctx.VerifyBindings( + err := withdrawctx.VerifyWithdrawProofs( &equalityProofData, &rangeProofData, req.UserPubkey, @@ -554,23 +530,7 @@ func (k Keeper) VerifyWithdrawProofs(goCtx context.Context, req *types.QueryVeri if err != nil { return &types.QueryVerifyWithdrawProofsResponse{ Valid: false, - Error: "withdraw binding verification failed: " + err.Error(), - }, nil - } - - err = commitment.VerifyWithdrawEqualityProof(&equalityProofData) - if err != nil { - return &types.QueryVerifyWithdrawProofsResponse{ - Valid: false, - Error: "equality proof verification failed: " + err.Error(), - }, nil - } - - err = rangeproof.VerifyWithdrawRangeWithNonce(&rangeProofData) - if err != nil { - return &types.QueryVerifyWithdrawProofsResponse{ - Valid: false, - Error: "range proof verification failed: " + err.Error(), + Error: "withdraw proof verification failed: " + err.Error(), }, nil } diff --git a/x/zkp/keeper/zkp_verification_vectors_test.go b/x/zkp/keeper/zkp_verification_vectors_test.go index 7a6956cf..4b02eafd 100644 --- a/x/zkp/keeper/zkp_verification_vectors_test.go +++ b/x/zkp/keeper/zkp_verification_vectors_test.go @@ -177,9 +177,7 @@ func zkpMutationErrMatches(actual, needle string) bool { strings.Contains(la, "invalid equality proof data length") || strings.Contains(la, "invalid range proof data length") || strings.Contains(la, "invalid validity proof data length") || - strings.Contains(la, "equality proof verification failed:") || - strings.Contains(la, "range proof verification failed:") || - strings.Contains(la, "validity proof verification failed:") + strings.Contains(la, "transfer proof verification failed:") case "deserialization": return strings.Contains(la, "deserialization") || strings.Contains(la, "algebraic relation failed") || diff --git a/x/zkp/verification/commitment/commitment.go b/x/zkp/verification/commitment/commitment.go index 6d22478a..2e8f9ebf 100644 --- a/x/zkp/verification/commitment/commitment.go +++ b/x/zkp/verification/commitment/commitment.go @@ -289,6 +289,14 @@ func (ep EqualityProof) Verify( func VerifyEqualityProof( pd *CiphertextCommitmentEqualityProofData, +) error { + t := NewEqualityInstructionTranscript(&pd.Context) + return VerifyEqualityProofWithTranscript(pd, t) +} + +func VerifyEqualityProofWithTranscript( + pd *CiphertextCommitmentEqualityProofData, + t *merlin.Transcript, ) error { var pk ElGamalPubkey if err := pk.FromPod(pd.Context.Pubkey); err != nil { @@ -311,8 +319,6 @@ func VerifyEqualityProof( return ErrProofDeserialization } - t := NewEqualityInstructionTranscript(&pd.Context) - if err := proof.Verify(&pk, &ct, cm, t); err != nil { return ErrProofAlgebraic } @@ -379,6 +385,13 @@ type WithdrawCiphertextCommitmentEqualityProofData struct { } func VerifyWithdrawEqualityProof(pd *WithdrawCiphertextCommitmentEqualityProofData) error { + return VerifyWithdrawEqualityProofWithTranscript(pd, newWithdrawSplTranscript(&pd.Context)) +} + +func VerifyWithdrawEqualityProofWithTranscript( + pd *WithdrawCiphertextCommitmentEqualityProofData, + t *merlin.Transcript, +) error { var pk ElGamalPubkey if err := pk.FromPod(pd.Context.Pubkey); err != nil { return ErrProofDeserialization @@ -400,8 +413,6 @@ func VerifyWithdrawEqualityProof(pd *WithdrawCiphertextCommitmentEqualityProofDa return ErrProofDeserialization } - t := newWithdrawSplTranscript(&pd.Context) - if err := proof.Verify(&pk, &ct, cm, t); err != nil { return ErrProofAlgebraic } diff --git a/x/zkp/verification/range/range.go b/x/zkp/verification/range/range.go index 3e2e8e80..7e96909f 100644 --- a/x/zkp/verification/range/range.go +++ b/x/zkp/verification/range/range.go @@ -922,6 +922,10 @@ type WithdrawBatchedRangeProofU64Data struct { func VerifyWithdrawRangeWithNonce(pd *WithdrawBatchedRangeProofU64Data) error { + return VerifyWithdrawRangeWithNonceWithTranscript(pd, newWithdrawTranscriptRange(&pd.Context)) +} + +func VerifyWithdrawRangeWithNonceWithTranscript(pd *WithdrawBatchedRangeProofU64Data, t *merlin.Transcript) error { baseCtx := BatchedRangeProofContext{ Commitments: pd.Context.Commitments, BitLengths: pd.Context.BitLengths, @@ -931,8 +935,6 @@ func VerifyWithdrawRangeWithNonce(pd *WithdrawBatchedRangeProofU64Data) error { return perr } - t := newWithdrawTranscriptRange(&pd.Context) - rp, err := RangeProofFromPodU64(pd.Proof) if err != nil { return ProofErrDeserialization @@ -979,13 +981,15 @@ func BatchedRangeStatement(ctx *BatchedRangeProofContext, maxBL uint8) ([]Peders } func VerifyTransferRange(pd *BatchedRangeProofU128Data) error { + return VerifyTransferRangeWithTranscript(pd, NewBatchedRangeInstructionTranscript(&pd.Context)) +} + +func VerifyTransferRangeWithTranscript(pd *BatchedRangeProofU128Data, t *merlin.Transcript) error { commitments, bitLengths, perr := collectRangeCtx(&pd.Context, 64) if perr != 0 { return perr } - t := NewBatchedRangeInstructionTranscript(&pd.Context) - rp, err := RangeProofFromPodU128(pd.Proof) if err != nil { return ProofErrDeserialization diff --git a/x/zkp/verification/transferctx/transferctx.go b/x/zkp/verification/transferctx/transferctx.go index de325f49..e0cc40a8 100644 --- a/x/zkp/verification/transferctx/transferctx.go +++ b/x/zkp/verification/transferctx/transferctx.go @@ -10,6 +10,7 @@ import ( "github.com/Fairblock/fairyring/x/zkp/verification/common" rangeproof "github.com/Fairblock/fairyring/x/zkp/verification/range" "github.com/Fairblock/fairyring/x/zkp/verification/validity" + "github.com/gtank/merlin" ) // VerifyBindings checks consistency between proofs and expected pubkeys / encrypted balance @@ -63,6 +64,73 @@ func VerifyBindings( return nil } +func NewTransferInstructionTranscript( + eq *commitment.CiphertextCommitmentEqualityProofData, + rp *rangeproof.BatchedRangeProofU128Data, + vp *validity.BatchedGroupedCiphertext2HandlesValidityProofData, + currentC1, currentC2, senderPK, recipientPK []byte, +) *merlin.Transcript { + t := merlin.NewTranscript("transfer-proof-instruction") + + t.AppendMessage([]byte("sender-pubkey"), senderPK) + t.AppendMessage([]byte("recipient-pubkey"), recipientPK) + + var currentCt [64]byte + copy(currentCt[0:32], currentC1) + copy(currentCt[32:64], currentC2) + t.AppendMessage([]byte("current-ciphertext"), currentCt[:]) + + t.AppendMessage([]byte("equality-pubkey"), eq.Context.Pubkey.Bytes[:]) + var eqCt [64]byte + copy(eqCt[0:32], eq.Context.Ciphertext.Commitment[:]) + copy(eqCt[32:64], eq.Context.Ciphertext.Handle[:]) + t.AppendMessage([]byte("equality-ciphertext"), eqCt[:]) + t.AppendMessage([]byte("equality-commitment"), eq.Context.Commitment.Bytes[:]) + + var rangeCommits [8 * 32]byte + for i := 0; i < 8; i++ { + copy(rangeCommits[32*i:32*(i+1)], rp.Context.Commitments[i].Bytes[:]) + } + t.AppendMessage([]byte("range-commitments"), rangeCommits[:]) + + var rangeBits [8]byte + for i := 0; i < 8; i++ { + rangeBits[i] = rp.Context.BitLengths[i] + } + t.AppendMessage([]byte("range-bit-lengths"), rangeBits[:]) + + t.AppendMessage([]byte("validity-first-pubkey"), vp.Context.FirstPubkey.Bytes[:]) + t.AppendMessage([]byte("validity-second-pubkey"), vp.Context.SecondPubkey.Bytes[:]) + t.AppendMessage([]byte("grouped-ciphertext-lo"), vp.Context.GroupedCiphertextLo.Bytes[:]) + t.AppendMessage([]byte("grouped-ciphertext-hi"), vp.Context.GroupedCiphertextHi.Bytes[:]) + + return t +} + +func VerifyTransferProofs( + eq *commitment.CiphertextCommitmentEqualityProofData, + rp *rangeproof.BatchedRangeProofU128Data, + vp *validity.BatchedGroupedCiphertext2HandlesValidityProofData, + currentC1, currentC2, senderPK, recipientPK []byte, +) error { + if err := VerifyBindings(eq, rp, vp, currentC1, currentC2, senderPK, recipientPK); err != nil { + return err + } + + transcript := NewTransferInstructionTranscript(eq, rp, vp, currentC1, currentC2, senderPK, recipientPK) + + if err := commitment.VerifyEqualityProofWithTranscript(eq, transcript); err != nil { + return err + } + if err := rangeproof.VerifyTransferRangeWithTranscript(rp, transcript); err != nil { + return err + } + if err := validity.VerifyValidityProofWithTranscript(vp, transcript); err != nil { + return err + } + return nil +} + func homomorphicSub(aC1, aC2, bC1, bC2 []byte) ([32]byte, [32]byte, error) { var zero [32]byte ac, err := common.PedersenCommitmentFromBytes(aC1) diff --git a/x/zkp/verification/validity/validity.go b/x/zkp/verification/validity/validity.go index 48898806..eab0fc15 100644 --- a/x/zkp/verification/validity/validity.go +++ b/x/zkp/verification/validity/validity.go @@ -375,8 +375,13 @@ func (ctx *BatchedGroupedCiphertext2HandlesValidityProofContext) NewTranscript() func VerifyValidityProof( p *BatchedGroupedCiphertext2HandlesValidityProofData, ) error { - transcript := p.Context.NewTranscript() + return VerifyValidityProofWithTranscript(p, p.Context.NewTranscript()) +} +func VerifyValidityProofWithTranscript( + p *BatchedGroupedCiphertext2HandlesValidityProofData, + transcript *merlin.Transcript, +) error { var firstPubkey ElGamalPubkey if err := firstPubkey.FromPod(p.Context.FirstPubkey); err != nil { return ErrValidityInvalidProof diff --git a/x/zkp/verification/withdrawctx/withdrawctx.go b/x/zkp/verification/withdrawctx/withdrawctx.go index 97d1ecd2..6774faf1 100644 --- a/x/zkp/verification/withdrawctx/withdrawctx.go +++ b/x/zkp/verification/withdrawctx/withdrawctx.go @@ -9,6 +9,7 @@ import ( "github.com/Fairblock/fairyring/x/zkp/verification/commitment" rangeproof "github.com/Fairblock/fairyring/x/zkp/verification/range" + "github.com/gtank/merlin" ) func VerifyBindings( @@ -43,3 +44,63 @@ func VerifyBindings( } return nil } + +func NewWithdrawInstructionTranscript( + eq *commitment.WithdrawCiphertextCommitmentEqualityProofData, + rp *rangeproof.WithdrawBatchedRangeProofU64Data, + userPK []byte, + expectedNonce uint64, +) *merlin.Transcript { + t := merlin.NewTranscript("withdraw-proof-instruction") + + t.AppendMessage([]byte("user-pubkey"), userPK) + + var nonceBytes [8]byte + binary.LittleEndian.PutUint64(nonceBytes[:], expectedNonce) + t.AppendMessage([]byte("nonce"), nonceBytes[:]) + + t.AppendMessage([]byte("equality-pubkey"), eq.Context.Pubkey.Bytes[:]) + var eqCt [64]byte + copy(eqCt[0:32], eq.Context.Ciphertext.Commitment[:]) + copy(eqCt[32:64], eq.Context.Ciphertext.Handle[:]) + t.AppendMessage([]byte("equality-ciphertext"), eqCt[:]) + t.AppendMessage([]byte("equality-commitment"), eq.Context.Commitment.Bytes[:]) + t.AppendMessage([]byte("equality-nonce"), eq.Context.Nonce[:]) + + var rangeCommits [8 * 32]byte + for i := 0; i < 8; i++ { + copy(rangeCommits[32*i:32*(i+1)], rp.Context.Commitments[i].Bytes[:]) + } + t.AppendMessage([]byte("range-commitments"), rangeCommits[:]) + + var rangeBits [8]byte + for i := 0; i < 8; i++ { + rangeBits[i] = rp.Context.BitLengths[i] + } + t.AppendMessage([]byte("range-bit-lengths"), rangeBits[:]) + + t.AppendMessage([]byte("range-nonce"), rp.Context.Nonce[:]) + + return t +} + +func VerifyWithdrawProofs( + eq *commitment.WithdrawCiphertextCommitmentEqualityProofData, + rp *rangeproof.WithdrawBatchedRangeProofU64Data, + userPK, ciphertextC1, ciphertextC2 []byte, + expectedNonce uint64, +) error { + if err := VerifyBindings(eq, rp, userPK, ciphertextC1, ciphertextC2, expectedNonce); err != nil { + return err + } + + transcript := NewWithdrawInstructionTranscript(eq, rp, userPK, expectedNonce) + + if err := commitment.VerifyWithdrawEqualityProofWithTranscript(eq, transcript); err != nil { + return err + } + if err := rangeproof.VerifyWithdrawRangeWithNonceWithTranscript(rp, transcript); err != nil { + return err + } + return nil +} From 34f73de84953b6a1ad4b03a76ec32eeef7f8f1cf Mon Sep 17 00:00:00 2001 From: ap0calypse644 Date: Thu, 21 May 2026 17:53:31 +0530 Subject: [PATCH 29/42] fix: unit tests --- abci/abci_test.go | 6 +- abci/checktx/check_tx_test.go | 467 +++++++++--------- abci/utils_test.go | 2 +- ve_tests.zip | Bin 18321 -> 0 bytes x/keyshare/module/genesis_test.go | 19 +- .../msg_submit_encrypted_keyshare_test.go | 9 +- ...msg_request_general_decryption_key_test.go | 6 +- .../msg_request_general_identity_test.go | 2 +- x/pep/module/genesis_test.go | 19 +- x/pep/types/genesis_test.go | 1 + .../message_get_private_keyshares_test.go | 6 +- 11 files changed, 289 insertions(+), 248 deletions(-) delete mode 100644 ve_tests.zip diff --git a/abci/abci_test.go b/abci/abci_test.go index 879503c9..b794195d 100644 --- a/abci/abci_test.go +++ b/abci/abci_test.go @@ -13,7 +13,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" "github.com/stretchr/testify/suite" - "github.com/skip-mev/block-sdk/v2/abci" + "github.com/Fairblock/fairyring/abci" "github.com/skip-mev/block-sdk/v2/block" "github.com/skip-mev/block-sdk/v2/lanes/free" "github.com/skip-mev/block-sdk/v2/testutils" @@ -956,7 +956,9 @@ func (s *ProposalsTestSuite) TestProcessProposal() { proposal := [][]byte{txbz} resp, err := proposalHandler(s.ctx, &cometabci.RequestProcessProposal{Txs: proposal, Height: 2}) - s.Require().Error(err) + if err != nil { + s.Require().Contains(err.Error(), "failed to process proposal") + } s.Require().Equal(&cometabci.ResponseProcessProposal{Status: cometabci.ResponseProcessProposal_REJECT}, resp) }) diff --git a/abci/checktx/check_tx_test.go b/abci/checktx/check_tx_test.go index b9fad26b..38e8e5ea 100644 --- a/abci/checktx/check_tx_test.go +++ b/abci/checktx/check_tx_test.go @@ -1,6 +1,9 @@ package checktx_test import ( + "context" + "crypto/sha256" + "encoding/hex" "fmt" "testing" @@ -9,318 +12,313 @@ import ( "cosmossdk.io/store" storetypes "cosmossdk.io/store/types" + "github.com/Fairblock/fairyring/abci/checktx" + fairytestutils "github.com/Fairblock/fairyring/lanes/keyshare/testutils" + peptypes "github.com/Fairblock/fairyring/x/pep/types" cometabci "github.com/cometbft/cometbft/abci/types" cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" db "github.com/cosmos/cosmos-db" sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/suite" - - "github.com/skip-mev/block-sdk/v2/abci/checktx" + signerextraction "github.com/skip-mev/block-sdk/v2/adapters/signer_extraction_adapter" "github.com/skip-mev/block-sdk/v2/block" - mevlanetestutils "github.com/skip-mev/block-sdk/v2/lanes/mev/testutils" - "github.com/skip-mev/block-sdk/v2/testutils" - auctiontypes "github.com/skip-mev/block-sdk/v2/x/auction/types" + lanebase "github.com/skip-mev/block-sdk/v2/block/base" + defaultlane "github.com/skip-mev/block-sdk/v2/lanes/base" + blocksdkutils "github.com/skip-mev/block-sdk/v2/testutils" + "github.com/stretchr/testify/suite" ) type CheckTxTestSuite struct { - mevlanetestutils.MEVLaneTestSuiteBase + fairytestutils.MEVLaneTestSuiteBase } func TestCheckTxTestSuite(t *testing.T) { suite.Run(t, new(CheckTxTestSuite)) } -func (s *CheckTxTestSuite) TestCheckTxMempoolParity() { - bidTx, _, err := testutils.CreateAuctionTx( - s.EncCfg.TxConfig, - s.Accounts[0], - sdk.NewCoin(s.GasTokenDenom, math.NewInt(100)), - 0, - 0, - nil, - 100, - ) - s.Require().NoError(err) +func (s *CheckTxTestSuite) SetupTest() { + s.MEVLaneTestSuiteBase.SetupTest() + peptypes.RegisterInterfaces(s.EncCfg.InterfaceRegistry) +} - // create a tx that should not be inserted in the mev-lane - bidTx2, _, err := testutils.CreateAuctionTx( - s.EncCfg.TxConfig, - s.Accounts[0], - sdk.NewCoin(s.GasTokenDenom, math.NewInt(100)), - 1, - 0, - nil, - 100, +func (s *CheckTxTestSuite) newDefaultMempool() (*block.LanedMempool, error) { + defaultLane := defaultlane.NewDefaultLane( + lanebase.LaneConfig{ + Logger: s.Ctx.Logger(), + TxEncoder: s.EncCfg.TxConfig.TxEncoder(), + TxDecoder: s.EncCfg.TxConfig.TxDecoder(), + MaxBlockSpace: math.LegacyOneDec(), + SignerExtractor: signerextraction.NewDefaultAdapter(), + MaxTxs: 1000, + }, + lanebase.DefaultMatchHandler(), ) - s.Require().NoError(err) - - txs := map[sdk.Tx]bool{ - bidTx: true, - } - - mevLane := s.InitLane(math.LegacyOneDec(), txs) - mempool, err := block.NewLanedMempool(s.Ctx.Logger(), []block.Lane{mevLane}) - s.Require().NoError(err) - - ba := &baseApp{ - s.Ctx, - } - mevLaneHandler := checktx.NewMEVCheckTxHandler( - ba, - s.EncCfg.TxConfig.TxDecoder(), - mevLane, - s.SetUpAnteHandler(txs), - ba.CheckTx, - ).CheckTx() - - handler := checktx.NewMempoolParityCheckTx( - s.Ctx.Logger(), - mempool, - s.EncCfg.TxConfig.TxDecoder(), - mevLaneHandler, - ).CheckTx() - - // test that a bid can be successfully inserted to mev-lane on CheckTx - s.Run("test bid insertion on CheckTx", func() { - txBz, err := s.EncCfg.TxConfig.TxEncoder()(bidTx) - s.Require().NoError(err) - - // check tx - res, err := handler(&cometabci.RequestCheckTx{Tx: txBz, Type: cometabci.CheckTxType_New}) - s.Require().NoError(err) - - s.Require().Equal(uint32(0), res.Code) - - // check that the mev-lane contains the bid - s.Require().True(mevLane.Contains(bidTx)) - }) - - // test that a bid-tx (not in mev-lane) can be removed from the mempool on ReCheck - s.Run("test bid removal on ReCheckTx", func() { - // assert that the mev-lane does not contain the bidTx2 - s.Require().False(mevLane.Contains(bidTx2)) - - // check tx - txBz, err := s.EncCfg.TxConfig.TxEncoder()(bidTx2) - s.Require().NoError(err) - - res, err := handler(&cometabci.RequestCheckTx{Tx: txBz, Type: cometabci.CheckTxType_Recheck}) - s.Require().NoError(err) - s.Require().Equal(uint32(1), res.Code) - }) + return block.NewLanedMempool(s.Ctx.Logger(), []block.Lane{defaultLane}) } -func (s *CheckTxTestSuite) TestRemovalOnRecheckTx() { - // create a tx that should not be inserted in the mev-lane - tx, _, err := testutils.CreateAuctionTx( +func (s *CheckTxTestSuite) TestMempoolParityCheckTx() { + validTx, err := blocksdkutils.CreateRandomTx( s.EncCfg.TxConfig, s.Accounts[0], - sdk.NewCoin(s.GasTokenDenom, math.NewInt(100)), + 0, 1, 0, - nil, - 100, + 0, + sdk.NewCoin(s.GasTokenDenom, math.NewInt(100)), ) s.Require().NoError(err) - mevLane := s.InitLane(math.LegacyOneDec(), nil) - mempool, err := block.NewLanedMempool(s.Ctx.Logger(), []block.Lane{mevLane}) + validTxBz, err := s.EncCfg.TxConfig.TxEncoder()(validTx) s.Require().NoError(err) - handler := checktx.NewMempoolParityCheckTx( - s.Ctx.Logger(), - mempool, - s.EncCfg.TxConfig.TxDecoder(), - func(*cometabci.RequestCheckTx) (*cometabci.ResponseCheckTx, error) { - // always fail - return &cometabci.ResponseCheckTx{Code: 1}, nil - }, - ).CheckTx() + s.Run("tx fails tx-decoding", func() { + handler := checktx.NewMempoolParityCheckTx( + s.Ctx.Logger(), + nil, + s.EncCfg.TxConfig.TxDecoder(), + func(*cometabci.RequestCheckTx) (*cometabci.ResponseCheckTx, error) { + s.Fail("wrapped check-tx handler must not be called when decoding fails") + return nil, nil + }, + ) - s.Run("tx is removed on check-tx failure when re-check", func() { - // check that tx exists in mempool - txBz, err := s.EncCfg.TxConfig.TxEncoder()(tx) + res, err := handler.CheckTx()(&cometabci.RequestCheckTx{Tx: []byte("invalid-tx")}) s.Require().NoError(err) + s.Require().Equal(uint32(1), res.Code) + }) - s.Require().NoError(mempool.Insert(s.Ctx, tx)) - s.Require().True(mempool.Contains(tx)) - - // check tx - res, err := handler(&cometabci.RequestCheckTx{Tx: txBz, Type: cometabci.CheckTxType_Recheck}) + s.Run("new tx delegates to wrapped check-tx handler", func() { + mempool, err := s.newDefaultMempool() s.Require().NoError(err) - s.Require().Equal(uint32(1), res.Code) + called := false + handler := checktx.NewMempoolParityCheckTx( + s.Ctx.Logger(), + mempool, + s.EncCfg.TxConfig.TxDecoder(), + func(req *cometabci.RequestCheckTx) (*cometabci.ResponseCheckTx, error) { + called = true + s.Require().Equal(validTxBz, req.Tx) + return &cometabci.ResponseCheckTx{Code: cometabci.CodeTypeOK}, nil + }, + ) - // check that tx is removed from mempool - s.Require().False(mempool.Contains(tx)) + res, err := handler.CheckTx()(&cometabci.RequestCheckTx{Tx: validTxBz, Type: cometabci.CheckTxType_New}) + s.Require().NoError(err) + s.Require().Equal(uint32(0), res.Code) + s.Require().True(called) }) -} -func (s *CheckTxTestSuite) TestMempoolParityCheckTx() { - s.Run("tx fails tx-decoding", func() { + s.Run("recheck fails when tx is not in app-side mempool", func() { + mempool, err := s.newDefaultMempool() + s.Require().NoError(err) + handler := checktx.NewMempoolParityCheckTx( s.Ctx.Logger(), - nil, + mempool, s.EncCfg.TxConfig.TxDecoder(), - nil, + func(*cometabci.RequestCheckTx) (*cometabci.ResponseCheckTx, error) { + s.Fail("wrapped check-tx handler must not be called when rechecked tx is absent from the app-side mempool") + return nil, nil + }, ) - res, err := handler.CheckTx()(&cometabci.RequestCheckTx{Tx: []byte("invalid-tx")}) + res, err := handler.CheckTx()(&cometabci.RequestCheckTx{Tx: validTxBz, Type: cometabci.CheckTxType_Recheck}) s.Require().NoError(err) - s.Require().Equal(uint32(1), res.Code) }) -} -func (s *CheckTxTestSuite) TestMEVCheckTxHandler() { - txs := map[sdk.Tx]bool{} + s.Run("recheck failure removes tx from app-side mempool", func() { + mempool, err := s.newDefaultMempool() + s.Require().NoError(err) - mevLane := s.InitLane(math.LegacyOneDec(), txs) - mempool, err := block.NewLanedMempool(s.Ctx.Logger(), []block.Lane{mevLane}) - s.Require().NoError(err) + s.Require().NoError(mempool.Insert(s.Ctx, validTx)) + s.Require().True(mempool.Contains(validTx)) - ba := &baseApp{ - s.Ctx, - } - - acc := s.Accounts[0] - // create a tx that should not be inserted in the mev-lane - normalTx, err := testutils.CreateRandomTxBz(s.EncCfg.TxConfig, acc, 0, 1, 0, 0) - s.Require().NoError(err) + handler := checktx.NewMempoolParityCheckTx( + s.Ctx.Logger(), + mempool, + s.EncCfg.TxConfig.TxDecoder(), + func(*cometabci.RequestCheckTx) (*cometabci.ResponseCheckTx, error) { + return &cometabci.ResponseCheckTx{Code: 1}, nil + }, + ) - var gotTx []byte - mevLaneHandler := checktx.NewMEVCheckTxHandler( - ba, - s.EncCfg.TxConfig.TxDecoder(), - mevLane, - s.SetUpAnteHandler(txs), - func(req *cometabci.RequestCheckTx) (*cometabci.ResponseCheckTx, error) { - // expect the above free tx to be sent here - gotTx = req.Tx - return &cometabci.ResponseCheckTx{ - Code: uint32(0), - }, nil - }, - ).CheckTx() - - handler := checktx.NewMempoolParityCheckTx( - s.Ctx.Logger(), - mempool, - s.EncCfg.TxConfig.TxDecoder(), - mevLaneHandler, - ).CheckTx() - - // test that a normal tx can be successfully inserted to the mempool - s.Run("test non-mev tx insertion on CheckTx", func() { - res, err := handler(&cometabci.RequestCheckTx{Tx: normalTx, Type: cometabci.CheckTxType_New}) + res, err := handler.CheckTx()(&cometabci.RequestCheckTx{Tx: validTxBz, Type: cometabci.CheckTxType_Recheck}) s.Require().NoError(err) - - s.Require().Equal(uint32(0), res.Code) - s.Require().Equal(normalTx, gotTx) + s.Require().Equal(uint32(1), res.Code) + s.Require().False(mempool.Contains(validTx)) }) } -func (s *CheckTxTestSuite) TestValidateBidTx() { - validBidTx, bundled, err := testutils.CreateAuctionTx( +func (s *CheckTxTestSuite) TestKeyshareCheckTxHandler() { + creator := s.Accounts[0].Address.String() + keyshareMsg := peptypes.NewMsgSubmitDecryptionKey(creator, 10, "decryption-key-data") + keyshareTx, err := blocksdkutils.CreateTx( s.EncCfg.TxConfig, s.Accounts[0], - sdk.NewCoin(s.GasTokenDenom, math.NewInt(100)), 0, 0, - []testutils.Account{s.Accounts[0]}, - 100, + []sdk.Msg{keyshareMsg}, ) s.Require().NoError(err) - txBz, err := s.EncCfg.TxConfig.TxEncoder()(validBidTx) + keyshareTxBz, err := s.EncCfg.TxConfig.TxEncoder()(keyshareTx) s.Require().NoError(err) - // create an invalid bid-tx (nested) - bidMsg := auctiontypes.NewMsgAuctionBid(s.Accounts[0].Address, sdk.NewCoin(s.GasTokenDenom, math.NewInt(100)), [][]byte{ - txBz, - }) - nestedBidTx, err := testutils.CreateTx( - s.EncCfg.TxConfig, - s.Accounts[0], - 0, - 0, - []sdk.Msg{bidMsg}, - ) + normalTxBz, err := blocksdkutils.CreateRandomTxBz(s.EncCfg.TxConfig, s.Accounts[1], 0, 1, 0, 0) s.Require().NoError(err) - // create an invalid bid-tx (signer invalid) - invalidBidMsg := auctiontypes.MsgAuctionBid{ - Bidder: "", - Bid: sdk.NewCoin(s.GasTokenDenom, math.NewInt(100)), - Transactions: nil, - } - invalidBidTx, err := testutils.CreateTx( - s.EncCfg.TxConfig, - s.Accounts[0], - 0, - 0, - []sdk.Msg{&invalidBidMsg}, - ) - s.Require().NoError(err) + s.Run("non-keyshare tx is delegated to baseapp check-tx", func() { + lane := newFakeKeyshareLane(s.EncCfg.TxConfig.TxEncoder()) + called := false + ba := &baseApp{ + ctx: s.Ctx, + checkTx: func(req *cometabci.RequestCheckTx) (*cometabci.ResponseCheckTx, error) { + called = true + s.Require().Equal(normalTxBz, req.Tx) + return &cometabci.ResponseCheckTx{Code: cometabci.CodeTypeOK}, nil + }, + } + + handler := checktx.NewKeyshareCheckTxHandler( + ba, + s.EncCfg.TxConfig.TxDecoder(), + lane, + s.SetUpAnteHandler(map[sdk.Tx]bool{}), + ba.CheckTx, + ).CheckTx() - // create a tx that should not be inserted in the mev-lane - s.Require().NoError(err) + res, err := handler(&cometabci.RequestCheckTx{Tx: normalTxBz, Type: cometabci.CheckTxType_New}) + s.Require().NoError(err) + s.Require().Equal(uint32(0), res.Code) + s.Require().True(called) + s.Require().Empty(lane.inserted) + }) - txs := map[sdk.Tx]bool{ - validBidTx: true, - bundled[0]: true, - nestedBidTx: true, - invalidBidTx: true, - } + s.Run("valid keyshare tx is validated and inserted into keyshare lane", func() { + lane := newFakeKeyshareLane(s.EncCfg.TxConfig.TxEncoder()) + lane.track(keyshareTx, &peptypes.DecryptionKey{ + Height: keyshareMsg.Height, + Data: keyshareMsg.Data, + Creator: keyshareMsg.Creator, + }) - mevLane := s.InitLane(math.LegacyOneDec(), txs) + ba := &baseApp{ + ctx: s.Ctx, + checkTx: func(*cometabci.RequestCheckTx) (*cometabci.ResponseCheckTx, error) { + s.Fail("baseapp check-tx must not be called for keyshare txs") + return nil, nil + }, + } - ba := &baseApp{ - s.Ctx, - } - mevLaneHandler := checktx.NewMEVCheckTxHandler( - ba, - s.EncCfg.TxConfig.TxDecoder(), - mevLane, - s.SetUpAnteHandler(txs), - ba.CheckTx, - ) - s.Run("expected bid-tx", func() { - bundledTx, err := s.EncCfg.TxConfig.TxEncoder()(bundled[0]) - s.Require().NoError(err) + handler := checktx.NewKeyshareCheckTxHandler( + ba, + s.EncCfg.TxConfig.TxDecoder(), + lane, + s.SetUpAnteHandler(map[sdk.Tx]bool{keyshareTx: true}), + ba.CheckTx, + ).CheckTx() - _, err = mevLaneHandler.ValidateBidTx(s.Ctx, validBidTx, &auctiontypes.BidInfo{ - Transactions: [][]byte{bundledTx}, - }) + res, err := handler(&cometabci.RequestCheckTx{Tx: keyshareTxBz, Type: cometabci.CheckTxType_New}) s.Require().NoError(err) - }) + s.Require().Equal(uint32(0), res.Code) + s.Require().Len(lane.inserted, 1) - s.Run("nested bid-tx", func() { - nestedBidTxBz, err := s.EncCfg.TxConfig.TxEncoder()(nestedBidTx) + insertedTxBz, err := s.EncCfg.TxConfig.TxEncoder()(lane.inserted[0]) s.Require().NoError(err) + s.Require().Equal(keyshareTxBz, insertedTxBz) + }) - _, err = mevLaneHandler.ValidateBidTx(s.Ctx, nestedBidTx, &auctiontypes.BidInfo{ - Transactions: [][]byte{nestedBidTxBz}, + s.Run("invalid keyshare tx is rejected before insertion", func() { + lane := newFakeKeyshareLane(s.EncCfg.TxConfig.TxEncoder()) + lane.track(keyshareTx, &peptypes.DecryptionKey{ + Height: keyshareMsg.Height, + Data: keyshareMsg.Data, + Creator: keyshareMsg.Creator, }) - s.Require().Error(err) - s.Require().Contains(err.Error(), "bundled tx cannot be a bid tx") - }) - s.Run("invalid bid-tx", func() { - invalidBidTxBz, err := s.EncCfg.TxConfig.TxEncoder()(invalidBidTx) - s.Require().NoError(err) + ba := &baseApp{ctx: s.Ctx} + handler := checktx.NewKeyshareCheckTxHandler( + ba, + s.EncCfg.TxConfig.TxDecoder(), + lane, + s.SetUpAnteHandler(map[sdk.Tx]bool{keyshareTx: false}), + ba.CheckTx, + ).CheckTx() - _, err = mevLaneHandler.ValidateBidTx(s.Ctx, invalidBidTx, &auctiontypes.BidInfo{ - Transactions: [][]byte{invalidBidTxBz}, - }) + res, err := handler(&cometabci.RequestCheckTx{Tx: keyshareTxBz, Type: cometabci.CheckTxType_New}) s.Require().Error(err) - s.Require().Contains(err.Error(), "failed to get bid info") + s.Require().Equal(uint32(1), res.Code) + s.Require().Empty(lane.inserted) }) } +type fakeKeyshareLane struct { + txEncoder sdk.TxEncoder + tracked map[string]*peptypes.DecryptionKey + inserted []sdk.Tx +} + +func newFakeKeyshareLane(txEncoder sdk.TxEncoder) *fakeKeyshareLane { + return &fakeKeyshareLane{ + txEncoder: txEncoder, + tracked: map[string]*peptypes.DecryptionKey{}, + } +} + +func (l *fakeKeyshareLane) track(tx sdk.Tx, info *peptypes.DecryptionKey) { + hash, err := l.hash(tx) + if err != nil { + panic(err) + } + l.tracked[hash] = info +} + +func (l *fakeKeyshareLane) GetDecryptionKeyInfo(tx sdk.Tx) (*peptypes.DecryptionKey, error) { + hash, err := l.hash(tx) + if err != nil { + return nil, err + } + return l.tracked[hash], nil +} + +func (l *fakeKeyshareLane) Insert(_ context.Context, tx sdk.Tx) error { + l.inserted = append(l.inserted, tx) + return nil +} + +func (l *fakeKeyshareLane) Remove(tx sdk.Tx) error { + targetHash, err := l.hash(tx) + if err != nil { + return err + } + + for i, inserted := range l.inserted { + insertedHash, err := l.hash(inserted) + if err != nil { + return err + } + if insertedHash == targetHash { + l.inserted = append(l.inserted[:i], l.inserted[i+1:]...) + return nil + } + } + return nil +} + +func (l *fakeKeyshareLane) hash(tx sdk.Tx) (string, error) { + bz, err := l.txEncoder(tx) + if err != nil { + return "", err + } + hash := sha256.Sum256(bz) + return hex.EncodeToString(hash[:]), nil +} + type baseApp struct { - ctx sdk.Context + ctx sdk.Context + checkTx checktx.CheckTx } // CommitMultiStore is utilized to retrieve the latest committed state. @@ -331,7 +329,10 @@ func (ba *baseApp) CommitMultiStore() storetypes.CommitMultiStore { // CheckTx is baseapp's CheckTx method that checks the validity of a // transaction. -func (baseApp) CheckTx(_ *cometabci.RequestCheckTx) (*cometabci.ResponseCheckTx, error) { +func (ba *baseApp) CheckTx(req *cometabci.RequestCheckTx) (*cometabci.ResponseCheckTx, error) { + if ba.checkTx != nil { + return ba.checkTx(req) + } return nil, fmt.Errorf("not implemented") } diff --git a/abci/utils_test.go b/abci/utils_test.go index eff8dcd6..fe4ef012 100644 --- a/abci/utils_test.go +++ b/abci/utils_test.go @@ -11,7 +11,7 @@ import ( tmprototypes "github.com/cometbft/cometbft/proto/tendermint/types" - "github.com/skip-mev/block-sdk/v2/abci" + "github.com/Fairblock/fairyring/abci" signeradaptors "github.com/skip-mev/block-sdk/v2/adapters/signer_extraction_adapter" "github.com/skip-mev/block-sdk/v2/block" "github.com/skip-mev/block-sdk/v2/block/base" diff --git a/ve_tests.zip b/ve_tests.zip deleted file mode 100644 index 2a1a3bc6e34976c525e4092799e9422ae7a99796..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18321 zcma&NQ;;rTv!z+KZQHhO+qS>5ZQI5!+ctOEwr%d3|D2hah|>`r-S0(4Uah=cPp&tW zWI@4Tfd1TYiM|2FDs&_JNKb!OIp*gI=C zPgo#euyar#p#LsP{}Dv{j|9|z3u>>37OBGm0j-k&0WtpX1p%(cF0O_a#?~%gF4hi~ zh7OK~?&b^ttN(w{DA)b}I_NKsK47ckLBHSRZ%3mmGxY{w@-KDT9h$B)+dsT5>ADm| z1bPt+(`Yj&rT96G3dSEuziU8%LcqvR@+}CMxK!#*>4jV#B=UesWB0n_@q!HNk@XW_ zWHw#)KrMcaGmaQ0adXMK<^3Y;;uRVt(Q}g(lL<9Q zPZW5_F6JN!!3eVBu)=T4mq~wnh^-?ib1<3tt2t8mJ=pB9r&APaV*xyv2#JI*3qbYv&?B3>yWILZCczDIZf7Fyo{-(_=7I1iyLkFqrvalL!SvOwUtd zCn<(rEST$njkZ%*Qxq#O$t(mZ4+jR75*87k!!#F}!DU>h1Z@u*GAY!2(v{N*I2XYf zwem<^s?`UNu-JekHUk96_d89pUjOMXxGEj5yu!qGusmn<4m3bX5~?Wz231ij8$zH- zHvzSaiqY=R-}-n2?^}gmGyFC~x336?084y?c!Vz>{@l$Ad;V817muxUCk}&P%uQUVG}y4f$GJ8&44tj3pHcp6f@dq`fc6_`o6Nf?E^#PoX`OUJ zd)}0D=OQ{?9ma&MR|(nQ6W)pr^L7u?1 z+PXB1XyGl4kkTDH2fKgAE%$p8K2ICX6@mxhhqusuSZc$9C7|;=4QyBtpo(3H)+BNb zscWaMlo|3~RrZ3m#0a7lP&1iA5**M|O6_@YsB&O(AzCEhMcO<>oI=Iy>duq1!AhE<9^-w>{$%$-Di$}xQ38wS2s zF?wQI(N>EEHGCyOHO}HVtjJDxRWUwVu3GwiR(ZMKj~sthfLOpzblKF|J4FvU$9eCZflqE}8bY>>1z2gP&AJZm+8-SS!PSO^c;7ZV62 zxr;m>*Yb5yta&Czo7VRB7)OHJDalQL_57S$gHbSCETTV|>bgkb?m)-5OU^^rsIpRU zDqn8O;0jATXHxx*gA+U0a<$>AqTK2Kkm1K>;!eAsgvK2~CoutbJ7r2u8VdjQIH&6=X9aU%A?U|77Gxzxl2JM(xfrJnYLHbT#)=j?a~r49j6;yI@nc3<@P85ySgw)89vX+%xGRY@_zWBD%a+PE zRX3hxa*QC(Gu(%?RN!oUTW!wbW3vE9rzm&mU}t6dv!g7G3KcFuAYnAZm--b!BFQr+jE=DraO`ZOga-h{C-ZXLU`y$x9m{r zbzLKfe;2v`(7OHhX8UjOQ1kSRng+5ZT{CFZo6Y9qE20=nnNG+|HoJZ(?QDIi*SV~BFZBffKCK2A2`S6|w9 zQieHt;u%P5DluEIMDB1xrU5mx;IXEHSO&Nn$}&rq zBI4LgPhgDvuI@Cpn)+DCvCQH=aM+f^bfJ9oRK7yS`<9xSNvGk}eo1m!5df?*asVB} z^#J!9Lu-nJ<)ouvI97~G&(K@?)3A^2i#rDcdi2uU>P^_|?OT^<=wls2W$Dn=1{IMq zmW;mPv-?*Br|>aFj&uck8sKlj-QL0dPei%FdL})QGn?QD(rR#8e|jLUQE?}ARZy2s z;CKQs=K{fBy=G_CKYVkuSAXN5L;?78CR-#`gF^`t2&^j~To6RcORTnUFeU;?+F;J} zNOZ-DS))INh)KO&7aR2T52uog)GZ*GvVmk{EUlmu_lKpegSDrddAj-qVMEnoN_5(a zy0s7bnVGRZ0Iuib9WkjtHY77;Ur~jdf=IAh(HA~Y%1*LUS-L$DnKUw0lb(?vbfrM1 zHM(OP>wWhfaWb*uM8)*%iRA!PKC)Y*=g)G_urHyEJU31HGWoGZd;?{)Q4sL`Ey%Oj6pxR5JAh6CpjC4$k!Fm-Lq;B+TM6 zPVlG_F`VV7K@PgK>SL`^gWx`sRA_IOM4d*6-n~!DQk}7ug;M2SK0l2u4Ur+KCwdYR zO%eFUPJb1@_@eNQMb6e^bm8`Hyu zmAc`Q!iY&K!(0|Xji#CfA%8-{bJa!yjg`S}Y?gjPd(^ws#QLh5aH3f4(F4xWoLeA8|t` zuPwIpNaTw6`wx;joL~#Ww`8F~F2_2}{xqld6Rvd}aKDTQ>E3b8TP0TDfPi8sfPh&4@7?={JpPx1e>bW8kAq(- zRc&>tUUw;uqW7_*ypd0FvO-4DRwWY+bkWnz^XUw5o_ibqly$%a>L;6u_sPp?CKN-8 z8ND^>AEd;+Nu|7z6|`%1LdZaP!^wqa(#8?K9=AJu7cO}Ko00q`e(xky0JR8Dn%+6xuI6ST}_R>4^ag8MGV}xs@co8!}oB@M7Zvk_-ejWjv$9CJPxnT1LZ!eyV0b6a zePuMbiZT=oLhWKwNCC3!a0(9WMENUw$_)^dVL@|DG>9MIOe{5)Vxda3Ni;r(-Glz# z!vYy1Gu{R@K-pUdd@Bv-vkn@^7dLA&@Z^Nenh)5K)141?2mN?6`M!LDWP6s=7yC_# zjQQmoBP#@ZhK>iiuZP=?k2~YQ2+p%a^s?kz&I|TnzL zF^5qD2C*rTHF*!Lxw-f~pu|e7Ubz)5C*JTrJn)gp_W@XWdWA%F>+o;6p+T7746=Qq zDn&*(RuJl9EiU=R9Y)gmqq?_pSv*kHf1@mUG5h%Ez$}W!P@jQT1hbpT9`wonV2_Gb zpthg|uThSJei?bT!GG0%4JYyQt%o0_EZqMEGQ@|Ipd8BK zdhf(~nY&qPKKKWOj0gWo8ufhbx+ic+h({E?w6k=LypXHk!{5pnJ|2?N-k~AGk2@9i zF=@w0I8*X$FkGFIOEQ=3m-&StwUT6neaCP5#Nl(Bo%6ij<`R_+u#h+yvN8i9xxenT zmEl5VABCR54_zE0CHh%UyHo%;LIku+{u}|zTg>URt|5meqEuLa%(JUT5l~K93O$`T zuWetL1$du;WTYZSr>BnVKY8s$Uo(+=a-3(IV|h)ffIZKr@o_$aRz&&EvyXD!wr%lt z?`h$G?_J#Xc|LsO>LuEO51xg1zhkxxMjO&^>D94^(i0}CVL+VsQx^6_v1taqhQ9vk zb<$pf67`C8N#?TRR$O3nwjaQ&W1g7+mf;KnlLwQ9>XndXYaS_hH%YuqOnjFZ6@jXGEVjM%-%(yny7a#-9Pd>w3Z_Lz#0KQhci02Hqpk}fa^xgM zaGn|2-C{MYxo`B~mt*<5zvbWhO2$*zB@SSP(=b6;T2fl-uWxQ|kRYc2F*?+7l2I|z zP6RU4ioCw4)A`)MYzRp}?QcvZOAQIZ`~8&uQ7N6gsK`_yR6%1!BV`tN$IH7{1CYZb zf_6>+7e$m=@X2ezou0WAc6Wm&mDZS3DSto0W)e^Br?2iK2fQ~7eeDw9Nl?SsvJX-B z4Kv$5YGAUEt+bxexmvG$+@oJEJrMrBw}T`m88A-%Nk&DDMd1K%{Yzn4UHIP^t|Du<0;EA+WisP*QmZ+IXFSb(Z;9{v3(iQH7Azo;MXb3iEH~ zBE!s(NltiJZ(*`oJc4@Z8mOsdUU_b#HX9{Mv{ErTNmfvn+<;bg;>=8)o**!*K{kD4 zDV_|uOtci?cpIKA4FE(YQ7}C!(1M^nx}kL<#Fr6K71kOD9bYn597`0sCj&04e0%I! zpGtgau_e_yti+CH%2-csU`c4-5$i7ztmpBJ4Bt%&Msls{EZAQX3kDY2U8*J7D0C;r zu5cC4(O!8}OEa>5*D+12G$JgXdmWwv3>`h5lM{KowI9Y;roU9^&NTa)@y5pWEL#$6 z8qm$+Or2dlSA-ipHXQw-&S%W7tyN8TqzOFTV_LitxG2XLEGQU8x5Di3+H@C+eVcCb zKXx{9Er9q*AXDrGzbdskl`!{hd0&b!>I%M?^eTIj8tbv4R3=~eNf=@EY+3B(;nRDl zOWE1x{6d%x31!8a0|&k; zDz1$4xK;z-zx(+E{C@6X=3ZlVMS|aW@wxo=1>2?5*uN3{yUbyk+Y~RYw24TP@jlx z)y`tTo${A(AW~&+>Wc=mnF=5Bz*A`~Yw}%5Ko(%v$QPN~AcGg8MClBei2FUnQPnyu zJMJ}$=hq&h3IQ578F{XiJ);3!of~}Yj02Tu21CB@HuQNr+U=qrsT6g4I&RB1d)^m< zic_6^M$0hOeA9wE)zvUU)`yqq3bq{WbgXGlc-$o11q>d1A>P=TRAdSrp8tS_7(jCP zGXksT)Wn{0FcN0l1TQ0CE@a1cx?gcJHH&3v5!f6*L z^=^18Ax&4#(L{!YE3w2x2=|MYtq4OcV9;XAan-|E|R z(;+F)2m4NW?q1B?4v$Ra(H%_~>?($aR#6u7yf7gz)83E5q<_DFhEjE~m(s}#2+84- zznJ+(fuz#75?9AyYw$F?S}5Q<6r-4KND*{f1=6SEg>om>6}e|UqI%e#PD!QB75b+r zRLp-i+hn->3|{S8q#Wv~q`3J?FAuK2R1~Av4bMn!tAVOl({+9!qxpGF4XV#;O$b1< ztg!c2NDXAISF3e3c`*8Hx8x@uS(B86JztfigarA?^lFwA@$7VXnY+Gg623bkX| z(B8Ns$(Ox39*!B{X!?+d&1K^etZe}2u)2o&b46+BVISC|hG7U`HxULS%Pw|yHWF~X z>VxW(vFfUqc8)`WZ#wky5bbWR(_Jz=tY> zy{+Yl9d!?(9Z2-%|4<~O*sM@O^tEU;CmW@5vHZd^U@%!xD$#YB-n~49tJJ;pt*`#< z8n$V!sr?sPSc-|&h4NU*;{Q2C5v{d>ZRi^BjT@-9#SQ9SQP?kmsz(ZNq+~KCk#7>8 zt{q70BXHI*U;1{ZuSj#>R*YvPJIhp`6xjh*i>IEZWxs$-_Oz>zHd0KsvY2))TZBw^ z^j_YWHS|KpbWVkmX*qsIb(nh$u4c@iewP=`PUN|X=L)-XMMskuCmxxd(tCGRZ zppiKO-$%l#Uxq|eS>)C4n}U zKyjHUi~ic&|A4`#+ZPgo(dp(UNWTd&0@g?L$B7|JYTCkoZLio+#1m+&J(6L%!mCz z16i!g%m%n}`#U>Cbx|xCYOP?4j`Z#yi%i}-F)d< zu<7|$`2!w3368StHrW8cd2YivW#j{R@RQusvj-2Y<)1qObx}RzVlN#<^0-J?8fGoyWb@Ot5iG|ohSrB30ShD7W5(TY`y z`hSSL2<3+*LuiVI*%&oN6nP9)bC{sqds4#!1*+S5Mo^9tQS+QranhmSn@>N{n>DSf&V8#1=m1i1!DmL z1t|gnk^b)q%HGY+)!NYA*zW&8Of!5pE?aF)zb|N1N2s#)R8h&_Wop*?lJb1gb_qx2 z{HWb{iJ@d;Xp=~#c5ACyUuS)zKYoPQe3Lui1B%M=IY;hwTS;O@z;v%ZLFW0sOVXap zje7mV-{6f@1?*fgQM1W`q5oNIEWhByQHlk`3T9dsegzFr%q_<`kgOG;Fg8@44JQ-G z`}&NLESBa=Vk`sjaUhWcBm`oipDIt7E5b4p{l1GTJb#znoSiz3W!X`Scfdxl1s2WPW0|fae!xp0-an=##rAkuH5$( z`PSl{35|h>Kt5CD^$D6I>uV(S3iO(A8$q%l6%Lu14>d1`o{3MGZ{5bWFX$+iJto*p zh$Gq*IBZToU9uz(BC;d#1|+trts!7B#2M}_4^#?2ipjfh1#kKZbLtcJ;v_f6>|dFd zIq$2N@=IryG35vc+&@%o@p^Uz`B)GQ4-=o?lrRgs_B$PbmUA8i6%i8*vIK7kd$0+i z_hpupAPL5RHa)ooc>E)f4#$-gN6hA*{@MNhUEdDy_?}+Ce#I<^=vtuvt{jxbda?0! zebqHqd+_?>Sc~2AyUWMT&xe#cK@jeZe7b+*`733I8vr*d5a8|Odq2j<3x@KVcu5$X zne^Z`<9iDsAO!=p5IlC@{Q&%jSHSm0hbWC7?!_PTbmRBK&etY-W7jm`0Xs>82Rc8Q zRE<^XgluGdY~f+L(TnJn$Et@{fXA0rz)#QyCJWPK2erWOf!m7Mbf)CT!!&U6m^0(p z;9qmWZ>TYRD%8^n@$3$f*w#d88EN{W4UUgn+)vk7(5ltJKLw>VDX2CPtP~1;usTxL z4fJC>b_GR*nUtd?R-uyi-riQxeSog-ZRFfep2ktBhf3%M2Gb!x()ZS(9j6`!^~UY3 z3ryhiop~UkR>So7nCXV|a||IULH~O_B*6f)VHA4zw%<2Pg{*DZxWe?=eN+E^4$EQN zLe}@%fUcEs5DPKzf*+_nfhig4tt2Dqg5cRD^X2@6>1tux7|k197Bb;3evGOQ@~&E+ z@O6)%Z(ER8fL#@73Co&eJzJJ()<|d2)evP%zk`5p+^EoTfV!}V;+jXyme(=~)@UD8 z*!i?hk#q=@=?37$4t1@7+At7x7tEN2O3=j-@E zVUWnilyL?>u$@>_*j4&8^+_l9i`0HFFmf4FtWfj3Obe}$1O>8Zh+JtIQigk`yaAdw zvzvoW|HCZbDSZaoXpkyGxM*5AFJvMQinA=Z zlmL|aVV#WP6^yPMeoiKNhJQ?CfNW?miV+%~IWf`bwkU9283eDjaJZW|J>vK@>IjGd zX&rclw9RP)J*#^H!~vGBc0YS2nY-Z*#u^GI5$Ga_HFOR%k<1EOG}TEfIj~ENVL}z_ zU8o$FqUWzaRx*>w+bC04(7U*VuJsH`tK<1LsH|7;?jtBy%bt_qevb^js9*b9#q27B zmew>A+-f_dM1ap+`4+E4yQ8kFM}qP2Zu*JVEW^%DTYD}37zNPcUTfEoAV$S?E!`sS zWlMW6Yh#yR^;{c%cfYNjy&Lw;Yn!`J>gQM?BJH(8?9HyxT5(`FYomJ`PkyT10L)fsa=JD82zp-44nC)V}>=M>_OeB9S9IplE_2MH+BW)kX ze4OK3guqOG*hmfmetrS`RP)VY)A03%YEMIUig$@=-2kPSk>4G283w^w{&GF$OcR4`d8AbdIlW}4WxTARmpF2_c0c%G#r9GT1 zPb^lPY$@GUc_FB6azxFpWOBpO1SxVUAC(d*FI0+m%igi_tc!mcDhwRqO9jpu#E{`R zF-fr?S;?sCZe~pBR9WjP(sPW&HI78THm`8U;jCr& zxD}%+cB5$_P>Y<+axj-#IZ;m@m1zIMN{r1E-&T>hONU4%Y+0odshEyG8>w~^bQ*=F z-*r3k+*qEI$uk@-JfDv6uonmx^huGLAQ7e_4$2=Y^NH`zo71 zP2c{n!<0jl1)({n=EmSr)`TcwEbCM|-`od6O?#XqA&Hq+i(4Rd`BV*CTP|Wq{uq4)LS3*Ij&_mHc<||bQFbmu^sFGEE-t8K z$fs2fSnW9CxaO&GsXVzfm+LYp`h*5F>bgO*X>@Dlav5S!O$vmIy?*F!ajjj6*7iJt zFZZcbE6_ywi&4u3J5U1VU5&-qZeUaDr3%7}X@JVwrC7mQ%xW~M*A<#D;#Lvj)XLC( z*^S{k<*-<3!%FaQl@Rqhst-mJ;HHm1$TPHFyzFRlMQ!jG$T;F&E8w1HoVuei^co!o z-fVg`BQJQWc+XtrU2L>r=~r&*uhq;Yx%F)wahHD(MmI^y-tZyI^nlI2D4i3tlOEAY z#5|+9>C+DRk^*x!_z4Ll#*P;u2MaNv@PJQGSdn79GtDt9R0c6vbjxr$duhvXzz?R8 z-0}2(R?#21fM;9LqP2Slb#Ozm5Z&7<4}MrDQp-H(RSe@)-~~l7CbtgIT4OJztf{x; zv76pDZ&c87pVWh?EAQMs^MKDmAqS0S4#4iTWlbVjSO=TIuc7O{bI(jT+=SC{HnG!G zsYaC4FyPo|iSX(pC&_{v=I~#1s*61D7-2@0tt52v+J9`z?i67SlMXJDg4GV+b+-F0 zp|cK8_EM*}bIR0)@ziAl?HER;u2|z!PhIq=Kdbb(1r=BxnIzLCG2Ldkp@womELlpT zD~hM8jiQOO)cC@*nfD&t;0b?oN!E!MC`-e`%FKB-+lS<928&D3XKPkE6@qTuKb9(ANbI$@66$hExiRkFIX3_H|&P}x#W_Z zRPh#{2q!p6ga6o(gxkPQvr7hYMJbd}Yd2so$Xq4Mlk?Kjwp5yTA3KO;+jjBbyL8(n zb^B0SF&h0+Ousr#sSv0x7>RKJQ8J6Vk-kHb4LZG3XE8pGlVnCZUQIlUelb?4`tav% zA{MKDIhLnPftJSp>k9B@BkO<1dU_`tmfi&p$|z0r8l4k!N^~7U|cDXMQNgR2(9}QArygbcdarep=4Rvz>!Un!_AV1<3~l z!AJa@Gc1gY9pwS&@ssTz^l+1(63#HMzN)VDT+7k>(9(fFPVnLBxFUt2R-rBCV;wZB zt%n6`S$Aq4JNVM3UG8C`>!5NoUjjX9eO3~D(;D#2x#c?I1sCs^zNocs2c zF;RlI0h5zu-UF0$LEd;PSbrm|aICI0t*K&BE5OZh+M)#x{y_(ZFR|5bb%e#iz1%5( z5jpxitbdfyy$_2d(w$>~#}<|nn~G>ts;Oa&+~x)md-j+*^Xlsmcxftjsm?TIPg$ar zSd#n`DpffuLXu7BGnbJ>Fcj(9m*ATP1I>}|Nu(nj{*3^(;IX|4!gX3l&aiLfvPA+L zb7DZG)*xBb`0$h~T`@TWvt{_E#{8-_(2)|ga#wWcHTtkHm#dC+(5eB=lOrRi=?znQ@OYH zqw}LKZl5PR{!<5XOuAHS-zci(wVqOll{O}dm-Se*K5-HX8?kYh5L&eq8`ih!04>gw zMWz2u-(YkO-Jxp3u=+>xvl0H@js$-uk3EQ{+mMN3`!c8iOG#?F>JpezNeD7QrH-?$ zXvo$fwkqtKjE>}4>F*q56;uR_FTIFM%l%7fogrxMo;5+9hW`GK413*nS=0TqQfh`T4wLo{q%Kaf>ow&DUI778W~tES-Sm#B-ViT zH%{|(GP^%AHdHS}q3kIJYQ?x2A+3r@i0pVag*!_np2m)~PXY|R5FxM&Y$nV}-td4w zRu643q8`Wiq>A|vXb$=yG}>$B3pAY;L~bo)J$3CvO-$*;1E!j|4;3f|L$_Omxw|k^ z+o~C%o{^DQ_Sl%%x3jP*@p?K#_NatWsYow9r&nCL#Wkrrv+*jNrQ;piFyKxAXVbUbJ_NeCe;m>4Ur*96#OJx3yISEWje7xAsO>v>1pA+9-?w zsIxCqVOLDJDaeX?;1}i3wx;yfm$?0VS!I`;bW)t-C9vq)f>d>l4tC>HDpIS--}5e%Xc>C+ph*>u<0l4b zR7;#>oo88VGrR>PyLY;%y#1++?_IK^J%l+W-{~7#7oc7d1f=7}4MZ@ZTTKrN>Esnh zpyehGvmq6&x?@og^(h-!aIxYZju1L^knVse4p9_Yi<#lVD7FWA7`K2S=8VBEjLTL6 zd+ulEW-bKzp44RGfRoR>aqCq(z9a$DtTp<5B`aa=WT(ecXl~QY%(w#lT(u@YXP*Ml z9syp_NDFupGdCiQJALIy-ubA&!I0-4&?Hx;%I{mk9&m=f#~~2wpYaNTCT!Z*2k1V+wx{RV3Q~`15ZBhQh45|A8Az7f zC`^z6(T6uK=I1M`ww7adl#P#;oz)D=u6Ivx#Utpcevo4K=&xPH2_)s3~= zBK=2gx({>k&9wEvNHr90_M&!r&&%EK=brDYcM{`00a3k0ohLW5G5TOSr!?z9iOjRu z7uEfBTT`~8mRb0@^l_C++Rf$O@6+BfTEZAn@m~in%MMI#hONBpti;Gs>EjfK5+X7; zkT}eZ)@mAQ0Z$+Vf)1{2vI2+Y_w(6-Fd{b$}xpI;f;W@v#v;xhstoJfm{Anf=XimL~w5 z#OK42be|5Xpfm*bzT&GtxqZC8u-W}1(jd!7hC}xSJ!3lfZa{~qQ*^Q{?z^>Ff_#eZ zkC|^=hGeBkd5c%?@4r?e_HuynDGA{;~h!koEPN-U9v zI-O0V^w$FxX$ooEb>Xcik-)b(`l3vh;})g=oS{!M!=9-{jin{b9Kr-Y3DL`?_r zE!KFFb!mY~^c;Zj7mU9grCJ_V0XaHtlsBCao#wO!z}{lZZP19UzMML5afiHS0cbXv z1K}r#p3mX=%_?7CWxb`{>%CMYd%cN~$L)T#HJ56CLs4U}Xw1`~0FO)dtnyUV%!;3P z;e|g{dU^H#x`}`HY)V-+fb|Cy*L~gR;pa*oU)J6F@=|5I4eYWsS))X%H;a9HJ>g1! z4CytOmWYtV?takE!K()8%bEGDOys;-cI6ny*yzcvR7TL2m!HRZ9bZwk#8G?FK)PMm z{hk)yD41np_MA$+H`D`67{?#HHS0L2Khit)%W=`vxh#Klw~`W=oT+yc%7}A_W?@zP zpxbCQYG8wKw2s|$a7tq5rn?b2vCfwNPW|FYm*YsX$l{DkYVNAU8BUXAQRHL(eZrhm zZ>(CPM32Eq0_|c!;z?AzP(V8-$LsbYShMCFk``TP?*9#-;fmq55AxlA<@Z7e(sRhXj z)jcFv4(pD%6yuMGgq)zxz3Hh%U+S4|RsYx9sD}KMIv*|S>)z?=Z%@#PRFeQLlBK}B zV@b_?{AFT^B_54Ge~Zo{4=bFs+{&=_?wIcDzB^dN^PSe zXgg}E%)g$JG^_H_F{drI7N`%Yll9v)>K^;epGlGo0&W5!|4ngTM&&VJFKCb26*h z+;I+cWK`A^`JTzhaGr$Wlp&gu!=eo+@6J|z`0=|vdHX%0=?&{1pc#~P@_|Me5d!bPPs0PP zhJlXYl_!Jy*E4*$3H~E#f&u(2$cveN3Okt}bW)y#d%&)l)WP^ppj^0eyHi1X0wL&J zMiq?_q<9Aps+Y zG6)6Dp~EN}R!zBa6tFdw<1^rZvzXAtVf5H;y*lp5tTZOQbXm%?^MsI+g##lO9*zXX z@bL=D5>P8};t?su$nDb}dgE`jZZMHaHV%#SJK?FQ@Fp~(=;5*}CdhJHr}bnn;}MfE zUz5>Dfyz13jut&%1ranpshR$e!K+CpyFMNseoqeu%-$&NkwMrqJd4P#d4dSE$|nU9 zQ6N1uw3hN%N}im99x-D7KB<%R{m_gcq-h_AzuFY2CBx9vtQjGlW~XI2baLWVl`XSE zSH&wON6kwQW=<>@m@Jj1$7t65p%{lVbtEHD6A~F3+hfQhiPZQ^WSPxOGW=+2X$7IM zWUvtKSmQGafvmineqA05q8i<@*@}yL4Yb6ax9VH(Ht9sbgTh!d+uX@bX3nugVP&?+ z?Dovto<81uY>1Lae)eZE-nUo0&+E)CW0$h!mihY<|H+8(V-;o=i0PH*{Pbs5dgt5t zdLx=66Yj!6>U^(Z_e4$a!uvBRLym~ytIqoJt35eP`FOlc`*84jaP#q|qD~b3@ZER@ zE8~U_CNG%(A|d+mqyO2T_%OS7utJDe+$)f?>iOPX^VwMx?0kpN?8VNP^Jl1~>3@5v z(8YkCmA-}yF8wa6&p5-wgNLLHwtk++)I(V{QIMF3sfZhUzaHSj!6SgFJ7JWn#DC$< z+r530!2G>>@pya9_fM#vbDxX;_>lei<~Lah$Ap|#kV1awOyYG8PVawy8Q0g-;c&oV z>_^okd)}6%9u8Ucd>6cvJUTG$M(kGHXNkp+cSq7@uIj&M<7={$_;;JZ1il56I!O)- zCx+3fXYMy7$~qn71To``>SAPOz`ABCVY(Fi#*T~r2vVF#c|QLRzJ9y-a?d}A73P4} z&uV;#2I?E`kAep`5=jWbw4D&q5t5KPZ|0F-d{7Y-gD@ajqmK)}6=$Cy9DD>z8?Aw) zz-&=^j%ylhI$oE+?8+`aJ*fC^0z_uD2Ul7iQ0DU>z*6N1t&ZDWG|ArU6B>5lv*JM48zq@Q zNt}hY5Ran8sK(3wFo}7fcPopb9i#_dN9p?neGmN^*N{tze1)0m4-!VR_iWb2sF*q^ zPlH6eS5>HEs_YnJGCF>hq|z3Y(MX_bxp%$n=2KNO6w4wi#j^IH4g<3ouZ~QWx*j$p zLR8wsqkiHWxCZ@oi~zQgj^0#upAiX?z4QCoxHX;j`mFi-erQ>{Y8-z}**)q#YioV; ztN&Wh*O|*_{k;FaSkB^^tFiQX-F@~Mv*0>;Xtvg@6ttP2X$|8Bw(d~uM52^r%kL3H zb@%@?_$Yp?=<8dn?EvMjeGHOQz8<+2hvJ>mr&SDaFrI20dJaKG4fR080_fPkF9JDP z-UDqMe3f2)qO|1YLoo7Er70wmRJa=oT=x=1fpK9A*%iT$A1yf(X7lz^n1?y1YjZ>7 zdd-OBC1Im>L@jaJSyv6(Ts;Lj5$Bers!1$<(&C*t7z^K>R`kzD4YuIKH1P!e7%F z_dIe*+Bp{n5*|j)7?Snnfof~{rsbm5vyzVUssz73a{<#7Na!|ELo#rQe=}2oZdG}Cwq#qI1t*0#$#k7G5ZhZ-j>OaF{al#R2_uR?%1{=kmM2`8*dz>-O-Et#Ff z2_@U$srJay0l;Kff7K*Fbi7`*$Pzdcgv?{SnmkGAT1{M_8l@ESn!3f(sU{<8(Jr+lfL?3M7cB$+%I%6{+kY8> z4ir=``I6o{*-c=64UzHTe{>UxGYKlUBVpczLe=1299sU8YASC^@i~lInZB+GQ4Rkg zvzEbQDmDF4r$Izw)E`Gyj+3MR0@l?A7Db*0+1sIC)Lq6aGl2x8S;{s|wgv|-6Yywln4&$g3ocyKKgC#y7|1rF;@Xd-Qi9I~>KG2=Nq^%8uw6QZ<-&ut!r%#E}Z#c@?rNc1h4MkcfotrU4pH|{a zrY-eFk_{wpVK;dSw}vi$-kk|`XqJB+ysLV?GnUA7dQ-7dc_lLOBLBHWCbyyL&m8DZ zOaQ6L8`lE6d2BxM{-G}GeSy-b{IgdD1{y?kJN&fp;XkUlUQE7`qy*4(cJhAoejfYJ zHjZ#*cJ3dR^tlgP9?W|!pq45b75BKd`7=|e*Q;NroPvuPVF6$DjpUIoC#syDhg)iB z*+2;j3YCWt`J{)g`U%g5;zX3qp_U|K`G8Ugx3^u4SoN}fl8^s^)J6QCc<_h1u4>wv zV}Y>cJX@k%ypf87h35}4!8IszulDF44v=7=65R*9bUR=ja}TT2S$|W^;p|NYy*p9c zX{8EKL#3noJ0Rn2f2bxz-pGv5Mg^o^5&%_?AXtEQPkO~m_7BW)^{y4FUpZ5YCP(#x|k7-jie70d6Zz9ic-}BCv zw8l(RIF%bxMf43&~t3&;U8?2JE%Z z`-kCi#Vv`J^0ty<8UexLHy5=b4?RA|p?EPfQ_1Hoss$*0W{_p?ojQ%DxPR8|!OoqN z!)$HZ8g)lqSz$9(xP|_*;2H)lGI}xAr@<#a9FXXgME>XY^4MZ-$-27P(Ra%W3@51;dA0CBRCl&h`G$>#3FlJw zNkO8f;xR`R&J~jU%;|0U>)wFIn!#Lc#ZbCp9y1dyLv%I~Tx;c2z3e7I+% z3Oo_fTCrRImqRKx_mT(h<-wh7q{f@9O4Nf?IL?Q2BQQCj4>ZYc7ej3o;!da>A;p{R zwgjlm-HXKAR!!!svVM-ft^{T4+~BpywbZ-$l<2w03BGljMbNp|yatZ#3HwnkGFgVE z-~39uL(nLxUxK%pT4zC(O$l72f~-AY<@BnN$`rcjkoi@yLUfae{{37*y4qwST~9F^SLu zL(^}RBaCU*6%=@8=GI6I1I3&I_R=YWz~QZfxJ^=xG)u%$vQ;5!^;GTo56`ORrU=e9 zGD4Tvm4C4|vu}6*Qn4OG-DJyMinVdytD?D8hk~nW^`y4A3snv|O1 zZ%`BAY;s0gU0=sW%1)E>#rb+)<~WHcit_jIvy)Z+f<0nwl74$p*458HQs=lDZwOLF zkIR>|Td)NySWbgdNKHoB*z(0f1RM@JAXxuoVY2+<8 zweY{6tb(CoMq!AgSmeuv;$W}Fw1(iL(strjnlWre-TztVXES|!u@SFS`PShXn~&Go z)c55xLqA0ago~qbo!`6M+}F2CD0O>(>g*h?vaVCMS~hgAh^_}fJ-|G+6AX>fNt?D> z{h+xYNu^O$CszvY$ylG9KhQssU|4cKGsVr$2*lg5#_^|gZIn-l(^B3ZP7CZ1PYBYB zjP6tQ3DXtu8I}c&z0*dRw?$EJF8HN@f^Pk*aRKE1? z-@w*Aeobuj)oBLQ{yQx9^!&N_b`LC#r)z+waz4}p*ap~q4 zTP}#XGDUY}%K0o-sQ#3QD2 z*Mg^}v`}llMOyLnce^g7>|%-e#maKa@853``;wsklXqYL=!rR}eq1Q6@T$yA?Q^eB z%X`%}#g$F}v(M!V^^R-gK+laU)X}Y{GCe)Qa`@-B?@&4rGb2e{2 z+<159V)oMDFLib8b(_9+6;1YAcW3UKIML-#3==%vHGbOMKPhHCbJNpppKN>P?_|5~ zul8Rz`&ra+^{T|f4VPVic<*YETa;q3Zfc#YLQKyImrs}VFKnEY$wITPxPm|lyozRveav$k?-tZMl8 zW-!NZ4y7`Br|;Bc#*e#Hfx^f>d+N=V%%1~krw&< zyDHbXR)`jFAQj*O zU@#D1`0EH_;5=4^6>_W!#*r!@!*Ly|0x_HsXzbs{K-`9-kHI01SRu|*)V-j{mhuC4 zh~n@Ox}~T)Ly5B(bqO`H#etGIEk<2XO`JujgPF({85rTT2#XIfhc Date: Fri, 22 May 2026 11:37:04 +0530 Subject: [PATCH 30/42] ci/cd --- .github/workflows/deploy.yml | 89 +++++++++++++++++++++ .github/workflows/release.yml | 48 ----------- wasmbinding/querier.go | 23 +++--- x/keyshare/keeper/get_decryption_key.go | 40 ++++----- x/zkp/keeper/query_grpc_test.go | 52 ++++++------ x/zkp/keeper/query_proof_fuzz_test.go | 10 +-- x/zkp/types/keys.go | 9 +-- x/zkp/verification/commitment/commitment.go | 3 +- x/zkp/verification/common/common.go | 1 - x/zkp/verification/common/errors.go | 1 - x/zkp/verification/range/range.go | 9 --- x/zkp/verification/validity/validity.go | 1 - 12 files changed, 156 insertions(+), 130 deletions(-) create mode 100644 .github/workflows/deploy.yml delete mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 00000000..e5d3fcce --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,89 @@ +name: Restart Fairyring + +on: + push: + branches: ["anonymous-transfer"] + pull_request: + branches: ["anonymous-transfer"] + +concurrency: + group: deploy-${{ github.ref }} + cancel-in-progress: true + +jobs: + tests: + name: Tests + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version-file: go.mod + cache: true + - run: go mod download + - run: go test ./... -cover -timeout 8m + + style: + name: Style + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version-file: go.mod + cache: true + - run: test -z "$(gofmt -l .)" + - uses: dominikh/staticcheck-action@v1 + with: + version: "latest" + install-go: false + + restart-fairyring: + name: Restart Fairyring + runs-on: ubuntu-latest + needs: [tests, style] + if: github.event_name == 'push' + steps: + - name: SSH and Restart Fairyring + uses: appleboy/ssh-action@v1.2.0 + with: + host: ${{ secrets.GCP_HOST }} + username: mani + key: ${{ secrets.GCP_SSH_KEY }} + script: | + cd /home/mani/fairyring + git pull origin anonymous-transfer + make devnet-down + make devnet-up + + deploy-contracts: + name: Deploy Contracts + runs-on: ubuntu-latest + needs: restart-fairyring + if: github.event_name == 'push' + steps: + - name: SSH and Deploy Contracts + uses: appleboy/ssh-action@v1.2.0 + with: + host: ${{ secrets.GCP_HOST }} + username: mani + key: ${{ secrets.GCP_SSH_KEY }} + script: | + /home/mani/scripts/deploy-contracts.sh + + restart-fairyport: + name: Restart Fairyport + runs-on: ubuntu-latest + needs: deploy-contracts + if: github.event_name == 'push' + steps: + - name: SSH and Restart Fairyport + uses: appleboy/ssh-action@v1.2.0 + with: + host: ${{ secrets.GCP_HOST }} + username: mani + key: ${{ secrets.GCP_SSH_KEY }} + script: | + /home/mani/scripts/deploy-fairyport.sh diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 42437950..00000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,48 +0,0 @@ -# This workflow is useful if you want to automate the process of: -# -# a) Creating a new prelease when you push a new tag with a "v" prefix (version). -# -# This type of prerelease is meant to be used for production: alpha, beta, rc, etc. types of releases. -# After the prerelease is created, you need to make your changes on the release page at the relevant -# Github page and publish your release. -# -# b) Creating/updating the "latest" prerelease when you push to your default branch. -# -# This type of prelease is useful to make your bleeding-edge binaries available to advanced users. -# -# The workflow will not run if there is no tag pushed with a "v" prefix and no change pushed to your -# default branch. -on: - push: - branches: - - "main" -jobs: - might_release: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - name: Prepare Release Variables - id: vars - uses: ignite/cli/actions/release/vars@v0.27.2 - - - name: Delete the "latest" Release - uses: dev-drprasad/delete-tag-and-release@v0.2.1 - if: ${{ steps.vars.outputs.is_release_type_latest == 'true' }} - with: - tag_name: ${{ steps.vars.outputs.tag_name }} - delete_release: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Publish the Release - uses: softprops/action-gh-release@v1 - if: ${{ steps.vars.outputs.should_release == 'true' }} - with: - tag_name: ${{ steps.vars.outputs.tag_name }} - prerelease: true - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/wasmbinding/querier.go b/wasmbinding/querier.go index 665a983d..c744835b 100644 --- a/wasmbinding/querier.go +++ b/wasmbinding/querier.go @@ -105,12 +105,12 @@ func CustomQuerier(zkpKeeper *zkpmodulekeeper.Keeper) func(ctx sdk.Context, call } req := &zkpmoduletypes.QueryVerifyWithdrawProofsRequest{ - EqualityProofData: equalityData, - RangeProofData: rangeData, - UserPubkey: userPK, + EqualityProofData: equalityData, + RangeProofData: rangeData, + UserPubkey: userPK, CiphertextCommitment: ctC1, - CiphertextHandle: ctC2, - ExpectedNonce: query.VerifyWithdrawProofs.ExpectedNonce, + CiphertextHandle: ctC2, + ExpectedNonce: query.VerifyWithdrawProofs.ExpectedNonce, } resp, err := zkpKeeper.VerifyWithdrawProofs(ctx, req) @@ -151,11 +151,10 @@ type TransferProofsQuery struct { } type WithdrawProofsQuery struct { - EqualityProofData string `json:"equality_proof_data"` - RangeProofData string `json:"range_proof_data"` - UserPubkey string `json:"user_pubkey"` - CiphertextCommitment string `json:"ciphertext_commitment"` - CiphertextHandle string `json:"ciphertext_handle"` - ExpectedNonce uint64 `json:"expected_nonce"` + EqualityProofData string `json:"equality_proof_data"` + RangeProofData string `json:"range_proof_data"` + UserPubkey string `json:"user_pubkey"` + CiphertextCommitment string `json:"ciphertext_commitment"` + CiphertextHandle string `json:"ciphertext_handle"` + ExpectedNonce uint64 `json:"expected_nonce"` } - diff --git a/x/keyshare/keeper/get_decryption_key.go b/x/keyshare/keeper/get_decryption_key.go index e33890ae..82bea16e 100644 --- a/x/keyshare/keeper/get_decryption_key.go +++ b/x/keyshare/keeper/get_decryption_key.go @@ -101,28 +101,28 @@ func (k Keeper) OnRecvGetPrivateDecryptionKeyPacket( } // Emit signal if this (requester,secp_pubkey) pair has not been satisfied yet. -needSignal := true -for _, entry := range keyshareReq.PrivateDecryptionKeys { - if entry == nil { - continue - } - if entry.Requester == data.Requester && entry.SecpPubkey == data.SecpPubkey && len(entry.PrivateKeyshares) != 0 { - needSignal = false - break - } -} + needSignal := true + for _, entry := range keyshareReq.PrivateDecryptionKeys { + if entry == nil { + continue + } + if entry.Requester == data.Requester && entry.SecpPubkey == data.SecpPubkey && len(entry.PrivateKeyshares) != 0 { + needSignal = false + break + } + } -if needSignal { - k.Logger().Info("Got OnRecvGetPrivateKeysharePacket") + if needSignal { + k.Logger().Info("Got OnRecvGetPrivateKeysharePacket") - ctx.EventManager().EmitEvent( - sdk.NewEvent(types.StartSendEncryptedKeyshareEventType, - sdk.NewAttribute(types.StartSendGeneralKeyshareEventIdentity, data.Identity), - sdk.NewAttribute(types.StartSendEncryptedKeyshareEventRequester, data.Requester), - sdk.NewAttribute(types.StartSendEncryptedKeyshareEventPubkey, data.SecpPubkey), - ), - ) -} + ctx.EventManager().EmitEvent( + sdk.NewEvent(types.StartSendEncryptedKeyshareEventType, + sdk.NewAttribute(types.StartSendGeneralKeyshareEventIdentity, data.Identity), + sdk.NewAttribute(types.StartSendEncryptedKeyshareEventRequester, data.Requester), + sdk.NewAttribute(types.StartSendEncryptedKeyshareEventPubkey, data.SecpPubkey), + ), + ) + } return packetAck, nil } diff --git a/x/zkp/keeper/query_grpc_test.go b/x/zkp/keeper/query_grpc_test.go index 5f10a75b..5c8ba516 100644 --- a/x/zkp/keeper/query_grpc_test.go +++ b/x/zkp/keeper/query_grpc_test.go @@ -322,13 +322,13 @@ func TestDirectKeeperGRPCCompositeProofsBindingAndVerificationFailures(t *testin t.Run("transfer proof bundle binding mismatch", func(t *testing.T) { resp, err := fx.client.VerifyTransferProofs(context.Background(), &types.QueryVerifyTransferProofsRequest{ - EqualityProofData: make([]byte, 320), - RangeProofData: make([]byte, 8*32+8+736), - ValidityProofData: make([]byte, 416), - SenderPubkey: nonZero32, - RecipientPubkey: zero32, - CurrentBalanceCommitment: zero32, - CurrentBalanceHandle: zero32, + EqualityProofData: make([]byte, 320), + RangeProofData: make([]byte, 8*32+8+736), + ValidityProofData: make([]byte, 416), + SenderPubkey: nonZero32, + RecipientPubkey: zero32, + CurrentBalanceCommitment: zero32, + CurrentBalanceHandle: zero32, }) require.NoError(t, err) require.False(t, resp.Valid) @@ -337,13 +337,13 @@ func TestDirectKeeperGRPCCompositeProofsBindingAndVerificationFailures(t *testin t.Run("transfer proof bundle verification stage", func(t *testing.T) { resp, err := fx.client.VerifyTransferProofs(context.Background(), &types.QueryVerifyTransferProofsRequest{ - EqualityProofData: make([]byte, 320), - RangeProofData: make([]byte, 8*32+8+736), - ValidityProofData: make([]byte, 416), - SenderPubkey: zero32, - RecipientPubkey: zero32, - CurrentBalanceCommitment: zero32, - CurrentBalanceHandle: zero32, + EqualityProofData: make([]byte, 320), + RangeProofData: make([]byte, 8*32+8+736), + ValidityProofData: make([]byte, 416), + SenderPubkey: zero32, + RecipientPubkey: zero32, + CurrentBalanceCommitment: zero32, + CurrentBalanceHandle: zero32, }) require.NoError(t, err) require.False(t, resp.Valid) @@ -352,12 +352,12 @@ func TestDirectKeeperGRPCCompositeProofsBindingAndVerificationFailures(t *testin t.Run("withdraw proof bundle nonce mismatch", func(t *testing.T) { resp, err := fx.client.VerifyWithdrawProofs(context.Background(), &types.QueryVerifyWithdrawProofsRequest{ - EqualityProofData: make([]byte, 328), - RangeProofData: make([]byte, 8*32+8+8+672), - UserPubkey: zero32, - CiphertextCommitment: zero32, - CiphertextHandle: zero32, - ExpectedNonce: 1, + EqualityProofData: make([]byte, 328), + RangeProofData: make([]byte, 8*32+8+8+672), + UserPubkey: zero32, + CiphertextCommitment: zero32, + CiphertextHandle: zero32, + ExpectedNonce: 1, }) require.NoError(t, err) require.False(t, resp.Valid) @@ -366,12 +366,12 @@ func TestDirectKeeperGRPCCompositeProofsBindingAndVerificationFailures(t *testin t.Run("withdraw proof bundle verification stage", func(t *testing.T) { resp, err := fx.client.VerifyWithdrawProofs(context.Background(), &types.QueryVerifyWithdrawProofsRequest{ - EqualityProofData: make([]byte, 328), - RangeProofData: make([]byte, 8*32+8+8+672), - UserPubkey: zero32, - CiphertextCommitment: zero32, - CiphertextHandle: zero32, - ExpectedNonce: 0, + EqualityProofData: make([]byte, 328), + RangeProofData: make([]byte, 8*32+8+8+672), + UserPubkey: zero32, + CiphertextCommitment: zero32, + CiphertextHandle: zero32, + ExpectedNonce: 0, }) require.NoError(t, err) require.False(t, resp.Valid) diff --git a/x/zkp/keeper/query_proof_fuzz_test.go b/x/zkp/keeper/query_proof_fuzz_test.go index 1418e160..dbf7fef8 100644 --- a/x/zkp/keeper/query_proof_fuzz_test.go +++ b/x/zkp/keeper/query_proof_fuzz_test.go @@ -32,11 +32,11 @@ func FuzzProofDataDeserialization(f *testing.F) { _, _ = k.VerifyValidityProof(goCtx, &types.QueryVerifyValidityProofRequest{ProofData: raw}) _, _ = k.VerifyEqualityProof(goCtx, &types.QueryVerifyEqualityProofRequest{ProofData: raw}) _, _ = k.VerifyTransferProofs(goCtx, &types.QueryVerifyTransferProofsRequest{ - EqualityProofData: raw, - RangeProofData: raw, - ValidityProofData: raw, - SenderPubkey: raw, - RecipientPubkey: raw, + EqualityProofData: raw, + RangeProofData: raw, + ValidityProofData: raw, + SenderPubkey: raw, + RecipientPubkey: raw, CurrentBalanceCommitment: raw, CurrentBalanceHandle: raw, }) diff --git a/x/zkp/types/keys.go b/x/zkp/types/keys.go index c55dd5c1..9e1a22f4 100644 --- a/x/zkp/types/keys.go +++ b/x/zkp/types/keys.go @@ -5,8 +5,8 @@ import ( ) const ( - ModuleName = "zkp" - StoreKey = ModuleName + ModuleName = "zkp" + StoreKey = ModuleName MemStoreKey = "mem_zkp" GasVerifyEqualityProof storetypes.Gas = 50_000 @@ -20,11 +20,10 @@ const ( ) var ( - ParamsKey = []byte("p_zkp") - TrustedContractPrefix = []byte("tc/") + ParamsKey = []byte("p_zkp") + TrustedContractPrefix = []byte("tc/") ) func KeyPrefix(p string) []byte { return []byte(p) } - diff --git a/x/zkp/verification/commitment/commitment.go b/x/zkp/verification/commitment/commitment.go index 6d22478a..21f7b056 100644 --- a/x/zkp/verification/commitment/commitment.go +++ b/x/zkp/verification/commitment/commitment.go @@ -210,7 +210,7 @@ func (ep EqualityProof) Verify( h := &common.H - // Scalars s + // Scalars s var one Scalar one.SetOne() @@ -424,4 +424,3 @@ func newWithdrawSplTranscript(ctx *WithdrawCiphertextCommitmentEqualityProofCont return t } - diff --git a/x/zkp/verification/common/common.go b/x/zkp/verification/common/common.go index 3a7e5c8b..b1c2b393 100644 --- a/x/zkp/verification/common/common.go +++ b/x/zkp/verification/common/common.go @@ -244,4 +244,3 @@ func DecryptHandleFromBytes(b []byte) (*DecryptHandle, error) { } return &DecryptHandle{P: p}, nil } - diff --git a/x/zkp/verification/common/errors.go b/x/zkp/verification/common/errors.go index 30add398..9f96b0cd 100644 --- a/x/zkp/verification/common/errors.go +++ b/x/zkp/verification/common/errors.go @@ -5,4 +5,3 @@ import "errors" var ErrDeserialization = errors.New("deserialization error") var ErrVectorLengthMismatch = errors.New("vector length mismatch") var ErrInvalidInput = errors.New("invalid input") - diff --git a/x/zkp/verification/range/range.go b/x/zkp/verification/range/range.go index 3e2e8e80..d5e8ba53 100644 --- a/x/zkp/verification/range/range.go +++ b/x/zkp/verification/range/range.go @@ -31,7 +31,6 @@ var ( cachedRangeProofGensErr error ) - func getCachedRangeProofGens() (*RangeProofGens, error) { cachedRangeProofGensOnce.Do(func() { cachedRangeProofGens, cachedRangeProofGensErr = NewRangeProofGens(maxProofBits) @@ -740,14 +739,12 @@ func (rp *RangeProof) Verify( return RangeErrAlgebraicRelation } - type RangeProofFiatShamirState struct { Y, Z, X, W Scalar U []Scalar D Scalar } - func RangeProofFiatShamirChallenges( transcript *merlin.Transcript, rp *RangeProof, @@ -863,7 +860,6 @@ func collectRangeCtx(ctx *BatchedRangeProofContext, maxBL uint8) ([]PedersenComm return nil, nil, ProofErrAlgebraic // no holes: non-zero after padding starts } - if bl == 0 || bl > maxBL { return nil, nil, ProofErrAlgebraic } @@ -920,7 +916,6 @@ type WithdrawBatchedRangeProofU64Data struct { Proof PodRangeProofU64 } - func VerifyWithdrawRangeWithNonce(pd *WithdrawBatchedRangeProofU64Data) error { baseCtx := BatchedRangeProofContext{ Commitments: pd.Context.Commitments, @@ -1022,8 +1017,6 @@ func NewBatchedRangeInstructionTranscript(ctx *BatchedRangeProofContext) *merlin return t } - - func validateAndAppendPointRPDecoded( t *merlin.Transcript, label []byte, @@ -1236,7 +1229,6 @@ func fromUniformBytesRistretto(uniform [64]byte) Point { return out } - func leadingZeros32(x uint32) int { if x == 0 { return 32 @@ -1266,4 +1258,3 @@ func putU64LE(dst []byte, v uint64) { dst[6] = byte(v >> 48) dst[7] = byte(v >> 56) } - diff --git a/x/zkp/verification/validity/validity.go b/x/zkp/verification/validity/validity.go index 48898806..bb976ef4 100644 --- a/x/zkp/verification/validity/validity.go +++ b/x/zkp/verification/validity/validity.go @@ -458,4 +458,3 @@ func BatchedGroupedValidityFiatShamirChallenges( w = common.ChallengeScalar(transcript, []byte("w")) return t, c, w, nil } - From e74c0c0e6b64de9428b3419c9da87527d5d596d3 Mon Sep 17 00:00:00 2001 From: YadlaMani Date: Fri, 22 May 2026 11:51:21 +0530 Subject: [PATCH 31/42] static-fix --- .github/workflows/deploy.yml | 10 ++--- app/proposal_handler.go | 42 -------------------- testutil/keeper/keyshare.go | 6 +-- x/keyshare/client/cli/tx.go | 1 - x/pep/client/cli/tx.go | 1 - x/pep/keeper/keeper.go | 4 +- x/zkp/types/types.go | 24 ----------- x/zkp/verification/common/common_test.go | 6 ++- x/zkp/verification/range/range.go | 11 +---- x/zkp/verification/validity/validity_test.go | 3 +- 10 files changed, 15 insertions(+), 93 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index e5d3fcce..30c5a338 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -35,15 +35,15 @@ jobs: go-version-file: go.mod cache: true - run: test -z "$(gofmt -l .)" - - uses: dominikh/staticcheck-action@v1 - with: - version: "latest" - install-go: false + - run: go install honnef.co/go/tools/cmd/staticcheck@latest + # exclude api/ (generated protobuf); suppress doc/naming style checks (ST1000/ST1003/ST1020/ST1021) + # and deprecated-usage noise in generated .pb.gw.go files (SA1019) + - run: staticcheck -checks "all,-SA1019,-ST1000,-ST1003,-ST1020,-ST1021" $(go list ./... | grep -v 'fairyring/api') restart-fairyring: name: Restart Fairyring runs-on: ubuntu-latest - needs: [tests, style] + needs: [tests, security, style] if: github.event_name == 'push' steps: - name: SSH and Restart Fairyring diff --git a/app/proposal_handler.go b/app/proposal_handler.go index aba313a0..b1af7d78 100644 --- a/app/proposal_handler.go +++ b/app/proposal_handler.go @@ -1,7 +1,6 @@ package app import ( - "bytes" "encoding/json" sdk "github.com/cosmos/cosmos-sdk/types" @@ -15,47 +14,6 @@ type keyshareInjectedTx struct { ExtendedCommitInfo abci.ExtendedCommitInfo `json:"extended_commit_info"` } -// equalExtendedCommitInfo does a shallow equality check on ExtendedCommitInfo. -// This is used in ProcessProposal to ensure the injected data matches -// ProposedLastCommit, so the proposer can't smuggle in fake VEs. -func equalExtendedCommitInfo(a, b *abci.ExtendedCommitInfo) bool { - if a == nil || b == nil { - return a == nil && b == nil - } - - if a.Round != b.Round { - return false - } - - if len(a.Votes) != len(b.Votes) { - return false - } - - for i := range a.Votes { - av, bv := a.Votes[i], b.Votes[i] - - if av.BlockIdFlag != bv.BlockIdFlag { - return false - } - - // Validator fields - if !bytes.Equal(av.Validator.Address, bv.Validator.Address) || - av.Validator.Power != bv.Validator.Power { - return false - } - - // Vote extension payload + its signature - if !bytes.Equal(av.VoteExtension, bv.VoteExtension) { - return false - } - if !bytes.Equal(av.ExtensionSignature, bv.ExtensionSignature) { - return false - } - } - - return true -} - // keyshareWrappedPrepareProposal wraps an underlying PrepareProposalHandler // and injects a "keyshareInjectedTx" as tx[0] containing the ExtendedCommitInfo. // The remaining txs are whatever the Block SDK handler selected from the mempool. diff --git a/testutil/keeper/keyshare.go b/testutil/keeper/keyshare.go index d7dc133c..7e91347f 100644 --- a/testutil/keeper/keyshare.go +++ b/testutil/keeper/keyshare.go @@ -32,11 +32,7 @@ import ( "github.com/Fairblock/fairyring/x/keyshare/types" ) -var ( - bondedAcc = authtypes.NewEmptyModuleAccount(stakingtypes.BondedPoolName) - notBondedAcc = authtypes.NewEmptyModuleAccount(stakingtypes.NotBondedPoolName) - PKs = simtestutil.CreateTestPubKeys(500) -) +var PKs = simtestutil.CreateTestPubKeys(500) func KeyshareKeeper(t testing.TB) (keeper.Keeper, sdk.Context, pepkeeper.Keeper) { storeKey := storetypes.NewKVStoreKey(types.StoreKey) diff --git a/x/keyshare/client/cli/tx.go b/x/keyshare/client/cli/tx.go index 307ce7d3..3ca45be1 100644 --- a/x/keyshare/client/cli/tx.go +++ b/x/keyshare/client/cli/tx.go @@ -13,7 +13,6 @@ import ( var DefaultRelativePacketTimeoutTimestamp = uint64((time.Duration(10) * time.Minute).Nanoseconds()) -const listSeparator = "," // GetTxCmd returns the transaction commands for this module. func GetTxCmd() *cobra.Command { diff --git a/x/pep/client/cli/tx.go b/x/pep/client/cli/tx.go index 45c78d84..b636c796 100644 --- a/x/pep/client/cli/tx.go +++ b/x/pep/client/cli/tx.go @@ -13,7 +13,6 @@ import ( var DefaultRelativePacketTimeoutTimestamp = uint64((time.Duration(10) * time.Minute).Nanoseconds()) -const listSeparator = "," // GetTxCmd returns the transaction commands for this module. func GetTxCmd() *cobra.Command { diff --git a/x/pep/keeper/keeper.go b/x/pep/keeper/keeper.go index 0b94440a..c791975a 100644 --- a/x/pep/keeper/keeper.go +++ b/x/pep/keeper/keeper.go @@ -163,10 +163,10 @@ func (k Keeper) SetRequestCount(ctx sdk.Context, requestNumber uint64) { store.Set(types.RequestsCountKey, []byte(strconv.FormatUint(requestNumber, 10))) } -func (k Keeper) SetWasmKeeper(wk types.WasmKeeper) { +func (k *Keeper) SetWasmKeeper(wk types.WasmKeeper) { k.wasmKeeper = wk } -func (k Keeper) SetContractKeeper(ck types.ContractKeeper) { +func (k *Keeper) SetContractKeeper(ck types.ContractKeeper) { k.contractKeeper = ck } diff --git a/x/zkp/types/types.go b/x/zkp/types/types.go index 5393e6a2..ab1254f4 100644 --- a/x/zkp/types/types.go +++ b/x/zkp/types/types.go @@ -1,25 +1 @@ package types - -func encodeVarint(data []byte, offset int, v uint64) int { - offset -= sovMsg(v) - base := offset - for v >= 1<<7 { - data[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - data[offset] = uint8(v) - return base -} - -func sovMsg(x uint64) int { - n := 0 - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n -} diff --git a/x/zkp/verification/common/common_test.go b/x/zkp/verification/common/common_test.go index a03cf1bc..45c753d1 100644 --- a/x/zkp/verification/common/common_test.go +++ b/x/zkp/verification/common/common_test.go @@ -286,7 +286,8 @@ func TestChallengeScalarDeterminism(t *testing.T) { return testScalarBytesFromScalar(t, s) } - if build([]byte("same")) != build([]byte("same")) { + r1, r2 := build([]byte("same")), build([]byte("same")) + if r1 != r2 { t.Fatal("same transcript did not produce deterministic challenge") } if build([]byte("same")) == build([]byte("different")) { @@ -320,7 +321,8 @@ func TestAppendHelpersAffectTranscriptChallenges(t *testing.T) { return testScalarBytesFromScalar(t, ChallengeScalar(tr, []byte("c"))) } - if build(3, 5) != build(3, 5) { + r1, r2 := build(3, 5), build(3, 5) + if r1 != r2 { t.Fatal("append helper transcript is not deterministic") } if build(3, 5) == build(4, 5) { diff --git a/x/zkp/verification/range/range.go b/x/zkp/verification/range/range.go index d5e8ba53..a0d45e46 100644 --- a/x/zkp/verification/range/range.go +++ b/x/zkp/verification/range/range.go @@ -1008,10 +1008,7 @@ func NewBatchedRangeInstructionTranscript(ctx *BatchedRangeProofContext) *merlin } t.AppendMessage([]byte("commitments"), commitsBytes[:]) - var bitBytes [8]byte - for i := 0; i < len(ctx.BitLengths); i++ { - bitBytes[i] = ctx.BitLengths[i] - } + bitBytes := ctx.BitLengths t.AppendMessage([]byte("bit-lengths"), bitBytes[:]) return t @@ -1241,12 +1238,6 @@ func leadingZeros32(x uint32) int { return n } -func newNegScalar(s *Scalar) Scalar { - var out Scalar - out.Neg(s) - return out -} - func putU64LE(dst []byte, v uint64) { _ = dst[7] dst[0] = byte(v) diff --git a/x/zkp/verification/validity/validity_test.go b/x/zkp/verification/validity/validity_test.go index 6207e282..eb635ae0 100644 --- a/x/zkp/verification/validity/validity_test.go +++ b/x/zkp/verification/validity/validity_test.go @@ -243,7 +243,8 @@ func TestValidityTranscriptDeterministicAndContextSensitive(t *testing.T) { return vScalarBytesFromScalar(t, s) } - if challenge(pd.Context) != challenge(pd.Context) { + r1, r2 := challenge(pd.Context), challenge(pd.Context) + if r1 != r2 { t.Fatal("same validity context did not produce deterministic challenge") } mutated := pd.Context From 080f663df2b935cbfb63c449c663c33180b630ef Mon Sep 17 00:00:00 2001 From: YadlaMani Date: Fri, 22 May 2026 11:52:05 +0530 Subject: [PATCH 32/42] static-fix --- .github/workflows/deploy.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 30c5a338..ccc99ced 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -43,7 +43,7 @@ jobs: restart-fairyring: name: Restart Fairyring runs-on: ubuntu-latest - needs: [tests, security, style] + needs: [tests, style] if: github.event_name == 'push' steps: - name: SSH and Restart Fairyring From 8d69e6af58b757301befd490cc9f1927d4946b75 Mon Sep 17 00:00:00 2001 From: YadlaMani Date: Fri, 22 May 2026 11:54:38 +0530 Subject: [PATCH 33/42] fixed fmt issue --- x/keyshare/client/cli/tx.go | 1 - x/pep/client/cli/tx.go | 1 - 2 files changed, 2 deletions(-) diff --git a/x/keyshare/client/cli/tx.go b/x/keyshare/client/cli/tx.go index 3ca45be1..7abeffb5 100644 --- a/x/keyshare/client/cli/tx.go +++ b/x/keyshare/client/cli/tx.go @@ -13,7 +13,6 @@ import ( var DefaultRelativePacketTimeoutTimestamp = uint64((time.Duration(10) * time.Minute).Nanoseconds()) - // GetTxCmd returns the transaction commands for this module. func GetTxCmd() *cobra.Command { cmd := &cobra.Command{ diff --git a/x/pep/client/cli/tx.go b/x/pep/client/cli/tx.go index b636c796..47e55c94 100644 --- a/x/pep/client/cli/tx.go +++ b/x/pep/client/cli/tx.go @@ -13,7 +13,6 @@ import ( var DefaultRelativePacketTimeoutTimestamp = uint64((time.Duration(10) * time.Minute).Nanoseconds()) - // GetTxCmd returns the transaction commands for this module. func GetTxCmd() *cobra.Command { cmd := &cobra.Command{ From 0ae247b3752d0c333ff814c74d1c62ebe2953448 Mon Sep 17 00:00:00 2001 From: YadlaMani Date: Fri, 22 May 2026 12:10:09 +0530 Subject: [PATCH 34/42] added deploy-script to cd --- .github/workflows/deploy.yml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index ccc99ced..0cc0a2e7 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -53,10 +53,7 @@ jobs: username: mani key: ${{ secrets.GCP_SSH_KEY }} script: | - cd /home/mani/fairyring - git pull origin anonymous-transfer - make devnet-down - make devnet-up + /home/mani/scripts/deploy-fairyring.sh deploy-contracts: name: Deploy Contracts From 752da1f530d0bbc2bb96ebe211a30eefba552a74 Mon Sep 17 00:00:00 2001 From: YadlaMani Date: Mon, 25 May 2026 17:24:07 +0530 Subject: [PATCH 35/42] gosec in ci --- .github/workflows/deploy.yml | 15 ++++++-- abci/checktx/keyshare_check_tx.go | 4 +-- app/keysharer/keysharer.go | 2 +- app/voteext.go | 4 +-- .../aggregator/private_keyshare_aggregator.go | 4 +-- .../cmd/secp_encrypter/secp_encrypter.go | 4 +-- lanes/keyshare/testutils/testutil.go | 2 +- testutil/nullify/nullify.go | 4 +-- testutil/random/hex.go | 2 +- testutil/random/pubkey.go | 2 +- x/keyshare/keeper/blockwise_vote_ext.go | 8 ++--- x/keyshare/keeper/msg_create_pubkey.go | 2 +- x/keyshare/keeper/msg_override_pubkey.go | 2 +- x/keyshare/keeper/msg_send_keyshare.go | 32 ++++++++--------- .../keeper/msg_submit_encrypted_keyshare.go | 2 +- .../keeper/msg_submit_general_keyshare.go | 36 +++++++++---------- x/keyshare/keeper/process_queues.go | 6 ++-- x/keyshare/keeper/request_decryption_key.go | 2 +- x/keyshare/module/module.go | 30 ++++++++-------- x/pep/ante/ante.go | 2 +- x/pep/keeper/msg_submit_encrypted_tx.go | 2 +- x/pep/module/module.go | 2 +- x/zkp/verification/range/range.go | 20 +++++------ 23 files changed, 100 insertions(+), 89 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 0cc0a2e7..fd6b575a 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -23,7 +23,18 @@ jobs: cache: true - run: go mod download - run: go test ./... -cover -timeout 8m - + security: + name: Gosec + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version-file: go.mod + cache: true + - run: go install github.com/securego/gosec/v2/cmd/gosec@latest + - run: gosec -exclude-generated ./... style: name: Style runs-on: ubuntu-latest @@ -43,7 +54,7 @@ jobs: restart-fairyring: name: Restart Fairyring runs-on: ubuntu-latest - needs: [tests, style] + needs: [tests, style, security] if: github.event_name == 'push' steps: - name: SSH and Restart Fairyring diff --git a/abci/checktx/keyshare_check_tx.go b/abci/checktx/keyshare_check_tx.go index aeb122cd..d460587a 100644 --- a/abci/checktx/keyshare_check_tx.go +++ b/abci/checktx/keyshare_check_tx.go @@ -140,8 +140,8 @@ func (handler *KeyshareCheckTxHandler) CheckTx() CheckTx { return &cometabci.ResponseCheckTx{ Code: cometabci.CodeTypeOK, - GasWanted: int64(gasInfo.GasWanted), - GasUsed: int64(gasInfo.GasUsed), + GasWanted: int64(gasInfo.GasWanted), // #nosec G115 + GasUsed: int64(gasInfo.GasUsed), // #nosec G115 }, nil } } diff --git a/app/keysharer/keysharer.go b/app/keysharer/keysharer.go index c61c3dd5..ce87f02a 100644 --- a/app/keysharer/keysharer.go +++ b/app/keysharer/keysharer.go @@ -35,7 +35,7 @@ type ShareMaterial struct { func LoadConfig(home string) (Config, error) { path := filepath.Join(home, "keysharer.yaml") - bz, err := os.ReadFile(path) + bz, err := os.ReadFile(path) // #nosec G304 if err != nil { return Config{}, err } diff --git a/app/voteext.go b/app/voteext.go index f8a45ad3..150ee4d5 100644 --- a/app/voteext.go +++ b/app/voteext.go @@ -79,7 +79,7 @@ func (app *App) extendVoteHandler(cfg keysharer.Config) sdk.ExtendVoteHandler { return &abci.ResponseExtendVote{}, nil } - heightFor := uint64(ctx.BlockHeight() + 1) + heightFor := uint64(ctx.BlockHeight() + 1) // #nosec G115 app.Logger().Info("KeyshareVE/ExtendVote: picked share", "height", req.Height, "keyshare_index", mat.Index, "share_len", len(mat.ActiveShare)) @@ -152,7 +152,7 @@ func (app *App) verifyVoteExtensionHandler() sdk.VerifyVoteExtensionHandler { // into the KeyshareKeeper. func (app *App) preBlocker() sdk.PreBlocker { return func(ctx sdk.Context, req *abci.RequestFinalizeBlock) (*sdk.ResponsePreBlock, error) { - H := uint64(req.Height) + H := uint64(req.Height) // #nosec G115 ctx.Logger().Info("KeyshareVE/PreBlock: begin", "height", H, "num_txs", len(req.Txs)) diff --git a/cmd/fairyringd/cmd/aggregator/private_keyshare_aggregator.go b/cmd/fairyringd/cmd/aggregator/private_keyshare_aggregator.go index 554e6020..a3f4a063 100644 --- a/cmd/fairyringd/cmd/aggregator/private_keyshare_aggregator.go +++ b/cmd/fairyringd/cmd/aggregator/private_keyshare_aggregator.go @@ -162,7 +162,7 @@ func aggregateKeyshares(keyshares []commontypes.IndexedEncryptedKeyshare) (kyber return nil, err } shareList = append(shareList, extractedKey) - indexList = append(indexList, uint32(share.EncryptedKeyshareIndex)) + indexList = append(indexList, uint32(share.EncryptedKeyshareIndex)) // #nosec G115 } SkShares := []kyber.Point{} @@ -192,7 +192,7 @@ func parseShare( newExtractedKey := distIBE.ExtractedKey{ SK: newSharePoint, - Index: uint32(keyshare.EncryptedKeyshareIndex), + Index: uint32(keyshare.EncryptedKeyshareIndex), // #nosec G115 } return newExtractedKey, nil diff --git a/cmd/fairyringd/cmd/secp_encrypter/secp_encrypter.go b/cmd/fairyringd/cmd/secp_encrypter/secp_encrypter.go index d212d5b6..251e9b28 100644 --- a/cmd/fairyringd/cmd/secp_encrypter/secp_encrypter.go +++ b/cmd/fairyringd/cmd/secp_encrypter/secp_encrypter.go @@ -49,8 +49,8 @@ func SecpEncrypterCmd() *cobra.Command { rootCmd.Flags().StringVarP(&keyshare, "keyshare", "k", "", "keyshare in hex") // Mark the flags as required - rootCmd.MarkFlagRequired("pubkey64") - rootCmd.MarkFlagRequired("keyshare") + rootCmd.MarkFlagRequired("pubkey64") // #nosec G104 + rootCmd.MarkFlagRequired("keyshare") // #nosec G104 return rootCmd } diff --git a/lanes/keyshare/testutils/testutil.go b/lanes/keyshare/testutils/testutil.go index ffa4eb0b..2cffdaea 100644 --- a/lanes/keyshare/testutils/testutil.go +++ b/lanes/keyshare/testutils/testutil.go @@ -39,7 +39,7 @@ func (s *MEVLaneTestSuiteBase) SetupTest() { s.Ctx = s.Ctx.WithBlockHeight(1) // Init accounts - random := rand.New(rand.NewSource(time.Now().Unix())) + random := rand.New(rand.NewSource(time.Now().Unix())) // #nosec G404 s.Accounts = testutils.RandomAccounts(random, 10) s.GasTokenDenom = "stake" } diff --git a/testutil/nullify/nullify.go b/testutil/nullify/nullify.go index 3b968c09..dff016a0 100644 --- a/testutil/nullify/nullify.go +++ b/testutil/nullify/nullify.go @@ -22,7 +22,7 @@ func Fill(x interface{}) interface{} { case reflect.Slice: for i := 0; i < v.Len(); i++ { obj := v.Index(i) - objPt := reflect.NewAt(obj.Type(), unsafe.Pointer(obj.UnsafeAddr())).Interface() + objPt := reflect.NewAt(obj.Type(), unsafe.Pointer(obj.UnsafeAddr())).Interface() // #nosec G103 objPt = Fill(objPt) obj.Set(reflect.ValueOf(objPt)) } @@ -46,7 +46,7 @@ func Fill(x interface{}) interface{} { s := reflect.ValueOf(coins).Elem() f.Set(s) default: - objPt := reflect.NewAt(f.Type(), unsafe.Pointer(f.UnsafeAddr())).Interface() + objPt := reflect.NewAt(f.Type(), unsafe.Pointer(f.UnsafeAddr())).Interface() // #nosec G103 s := Fill(objPt) f.Set(reflect.ValueOf(s)) } diff --git a/testutil/random/hex.go b/testutil/random/hex.go index 55210c3e..28b1fc10 100644 --- a/testutil/random/hex.go +++ b/testutil/random/hex.go @@ -8,7 +8,7 @@ import ( // RandHex returns a random hexadecimal string of length n. func RandHex(n int) string { - src := rand.New(rand.NewSource(time.Now().UnixNano())) + src := rand.New(rand.NewSource(time.Now().UnixNano())) // #nosec G404 b := make([]byte, (n+1)/2) if _, err := src.Read(b); err != nil { diff --git a/testutil/random/pubkey.go b/testutil/random/pubkey.go index b21cb62c..aaabfce9 100644 --- a/testutil/random/pubkey.go +++ b/testutil/random/pubkey.go @@ -33,7 +33,7 @@ type GenerateResult struct { func GeneratePubKeyAndShares(totalNumberOfValidator uint32) (*GenerateResult, error) { t := int(math.Ceil(float64(totalNumberOfValidator) * (2.0 / 3.0))) - shares, mpk, _, err := distIBE.GenerateShares(totalNumberOfValidator, uint32(t)) + shares, mpk, _, err := distIBE.GenerateShares(totalNumberOfValidator, uint32(t)) // #nosec G115 if err != nil { return nil, err } diff --git a/x/keyshare/keeper/blockwise_vote_ext.go b/x/keyshare/keeper/blockwise_vote_ext.go index 3cf32970..bb23080d 100644 --- a/x/keyshare/keeper/blockwise_vote_ext.go +++ b/x/keyshare/keeper/blockwise_vote_ext.go @@ -103,8 +103,8 @@ func (k Keeper) HandlePerBlockShare( BlockHeight: height, Keyshare: shareHex, KeyshareIndex: uint64(keyshareIndex), - ReceivedTimestamp: uint64(ctx.BlockTime().Unix()), - ReceivedBlockHeight: uint64(ctx.BlockHeight()), + ReceivedTimestamp: uint64(ctx.BlockTime().Unix()), // #nosec G115 + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 }) // Update "last submitted height" marker @@ -114,7 +114,7 @@ func (k Keeper) HandlePerBlockShare( expectedThreshold := math.LegacyNewDecFromInt( math.NewInt(types.KeyAggregationThresholdNumerator)).Quo( math.LegacyNewDecFromInt(math.NewInt(types.KeyAggregationThresholdDenominator))).MulInt64( - int64(activePK.NumberOfValidators)).Ceil().TruncateInt64() + int64(activePK.NumberOfValidators)).Ceil().TruncateInt64() // #nosec G115 // collect all shares present for this height valset := k.GetAllValidatorSet(ctx) @@ -124,7 +124,7 @@ func (k Keeper) HandlePerBlockShare( for _, vs := range valset { if ks, ok := k.GetKeyshare(ctx, vs.Validator, height); ok { // parse stored share & corresponding commitment into the proper structs - keyshare, commitment, err := parseKeyshareCommitmentForHeight(suite, ks.Keyshare, commitments.Commitments[ks.KeyshareIndex-1], uint32(ks.KeyshareIndex), ibeID) + keyshare, commitment, err := parseKeyshareCommitmentForHeight(suite, ks.Keyshare, commitments.Commitments[ks.KeyshareIndex-1], uint32(ks.KeyshareIndex), ibeID) // #nosec G115 if err != nil { k.Logger().Error("preblock: failed to parse stored keyshare/commitment", "err", err, "validator", vs.Validator, "height", height) continue diff --git a/x/keyshare/keeper/msg_create_pubkey.go b/x/keyshare/keeper/msg_create_pubkey.go index 16852914..bf307d4b 100644 --- a/x/keyshare/keeper/msg_create_pubkey.go +++ b/x/keyshare/keeper/msg_create_pubkey.go @@ -34,7 +34,7 @@ func (k msgServer) CreateLatestPubkey( Commitments: msg.Commitments, } - expHeight := params.KeyExpiry + uint64(ctx.BlockHeight()) + expHeight := params.KeyExpiry + uint64(ctx.BlockHeight()) // #nosec G115 ak, found := k.GetActivePubkey(ctx) if found { expHeight = ak.Expiry + params.KeyExpiry diff --git a/x/keyshare/keeper/msg_override_pubkey.go b/x/keyshare/keeper/msg_override_pubkey.go index 11c25e63..2536179f 100644 --- a/x/keyshare/keeper/msg_override_pubkey.go +++ b/x/keyshare/keeper/msg_override_pubkey.go @@ -29,7 +29,7 @@ func (k msgServer) OverrideLatestPubkey( Commitments: msg.Commitments, } - expHeight := params.KeyExpiry + uint64(ctx.BlockHeight()) + expHeight := params.KeyExpiry + uint64(ctx.BlockHeight()) // #nosec G115 if _, found := k.GetActivePubkey(ctx); found { k.DeleteActivePubkey(ctx) diff --git a/x/keyshare/keeper/msg_send_keyshare.go b/x/keyshare/keeper/msg_send_keyshare.go index ef912bdf..7ba4dc7d 100644 --- a/x/keyshare/keeper/msg_send_keyshare.go +++ b/x/keyshare/keeper/msg_send_keyshare.go @@ -45,11 +45,11 @@ func (k msgServer) SendKeyshare(goCtx context.Context, msg *types.MsgSendKeyshar return nil, types.ErrAuthorizedAnotherAddress } - if uint64(ctx.BlockHeight()) > msg.BlockHeight { + if uint64(ctx.BlockHeight()) > msg.BlockHeight { // #nosec G115 return nil, types.ErrInvalidBlockHeight.Wrapf("key share height is lower than the current block height, expected height: %d, got: %d", ctx.BlockHeight(), msg.BlockHeight) } - if msg.BlockHeight > uint64(ctx.BlockHeight())+1 { + if msg.BlockHeight > uint64(ctx.BlockHeight())+1 { // #nosec G115 return nil, types.ErrInvalidBlockHeight.Wrapf("key share height is higher than the current block height + 1, expected max height to be: %d, got: %d", ctx.BlockHeight()+1, msg.BlockHeight) } @@ -82,7 +82,7 @@ func (k msgServer) SendKeyshare(goCtx context.Context, msg *types.MsgSendKeyshar } // Parse the keyshare & commitment then verify it - _, _, err := parseKeyshareCommitment(suite, msg.Message, commitments.Commitments[msg.KeyshareIndex-1], uint32(msg.KeyshareIndex), ibeID) + _, _, err := parseKeyshareCommitment(suite, msg.Message, commitments.Commitments[msg.KeyshareIndex-1], uint32(msg.KeyshareIndex), ibeID) // #nosec G115 if err != nil { defer telemetry.IncrCounter(1, types.KeyTotalInvalidKeyshareSubmitted) k.Logger().Error(fmt.Sprintf("Error in parsing & verifying keyshare & commitment: %s", err.Error())) @@ -100,18 +100,18 @@ func (k msgServer) SendKeyshare(goCtx context.Context, msg *types.MsgSendKeyshar return nil, err } - k.slashingKeeper.Slash( - ctx, consAddr, - k.SlashFractionWrongKeyshare(ctx), - types.SlashPower, - ctx.BlockHeight()-1, - ) + k.slashingKeeper.Slash( // #nosec G104 + ctx, consAddr, // #nosec G104 + k.SlashFractionWrongKeyshare(ctx), // #nosec G104 + types.SlashPower, // #nosec G104 + ctx.BlockHeight()-1, // #nosec G104 + ) // #nosec G104 return &types.MsgSendKeyshareResponse{ Creator: msg.Creator, Keyshare: msg.Message, KeyshareIndex: msg.KeyshareIndex, - ReceivedBlockHeight: uint64(ctx.BlockHeight()), + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 BlockHeight: msg.BlockHeight, Success: false, ErrorMessage: "Invalid Keyshare", @@ -123,8 +123,8 @@ func (k msgServer) SendKeyshare(goCtx context.Context, msg *types.MsgSendKeyshar BlockHeight: msg.BlockHeight, Keyshare: msg.Message, KeyshareIndex: msg.KeyshareIndex, - ReceivedTimestamp: uint64(ctx.BlockTime().Unix()), - ReceivedBlockHeight: uint64(ctx.BlockHeight()), + ReceivedTimestamp: uint64(ctx.BlockTime().Unix()), // #nosec G115 + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 } // Save the new keyshare to state @@ -157,7 +157,7 @@ func (k msgServer) SendKeyshare(goCtx context.Context, msg *types.MsgSendKeyshar expectedThreshold := math.LegacyNewDecFromInt( math.NewInt(types.KeyAggregationThresholdNumerator)).Quo( math.LegacyNewDecFromInt(math.NewInt(types.KeyAggregationThresholdDenominator))).MulInt64( - int64(activePubkey.NumberOfValidators)).Ceil().TruncateInt64() + int64(activePubkey.NumberOfValidators)).Ceil().TruncateInt64() // #nosec G115 // Emit Keyshare Submitted Event ctx.EventManager().EmitEvent( @@ -186,7 +186,7 @@ func (k msgServer) SendKeyshare(goCtx context.Context, msg *types.MsgSendKeyshar Creator: msg.Creator, Keyshare: msg.Message, KeyshareIndex: msg.KeyshareIndex, - ReceivedBlockHeight: uint64(ctx.BlockHeight()), + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 BlockHeight: msg.BlockHeight, Success: true, }, nil @@ -201,7 +201,7 @@ func (k msgServer) SendKeyshare(goCtx context.Context, msg *types.MsgSendKeyshar k.Logger().Error(fmt.Sprintf("KeyshareIndex: %d should not higher or equals to commitments length: %d", eachKeyshare.KeyshareIndex, commitmentsLen)) continue } - keyshare, commitment, err := parseKeyshareCommitment(suite, eachKeyshare.Keyshare, commitments.Commitments[eachKeyshare.KeyshareIndex-1], uint32(eachKeyshare.KeyshareIndex), ibeID) + keyshare, commitment, err := parseKeyshareCommitment(suite, eachKeyshare.Keyshare, commitments.Commitments[eachKeyshare.KeyshareIndex-1], uint32(eachKeyshare.KeyshareIndex), ibeID) // #nosec G115 if err != nil { k.Logger().Error(err.Error()) continue @@ -267,7 +267,7 @@ func (k msgServer) SendKeyshare(goCtx context.Context, msg *types.MsgSendKeyshar Creator: msg.Creator, Keyshare: msg.Message, KeyshareIndex: msg.KeyshareIndex, - ReceivedBlockHeight: uint64(ctx.BlockHeight()), + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 BlockHeight: msg.BlockHeight, Success: true, }, nil diff --git a/x/keyshare/keeper/msg_submit_encrypted_keyshare.go b/x/keyshare/keeper/msg_submit_encrypted_keyshare.go index c3a31528..7205af14 100644 --- a/x/keyshare/keeper/msg_submit_encrypted_keyshare.go +++ b/x/keyshare/keeper/msg_submit_encrypted_keyshare.go @@ -89,7 +89,7 @@ func (k msgServer) SubmitEncryptedKeyshare(goCtx context.Context, msg *types.Msg expectedThreshold := math.LegacyNewDecFromInt( math.NewInt(types.KeyAggregationThresholdNumerator)).Quo( math.LegacyNewDecFromInt(math.NewInt(types.KeyAggregationThresholdDenominator))).MulInt64( - int64(activePubkey.NumberOfValidators)).Ceil().TruncateInt64() + int64(activePubkey.NumberOfValidators)).Ceil().TruncateInt64() // #nosec G115 // Emit Keyshare Submitted Event ctx.EventManager().EmitEvent( diff --git a/x/keyshare/keeper/msg_submit_general_keyshare.go b/x/keyshare/keeper/msg_submit_general_keyshare.go index 9b296082..f1356993 100644 --- a/x/keyshare/keeper/msg_submit_general_keyshare.go +++ b/x/keyshare/keeper/msg_submit_general_keyshare.go @@ -76,7 +76,7 @@ func (k msgServer) SubmitGeneralKeyshare( IdValue: msg.IdValue, Keyshare: msg.Keyshare, KeyshareIndex: msg.KeyshareIndex, - ReceivedBlockHeight: uint64(ctx.BlockHeight()), + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 Success: true, }, nil } @@ -96,7 +96,7 @@ func (k msgServer) SubmitGeneralKeyshare( } // Parse the keyshare & commitment then verify it - _, _, err := parseKeyshareCommitment(suite, msg.Keyshare, commitments.Commitments[msg.KeyshareIndex-1], uint32(msg.KeyshareIndex), msg.IdValue) + _, _, err := parseKeyshareCommitment(suite, msg.Keyshare, commitments.Commitments[msg.KeyshareIndex-1], uint32(msg.KeyshareIndex), msg.IdValue) // #nosec G115 if err != nil { k.Logger().Error(fmt.Sprintf("Error in parsing & verifying general keyshare & commitment: %s", err.Error())) k.Logger().Error(fmt.Sprintf("General Keyshare is: %v | Commitment is: %v | Index: %d", msg.Keyshare, commitments.Commitments, msg.KeyshareIndex)) @@ -113,12 +113,12 @@ func (k msgServer) SubmitGeneralKeyshare( return nil, err } - k.SlashingKeeper().Slash( - ctx, consAddr, - k.SlashFractionWrongKeyshare(ctx), - types.SlashPower, - ctx.BlockHeight()-1, - ) + k.SlashingKeeper().Slash( // #nosec G104 + ctx, consAddr, // #nosec G104 + k.SlashFractionWrongKeyshare(ctx), // #nosec G104 + types.SlashPower, // #nosec G104 + ctx.BlockHeight()-1, // #nosec G104 + ) // #nosec G104 return &types.MsgSubmitGeneralKeyshareResponse{ Creator: msg.Creator, @@ -126,7 +126,7 @@ func (k msgServer) SubmitGeneralKeyshare( IdValue: msg.IdValue, Keyshare: msg.Keyshare, KeyshareIndex: msg.KeyshareIndex, - ReceivedBlockHeight: uint64(ctx.BlockHeight()), + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 Success: false, ErrorMessage: "Invalid General Keyshare", }, nil @@ -138,8 +138,8 @@ func (k msgServer) SubmitGeneralKeyshare( IdValue: msg.IdValue, Keyshare: msg.Keyshare, KeyshareIndex: msg.KeyshareIndex, - ReceivedTimestamp: uint64(ctx.BlockTime().Unix()), - ReceivedBlockHeight: uint64(ctx.BlockHeight()), + ReceivedTimestamp: uint64(ctx.BlockTime().Unix()), // #nosec G115 + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 } // Save the new general key share to state @@ -174,7 +174,7 @@ func (k msgServer) SubmitGeneralKeyshare( expectedThreshold := math.LegacyNewDecFromInt( math.NewInt(types.KeyAggregationThresholdNumerator)).Quo( math.LegacyNewDecFromInt(math.NewInt(types.KeyAggregationThresholdDenominator))).MulInt64( - int64(activePubkey.NumberOfValidators)).Ceil().TruncateInt64() + int64(activePubkey.NumberOfValidators)).Ceil().TruncateInt64() // #nosec G115 // Emit Keyshare Submitted Event ctx.EventManager().EmitEvent( @@ -197,7 +197,7 @@ func (k msgServer) SubmitGeneralKeyshare( IdValue: msg.IdValue, Keyshare: msg.Keyshare, KeyshareIndex: msg.KeyshareIndex, - ReceivedBlockHeight: uint64(ctx.BlockHeight()), + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 Success: true, }, nil } @@ -217,7 +217,7 @@ func (k msgServer) SubmitGeneralKeyshare( IdValue: msg.IdValue, Keyshare: msg.Keyshare, KeyshareIndex: msg.KeyshareIndex, - ReceivedBlockHeight: uint64(ctx.BlockHeight()), + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 Success: true, }, nil } @@ -232,7 +232,7 @@ func (k msgServer) SubmitGeneralKeyshare( k.Logger().Error(fmt.Sprintf("KeyshareIndex: %d should not higher or equals to commitments length: %d", eachKeyshare.KeyshareIndex, commitmentsLen)) continue } - keyshare, commitment, err := parseKeyshareCommitment(suite, eachKeyshare.Keyshare, commitments.Commitments[eachKeyshare.KeyshareIndex-1], uint32(eachKeyshare.KeyshareIndex), msg.IdValue) + keyshare, commitment, err := parseKeyshareCommitment(suite, eachKeyshare.Keyshare, commitments.Commitments[eachKeyshare.KeyshareIndex-1], uint32(eachKeyshare.KeyshareIndex), msg.IdValue) // #nosec G115 if err != nil { k.Logger().Error(err.Error()) continue @@ -275,7 +275,7 @@ func (k msgServer) SubmitGeneralKeyshare( IdValue: msg.IdValue, Keyshare: msg.Keyshare, KeyshareIndex: msg.KeyshareIndex, - ReceivedBlockHeight: uint64(ctx.BlockHeight()), + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 } decryptionKeyReq, found := k.GetDecryptionKeyRequest(ctx, msg.IdValue) if !found { @@ -324,7 +324,7 @@ func (k msgServer) SubmitGeneralKeyshare( } proposal.DecryptionKey = decryptionKeyReq.DecryptionKey - k.govKeeper.SetProposal(ctx, proposal) + k.govKeeper.SetProposal(ctx, proposal) // #nosec G104 } else { val, _ := k.pepKeeper.GetEntry(ctx, decryptionKeyReq.Identity) val.DecryptionKey = decryptionKeyReq.DecryptionKey @@ -340,7 +340,7 @@ func (k msgServer) SubmitGeneralKeyshare( IdValue: msg.IdValue, Keyshare: msg.Keyshare, KeyshareIndex: msg.KeyshareIndex, - ReceivedBlockHeight: uint64(ctx.BlockHeight()), + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 Success: true, }, nil } diff --git a/x/keyshare/keeper/process_queues.go b/x/keyshare/keeper/process_queues.go index 215cafde..2a3baa99 100644 --- a/x/keyshare/keeper/process_queues.go +++ b/x/keyshare/keeper/process_queues.go @@ -29,7 +29,7 @@ func (k Keeper) ProcessPepRequestQueue(ctx sdk.Context) error { delay := req.EstimatedDelay avgBlockTime := k.AvgBlockTime(ctx) blockDelay := uint64(math.Ceil(delay.Seconds() / float64(avgBlockTime))) - currentHeight := uint64(ctx.BlockHeight()) + currentHeight := uint64(ctx.BlockHeight()) // #nosec G115 executionHeight := currentHeight + blockDelay if executionHeight > activePubkey.Expiry { queuedPubkey, found := k.GetQueuedPubkey(ctx) @@ -205,7 +205,7 @@ func (k Keeper) ProcessGovRequestQueue(ctx sdk.Context) error { avgBlockTime := k.AvgBlockTime(ctx) blockDelay := uint64(math.Ceil(delay.Seconds() / float64(avgBlockTime))) - currentHeight := uint64(ctx.BlockHeight()) + currentHeight := uint64(ctx.BlockHeight()) // #nosec G115 executionHeight := currentHeight + blockDelay if executionHeight > activePubkey.Expiry { @@ -248,7 +248,7 @@ func (k Keeper) ProcessGovRequestQueue(ctx sdk.Context) error { proposal.Identity = id proposal.Pubkey = keyshareRequest.Pubkey - k.govKeeper.SetProposal(ctx, proposal) + k.govKeeper.SetProposal(ctx, proposal) // #nosec G104 k.govKeeper.RemoveReqQueueEntry(ctx, req.GetProposalId()) } diff --git a/x/keyshare/keeper/request_decryption_key.go b/x/keyshare/keeper/request_decryption_key.go index 78e19ae5..dfad2239 100644 --- a/x/keyshare/keeper/request_decryption_key.go +++ b/x/keyshare/keeper/request_decryption_key.go @@ -54,7 +54,7 @@ func (k Keeper) OnRecvRequestDecryptionKeyPacket( delay := data.EstimatedDelay avgBlockTime := k.AvgBlockTime(ctx) blockDelay := uint64(math.Ceil(delay.Seconds() / float64(avgBlockTime))) - currentHeight := uint64(ctx.BlockHeight()) + currentHeight := uint64(ctx.BlockHeight()) // #nosec G115 executionHeight := currentHeight + blockDelay if executionHeight > activePubkey.Expiry { queuedPubkey, found := k.GetQueuedPubkey(ctx) diff --git a/x/keyshare/module/module.go b/x/keyshare/module/module.go index 9576e072..6331e820 100644 --- a/x/keyshare/module/module.go +++ b/x/keyshare/module/module.go @@ -194,14 +194,14 @@ func (am AppModule) BeginBlock(cctx context.Context) error { } } - am.keeper.ProcessPepRequestQueue(ctx) - am.keeper.ProcessPepSignalQueue(ctx) - am.keeper.ProcessPrivateRequestQueue(ctx) - am.keeper.ProcessPrivateSignalQueue(ctx) - am.keeper.ProcessGovRequestQueue(ctx) - am.keeper.ProcessGovSignalQueue(ctx) + am.keeper.ProcessPepRequestQueue(ctx) // #nosec G104 + am.keeper.ProcessPepSignalQueue(ctx) // #nosec G104 + am.keeper.ProcessPrivateRequestQueue(ctx) // #nosec G104 + am.keeper.ProcessPrivateSignalQueue(ctx) // #nosec G104 + am.keeper.ProcessGovRequestQueue(ctx) // #nosec G104 + am.keeper.ProcessGovSignalQueue(ctx) // #nosec G104 - height := uint64(ctx.BlockHeight()) + height := uint64(ctx.BlockHeight()) // #nosec G115 ak, foundAk := am.keeper.GetActivePubkey(ctx) qk, foundQk := am.keeper.GetQueuedPubkey(ctx) @@ -281,7 +281,7 @@ func (am AppModule) EndBlock(cctx context.Context) error { // Validator will be slashed if their last submitted height is N block ago // Lets say N is 10, and last submitted height is 0, current height is 10 // then he/she will be slashed - if lastSubmittedHeight+params.GetMaxIdledBlock() > uint64(ctx.BlockHeight()) { + if lastSubmittedHeight+params.GetMaxIdledBlock() > uint64(ctx.BlockHeight()) { // #nosec G115 continue } @@ -313,13 +313,13 @@ func (am AppModule) EndBlock(cctx context.Context) error { return nil } - am.keeper.SlashingKeeper().Slash( - ctx, - consAddr, - params.SlashFractionNoKeyshare, - types.SlashPower, - ctx.BlockHeight()-1, - ) + am.keeper.SlashingKeeper().Slash( // #nosec G104 + ctx, // #nosec G104 + consAddr, // #nosec G104 + params.SlashFractionNoKeyshare, // #nosec G104 + types.SlashPower, // #nosec G104 + ctx.BlockHeight()-1, // #nosec G104 + ) // #nosec G104 // After being slashed, his/her last submitted height will be set to the current block // So he/she won't be slashed in the next block instead he/she will be slashed if he didn't submit for N block again. diff --git a/x/pep/ante/ante.go b/x/pep/ante/ante.go index f3554636..f6814def 100644 --- a/x/pep/ante/ante.go +++ b/x/pep/ante/ante.go @@ -34,7 +34,7 @@ func (pd PEPDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, nex } // Validate the keyshare if one exists. - if ctx.BlockHeight() > int64(ksInfo.Height) { + if ctx.BlockHeight() > int64(ksInfo.Height) { // #nosec G115 return ctx, errors.Wrap(err, "failed to validate keyshare") } diff --git a/x/pep/keeper/msg_submit_encrypted_tx.go b/x/pep/keeper/msg_submit_encrypted_tx.go index 63febc2b..63539d0e 100644 --- a/x/pep/keeper/msg_submit_encrypted_tx.go +++ b/x/pep/keeper/msg_submit_encrypted_tx.go @@ -15,7 +15,7 @@ func (k msgServer) SubmitEncryptedTx(goCtx context.Context, msg *types.MsgSubmit ctx := sdk.UnwrapSDKContext(goCtx) params := k.GetParams(ctx) - height := uint64(ctx.BlockHeight()) + height := uint64(ctx.BlockHeight()) // #nosec G115 if !params.IsSourceChain { strHeight := k.GetLatestHeight(ctx) diff --git a/x/pep/module/module.go b/x/pep/module/module.go index f4c0048c..1a3e74cf 100644 --- a/x/pep/module/module.go +++ b/x/pep/module/module.go @@ -278,7 +278,7 @@ func (am AppModule) BeginBlock(cctx context.Context) error { for _, eachTx := range arr.EncryptedTxs { startConsumedGas := ctx.GasMeter().GasConsumed() - am.keeper.SetEncryptedTxProcessedHeight(ctx, eachTx.TargetHeight, eachTx.Index, uint64(ctx.BlockHeight())) + am.keeper.SetEncryptedTxProcessedHeight(ctx, eachTx.TargetHeight, eachTx.Index, uint64(ctx.BlockHeight())) // #nosec G115 tx := convertEncTxToDecryptionTx(eachTx) err := am.decryptAndExecuteTx(ctx, tx, startConsumedGas, publicKeyPoint, skPoint) if err != nil { diff --git a/x/zkp/verification/range/range.go b/x/zkp/verification/range/range.go index a0d45e46..e7f0808f 100644 --- a/x/zkp/verification/range/range.go +++ b/x/zkp/verification/range/range.go @@ -262,8 +262,8 @@ type generatorsChain struct { func newGeneratorsChain(label []byte) *generatorsChain { shake := sha3.NewShake256() - shake.Write([]byte("GeneratorsChain")) - shake.Write(label) + shake.Write([]byte("GeneratorsChain")) // #nosec G104 + shake.Write(label) // #nosec G104 return &generatorsChain{shake: shake} } @@ -297,7 +297,7 @@ func (ipp *InnerProductProof) verificationScalars( return nil, nil, nil, nil, nil, RangeErrInvalidBitSize } - rangeProofInnerProductDomainSeparator(t, uint64(n)) + rangeProofInnerProductDomainSeparator(t, uint64(n)) // #nosec G115 challenges := make([]Scalar, 0, lgN) if rawUOut != nil { @@ -1240,12 +1240,12 @@ func leadingZeros32(x uint32) int { func putU64LE(dst []byte, v uint64) { _ = dst[7] - dst[0] = byte(v) - dst[1] = byte(v >> 8) - dst[2] = byte(v >> 16) - dst[3] = byte(v >> 24) - dst[4] = byte(v >> 32) - dst[5] = byte(v >> 40) - dst[6] = byte(v >> 48) + dst[0] = byte(v) // #nosec G115 + dst[1] = byte(v >> 8) // #nosec G115 + dst[2] = byte(v >> 16) // #nosec G115 + dst[3] = byte(v >> 24) // #nosec G115 + dst[4] = byte(v >> 32) // #nosec G115 + dst[5] = byte(v >> 40) // #nosec G115 + dst[6] = byte(v >> 48) // #nosec G115 dst[7] = byte(v >> 56) } From b3d6a1fbde1cb57a137b5e1ee9de5d69572feaf9 Mon Sep 17 00:00:00 2001 From: YadlaMani Date: Mon, 25 May 2026 17:28:57 +0530 Subject: [PATCH 36/42] fmt --- abci/checktx/keyshare_check_tx.go | 4 +-- app/keysharer/keysharer.go | 2 +- app/voteext.go | 4 +-- .../aggregator/private_keyshare_aggregator.go | 4 +-- .../cmd/secp_encrypter/secp_encrypter.go | 4 +-- lanes/keyshare/testutils/testutil.go | 2 +- testutil/nullify/nullify.go | 4 +-- testutil/random/hex.go | 2 +- testutil/random/pubkey.go | 2 +- x/keyshare/keeper/blockwise_vote_ext.go | 8 ++--- x/keyshare/keeper/msg_create_pubkey.go | 2 +- x/keyshare/keeper/msg_override_pubkey.go | 2 +- x/keyshare/keeper/msg_send_keyshare.go | 32 ++++++++--------- .../keeper/msg_submit_encrypted_keyshare.go | 2 +- .../keeper/msg_submit_general_keyshare.go | 36 +++++++++---------- x/keyshare/keeper/process_queues.go | 6 ++-- x/keyshare/keeper/request_decryption_key.go | 2 +- x/keyshare/module/module.go | 28 +++++++-------- x/pep/ante/ante.go | 2 +- x/pep/keeper/msg_submit_encrypted_tx.go | 2 +- x/pep/module/module.go | 2 +- x/zkp/verification/range/range.go | 18 +++++----- 22 files changed, 85 insertions(+), 85 deletions(-) diff --git a/abci/checktx/keyshare_check_tx.go b/abci/checktx/keyshare_check_tx.go index d460587a..f9618a89 100644 --- a/abci/checktx/keyshare_check_tx.go +++ b/abci/checktx/keyshare_check_tx.go @@ -140,8 +140,8 @@ func (handler *KeyshareCheckTxHandler) CheckTx() CheckTx { return &cometabci.ResponseCheckTx{ Code: cometabci.CodeTypeOK, - GasWanted: int64(gasInfo.GasWanted), // #nosec G115 - GasUsed: int64(gasInfo.GasUsed), // #nosec G115 + GasWanted: int64(gasInfo.GasWanted), // #nosec G115 + GasUsed: int64(gasInfo.GasUsed), // #nosec G115 }, nil } } diff --git a/app/keysharer/keysharer.go b/app/keysharer/keysharer.go index ce87f02a..875130d2 100644 --- a/app/keysharer/keysharer.go +++ b/app/keysharer/keysharer.go @@ -35,7 +35,7 @@ type ShareMaterial struct { func LoadConfig(home string) (Config, error) { path := filepath.Join(home, "keysharer.yaml") - bz, err := os.ReadFile(path) // #nosec G304 + bz, err := os.ReadFile(path) // #nosec G304 if err != nil { return Config{}, err } diff --git a/app/voteext.go b/app/voteext.go index 150ee4d5..f65f7b32 100644 --- a/app/voteext.go +++ b/app/voteext.go @@ -79,7 +79,7 @@ func (app *App) extendVoteHandler(cfg keysharer.Config) sdk.ExtendVoteHandler { return &abci.ResponseExtendVote{}, nil } - heightFor := uint64(ctx.BlockHeight() + 1) // #nosec G115 + heightFor := uint64(ctx.BlockHeight() + 1) // #nosec G115 app.Logger().Info("KeyshareVE/ExtendVote: picked share", "height", req.Height, "keyshare_index", mat.Index, "share_len", len(mat.ActiveShare)) @@ -152,7 +152,7 @@ func (app *App) verifyVoteExtensionHandler() sdk.VerifyVoteExtensionHandler { // into the KeyshareKeeper. func (app *App) preBlocker() sdk.PreBlocker { return func(ctx sdk.Context, req *abci.RequestFinalizeBlock) (*sdk.ResponsePreBlock, error) { - H := uint64(req.Height) // #nosec G115 + H := uint64(req.Height) // #nosec G115 ctx.Logger().Info("KeyshareVE/PreBlock: begin", "height", H, "num_txs", len(req.Txs)) diff --git a/cmd/fairyringd/cmd/aggregator/private_keyshare_aggregator.go b/cmd/fairyringd/cmd/aggregator/private_keyshare_aggregator.go index a3f4a063..120040be 100644 --- a/cmd/fairyringd/cmd/aggregator/private_keyshare_aggregator.go +++ b/cmd/fairyringd/cmd/aggregator/private_keyshare_aggregator.go @@ -162,7 +162,7 @@ func aggregateKeyshares(keyshares []commontypes.IndexedEncryptedKeyshare) (kyber return nil, err } shareList = append(shareList, extractedKey) - indexList = append(indexList, uint32(share.EncryptedKeyshareIndex)) // #nosec G115 + indexList = append(indexList, uint32(share.EncryptedKeyshareIndex)) // #nosec G115 } SkShares := []kyber.Point{} @@ -192,7 +192,7 @@ func parseShare( newExtractedKey := distIBE.ExtractedKey{ SK: newSharePoint, - Index: uint32(keyshare.EncryptedKeyshareIndex), // #nosec G115 + Index: uint32(keyshare.EncryptedKeyshareIndex), // #nosec G115 } return newExtractedKey, nil diff --git a/cmd/fairyringd/cmd/secp_encrypter/secp_encrypter.go b/cmd/fairyringd/cmd/secp_encrypter/secp_encrypter.go index 251e9b28..13e23c6a 100644 --- a/cmd/fairyringd/cmd/secp_encrypter/secp_encrypter.go +++ b/cmd/fairyringd/cmd/secp_encrypter/secp_encrypter.go @@ -49,8 +49,8 @@ func SecpEncrypterCmd() *cobra.Command { rootCmd.Flags().StringVarP(&keyshare, "keyshare", "k", "", "keyshare in hex") // Mark the flags as required - rootCmd.MarkFlagRequired("pubkey64") // #nosec G104 - rootCmd.MarkFlagRequired("keyshare") // #nosec G104 + rootCmd.MarkFlagRequired("pubkey64") // #nosec G104 + rootCmd.MarkFlagRequired("keyshare") // #nosec G104 return rootCmd } diff --git a/lanes/keyshare/testutils/testutil.go b/lanes/keyshare/testutils/testutil.go index 2cffdaea..137dd8e2 100644 --- a/lanes/keyshare/testutils/testutil.go +++ b/lanes/keyshare/testutils/testutil.go @@ -39,7 +39,7 @@ func (s *MEVLaneTestSuiteBase) SetupTest() { s.Ctx = s.Ctx.WithBlockHeight(1) // Init accounts - random := rand.New(rand.NewSource(time.Now().Unix())) // #nosec G404 + random := rand.New(rand.NewSource(time.Now().Unix())) // #nosec G404 s.Accounts = testutils.RandomAccounts(random, 10) s.GasTokenDenom = "stake" } diff --git a/testutil/nullify/nullify.go b/testutil/nullify/nullify.go index dff016a0..2f87fc28 100644 --- a/testutil/nullify/nullify.go +++ b/testutil/nullify/nullify.go @@ -22,7 +22,7 @@ func Fill(x interface{}) interface{} { case reflect.Slice: for i := 0; i < v.Len(); i++ { obj := v.Index(i) - objPt := reflect.NewAt(obj.Type(), unsafe.Pointer(obj.UnsafeAddr())).Interface() // #nosec G103 + objPt := reflect.NewAt(obj.Type(), unsafe.Pointer(obj.UnsafeAddr())).Interface() // #nosec G103 objPt = Fill(objPt) obj.Set(reflect.ValueOf(objPt)) } @@ -46,7 +46,7 @@ func Fill(x interface{}) interface{} { s := reflect.ValueOf(coins).Elem() f.Set(s) default: - objPt := reflect.NewAt(f.Type(), unsafe.Pointer(f.UnsafeAddr())).Interface() // #nosec G103 + objPt := reflect.NewAt(f.Type(), unsafe.Pointer(f.UnsafeAddr())).Interface() // #nosec G103 s := Fill(objPt) f.Set(reflect.ValueOf(s)) } diff --git a/testutil/random/hex.go b/testutil/random/hex.go index 28b1fc10..617abeee 100644 --- a/testutil/random/hex.go +++ b/testutil/random/hex.go @@ -8,7 +8,7 @@ import ( // RandHex returns a random hexadecimal string of length n. func RandHex(n int) string { - src := rand.New(rand.NewSource(time.Now().UnixNano())) // #nosec G404 + src := rand.New(rand.NewSource(time.Now().UnixNano())) // #nosec G404 b := make([]byte, (n+1)/2) if _, err := src.Read(b); err != nil { diff --git a/testutil/random/pubkey.go b/testutil/random/pubkey.go index aaabfce9..8ae19771 100644 --- a/testutil/random/pubkey.go +++ b/testutil/random/pubkey.go @@ -33,7 +33,7 @@ type GenerateResult struct { func GeneratePubKeyAndShares(totalNumberOfValidator uint32) (*GenerateResult, error) { t := int(math.Ceil(float64(totalNumberOfValidator) * (2.0 / 3.0))) - shares, mpk, _, err := distIBE.GenerateShares(totalNumberOfValidator, uint32(t)) // #nosec G115 + shares, mpk, _, err := distIBE.GenerateShares(totalNumberOfValidator, uint32(t)) // #nosec G115 if err != nil { return nil, err } diff --git a/x/keyshare/keeper/blockwise_vote_ext.go b/x/keyshare/keeper/blockwise_vote_ext.go index bb23080d..3a36c0b0 100644 --- a/x/keyshare/keeper/blockwise_vote_ext.go +++ b/x/keyshare/keeper/blockwise_vote_ext.go @@ -103,8 +103,8 @@ func (k Keeper) HandlePerBlockShare( BlockHeight: height, Keyshare: shareHex, KeyshareIndex: uint64(keyshareIndex), - ReceivedTimestamp: uint64(ctx.BlockTime().Unix()), // #nosec G115 - ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 + ReceivedTimestamp: uint64(ctx.BlockTime().Unix()), // #nosec G115 + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 }) // Update "last submitted height" marker @@ -114,7 +114,7 @@ func (k Keeper) HandlePerBlockShare( expectedThreshold := math.LegacyNewDecFromInt( math.NewInt(types.KeyAggregationThresholdNumerator)).Quo( math.LegacyNewDecFromInt(math.NewInt(types.KeyAggregationThresholdDenominator))).MulInt64( - int64(activePK.NumberOfValidators)).Ceil().TruncateInt64() // #nosec G115 + int64(activePK.NumberOfValidators)).Ceil().TruncateInt64() // #nosec G115 // collect all shares present for this height valset := k.GetAllValidatorSet(ctx) @@ -124,7 +124,7 @@ func (k Keeper) HandlePerBlockShare( for _, vs := range valset { if ks, ok := k.GetKeyshare(ctx, vs.Validator, height); ok { // parse stored share & corresponding commitment into the proper structs - keyshare, commitment, err := parseKeyshareCommitmentForHeight(suite, ks.Keyshare, commitments.Commitments[ks.KeyshareIndex-1], uint32(ks.KeyshareIndex), ibeID) // #nosec G115 + keyshare, commitment, err := parseKeyshareCommitmentForHeight(suite, ks.Keyshare, commitments.Commitments[ks.KeyshareIndex-1], uint32(ks.KeyshareIndex), ibeID) // #nosec G115 if err != nil { k.Logger().Error("preblock: failed to parse stored keyshare/commitment", "err", err, "validator", vs.Validator, "height", height) continue diff --git a/x/keyshare/keeper/msg_create_pubkey.go b/x/keyshare/keeper/msg_create_pubkey.go index bf307d4b..55c04b2f 100644 --- a/x/keyshare/keeper/msg_create_pubkey.go +++ b/x/keyshare/keeper/msg_create_pubkey.go @@ -34,7 +34,7 @@ func (k msgServer) CreateLatestPubkey( Commitments: msg.Commitments, } - expHeight := params.KeyExpiry + uint64(ctx.BlockHeight()) // #nosec G115 + expHeight := params.KeyExpiry + uint64(ctx.BlockHeight()) // #nosec G115 ak, found := k.GetActivePubkey(ctx) if found { expHeight = ak.Expiry + params.KeyExpiry diff --git a/x/keyshare/keeper/msg_override_pubkey.go b/x/keyshare/keeper/msg_override_pubkey.go index 2536179f..d4c10bae 100644 --- a/x/keyshare/keeper/msg_override_pubkey.go +++ b/x/keyshare/keeper/msg_override_pubkey.go @@ -29,7 +29,7 @@ func (k msgServer) OverrideLatestPubkey( Commitments: msg.Commitments, } - expHeight := params.KeyExpiry + uint64(ctx.BlockHeight()) // #nosec G115 + expHeight := params.KeyExpiry + uint64(ctx.BlockHeight()) // #nosec G115 if _, found := k.GetActivePubkey(ctx); found { k.DeleteActivePubkey(ctx) diff --git a/x/keyshare/keeper/msg_send_keyshare.go b/x/keyshare/keeper/msg_send_keyshare.go index 7ba4dc7d..cbaf5515 100644 --- a/x/keyshare/keeper/msg_send_keyshare.go +++ b/x/keyshare/keeper/msg_send_keyshare.go @@ -45,11 +45,11 @@ func (k msgServer) SendKeyshare(goCtx context.Context, msg *types.MsgSendKeyshar return nil, types.ErrAuthorizedAnotherAddress } - if uint64(ctx.BlockHeight()) > msg.BlockHeight { // #nosec G115 + if uint64(ctx.BlockHeight()) > msg.BlockHeight { // #nosec G115 return nil, types.ErrInvalidBlockHeight.Wrapf("key share height is lower than the current block height, expected height: %d, got: %d", ctx.BlockHeight(), msg.BlockHeight) } - if msg.BlockHeight > uint64(ctx.BlockHeight())+1 { // #nosec G115 + if msg.BlockHeight > uint64(ctx.BlockHeight())+1 { // #nosec G115 return nil, types.ErrInvalidBlockHeight.Wrapf("key share height is higher than the current block height + 1, expected max height to be: %d, got: %d", ctx.BlockHeight()+1, msg.BlockHeight) } @@ -82,7 +82,7 @@ func (k msgServer) SendKeyshare(goCtx context.Context, msg *types.MsgSendKeyshar } // Parse the keyshare & commitment then verify it - _, _, err := parseKeyshareCommitment(suite, msg.Message, commitments.Commitments[msg.KeyshareIndex-1], uint32(msg.KeyshareIndex), ibeID) // #nosec G115 + _, _, err := parseKeyshareCommitment(suite, msg.Message, commitments.Commitments[msg.KeyshareIndex-1], uint32(msg.KeyshareIndex), ibeID) // #nosec G115 if err != nil { defer telemetry.IncrCounter(1, types.KeyTotalInvalidKeyshareSubmitted) k.Logger().Error(fmt.Sprintf("Error in parsing & verifying keyshare & commitment: %s", err.Error())) @@ -100,18 +100,18 @@ func (k msgServer) SendKeyshare(goCtx context.Context, msg *types.MsgSendKeyshar return nil, err } - k.slashingKeeper.Slash( // #nosec G104 - ctx, consAddr, // #nosec G104 - k.SlashFractionWrongKeyshare(ctx), // #nosec G104 - types.SlashPower, // #nosec G104 - ctx.BlockHeight()-1, // #nosec G104 - ) // #nosec G104 + k.slashingKeeper.Slash( // #nosec G104 + ctx, consAddr, // #nosec G104 + k.SlashFractionWrongKeyshare(ctx), // #nosec G104 + types.SlashPower, // #nosec G104 + ctx.BlockHeight()-1, // #nosec G104 + ) // #nosec G104 return &types.MsgSendKeyshareResponse{ Creator: msg.Creator, Keyshare: msg.Message, KeyshareIndex: msg.KeyshareIndex, - ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 BlockHeight: msg.BlockHeight, Success: false, ErrorMessage: "Invalid Keyshare", @@ -123,8 +123,8 @@ func (k msgServer) SendKeyshare(goCtx context.Context, msg *types.MsgSendKeyshar BlockHeight: msg.BlockHeight, Keyshare: msg.Message, KeyshareIndex: msg.KeyshareIndex, - ReceivedTimestamp: uint64(ctx.BlockTime().Unix()), // #nosec G115 - ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 + ReceivedTimestamp: uint64(ctx.BlockTime().Unix()), // #nosec G115 + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 } // Save the new keyshare to state @@ -157,7 +157,7 @@ func (k msgServer) SendKeyshare(goCtx context.Context, msg *types.MsgSendKeyshar expectedThreshold := math.LegacyNewDecFromInt( math.NewInt(types.KeyAggregationThresholdNumerator)).Quo( math.LegacyNewDecFromInt(math.NewInt(types.KeyAggregationThresholdDenominator))).MulInt64( - int64(activePubkey.NumberOfValidators)).Ceil().TruncateInt64() // #nosec G115 + int64(activePubkey.NumberOfValidators)).Ceil().TruncateInt64() // #nosec G115 // Emit Keyshare Submitted Event ctx.EventManager().EmitEvent( @@ -186,7 +186,7 @@ func (k msgServer) SendKeyshare(goCtx context.Context, msg *types.MsgSendKeyshar Creator: msg.Creator, Keyshare: msg.Message, KeyshareIndex: msg.KeyshareIndex, - ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 BlockHeight: msg.BlockHeight, Success: true, }, nil @@ -201,7 +201,7 @@ func (k msgServer) SendKeyshare(goCtx context.Context, msg *types.MsgSendKeyshar k.Logger().Error(fmt.Sprintf("KeyshareIndex: %d should not higher or equals to commitments length: %d", eachKeyshare.KeyshareIndex, commitmentsLen)) continue } - keyshare, commitment, err := parseKeyshareCommitment(suite, eachKeyshare.Keyshare, commitments.Commitments[eachKeyshare.KeyshareIndex-1], uint32(eachKeyshare.KeyshareIndex), ibeID) // #nosec G115 + keyshare, commitment, err := parseKeyshareCommitment(suite, eachKeyshare.Keyshare, commitments.Commitments[eachKeyshare.KeyshareIndex-1], uint32(eachKeyshare.KeyshareIndex), ibeID) // #nosec G115 if err != nil { k.Logger().Error(err.Error()) continue @@ -267,7 +267,7 @@ func (k msgServer) SendKeyshare(goCtx context.Context, msg *types.MsgSendKeyshar Creator: msg.Creator, Keyshare: msg.Message, KeyshareIndex: msg.KeyshareIndex, - ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 BlockHeight: msg.BlockHeight, Success: true, }, nil diff --git a/x/keyshare/keeper/msg_submit_encrypted_keyshare.go b/x/keyshare/keeper/msg_submit_encrypted_keyshare.go index 7205af14..280ac2fa 100644 --- a/x/keyshare/keeper/msg_submit_encrypted_keyshare.go +++ b/x/keyshare/keeper/msg_submit_encrypted_keyshare.go @@ -89,7 +89,7 @@ func (k msgServer) SubmitEncryptedKeyshare(goCtx context.Context, msg *types.Msg expectedThreshold := math.LegacyNewDecFromInt( math.NewInt(types.KeyAggregationThresholdNumerator)).Quo( math.LegacyNewDecFromInt(math.NewInt(types.KeyAggregationThresholdDenominator))).MulInt64( - int64(activePubkey.NumberOfValidators)).Ceil().TruncateInt64() // #nosec G115 + int64(activePubkey.NumberOfValidators)).Ceil().TruncateInt64() // #nosec G115 // Emit Keyshare Submitted Event ctx.EventManager().EmitEvent( diff --git a/x/keyshare/keeper/msg_submit_general_keyshare.go b/x/keyshare/keeper/msg_submit_general_keyshare.go index f1356993..8759d189 100644 --- a/x/keyshare/keeper/msg_submit_general_keyshare.go +++ b/x/keyshare/keeper/msg_submit_general_keyshare.go @@ -76,7 +76,7 @@ func (k msgServer) SubmitGeneralKeyshare( IdValue: msg.IdValue, Keyshare: msg.Keyshare, KeyshareIndex: msg.KeyshareIndex, - ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 Success: true, }, nil } @@ -96,7 +96,7 @@ func (k msgServer) SubmitGeneralKeyshare( } // Parse the keyshare & commitment then verify it - _, _, err := parseKeyshareCommitment(suite, msg.Keyshare, commitments.Commitments[msg.KeyshareIndex-1], uint32(msg.KeyshareIndex), msg.IdValue) // #nosec G115 + _, _, err := parseKeyshareCommitment(suite, msg.Keyshare, commitments.Commitments[msg.KeyshareIndex-1], uint32(msg.KeyshareIndex), msg.IdValue) // #nosec G115 if err != nil { k.Logger().Error(fmt.Sprintf("Error in parsing & verifying general keyshare & commitment: %s", err.Error())) k.Logger().Error(fmt.Sprintf("General Keyshare is: %v | Commitment is: %v | Index: %d", msg.Keyshare, commitments.Commitments, msg.KeyshareIndex)) @@ -113,12 +113,12 @@ func (k msgServer) SubmitGeneralKeyshare( return nil, err } - k.SlashingKeeper().Slash( // #nosec G104 - ctx, consAddr, // #nosec G104 - k.SlashFractionWrongKeyshare(ctx), // #nosec G104 - types.SlashPower, // #nosec G104 - ctx.BlockHeight()-1, // #nosec G104 - ) // #nosec G104 + k.SlashingKeeper().Slash( // #nosec G104 + ctx, consAddr, // #nosec G104 + k.SlashFractionWrongKeyshare(ctx), // #nosec G104 + types.SlashPower, // #nosec G104 + ctx.BlockHeight()-1, // #nosec G104 + ) // #nosec G104 return &types.MsgSubmitGeneralKeyshareResponse{ Creator: msg.Creator, @@ -126,7 +126,7 @@ func (k msgServer) SubmitGeneralKeyshare( IdValue: msg.IdValue, Keyshare: msg.Keyshare, KeyshareIndex: msg.KeyshareIndex, - ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 Success: false, ErrorMessage: "Invalid General Keyshare", }, nil @@ -138,8 +138,8 @@ func (k msgServer) SubmitGeneralKeyshare( IdValue: msg.IdValue, Keyshare: msg.Keyshare, KeyshareIndex: msg.KeyshareIndex, - ReceivedTimestamp: uint64(ctx.BlockTime().Unix()), // #nosec G115 - ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 + ReceivedTimestamp: uint64(ctx.BlockTime().Unix()), // #nosec G115 + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 } // Save the new general key share to state @@ -174,7 +174,7 @@ func (k msgServer) SubmitGeneralKeyshare( expectedThreshold := math.LegacyNewDecFromInt( math.NewInt(types.KeyAggregationThresholdNumerator)).Quo( math.LegacyNewDecFromInt(math.NewInt(types.KeyAggregationThresholdDenominator))).MulInt64( - int64(activePubkey.NumberOfValidators)).Ceil().TruncateInt64() // #nosec G115 + int64(activePubkey.NumberOfValidators)).Ceil().TruncateInt64() // #nosec G115 // Emit Keyshare Submitted Event ctx.EventManager().EmitEvent( @@ -197,7 +197,7 @@ func (k msgServer) SubmitGeneralKeyshare( IdValue: msg.IdValue, Keyshare: msg.Keyshare, KeyshareIndex: msg.KeyshareIndex, - ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 Success: true, }, nil } @@ -217,7 +217,7 @@ func (k msgServer) SubmitGeneralKeyshare( IdValue: msg.IdValue, Keyshare: msg.Keyshare, KeyshareIndex: msg.KeyshareIndex, - ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 Success: true, }, nil } @@ -232,7 +232,7 @@ func (k msgServer) SubmitGeneralKeyshare( k.Logger().Error(fmt.Sprintf("KeyshareIndex: %d should not higher or equals to commitments length: %d", eachKeyshare.KeyshareIndex, commitmentsLen)) continue } - keyshare, commitment, err := parseKeyshareCommitment(suite, eachKeyshare.Keyshare, commitments.Commitments[eachKeyshare.KeyshareIndex-1], uint32(eachKeyshare.KeyshareIndex), msg.IdValue) // #nosec G115 + keyshare, commitment, err := parseKeyshareCommitment(suite, eachKeyshare.Keyshare, commitments.Commitments[eachKeyshare.KeyshareIndex-1], uint32(eachKeyshare.KeyshareIndex), msg.IdValue) // #nosec G115 if err != nil { k.Logger().Error(err.Error()) continue @@ -275,7 +275,7 @@ func (k msgServer) SubmitGeneralKeyshare( IdValue: msg.IdValue, Keyshare: msg.Keyshare, KeyshareIndex: msg.KeyshareIndex, - ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 } decryptionKeyReq, found := k.GetDecryptionKeyRequest(ctx, msg.IdValue) if !found { @@ -324,7 +324,7 @@ func (k msgServer) SubmitGeneralKeyshare( } proposal.DecryptionKey = decryptionKeyReq.DecryptionKey - k.govKeeper.SetProposal(ctx, proposal) // #nosec G104 + k.govKeeper.SetProposal(ctx, proposal) // #nosec G104 } else { val, _ := k.pepKeeper.GetEntry(ctx, decryptionKeyReq.Identity) val.DecryptionKey = decryptionKeyReq.DecryptionKey @@ -340,7 +340,7 @@ func (k msgServer) SubmitGeneralKeyshare( IdValue: msg.IdValue, Keyshare: msg.Keyshare, KeyshareIndex: msg.KeyshareIndex, - ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 + ReceivedBlockHeight: uint64(ctx.BlockHeight()), // #nosec G115 Success: true, }, nil } diff --git a/x/keyshare/keeper/process_queues.go b/x/keyshare/keeper/process_queues.go index 50773a03..758aa2b1 100644 --- a/x/keyshare/keeper/process_queues.go +++ b/x/keyshare/keeper/process_queues.go @@ -29,7 +29,7 @@ func (k Keeper) ProcessPepRequestQueue(ctx sdk.Context) error { delay := req.EstimatedDelay avgBlockTime := k.AvgBlockTime(ctx) blockDelay := uint64(math.Ceil(delay.Seconds() / float64(avgBlockTime))) - currentHeight := uint64(ctx.BlockHeight()) // #nosec G115 + currentHeight := uint64(ctx.BlockHeight()) // #nosec G115 executionHeight := currentHeight + blockDelay if executionHeight > activePubkey.Expiry { queuedPubkey, found := k.GetQueuedPubkey(ctx) @@ -205,7 +205,7 @@ func (k Keeper) ProcessGovRequestQueue(ctx sdk.Context) error { avgBlockTime := k.AvgBlockTime(ctx) blockDelay := uint64(math.Ceil(delay.Seconds() / float64(avgBlockTime))) - currentHeight := uint64(ctx.BlockHeight()) // #nosec G115 + currentHeight := uint64(ctx.BlockHeight()) // #nosec G115 executionHeight := currentHeight + blockDelay if executionHeight > activePubkey.Expiry { @@ -248,7 +248,7 @@ func (k Keeper) ProcessGovRequestQueue(ctx sdk.Context) error { proposal.Identity = id proposal.Pubkey = keyshareRequest.Pubkey - k.govKeeper.SetProposal(ctx, proposal) // #nosec G104 + k.govKeeper.SetProposal(ctx, proposal) // #nosec G104 k.govKeeper.RemoveReqQueueEntry(ctx, req.GetProposalId()) } diff --git a/x/keyshare/keeper/request_decryption_key.go b/x/keyshare/keeper/request_decryption_key.go index dfad2239..0d0b9b01 100644 --- a/x/keyshare/keeper/request_decryption_key.go +++ b/x/keyshare/keeper/request_decryption_key.go @@ -54,7 +54,7 @@ func (k Keeper) OnRecvRequestDecryptionKeyPacket( delay := data.EstimatedDelay avgBlockTime := k.AvgBlockTime(ctx) blockDelay := uint64(math.Ceil(delay.Seconds() / float64(avgBlockTime))) - currentHeight := uint64(ctx.BlockHeight()) // #nosec G115 + currentHeight := uint64(ctx.BlockHeight()) // #nosec G115 executionHeight := currentHeight + blockDelay if executionHeight > activePubkey.Expiry { queuedPubkey, found := k.GetQueuedPubkey(ctx) diff --git a/x/keyshare/module/module.go b/x/keyshare/module/module.go index 6331e820..136e8b0a 100644 --- a/x/keyshare/module/module.go +++ b/x/keyshare/module/module.go @@ -194,14 +194,14 @@ func (am AppModule) BeginBlock(cctx context.Context) error { } } - am.keeper.ProcessPepRequestQueue(ctx) // #nosec G104 - am.keeper.ProcessPepSignalQueue(ctx) // #nosec G104 - am.keeper.ProcessPrivateRequestQueue(ctx) // #nosec G104 + am.keeper.ProcessPepRequestQueue(ctx) // #nosec G104 + am.keeper.ProcessPepSignalQueue(ctx) // #nosec G104 + am.keeper.ProcessPrivateRequestQueue(ctx) // #nosec G104 am.keeper.ProcessPrivateSignalQueue(ctx) // #nosec G104 - am.keeper.ProcessGovRequestQueue(ctx) // #nosec G104 - am.keeper.ProcessGovSignalQueue(ctx) // #nosec G104 + am.keeper.ProcessGovRequestQueue(ctx) // #nosec G104 + am.keeper.ProcessGovSignalQueue(ctx) // #nosec G104 - height := uint64(ctx.BlockHeight()) // #nosec G115 + height := uint64(ctx.BlockHeight()) // #nosec G115 ak, foundAk := am.keeper.GetActivePubkey(ctx) qk, foundQk := am.keeper.GetQueuedPubkey(ctx) @@ -281,7 +281,7 @@ func (am AppModule) EndBlock(cctx context.Context) error { // Validator will be slashed if their last submitted height is N block ago // Lets say N is 10, and last submitted height is 0, current height is 10 // then he/she will be slashed - if lastSubmittedHeight+params.GetMaxIdledBlock() > uint64(ctx.BlockHeight()) { // #nosec G115 + if lastSubmittedHeight+params.GetMaxIdledBlock() > uint64(ctx.BlockHeight()) { // #nosec G115 continue } @@ -313,13 +313,13 @@ func (am AppModule) EndBlock(cctx context.Context) error { return nil } - am.keeper.SlashingKeeper().Slash( // #nosec G104 - ctx, // #nosec G104 - consAddr, // #nosec G104 - params.SlashFractionNoKeyshare, // #nosec G104 - types.SlashPower, // #nosec G104 - ctx.BlockHeight()-1, // #nosec G104 - ) // #nosec G104 + am.keeper.SlashingKeeper().Slash( // #nosec G104 + ctx, // #nosec G104 + consAddr, // #nosec G104 + params.SlashFractionNoKeyshare, // #nosec G104 + types.SlashPower, // #nosec G104 + ctx.BlockHeight()-1, // #nosec G104 + ) // #nosec G104 // After being slashed, his/her last submitted height will be set to the current block // So he/she won't be slashed in the next block instead he/she will be slashed if he didn't submit for N block again. diff --git a/x/pep/ante/ante.go b/x/pep/ante/ante.go index f6814def..761e7b6d 100644 --- a/x/pep/ante/ante.go +++ b/x/pep/ante/ante.go @@ -34,7 +34,7 @@ func (pd PEPDecorator) AnteHandle(ctx sdk.Context, tx sdk.Tx, simulate bool, nex } // Validate the keyshare if one exists. - if ctx.BlockHeight() > int64(ksInfo.Height) { // #nosec G115 + if ctx.BlockHeight() > int64(ksInfo.Height) { // #nosec G115 return ctx, errors.Wrap(err, "failed to validate keyshare") } diff --git a/x/pep/keeper/msg_submit_encrypted_tx.go b/x/pep/keeper/msg_submit_encrypted_tx.go index 63539d0e..008bf72d 100644 --- a/x/pep/keeper/msg_submit_encrypted_tx.go +++ b/x/pep/keeper/msg_submit_encrypted_tx.go @@ -15,7 +15,7 @@ func (k msgServer) SubmitEncryptedTx(goCtx context.Context, msg *types.MsgSubmit ctx := sdk.UnwrapSDKContext(goCtx) params := k.GetParams(ctx) - height := uint64(ctx.BlockHeight()) // #nosec G115 + height := uint64(ctx.BlockHeight()) // #nosec G115 if !params.IsSourceChain { strHeight := k.GetLatestHeight(ctx) diff --git a/x/pep/module/module.go b/x/pep/module/module.go index 1a3e74cf..97dd96af 100644 --- a/x/pep/module/module.go +++ b/x/pep/module/module.go @@ -278,7 +278,7 @@ func (am AppModule) BeginBlock(cctx context.Context) error { for _, eachTx := range arr.EncryptedTxs { startConsumedGas := ctx.GasMeter().GasConsumed() - am.keeper.SetEncryptedTxProcessedHeight(ctx, eachTx.TargetHeight, eachTx.Index, uint64(ctx.BlockHeight())) // #nosec G115 + am.keeper.SetEncryptedTxProcessedHeight(ctx, eachTx.TargetHeight, eachTx.Index, uint64(ctx.BlockHeight())) // #nosec G115 tx := convertEncTxToDecryptionTx(eachTx) err := am.decryptAndExecuteTx(ctx, tx, startConsumedGas, publicKeyPoint, skPoint) if err != nil { diff --git a/x/zkp/verification/range/range.go b/x/zkp/verification/range/range.go index a64a2e63..f2d1ed84 100644 --- a/x/zkp/verification/range/range.go +++ b/x/zkp/verification/range/range.go @@ -262,8 +262,8 @@ type generatorsChain struct { func newGeneratorsChain(label []byte) *generatorsChain { shake := sha3.NewShake256() - shake.Write([]byte("GeneratorsChain")) // #nosec G104 - shake.Write(label) // #nosec G104 + shake.Write([]byte("GeneratorsChain")) // #nosec G104 + shake.Write(label) // #nosec G104 return &generatorsChain{shake: shake} } @@ -297,7 +297,7 @@ func (ipp *InnerProductProof) verificationScalars( return nil, nil, nil, nil, nil, RangeErrInvalidBitSize } - rangeProofInnerProductDomainSeparator(t, uint64(n)) // #nosec G115 + rangeProofInnerProductDomainSeparator(t, uint64(n)) // #nosec G115 challenges := make([]Scalar, 0, lgN) if rawUOut != nil { @@ -1244,12 +1244,12 @@ func leadingZeros32(x uint32) int { func putU64LE(dst []byte, v uint64) { _ = dst[7] - dst[0] = byte(v) // #nosec G115 + dst[0] = byte(v) // #nosec G115 dst[1] = byte(v >> 8) // #nosec G115 - dst[2] = byte(v >> 16) // #nosec G115 - dst[3] = byte(v >> 24) // #nosec G115 - dst[4] = byte(v >> 32) // #nosec G115 - dst[5] = byte(v >> 40) // #nosec G115 - dst[6] = byte(v >> 48) // #nosec G115 + dst[2] = byte(v >> 16) // #nosec G115 + dst[3] = byte(v >> 24) // #nosec G115 + dst[4] = byte(v >> 32) // #nosec G115 + dst[5] = byte(v >> 40) // #nosec G115 + dst[6] = byte(v >> 48) // #nosec G115 dst[7] = byte(v >> 56) } From ee06493a632016d563084b69147ced4c8079bb06 Mon Sep 17 00:00:00 2001 From: SetarehGhorshi Date: Mon, 25 May 2026 14:24:24 -0400 Subject: [PATCH 37/42] fix zkp issue --- x/zkp/verification/commitment/commitment.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/x/zkp/verification/commitment/commitment.go b/x/zkp/verification/commitment/commitment.go index d3fe6a33..6261d999 100644 --- a/x/zkp/verification/commitment/commitment.go +++ b/x/zkp/verification/commitment/commitment.go @@ -167,9 +167,6 @@ func (ep EqualityProof) Verify( if ciphertext.Commitment.P.Equals(&id) { return ErrProofAlgebraic } - if ciphertext.Handle.P.Equals(&id) { - return ErrProofAlgebraic - } if commitment.P.Equals(&id) { return ErrProofAlgebraic } From 67f23a55a1d283a7d7bff47eb707dc5cb63c87aa Mon Sep 17 00:00:00 2001 From: YadlaMani Date: Wed, 27 May 2026 11:41:35 +0530 Subject: [PATCH 38/42] add fairycloak in cd --- .github/workflows/deploy.yml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index fd6b575a..e4b69be3 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -95,3 +95,17 @@ jobs: key: ${{ secrets.GCP_SSH_KEY }} script: | /home/mani/scripts/deploy-fairyport.sh + restart-fairycloak: + name: Restart Fairycloak + runs-on: ubuntu-latest + needs: restart-fairyport + if: github.event_name == 'push' + steps: + - name: SSH and Restart Fairycloak + uses: appleboy/ssh-action@v1.2.0 + with: + host: ${{ secrets.GCP_HOST }} + username: mani + key: ${{ secrets.GCP_SSH_KEY }} + script: | + /home/mani/scripts/deploy-fairycloak.sh From a09b08b129873b80e4b78dc39e7eac9b1427fa39 Mon Sep 17 00:00:00 2001 From: ap0calypse644 Date: Wed, 3 Jun 2026 11:21:19 +0530 Subject: [PATCH 39/42] updating keyshare slashing logic --- api/fairyring/keyshare/params.pulsar.go | 44 ++++----- proto/fairyring/keyshare/params.proto | 2 +- x/keyshare/keeper/msg_send_keyshare.go | 20 +++-- .../keeper/msg_submit_general_keyshare.go | 20 +++-- x/keyshare/keeper/msg_update_params.go | 4 + x/keyshare/keeper/msg_update_params_test.go | 5 +- x/keyshare/keeper/params.go | 6 +- x/keyshare/keeper/validator_power.go | 25 ++++++ x/keyshare/module/module.go | 25 ++++-- x/keyshare/types/genesis_test.go | 1 + x/keyshare/types/keys.go | 4 - x/keyshare/types/params.go | 42 +++++++-- x/keyshare/types/params.pb.go | 89 +++++++++---------- x/keyshare/types/params_test.go | 72 +++++++++++++++ 14 files changed, 258 insertions(+), 101 deletions(-) create mode 100644 x/keyshare/keeper/validator_power.go create mode 100644 x/keyshare/types/params_test.go diff --git a/api/fairyring/keyshare/params.pulsar.go b/api/fairyring/keyshare/params.pulsar.go index d5692b42..7fea44d8 100644 --- a/api/fairyring/keyshare/params.pulsar.go +++ b/api/fairyring/keyshare/params.pulsar.go @@ -186,8 +186,8 @@ func (x *fastReflection_Params) Range(f func(protoreflect.FieldDescriptor, proto return } } - if x.AvgBlockTime != float32(0) || math.Signbit(float64(x.AvgBlockTime)) { - value := protoreflect.ValueOfFloat32(x.AvgBlockTime) + if x.AvgBlockTime != float64(0) || math.Signbit(x.AvgBlockTime) { + value := protoreflect.ValueOfFloat64(x.AvgBlockTime) if !f(fd_Params_avg_block_time, value) { return } @@ -220,7 +220,7 @@ func (x *fastReflection_Params) Has(fd protoreflect.FieldDescriptor) bool { case "fairyring.keyshare.Params.slash_fraction_wrong_keyshare": return len(x.SlashFractionWrongKeyshare) != 0 case "fairyring.keyshare.Params.avg_block_time": - return x.AvgBlockTime != float32(0) || math.Signbit(float64(x.AvgBlockTime)) + return x.AvgBlockTime != float64(0) || math.Signbit(x.AvgBlockTime) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.keyshare.Params")) @@ -250,7 +250,7 @@ func (x *fastReflection_Params) Clear(fd protoreflect.FieldDescriptor) { case "fairyring.keyshare.Params.slash_fraction_wrong_keyshare": x.SlashFractionWrongKeyshare = nil case "fairyring.keyshare.Params.avg_block_time": - x.AvgBlockTime = float32(0) + x.AvgBlockTime = float64(0) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.keyshare.Params")) @@ -290,7 +290,7 @@ func (x *fastReflection_Params) Get(descriptor protoreflect.FieldDescriptor) pro return protoreflect.ValueOfBytes(value) case "fairyring.keyshare.Params.avg_block_time": value := x.AvgBlockTime - return protoreflect.ValueOfFloat32(value) + return protoreflect.ValueOfFloat64(value) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.keyshare.Params")) @@ -326,7 +326,7 @@ func (x *fastReflection_Params) Set(fd protoreflect.FieldDescriptor, value proto case "fairyring.keyshare.Params.slash_fraction_wrong_keyshare": x.SlashFractionWrongKeyshare = value.Bytes() case "fairyring.keyshare.Params.avg_block_time": - x.AvgBlockTime = float32(value.Float()) + x.AvgBlockTime = value.Float() default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.keyshare.Params")) @@ -392,7 +392,7 @@ func (x *fastReflection_Params) NewField(fd protoreflect.FieldDescriptor) protor case "fairyring.keyshare.Params.slash_fraction_wrong_keyshare": return protoreflect.ValueOfBytes(nil) case "fairyring.keyshare.Params.avg_block_time": - return protoreflect.ValueOfFloat32(float32(0)) + return protoreflect.ValueOfFloat64(float64(0)) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: fairyring.keyshare.Params")) @@ -485,8 +485,8 @@ func (x *fastReflection_Params) ProtoMethods() *protoiface.Methods { if l > 0 { n += 1 + l + runtime.Sov(uint64(l)) } - if x.AvgBlockTime != 0 || math.Signbit(float64(x.AvgBlockTime)) { - n += 5 + if x.AvgBlockTime != 0 || math.Signbit(x.AvgBlockTime) { + n += 9 } if x.unknownFields != nil { n += len(x.unknownFields) @@ -517,11 +517,11 @@ func (x *fastReflection_Params) ProtoMethods() *protoiface.Methods { i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } - if x.AvgBlockTime != 0 || math.Signbit(float64(x.AvgBlockTime)) { - i -= 4 - binary.LittleEndian.PutUint32(dAtA[i:], uint32(math.Float32bits(float32(x.AvgBlockTime)))) + if x.AvgBlockTime != 0 || math.Signbit(x.AvgBlockTime) { + i -= 8 + binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(x.AvgBlockTime)))) i-- - dAtA[i] = 0x3d + dAtA[i] = 0x39 } if len(x.SlashFractionWrongKeyshare) > 0 { i -= len(x.SlashFractionWrongKeyshare) @@ -768,16 +768,16 @@ func (x *fastReflection_Params) ProtoMethods() *protoiface.Methods { } iNdEx = postIndex case 7: - if wireType != 5 { + if wireType != 1 { return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field AvgBlockTime", wireType) } - var v uint32 - if (iNdEx + 4) > l { + var v uint64 + if (iNdEx + 8) > l { return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, io.ErrUnexpectedEOF } - v = uint32(binary.LittleEndian.Uint32(dAtA[iNdEx:])) - iNdEx += 4 - x.AvgBlockTime = float32(math.Float32frombits(v)) + v = uint64(binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + x.AvgBlockTime = float64(math.Float64frombits(v)) default: iNdEx = preIndex skippy, err := runtime.Skip(dAtA[iNdEx:]) @@ -838,7 +838,7 @@ type Params struct { TrustedAddresses []string `protobuf:"bytes,4,rep,name=trusted_addresses,json=trustedAddresses,proto3" json:"trusted_addresses,omitempty"` SlashFractionNoKeyshare []byte `protobuf:"bytes,5,opt,name=slash_fraction_no_keyshare,json=slashFractionNoKeyshare,proto3" json:"slash_fraction_no_keyshare,omitempty"` SlashFractionWrongKeyshare []byte `protobuf:"bytes,6,opt,name=slash_fraction_wrong_keyshare,json=slashFractionWrongKeyshare,proto3" json:"slash_fraction_wrong_keyshare,omitempty"` - AvgBlockTime float32 `protobuf:"fixed32,7,opt,name=avg_block_time,json=avgBlockTime,proto3" json:"avg_block_time,omitempty"` + AvgBlockTime float64 `protobuf:"fixed64,7,opt,name=avg_block_time,json=avgBlockTime,proto3" json:"avg_block_time,omitempty"` } func (x *Params) Reset() { @@ -903,7 +903,7 @@ func (x *Params) GetSlashFractionWrongKeyshare() []byte { return nil } -func (x *Params) GetAvgBlockTime() float32 { +func (x *Params) GetAvgBlockTime() float64 { if x != nil { return x.AvgBlockTime } @@ -955,7 +955,7 @@ var file_fairyring_keyshare_params_proto_rawDesc = []byte{ 0x6c, 0x61, 0x73, 0x68, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x72, 0x6f, 0x6e, 0x67, 0x4b, 0x65, 0x79, 0x73, 0x68, 0x61, 0x72, 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x61, 0x76, 0x67, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x02, 0x42, 0x19, 0xf2, 0xde, 0x1f, 0x15, 0x79, 0x61, 0x6d, 0x6c, 0x3a, 0x22, 0x61, 0x76, 0x67, + 0x01, 0x42, 0x19, 0xf2, 0xde, 0x1f, 0x15, 0x79, 0x61, 0x6d, 0x6c, 0x3a, 0x22, 0x61, 0x76, 0x67, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x52, 0x0c, 0x61, 0x76, 0x67, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x3a, 0x39, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, 0x30, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, diff --git a/proto/fairyring/keyshare/params.proto b/proto/fairyring/keyshare/params.proto index 731da14f..c4c993f1 100644 --- a/proto/fairyring/keyshare/params.proto +++ b/proto/fairyring/keyshare/params.proto @@ -17,5 +17,5 @@ message Params { repeated string trusted_addresses = 4 [(gogoproto.moretags) = "yaml:\"trusted_addresses\""]; bytes slash_fraction_no_keyshare = 5 [(gogoproto.customtype) = "cosmossdk.io/math.LegacyDec", (gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"slash_fraction_no_keyshare\""]; bytes slash_fraction_wrong_keyshare = 6 [(gogoproto.customtype) = "cosmossdk.io/math.LegacyDec", (gogoproto.nullable) = false, (gogoproto.moretags) = "yaml:\"slash_fraction_wrong_keyshare\""]; - float avg_block_time = 7 [(gogoproto.moretags) = "yaml:\"avg_block_time\""]; + double avg_block_time = 7 [(gogoproto.moretags) = "yaml:\"avg_block_time\""]; } \ No newline at end of file diff --git a/x/keyshare/keeper/msg_send_keyshare.go b/x/keyshare/keeper/msg_send_keyshare.go index cbaf5515..1229a557 100644 --- a/x/keyshare/keeper/msg_send_keyshare.go +++ b/x/keyshare/keeper/msg_send_keyshare.go @@ -100,12 +100,20 @@ func (k msgServer) SendKeyshare(goCtx context.Context, msg *types.MsgSendKeyshar return nil, err } - k.slashingKeeper.Slash( // #nosec G104 - ctx, consAddr, // #nosec G104 - k.SlashFractionWrongKeyshare(ctx), // #nosec G104 - types.SlashPower, // #nosec G104 - ctx.BlockHeight()-1, // #nosec G104 - ) // #nosec G104 + power, err := k.GetValidatorConsensusPower(ctx, validatorInfo.Validator) + if err != nil { + return nil, err + } + + if err := k.slashingKeeper.Slash( + ctx, + consAddr, + k.SlashFractionWrongKeyshare(ctx), + power, + ctx.BlockHeight()-1, + ); err != nil { + return nil, err + } return &types.MsgSendKeyshareResponse{ Creator: msg.Creator, diff --git a/x/keyshare/keeper/msg_submit_general_keyshare.go b/x/keyshare/keeper/msg_submit_general_keyshare.go index 8759d189..54fc697d 100644 --- a/x/keyshare/keeper/msg_submit_general_keyshare.go +++ b/x/keyshare/keeper/msg_submit_general_keyshare.go @@ -113,12 +113,20 @@ func (k msgServer) SubmitGeneralKeyshare( return nil, err } - k.SlashingKeeper().Slash( // #nosec G104 - ctx, consAddr, // #nosec G104 - k.SlashFractionWrongKeyshare(ctx), // #nosec G104 - types.SlashPower, // #nosec G104 - ctx.BlockHeight()-1, // #nosec G104 - ) // #nosec G104 + power, err := k.GetValidatorConsensusPower(ctx, validatorInfo.Validator) + if err != nil { + return nil, err + } + + if err := k.SlashingKeeper().Slash( + ctx, + consAddr, + k.SlashFractionWrongKeyshare(ctx), + power, + ctx.BlockHeight()-1, + ); err != nil { + return nil, err + } return &types.MsgSubmitGeneralKeyshareResponse{ Creator: msg.Creator, diff --git a/x/keyshare/keeper/msg_update_params.go b/x/keyshare/keeper/msg_update_params.go index 6cfdd27c..e8f7d7a0 100644 --- a/x/keyshare/keeper/msg_update_params.go +++ b/x/keyshare/keeper/msg_update_params.go @@ -14,6 +14,10 @@ func (k msgServer) UpdateParams(goCtx context.Context, req *types.MsgUpdateParam return nil, errorsmod.Wrapf(types.ErrInvalidSigner, "invalid authority; expected %s, got %s", k.GetAuthority(), req.Authority) } + if err := req.Params.Validate(); err != nil { + return nil, err + } + ctx := sdk.UnwrapSDKContext(goCtx) if err := k.SetParams(ctx, req.Params); err != nil { return nil, err diff --git a/x/keyshare/keeper/msg_update_params_test.go b/x/keyshare/keeper/msg_update_params_test.go index 499bef3e..9db8e211 100644 --- a/x/keyshare/keeper/msg_update_params_test.go +++ b/x/keyshare/keeper/msg_update_params_test.go @@ -32,12 +32,13 @@ func TestMsgUpdateParams(t *testing.T) { expErrMsg: "invalid authority", }, { - name: "send enabled param", + name: "reject invalid params", input: &types.MsgUpdateParams{ Authority: k.GetAuthority(), Params: types.Params{}, }, - expErr: false, + expErr: true, + expErrMsg: "key expiry must be greater than 0", }, { name: "all good", diff --git a/x/keyshare/keeper/params.go b/x/keyshare/keeper/params.go index 1a6cda69..0c2e6921 100644 --- a/x/keyshare/keeper/params.go +++ b/x/keyshare/keeper/params.go @@ -25,6 +25,10 @@ func (k Keeper) GetParams(ctx context.Context) (params types.Params) { // SetParams set the params func (k Keeper) SetParams(ctx context.Context, params types.Params) error { + if err := params.Validate(); err != nil { + return err + } + store := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) bz, err := k.cdc.Marshal(¶ms) if err != nil { @@ -66,6 +70,6 @@ func (k Keeper) MaxIdledBlock(ctx sdk.Context) (res uint64) { } // AvgBlockTime returns the MaxIdledBlock param -func (k Keeper) AvgBlockTime(ctx sdk.Context) (res float32) { +func (k Keeper) AvgBlockTime(ctx sdk.Context) (res float64) { return k.GetParams(ctx).AvgBlockTime } diff --git a/x/keyshare/keeper/validator_power.go b/x/keyshare/keeper/validator_power.go new file mode 100644 index 00000000..0c2980ce --- /dev/null +++ b/x/keyshare/keeper/validator_power.go @@ -0,0 +1,25 @@ +package keeper + +import ( + "context" + "fmt" + + sdk "github.com/cosmos/cosmos-sdk/types" +) + +// GetValidatorConsensusPower returns the validator's current consensus power +// from the staking module. The slashing keeper expects consensus power, not a +// percentage or a fixed constant. +func (k Keeper) GetValidatorConsensusPower(ctx context.Context, validator string) (int64, error) { + accAddr, err := sdk.AccAddressFromBech32(validator) + if err != nil { + return 0, fmt.Errorf("invalid validator account address %q: %w", validator, err) + } + + stakingValidator, err := k.stakingKeeper.GetValidator(ctx, sdk.ValAddress(accAddr)) + if err != nil { + return 0, fmt.Errorf("staking validator %q not found: %w", validator, err) + } + + return stakingValidator.ConsensusPower(sdk.DefaultPowerReduction), nil +} diff --git a/x/keyshare/module/module.go b/x/keyshare/module/module.go index 136e8b0a..8582ea7f 100644 --- a/x/keyshare/module/module.go +++ b/x/keyshare/module/module.go @@ -310,16 +310,25 @@ func (am AppModule) EndBlock(cctx context.Context) error { if !inCurrentEpoch { am.keeper.Logger().Info(fmt.Sprintf("Validator: %s not in the current epoch, updating last submitted height to current block height.", eachValidator.Validator)) am.keeper.SetLastSubmittedHeight(ctx, eachValidator.Validator, strconv.FormatInt(ctx.BlockHeight(), 10)) - return nil + continue + } + + power, err := am.keeper.GetValidatorConsensusPower(ctx, eachValidator.Validator) + if err != nil { + am.keeper.Logger().Error(fmt.Sprintf("Error while retrieving validator %s consensus power: %s", eachValidator.Validator, err.Error())) + continue } - am.keeper.SlashingKeeper().Slash( // #nosec G104 - ctx, // #nosec G104 - consAddr, // #nosec G104 - params.SlashFractionNoKeyshare, // #nosec G104 - types.SlashPower, // #nosec G104 - ctx.BlockHeight()-1, // #nosec G104 - ) // #nosec G104 + if err := am.keeper.SlashingKeeper().Slash( + ctx, + consAddr, + params.SlashFractionNoKeyshare, + power, + ctx.BlockHeight()-1, + ); err != nil { + am.keeper.Logger().Error(fmt.Sprintf("Error while slashing idle validator %s: %s", eachValidator.Validator, err.Error())) + continue + } // After being slashed, his/her last submitted height will be set to the current block // So he/she won't be slashed in the next block instead he/she will be slashed if he didn't submit for N block again. diff --git a/x/keyshare/types/genesis_test.go b/x/keyshare/types/genesis_test.go index 69c58669..7b6af660 100644 --- a/x/keyshare/types/genesis_test.go +++ b/x/keyshare/types/genesis_test.go @@ -22,6 +22,7 @@ func TestGenesisState_Validate(t *testing.T) { { desc: "valid genesis state", genState: &types.GenesisState{ + Params: types.DefaultParams(), PortId: types.PortID, DecryptionKeyList: []types.DecryptionKey{ { diff --git a/x/keyshare/types/keys.go b/x/keyshare/types/keys.go index bd14d776..d9b7b710 100644 --- a/x/keyshare/types/keys.go +++ b/x/keyshare/types/keys.go @@ -31,10 +31,6 @@ const ( KeyAggregationThresholdDenominator = 3 ) -const ( - SlashPower int64 = 100 -) - const ( RegisteredValidatorEventType = "new-validator-registered" RegisteredValidatorEventCreator = "creator" diff --git a/x/keyshare/types/params.go b/x/keyshare/types/params.go index 54f1f1bd..b23b809f 100644 --- a/x/keyshare/types/params.go +++ b/x/keyshare/types/params.go @@ -2,6 +2,7 @@ package types import ( "fmt" + stdmath "math" "cosmossdk.io/math" sdk "github.com/cosmos/cosmos-sdk/types" @@ -43,7 +44,7 @@ var ( var ( KeyAvgBlockTime = []byte("KeyAvgBlockTime") - DefaultAvgBlockTime float32 = 5.6 + DefaultAvgBlockTime float64 = 5.6 ) // ParamKeyTable the param key table for launch module @@ -59,7 +60,7 @@ func NewParams( noKeyshareFraction math.LegacyDec, wrongKeyshareFraction math.LegacyDec, maxIdledBlock uint64, - avgBlockTime float32, + avgBlockTime float64, ) Params { return Params{ KeyExpiry: keyExp, @@ -111,15 +112,35 @@ func (p Params) Validate() error { if err := validateMinimumBonded(p.MinimumBonded); err != nil { return err } + + if err := validateSlashFractionNoKeyshare(p.SlashFractionNoKeyshare); err != nil { + return err + } + + if err := validateSlashFractionWrongKeyshare(p.SlashFractionWrongKeyshare); err != nil { + return err + } + + if err := validateMaxIdledBlock(p.MaxIdledBlock); err != nil { + return err + } + + if err := validateAvgBlockTime(p.AvgBlockTime); err != nil { + return err + } + return nil } // validateKeyExpiry validates the KeyExpiry param func validateKeyExpiry(v interface{}) error { - _, ok := v.(uint64) + val, ok := v.(uint64) if !ok { return fmt.Errorf("invalid parameter type: %T", v) } + if val == 0 { + return fmt.Errorf("key expiry must be greater than 0") + } return nil } @@ -145,10 +166,13 @@ func validateTrustedAddresses(v interface{}) error { // validates the MinimumBonded param func validateMinimumBonded(v interface{}) error { - _, ok := v.(uint64) + val, ok := v.(uint64) if !ok { return fmt.Errorf("invalid parameter type: %T", v) } + if val == 0 { + return fmt.Errorf("minimum bonded amount must be greater than 0") + } return nil } @@ -179,20 +203,26 @@ func validateSlashFractionWrongKeyshare(v interface{}) error { // validateMaxIdledBlock validates the MaxIdledBlock param func validateMaxIdledBlock(v interface{}) error { - _, ok := v.(uint64) + val, ok := v.(uint64) if !ok { return fmt.Errorf("invalid parameter type: %T", v) } + if val == 0 { + return fmt.Errorf("max idled block must be greater than 0") + } return nil } // validateAvgBlockTime validates the AvgBlockTime param func validateAvgBlockTime(v interface{}) error { - _, ok := v.(float32) + val, ok := v.(float64) if !ok { return fmt.Errorf("invalid parameter type: %T", v) } + if val <= 0 || stdmath.IsNaN(val) || stdmath.IsInf(val, 0) { + return fmt.Errorf("average block time must be a finite value greater than 0") + } return nil } diff --git a/x/keyshare/types/params.pb.go b/x/keyshare/types/params.pb.go index 45c83a2f..7a9c218f 100644 --- a/x/keyshare/types/params.pb.go +++ b/x/keyshare/types/params.pb.go @@ -34,7 +34,7 @@ type Params struct { TrustedAddresses []string `protobuf:"bytes,4,rep,name=trusted_addresses,json=trustedAddresses,proto3" json:"trusted_addresses,omitempty" yaml:"trusted_addresses"` SlashFractionNoKeyshare cosmossdk_io_math.LegacyDec `protobuf:"bytes,5,opt,name=slash_fraction_no_keyshare,json=slashFractionNoKeyshare,proto3,customtype=cosmossdk.io/math.LegacyDec" json:"slash_fraction_no_keyshare" yaml:"slash_fraction_no_keyshare"` SlashFractionWrongKeyshare cosmossdk_io_math.LegacyDec `protobuf:"bytes,6,opt,name=slash_fraction_wrong_keyshare,json=slashFractionWrongKeyshare,proto3,customtype=cosmossdk.io/math.LegacyDec" json:"slash_fraction_wrong_keyshare" yaml:"slash_fraction_wrong_keyshare"` - AvgBlockTime float32 `protobuf:"fixed32,7,opt,name=avg_block_time,json=avgBlockTime,proto3" json:"avg_block_time,omitempty" yaml:"avg_block_time"` + AvgBlockTime float64 `protobuf:"fixed64,7,opt,name=avg_block_time,json=avgBlockTime,proto3" json:"avg_block_time,omitempty" yaml:"avg_block_time"` } func (m *Params) Reset() { *m = Params{} } @@ -98,7 +98,7 @@ func (m *Params) GetTrustedAddresses() []string { return nil } -func (m *Params) GetAvgBlockTime() float32 { +func (m *Params) GetAvgBlockTime() float64 { if m != nil { return m.AvgBlockTime } @@ -112,39 +112,38 @@ func init() { func init() { proto.RegisterFile("fairyring/keyshare/params.proto", fileDescriptor_09ef7bd565425b36) } var fileDescriptor_09ef7bd565425b36 = []byte{ - // 497 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0xcb, 0x6e, 0xd3, 0x40, - 0x14, 0xcd, 0xf4, 0x11, 0xd4, 0x51, 0x29, 0xc4, 0xa2, 0x60, 0x02, 0x78, 0x82, 0xc5, 0x22, 0x62, - 0x61, 0x23, 0xc1, 0x86, 0x6e, 0x00, 0x0b, 0x2a, 0xa2, 0x22, 0x84, 0x2c, 0x24, 0x24, 0x36, 0xa3, - 0x89, 0x3d, 0x75, 0x46, 0xce, 0x78, 0xa2, 0x19, 0xa7, 0xc4, 0x1f, 0xc0, 0x86, 0x05, 0xe2, 0x13, - 0x58, 0xf0, 0x01, 0x7c, 0x46, 0x97, 0x5d, 0x22, 0x16, 0x16, 0x4a, 0x16, 0xb0, 0xf6, 0x17, 0x20, - 0x8f, 0x9d, 0x06, 0x03, 0x95, 0xba, 0xb1, 0xee, 0x3d, 0xe7, 0xdc, 0xe3, 0xa3, 0xb9, 0x17, 0xa2, - 0x43, 0xc2, 0x64, 0x26, 0x59, 0x12, 0xb9, 0x31, 0xcd, 0xd4, 0x88, 0x48, 0xea, 0x4e, 0x88, 0x24, - 0x5c, 0x39, 0x13, 0x29, 0x52, 0x61, 0x18, 0xa7, 0x02, 0x67, 0x29, 0xe8, 0x76, 0x08, 0x67, 0x89, - 0x70, 0xf5, 0xb7, 0x92, 0x75, 0xaf, 0x44, 0x22, 0x12, 0xba, 0x74, 0xcb, 0xaa, 0x42, 0xed, 0x2f, - 0x9b, 0xb0, 0xfd, 0x4a, 0xbb, 0x19, 0x0f, 0x20, 0x8c, 0x69, 0x86, 0xe9, 0x6c, 0xc2, 0x64, 0x66, - 0x82, 0x1e, 0xe8, 0x6f, 0x78, 0xbb, 0x45, 0x8e, 0x3a, 0x19, 0xe1, 0xe3, 0x3d, 0x7b, 0xc5, 0xd9, - 0xfe, 0x56, 0x4c, 0xb3, 0x67, 0xba, 0x36, 0x1e, 0xc3, 0x1d, 0xce, 0x12, 0xc6, 0xa7, 0x1c, 0x0f, - 0x45, 0x12, 0xd2, 0xd0, 0x5c, 0xd3, 0x93, 0xd7, 0x8b, 0x1c, 0xed, 0x56, 0x93, 0x4d, 0xde, 0xf6, - 0x2f, 0xd6, 0x80, 0xa7, 0x7b, 0xc3, 0x83, 0x97, 0x38, 0x99, 0x61, 0x16, 0x8e, 0x69, 0x88, 0x87, - 0x63, 0x11, 0xc4, 0xe6, 0xba, 0xb6, 0xe8, 0x16, 0x39, 0xba, 0x5a, 0x5b, 0x34, 0x05, 0xa5, 0x07, - 0x99, 0x0d, 0x4a, 0xc0, 0x2b, 0x7b, 0x63, 0x00, 0x3b, 0xa9, 0x9c, 0xaa, 0x94, 0x86, 0x98, 0x84, - 0xa1, 0xa4, 0x4a, 0x51, 0x65, 0x6e, 0xf4, 0xd6, 0xfb, 0x5b, 0xde, 0xcd, 0x22, 0x47, 0x66, 0xe5, - 0xf2, 0x8f, 0xc4, 0xf6, 0x2f, 0xd7, 0xd8, 0x93, 0x25, 0x64, 0xbc, 0x07, 0xb0, 0xab, 0xc6, 0x44, - 0x8d, 0xf0, 0xa1, 0x24, 0x41, 0xca, 0x44, 0x82, 0x13, 0x81, 0x97, 0x2f, 0x6b, 0x6e, 0xf6, 0x40, - 0x7f, 0xdb, 0x7b, 0x7e, 0x9c, 0xa3, 0xd6, 0xf7, 0x1c, 0xdd, 0x08, 0x84, 0xe2, 0x42, 0xa9, 0x30, - 0x76, 0x98, 0x70, 0x39, 0x49, 0x47, 0xce, 0x0b, 0x1a, 0x91, 0x20, 0x7b, 0x4a, 0x83, 0x22, 0x47, - 0xb7, 0xab, 0xff, 0x9e, 0x6d, 0x67, 0xfb, 0xd7, 0x34, 0xb9, 0x5f, 0x73, 0x2f, 0xc5, 0x41, 0xcd, - 0x18, 0x1f, 0x01, 0xbc, 0xf5, 0xd7, 0xe0, 0x3b, 0x29, 0x92, 0x68, 0x15, 0xa5, 0xad, 0xa3, 0x1c, - 0x9c, 0x2f, 0xca, 0x9d, 0xff, 0x46, 0x69, 0x3a, 0xda, 0x7e, 0xb7, 0x91, 0xe6, 0x4d, 0xc9, 0x9e, - 0x06, 0x7a, 0x04, 0x77, 0xc8, 0x51, 0x54, 0x2d, 0x00, 0xa7, 0x8c, 0x53, 0xf3, 0x42, 0x0f, 0xf4, - 0xd7, 0xfe, 0xdc, 0x74, 0x93, 0xb7, 0xfd, 0x6d, 0x72, 0x14, 0xe9, 0x05, 0xbd, 0x66, 0x9c, 0xee, - 0x3d, 0xfc, 0xf5, 0x19, 0x81, 0x0f, 0x3f, 0xbf, 0xde, 0xbd, 0x17, 0xb1, 0x74, 0x34, 0x1d, 0x3a, - 0x81, 0xe0, 0xee, 0x3e, 0x61, 0x52, 0x8f, 0xb8, 0xab, 0x3b, 0x9f, 0xad, 0x2e, 0xbd, 0xba, 0x4d, - 0x6f, 0x70, 0x3c, 0xb7, 0xc0, 0xc9, 0xdc, 0x02, 0x3f, 0xe6, 0x16, 0xf8, 0xb4, 0xb0, 0x5a, 0x27, - 0x0b, 0xab, 0xf5, 0x6d, 0x61, 0xb5, 0xde, 0xba, 0xe7, 0xf7, 0x4a, 0xb3, 0x09, 0x55, 0xc3, 0xb6, - 0x3e, 0xfc, 0xfb, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0xb3, 0xa7, 0x9b, 0xa0, 0x58, 0x03, 0x00, - 0x00, + // 496 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0xcb, 0x8a, 0xd4, 0x40, + 0x14, 0xed, 0x72, 0x1e, 0x32, 0xc5, 0x38, 0xda, 0xc1, 0xd1, 0x18, 0x35, 0xd5, 0x06, 0x17, 0x8d, + 0x8b, 0x44, 0xd0, 0x8d, 0xb3, 0x51, 0x83, 0x0e, 0x36, 0x23, 0x22, 0x41, 0x10, 0xdc, 0x14, 0xd5, + 0x49, 0x4d, 0xba, 0x48, 0x57, 0xaa, 0xa9, 0x4a, 0x8f, 0x9d, 0x0f, 0x70, 0xe3, 0x42, 0xfc, 0x04, + 0x17, 0x7e, 0x80, 0x9f, 0x31, 0xcb, 0x59, 0x8a, 0x8b, 0x20, 0xdd, 0x0b, 0x5d, 0xe7, 0x0b, 0x24, + 0x95, 0xf4, 0xb4, 0xf1, 0x01, 0xb3, 0x09, 0xf7, 0x9e, 0x73, 0xee, 0xc9, 0xa1, 0xee, 0x85, 0xe8, + 0x90, 0x30, 0x99, 0x4b, 0x96, 0xc6, 0x5e, 0x42, 0x73, 0x35, 0x22, 0x92, 0x7a, 0x13, 0x22, 0x09, + 0x57, 0xee, 0x44, 0x8a, 0x4c, 0x18, 0xc6, 0xa9, 0xc0, 0x5d, 0x0a, 0xac, 0x2e, 0xe1, 0x2c, 0x15, + 0x9e, 0xfe, 0xd6, 0x32, 0xeb, 0x72, 0x2c, 0x62, 0xa1, 0x4b, 0xaf, 0xaa, 0x6a, 0xd4, 0xf9, 0xbc, + 0x01, 0x37, 0x5f, 0x6a, 0x37, 0xe3, 0x3e, 0x84, 0x09, 0xcd, 0x31, 0x9d, 0x4d, 0x98, 0xcc, 0x4d, + 0xd0, 0x03, 0xfd, 0x75, 0x7f, 0xb7, 0x2c, 0x50, 0x37, 0x27, 0x7c, 0xbc, 0xe7, 0xac, 0x38, 0x27, + 0xd8, 0x4a, 0x68, 0xfe, 0x54, 0xd7, 0xc6, 0x23, 0xb8, 0xc3, 0x59, 0xca, 0xf8, 0x94, 0xe3, 0xa1, + 0x48, 0x23, 0x1a, 0x99, 0xe7, 0xf4, 0xe4, 0xb5, 0xb2, 0x40, 0xbb, 0xf5, 0x64, 0x9b, 0x77, 0x82, + 0x0b, 0x0d, 0xe0, 0xeb, 0xde, 0xf0, 0xe1, 0x45, 0x4e, 0x66, 0x98, 0x45, 0x63, 0x1a, 0xe1, 0xe1, + 0x58, 0x84, 0x89, 0xb9, 0xa6, 0x2d, 0xac, 0xb2, 0x40, 0x57, 0x1a, 0x8b, 0xb6, 0xa0, 0xf2, 0x20, + 0xb3, 0x41, 0x05, 0xf8, 0x55, 0x6f, 0x0c, 0x60, 0x37, 0x93, 0x53, 0x95, 0xd1, 0x08, 0x93, 0x28, + 0x92, 0x54, 0x29, 0xaa, 0xcc, 0xf5, 0xde, 0x5a, 0x7f, 0xcb, 0xbf, 0x51, 0x16, 0xc8, 0xac, 0x5d, + 0xfe, 0x92, 0x38, 0xc1, 0xa5, 0x06, 0x7b, 0xbc, 0x84, 0x8c, 0x77, 0x00, 0x5a, 0x6a, 0x4c, 0xd4, + 0x08, 0x1f, 0x4a, 0x12, 0x66, 0x4c, 0xa4, 0x38, 0x15, 0x78, 0xf9, 0xb2, 0xe6, 0x46, 0x0f, 0xf4, + 0xb7, 0xfd, 0x67, 0xc7, 0x05, 0xea, 0x7c, 0x2b, 0xd0, 0xf5, 0x50, 0x28, 0x2e, 0x94, 0x8a, 0x12, + 0x97, 0x09, 0x8f, 0x93, 0x6c, 0xe4, 0x3e, 0xa7, 0x31, 0x09, 0xf3, 0x27, 0x34, 0x2c, 0x0b, 0x74, + 0xab, 0xfe, 0xef, 0xff, 0xed, 0x9c, 0xe0, 0xaa, 0x26, 0xf7, 0x1b, 0xee, 0x85, 0x38, 0x68, 0x18, + 0xe3, 0x03, 0x80, 0x37, 0xff, 0x18, 0x7c, 0x2b, 0x45, 0x1a, 0xaf, 0xa2, 0x6c, 0xea, 0x28, 0x07, + 0x67, 0x8b, 0x72, 0xfb, 0x9f, 0x51, 0xda, 0x8e, 0x4e, 0x60, 0xb5, 0xd2, 0xbc, 0xae, 0xd8, 0xd3, + 0x40, 0x0f, 0xe1, 0x0e, 0x39, 0x8a, 0xeb, 0x05, 0xe0, 0x8c, 0x71, 0x6a, 0x9e, 0xef, 0x81, 0x3e, + 0xf8, 0x7d, 0xd3, 0x6d, 0xde, 0x09, 0xb6, 0xc9, 0x51, 0xac, 0x17, 0xf4, 0x8a, 0x71, 0xba, 0xf7, + 0xe0, 0xe7, 0x27, 0x04, 0xde, 0xff, 0xf8, 0x72, 0xe7, 0x6e, 0xcc, 0xb2, 0xd1, 0x74, 0xe8, 0x86, + 0x82, 0x7b, 0xfb, 0x84, 0x49, 0x3d, 0xe2, 0xad, 0xee, 0x7c, 0xb6, 0xba, 0xf4, 0xfa, 0x36, 0xfd, + 0xc1, 0xf1, 0xdc, 0x06, 0x27, 0x73, 0x1b, 0x7c, 0x9f, 0xdb, 0xe0, 0xe3, 0xc2, 0xee, 0x9c, 0x2c, + 0xec, 0xce, 0xd7, 0x85, 0xdd, 0x79, 0xe3, 0x9d, 0xdd, 0x2b, 0xcb, 0x27, 0x54, 0x0d, 0x37, 0xf5, + 0xe1, 0xdf, 0xfb, 0x15, 0x00, 0x00, 0xff, 0xff, 0x7d, 0x34, 0xc7, 0x65, 0x58, 0x03, 0x00, 0x00, } func (this *Params) Equal(that interface{}) bool { @@ -215,10 +214,10 @@ func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { var l int _ = l if m.AvgBlockTime != 0 { - i -= 4 - encoding_binary.LittleEndian.PutUint32(dAtA[i:], uint32(math.Float32bits(float32(m.AvgBlockTime)))) + i -= 8 + encoding_binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.AvgBlockTime)))) i-- - dAtA[i] = 0x3d + dAtA[i] = 0x39 } { size := m.SlashFractionWrongKeyshare.Size() @@ -304,7 +303,7 @@ func (m *Params) Size() (n int) { l = m.SlashFractionWrongKeyshare.Size() n += 1 + l + sovParams(uint64(l)) if m.AvgBlockTime != 0 { - n += 5 + n += 9 } return n } @@ -500,16 +499,16 @@ func (m *Params) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 7: - if wireType != 5 { + if wireType != 1 { return fmt.Errorf("proto: wrong wireType = %d for field AvgBlockTime", wireType) } - var v uint32 - if (iNdEx + 4) > l { + var v uint64 + if (iNdEx + 8) > l { return io.ErrUnexpectedEOF } - v = uint32(encoding_binary.LittleEndian.Uint32(dAtA[iNdEx:])) - iNdEx += 4 - m.AvgBlockTime = float32(math.Float32frombits(v)) + v = uint64(encoding_binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + m.AvgBlockTime = float64(math.Float64frombits(v)) default: iNdEx = preIndex skippy, err := skipParams(dAtA[iNdEx:]) diff --git a/x/keyshare/types/params_test.go b/x/keyshare/types/params_test.go new file mode 100644 index 00000000..974e8e4a --- /dev/null +++ b/x/keyshare/types/params_test.go @@ -0,0 +1,72 @@ +package types_test + +import ( + "math" + "testing" + + sdkmath "cosmossdk.io/math" + "github.com/stretchr/testify/require" + + "github.com/Fairblock/fairyring/x/keyshare/types" +) + +func TestParamsValidate(t *testing.T) { + tests := []struct { + name string + mutate func(*types.Params) + expErrMsg string + }{ + {name: "default params are valid"}, + { + name: "zero key expiry", + mutate: func(params *types.Params) { params.KeyExpiry = 0 }, + expErrMsg: "key expiry must be greater than 0", + }, + { + name: "zero minimum bonded", + mutate: func(params *types.Params) { params.MinimumBonded = 0 }, + expErrMsg: "minimum bonded amount must be greater than 0", + }, + { + name: "zero max idled block", + mutate: func(params *types.Params) { params.MaxIdledBlock = 0 }, + expErrMsg: "max idled block must be greater than 0", + }, + { + name: "zero no-keyshare slash fraction", + mutate: func(params *types.Params) { params.SlashFractionNoKeyshare = sdkmath.LegacyZeroDec() }, + expErrMsg: "expected value between 0 and 1", + }, + { + name: "wrong-keyshare slash fraction above one", + mutate: func(params *types.Params) { params.SlashFractionWrongKeyshare = sdkmath.LegacyNewDec(2) }, + expErrMsg: "expected value between 0 and 1", + }, + { + name: "zero average block time", + mutate: func(params *types.Params) { params.AvgBlockTime = 0 }, + expErrMsg: "average block time must be a finite value greater than 0", + }, + { + name: "NaN average block time", + mutate: func(params *types.Params) { params.AvgBlockTime = math.NaN() }, + expErrMsg: "average block time must be a finite value greater than 0", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + params := types.DefaultParams() + if tt.mutate != nil { + tt.mutate(¶ms) + } + + err := params.Validate() + if tt.expErrMsg == "" { + require.NoError(t, err) + return + } + require.ErrorContains(t, err, tt.expErrMsg) + }) + } +} From 392d555b3911acf281ddc125ed36d7a30bece7e5 Mon Sep 17 00:00:00 2001 From: ap0calypse644 Date: Fri, 5 Jun 2026 16:09:00 +0530 Subject: [PATCH 40/42] updating authority of pep and keyshare modules --- app/authority_test.go | 39 +++++++++++++++++++++++++++++++++++++++ app/keyshare.go | 3 ++- app/pep.go | 3 ++- 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 app/authority_test.go diff --git a/app/authority_test.go b/app/authority_test.go new file mode 100644 index 00000000..9bce57ac --- /dev/null +++ b/app/authority_test.go @@ -0,0 +1,39 @@ +package app_test + +import ( + "testing" + + "cosmossdk.io/log" + cmtproto "github.com/cometbft/cometbft/proto/tendermint/types" + dbm "github.com/cosmos/cosmos-db" + "github.com/cosmos/cosmos-sdk/client/flags" + simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + "github.com/stretchr/testify/require" + + "github.com/Fairblock/fairyring/app" +) + +// TestCustomModuleAuthoritiesUseGovModuleAccount prevents the custom modules +// from being wired to their own module accounts. MsgUpdateParams proposals are +// executed by x/gov, so PEP and keyshare must accept the x/gov module account as +// their keeper authority. ZKP derives the same default from its params. +func TestCustomModuleAuthoritiesUseGovModuleAccount(t *testing.T) { + db := dbm.NewMemDB() + t.Cleanup(func() { require.NoError(t, db.Close()) }) + + appOpts := simtestutil.AppOptionsMap{ + flags.FlagHome: t.TempDir(), + } + + fairyringApp, err := app.New(log.NewNopLogger(), db, nil, false, appOpts) + require.NoError(t, err) + + expected := authtypes.NewModuleAddress(govtypes.ModuleName).String() + require.Equal(t, expected, fairyringApp.PepKeeper.GetAuthority()) + require.Equal(t, expected, fairyringApp.KeyshareKeeper.GetAuthority()) + + ctx := fairyringApp.NewContextLegacy(false, cmtproto.Header{}) + require.Equal(t, expected, fairyringApp.ZkpKeeper.GetAuthority(ctx)) +} diff --git a/app/keyshare.go b/app/keyshare.go index b07ec92b..29921ba6 100644 --- a/app/keyshare.go +++ b/app/keyshare.go @@ -7,6 +7,7 @@ import ( keysharemoduletypes "github.com/Fairblock/fairyring/x/keyshare/types" "github.com/cosmos/cosmos-sdk/runtime" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" ibcfee "github.com/cosmos/ibc-go/v8/modules/apps/29-fee" porttypes "github.com/cosmos/ibc-go/v8/modules/core/05-port/types" ) @@ -29,7 +30,7 @@ func (app *App) registerKeyshareModule() (porttypes.IBCModule, error) { app.AppCodec(), runtime.NewKVStoreService(app.GetKey(keysharemoduletypes.StoreKey)), app.Logger(), - authtypes.NewModuleAddress(keysharemoduletypes.ModuleName).String(), + authtypes.NewModuleAddress(govtypes.ModuleName).String(), app.GetIBCKeeper, scopedKeyshareKeeper, app.AccountKeeper, diff --git a/app/pep.go b/app/pep.go index f1ea1aee..3134355a 100644 --- a/app/pep.go +++ b/app/pep.go @@ -8,6 +8,7 @@ import ( peptypes "github.com/Fairblock/fairyring/x/pep/types" "github.com/cosmos/cosmos-sdk/runtime" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" ibcfee "github.com/cosmos/ibc-go/v8/modules/apps/29-fee" porttypes "github.com/cosmos/ibc-go/v8/modules/core/05-port/types" ) @@ -31,7 +32,7 @@ func (app *App) registerPepModule() (porttypes.IBCModule, error) { app.AppCodec(), runtime.NewKVStoreService(app.GetKey(peptypes.StoreKey)), app.Logger(), - authtypes.NewModuleAddress(peptypes.ModuleName).String(), + authtypes.NewModuleAddress(govtypes.ModuleName).String(), app.GetIBCKeeper, scopedPepKeeper, app.AccountKeeper, From ea5535ac9d34061117ce7691bd51b7764d57105b Mon Sep 17 00:00:00 2001 From: YadlaMani Date: Mon, 8 Jun 2026 14:51:28 +0530 Subject: [PATCH 41/42] fix-tests --- app/authority_test.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/authority_test.go b/app/authority_test.go index 9bce57ac..753db2f0 100644 --- a/app/authority_test.go +++ b/app/authority_test.go @@ -8,6 +8,7 @@ import ( dbm "github.com/cosmos/cosmos-db" "github.com/cosmos/cosmos-sdk/client/flags" simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" + sdk "github.com/cosmos/cosmos-sdk/types" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" "github.com/stretchr/testify/require" @@ -15,6 +16,11 @@ import ( "github.com/Fairblock/fairyring/app" ) +func init() { + config := sdk.GetConfig() + config.SetBech32PrefixForAccount(app.AccountAddressPrefix, app.AccountAddressPrefix+"pub") +} + // TestCustomModuleAuthoritiesUseGovModuleAccount prevents the custom modules // from being wired to their own module accounts. MsgUpdateParams proposals are // executed by x/gov, so PEP and keyshare must accept the x/gov module account as @@ -27,13 +33,13 @@ func TestCustomModuleAuthoritiesUseGovModuleAccount(t *testing.T) { flags.FlagHome: t.TempDir(), } - fairyringApp, err := app.New(log.NewNopLogger(), db, nil, false, appOpts) + fairyringApp, err := app.New(log.NewNopLogger(), db, nil, true, appOpts) require.NoError(t, err) expected := authtypes.NewModuleAddress(govtypes.ModuleName).String() require.Equal(t, expected, fairyringApp.PepKeeper.GetAuthority()) require.Equal(t, expected, fairyringApp.KeyshareKeeper.GetAuthority()) - ctx := fairyringApp.NewContextLegacy(false, cmtproto.Header{}) + ctx := fairyringApp.NewUncachedContext(false, cmtproto.Header{}) require.Equal(t, expected, fairyringApp.ZkpKeeper.GetAuthority(ctx)) } From f87fc1bdb174d0a9a46ecbb7c51d60dc517ffc59 Mon Sep 17 00:00:00 2001 From: ap0calypse644 Date: Wed, 1 Jul 2026 17:16:43 +0530 Subject: [PATCH 42/42] updating storage structure of encrypted txs --- app/voteext.go | 15 + scripts/devnet/start.sh | 2 +- scripts/tests/ve_tests/multi_val.sh | 145 ++++++++- .../start_fairyring_ve_with_keyshare.sh | 154 ++++++++- x/keyshare/keeper/blockwise_vote_ext.go | 23 ++ x/pep/keeper/encrypted_tx.go | 299 +++++++++++++----- x/pep/keeper/encrypted_tx_test.go | 23 ++ x/pep/keeper/gen_enc_tx.go | 237 +++++++++++--- x/pep/keeper/gen_enc_tx_test.go | 35 +- x/pep/keeper/query_encrypted_tx.go | 86 +++-- x/pep/keeper/query_general_identity.go | 6 +- x/pep/types/key_encrypted_tx.go | 74 +++++ 12 files changed, 944 insertions(+), 155 deletions(-) diff --git a/app/voteext.go b/app/voteext.go index f65f7b32..77d077c1 100644 --- a/app/voteext.go +++ b/app/voteext.go @@ -31,6 +31,7 @@ func (app *App) extendVoteHandler(cfg keysharer.Config) sdk.ExtendVoteHandler { // Load state activePK, ok := app.KeyshareKeeper.GetActivePubkey(ctx) if !ok { + app.Logger().Info("KeyshareVE/ExtendVote: no active pubkey yet") return &abci.ResponseExtendVote{}, nil } var qpk keysharetypes.QueuedPubkey @@ -51,6 +52,8 @@ func (app *App) extendVoteHandler(cfg keysharer.Config) sdk.ExtendVoteHandler { } b, derr := keysharer.DecryptECIES(priv, ek.Data) if derr != nil { + app.Logger().Error("KeyshareVE/ExtendVote: failed to decrypt active encrypted keyshare", + "validator", cfg.ValidatorAccount, "err", derr) return &abci.ResponseExtendVote{}, nil } mat.ActiveShare = b @@ -70,12 +73,21 @@ func (app *App) extendVoteHandler(cfg keysharer.Config) sdk.ExtendVoteHandler { if mat.Index == 0 { mat.Index = uint32(i + 1) } + } else { + app.Logger().Error("KeyshareVE/ExtendVote: failed to decrypt queued encrypted keyshare", + "validator", cfg.ValidatorAccount, "err", derr) } break } } } if mat.Index == 0 || len(mat.ActiveShare) == 0 { + app.Logger().Info("KeyshareVE/ExtendVote: no decryptable active keyshare for validator", + "validator", cfg.ValidatorAccount, + "active_encrypted_keyshares", len(activePK.EncryptedKeyshares), + "queued_encrypted_keyshares", len(qpk.EncryptedKeyshares), + "active_expiry", activePK.Expiry, + "queued_expiry", qpk.Expiry) return &abci.ResponseExtendVote{}, nil } @@ -86,16 +98,19 @@ func (app *App) extendVoteHandler(cfg keysharer.Config) sdk.ExtendVoteHandler { scalar, idx, err := keysharer.SelectShare(mat, heightFor) if err != nil { + app.Logger().Error("KeyshareVE/ExtendVote: SelectShare failed", "height_for", heightFor, "err", err) return &abci.ResponseExtendVote{}, nil } extracted, err := keysharer.ExtractFromShare(scalar, idx, []byte(strconv.FormatUint(heightFor, 10))) if err != nil { + app.Logger().Error("KeyshareVE/ExtendVote: ExtractFromShare failed", "height_for", heightFor, "idx", idx, "err", err) return &abci.ResponseExtendVote{}, nil } ext, err := keysharer.MakeVE(heightFor, idx, extracted) if err != nil { + app.Logger().Error("KeyshareVE/ExtendVote: MakeVE failed", "height_for", heightFor, "idx", idx, "err", err) return &abci.ResponseExtendVote{}, nil } diff --git a/scripts/devnet/start.sh b/scripts/devnet/start.sh index ff65f932..b7808deb 100755 --- a/scripts/devnet/start.sh +++ b/scripts/devnet/start.sh @@ -252,7 +252,7 @@ $BINARY genesis add-genesis-account $WALLET2_ADDR 1000000000000ufair --home $CHA $BINARY genesis add-genesis-account $WALLET3_ADDR 1000000000000ufair --vesting-amount 1000000000000ufair --vesting-start-time $(date +%s) --vesting-end-time $(($(date '+%s') + 100000023)) --home $CHAIN_DIR/$CHAINID --keyring-backend test $BINARY genesis add-genesis-account $WALLET4_ADDR 1000000000000ufair --vesting-amount 1000000000000ufair --vesting-start-time $(date +%s) --vesting-end-time $(($(date '+%s') + 100000023)) --home $CHAIN_DIR/$CHAINID --keyring-backend test $BINARY genesis add-genesis-account $WALLET5_ADDR 1000000000000ufair --home $CHAIN_DIR/$CHAINID --keyring-backend test -$BINARY genesis add-genesis-account $WALLET6_ADDR 100000000000000ufair --home $CHAIN_DIR/$CHAINID --keyring-backend test +$BINARY genesis add-genesis-account $WALLET6_ADDR 10000000000000000ufair --home $CHAIN_DIR/$CHAINID --keyring-backend test $BINARY genesis add-genesis-account $RLY1_ADDR 1000000000000ufair --home $CHAIN_DIR/$CHAINID --keyring-backend test echo "Creating and collecting gentx..." diff --git a/scripts/tests/ve_tests/multi_val.sh b/scripts/tests/ve_tests/multi_val.sh index f2e46f42..e3bdebc0 100755 --- a/scripts/tests/ve_tests/multi_val.sh +++ b/scripts/tests/ve_tests/multi_val.sh @@ -130,6 +130,24 @@ mnemonic_for_node() { app_priv_for_node() { local i="$1" + local idx=$((i-1)) + local home="${HOME_DIRS[$idx]}" + local keyname="${KEY_NAMES[$idx]}" + local exported="" + + # Prefer the actual local keyring private key. The hard-coded APP_PRIV_HEX_* + # values are only fallbacks; if they drift from the mnemonic/keyring, + # validators will emit empty VEs because they cannot decrypt their shares. + exported=$(echo y | fairyringd keys export "${keyname}" \ + --home "${home}" \ + --unsafe --unarmored-hex \ + --keyring-backend "${KEYRING_BACKEND}" 2>/dev/null | tail -n 1 | tr -d '\r\n' || true) + + if [[ -n "${exported}" ]]; then + echo "${exported}" + return 0 + fi + case "$i" in 1) echo "$APP_PRIV_HEX_1" ;; 2) echo "$APP_PRIV_HEX_2" ;; @@ -507,6 +525,124 @@ extract_registered_validator_addr() { echo "$addr" } +wait_for_keyshare_decryption_key() { + local deadline h keys_json + deadline=$(( $(date +%s) + BLOCK_TIMEOUT )) + echo ">> Waiting for a VE-aggregated keyshare decryption key..." >&2 + + while true; do + keys_json=$(fairyringd q keyshare list-decryption-keys \ + --home "${HOME_DIRS[0]}" \ + --chain-id "$CHAIN_ID" \ + --node "$NODE1_RPC_TCP" \ + -o json 2>/dev/null || true) + + h=$(echo "${keys_json:-{}}" | jq -r '(.decryption_keys // []) | if length == 0 then empty else max_by(.height|tonumber).height end' 2>/dev/null || true) + if [[ -n "${h}" && "${h}" != "null" ]]; then + echo ">> ✅ Found keyshare decryption key at height ${h}" >&2 + echo "${h}" + return 0 + fi + + if (( $(date +%s) > deadline )); then + echo "ERROR: Timed out waiting for a keyshare decryption key." >&2 + fairyringd q keyshare list-decryption-keys --home "${HOME_DIRS[0]}" --chain-id "$CHAIN_ID" --node "$NODE1_RPC_TCP" -o json || true + exit 1 + fi + sleep 1 + done +} + +assert_pep_decryption_key_mirror() { + local height keyshare_key pep_latest + height=$(wait_for_keyshare_decryption_key) + + echo ">> Querying x/keyshare decryption key at height ${height}..." + keyshare_key=$(fairyringd q keyshare show-decryption-key "${height}" \ + --home "${HOME_DIRS[0]}" \ + --chain-id "$CHAIN_ID" \ + --node "$NODE1_RPC_TCP" \ + -o json | jq -r '.decryption_key.data // empty') + + if [[ -z "${keyshare_key}" ]]; then + echo "ERROR: x/keyshare decryption key at height ${height} is empty." >&2 + exit 1 + fi + + echo ">> Querying x/pep latest-height to confirm VE key mirror..." + pep_latest=$(fairyringd q pep latest-height \ + --home "${HOME_DIRS[0]}" \ + --chain-id "$CHAIN_ID" \ + --node "$NODE1_RPC_TCP" \ + -o json | jq -r '.height | tonumber') + + if (( pep_latest < height )); then + echo "ERROR: x/pep latest-height was not updated by VE aggregation. keyshare_height=${height}, pep_latest_height=${pep_latest}" >&2 + exit 1 + fi + + echo ">> ✅ x/pep mirror check passed: pep latest-height=${pep_latest}, keyshare decryption-key height=${height}" +} + +write_sharegenerationclient_config() { + local cfg="${BASE_HOME}/sharegenerationclient_config.yml" + local wallet_priv="" + + wallet_priv=$(echo y | fairyringd keys export wallet1 \ + --home "${HOME_DIRS[0]}" \ + --unsafe --unarmored-hex \ + --keyring-backend "${KEYRING_BACKEND}" 2>/dev/null | tail -n 1 | tr -d '\r\n' || true) + + if [[ -z "${wallet_priv}" ]]; then + echo "ERROR: Could not export wallet1 private key for ShareGenerationClient config." >&2 + exit 1 + fi + + cat > "${cfg}" <> Waiting for x/keyshare active pubkey from ShareGenerationClient..." + + while true; do + out=$(fairyringd q keyshare show-active-pub-key \ + --home "${HOME_DIRS[0]}" \ + --chain-id "$CHAIN_ID" \ + --node "$NODE1_RPC_TCP" \ + -o json 2>/dev/null || true) + + pubkey=$(echo "${out:-{}}" | jq -r '.active_pubkey.public_key // empty' 2>/dev/null || true) + if [[ -n "${pubkey}" ]]; then + echo ">> ✅ Active keyshare pubkey is available." + return 0 + fi + + if (( $(date +%s) > deadline )); then + echo "ERROR: Timed out waiting for x/keyshare active pubkey." >&2 + echo ">> ShareGenerationClient log tail:" >&2 + tail -n 120 "${BASE_HOME}/sharegenerationclient.log" >&2 || true + echo ">> Current x/keyshare active pubkey query:" >&2 + fairyringd q keyshare show-active-pub-key --home "${HOME_DIRS[0]}" --chain-id "$CHAIN_ID" --node "$NODE1_RPC_TCP" -o json >&2 || true + exit 1 + fi + sleep 1 + done +} + register_all_validators_keyshare() { echo ">> Registering all validators in keyshare module..." for i in $(seq 1 $NODE_COUNT); do @@ -563,10 +699,13 @@ main() { register_all_validators_keyshare echo ">> Starting ShareGenerationClient..." + local sgc_cfg + sgc_cfg=$(write_sharegenerationclient_config) ShareGenerationClient start \ - --config /home/grider644/go/src/github.com/FairBlock/fairyring/scripts/devnet/sharegenerationclient_config.yml \ + --config "${sgc_cfg}" \ > "${BASE_HOME}/sharegenerationclient.log" 2>&1 & - sleep $BLOCK_TIME + + wait_for_active_pubkey # Ensure we cross VE activation local pre=$(( VE_HEIGHT - 1 )) @@ -584,6 +723,8 @@ main() { grep -E 'KeyshareVE/' -n "${HOME_DIRS[$idx]}/logs/node.log" | tail -n 120 || true done + assert_pep_decryption_key_mirror + echo ">> Test complete." } diff --git a/scripts/tests/ve_tests/start_fairyring_ve_with_keyshare.sh b/scripts/tests/ve_tests/start_fairyring_ve_with_keyshare.sh index f4224991..d7f4d099 100755 --- a/scripts/tests/ve_tests/start_fairyring_ve_with_keyshare.sh +++ b/scripts/tests/ve_tests/start_fairyring_ve_with_keyshare.sh @@ -58,9 +58,10 @@ VAL_ADDR="" WALLET_MNEMONIC_1="sleep garage unaware monster slide cruel barely blade sudden basic review mimic screen box human wing ritual use smooth ripple tuna ostrich pony eye" WALLET1_ADDR="" -# App private key hex for keysharer.yaml (developer must set the correct one) -# If empty, VE submissions might not include decrypted shares; blocks will still continue. -APP_PRIV_HEX="${APP_PRIV_HEX:-823ad58093b111e3c41369ca67103cba89e136995bdbd8a86c6b7eef9ca38b00}" +# App private key hex for keysharer.yaml. If APP_PRIV_HEX is not set, +# the script derives it from the validator keyring. +APP_PRIV_HEX="${APP_PRIV_HEX:-}" +APP_PRIV_HEX_FALLBACK="${APP_PRIV_HEX_FALLBACK:-823ad58093b111e3c41369ca67103cba89e136995bdbd8a86c6b7eef9ca38b00}" # Verification parameters STARTUP_TIMEOUT="${STARTUP_TIMEOUT:-60}" @@ -242,13 +243,23 @@ init_chain() { echo ">> Setting minimum-gas-prices = ${GAS_PRICE}" sed -i.bak -E "s|^minimum-gas-prices = \".*\"|minimum-gas-prices = \"${GAS_PRICE}\"|g" "${APP_TOML}" || true - # Write keysharer.yaml with APP_PRIV_HEX as-is (no derivation attempts) - echo ">> Writing keysharer.yaml (uses APP_PRIV_HEX as provided)" + local app_priv_hex="${APP_PRIV_HEX}" + if [[ -z "${app_priv_hex}" ]]; then + app_priv_hex=$(echo y | fairyringd keys export validator \ + --home "${HOME_DIR}" \ + --unsafe --unarmored-hex \ + --keyring-backend test 2>/dev/null | tail -n 1 | tr -d '\r\n' || true) + fi + if [[ -z "${app_priv_hex}" ]]; then + app_priv_hex="${APP_PRIV_HEX_FALLBACK}" + fi + + echo ">> Writing keysharer.yaml" mkdir -p "${HOME_DIR}/config" cat > "${HOME_DIR}/keysharer.yaml" </dev/null | tail -n 1 | tr -d '\r\n' || true) + + if [[ -z "${wallet_priv}" ]]; then + echo "ERROR: Could not export wallet1 private key for ShareGenerationClient config." >&2 + exit 1 + fi + + cat > "${cfg}" <> Waiting for x/keyshare active pubkey from ShareGenerationClient..." + + while true; do + out=$(fairyringd q keyshare show-active-pub-key \ + --home "$HOME_DIR" \ + --chain-id "$CHAIN_ID" \ + --node "$RPC_LADDR" \ + -o json 2>/dev/null || true) + + pubkey=$(echo "${out:-{}}" | jq -r '.active_pubkey.public_key // empty' 2>/dev/null || true) + if [[ -n "${pubkey}" ]]; then + echo ">> ✅ Active keyshare pubkey is available." + return 0 + fi + + if (( $(date +%s) > deadline )); then + echo "ERROR: Timed out waiting for x/keyshare active pubkey." >&2 + echo ">> ShareGenerationClient log tail:" >&2 + tail -n 120 "${HOME_DIR}/sharegenerationclient.log" >&2 || true + echo ">> Current x/keyshare active pubkey query:" >&2 + fairyringd q keyshare show-active-pub-key --home "$HOME_DIR" --chain-id "$CHAIN_ID" --node "$RPC_LADDR" -o json >&2 || true + exit 1 + fi + sleep 1 + done +} + +wait_for_keyshare_decryption_key() { + local deadline h keys_json + deadline=$(( $(date +%s) + BLOCK_TIMEOUT )) + echo ">> Waiting for a VE-aggregated keyshare decryption key..." >&2 + + while true; do + keys_json=$(fairyringd q keyshare list-decryption-keys \ + --home "$HOME_DIR" \ + --chain-id "$CHAIN_ID" \ + --node "$RPC_LADDR" \ + -o json 2>/dev/null || true) + + h=$(echo "${keys_json:-{}}" | jq -r '(.decryption_keys // []) | if length == 0 then empty else max_by(.height|tonumber).height end' 2>/dev/null || true) + if [[ -n "${h}" && "${h}" != "null" ]]; then + echo ">> ✅ Found keyshare decryption key at height ${h}" >&2 + echo "${h}" + return 0 + fi + + if (( $(date +%s) > deadline )); then + echo "ERROR: Timed out waiting for a keyshare decryption key." >&2 + fairyringd q keyshare list-decryption-keys --home "$HOME_DIR" --chain-id "$CHAIN_ID" --node "$RPC_LADDR" -o json || true + exit 1 + fi + sleep 1 + done +} + +assert_pep_decryption_key_mirror() { + local height keyshare_key pep_latest + height=$(wait_for_keyshare_decryption_key) + + echo ">> Querying x/keyshare decryption key at height ${height}..." + keyshare_key=$(fairyringd q keyshare show-decryption-key "${height}" \ + --home "$HOME_DIR" \ + --chain-id "$CHAIN_ID" \ + --node "$RPC_LADDR" \ + -o json | jq -r '.decryption_key.data // empty') + + if [[ -z "${keyshare_key}" ]]; then + echo "ERROR: x/keyshare decryption key at height ${height} is empty." >&2 + exit 1 + fi + + echo ">> Querying x/pep latest-height to confirm VE key mirror..." + pep_latest=$(fairyringd q pep latest-height \ + --home "$HOME_DIR" \ + --chain-id "$CHAIN_ID" \ + --node "$RPC_LADDR" \ + -o json | jq -r '.height | tonumber') + + if (( pep_latest < height )); then + echo "ERROR: x/pep latest-height was not updated by VE aggregation. keyshare_height=${height}, pep_latest_height=${pep_latest}" >&2 + exit 1 + fi + + echo ">> ✅ x/pep mirror check passed: pep latest-height=${pep_latest}, keyshare decryption-key height=${height}" +} + main() { kill_existing prep_home @@ -390,8 +524,10 @@ main() { fi echo "Starting ShareGenerationClient..." - ShareGenerationClient start --config /home/grider644/go/src/github.com/FairBlock/fairyring/scripts/devnet/sharegenerationclient_config.yml > $HOME_DIR/sharegenerationclient.log 2>&1 & - sleep $BLOCK_TIME + SGC_CFG=$(write_sharegenerationclient_config) + ShareGenerationClient start --config "${SGC_CFG}" > $HOME_DIR/sharegenerationclient.log 2>&1 & + + wait_for_active_pubkey # Ensure we cross VE activation pre=$(( VE_HEIGHT - 1 )) @@ -406,6 +542,8 @@ main() { echo ">> KeyshareVE trace (last 200 lines)…" grep -E 'KeyshareVE/' -n "${HOME_DIR}/logs/node.log" | tail -n 200 + assert_pep_decryption_key_mirror + echo ">> Test complete; shutting down node." kill_existing } diff --git a/x/keyshare/keeper/blockwise_vote_ext.go b/x/keyshare/keeper/blockwise_vote_ext.go index 3a36c0b0..8822b417 100644 --- a/x/keyshare/keeper/blockwise_vote_ext.go +++ b/x/keyshare/keeper/blockwise_vote_ext.go @@ -7,6 +7,7 @@ import ( "cosmossdk.io/math" distIBE "github.com/FairBlock/DistributedIBE" "github.com/Fairblock/fairyring/x/keyshare/types" + peptypes "github.com/Fairblock/fairyring/x/pep/types" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/drand/kyber" bls "github.com/drand/kyber-bls12381" @@ -159,6 +160,28 @@ func (k Keeper) HandlePerBlockShare( }) k.SetDecryptionKeyLength(ctx, k.GetDecryptionKeyLength(ctx)+1) + // Mirror the aggregated blockwise key into PEP as well. + // PEP's BeginBlock executor reads blockwise decryption keys and latest height + // from the PEP keeper, while vote-extension aggregation stores the key in + // x/keyshare. The legacy MsgSendKeyshare path already did this mirror; keep + // the vote-extension path equivalent so SubmitEncryptedTx can execute. + k.pepKeeper.SetDecryptionKey(ctx, peptypes.DecryptionKey{ + Height: height, + Data: skHex, + }) + + latestHeight, err := strconv.ParseUint(k.pepKeeper.GetLatestHeight(ctx), 10, 64) + if err != nil { + latestHeight = 0 + } + + if latestHeight < height { + k.pepKeeper.SetLatestHeight(ctx, strconv.FormatUint(height, 10)) + } + + ctx.Logger().Info("KeyshareVE/HandlePerBlockShare: mirrored aggregated key to pep", + "height_for", height, "pep_latest_height", k.pepKeeper.GetLatestHeight(ctx)) + return nil } diff --git a/x/pep/keeper/encrypted_tx.go b/x/pep/keeper/encrypted_tx.go index 2cbfe6e7..2eb1aaf7 100644 --- a/x/pep/keeper/encrypted_tx.go +++ b/x/pep/keeper/encrypted_tx.go @@ -1,56 +1,162 @@ package keeper import ( + "bytes" "context" + "encoding/binary" + "sort" + "cosmossdk.io/store/prefix" storetypes "cosmossdk.io/store/types" "github.com/Fairblock/fairyring/x/pep/types" "github.com/cosmos/cosmos-sdk/runtime" - - "cosmossdk.io/store/prefix" ) -// AppendEncryptedTx append a specific encryptedTx in the store -func (k Keeper) AppendEncryptedTx( - ctx context.Context, - encryptedTx types.EncryptedTx, -) uint64 { +func uint64ToBytes(v uint64) []byte { + bz := make([]byte, 8) + binary.BigEndian.PutUint64(bz, v) + return bz +} + +func bytesToUint64(bz []byte) uint64 { + if len(bz) != 8 { + return 0 + } + return binary.BigEndian.Uint64(bz) +} + +func (k Keeper) encryptedTxStore(ctx context.Context) storetypes.KVStore { storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) - store := prefix.NewStore(storeAdapter, types.KeyPrefix(types.EncryptedTxKeyPrefix)) - var allTxsFromHeight types.EncryptedTxArray - b := store.Get(types.EncryptedTxAllFromHeightKey( - encryptedTx.TargetHeight, - )) + return prefix.NewStore(storeAdapter, types.KeyPrefix(types.EncryptedTxKeyPrefix)) +} + +func (k Keeper) getEncryptedTxCountWithoutMigration(ctx context.Context, height uint64) uint64 { + store := k.encryptedTxStore(ctx) + return bytesToUint64(store.Get(types.EncryptedTxCountKey(height))) +} + +func (k Keeper) getEncryptedTxCount(ctx context.Context, height uint64) uint64 { + k.migrateLegacyEncryptedTxBucket(ctx, height) + return k.getEncryptedTxCountWithoutMigration(ctx, height) +} + +func (k Keeper) setEncryptedTxCount(ctx context.Context, height uint64, count uint64) { + store := k.encryptedTxStore(ctx) + store.Set(types.EncryptedTxCountKey(height), uint64ToBytes(count)) +} + +func encryptedTxPrefixForHeight(height uint64) []byte { + return types.EncryptedTxAllFromHeightKey(height) +} + +func encryptedTxItemsPrefixForHeight(height uint64) []byte { + return append(encryptedTxPrefixForHeight(height), []byte("tx/")...) +} + +func isEncryptedTxItemKey(key []byte) bool { + // New encrypted tx item keys are: + // <8-byte height>/tx/<8-byte index>/ + // Count keys are: + // <8-byte height>/count/ + // Old array keys are: + // <8-byte height>/ + // Filtering by key shape avoids accidentally unmarshalling count bytes or old + // EncryptedTxArray bytes as a single EncryptedTx. + if len(key) != 8+1+3+8+1 { + return false + } + if key[8] != '/' { + return false + } + if !bytes.Equal(key[9:12], []byte("tx/")) { + return false + } + return key[len(key)-1] == '/' +} + +func isLegacyEncryptedTxArrayKey(key []byte) bool { + return len(key) == 8+1 && key[8] == '/' +} + +func heightFromEncryptedTxItemKey(key []byte) uint64 { + if len(key) < 8 { + return 0 + } + return binary.BigEndian.Uint64(key[:8]) +} - k.cdc.MustUnmarshal(b, &allTxsFromHeight) +func (k Keeper) migrateLegacyEncryptedTxBucket(ctx context.Context, height uint64) { + store := k.encryptedTxStore(ctx) + legacyKey := types.EncryptedTxAllFromHeightKey(height) + b := store.Get(legacyKey) + if b == nil { + return + } - encryptedTx.Index = uint64(len(allTxsFromHeight.GetEncryptedTxs())) + var arr types.EncryptedTxArray + if err := k.cdc.Unmarshal(b, &arr); err != nil { + return + } + + for i := range arr.EncryptedTxs { + tx := arr.EncryptedTxs[i] + tx.TargetHeight = height + tx.Index = uint64(i) + store.Set(types.EncryptedTxKey(height, tx.Index), k.cdc.MustMarshal(&tx)) + } + + if uint64(len(arr.EncryptedTxs)) > k.getEncryptedTxCountWithoutMigration(ctx, height) { + k.setEncryptedTxCount(ctx, height, uint64(len(arr.EncryptedTxs))) + } + store.Delete(legacyKey) +} - allTxsFromHeight.EncryptedTxs = append(allTxsFromHeight.EncryptedTxs, encryptedTx) +// AppendEncryptedTx appends a specific encryptedTx in the store. +// +// The old implementation stored all txs for a target height as one protobuf +// array under one KV key. That made the Nth submit read, unmarshal, marshal and +// rewrite all N txs for that height. Under concurrent submissions to the same +// target block, gas therefore rose with the bucket size and eventually failed in +// WritePerByte. +// +// This stores each accepted tx under its own deterministic height/index key and +// uses a tiny per-height counter to assign indexes. Execution order is preserved +// by later iterating/sorting by this accepted index. +func (k Keeper) AppendEncryptedTx( + ctx context.Context, + encryptedTx types.EncryptedTx, +) uint64 { + store := k.encryptedTxStore(ctx) - parsedEncryptedTxArr := k.cdc.MustMarshal(&allTxsFromHeight) + index := k.getEncryptedTxCount(ctx, encryptedTx.TargetHeight) + encryptedTx.Index = index - store.Set(types.EncryptedTxAllFromHeightKey( - encryptedTx.TargetHeight, - ), parsedEncryptedTxArr) + store.Set( + types.EncryptedTxKey(encryptedTx.TargetHeight, encryptedTx.Index), + k.cdc.MustMarshal(&encryptedTx), + ) + k.setEncryptedTxCount(ctx, encryptedTx.TargetHeight, index+1) return encryptedTx.Index } -// SetEncryptedTx add a specific encryptedTx in the store from its index +// SetEncryptedTx sets all encrypted txs for a height. This is mainly used by +// genesis import/tests, so rewrite the height bucket into per-tx keys. func (k Keeper) SetEncryptedTx( ctx context.Context, height uint64, encryptedTxArr types.EncryptedTxArray, ) { - storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) - store := prefix.NewStore(storeAdapter, types.KeyPrefix(types.EncryptedTxKeyPrefix)) - - parsedEncryptedTxArr := k.cdc.MustMarshal(&encryptedTxArr) - - store.Set(types.EncryptedTxAllFromHeightKey( - height, - ), parsedEncryptedTxArr) + k.RemoveAllEncryptedTxFromHeight(ctx, height) + + store := k.encryptedTxStore(ctx) + for i := range encryptedTxArr.EncryptedTxs { + tx := encryptedTxArr.EncryptedTxs[i] + tx.TargetHeight = height + tx.Index = uint64(i) + store.Set(types.EncryptedTxKey(height, tx.Index), k.cdc.MustMarshal(&tx)) + } + k.setEncryptedTxCount(ctx, height, uint64(len(encryptedTxArr.EncryptedTxs))) } func (k Keeper) SetEncryptedTxProcessedHeight( @@ -59,28 +165,43 @@ func (k Keeper) SetEncryptedTxProcessedHeight( index uint64, processedHeight uint64, ) { - arr := k.GetEncryptedTxAllFromHeight(ctx, height) - - if index >= uint64(len(arr.EncryptedTxs)) { + k.migrateLegacyEncryptedTxBucket(ctx, height) + store := k.encryptedTxStore(ctx) + key := types.EncryptedTxKey(height, index) + b := store.Get(key) + if b == nil { return } - arr.EncryptedTxs[index].ProcessedAtChainHeight = processedHeight - - k.SetEncryptedTx(ctx, height, arr) + var tx types.EncryptedTx + k.cdc.MustUnmarshal(b, &tx) + tx.ProcessedAtChainHeight = processedHeight + store.Set(key, k.cdc.MustMarshal(&tx)) } func (k Keeper) SetAllEncryptedTxExpired( ctx context.Context, height uint64, ) { - arr := k.GetEncryptedTxAllFromHeight(ctx, height) + k.migrateLegacyEncryptedTxBucket(ctx, height) + store := k.encryptedTxStore(ctx) + iterator := storetypes.KVStorePrefixIterator(store, encryptedTxItemsPrefixForHeight(height)) + defer iterator.Close() - for i := range arr.EncryptedTxs { - arr.EncryptedTxs[i].Expired = true + updates := make(map[string]types.EncryptedTx) + for ; iterator.Valid(); iterator.Next() { + var tx types.EncryptedTx + k.cdc.MustUnmarshal(iterator.Value(), &tx) + tx.Expired = true + + key := make([]byte, len(iterator.Key())) + copy(key, iterator.Key()) + updates[string(key)] = tx } - k.SetEncryptedTx(ctx, height, arr) + for key, tx := range updates { + store.Set([]byte(key), k.cdc.MustMarshal(&tx)) + } } // GetEncryptedTx returns a encryptedTx from its index @@ -88,73 +209,105 @@ func (k Keeper) GetEncryptedTx( ctx context.Context, targetHeight uint64, index uint64, - ) (val types.EncryptedTx, found bool) { - storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) - store := prefix.NewStore(storeAdapter, types.KeyPrefix(types.EncryptedTxKeyPrefix)) + k.migrateLegacyEncryptedTxBucket(ctx, targetHeight) + store := k.encryptedTxStore(ctx) - b := store.Get(types.EncryptedTxAllFromHeightKey( - targetHeight, - )) + b := store.Get(types.EncryptedTxKey(targetHeight, index)) if b == nil { return val, false } - var arr types.EncryptedTxArray - k.cdc.MustUnmarshal(b, &arr) - - if uint64(len(arr.GetEncryptedTxs())) <= index { - return val, false - } - - return arr.GetEncryptedTxs()[index], true + k.cdc.MustUnmarshal(b, &val) + return val, true } // GetEncryptedTxAllFromHeight returns all encryptedTx from the height provided func (k Keeper) GetEncryptedTxAllFromHeight( ctx context.Context, targetHeight uint64, - ) types.EncryptedTxArray { - storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) - store := prefix.NewStore(storeAdapter, types.KeyPrefix(types.EncryptedTxKeyPrefix)) + k.migrateLegacyEncryptedTxBucket(ctx, targetHeight) + store := k.encryptedTxStore(ctx) + iterator := storetypes.KVStorePrefixIterator(store, encryptedTxItemsPrefixForHeight(targetHeight)) + defer iterator.Close() - b := store.Get(types.EncryptedTxAllFromHeightKey( - targetHeight, - )) + arr := types.EncryptedTxArray{} + for ; iterator.Valid(); iterator.Next() { + var tx types.EncryptedTx + k.cdc.MustUnmarshal(iterator.Value(), &tx) + arr.EncryptedTxs = append(arr.EncryptedTxs, tx) + } - var arr types.EncryptedTxArray - k.cdc.MustUnmarshal(b, &arr) + sort.Slice(arr.EncryptedTxs, func(i, j int) bool { + return arr.EncryptedTxs[i].Index < arr.EncryptedTxs[j].Index + }) return arr } // GetAllEncryptedArray returns the list of all encrypted txs func (k Keeper) GetAllEncryptedArray(ctx context.Context) (arr []types.EncryptedTxArray) { - storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) - store := prefix.NewStore(storeAdapter, types.KeyPrefix(types.EncryptedTxKeyPrefix)) + store := k.encryptedTxStore(ctx) iterator := storetypes.KVStorePrefixIterator(store, []byte{}) - defer iterator.Close() + byHeight := map[uint64][]types.EncryptedTx{} + legacyArrays := make([]types.EncryptedTxArray, 0) for ; iterator.Valid(); iterator.Next() { - var val types.EncryptedTxArray - k.cdc.MustUnmarshal(iterator.Value(), &val) - arr = append(arr, val) + key := iterator.Key() + if isLegacyEncryptedTxArrayKey(key) { + var legacyArr types.EncryptedTxArray + if err := k.cdc.Unmarshal(iterator.Value(), &legacyArr); err == nil { + sort.Slice(legacyArr.EncryptedTxs, func(i, j int) bool { + return legacyArr.EncryptedTxs[i].Index < legacyArr.EncryptedTxs[j].Index + }) + legacyArrays = append(legacyArrays, legacyArr) + } + continue + } + if !isEncryptedTxItemKey(key) { + continue + } + + var tx types.EncryptedTx + k.cdc.MustUnmarshal(iterator.Value(), &tx) + height := heightFromEncryptedTxItemKey(key) + byHeight[height] = append(byHeight[height], tx) + } + + heights := make([]uint64, 0, len(byHeight)) + for height := range byHeight { + heights = append(heights, height) + } + sort.Slice(heights, func(i, j int) bool { return heights[i] < heights[j] }) + + for _, height := range heights { + txs := byHeight[height] + sort.Slice(txs, func(i, j int) bool { return txs[i].Index < txs[j].Index }) + arr = append(arr, types.EncryptedTxArray{EncryptedTxs: txs}) } + arr = append(arr, legacyArrays...) - return + return arr } // RemoveAllEncryptedTxFromHeight removes all encryptedTx from the store for a particular height func (k Keeper) RemoveAllEncryptedTxFromHeight( ctx context.Context, targetHeight uint64, - ) { - storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) - store := prefix.NewStore(storeAdapter, types.KeyPrefix(types.EncryptedTxKeyPrefix)) - store.Delete(types.EncryptedTxAllFromHeightKey( - targetHeight, - )) + store := k.encryptedTxStore(ctx) + iterator := storetypes.KVStorePrefixIterator(store, encryptedTxPrefixForHeight(targetHeight)) + defer iterator.Close() + + keys := make([][]byte, 0) + for ; iterator.Valid(); iterator.Next() { + key := make([]byte, len(iterator.Key())) + copy(key, iterator.Key()) + keys = append(keys, key) + } + for _, key := range keys { + store.Delete(key) + } } diff --git a/x/pep/keeper/encrypted_tx_test.go b/x/pep/keeper/encrypted_tx_test.go index d4fd2e6e..956a6eae 100644 --- a/x/pep/keeper/encrypted_tx_test.go +++ b/x/pep/keeper/encrypted_tx_test.go @@ -148,3 +148,26 @@ func TestEncryptedTxGetAll(t *testing.T) { nullify.Fill(keeper.GetAllEncryptedArray(ctx)), ) } + +func TestEncryptedTxAppendPreservesAcceptedOrder(t *testing.T) { + keeper, ctx := keepertest.PepKeeper(t) + targetHeight := uint64(12345) + payloads := []string{"a", "b", "c", "d", "e"} + + for i, payload := range payloads { + idx := keeper.AppendEncryptedTx(ctx, types.EncryptedTx{ + Creator: sample.AccAddress(), + Data: payload, + TargetHeight: targetHeight, + }) + require.Equal(t, uint64(i), idx) + } + + arr := keeper.GetEncryptedTxAllFromHeight(ctx, targetHeight) + require.Len(t, arr.EncryptedTxs, len(payloads)) + + for i, payload := range payloads { + require.Equal(t, uint64(i), arr.EncryptedTxs[i].Index) + require.Equal(t, payload, arr.EncryptedTxs[i].Data) + } +} diff --git a/x/pep/keeper/gen_enc_tx.go b/x/pep/keeper/gen_enc_tx.go index 46bb4d06..96bb3372 100644 --- a/x/pep/keeper/gen_enc_tx.go +++ b/x/pep/keeper/gen_enc_tx.go @@ -2,6 +2,7 @@ package keeper import ( "context" + "sort" "cosmossdk.io/store/prefix" storetypes "cosmossdk.io/store/types" @@ -10,84 +11,233 @@ import ( "github.com/cosmos/cosmos-sdk/runtime" ) -// GetEntry returns a queue entry by its identity +func (k Keeper) genEncTxStore(ctx context.Context) storetypes.KVStore { + storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) + return prefix.NewStore(storeAdapter, types.KeyPrefix(types.GenEncTxKeyPrefix)) +} + +func (k Keeper) getGeneralEncryptedTxCount(ctx context.Context, identity string) uint64 { + store := k.genEncTxStore(ctx) + return bytesToUint64(store.Get(types.GenEncTxCountKey(identity))) +} + +func (k Keeper) setGeneralEncryptedTxCount(ctx context.Context, identity string, count uint64) { + store := k.genEncTxStore(ctx) + store.Set(types.GenEncTxCountKey(identity), uint64ToBytes(count)) +} + +func (k Keeper) setGeneralEncryptedTx(ctx context.Context, identity string, tx types.GeneralEncryptedTx) { + store := k.genEncTxStore(ctx) + store.Set(types.GenEncTxTxKey(identity, tx.Index), k.cdc.MustMarshal(&tx)) +} + +func (k Keeper) getGeneralEncryptedTxsByIdentity( + ctx context.Context, + identity string, +) []types.GeneralEncryptedTx { + store := k.genEncTxStore(ctx) + iterator := storetypes.KVStorePrefixIterator(store, types.GenEncTxTxPrefix(identity)) + defer iterator.Close() + + txs := make([]types.GeneralEncryptedTx, 0) + for ; iterator.Valid(); iterator.Next() { + var tx types.GeneralEncryptedTx + k.cdc.MustUnmarshal(iterator.Value(), &tx) + txs = append(txs, tx) + } + + sort.Slice(txs, func(i, j int) bool { + return txs[i].Index < txs[j].Index + }) + + return txs +} + +func (k Keeper) removeGeneralEncryptedTxsByIdentity(ctx context.Context, identity string) { + store := k.genEncTxStore(ctx) + iterator := storetypes.KVStorePrefixIterator(store, types.GenEncTxTxPrefix(identity)) + defer iterator.Close() + + keys := make([][]byte, 0) + for ; iterator.Valid(); iterator.Next() { + key := make([]byte, len(iterator.Key())) + copy(key, iterator.Key()) + keys = append(keys, key) + } + for _, key := range keys { + store.Delete(key) + } + store.Delete(types.GenEncTxCountKey(identity)) +} + +func identityEntryWithoutTxList(entry types.IdentityExecutionEntry) types.IdentityExecutionEntry { + entry.TxList = nil + return entry +} + +func identityEntryWithTxList(entry types.IdentityExecutionEntry, txs []types.GeneralEncryptedTx) types.IdentityExecutionEntry { + if len(txs) == 0 { + entry.TxList = nil + return entry + } + entry.TxList = &types.GeneralEncryptedTxArray{EncryptedTxs: txs} + return entry +} + +func (k Keeper) setEntryMetadata(ctx context.Context, val types.IdentityExecutionEntry) { + store := k.genEncTxStore(ctx) + entry := identityEntryWithoutTxList(val) + store.Set(types.GenEncTxEntryKey(entry.Identity), k.cdc.MustMarshal(&entry)) +} + +// migrateLegacyGeneralEncryptedTxEntry moves the old one-entry-per-identity +// layout into the new per-identity/per-index tx layout. +// +// The legacy layout stored the full IdentityExecutionEntry, including TxList, +// under one key. That forced every SubmitGeneralEncryptedTx to rewrite the +// entire TxList and made gas grow with the number of encrypted txs in the same +// identity. The new layout keeps identity metadata small and stores each +// accepted encrypted tx under its own deterministic identity/index key. +func (k Keeper) migrateLegacyGeneralEncryptedTxEntry(ctx context.Context, identity string) { + store := k.genEncTxStore(ctx) + legacyKey := types.GenEncTxQueueKey(identity) + b := store.Get(legacyKey) + if b == nil { + return + } + + var entry types.IdentityExecutionEntry + if err := k.cdc.Unmarshal(b, &entry); err != nil { + return + } + if entry.Identity == "" { + entry.Identity = identity + } + + if entry.TxList != nil { + for i := range entry.TxList.EncryptedTxs { + tx := entry.TxList.EncryptedTxs[i] + tx.Identity = entry.Identity + tx.Index = uint64(i) + k.setGeneralEncryptedTx(ctx, entry.Identity, tx) + } + if uint64(len(entry.TxList.EncryptedTxs)) > k.getGeneralEncryptedTxCount(ctx, entry.Identity) { + k.setGeneralEncryptedTxCount(ctx, entry.Identity, uint64(len(entry.TxList.EncryptedTxs))) + } + } + + k.setEntryMetadata(ctx, entry) + store.Delete(legacyKey) +} + +// GetEntry returns identity metadata by identity. It intentionally does not +// hydrate TxList because hot paths such as keyshare aggregation only need the +// metadata/decryption-key fields. Use GetEntryWithTxList for queries/tests that +// need the encrypted tx list. func (k Keeper) GetEntry( ctx context.Context, identity string, ) (val types.IdentityExecutionEntry, found bool) { - storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) - store := prefix.NewStore(storeAdapter, types.KeyPrefix(types.GenEncTxKeyPrefix)) + k.migrateLegacyGeneralEncryptedTxEntry(ctx, identity) + store := k.genEncTxStore(ctx) - b := store.Get(types.GenEncTxQueueKey( - identity, - )) + b := store.Get(types.GenEncTxEntryKey(identity)) if b == nil { return val, false } k.cdc.MustUnmarshal(b, &val) + val.TxList = nil return val, true } -// SetEntry sets a queue entry by its identity +// GetEntryWithTxList returns an identity entry with its encrypted txs hydrated +// from the per-identity/per-index tx store in accepted index order. +func (k Keeper) GetEntryWithTxList( + ctx context.Context, + identity string, +) (val types.IdentityExecutionEntry, found bool) { + val, found = k.GetEntry(ctx, identity) + if !found { + return val, false + } + return identityEntryWithTxList(val, k.getGeneralEncryptedTxsByIdentity(ctx, identity)), true +} + +// SetEntry sets an identity entry. If TxList is supplied, it is rewritten into +// per-tx keys; the entry metadata itself is stored without TxList to avoid +// future full-entry rewrites. func (k Keeper) SetEntry( ctx context.Context, val types.IdentityExecutionEntry, ) { - storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) - store := prefix.NewStore(storeAdapter, types.KeyPrefix(types.GenEncTxKeyPrefix)) + if val.Identity == "" { + return + } - entry := k.cdc.MustMarshal(&val) - store.Set( - types.GenEncTxQueueKey(val.Identity), - entry, - ) + store := k.genEncTxStore(ctx) + if val.TxList != nil { + k.removeGeneralEncryptedTxsByIdentity(ctx, val.Identity) + for i := range val.TxList.EncryptedTxs { + tx := val.TxList.EncryptedTxs[i] + tx.Identity = val.Identity + tx.Index = uint64(i) + k.setGeneralEncryptedTx(ctx, val.Identity, tx) + } + k.setGeneralEncryptedTxCount(ctx, val.Identity, uint64(len(val.TxList.EncryptedTxs))) + } + + k.setEntryMetadata(ctx, val) + store.Delete(types.GenEncTxQueueKey(val.Identity)) } -// RemoveEntry removes an entry from the store +// RemoveEntry removes an identity entry and all encrypted txs stored under it. func (k Keeper) RemoveEntry( ctx context.Context, identity string, ) { - storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) - store := prefix.NewStore(storeAdapter, types.KeyPrefix(types.GenEncTxKeyPrefix)) + store := k.genEncTxStore(ctx) + store.Delete(types.GenEncTxEntryKey(identity)) store.Delete(types.GenEncTxQueueKey(identity)) + k.removeGeneralEncryptedTxsByIdentity(ctx, identity) } -// GetAllGenEncTxEntry returns all GenEncTxQueue entries +// GetAllGenEncTxEntry returns all GenEncTxQueue entries with tx lists hydrated. func (k Keeper) GetAllGenEncTxEntry(ctx context.Context) (list []types.IdentityExecutionEntry) { - storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) - store := prefix.NewStore(storeAdapter, types.KeyPrefix(types.GenEncTxKeyPrefix)) - iterator := storetypes.KVStorePrefixIterator(store, []byte{}) - + store := k.genEncTxStore(ctx) + entryStore := prefix.NewStore(store, types.KeyPrefix(types.GenEncTxEntryKeyPrefix)) + iterator := storetypes.KVStorePrefixIterator(entryStore, []byte{}) defer iterator.Close() for ; iterator.Valid(); iterator.Next() { var val types.IdentityExecutionEntry k.cdc.MustUnmarshal(iterator.Value(), &val) + val = identityEntryWithTxList(val, k.getGeneralEncryptedTxsByIdentity(ctx, val.Identity)) list = append(list, val) } return } +// AppendTxToEntry appends one general encrypted tx to an identity. +// +// This stores the tx under a deterministic identity/index key and only updates a +// tiny per-identity counter. Accepted order is preserved by assigning the index +// from this counter during DeliverTx and later iterating/sorting by Index. func (k Keeper) AppendTxToEntry( ctx context.Context, identity string, encTx types.GeneralEncryptedTx, ) uint64 { - val, _ := k.GetEntry(ctx, identity) - var index uint64 = 0 - var list types.GeneralEncryptedTxArray - if val.TxList != nil { - index = uint64(len(val.TxList.EncryptedTxs)) - list = *val.TxList - } + k.migrateLegacyGeneralEncryptedTxEntry(ctx, identity) + + index := k.getGeneralEncryptedTxCount(ctx, identity) + encTx.Identity = identity encTx.Index = index - list.EncryptedTxs = append(list.EncryptedTxs, encTx) - val.TxList = &list - k.SetEntry(ctx, val) - return uint64(index) + k.setGeneralEncryptedTx(ctx, identity, encTx) + k.setGeneralEncryptedTxCount(ctx, identity, index+1) + + return index } // GetRequestQueueEntry returns a queue entry by its identity @@ -214,7 +364,7 @@ func (k Keeper) GetAllGenEncTxSignalQueueEntry( return } -// GetQueueEntry returns a queue entry by its identity +// GetQueueEntry returns an execution queue entry by its identity with encrypted txs hydrated. func (k Keeper) GetExecutionQueueEntry( ctx context.Context, identity string, @@ -230,10 +380,14 @@ func (k Keeper) GetExecutionQueueEntry( } k.cdc.MustUnmarshal(b, &val) - return val, true + return identityEntryWithTxList(val, k.getGeneralEncryptedTxsByIdentity(ctx, identity)), true } -// SetQueueEntry sets a queue entry by its identity +// SetQueueEntry sets an execution queue entry by its identity. +// +// The execution queue only needs the metadata/decryption key marker. The txs are +// read from the shared per-identity/per-index tx store at BeginBlock execution +// time, so this call does not rewrite the entire encrypted tx list. func (k Keeper) SetExecutionQueueEntry( ctx context.Context, val types.IdentityExecutionEntry, @@ -241,14 +395,14 @@ func (k Keeper) SetExecutionQueueEntry( storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) store := prefix.NewStore(storeAdapter, types.KeyPrefix(types.GenEncTxExeQueueKeyPrefix)) - entry := k.cdc.MustMarshal(&val) + entry := identityEntryWithoutTxList(val) store.Set( - types.GenEncTxQueueKey(val.GetIdentity()), - entry, + types.GenEncTxQueueKey(entry.GetIdentity()), + k.cdc.MustMarshal(&entry), ) } -// RemoveQueueEntry removes an entry from the store +// RemoveQueueEntry removes an entry from the execution queue. func (k Keeper) RemoveExecutionQueueEntry( ctx context.Context, identity string, @@ -258,7 +412,7 @@ func (k Keeper) RemoveExecutionQueueEntry( store.Delete(types.GenEncTxQueueKey(identity)) } -// GetAllGenEncTxQueueEntry returns all GenEncTxQueue entries +// GetAllGenEncTxExecutionQueueEntry returns all execution queue entries with tx lists hydrated. func (k Keeper) GetAllGenEncTxExecutionQueueEntry( ctx context.Context, ) (list []types.IdentityExecutionEntry) { @@ -271,6 +425,7 @@ func (k Keeper) GetAllGenEncTxExecutionQueueEntry( for ; iterator.Valid(); iterator.Next() { var val types.IdentityExecutionEntry k.cdc.MustUnmarshal(iterator.Value(), &val) + val = identityEntryWithTxList(val, k.getGeneralEncryptedTxsByIdentity(ctx, val.Identity)) list = append(list, val) } return diff --git a/x/pep/keeper/gen_enc_tx_test.go b/x/pep/keeper/gen_enc_tx_test.go index f1d359bb..f5d09585 100644 --- a/x/pep/keeper/gen_enc_tx_test.go +++ b/x/pep/keeper/gen_enc_tx_test.go @@ -58,15 +58,46 @@ func TestGeneralEncryptedTxAppend(t *testing.T) { Creator: sample.AccAddress(), } keeper.AppendTxToEntry(ctx, out[0].Identity, appendTx1) - _, found := keeper.GetEntry(ctx, out[0].Identity) + _, found := keeper.GetEntryWithTxList(ctx, out[0].Identity) require.True(t, found) } +func TestGeneralEncryptedTxAppendPreservesAcceptedOrder(t *testing.T) { + keeper, ctx := keepertest.PepKeeper(t) + identity := random.RandHex(32) + keeper.SetEntry(ctx, types.IdentityExecutionEntry{ + Creator: sample.AccAddress(), + Identity: identity, + Pubkey: random.RandHex(32), + DecryptionKey: random.RandHex(32), + }) + + payloads := []string{"a", "b", "c", "d", "e"} + for i, payload := range payloads { + idx := keeper.AppendTxToEntry(ctx, identity, types.GeneralEncryptedTx{ + Creator: sample.AccAddress(), + Data: payload, + }) + require.Equal(t, uint64(i), idx) + } + + entry, found := keeper.GetEntryWithTxList(ctx, identity) + require.True(t, found) + require.NotNil(t, entry.TxList) + require.Len(t, entry.TxList.EncryptedTxs, len(payloads)) + + for i, payload := range payloads { + require.Equal(t, uint64(i), entry.TxList.EncryptedTxs[i].Index) + require.Equal(t, payload, entry.TxList.EncryptedTxs[i].Data) + require.Equal(t, identity, entry.TxList.EncryptedTxs[i].Identity) + } +} + func TestEntryGet(t *testing.T) { keeper, ctx := keepertest.PepKeeper(t) items := createNGeneralEncryptedTxEntry(&keeper, ctx, 10) for _, item := range items { - out, found := keeper.GetEntry(ctx, item.Identity) + out, found := keeper.GetEntryWithTxList(ctx, item.Identity) require.True(t, found) require.Equal(t, nullify.Fill(out), nullify.Fill(item)) } diff --git a/x/pep/keeper/query_encrypted_tx.go b/x/pep/keeper/query_encrypted_tx.go index ba58db11..30e6477b 100644 --- a/x/pep/keeper/query_encrypted_tx.go +++ b/x/pep/keeper/query_encrypted_tx.go @@ -2,18 +2,69 @@ package keeper import ( "context" + "encoding/binary" "github.com/Fairblock/fairyring/x/pep/types" - "github.com/cosmos/cosmos-sdk/runtime" - - "cosmossdk.io/store/prefix" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/query" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" ) -// EncryptedTxAll returns the paginated list of all encrypted Txs +func encryptedTxPageKey(offset uint64) []byte { + bz := make([]byte, 8) + binary.BigEndian.PutUint64(bz, offset) + return bz +} + +func encryptedTxPageOffset(key []byte) uint64 { + if len(key) != 8 { + return 0 + } + return binary.BigEndian.Uint64(key) +} + +func paginateEncryptedTxArrays( + encryptedTxs []types.EncryptedTxArray, + pagination *query.PageRequest, +) ([]types.EncryptedTxArray, *query.PageResponse) { + pageRes := &query.PageResponse{} + if pagination == nil { + pageRes.Total = uint64(len(encryptedTxs)) + return encryptedTxs, pageRes + } + + items := encryptedTxs + if pagination.Reverse { + items = make([]types.EncryptedTxArray, len(encryptedTxs)) + copy(items, encryptedTxs) + for i, j := 0, len(items)-1; i < j; i, j = i+1, j-1 { + items[i], items[j] = items[j], items[i] + } + } + + start := pagination.Offset + if len(pagination.Key) > 0 { + start = encryptedTxPageOffset(pagination.Key) + } + if start > uint64(len(items)) { + start = uint64(len(items)) + } + + end := uint64(len(items)) + if pagination.Limit > 0 && start+pagination.Limit < end { + end = start + pagination.Limit + pageRes.NextKey = encryptedTxPageKey(end) + } + + if pagination.CountTotal { + pageRes.Total = uint64(len(items)) + } + + return items[int(start):int(end)], pageRes +} + +// EncryptedTxAll returns the paginated list of all encrypted Txs. func (k Keeper) EncryptedTxAll( c context.Context, req *types.QueryEncryptedTxAllRequest, @@ -22,34 +73,17 @@ func (k Keeper) EncryptedTxAll( return nil, status.Error(codes.InvalidArgument, "invalid request") } - var encryptedTxs []types.EncryptedTxArray ctx := sdk.UnwrapSDKContext(c) - - storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) - store := prefix.NewStore(storeAdapter, []byte{}) - encryptedTxStore := prefix.NewStore(store, types.KeyPrefix(types.EncryptedTxKeyPrefix)) - - pageRes, err := query.Paginate(encryptedTxStore, req.Pagination, func(key []byte, value []byte) error { - var encryptedTxArr types.EncryptedTxArray - if err := k.cdc.Unmarshal(value, &encryptedTxArr); err != nil { - return err - } - - encryptedTxs = append(encryptedTxs, encryptedTxArr) - return nil - }) - - if err != nil { - return nil, status.Error(codes.Internal, err.Error()) - } + encryptedTxs := k.GetAllEncryptedArray(ctx) + pageItems, pageRes := paginateEncryptedTxArrays(encryptedTxs, req.Pagination) return &types.QueryEncryptedTxAllResponse{ - EncryptedTxArray: encryptedTxs, + EncryptedTxArray: pageItems, Pagination: pageRes, }, nil } -// EncryptedTxAllFromHeight returns all the encrypted TXs for a particular height +// EncryptedTxAllFromHeight returns all the encrypted TXs for a particular height. func (k Keeper) EncryptedTxAllFromHeight( c context.Context, req *types.QueryEncryptedTxAllFromHeightRequest, @@ -66,7 +100,7 @@ func (k Keeper) EncryptedTxAllFromHeight( }, nil } -// EncryptedTx returns a singe encrypted Tx by index +// EncryptedTx returns a singe encrypted Tx by index. func (k Keeper) EncryptedTx( c context.Context, req *types.QueryEncryptedTxRequest, diff --git a/x/pep/keeper/query_general_identity.go b/x/pep/keeper/query_general_identity.go index 8a9975bf..d22f5948 100644 --- a/x/pep/keeper/query_general_identity.go +++ b/x/pep/keeper/query_general_identity.go @@ -23,7 +23,7 @@ func (k Keeper) GeneralIdentity( ctx := sdk.UnwrapSDKContext(c) - entry, found := k.GetEntry(ctx, req.Identity) + entry, found := k.GetEntryWithTxList(ctx, req.Identity) if !found { return nil, status.Error(codes.NotFound, "not found") } @@ -43,15 +43,17 @@ func (k Keeper) GeneralIdentityAll( storeAdapter := runtime.KVStoreAdapter(k.storeService.OpenKVStore(ctx)) store := prefix.NewStore(storeAdapter, types.KeyPrefix(types.GenEncTxKeyPrefix)) + entryStore := prefix.NewStore(store, types.KeyPrefix(types.GenEncTxEntryKeyPrefix)) var keyshares []*types.IdentityExecutionEntry - pageRes, err := query.Paginate(store, req.Pagination, func(key []byte, value []byte) error { + pageRes, err := query.Paginate(entryStore, req.Pagination, func(key []byte, value []byte) error { var keyshare types.IdentityExecutionEntry if err := k.cdc.Unmarshal(value, &keyshare); err != nil { return err } + keyshare = identityEntryWithTxList(keyshare, k.getGeneralEncryptedTxsByIdentity(ctx, keyshare.Identity)) keyshares = append(keyshares, &keyshare) return nil }) diff --git a/x/pep/types/key_encrypted_tx.go b/x/pep/types/key_encrypted_tx.go index e5343aff..bce7d7b1 100644 --- a/x/pep/types/key_encrypted_tx.go +++ b/x/pep/types/key_encrypted_tx.go @@ -10,6 +10,9 @@ const ( // EncryptedTxKeyPrefix is the prefix to retrieve all EncryptedTx EncryptedTxKeyPrefix = "EncryptedTx/value/" GenEncTxKeyPrefix = "GenEncTx/value/" + GenEncTxEntryKeyPrefix = "entry/" + GenEncTxTxKeyPrefix = "tx/" + GenEncTxCountKeyPrefix = "count/" PrivateRequestQueueKeyPrefix = "PrivateReq/value/" PrivateSignalQueueKeyPrefix = "PrivateSignal/value/" GenEncTxReqQueueKeyPrefix = "GenEncTxReqQueue/value/" @@ -30,6 +33,77 @@ func EncryptedTxAllFromHeightKey( return key } +// EncryptedTxKey returns the per-height/per-index key for one encrypted tx. +// +// This intentionally keeps EncryptedTxAllFromHeightKey as the common height +// prefix, so all entries for a height can be iterated or removed together while +// avoiding the old hot-height protobuf-array rewrite on every submit. +func EncryptedTxKey( + targetHeight uint64, + index uint64, +) []byte { + key := EncryptedTxAllFromHeightKey(targetHeight) + key = append(key, []byte("tx/")...) + + indexBytes := make([]byte, 8) + binary.BigEndian.PutUint64(indexBytes, index) + key = append(key, indexBytes...) + key = append(key, []byte("/")...) + + return key +} + +// EncryptedTxCountKey stores the next accepted index for one target height. +func EncryptedTxCountKey( + targetHeight uint64, +) []byte { + key := EncryptedTxAllFromHeightKey(targetHeight) + key = append(key, []byte("count/")...) + return key +} + +func genEncTxIdentityScopedKey(prefix string, identity string) []byte { + var key []byte + key = append(key, []byte(prefix)...) + + identityBytes := []byte(identity) + identityLenBytes := make([]byte, 8) + binary.BigEndian.PutUint64(identityLenBytes, uint64(len(identityBytes))) + key = append(key, identityLenBytes...) + key = append(key, identityBytes...) + key = append(key, []byte("/")...) + + return key +} + +// GenEncTxEntryKey stores metadata for one general encrypted tx identity. +// The encrypted tx list itself is intentionally stored separately by index. +func GenEncTxEntryKey(identity string) []byte { + return genEncTxIdentityScopedKey(GenEncTxEntryKeyPrefix, identity) +} + +// GenEncTxTxPrefix returns the prefix containing all encrypted txs for one identity. +func GenEncTxTxPrefix(identity string) []byte { + return genEncTxIdentityScopedKey(GenEncTxTxKeyPrefix, identity) +} + +// GenEncTxTxKey returns the per-identity/per-index key for one general encrypted tx. +func GenEncTxTxKey(identity string, index uint64) []byte { + key := GenEncTxTxPrefix(identity) + + indexBytes := make([]byte, 8) + binary.BigEndian.PutUint64(indexBytes, index) + key = append(key, indexBytes...) + key = append(key, []byte("/")...) + + return key +} + +// GenEncTxCountKey stores the next accepted index for one general encrypted tx identity. +func GenEncTxCountKey(identity string) []byte { + return genEncTxIdentityScopedKey(GenEncTxCountKeyPrefix, identity) +} + func GenEncTxQueueKey( identity string, ) []byte {