Skip to content

Commit

Permalink
Added deploy to ZkSync Sepolia
Browse files Browse the repository at this point in the history
  • Loading branch information
luloxi committed Dec 15, 2024
1 parent 63f16b9 commit 7df1697
Show file tree
Hide file tree
Showing 92 changed files with 1,322,808 additions and 20 deletions.
388 changes: 388 additions & 0 deletions foundryup-zksync
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 "$@"
Loading

0 comments on commit 7df1697

Please sign in to comment.