This commit is contained in:
2026-07-23 16:37:12 +02:00
parent 99c345f2f2
commit 0da75c1311
2159 changed files with 230833 additions and 0 deletions

View File

@@ -0,0 +1,39 @@
#!/usr/bin/env bash
# file: scripts/devnet/load_elgamal_registry_fixture.sh
# version: 1
set -euo pipefail
PROFILE="${KB_ELGAMAL_PROFILE:-local_devnet}"
FIXTURE_DIR="${KB_ELGAMAL_FIXTURE_DIR:-./wallets/temporary/${PROFILE}/elgamal_registry_validation}"
FIXTURE_FILE="${FIXTURE_DIR}/fixture.env"
if [[ ! -r "$FIXTURE_FILE" ]]; then
printf 'Fixture ElGamal Registry absente: %s\n' "$FIXTURE_FILE" >&2
return 1 2>/dev/null || exit 1
fi
# shellcheck disable=SC1090
source "$FIXTURE_FILE"
required_variables=(
KB_ELGAMAL_CLUSTER_URL
TOKEN_2022_PROGRAM
ELGAMAL_REGISTRY_PROGRAM
ZK_ELGAMAL_PROOF_PROGRAM
ELGAMAL_REGISTRY_ADDRESS
ELGAMAL_PUBKEY_BASE64
PUBKEY_VALIDITY_PROOF_CONTEXT
TOKEN_2022_CONFIDENTIAL_ACCOUNT
)
for variable in "${required_variables[@]}"; do
if [[ -z "${!variable:-}" ]]; then
printf 'Fixture incomplète, variable absente: %s\n' "$variable" >&2
return 1 2>/dev/null || exit 1
fi
done
printf 'Fixture: %s\n' "$FIXTURE_FILE"
printf 'Cluster: %s\n' "$KB_ELGAMAL_CLUSTER_URL"
printf 'Registry program: %s\n' "$ELGAMAL_REGISTRY_PROGRAM"
printf 'Registry PDA: %s\n' "$ELGAMAL_REGISTRY_ADDRESS"
printf 'Proof context: %s\n' "$PUBKEY_VALIDITY_PROOF_CONTEXT"
printf 'Token-2022 confidential account: %s\n' "$TOKEN_2022_CONFIDENTIAL_ACCOUNT"

View File

@@ -0,0 +1,24 @@
#!/usr/bin/env bash
# file: scripts/devnet/load_spl_fixture.sh
# version: 2
family="${1:-token-2022}"
workspace="${KB_WORKSPACE_ROOT:-$(pwd)}"
wallet_dir="${KB_DEVNET_WALLET_DIR:-$workspace/wallets/temporary/local_devnet}"
case "$family" in
token-2022) fixture="$wallet_dir/spl_token_2022_validation/fixture.env"; prefix='TOKEN_2022' ;;
classic) fixture="$wallet_dir/spl_token_classic_validation/fixture.env"; prefix='TOKEN_CLASSIC' ;;
*) printf 'Usage: source %s token-2022|classic\n' "${BASH_SOURCE[0]}" >&2; return 64 2>/dev/null || exit 64 ;;
esac
test -f "$fixture"
# shellcheck disable=SC1090
source "$fixture"
program_var="${prefix}_PROGRAM"; mint_var="${prefix}_MINT"; source_var="${prefix}_SOURCE"; destination_var="${prefix}_DESTINATION"; delegate_var="${prefix}_DELEGATE"; close_var="${prefix}_CLOSE_ACCOUNT"; ata_var="${prefix}_ATA"
program="${!program_var}"; mint="${!mint_var}"; source_account="${!source_var}"; destination="${!destination_var}"; delegate="${!delegate_var}"; close_account="${!close_var}"; ata="${!ata_var}"
for value in "$program" "$mint" "$source_account" "$destination" "$delegate" "$close_account" "$ata"; do
[[ "$value" =~ ^[1-9A-HJ-NP-Za-km-z]{32,44}$ ]] || { printf 'Adresse Base58 invalide: %s\n' "$value" >&2; return 65 2>/dev/null || exit 65; }
done
printf 'Fixture: %s\nWallet: %s\nProgram: %s\nMint: %s\nSource: %s\nDestination: %s\nDelegate: %s\nClose account: %s\nATA: %s\n' "$fixture" "$KB_DEVNET_WALLET_ADDRESS" "$program" "$mint" "$source_account" "$destination" "$delegate" "$close_account" "$ata"
spl-token --url devnet --program-id "$program" display "$mint" | sed -n '1,8p'
spl-token --url devnet --program-id "$program" display "$source_account" | sed -n '1,12p'
spl-token --url devnet --program-id "$program" display "$destination" | sed -n '1,12p'
spl-token --url devnet --program-id "$program" display "$close_account" | sed -n '1,12p'

