106 lines
5.0 KiB
Bash
Executable File
106 lines
5.0 KiB
Bash
Executable File
#!/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"
|