-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
92 changed files
with
1,322,808 additions
and
20 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,388 @@ | ||
#!/usr/bin/env bash | ||
set -eo pipefail | ||
|
||
BASE_DIR=${XDG_CONFIG_HOME:-$HOME} | ||
FOUNDRY_DIR=${FOUNDRY_DIR:-"$BASE_DIR/.foundry"} | ||
FOUNDRY_BIN_DIR="$FOUNDRY_DIR/bin" | ||
FOUNDRY_MAN_DIR="$FOUNDRY_DIR/share/man/man1" | ||
|
||
FOUNDRYUP_JOBS="" | ||
|
||
BINS=(forge cast) | ||
|
||
export RUSTFLAGS="${RUSTFLAGS:--C target-cpu=native}" | ||
|
||
main() { | ||
need_cmd git | ||
need_cmd curl | ||
|
||
while [[ -n $1 ]]; do | ||
case $1 in | ||
--) shift; break;; | ||
|
||
-r|--repo) shift; FOUNDRYUP_REPO=$1;; | ||
-b|--branch) shift; FOUNDRYUP_BRANCH=$1;; | ||
-v|--version) shift; FOUNDRYUP_VERSION=$1;; | ||
-p|--path) shift; FOUNDRYUP_LOCAL_REPO=$1;; | ||
-P|--pr) shift; FOUNDRYUP_PR=$1;; | ||
-C|--commit) shift; FOUNDRYUP_COMMIT=$1;; | ||
-j|--jobs) shift; FOUNDRYUP_JOBS=$1;; | ||
--arch) shift; FOUNDRYUP_ARCH=$1;; | ||
--platform) shift; FOUNDRYUP_PLATFORM=$1;; | ||
-h|--help) | ||
usage | ||
exit 0 | ||
;; | ||
*) | ||
warn "unknown option: $1" | ||
usage | ||
exit 1 | ||
esac; shift | ||
done | ||
|
||
CARGO_BUILD_ARGS=(--release) | ||
|
||
if [ -n "$FOUNDRYUP_JOBS" ]; then | ||
CARGO_BUILD_ARGS+=(--jobs "$FOUNDRYUP_JOBS") | ||
fi | ||
|
||
# Print the banner after successfully parsing args | ||
banner | ||
|
||
if [ -n "$FOUNDRYUP_PR" ]; then | ||
if [ -z "$FOUNDRYUP_BRANCH" ]; then | ||
FOUNDRYUP_BRANCH="refs/pull/$FOUNDRYUP_PR/head" | ||
else | ||
err "can't use --pr and --branch at the same time" | ||
fi | ||
fi | ||
|
||
# Installs foundry from a local repository if --path parameter is provided | ||
if [[ -n "$FOUNDRYUP_LOCAL_REPO" ]]; then | ||
need_cmd cargo | ||
|
||
# Ignore branches/versions as we do not want to modify local git state | ||
if [ -n "$FOUNDRYUP_REPO" ] || [ -n "$FOUNDRYUP_BRANCH" ] || [ -n "$FOUNDRYUP_VERSION" ]; then | ||
warn "--branch, --version, and --repo arguments are ignored during local install" | ||
fi | ||
|
||
# Enter local repo and build | ||
say "installing from $FOUNDRYUP_LOCAL_REPO" | ||
cd "$FOUNDRYUP_LOCAL_REPO" | ||
ensure cargo build --bins "${CARGO_BUILD_ARGS[@]}" | ||
|
||
for bin in "${BINS[@]}"; do | ||
# Remove prior installations if they exist | ||
rm -f "$FOUNDRY_BIN_DIR/$bin" | ||
# Symlink from local repo binaries to bin dir | ||
ensure ln -s "$PWD/target/release/$bin" "$FOUNDRY_BIN_DIR/$bin" | ||
done | ||
|
||
say "done" | ||
exit 0 | ||
fi | ||
|
||
FOUNDRYUP_REPO=${FOUNDRYUP_REPO:-matter-labs/foundry-zksync} | ||
|
||
# Install by downloading binaries | ||
if [[ "$FOUNDRYUP_REPO" == "matter-labs/foundry-zksync" && -z "$FOUNDRYUP_BRANCH" && -z "$FOUNDRYUP_COMMIT" ]]; then | ||
FOUNDRYUP_VERSION=${FOUNDRYUP_VERSION:-nightly} | ||
FOUNDRYUP_TAG=$FOUNDRYUP_VERSION | ||
|
||
# Normalize versions (handle channels, versions without v prefix | ||
if [[ "$FOUNDRYUP_VERSION" =~ ^nightly ]]; then | ||
FOUNDRYUP_VERSION="nightly" | ||
elif [[ "$FOUNDRYUP_VERSION" == [[:digit:]]* ]]; then | ||
# Add v prefix | ||
FOUNDRYUP_VERSION="v${FOUNDRYUP_VERSION}" | ||
FOUNDRYUP_TAG="${FOUNDRYUP_VERSION}" | ||
fi | ||
|
||
say "installing foundry (version ${FOUNDRYUP_VERSION}, tag ${FOUNDRYUP_TAG})" | ||
|
||
uname_s=$(uname -s) | ||
PLATFORM=$(tolower "${FOUNDRYUP_PLATFORM:-$uname_s}") | ||
EXT="tar.gz" | ||
case $PLATFORM in | ||
linux) ;; | ||
darwin|mac*) | ||
PLATFORM="darwin" | ||
;; | ||
mingw*|win*) | ||
EXT="zip" | ||
PLATFORM="win32" | ||
;; | ||
*) | ||
err "unsupported platform: $PLATFORM" | ||
;; | ||
esac | ||
|
||
uname_m=$(uname -m) | ||
ARCHITECTURE=$(tolower "${FOUNDRYUP_ARCH:-$uname_m}") | ||
if [ "${ARCHITECTURE}" = "x86_64" ]; then | ||
# Redirect stderr to /dev/null to avoid printing errors if non Rosetta. | ||
if [ "$(sysctl -n sysctl.proc_translated 2>/dev/null)" = "1" ]; then | ||
ARCHITECTURE="arm64" # Rosetta. | ||
else | ||
ARCHITECTURE="amd64" # Intel. | ||
fi | ||
elif [ "${ARCHITECTURE}" = "arm64" ] ||[ "${ARCHITECTURE}" = "aarch64" ] ; then | ||
ARCHITECTURE="arm64" # Arm. | ||
else | ||
ARCHITECTURE="amd64" # Amd. | ||
fi | ||
|
||
# Compute the URL of the release tarball in the Foundry repository. | ||
RELEASE_URL="https://github.com/${FOUNDRYUP_REPO}/releases/download/${FOUNDRYUP_TAG}/" | ||
BIN_ARCHIVE_URL="${RELEASE_URL}foundry_${FOUNDRYUP_VERSION}_${PLATFORM}_${ARCHITECTURE}.$EXT" | ||
MAN_TARBALL_URL="${RELEASE_URL}foundry_man_${FOUNDRYUP_VERSION}.tar.gz" | ||
|
||
# Download and extract the binaries archive | ||
say "downloading latest forge, and cast" | ||
if [ "$PLATFORM" = "win32" ]; then | ||
tmp="$(mktemp -d 2>/dev/null || echo ".")/foundry-zksync.zip" | ||
ensure download "$BIN_ARCHIVE_URL" "$tmp" | ||
ensure unzip "$tmp" -d "$FOUNDRY_BIN_DIR" | ||
rm -f "$tmp" | ||
else | ||
ensure download "$BIN_ARCHIVE_URL" | ensure tar -xzC "$FOUNDRY_BIN_DIR" | ||
fi | ||
|
||
# Optionally download the manuals | ||
if check_cmd tar; then | ||
say "downloading manpages" | ||
mkdir -p "$FOUNDRY_MAN_DIR" | ||
download "$MAN_TARBALL_URL" | tar -xzC "$FOUNDRY_MAN_DIR" | ||
else | ||
say 'skipping manpage download: missing "tar"' | ||
fi | ||
|
||
for bin in "${BINS[@]}"; do | ||
bin_path="$FOUNDRY_BIN_DIR/$bin" | ||
|
||
# Print installed msg | ||
say "installed - $(ensure "$bin_path" --version)" | ||
|
||
# Check if the default path of the binary is not in FOUNDRY_BIN_DIR | ||
which_path="$(command -v "$bin" || true)" | ||
if [ -n "$which_path" ] && [ "$which_path" != "$bin_path" ]; then | ||
warn "" | ||
cat 1>&2 <<EOF | ||
There are multiple binaries with the name '$bin' present in your 'PATH'. | ||
This may be the result of installing '$bin' using another method, | ||
like Cargo or other package managers. | ||
You may need to run 'rm $which_path' or move '$FOUNDRY_BIN_DIR' | ||
in your 'PATH' to allow the newly installed version to take precedence! | ||
EOF | ||
fi | ||
done | ||
|
||
# Begin anvil-zksync installation | ||
say "downloading latest anvil-zksync" | ||
|
||
uname_str="$(uname)" | ||
case "$uname_str" in | ||
"Linux") | ||
os="unknown-linux-gnu" | ||
# Note: If `lscpu` isn't guaranteed to be available, | ||
# you may want to fallback to `uname -m` | ||
arch=$(lscpu | awk '/Architecture:/{print $2}') | ||
;; | ||
"Darwin") | ||
os="apple-darwin" | ||
arch=$(arch) | ||
;; | ||
*) | ||
err "anvil-zksync only supports Linux and MacOS! Detected OS: $uname_str" | ||
;; | ||
esac | ||
|
||
# Normalize architecture | ||
case "$arch" in | ||
"x86_64") | ||
architecture="x86_64" | ||
;; | ||
"arm64"|"aarch64") | ||
architecture="aarch64" | ||
;; | ||
*) | ||
err "Unsupported architecture detected!" | ||
;; | ||
esac | ||
|
||
TARGET="${architecture}-${os}" | ||
|
||
if [ "$PLATFORM" = "linux" ] || [ "$PLATFORM" = "darwin" ]; then | ||
ANVIL_REPO="matter-labs/anvil-zksync" | ||
|
||
ANVIL_TAG=$(curl -s https://api.github.com/repos/$ANVIL_REPO/releases/latest | sed -n 's/.*"tag_name": "\([^"]*\)".*/\1/p') | ||
|
||
if [ -z "$ANVIL_TAG" ]; then | ||
err "failed to get latest tag for anvil-zksync" | ||
fi | ||
|
||
ANVIL_BIN_NAME="anvil-zksync-${ANVIL_TAG}-${TARGET}.${EXT}" | ||
|
||
ANVIL_BIN_URL="https://github.com/$ANVIL_REPO/releases/download/$ANVIL_TAG/$ANVIL_BIN_NAME" | ||
|
||
ANVIL_BIN_PATH="$FOUNDRY_BIN_DIR/anvil-zksync" | ||
|
||
ensure download "$ANVIL_BIN_URL" | ensure tar -xzC "$FOUNDRY_BIN_DIR" | ||
|
||
chmod +x "$ANVIL_BIN_PATH" | ||
|
||
say "installed - $(ensure "$ANVIL_BIN_PATH" --version)" | ||
else | ||
warn "anvil-zksync is not supported on your platform ($TARGET). Skipping anvil-zksync installation." | ||
fi | ||
|
||
say "done!" | ||
|
||
# Install by cloning the repo with the provided branch/tag | ||
else | ||
need_cmd cargo | ||
FOUNDRYUP_BRANCH=${FOUNDRYUP_BRANCH:-main} | ||
REPO_PATH="$FOUNDRY_DIR/$FOUNDRYUP_REPO" | ||
|
||
# If repo path does not exist, grab the author from the repo, make a directory in .foundry, cd to it and clone. | ||
if [ ! -d "$REPO_PATH" ]; then | ||
AUTHOR="$(echo "$FOUNDRYUP_REPO" | cut -d'/' -f1 -)" | ||
ensure mkdir -p "$FOUNDRY_DIR/$AUTHOR" | ||
cd "$FOUNDRY_DIR/$AUTHOR" | ||
ensure git clone "https://github.com/$FOUNDRYUP_REPO" | ||
fi | ||
|
||
# Force checkout, discarding any local changes | ||
cd "$REPO_PATH" | ||
ensure git fetch origin "${FOUNDRYUP_BRANCH}:remotes/origin/${FOUNDRYUP_BRANCH}" | ||
ensure git checkout "origin/${FOUNDRYUP_BRANCH}" | ||
|
||
# If set, checkout specific commit from branch | ||
if [ -n "$FOUNDRYUP_COMMIT" ]; then | ||
say "installing at commit $FOUNDRYUP_COMMIT" | ||
ensure git checkout "$FOUNDRYUP_COMMIT" | ||
fi | ||
|
||
# Build the repo and install the binaries locally to the .foundry bin directory. | ||
ensure cargo build --bins "${CARGO_BUILD_ARGS[@]}" | ||
for bin in "${BINS[@]}"; do | ||
for try_path in target/release/$bin target/release/$bin.exe; do | ||
if [ -f "$try_path" ]; then | ||
[ -e "$FOUNDRY_BIN_DIR/$bin" ] && warn "overwriting existing $bin in $FOUNDRY_BIN_DIR" | ||
mv -f "$try_path" "$FOUNDRY_BIN_DIR" | ||
fi | ||
done | ||
done | ||
|
||
# If help2man is installed, use it to add Foundry man pages. | ||
if check_cmd help2man; then | ||
for bin in "${BINS[@]}"; do | ||
help2man -N "$FOUNDRY_BIN_DIR/$bin" > "$FOUNDRY_MAN_DIR/$bin.1" | ||
done | ||
fi | ||
|
||
say "done" | ||
fi | ||
} | ||
|
||
usage() { | ||
cat 1>&2 <<EOF | ||
The installer for Foundry-zksync. | ||
Update or revert to a specific Foundry-zksync version with ease. | ||
By default, the latest nightly version is installed from built binaries. | ||
USAGE: | ||
foundryup-zksync <OPTIONS> | ||
OPTIONS: | ||
-h, --help Print help information | ||
-v, --version Install a specific version from built binaries | ||
-b, --branch Build and install a specific branch | ||
-P, --pr Build and install a specific Pull Request | ||
-C, --commit Build and install a specific commit | ||
-r, --repo Build and install from a remote GitHub repo (uses default branch if no other options are set) | ||
-p, --path Build and install a local repository | ||
-j, --jobs Number of CPUs to use for building Foundry (default: all CPUs) | ||
--arch Install a specific architecture (supports amd64 and arm64) | ||
--platform Install a specific platform (supports win32, linux, and darwin) | ||
EOF | ||
} | ||
|
||
say() { | ||
printf "foundryup-zksync: %s\n" "$1" | ||
} | ||
|
||
warn() { | ||
say "warning: ${1}" >&2 | ||
} | ||
|
||
err() { | ||
say "$1" >&2 | ||
exit 1 | ||
} | ||
|
||
tolower() { | ||
echo "$1" | awk '{print tolower($0)}' | ||
} | ||
|
||
need_cmd() { | ||
if ! check_cmd "$1"; then | ||
err "need '$1' (command not found)" | ||
fi | ||
} | ||
|
||
check_cmd() { | ||
command -v "$1" &>/dev/null | ||
} | ||
|
||
# Run a command that should never fail. If the command fails execution | ||
# will immediately terminate with an error showing the failing command. | ||
ensure() { | ||
if ! "$@"; then err "command failed: $*"; fi | ||
} | ||
|
||
# Downloads $1 into $2 or stdout | ||
download() { | ||
if [ -n "$2" ]; then | ||
# output into $2 | ||
if check_cmd curl; then | ||
curl -#o "$2" -L "$1" | ||
else | ||
wget --show-progress -qO "$2" "$1" | ||
fi | ||
else | ||
# output to stdout | ||
if check_cmd curl; then | ||
curl -#L "$1" | ||
else | ||
wget --show-progress -qO- "$1" | ||
fi | ||
fi | ||
} | ||
|
||
# Banner Function for Foundry | ||
banner() { | ||
printf ' | ||
.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx | ||
╔═╗ ╔═╗ ╦ ╦ ╔╗╔ ╔╦╗ ╦═╗ ╦ ╦ Portable and modular toolkit | ||
╠╣ ║ ║ ║ ║ ║║║ ║║ ╠╦╝ ╚╦╝ for ZKsync Application Development | ||
╚ ╚═╝ ╚═╝ ╝╚╝ ═╩╝ ╩╚═ ╩ written in Rust. | ||
.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx | ||
Fork of : https://github.com/foundry-rs/ | ||
Repo : https://github.com/matter-labs/foundry-zksync/ | ||
Book : https://foundry-book.zksync.io/ | ||
.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx.xOx | ||
' | ||
|
||
} | ||
|
||
main "$@" |
Oops, something went wrong.