Add local instaswap E2E workspace harness
This commit is contained in:
184
bootstrap-solana-local.sh
Executable file
184
bootstrap-solana-local.sh
Executable file
@@ -0,0 +1,184 @@
|
||||
#!/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 "$@"
|
||||
Reference in New Issue
Block a user