#!/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" <