185 lines
6.3 KiB
Bash
Executable File
185 lines
6.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
CAPITAL_STAKING_DIR="${CAPITAL_STAKING_DIR:-$(pwd)}"
|
|
CAPITAL_STAKING_REPO_REL="${CAPITAL_STAKING_REPO_REL:-$(realpath --relative-to "${ROOT_DIR}" "${CAPITAL_STAKING_DIR}")}"
|
|
ARTIFACTS_DIR="${ROOT_DIR}/.local/e2e"
|
|
ANCHOR_PROVIDER_URL="${ANCHOR_PROVIDER_URL:-http://solana-validator:8899}"
|
|
ANCHOR_WALLET="${ANCHOR_WALLET:-${CAPITAL_STAKING_DIR}/wallets/deploymentWallet/universalDeploymentWallet.json}"
|
|
WIRE_BATCH_SOL_RPC_URL="${WIRE_BATCH_SOL_RPC_URL:-http://solana-validator:8899}"
|
|
AIRDROP_AMOUNT="${AIRDROP_AMOUNT:-100}"
|
|
LOCAL_BOOTSTRAP_ROOT="${LOCAL_BOOTSTRAP_ROOT:-${ROOT_DIR}/.local/solana-bootstrap}"
|
|
LOCAL_CARGO_HOME="${LOCAL_CARGO_HOME:-${LOCAL_BOOTSTRAP_ROOT}/cargo-home}"
|
|
LOCAL_SOLANA_HOME="${LOCAL_SOLANA_HOME:-${LOCAL_BOOTSTRAP_ROOT}/home}"
|
|
LOCAL_RUSTUP_HOME="${LOCAL_RUSTUP_HOME:-${LOCAL_BOOTSTRAP_ROOT}/rustup-home}"
|
|
LOCAL_SBF_SDK_PATH="${LOCAL_SBF_SDK_PATH:-${LOCAL_SOLANA_HOME}/sdk/sbf}"
|
|
CAPITAL_STAKING_FEATURES="${CAPITAL_STAKING_FEATURES:-development}"
|
|
SOL_CLIENT_ID="${SOL_CLIENT_ID:-sol-local-1}"
|
|
SOL_PROVIDER_ID="${SOL_PROVIDER_ID:-sol-local-1}"
|
|
SOL_PROGRAM_ID="${SOL_PROGRAM_ID:-}"
|
|
SOL_IDL_FILE="/wire/${CAPITAL_STAKING_REPO_REL}/target/idl/liqsol_core.json"
|
|
|
|
prepare_sbf_sdk() {
|
|
local default_sbf_sdk="/opt/solana/.local/share/solana/install/active_release/bin/sdk/sbf"
|
|
|
|
mkdir -p "$(dirname "${LOCAL_SBF_SDK_PATH}")"
|
|
if [[ ! -d "${LOCAL_SBF_SDK_PATH}" ]]; then
|
|
cp -a "${default_sbf_sdk}" "${LOCAL_SBF_SDK_PATH}"
|
|
fi
|
|
|
|
export SBF_SDK_PATH="${LOCAL_SBF_SDK_PATH}"
|
|
}
|
|
|
|
prepare_rustup_home() {
|
|
if [[ ! -d "${LOCAL_RUSTUP_HOME}/toolchains" ]]; then
|
|
mkdir -p "${LOCAL_RUSTUP_HOME}"
|
|
cp -a /opt/rustup/. "${LOCAL_RUSTUP_HOME}/"
|
|
fi
|
|
|
|
export RUSTUP_HOME="${LOCAL_RUSTUP_HOME}"
|
|
}
|
|
|
|
resolve_sol_program_id() {
|
|
if [[ -n "${SOL_PROGRAM_ID}" ]]; then
|
|
printf '%s\n' "${SOL_PROGRAM_ID}"
|
|
return 0
|
|
fi
|
|
|
|
node <<'EOF'
|
|
const fs = require("fs");
|
|
const path = require("path");
|
|
const { Keypair } = require("@solana/web3.js");
|
|
|
|
const keypairPath = path.resolve("target/deploy/liqsol_core-keypair.json");
|
|
if (fs.existsSync(keypairPath)) {
|
|
const secret = Uint8Array.from(JSON.parse(fs.readFileSync(keypairPath, "utf8")));
|
|
console.log(Keypair.fromSecretKey(secret).publicKey.toBase58());
|
|
process.exit(0);
|
|
}
|
|
|
|
const idlPath = path.resolve("target/idl/liqsol_core.json");
|
|
if (fs.existsSync(idlPath)) {
|
|
const idl = JSON.parse(fs.readFileSync(idlPath, "utf8"));
|
|
if (idl.address) {
|
|
console.log(idl.address);
|
|
process.exit(0);
|
|
}
|
|
}
|
|
|
|
process.exit(1);
|
|
EOF
|
|
}
|
|
|
|
deploy_local_cluster() {
|
|
export HOME="${LOCAL_SOLANA_HOME}"
|
|
export XDG_CACHE_HOME="${HOME}/.cache"
|
|
export XDG_CONFIG_HOME="${HOME}/.config"
|
|
npm ci
|
|
export ANCHOR_PROVIDER_URL
|
|
export ANCHOR_WALLET
|
|
export AIRDROP_AMOUNT
|
|
export CAPITAL_STAKING_FEATURES
|
|
export CARGO_HOME="${LOCAL_CARGO_HOME}"
|
|
export SOLANA_RPC="${ANCHOR_PROVIDER_URL}"
|
|
mkdir -p "${HOME}" "${XDG_CACHE_HOME}" "${XDG_CONFIG_HOME}" "${CARGO_HOME}" "${LOCAL_BOOTSTRAP_ROOT}"
|
|
prepare_rustup_home
|
|
prepare_sbf_sdk
|
|
solana config set --url "${ANCHOR_PROVIDER_URL}" --keypair "${ANCHOR_WALLET}" >/dev/null
|
|
bash bash-scripts/local-deploy.sh --wait-for-cluster --features "${CAPITAL_STAKING_FEATURES}"
|
|
SOL_PROGRAM_ID="$(resolve_sol_program_id)"
|
|
export SOL_PROGRAM_ID
|
|
}
|
|
|
|
set_signature_weight() {
|
|
ANCHOR_WALLET="${ANCHOR_WALLET}" \
|
|
ANCHOR_PROVIDER_URL="${ANCHOR_PROVIDER_URL}" \
|
|
SOL_PROGRAM_ID="${SOL_PROGRAM_ID}" \
|
|
node <<'EOF'
|
|
const fs = require("fs");
|
|
const anchor = require("@coral-xyz/anchor");
|
|
const { Connection, Keypair, PublicKey } = require("@solana/web3.js");
|
|
const idl = require("./target/idl/liqsol_core.json");
|
|
|
|
const walletPath = process.env.ANCHOR_WALLET;
|
|
const providerUrl = process.env.ANCHOR_PROVIDER_URL;
|
|
const programId = new PublicKey(process.env.SOL_PROGRAM_ID || idl.address);
|
|
idl.address = programId.toBase58();
|
|
const secret = Uint8Array.from(JSON.parse(fs.readFileSync(walletPath, "utf8")));
|
|
const wallet = new anchor.Wallet(Keypair.fromSecretKey(secret));
|
|
const provider = new anchor.AnchorProvider(new Connection(providerUrl, "confirmed"), wallet, {
|
|
commitment: "confirmed",
|
|
});
|
|
anchor.setProvider(provider);
|
|
|
|
const program = new anchor.Program(idl, provider);
|
|
const [globalConfig] = PublicKey.findProgramAddressSync([Buffer.from("global_config")], programId);
|
|
const [controllerState] = PublicKey.findProgramAddressSync([Buffer.from("stake_controller")], programId);
|
|
|
|
async function main() {
|
|
await program.methods
|
|
.updateConfigU16({ oppRequiredSignatureWeight: {} }, 1)
|
|
.accounts({
|
|
globalConfig,
|
|
controllerState,
|
|
authority: wallet.publicKey,
|
|
})
|
|
.rpc();
|
|
}
|
|
|
|
main().catch((error) => {
|
|
console.error(error);
|
|
process.exit(1);
|
|
});
|
|
EOF
|
|
}
|
|
|
|
write_artifacts() {
|
|
local out_file="${ARTIFACTS_DIR}/solana.env"
|
|
|
|
mkdir -p "${ARTIFACTS_DIR}"
|
|
|
|
ANCHOR_WALLET="${ANCHOR_WALLET}" \
|
|
SOL_PROVIDER_ID="${SOL_PROVIDER_ID}" \
|
|
SOL_CLIENT_ID="${SOL_CLIENT_ID}" \
|
|
WIRE_BATCH_SOL_RPC_URL="${WIRE_BATCH_SOL_RPC_URL}" \
|
|
SOL_PROGRAM_ID="${SOL_PROGRAM_ID}" \
|
|
SOL_IDL_FILE="${SOL_IDL_FILE}" \
|
|
CAPITAL_STAKING_REPO_REL="${CAPITAL_STAKING_REPO_REL}" \
|
|
node <<'EOF' >"${out_file}"
|
|
const fs = require("fs");
|
|
const bs58 = require("bs58");
|
|
const { Keypair } = require("@solana/web3.js");
|
|
|
|
const walletPath = process.env.ANCHOR_WALLET;
|
|
const providerId = process.env.SOL_PROVIDER_ID;
|
|
const clientId = process.env.SOL_CLIENT_ID;
|
|
const rpcUrl = process.env.WIRE_BATCH_SOL_RPC_URL;
|
|
const programId = process.env.SOL_PROGRAM_ID;
|
|
const idlFile = process.env.SOL_IDL_FILE;
|
|
const repoRel = process.env.CAPITAL_STAKING_REPO_REL;
|
|
|
|
const secret = Uint8Array.from(JSON.parse(fs.readFileSync(walletPath, "utf8")));
|
|
const keypair = Keypair.fromSecretKey(secret);
|
|
const secretBase58 = bs58.encode(Buffer.from(keypair.secretKey));
|
|
|
|
console.log(`LOCAL_SOL_CLIENT_ID=${clientId}`);
|
|
console.log(`LOCAL_SOL_PROVIDER_ID=${providerId}`);
|
|
console.log(`LOCAL_SOL_PROVIDER_SPEC=${providerId},solana,solana,${keypair.publicKey.toBase58()},KEY:${secretBase58}`);
|
|
console.log(`LOCAL_SOL_RPC_URL=${rpcUrl}`);
|
|
console.log(`LOCAL_SOL_PROGRAM_ID=${programId}`);
|
|
console.log(`LOCAL_SOL_IDL_FILE=${idlFile}`);
|
|
console.log(`LOCAL_SOL_REPO_DIR=${repoRel}`);
|
|
console.log(`LOCAL_SOL_OPP_REQUIRED_SIGNATURE_WEIGHT=1`);
|
|
EOF
|
|
}
|
|
|
|
main() {
|
|
cd "${CAPITAL_STAKING_DIR}"
|
|
deploy_local_cluster
|
|
set_signature_weight
|
|
write_artifacts
|
|
}
|
|
|
|
main "$@"
|