View File

@@ -0,0 +1,120 @@
#!/usr/bin/env bash
# file: scripts/devnet/prepare_elgamal_registry_fixture.sh
# version: 1
set -euo pipefail
CLUSTER_URL="${KB_ELGAMAL_CLUSTER_URL:-https://api.devnet.solana.com}"
PROFILE="${KB_ELGAMAL_PROFILE:-local_devnet}"
FIXTURE_DIR="${KB_ELGAMAL_FIXTURE_DIR:-./wallets/temporary/${PROFILE}/elgamal_registry_validation}"
FIXTURE_FILE="${FIXTURE_DIR}/fixture.env"
TOKEN_2022_PROGRAM="${TOKEN_2022_PROGRAM:-TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb}"
ELGAMAL_REGISTRY_PROGRAM="${ELGAMAL_REGISTRY_PROGRAM:-regVYJW7tcT8zipN5YiBvHsvR5jXW1uLFxaHSbugABg}"
ZK_ELGAMAL_PROOF_PROGRAM="${ZK_ELGAMAL_PROOF_PROGRAM:-ZkE1Gama1Proof11111111111111111111111111111}"
usage() {
cat <<USAGE
Usage:
ELGAMAL_REGISTRY_ADDRESS=<PDA> \\
ELGAMAL_PUBKEY_BASE64=<base64-32-bytes> \\
PUBKEY_VALIDITY_PROOF_CONTEXT=<pubkey> \\
TOKEN_2022_CONFIDENTIAL_ACCOUNT=<pubkey> \\
scripts/devnet/prepare_elgamal_registry_fixture.sh [--force]
The script validates and records an already generated cryptographic fixture.
It never fabricates an ElGamal key or a zero-knowledge proof.
USAGE
}
FORCE=false
if [[ "${1:-}" == "--force" ]]; then
FORCE=true
elif [[ $# -ne 0 ]]; then
usage
exit 2
fi
for command in solana base64; do
if ! command -v "$command" >/dev/null 2>&1; then
printf 'Commande requise absente: %s\n' "$command" >&2
exit 1
fi
done
required_variables=(
ELGAMAL_REGISTRY_ADDRESS
ELGAMAL_PUBKEY_BASE64
PUBKEY_VALIDITY_PROOF_CONTEXT
TOKEN_2022_CONFIDENTIAL_ACCOUNT
)
for variable in "${required_variables[@]}"; do
if [[ -z "${!variable:-}" ]]; then
printf 'Variable requise absente: %s\n' "$variable" >&2
usage
exit 1
fi
done
validate_existing_account() {
local label="$1"
local value="$2"
if ! solana account "$value" --url "$CLUSTER_URL" --output json-compact >/dev/null 2>&1; then
printf '%s non lisible sur %s: %s\n' "$label" "$CLUSTER_URL" "$value" >&2
exit 1
fi
}
validate_registry_address() {
local output
if output="$(solana account "$ELGAMAL_REGISTRY_ADDRESS" --url "$CLUSTER_URL" --output json-compact 2>&1)"; then
printf 'Registry déjà présent; la fixture conviendra à UpdateRegistry mais CreateRegistry doit utiliser un nouveau propriétaire/PDA.\n' >&2
return 0
fi
if [[ "$output" == *"AccountNotFound"* ]]; then
return 0
fi
printf 'Adresse Registry invalide ou RPC indisponible: %s\n%s\n' "$ELGAMAL_REGISTRY_ADDRESS" "$output" >&2
exit 1
}
if ! decoded_length="$(printf '%s' "$ELGAMAL_PUBKEY_BASE64" | base64 --decode 2>/dev/null | wc -c)"; then
printf 'ELGAMAL_PUBKEY_BASE64 n\x27est pas un Base64 valide.\n' >&2
exit 1
fi
if [[ "$decoded_length" -ne 32 ]]; then
printf 'ELGAMAL_PUBKEY_BASE64 doit décoder exactement 32 octets; obtenu: %s.\n' "$decoded_length" >&2
exit 1
fi
validate_registry_address
validate_existing_account "Proof Context State PubkeyValidity" "$PUBKEY_VALIDITY_PROOF_CONTEXT"
validate_existing_account "Token-2022 confidential account" "$TOKEN_2022_CONFIDENTIAL_ACCOUNT"
for program in "$TOKEN_2022_PROGRAM" "$ELGAMAL_REGISTRY_PROGRAM" "$ZK_ELGAMAL_PROOF_PROGRAM"; do
if ! solana program show "$program" --url "$CLUSTER_URL" >/dev/null 2>&1; then
printf 'Programme requis absent ou non exécutable sur %s: %s\n' "$CLUSTER_URL" "$program" >&2
exit 1
fi
done
if [[ -e "$FIXTURE_FILE" && "$FORCE" != true ]]; then
printf 'Fixture déjà présente: %s; utiliser --force pour la remplacer.\n' "$FIXTURE_FILE" >&2
exit 1
fi
mkdir -p "$FIXTURE_DIR"
umask 077
cat > "$FIXTURE_FILE" <<ENV
export KB_ELGAMAL_CLUSTER_URL='$CLUSTER_URL'
export TOKEN_2022_PROGRAM='$TOKEN_2022_PROGRAM'
export ELGAMAL_REGISTRY_PROGRAM='$ELGAMAL_REGISTRY_PROGRAM'
export ZK_ELGAMAL_PROOF_PROGRAM='$ZK_ELGAMAL_PROOF_PROGRAM'
export ELGAMAL_REGISTRY_ADDRESS='$ELGAMAL_REGISTRY_ADDRESS'
export ELGAMAL_PUBKEY_BASE64='$ELGAMAL_PUBKEY_BASE64'
export PUBKEY_VALIDITY_PROOF_CONTEXT='$PUBKEY_VALIDITY_PROOF_CONTEXT'
export TOKEN_2022_CONFIDENTIAL_ACCOUNT='$TOKEN_2022_CONFIDENTIAL_ACCOUNT'
ENV
chmod 600 "$FIXTURE_FILE"
printf 'Fixture ElGamal Registry validée: %s\n' "$FIXTURE_FILE"
printf 'Registry: %s\n' "$ELGAMAL_REGISTRY_ADDRESS"
printf 'Proof context: %s\n' "$PUBKEY_VALIDITY_PROOF_CONTEXT"
printf 'Token account: %s\n' "$TOKEN_2022_CONFIDENTIAL_ACCOUNT"

View File

@@ -0,0 +1,105 @@
#!/usr/bin/env bash
# file: scripts/devnet/prepare_spl_fixture.sh
# version: 2
set -euo pipefail
family="${1:-token-2022}"
force="${2:-}"
workspace="${KB_WORKSPACE_ROOT:-$(pwd)}"
wallet_dir="${KB_DEVNET_WALLET_DIR:-$workspace/wallets/temporary/local_devnet}"
wallet_file="${KB_DEVNET_WALLET_FILE:-$wallet_dir/local-devnet-operator.json}"
case "$family" in
token-2022) program='TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb'; fixture_dir="$wallet_dir/spl_token_2022_validation" ;;
classic) program='TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'; fixture_dir="$wallet_dir/spl_token_classic_validation" ;;
*) printf 'Usage: %s token-2022|classic [--force]\n' "$0" >&2; exit 64 ;;
esac
command -v solana-keygen >/dev/null
command -v solana >/dev/null
command -v spl-token >/dev/null
test -f "$wallet_file"
mkdir -p "$fixture_dir"
chmod 700 "$fixture_dir"
wallet_address="$(solana-keygen pubkey "$wallet_file")"
solana config set --url devnet >/dev/null
balance="$(solana balance "$wallet_address" --url devnet)"
fixture="$fixture_dir/fixture.env"
if [[ -f "$fixture" && "$force" != "--force" ]]; then
required_prefix='TOKEN_2022'
[[ "$family" == classic ]] && required_prefix='TOKEN_CLASSIC'
# shellcheck disable=SC1090
source "$fixture"
complete=true
for suffix in PROGRAM MINT SOURCE DESTINATION DELEGATE CLOSE_ACCOUNT ATA AUTHORITY DECIMALS; do
variable="${required_prefix}_${suffix}"
[[ -n "${!variable:-}" ]] || complete=false
done
if [[ "$family" == token-2022 ]]; then
variable="${required_prefix}_FREEZE_AUTHORITY"
[[ -n "${!variable:-}" ]] || complete=false
fi
if [[ "$complete" == true ]]; then
printf 'Fixture existante conservée: %s\n' "$fixture"
printf 'Wallet: %s (%s)\n' "$wallet_address" "$balance"
exit 0
fi
printf 'Fixture incomplète: %s\nRelancer avec: %s %s --force\n' "$fixture" "$0" "$family" >&2
exit 66
fi
if [[ "$family" == token-2022 ]]; then
if ! spl-token create-token --help 2>&1 | grep -q -- '--enable-freeze'; then
printf 'spl-token ne publie pas --enable-freeze; impossible de préparer Freeze/Thaw proprement.
' >&2
exit 69
fi
create_output="$(spl-token --url devnet --program-id "$program" create-token --decimals 9 --enable-freeze)"
else
create_output="$(spl-token --url devnet --program-id "$program" create-token --decimals 9)"
fi
mint="$(printf '%s\n' "$create_output" | sed -nE 's/^Creating token ([1-9A-HJ-NP-Za-km-z]+).*$/\1/p' | head -n 1)"
test -n "$mint"
source_keypair="$fixture_dir/source-token-account.json"
destination_keypair="$fixture_dir/destination-token-account.json"
delegate_keypair="$fixture_dir/delegate.json"
close_keypair="$fixture_dir/close-token-account.json"
for keypair in "$source_keypair" "$destination_keypair" "$delegate_keypair" "$close_keypair"; do
solana-keygen new --no-bip39-passphrase --silent --force --outfile "$keypair" >/dev/null
chmod 600 "$keypair"
done
source_address="$(solana-keygen pubkey "$source_keypair")"
destination_address="$(solana-keygen pubkey "$destination_keypair")"
delegate_address="$(solana-keygen pubkey "$delegate_keypair")"
close_address="$(solana-keygen pubkey "$close_keypair")"
spl-token --url devnet --program-id "$program" --fee-payer "$wallet_file" create-account "$mint" "$source_keypair" --owner "$wallet_address" >/dev/null
spl-token --url devnet --program-id "$program" --fee-payer "$wallet_file" create-account "$mint" "$destination_keypair" --owner "$wallet_address" >/dev/null
spl-token --url devnet --program-id "$program" --fee-payer "$wallet_file" create-account "$mint" "$close_keypair" --owner "$wallet_address" >/dev/null
spl-token --url devnet --program-id "$program" --fee-payer "$wallet_file" mint "$mint" 10 "$source_address" >/dev/null
ata="$(spl-token --url devnet --program-id "$program" address --verbose --token "$mint" --owner "$wallet_address" | sed -nE 's/^Associated token address:[[:space:]]+//p')"
tmp="$fixture.tmp"
prefix='TOKEN_2022'
freeze_authority="$wallet_address"
if [[ "$family" == classic ]]; then
prefix='TOKEN_CLASSIC'
freeze_authority=''
fi
cat > "$tmp" <<ENV
export KB_DEVNET_WALLET_DIR='$wallet_dir'
export KB_DEVNET_WALLET_FILE='$wallet_file'
export KB_DEVNET_WALLET_ADDRESS='$wallet_address'
export ${prefix}_PROGRAM='$program'
export ${prefix}_MINT='$mint'
export ${prefix}_SOURCE='$source_address'
export ${prefix}_DESTINATION='$destination_address'
export ${prefix}_DELEGATE='$delegate_address'
export ${prefix}_CLOSE_ACCOUNT='$close_address'
export ${prefix}_ATA='$ata'
export ${prefix}_AUTHORITY='$wallet_address'
export ${prefix}_FREEZE_AUTHORITY='$freeze_authority'
export ${prefix}_DECIMALS='9'
export ${prefix}_MINT_AMOUNT_RAW='10000000000'
export ${prefix}_TRANSFER_AMOUNT_RAW='4'
export ${prefix}_APPROVE_AMOUNT_RAW='2'
export ${prefix}_BURN_AMOUNT_RAW='1'
ENV
mv "$tmp" "$fixture"
chmod 600 "$fixture"
printf 'Fixture créée: %s\nWallet: %s (%s)\nMint: %s\nSource: %s\nDestination: %s\nDelegate: %s\nClose account: %s\nATA: %s\n' "$fixture" "$wallet_address" "$balance" "$mint" "$source_address" "$destination_address" "$delegate_address" "$close_address" "$ata"