diff --git a/.devcontainer/projectserum/build@sha256:75b75eab447ebcca1f471c98583d9b5d82c4be122c470852a022afcf9c98bead b/.devcontainer/projectserum/build@sha256:75b75eab447ebcca1f471c98583d9b5d82c4be122c470852a022afcf9c98bead new file mode 100644 index 0000000..39bbd26 --- /dev/null +++ b/.devcontainer/projectserum/build@sha256:75b75eab447ebcca1f471c98583d9b5d82c4be122c470852a022afcf9c98bead @@ -0,0 +1,4 @@ +{ + "image": "mcr.microsoft.com/devcontainers/universal:2", + "features": {} +} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c89841e..cba7724 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -27,23 +27,18 @@ jobs: matrix: name: [ linux, - windows, macos ] include: - name: linux os: ubuntu-latest - artifact_path: target/release/verifier-cli - asset_name: verifier-cli-linux - - name: windows - os: windows-latest - artifact_path: target/release/verifier-cli.exe - asset_name: verifier-cli-windows + artifact_path: target/release/solana-verify + asset_name: solana-verify-linux - name: macos os: macos-latest - artifact_path: target/release/verifier-cli - asset_name: verifier-cli-macos + artifact_path: target/release/solana-verify + asset_name: solana-verify-macos steps: - name: Checkout code uses: actions/checkout@v1 @@ -60,13 +55,13 @@ jobs: - name: Rename executable based on OS env: ASSET_NAME: ${{matrix.asset_name}} - EXEC_PATH: $${{matrix.artifact_path}} + EXEC_PATH: ${{matrix.artifact_path}} run: | - echo "asset name: $ASSET_NAME executable path: $EXEC_PATH" - mv EXEC_PATH $ASSET_NAME + echo "asset name: ${ASSET_NAME} executable path: ${EXEC_PATH}" + mv ${EXEC_PATH} ${ASSET_NAME} - name: Upload binaries to release uses: softprops/action-gh-release@v1 with: - files: $ASSET_NAME + files: ${{matrix.asset_name}} fail_on_unmatched_files: true diff --git a/.github/workflows/generate_dockerfiles.yml b/.github/workflows/generate_dockerfiles.yml new file mode 100644 index 0000000..cdb24c8 --- /dev/null +++ b/.github/workflows/generate_dockerfiles.yml @@ -0,0 +1,56 @@ +name: Generate Dockerfiles + +on: + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + generate-dockerfiles: + runs-on: ubuntu-latest + steps: + - uses: actions/create-github-app-token@v1 + id: generate-token + with: + app-id: ${{ vars.ROBO_PR_APP_ID }} + private-key: ${{ secrets.ROBO_PR_CLIENT_SECRET }} + + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install uv + uses: astral-sh/setup-uv@v3 + with: + enable-cache: true + cache-dependency-glob: "uv.lock" + + - name: "Set up Python" + uses: actions/setup-python@v5 + with: + python-version-file: "pyproject.toml" + + - name: Install dependencies with uv + run: | + uv sync --all-extras --dev + + - name: Run generate_dockerfiles.py + run: uv run generate_dockerfiles.py + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v5 + with: + token: ${{ steps.generate-token.outputs.token }} + commit-message: Update Dockerfiles + title: 'Update Dockerfiles' + body: | + This PR updates the Dockerfiles in the `docker/` directory. + + Generated automatically by the Generate Dockerfiles workflow. + branch: autopr-update-dockerfiles + delete-branch: true + base: master + labels: | + automated pr + dockerfiles diff --git a/.github/workflows/publish_all_dockerfiles.yaml b/.github/workflows/publish_all_dockerfiles.yaml new file mode 100644 index 0000000..02885a1 --- /dev/null +++ b/.github/workflows/publish_all_dockerfiles.yaml @@ -0,0 +1,88 @@ +name: Publish All Changed Images + +on: + workflow_dispatch: + inputs: + commit_hash: + description: 'Commit hash to compare from' + required: true + type: string + + +jobs: + detect_changes: + runs-on: ubuntu-latest + outputs: + versions: ${{ steps.set-matrix.outputs.versions }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - id: set-matrix + run: | + CHANGED_FILES=$(git diff --name-only --diff-filter=d ${{ github.event.inputs.commit_hash }} ${{ github.sha }} | grep '^docker/v.*\.Dockerfile$' || true) + echo "CHANGED_FILE=$CHANGED_FILES" + if [ -n "$CHANGED_FILES" ]; then + echo "$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11])' | tr -d '[:space:]')" + echo "versions=$(echo "$CHANGED_FILES" | jq -R -s 'split("\n") | map(select(length > 0)) | map(.[8:-11])' | tr -d '[:space:]')" >> $GITHUB_OUTPUT + else + echo "versions=[]" >> $GITHUB_OUTPUT + fi + echo $GITHUB_OUTPUT + - name: Display matrix + run: echo "${{ steps.set-matrix.outputs.versions }}" + + push_to_registries: + needs: detect_changes + if: ${{ needs.detect_changes.outputs.versions != '[]' }} + strategy: + matrix: + version: ${{ fromJson(needs.detect_changes.outputs.versions )}} + name: Push Docker images to docker.io + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Report version + run: echo "Pushing Docker image for version ${{ matrix.version }}" + + - name: Check out the repo + uses: actions/checkout@v4 + + - name: Log in to the Container registry + uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 + with: + registry: docker.io + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 + with: + images: | + docker.io/solanafoundation/solana-verifiable-build + + - name: Build and push Docker images + id: push + uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 + with: + context: docker/ + file: docker/v${{ matrix.version }}.Dockerfile + push: true + tags: | + ${{ steps.meta.outputs.tags }} + docker.io/solanafoundation/solana-verifiable-build:${{ matrix.version }} + labels: | + ${{ steps.meta.outputs.labels }} + org.opencontainers.image.source=https://github.com/${{ github.repository }} + + - name: Generate artifact attestation + uses: actions/attest-build-provenance@v1 + with: + subject-name: index.docker.io/solanafoundation/solana-verifiable-build + subject-digest: ${{ steps.push.outputs.digest }} + push-to-registry: true diff --git a/.github/workflows/publish_dockerfile.yaml b/.github/workflows/publish_dockerfile.yaml new file mode 100644 index 0000000..68cca20 --- /dev/null +++ b/.github/workflows/publish_dockerfile.yaml @@ -0,0 +1,57 @@ +name: Publish Docker Image + +on: + workflow_dispatch: + inputs: + version: + description: 'Solana version to generate Dockerfile for (e.g., 1.16.0)' + required: true + type: string + +jobs: + push_to_registries: + name: Push Docker image to ghcr.io + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + attestations: write + id-token: write + steps: + - name: Check out the repo + uses: actions/checkout@v4 + + - name: Log in to the Container registry + uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1 + with: + registry: docker.io + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7 + with: + images: | + docker.io/solanafoundation/solana-verifiable-build + + - name: Build and push Docker images + id: push + uses: docker/build-push-action@3b5e8027fcad23fda98b2e3ac259d8d67585f671 + with: + context: docker/ + file: docker/v${{ github.event.inputs.version }}.Dockerfile + push: true + tags: | + ${{ steps.meta.outputs.tags }} + docker.io/solanafoundation/solana-verifiable-build:${{ github.event.inputs.version }} + labels: | + ${{ steps.meta.outputs.labels }} + org.opencontainers.image.source=https://github.com/${{ github.repository }} + + - name: Generate artifact attestation + uses: actions/attest-build-provenance@v1 + with: + subject-name: index.docker.io/solanafoundation/solana-verifiable-build + subject-digest: ${{ steps.push.outputs.digest }} + push-to-registry: true diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml new file mode 100644 index 0000000..7ccf57e --- /dev/null +++ b/.github/workflows/test.yaml @@ -0,0 +1,39 @@ +name: Run Integration Tests + +on: + push: + branches: [master] + pull_request: + branches: [master] + workflow_dispatch: + +jobs: + test: + name: Run Tests + runs-on: ubuntu-latest + strategy: + fail-fast: false # Continue with other tests even if one fails + matrix: + test_name: + - test_phoenix_v1 + - test_squads_v3 + - test_drift_v2 + - test_marginfi_v2 + - test_local_example + - test_verify_from_image + - test_games_preset + - test_agave_2_1 + steps: + - uses: actions/checkout@v4 + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + + - name: Cache dependencies + uses: Swatinem/rust-cache@v2 + + - name: Build + run: cargo build + + - name: Run ${{ matrix.test_name }} + run: cargo test ${{ matrix.test_name }} -- --nocapture diff --git a/.github/workflows/update_whitelist.yaml b/.github/workflows/update_whitelist.yaml new file mode 100644 index 0000000..7f115c3 --- /dev/null +++ b/.github/workflows/update_whitelist.yaml @@ -0,0 +1,61 @@ +name: Update Docker Image Whitelist + +on: + workflow_dispatch: + push: + branches: + - master + paths: + - 'docker/**' + +permissions: + contents: write + pull-requests: write + +jobs: + update-docker-image-whitelist: + runs-on: ubuntu-latest + steps: + - uses: actions/create-github-app-token@v1 + id: generate-token + with: + app-id: ${{ vars.ROBO_PR_APP_ID }} + private-key: ${{ secrets.ROBO_PR_CLIENT_SECRET }} + + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install uv + uses: astral-sh/setup-uv@v3 + with: + enable-cache: true + cache-dependency-glob: "uv.lock" + + - name: "Set up Python" + uses: actions/setup-python@v5 + with: + python-version-file: "pyproject.toml" + + - name: Install dependencies with uv + run: | + uv sync --all-extras --dev + + - name: Run generate_dockerfiles.py + run: uv run update_image_whitelist.py + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v5 + with: + token: ${{ steps.generate-token.outputs.token }} + commit-message: Update image whitelist + title: 'Update Image Whitelist' + body: | + This PR updates `image_config.rs` with the latest published Docker image tags. + + Generated automatically by the Update Docker Image Whitelist workflow. + branch: autopr-update-image-whitelist + delete-branch: true + base: master + labels: | + automated pr + image whitelist diff --git a/.gitignore b/.gitignore index b60de5b..c77f2e7 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ **/target +.DS_Store diff --git a/Cargo.lock b/Cargo.lock index 5a2af48..562bd7f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -12,6 +12,15 @@ dependencies = [ "regex", ] +[[package]] +name = "addr2line" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -34,7 +43,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" dependencies = [ "cfg-if", - "cipher 0.3.0", + "cipher", "cpufeatures", "opaque-debug", ] @@ -47,7 +56,7 @@ checksum = "589c637f0e68c877bbd59a4599bbe849cac8e5f3e4b5a3ebae8f528cd218dcdc" dependencies = [ "aead", "aes", - "cipher 0.3.0", + "cipher", "ctr", "polyval", "subtle", @@ -60,16 +69,29 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" dependencies = [ - "getrandom 0.2.8", + "getrandom 0.2.15", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "getrandom 0.2.15", "once_cell", "version_check", + "zerocopy", ] [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -89,6 +111,12 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -109,21 +137,144 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.68" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest 0.10.7", + "itertools", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.107", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.107", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.107", +] + +[[package]] +name = "ark-std" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] [[package]] name = "arrayref" -version = "0.3.6" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" -version = "0.7.2" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "ascii" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" [[package]] name = "asn1-rs" @@ -138,7 +289,7 @@ dependencies = [ "num-traits", "rusticata-macros", "thiserror", - "time 0.3.17", + "time", ] [[package]] @@ -147,8 +298,8 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2", + "quote", "syn 1.0.107", "synstructure", ] @@ -159,8 +310,8 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2", + "quote", "syn 1.0.107", ] @@ -170,11 +321,22 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener", + "futures-core", +] + [[package]] name = "async-compression" -version = "0.3.15" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942c7cd7ae39e91bde4820d74132e9862e62c2f386c3aa90ccf55949f5bad63a" +checksum = "5b0122885821398cc923ece939e24d1056a2384ee719432397fa9db87230ff11" dependencies = [ "brotli", "flate2", @@ -195,13 +357,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.63" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff18d764974428cf3a9328e23fc5c986f5fbed46e6cd4cdf42544df5d297ec1" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", - "syn 1.0.107", + "proc-macro2", + "quote", + "syn 2.0.79", ] [[package]] @@ -221,6 +383,21 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide 0.7.1", + "object", + "rustc-demangle", +] + [[package]] name = "base64" version = "0.12.3" @@ -235,9 +412,15 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.0" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "base64ct" @@ -260,6 +443,15 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +dependencies = [ + "serde", +] + [[package]] name = "bitmaps" version = "2.1.0" @@ -271,16 +463,16 @@ dependencies = [ [[package]] name = "blake3" -version = "1.3.3" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ae2468a89544a466886840aa467a25b766499f4f04bf7d9fcd10ecee9fccef" +checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if", "constant_time_eq", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -295,9 +487,9 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] @@ -314,31 +506,89 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa" dependencies = [ - "borsh-derive", + "borsh-derive 0.9.3", "hashbrown 0.11.2", ] +[[package]] +name = "borsh" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115e54d64eb62cdebad391c19efc9dce4981c690c85a33a12199d99bb9546fee" +dependencies = [ + "borsh-derive 0.10.4", + "hashbrown 0.13.2", +] + +[[package]] +name = "borsh" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe5b10e214954177fb1dc9fbd20a1a2608fe99e6c832033bdc7cea287a20d77" +dependencies = [ + "borsh-derive 1.5.0", + "cfg_aliases", +] + [[package]] name = "borsh-derive" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775" dependencies = [ - "borsh-derive-internal", - "borsh-schema-derive-internal", + "borsh-derive-internal 0.9.3", + "borsh-schema-derive-internal 0.9.3", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.107", +] + +[[package]] +name = "borsh-derive" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "831213f80d9423998dd696e2c5345aba6be7a0bd8cd19e31c5243e13df1cef89" +dependencies = [ + "borsh-derive-internal 0.10.4", + "borsh-schema-derive-internal 0.10.4", "proc-macro-crate 0.1.5", - "proc-macro2 1.0.50", + "proc-macro2", "syn 1.0.107", ] +[[package]] +name = "borsh-derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a8646f94ab393e43e8b35a2558b1624bed28b97ee09c5d15456e3c9463f46d" +dependencies = [ + "once_cell", + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.79", + "syn_derive", +] + [[package]] name = "borsh-derive-internal" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2", + "quote", + "syn 1.0.107", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65d6ba50644c98714aa2a70d13d7df3cd75cd2b523a2b452bf010443800976b3" +dependencies = [ + "proc-macro2", + "quote", "syn 1.0.107", ] @@ -348,8 +598,19 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2", + "quote", + "syn 1.0.107", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276691d96f063427be83e6692b86148e488ebba9f48f77788724ca027ba3b6d4" +dependencies = [ + "proc-macro2", + "quote", "syn 1.0.107", ] @@ -380,6 +641,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + [[package]] name = "bumpalo" version = "3.12.0" @@ -398,9 +668,9 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.13.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c041d3eab048880cb0b86b256447da3f18859a163c3b8d8893f4e6368abe6393" +checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae" dependencies = [ "bytemuck_derive", ] @@ -411,22 +681,22 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aca418a974d83d40a0c1f0c5cba6ff4bc28d8df099109ca459a2118d40b6322" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2", + "quote", "syn 1.0.107", ] [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.3.0" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" [[package]] name = "caps" @@ -438,13 +708,37 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cargo-lock" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e11c675378efb449ed3ce8de78d75d0d80542fc98487c26aba28eb3b82feac72" +dependencies = [ + "semver", + "serde", + "toml 0.7.4", + "url", +] + +[[package]] +name = "cargo_toml" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "599aa35200ffff8f04c1925aa1acc92fa2e08874379ef42e210a80e527e60838" +dependencies = [ + "serde", + "toml 0.7.4", +] + [[package]] name = "cc" -version = "1.0.78" +version = "1.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" +checksum = "812acba72f0a070b003d3697490d2b55b837230ae7c6c6497f05cc2ddbb8d938" dependencies = [ "jobserver", + "libc", + "shlex", ] [[package]] @@ -453,20 +747,25 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + [[package]] name = "chrono" -version = "0.4.23" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ + "android-tzdata", "iana-time-zone", "js-sys", - "num-integer", "num-traits", "serde", - "time 0.1.45", "wasm-bindgen", - "winapi", + "windows-targets 0.52.0", ] [[package]] @@ -478,16 +777,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "cipher" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1873270f8f7942c191139cb8a40fd228da6c3fd2fc376d7e92d47aa14aeb59e" -dependencies = [ - "crypto-common", - "inout", -] - [[package]] name = "clap" version = "2.34.0" @@ -496,7 +785,7 @@ checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" dependencies = [ "ansi_term", "atty", - "bitflags", + "bitflags 1.3.2", "strsim 0.8.0", "textwrap 0.11.0", "unicode-width", @@ -510,43 +799,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71655c45cb9845d3270c9d6df84ebe72b4dad3c2ba3f7023ad47c144e4e473a5" dependencies = [ "atty", - "bitflags", - "clap_lex 0.2.4", - "indexmap", + "bitflags 1.3.2", + "clap_lex", + "indexmap 1.9.2", "once_cell", "strsim 0.10.0", "termcolor", "textwrap 0.16.0", ] -[[package]] -name = "clap" -version = "4.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f13b9c79b5d1dd500d20ef541215a6423c75829ef43117e1b4d17fd8af0b5d76" -dependencies = [ - "bitflags", - "clap_derive", - "clap_lex 0.3.1", - "is-terminal", - "once_cell", - "strsim 0.10.0", - "termcolor", -] - -[[package]] -name = "clap_derive" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "684a277d672e91966334af371f1a7b5833f9aa00b07c84e92fbce95e00208ce8" -dependencies = [ - "heck", - "proc-macro-error", - "proc-macro2 1.0.50", - "quote 1.0.23", - "syn 1.0.107", -] - [[package]] name = "clap_lex" version = "0.2.4" @@ -557,60 +818,48 @@ dependencies = [ ] [[package]] -name = "clap_lex" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "783fe232adfca04f90f56201b26d79682d4cd2625e0bc7290b95123afe558ade" -dependencies = [ - "os_str_bytes", -] - -[[package]] -name = "cmd_lib" -version = "1.3.0" +name = "codespan-reporting" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ba0f413777386d37f85afa5242f277a7b461905254c1af3c339d4af06800f62" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" dependencies = [ - "cmd_lib_macros", - "faccess", - "lazy_static", - "log", - "os_pipe", + "termcolor", + "unicode-width", ] [[package]] -name = "cmd_lib_macros" -version = "1.3.0" +name = "combine" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e66605092ff6c6e37e0246601ae6c3f62dc1880e0599359b5f303497c112dc0" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" dependencies = [ - "proc-macro-error", - "proc-macro2 1.0.50", - "quote 1.0.23", - "syn 1.0.107", + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", ] [[package]] -name = "codespan-reporting" -version = "0.11.1" +name = "concurrent-queue" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" dependencies = [ - "termcolor", - "unicode-width", + "crossbeam-utils", ] [[package]] name = "console" -version = "0.15.5" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3d79fbe8970a77e3e34151cc13d3b3e248aa0faaecb9f6091fa07ebefe5ad60" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" dependencies = [ "encode_unicode", "lazy_static", "libc", "unicode-width", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -625,9 +874,9 @@ dependencies = [ [[package]] name = "console_log" -version = "0.2.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501a375961cef1a0d44767200e66e4a559283097e91d0730b1d75dfb2f8a1494" +checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" dependencies = [ "log", "web-sys", @@ -641,9 +890,9 @@ checksum = "e4c78c047431fee22c1a7bb92e00ad095a02a983affe4d8a72e2a2c62c1b94f3" [[package]] name = "constant_time_eq" -version = "0.2.4" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3ad85c1f65dc7b37604eb0e89748faf0b9653065f2a8ef69f96a687ec1e9279" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" [[package]] name = "core-foundation" @@ -681,11 +930,10 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.6" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" +checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" dependencies = [ - "cfg-if", "crossbeam-utils", ] @@ -715,12 +963,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.14" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crunchy" @@ -754,7 +999,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" dependencies = [ - "cipher 0.3.0", + "cipher", ] [[package]] @@ -792,8 +1037,8 @@ dependencies = [ "cc", "codespan-reporting", "once_cell", - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2", + "quote", "scratch", "syn 1.0.107", ] @@ -810,11 +1055,59 @@ version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357f40d1f06a24b60ae1fe122542c1fb05d28d32acb2aed064e84bc2ad1e252e" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2", + "quote", "syn 1.0.107", ] +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.79", +] + +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "data-encoding" version = "2.3.3" @@ -839,7 +1132,7 @@ dependencies = [ "asn1-rs", "displaydoc", "nom", - "num-bigint 0.4.3", + "num-bigint 0.4.6", "num-traits", "rusticata-macros", ] @@ -850,11 +1143,22 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.107", +] + [[package]] name = "dialoguer" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af3c796f3b0b408d9fd581611b47fa850821fcb84aa640b83a3c1a5be2d691f2" +checksum = "59c6f2989294b9a498d3ad5491a79c6deb604617378e1cdc4bfc1c1361fe2f87" dependencies = [ "console", "shell-words", @@ -873,11 +1177,11 @@ dependencies = [ [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer 0.10.3", + "block-buffer 0.10.4", "crypto-common", "subtle", ] @@ -909,32 +1213,32 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bf95dc3f046b9da4f2d51833c0d3547d8564ef6910f5c1ed130306a75b92886" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2", + "quote", "syn 1.0.107", ] [[package]] -name = "dlopen" -version = "0.1.8" +name = "dlopen2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e80ad39f814a9abe68583cd50a2d45c8a67561c3361ab8da240587dda80937" +checksum = "09b4f5f101177ff01b8ec4ecc81eead416a8aa42819a2869311b3420fa114ffa" dependencies = [ - "dlopen_derive", - "lazy_static", + "dlopen2_derive", "libc", + "once_cell", "winapi", ] [[package]] -name = "dlopen_derive" -version = "0.1.4" +name = "dlopen2_derive" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f236d9e1b1fbd81cea0f9cbdc8dcc7e8ebcd80e6659cd7cb2ad5f6c05946c581" +checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" dependencies = [ - "libc", - "quote 0.6.13", - "syn 0.15.44", + "proc-macro2", + "quote", + "syn 2.0.79", ] [[package]] @@ -975,14 +1279,14 @@ dependencies = [ "derivation-path", "ed25519-dalek", "hmac 0.12.1", - "sha2 0.10.6", + "sha2 0.10.8", ] [[package]] name = "either" -version = "1.8.1" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "encode_unicode" @@ -1001,34 +1305,22 @@ dependencies = [ [[package]] name = "enum-iterator" -version = "0.8.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2953d1df47ac0eb70086ccabf0275aa8da8591a28bd358ee2b52bd9f9e3ff9e9" +checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94" dependencies = [ "enum-iterator-derive", ] [[package]] name = "enum-iterator-derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8958699f9359f0b04e691a13850d48b7de329138023876d07cbd024c2c820598" -dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "enum_dispatch" -version = "0.3.11" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11f36e95862220b211a6e2aa5eca09b4fa391b13cd52ceb8035a24bf65a79de2" +checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" dependencies = [ - "once_cell", - "proc-macro2 1.0.50", - "quote 1.0.23", - "syn 1.0.107", + "proc-macro2", + "quote", + "syn 2.0.79", ] [[package]] @@ -1045,25 +1337,10 @@ dependencies = [ ] [[package]] -name = "errno" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1" -dependencies = [ - "errno-dragonfly", - "libc", - "winapi", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" +name = "equivalent" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "event-listener" @@ -1071,17 +1348,6 @@ version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" -[[package]] -name = "faccess" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ae66425802d6a903e268ae1a08b8c38ba143520f227a205edf4e9c7e3e26d5" -dependencies = [ - "bitflags", - "libc", - "winapi", -] - [[package]] name = "fastrand" version = "1.8.0" @@ -1104,7 +1370,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" dependencies = [ "crc32fast", - "miniz_oxide", + "miniz_oxide 0.6.2", ] [[package]] @@ -1113,20 +1379,35 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] [[package]] name = "futures" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -1139,9 +1420,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -1149,15 +1430,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -1166,38 +1447,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-macro" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", - "syn 1.0.107", + "proc-macro2", + "quote", + "syn 2.0.79", ] [[package]] name = "futures-sink" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -1211,20 +1492,11 @@ dependencies = [ "slab", ] -[[package]] -name = "fxhash" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" -dependencies = [ - "byteorder", -] - [[package]] name = "generic-array" -version = "0.14.6" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "serde", "typenum", @@ -1256,9 +1528,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "js-sys", @@ -1267,6 +1539,23 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "gimli" +version = "0.27.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" + +[[package]] +name = "goblin" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7666983ed0dd8d21a6f6576ee00053ca0926fb281a5522577a4dbd0f1b54143" +dependencies = [ + "log", + "plain", + "scroll", +] + [[package]] name = "h2" version = "0.3.15" @@ -1279,20 +1568,29 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 1.9.2", "slab", "tokio", "tokio-util", "tracing", ] +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + [[package]] name = "hashbrown" version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" dependencies = [ - "ahash", + "ahash 0.7.6", ] [[package]] @@ -1300,15 +1598,21 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash", + "ahash 0.8.11", ] [[package]] -name = "heck" -version = "0.4.0" +name = "hashbrown" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hermit-abi" @@ -1321,18 +1625,15 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.2.6" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" -dependencies = [ - "libc", -] +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hex" -version = "0.3.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "805026a5d0141ffc30abb3be3173848ad46a1b1664fe632428479619a3644d77" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "histogram" @@ -1356,7 +1657,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -1427,7 +1728,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.4.9", "tokio", "tower-service", "tracing", @@ -1436,9 +1737,9 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.23.2" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1788965e61b367cd03a62950836d5cd41560c3577d90e40e0819373194d1661c" +checksum = "0646026eb1b3eea4cd9ba47912ea5ce9cc07713d105b1a14698f4e6433d348b7" dependencies = [ "http", "hyper", @@ -1447,6 +1748,19 @@ dependencies = [ "tokio-rustls", ] +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + [[package]] name = "iana-time-zone" version = "0.1.53" @@ -1471,11 +1785,17 @@ dependencies = [ "cxx-build", ] +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "idna" -version = "0.3.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -1508,24 +1828,26 @@ dependencies = [ ] [[package]] -name = "indicatif" -version = "0.16.2" +name = "indexmap" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d207dc617c7a380ab07ff572a6e52fa202a2a8f355860ac9c38e23f8196be1b" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ - "console", - "lazy_static", - "number_prefix", - "regex", + "equivalent", + "hashbrown 0.14.5", ] [[package]] -name = "inout" -version = "0.1.3" +name = "indicatif" +version = "0.17.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "fb28741c9db9a713d93deb3bb9515c20788cef5815265bee4980e87bde7e0f25" dependencies = [ - "generic-array", + "console", + "instant", + "number_prefix", + "portable-atomic", + "unicode-width", ] [[package]] @@ -1537,34 +1859,12 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "io-lifetimes" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7d6c6f8c91b4b9ed43484ad1a938e393caf35960fce7f82a040497207bd8e9e" -dependencies = [ - "libc", - "windows-sys", -] - [[package]] name = "ipnet" version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146" -[[package]] -name = "is-terminal" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dfb6c8100ccc63462345b67d1bbc3679177c75ee4bf59bf29c8b1d110b8189" -dependencies = [ - "hermit-abi 0.2.6", - "io-lifetimes", - "rustix", - "windows-sys", -] - [[package]] name = "itertools" version = "0.10.5" @@ -1582,18 +1882,18 @@ checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" [[package]] name = "jobserver" -version = "0.1.25" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.60" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] @@ -1630,19 +1930,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.139" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" - -[[package]] -name = "libloading" -version = "0.7.4" +version = "0.2.159" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if", - "winapi", -] +checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5" [[package]] name = "libsecp256k1" @@ -1692,6 +1982,18 @@ dependencies = [ "libsecp256k1-core", ] +[[package]] +name = "light-poseidon" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" +dependencies = [ + "ark-bn254", + "ark-ff", + "num-bigint 0.4.6", + "thiserror", +] + [[package]] name = "link-cplusplus" version = "1.0.8" @@ -1701,23 +2003,11 @@ dependencies = [ "cc", ] -[[package]] -name = "linked-hash-map" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" - -[[package]] -name = "linux-raw-sys" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f051f77a7c8e6957c0696eac88f26b0117e54f52d3fc682ab19397a8812846a4" - [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", @@ -1725,42 +2015,39 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] name = "memchr" -version = "2.5.0" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memmap2" -version = "0.5.8" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b182332558b18d807c4ce1ca8ca983b34c3ee32765e47b3f0f69b90355cc1dc" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" dependencies = [ "libc", ] [[package]] name = "memoffset" -version = "0.6.5" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" dependencies = [ "autocfg", ] [[package]] name = "memoffset" -version = "0.7.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] @@ -1798,28 +2085,55 @@ dependencies = [ "adler", ] +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + [[package]] name = "mio" -version = "0.8.5" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" +checksum = "927a765cd3fc26206e66b296465fa9d3e5ab003e651c1b3c060e7956d96b19d2" dependencies = [ "libc", - "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", ] [[package]] name = "nix" -version = "0.24.3" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" dependencies = [ - "bitflags", + "bitflags 1.3.2", "cfg-if", "libc", - "memoffset 0.6.5", + "memoffset 0.7.1", + "pin-utils", ] [[package]] @@ -1868,11 +2182,10 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.3" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", ] @@ -1893,18 +2206,28 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2", + "quote", "syn 1.0.107", ] +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] @@ -1933,50 +2256,80 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.2.6", + "hermit-abi 0.3.9", "libc", ] [[package]] name = "num_enum" -version = "0.5.9" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a015b430d3c108a207fd776d2e2196aaf8b1cf8cf93253e3a097ff3085076a1" +dependencies = [ + "num_enum_derive 0.6.1", +] + +[[package]] +name = "num_enum" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d829733185c1ca374f17e52b762f24f535ec625d2cc1f070e34c8a9068f341b" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" dependencies = [ - "num_enum_derive", + "num_enum_derive 0.7.3", ] [[package]] name = "num_enum_derive" -version = "0.5.9" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2be1598bf1c313dcdd12092e3f1920f463462525a21b7b4e11b4168353d0123e" +checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" dependencies = [ "proc-macro-crate 1.3.0", - "proc-macro2 1.0.50", - "quote 1.0.23", - "syn 1.0.107", + "proc-macro2", + "quote", + "syn 2.0.79", ] [[package]] -name = "number_prefix" -version = "0.4.0" +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "number_prefix" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" +[[package]] +name = "object" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +dependencies = [ + "memchr", +] + [[package]] name = "oid-registry" version = "0.6.1" @@ -1988,9 +2341,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "opaque-debug" @@ -1998,6 +2351,32 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "openssl" +version = "0.10.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.107", +] + [[package]] name = "openssl-probe" version = "0.1.5" @@ -2005,13 +2384,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] -name = "os_pipe" -version = "0.9.2" +name = "openssl-sys" +version = "0.9.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb233f06c2307e1f5ce2ecad9f8121cffbbee2c95428f44ea85222e460d0d213" +checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" dependencies = [ + "cc", "libc", - "winapi", + "pkg-config", + "vcpkg", ] [[package]] @@ -2032,17 +2413,29 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.6" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba1ef8814b5c993410bb3adfad7a5ed269563e4a2f90c41f5d85be7fb47133bf" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.7", "smallvec", - "windows-sys", + "windows-targets 0.52.0", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pathdiff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" + [[package]] name = "pbkdf2" version = "0.4.0" @@ -2058,7 +2451,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -2072,9 +2465,9 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "percentage" @@ -2087,9 +2480,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -2114,6 +2507,12 @@ version = "0.3.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + [[package]] name = "polyval" version = "0.5.3" @@ -2126,6 +2525,12 @@ dependencies = [ "universal-hash", ] +[[package]] +name = "portable-atomic" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -2138,7 +2543,7 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" dependencies = [ - "toml", + "toml 0.5.11", ] [[package]] @@ -2148,7 +2553,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66618389e4ec1c7afe67d51a9bf34ff9236480f8d51e7489b7d5ab0303c13f34" dependencies = [ "once_cell", - "toml_edit", + "toml_edit 0.18.1", +] + +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit 0.21.1", ] [[package]] @@ -2158,9 +2572,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.50", - "quote 1.0.23", - "syn 1.0.107", + "proc-macro2", + "quote", "version_check", ] @@ -2170,25 +2583,16 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2", + "quote", "version_check", ] [[package]] name = "proc-macro2" -version = "0.4.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -dependencies = [ - "unicode-xid 0.1.0", -] - -[[package]] -name = "proc-macro2" -version = "1.0.50" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -2202,75 +2606,72 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "qualifier_attr" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + [[package]] name = "quinn" -version = "0.8.5" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b435e71d9bfa0d8889927231970c51fb89c58fa63bffcab117c9c7a41e5ef8f" +checksum = "8cc2c5017e4b43d5995dcea317bc46c1e09404c0a9664d2908f7f02dfe943d75" dependencies = [ "bytes", - "futures-channel", - "futures-util", - "fxhash", + "pin-project-lite", "quinn-proto", "quinn-udp", + "rustc-hash", "rustls", "thiserror", "tokio", "tracing", - "webpki", ] [[package]] name = "quinn-proto" -version = "0.8.4" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fce546b9688f767a57530652488420d419a8b1f44a478b451c3d1ab6d992a55" +checksum = "141bf7dfde2fbc246bfd3fe12f2455aa24b0fbd9af535d8c86c7bd1381ff2b1a" dependencies = [ "bytes", - "fxhash", "rand 0.8.5", - "ring", + "ring 0.16.20", + "rustc-hash", "rustls", "rustls-native-certs", - "rustls-pemfile 0.2.1", "slab", "thiserror", "tinyvec", "tracing", - "webpki", ] [[package]] name = "quinn-udp" -version = "0.1.4" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b07946277141531aea269befd949ed16b2c85a780ba1043244eda0969e538e54" +checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7" dependencies = [ - "futures-util", + "bytes", "libc", - "quinn-proto", - "socket2", - "tokio", + "socket2 0.5.7", "tracing", + "windows-sys 0.48.0", ] [[package]] name = "quote" -version = "0.6.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" -dependencies = [ - "proc-macro2 0.4.30", -] - -[[package]] -name = "quote" -version = "1.0.23" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ - "proc-macro2 1.0.50", + "proc-macro2", ] [[package]] @@ -2332,7 +2733,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.8", + "getrandom 0.2.15", ] [[package]] @@ -2355,9 +2756,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.6.1" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db3a213adf02b3bcfd2d3846bb41cb22857d131789e01df434fb7e7bc0759b7" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -2365,25 +2766,23 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.10.2" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "356a0625f1954f730c0201cdab48611198dc6ce21f4acff55089b5a78e6e835b" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ - "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", - "num_cpus", ] [[package]] name = "rcgen" -version = "0.9.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6413f3de1edee53342e6138e75b56d32e7bc6e332b3bd62d497b1929d4cfbcdd" +checksum = "ffbe84efe2f38dea12e9bfc1f65377fdf03e53a18cb3b995faedf7934c7e785b" dependencies = [ "pem", - "ring", - "time 0.3.17", + "ring 0.16.20", + "time", "yasna", ] @@ -2393,7 +2792,16 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +dependencies = [ + "bitflags 2.6.0", ] [[package]] @@ -2402,16 +2810,28 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ - "getrandom 0.2.8", - "redox_syscall", + "getrandom 0.2.15", + "redox_syscall 0.2.16", "thiserror", ] [[package]] name = "regex" -version = "1.7.1" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -2420,9 +2840,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.28" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "remove_dir_all" @@ -2435,12 +2855,12 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.14" +version = "0.11.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21eed90ec8570952d53b772ecf8f206aa1ec9a3d76b2521c56c42973f2d91ee9" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" dependencies = [ "async-compression", - "base64 0.21.0", + "base64 0.21.7", "bytes", "encoding_rs", "futures-core", @@ -2450,19 +2870,24 @@ dependencies = [ "http-body", "hyper", "hyper-rustls", + "hyper-tls", "ipnet", "js-sys", "log", "mime", + "native-tls", "once_cell", "percent-encoding", "pin-project-lite", "rustls", - "rustls-pemfile 1.0.2", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", + "sync_wrapper", + "system-configuration", "tokio", + "tokio-native-tls", "tokio-rustls", "tokio-util", "tower-service", @@ -2470,7 +2895,7 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots", + "webpki-roots 0.25.4", "winreg", ] @@ -2483,24 +2908,54 @@ dependencies = [ "cc", "libc", "once_cell", - "spin", - "untrusted", + "spin 0.5.2", + "untrusted 0.7.1", "web-sys", "winapi", ] +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.15", + "libc", + "spin 0.9.8", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + [[package]] name = "rpassword" -version = "6.0.1" +version = "7.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bf099a1888612545b683d2661a1940089f6c2e5a8e38979b2159da876bfd956" +checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" dependencies = [ "libc", - "serde", - "serde_json", - "winapi", + "rtoolbox", + "windows-sys 0.48.0", +] + +[[package]] +name = "rtoolbox" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e" +dependencies = [ + "libc", + "windows-sys 0.48.0", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustc-hash" version = "1.1.0" @@ -2525,30 +2980,16 @@ dependencies = [ "nom", ] -[[package]] -name = "rustix" -version = "0.36.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fdebc4b395b7fbb9ab11e462e20ed9051e7b16e42d24042c776eca0ac81b03" -dependencies = [ - "bitflags", - "errno", - "io-lifetimes", - "libc", - "linux-raw-sys", - "windows-sys", -] - [[package]] name = "rustls" -version = "0.20.8" +version = "0.21.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fff78fc74d175294f4e83b28343315ffcfb114b156f0185e9741cb5570f50e2f" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" dependencies = [ "log", - "ring", + "ring 0.17.8", + "rustls-webpki", "sct", - "webpki", ] [[package]] @@ -2558,34 +2999,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0167bac7a9f490495f3c33013e7722b53cb087ecbe082fb0c6387c96f634ea50" dependencies = [ "openssl-probe", - "rustls-pemfile 1.0.2", + "rustls-pemfile", "schannel", "security-framework", ] [[package]] name = "rustls-pemfile" -version = "0.2.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eebeaeb360c87bfb72e84abdb3447159c0eaececf1bef2aecd65a8be949d1c9" +checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" dependencies = [ - "base64 0.13.1", + "base64 0.21.7", ] [[package]] -name = "rustls-pemfile" -version = "1.0.2" +name = "rustls-webpki" +version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d194b56d58803a43635bdc398cd17e383d6f71f9182b9a192c127ca42494a59b" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "base64 0.21.0", + "ring 0.17.8", + "untrusted 0.9.0", ] [[package]] name = "rustversion" -version = "1.0.11" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5583e89e108996506031660fe09baa5011b9dd0341b89029313006d1fb508d70" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "ryu" @@ -2599,7 +3041,7 @@ version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" dependencies = [ - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -2614,14 +3056,34 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ddccb15bcce173023b3fedd9436f882a0739b8dfb45e4f6b6002bee5929f61b2" +[[package]] +name = "scroll" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.79", +] + [[package]] name = "sct" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" dependencies = [ - "ring", - "untrusted", + "ring 0.16.20", + "untrusted 0.7.1", ] [[package]] @@ -2630,7 +3092,7 @@ version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c4437699b6d34972de58652c68b98cb5b53a4199ab126db8e20ec8ded29a721" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -2649,50 +3111,63 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.16" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +dependencies = [ + "serde", +] [[package]] name = "serde" -version = "1.0.152" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] [[package]] name = "serde_bytes" -version = "0.11.8" +version = "0.11.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "718dc5fff5b36f99093fc49b280cfc96ce6fc824317783bff5a1fed0c7a64819" +checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.152" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", - "syn 1.0.107", + "proc-macro2", + "quote", + "syn 2.0.79", ] [[package]] name = "serde_json" -version = "1.0.91" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93107647184f6027e3b7dcb2e11034cf95ffa1e3a682c67951963ac69c1c007d" +dependencies = [ + "serde", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -2706,37 +3181,49 @@ dependencies = [ ] [[package]] -name = "serde_yaml" -version = "0.8.26" +name = "serde_with" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" +checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" dependencies = [ - "indexmap", - "ryu", "serde", - "yaml-rust", + "serde_with_macros", ] [[package]] -name = "sha-1" -version = "0.10.1" +name = "serde_with_macros" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" +checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.6", + "darling", + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap 2.2.6", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", ] [[package]] name = "sha1" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.6", + "digest 0.10.7", ] [[package]] @@ -2754,13 +3241,23 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest 0.10.6", + "digest 0.10.7", +] + +[[package]] +name = "sha256" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e334db67871c14c18fc066ad14af13f9fdf5f9a91c61af432d1e3a39c8c6a141" +dependencies = [ + "hex", + "sha2 0.9.9", ] [[package]] @@ -2781,7 +3278,7 @@ version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bdf0c33fae925bdc080598b84bc15c55e7b9a4a43b3c704da051f977469691c9" dependencies = [ - "digest 0.10.6", + "digest 0.10.7", "keccak", ] @@ -2791,6 +3288,22 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +dependencies = [ + "libc", + "signal-hook-registry", +] + [[package]] name = "signal-hook-registry" version = "1.4.0" @@ -2806,6 +3319,12 @@ version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + [[package]] name = "sized-chunks" version = "0.6.5" @@ -2827,76 +3346,64 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.10.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "socket2" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" dependencies = [ "libc", "winapi", ] +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "solana-account-decoder" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b04c1316932017ae5f947e83d77cc0356c4a395130a480cdc17ffb0570a0c115" +checksum = "f5e54ec43b0262c19a3c87bf2dbd52c6bc6d4f9307246fe4b666fd87f06305e5" dependencies = [ "Inflector", - "base64 0.13.1", + "base64 0.21.7", "bincode", - "bs58", + "bs58 0.4.0", "bv", "lazy_static", "serde", "serde_derive", "serde_json", - "solana-address-lookup-table-program", "solana-config-program", "solana-sdk", - "solana-vote-program", "spl-token", "spl-token-2022", + "spl-token-group-interface", + "spl-token-metadata-interface", "thiserror", "zstd", ] -[[package]] -name = "solana-address-lookup-table-program" -version = "1.14.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5be490ed850c99286a4e4ba169ce20695336fe666c56bd823bfd8db689d23a58" -dependencies = [ - "bincode", - "bytemuck", - "log", - "num-derive", - "num-traits", - "rustc_version", - "serde", - "solana-frozen-abi", - "solana-frozen-abi-macro", - "solana-program", - "solana-program-runtime", - "solana-sdk", - "thiserror", -] - [[package]] name = "solana-clap-utils" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36228e03e14bc7d7707189b66f625981993f1a000b0b192d5b42367349901d91" +checksum = "117bf11e4d15b529dd9dfa2680abaf8bd3c1d8f7cb0586a5accdac5a2ecc7cc5" dependencies = [ "chrono", "clap 2.34.0", "rpassword", - "solana-perf", "solana-remote-wallet", "solana-sdk", "thiserror", @@ -2907,9 +3414,9 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c43b08f24fd605eaeaafe0e834dc9b209137ac253bc874d32a5bdd791cbd318" +checksum = "884f604b0ebb6572103b92b043cfe977ad13137f54c307e9d2c14b8b5079d150" dependencies = [ "dirs-next", "lazy_static", @@ -2923,63 +3430,42 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e270b1afd0b360c2aec42ae302ae7980ebb226017275b32a6156ab2ccbdad9" +checksum = "1501330d85c1a790f45f11330616bd6f0b9acd2193477268a65a38ce3b7cfdd0" dependencies = [ - "async-mutex", "async-trait", - "base64 0.13.1", "bincode", - "bs58", - "bytes", - "clap 2.34.0", - "crossbeam-channel", - "enum_dispatch", + "dashmap", "futures", "futures-util", - "indexmap", + "indexmap 2.2.6", "indicatif", - "itertools", - "jsonrpc-core", - "lazy_static", "log", "quinn", - "quinn-proto", - "rand 0.7.3", - "rand_chacha 0.2.2", "rayon", - "reqwest", - "rustls", - "semver", - "serde", - "serde_derive", - "serde_json", - "solana-account-decoder", - "solana-clap-utils", - "solana-faucet", + "solana-connection-cache", "solana-measure", "solana-metrics", - "solana-net-utils", + "solana-pubsub-client", + "solana-quic-client", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-rpc-client-nonce-utils", "solana-sdk", "solana-streamer", - "solana-transaction-status", - "solana-version", - "solana-vote-program", - "spl-token-2022", + "solana-thin-client", + "solana-tpu-client", + "solana-udp-client", "thiserror", "tokio", - "tokio-stream", - "tokio-tungstenite", - "tungstenite", - "url", ] [[package]] name = "solana-config-program" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb275d80a482134f0f0c5439b0c40ba3f04bef70dbc46c0e47f6107f6ae482a8" +checksum = "d00d0d031f3d97e3f59305c4aabf9da7359fad86dbaeb43b61a1ea13224e0b8a" dependencies = [ "bincode", "chrono", @@ -2990,58 +3476,47 @@ dependencies = [ ] [[package]] -name = "solana-faucet" -version = "1.14.13" +name = "solana-connection-cache" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3ef95ad1f87b8c011d0e4d85a46f4a703e9dd7e722459659b395ed70d6ba924" +checksum = "90fa9ff6c33772441670e446b1d43e787aa315e95f2f9c14e3e9508b814bc8e5" dependencies = [ + "async-trait", "bincode", - "byteorder", - "clap 2.34.0", "crossbeam-channel", + "futures-util", + "indexmap 2.2.6", "log", - "serde", - "serde_derive", - "solana-clap-utils", - "solana-cli-config", - "solana-logger", + "rand 0.8.5", + "rayon", + "rcgen", + "solana-measure", "solana-metrics", "solana-sdk", - "solana-version", - "spl-memo", "thiserror", "tokio", ] [[package]] name = "solana-frozen-abi" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f44a019070a6cec4d3ad8605c5caa65bdaa13f00b5f1849340f44ffea63b625b" +checksum = "4bfcde2fc6946c99c7e3400fadd04d1628d675bfd66cb34d461c0f3224bd27d1" dependencies = [ - "ahash", - "blake3", - "block-buffer 0.9.0", - "bs58", + "block-buffer 0.10.4", + "bs58 0.4.0", "bv", - "byteorder", - "cc", "either", "generic-array", - "getrandom 0.1.16", - "hashbrown 0.12.3", "im", "lazy_static", "log", "memmap2", - "once_cell", - "rand_core 0.6.4", "rustc_version", "serde", "serde_bytes", "serde_derive", - "serde_json", - "sha2 0.10.6", + "sha2 0.10.8", "solana-frozen-abi-macro", "subtle", "thiserror", @@ -3049,21 +3524,21 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be23cc7a382f54dfe1348edb94610e5cc146b8eb21563cdd04062a403c75ba62" +checksum = "d5024d241425f4e99f112ee03bfa89e526c86c7ca9bd7e13448a7f2dffb7e060" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2", + "quote", "rustc_version", - "syn 1.0.107", + "syn 2.0.79", ] [[package]] name = "solana-logger" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447d16a70a1b5383736ef44801050c0e1affd022303b22ed899352f958c2de4b" +checksum = "10948c30d138d6fbfc2ae78a4882be5a9ebffa4bb1239c4efc386104ebc35b7f" dependencies = [ "env_logger", "lazy_static", @@ -3072,9 +3547,9 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2400d2534a19f7605c5059060edea0499600a223f1a1f6a4b172666c04946a77" +checksum = "379355a731abf50bb5ef1e4afba02ac8c835c25bb18e32229bb481657d5c9eca" dependencies = [ "log", "solana-sdk", @@ -3082,9 +3557,9 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68aaa3d683945dc3b6ca38923ef952ca1f96a27b61f898a1ddf9f4cd79f2df92" +checksum = "82a6f767cf39d69104bff52602f3141d6abfbdd55b4eb310f8fbbbf862b27e6f" dependencies = [ "crossbeam-channel", "gethostname", @@ -3092,23 +3567,24 @@ dependencies = [ "log", "reqwest", "solana-sdk", + "thiserror", ] [[package]] name = "solana-net-utils" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6d7093739e143d5e2edf3e81e523d47228adb802b847d66f4ab819be7ad6dc8" +checksum = "c81ade42b553c7de08fb97cf3cfe44545f59a247e90042a67d224d62a8a189d7" dependencies = [ "bincode", "clap 3.2.23", "crossbeam-channel", "log", "nix", - "rand 0.7.3", + "rand 0.8.5", "serde", "serde_derive", - "socket2", + "socket2 0.5.7", "solana-logger", "solana-sdk", "solana-version", @@ -3118,25 +3594,27 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc742f8d53f0a6e6f3a27ed11c1d0764b5486813c721d625c56094fcd14e984" +checksum = "9ecdf31e535743515d31392f210d132463300b5d3de7c3e26f6b344b6c941c42" dependencies = [ - "ahash", + "ahash 0.8.11", "bincode", "bv", "caps", "curve25519-dalek", - "dlopen", - "dlopen_derive", + "dlopen2", "fnv", "lazy_static", "libc", "log", "nix", - "rand 0.7.3", + "rand 0.8.5", "rayon", + "rustc_version", "serde", + "solana-frozen-abi", + "solana-frozen-abi-macro", "solana-metrics", "solana-rayon-threadlimit", "solana-sdk", @@ -3145,43 +3623,49 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0937481f080f5dd495fae456c94718a7bacf30fb5fdabb02dcb8a9622e446d5" +checksum = "76056fecde0fe0ece8b457b719729c17173333471c72ad41969982975a10d6e0" dependencies = [ - "base64 0.13.1", + "ark-bn254", + "ark-ec", + "ark-ff", + "ark-serialize", + "base64 0.21.7", "bincode", - "bitflags", + "bitflags 2.6.0", "blake3", - "borsh", - "borsh-derive", - "bs58", + "borsh 0.10.4", + "borsh 0.9.3", + "borsh 1.5.0", + "bs58 0.4.0", "bv", "bytemuck", "cc", "console_error_panic_hook", "console_log", "curve25519-dalek", - "getrandom 0.2.8", + "getrandom 0.2.15", "itertools", "js-sys", "lazy_static", "libc", "libsecp256k1", + "light-poseidon", "log", - "memoffset 0.6.5", - "num-derive", + "memoffset 0.9.1", + "num-bigint 0.4.6", + "num-derive 0.4.2", "num-traits", "parking_lot", - "rand 0.7.3", - "rand_chacha 0.2.2", + "rand 0.8.5", "rustc_version", "rustversion", "serde", "serde_bytes", "serde_derive", "serde_json", - "sha2 0.10.6", + "sha2 0.10.8", "sha3 0.10.6", "solana-frozen-abi", "solana-frozen-abi-macro", @@ -3194,21 +3678,21 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4d12047608bac77fca000e18f7a2df3c7fa90656d7c7d387b1cd7faf18b238c" +checksum = "e566a9e61ecdc250824314864654dd370abf561fa8328f6e08b3bc96ccc5b80d" dependencies = [ - "base64 0.13.1", + "base64 0.21.7", "bincode", "eager", "enum-iterator", "itertools", "libc", - "libloading", "log", - "num-derive", + "num-derive 0.4.2", "num-traits", - "rand 0.7.3", + "percentage", + "rand 0.8.5", "rustc_version", "serde", "solana-frozen-abi", @@ -3216,14 +3700,67 @@ dependencies = [ "solana-measure", "solana-metrics", "solana-sdk", + "solana_rbpf", "thiserror", ] +[[package]] +name = "solana-pubsub-client" +version = "1.18.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5d997840e6d033edc4fca8f06b920726dc18d3a5bbc1e538b2154cc3b71acd1" +dependencies = [ + "crossbeam-channel", + "futures-util", + "log", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-rpc-client-api", + "solana-sdk", + "thiserror", + "tokio", + "tokio-stream", + "tokio-tungstenite", + "tungstenite", + "url", +] + +[[package]] +name = "solana-quic-client" +version = "1.18.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e689a97cefa6a005cd305210234f3dc78aacc934c0f76d210a264fae36ee432" +dependencies = [ + "async-mutex", + "async-trait", + "futures", + "itertools", + "lazy_static", + "log", + "quinn", + "quinn-proto", + "rcgen", + "rustls", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "solana-net-utils", + "solana-rpc-client-api", + "solana-sdk", + "solana-streamer", + "thiserror", + "tokio", +] + [[package]] name = "solana-rayon-threadlimit" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6eca67181e0381532db4bc69a625b1f96a047be461ff9050c451add0165424f" +checksum = "bbf70f0441603e553fc3db30c1eec9f10cecc27849e7dc74d5f692d5a41a56ca" dependencies = [ "lazy_static", "num_cpus", @@ -3231,14 +3768,14 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b83d035ee90035ebcb07ec73672fdc0272e5b98899846dd29fcb31f856ac78c" +checksum = "9651b3f2c3df39a1a6fc87fe792bdb3ec3d84a8169c0a57c86335b48d6cb1491" dependencies = [ "console", "dialoguer", "log", - "num-derive", + "num-derive 0.4.2", "num-traits", "parking_lot", "qstring", @@ -3248,23 +3785,84 @@ dependencies = [ "uriparse", ] +[[package]] +name = "solana-rpc-client" +version = "1.18.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d753d116aacc43ef64a2bc8d25f8b20af47c366b29aa859186124e226d6e3819" +dependencies = [ + "async-trait", + "base64 0.21.7", + "bincode", + "bs58 0.4.0", + "indicatif", + "log", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-rpc-client-api", + "solana-sdk", + "solana-transaction-status", + "solana-version", + "solana-vote-program", + "tokio", +] + +[[package]] +name = "solana-rpc-client-api" +version = "1.18.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617df2c53f948c821cefca6824e376aac04ff0d844bb27f4d3ada9e211bcffe7" +dependencies = [ + "base64 0.21.7", + "bs58 0.4.0", + "jsonrpc-core", + "reqwest", + "semver", + "serde", + "serde_derive", + "serde_json", + "solana-account-decoder", + "solana-sdk", + "solana-transaction-status", + "solana-version", + "spl-token-2022", + "thiserror", +] + +[[package]] +name = "solana-rpc-client-nonce-utils" +version = "1.18.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2d34cf36289cc35a0b18cd518a256312090368a37f40b448520e260923558a9" +dependencies = [ + "clap 2.34.0", + "solana-clap-utils", + "solana-rpc-client", + "solana-sdk", + "thiserror", +] + [[package]] name = "solana-sdk" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "390e7481c56dda2ceab2652beeda30a533e9667b34861a2eb4eec92fa1d826d7" +checksum = "b4b3f2080eddef6552fde7f149c429cf05b9bb0605a068b0d28e19d793e24df4" dependencies = [ "assert_matches", - "base64 0.13.1", + "base64 0.21.7", "bincode", - "bitflags", - "borsh", - "bs58", + "bitflags 2.6.0", + "borsh 1.5.0", + "bs58 0.4.0", "bytemuck", "byteorder", "chrono", "derivation-path", - "digest 0.10.6", + "digest 0.10.7", "ed25519-dalek", "ed25519-dalek-bip32", "generic-array", @@ -3275,20 +3873,24 @@ dependencies = [ "libsecp256k1", "log", "memmap2", - "num-derive", + "num-derive 0.4.2", "num-traits", + "num_enum 0.7.3", "pbkdf2 0.11.0", "qstring", + "qualifier_attr", "rand 0.7.3", - "rand_chacha 0.2.2", + "rand 0.8.5", "rustc_version", "rustversion", "serde", "serde_bytes", "serde_derive", "serde_json", - "sha2 0.10.6", + "serde_with", + "sha2 0.10.8", "sha3 0.10.6", + "siphasher", "solana-frozen-abi", "solana-frozen-abi-macro", "solana-logger", @@ -3301,27 +3903,35 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d0acbad862093ea123f3a27364336dcb0c8373522cd6810496a34e932c56c1" +checksum = "2a8613ca80150f7e277e773620ba65d2c5fcc3a08eb8026627d601421ab43aef" dependencies = [ - "bs58", - "proc-macro2 1.0.50", - "quote 1.0.23", + "bs58 0.4.0", + "proc-macro2", + "quote", "rustversion", - "syn 1.0.107", + "syn 2.0.79", ] +[[package]] +name = "solana-security-txt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" + [[package]] name = "solana-streamer" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "853b0187fdf233c13e8b7ba76e61d0c7cb49ca92c5fdb3b7568ad5ca30e2cf88" +checksum = "979d470dd7c589679a2e036078921989a2563f333b73b31e2fdceb09a6d55a29" dependencies = [ + "async-channel", + "bytes", "crossbeam-channel", "futures-util", "histogram", - "indexmap", + "indexmap 2.2.6", "itertools", "libc", "log", @@ -3330,9 +3940,11 @@ dependencies = [ "percentage", "pkcs8", "quinn", - "rand 0.7.3", + "quinn-proto", + "rand 0.8.5", "rcgen", "rustls", + "smallvec", "solana-metrics", "solana-perf", "solana-sdk", @@ -3341,28 +3953,63 @@ dependencies = [ "x509-parser", ] +[[package]] +name = "solana-thin-client" +version = "1.18.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "851b9ae239d098c766aee3558330cc16edd0524c9cf3f9cf7c64f53b1024d507" +dependencies = [ + "bincode", + "log", + "rayon", + "solana-connection-cache", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-sdk", +] + +[[package]] +name = "solana-tpu-client" +version = "1.18.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a7a7e5a522fe5333fcb47e02fb7da73ff614d917754167937b5523c383ce161" +dependencies = [ + "async-trait", + "bincode", + "futures-util", + "indexmap 2.2.6", + "indicatif", + "log", + "rayon", + "solana-connection-cache", + "solana-measure", + "solana-metrics", + "solana-pubsub-client", + "solana-rpc-client", + "solana-rpc-client-api", + "solana-sdk", + "thiserror", + "tokio", +] + [[package]] name = "solana-transaction-status" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5bbdaed99403e4a17763bee60c1e0e3418524503c72b514ebff62efbcc9d33" +checksum = "51be349fb9301d2a0fdd0b9ba5341e5f72bf4900ca4c0ede04748bc9038d15e8" dependencies = [ "Inflector", - "base64 0.13.1", + "base64 0.21.7", "bincode", - "borsh", - "bs58", + "borsh 0.10.4", + "bs58 0.4.0", "lazy_static", "log", "serde", "serde_derive", "serde_json", "solana-account-decoder", - "solana-address-lookup-table-program", - "solana-measure", - "solana-metrics", "solana-sdk", - "solana-vote-program", "spl-associated-token-account", "spl-memo", "spl-token", @@ -3370,11 +4017,59 @@ dependencies = [ "thiserror", ] +[[package]] +name = "solana-udp-client" +version = "1.18.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3274b4bfccd57ecffcf4037cd09fc61777633e0d0c5f8b76abcaa10ee83f3ae5" +dependencies = [ + "async-trait", + "solana-connection-cache", + "solana-net-utils", + "solana-sdk", + "solana-streamer", + "thiserror", + "tokio", +] + +[[package]] +name = "solana-verify" +version = "0.4.0" +dependencies = [ + "anyhow", + "base64 0.22.1", + "bincode", + "borsh 1.5.0", + "bs58 0.5.1", + "cargo-lock", + "cargo_toml", + "clap 2.34.0", + "crossbeam-channel", + "hex", + "indicatif", + "lazy_static", + "pathdiff", + "regex", + "reqwest", + "serde", + "serde_json", + "sha256", + "signal-hook", + "solana-account-decoder", + "solana-clap-utils", + "solana-cli-config", + "solana-client", + "solana-sdk", + "solana-transaction-status", + "tokio", + "uuid", +] + [[package]] name = "solana-version" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a46c9ecb15ccd5388511cec0c5bfb989589425f8286ce432ff64b55dc7bf61e" +checksum = "aaf45873439f73420f60a5e0f87b529923c3489d24a228d5eb8f5ce6955bdc1b" dependencies = [ "log", "rustc_version", @@ -3388,13 +4083,13 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81ab9ff8928282cb42871a370435dd4713f700854801afb476cf63066f1337db" +checksum = "0e7c7525bda137bbb9bc0dc967a4ffca82786147eb2d1efbf76a8dc52978f0b8" dependencies = [ "bincode", "log", - "num-derive", + "num-derive 0.4.2", "num-traits", "rustc_version", "serde", @@ -3402,6 +4097,7 @@ dependencies = [ "solana-frozen-abi", "solana-frozen-abi-macro", "solana-metrics", + "solana-program", "solana-program-runtime", "solana-sdk", "thiserror", @@ -3409,23 +4105,21 @@ dependencies = [ [[package]] name = "solana-zk-token-sdk" -version = "1.14.13" +version = "1.18.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cebca4083e982ae01583d1a590c4d679e6f648a4761364ddfb43026d2c433142" +checksum = "39a57b2f269f24088b6b8e426de05e5c1faa6b5d6f26175c06eb80df96ec685e" dependencies = [ "aes-gcm-siv", - "arrayref", - "base64 0.13.1", + "base64 0.21.7", "bincode", "bytemuck", "byteorder", - "cipher 0.4.3", "curve25519-dalek", "getrandom 0.1.16", "itertools", "lazy_static", "merlin", - "num-derive", + "num-derive 0.4.2", "num-traits", "rand 0.7.3", "serde", @@ -3438,12 +4132,37 @@ dependencies = [ "zeroize", ] +[[package]] +name = "solana_rbpf" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da5d083187e3b3f453e140f292c09186881da8a02a7b5e27f645ee26de3d9cc5" +dependencies = [ + "byteorder", + "combine", + "goblin", + "hash32", + "libc", + "log", + "rand 0.8.5", + "rustc-demangle", + "scroll", + "thiserror", + "winapi", +] + [[package]] name = "spin" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + [[package]] name = "spki" version = "0.5.4" @@ -3456,13 +4175,13 @@ dependencies = [ [[package]] name = "spl-associated-token-account" -version = "1.1.2" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc000f0fdf1f12f99d77d398137c1751345b18c88258ce0f99b7872cf6c9bd6" +checksum = "992d9c64c2564cc8f63a4b508bf3ebcdf2254b0429b13cd1d31adb6162432a5f" dependencies = [ "assert_matches", - "borsh", - "num-derive", + "borsh 0.10.4", + "num-derive 0.4.2", "num-traits", "solana-program", "spl-token", @@ -3470,46 +4189,195 @@ dependencies = [ "thiserror", ] +[[package]] +name = "spl-discriminator" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator-derive", +] + +[[package]] +name = "spl-discriminator-derive" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" +dependencies = [ + "quote", + "spl-discriminator-syn", + "syn 2.0.79", +] + +[[package]] +name = "spl-discriminator-syn" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18fea7be851bd98d10721782ea958097c03a0c2a07d8d4997041d0ece6319a63" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.79", + "thiserror", +] + [[package]] name = "spl-memo" -version = "3.0.1" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f180b03318c3dbab3ef4e1e4d46d5211ae3c780940dd0a28695aba4b59a75a" +dependencies = [ + "solana-program", +] + +[[package]] +name = "spl-pod" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2881dddfca792737c0706fa0175345ab282b1b0879c7d877bad129645737c079" +dependencies = [ + "borsh 0.10.4", + "bytemuck", + "solana-program", + "solana-zk-token-sdk", + "spl-program-error", +] + +[[package]] +name = "spl-program-error" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "249e0318493b6bcf27ae9902600566c689b7dfba9f1bdff5893e92253374e78c" +dependencies = [ + "num-derive 0.4.2", + "num-traits", + "solana-program", + "spl-program-error-derive", + "thiserror", +] + +[[package]] +name = "spl-program-error-derive" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1845dfe71fd68f70382232742e758557afe973ae19e6c06807b2c30f5d5cb474" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.79", +] + +[[package]] +name = "spl-tlv-account-resolution" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0dc6f70db6bacea7ff25870b016a65ba1d1b6013536f08e4fd79a8f9005325" +checksum = "615d381f48ddd2bb3c57c7f7fb207591a2a05054639b18a62e785117dd7a8683" dependencies = [ + "bytemuck", "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", ] [[package]] name = "spl-token" -version = "3.5.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e85e168a785e82564160dcb87b2a8e04cee9bfd1f4d488c729d53d6a4bd300d" +checksum = "08459ba1b8f7c1020b4582c4edf0f5c7511a5e099a7a97570c9698d4f2337060" dependencies = [ "arrayref", "bytemuck", - "num-derive", + "num-derive 0.3.3", "num-traits", - "num_enum", + "num_enum 0.6.1", "solana-program", "thiserror", ] [[package]] name = "spl-token-2022" -version = "0.5.0" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0edb869dbe159b018f17fb9bfa67118c30f232d7f54a73742bc96794dff77ed8" +checksum = "d697fac19fd74ff472dfcc13f0b442dd71403178ce1de7b5d16f83a33561c059" dependencies = [ "arrayref", "bytemuck", - "num-derive", + "num-derive 0.4.2", "num-traits", - "num_enum", + "num_enum 0.7.3", + "solana-program", + "solana-security-txt", + "solana-zk-token-sdk", + "spl-memo", + "spl-pod", + "spl-token", + "spl-token-group-interface", + "spl-token-metadata-interface", + "spl-transfer-hook-interface", + "spl-type-length-value", + "thiserror", +] + +[[package]] +name = "spl-token-group-interface" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b889509d49fa74a4a033ca5dae6c2307e9e918122d97e58562f5c4ffa795c75d" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", +] + +[[package]] +name = "spl-token-metadata-interface" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f" +dependencies = [ + "borsh 0.10.4", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", +] + +[[package]] +name = "spl-transfer-hook-interface" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aabdb7c471566f6ddcee724beb8618449ea24b399e58d464d6b5bc7db550259" +dependencies = [ + "arrayref", + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-tlv-account-resolution", + "spl-type-length-value", +] + +[[package]] +name = "spl-type-length-value" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a468e6f6371f9c69aae760186ea9f1a01c2908351b06a5e0026d21cfc4d7ecac" +dependencies = [ + "bytemuck", "solana-program", - "solana-zk-token-sdk", - "spl-memo", - "spl-token", - "thiserror", + "spl-discriminator", + "spl-pod", + "spl-program-error", ] [[package]] @@ -3524,6 +4392,12 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "subtle" version = "2.4.1" @@ -3532,36 +4406,75 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" [[package]] name = "syn" -version = "0.15.44" +version = "1.0.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" +checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" dependencies = [ - "proc-macro2 0.4.30", - "quote 0.6.13", - "unicode-xid 0.1.0", + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] name = "syn" -version = "1.0.107" +version = "2.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2", + "quote", "unicode-ident", ] +[[package]] +name = "syn_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "synstructure" version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2", + "quote", "syn 1.0.107", - "unicode-xid 0.2.4", + "unicode-xid", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", ] [[package]] @@ -3573,7 +4486,7 @@ dependencies = [ "cfg-if", "fastrand", "libc", - "redox_syscall", + "redox_syscall 0.2.16", "remove_dir_all", "winapi", ] @@ -3604,33 +4517,22 @@ checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d" [[package]] name = "thiserror" -version = "1.0.38" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.38" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", - "syn 1.0.107", -] - -[[package]] -name = "time" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", + "proc-macro2", + "quote", + "syn 2.0.79", ] [[package]] @@ -3696,51 +4598,60 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.24.2" +version = "1.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a12a59981d9e3c38d216785b0c37399f6e415e8d0712047620f189371b0bb" +checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da" dependencies = [ "autocfg", + "backtrace", "bytes", "libc", - "memchr", "mio", "num_cpus", "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.4.9", "tokio-macros", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] name = "tokio-macros" -version = "1.8.2" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" +checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", - "syn 1.0.107", + "proc-macro2", + "quote", + "syn 2.0.79", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", ] [[package]] name = "tokio-rustls" -version = "0.23.4" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ "rustls", "tokio", - "webpki", ] [[package]] name = "tokio-stream" -version = "0.1.11" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d660770404473ccd7bc9f8b28494a811bc18542b915c0855c51e8f419d5223ce" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" dependencies = [ "futures-core", "pin-project-lite", @@ -3749,9 +4660,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.17.2" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f714dd15bead90401d77e04243611caec13726c2408afd5b31901dfcdcb3b181" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" dependencies = [ "futures-util", "log", @@ -3759,8 +4670,7 @@ dependencies = [ "tokio", "tokio-rustls", "tungstenite", - "webpki", - "webpki-roots", + "webpki-roots 0.25.4", ] [[package]] @@ -3786,21 +4696,66 @@ dependencies = [ "serde", ] +[[package]] +name = "toml" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6135d499e69981f9ff0ef2167955a5333c35e36f6937d382974566b3d5b94ec" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime 0.6.5", + "toml_edit 0.19.10", +] + [[package]] name = "toml_datetime" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4553f467ac8e3d374bc9a177a26801e5d0f9b211aa1673fb137a403afd1c9cf5" +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] + [[package]] name = "toml_edit" version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56c59d8dd7d0dcbc6428bf7aa2f0e823e26e43b3c9aca15bbc9475d23e5fa12b" dependencies = [ - "indexmap", + "indexmap 1.9.2", "nom8", - "toml_datetime", + "toml_datetime 0.5.1", +] + +[[package]] +name = "toml_edit" +version = "0.19.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380d56e8670370eee6566b0bfd4265f65b3f432e8c6d85623f728d4fa31f739" +dependencies = [ + "indexmap 1.9.2", + "serde", + "serde_spanned", + "toml_datetime 0.6.5", + "winnow 0.4.7", +] + +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap 2.2.6", + "toml_datetime 0.6.5", + "winnow 0.5.40", ] [[package]] @@ -3816,6 +4771,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if", + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -3827,8 +4783,8 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2", + "quote", "syn 1.0.107", ] @@ -3849,24 +4805,23 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "tungstenite" -version = "0.17.3" +version = "0.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e27992fd6a8c29ee7eef28fc78349aa244134e10ad447ce3b9f0ac0ed0fa4ce0" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" dependencies = [ - "base64 0.13.1", "byteorder", "bytes", + "data-encoding", "http", "httparse", "log", "rand 0.8.5", "rustls", - "sha-1", + "sha1", "thiserror", "url", "utf-8", - "webpki", - "webpki-roots", + "webpki-roots 0.24.0", ] [[package]] @@ -3902,12 +4857,6 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" -[[package]] -name = "unicode-xid" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" - [[package]] name = "unicode-xid" version = "0.2.4" @@ -3924,12 +4873,33 @@ dependencies = [ "subtle", ] +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + [[package]] name = "untrusted" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + [[package]] name = "uriparse" version = "0.6.4" @@ -3942,9 +4912,9 @@ dependencies = [ [[package]] name = "url" -version = "2.3.1" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", "idna", @@ -3958,30 +4928,51 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] -name = "vec_map" -version = "0.8.2" +name = "uuid" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" +checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c" +dependencies = [ + "getrandom 0.2.15", + "rand 0.8.5", + "uuid-macro-internal", +] [[package]] -name = "verifier-cli" -version = "0.1.0" +name = "uuid-macro-internal" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73bc89f2894593e665241e0052c3791999e6787b7c4831daa0a5c2e637e276d8" dependencies = [ - "anyhow", - "clap 4.1.4", - "cmd_lib", - "hex", - "sha1", - "solana-client", - "solana-sdk", + "proc-macro2", + "quote", + "syn 1.0.107", ] +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + [[package]] name = "want" version = "0.3.0" @@ -3998,12 +4989,6 @@ version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -4012,26 +4997,27 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.83" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", + "once_cell", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.83" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", "once_cell", - "proc-macro2 1.0.50", - "quote 1.0.23", - "syn 1.0.107", + "proc-macro2", + "quote", + "syn 2.0.79", "wasm-bindgen-shared", ] @@ -4049,32 +5035,32 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.83" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ - "quote 1.0.23", + "quote", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.83" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", - "syn 1.0.107", + "proc-macro2", + "quote", + "syn 2.0.79", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.83" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "web-sys" @@ -4087,23 +5073,19 @@ dependencies = [ ] [[package]] -name = "webpki" -version = "0.22.0" +name = "webpki-roots" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888" dependencies = [ - "ring", - "untrusted", + "rustls-webpki", ] [[package]] name = "webpki-roots" -version = "0.22.6" +version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki", -] +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "winapi" @@ -4142,13 +5124,61 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.42.1", + "windows_aarch64_msvc 0.42.1", + "windows_i686_gnu 0.42.1", + "windows_i686_msvc 0.42.1", + "windows_x86_64_gnu 0.42.1", + "windows_x86_64_gnullvm 0.42.1", + "windows_x86_64_msvc 0.42.1", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.1", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-targets" +version = "0.48.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05d4b17490f70499f20b9e791dcf6a299785ce8af4d709018206dc5b4953e95f" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", ] [[package]] @@ -4157,49 +5187,152 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + [[package]] name = "windows_aarch64_msvc" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + [[package]] name = "windows_i686_gnu" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + [[package]] name = "windows_i686_msvc" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + [[package]] name = "windows_x86_64_gnu" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + [[package]] name = "windows_x86_64_msvc" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + +[[package]] +name = "winnow" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca0ace3845f0d96209f0375e6d367e3eb87eb65d27d445bdc9f1843a26f39448" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" -version = "0.10.1" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "winapi", + "cfg-if", + "windows-sys 0.48.0", ] [[package]] @@ -4217,25 +5350,36 @@ dependencies = [ "oid-registry", "rusticata-macros", "thiserror", - "time 0.3.17", + "time", ] [[package]] -name = "yaml-rust" -version = "0.4.5" +name = "yasna" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aed2e7a52e3744ab4d0c05c20aa065258e84c49fd4226f5191b2ed29712710b4" +dependencies = [ + "time", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" dependencies = [ - "linked-hash-map", + "zerocopy-derive", ] [[package]] -name = "yasna" -version = "0.5.1" +name = "zerocopy-derive" +version = "0.7.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aed2e7a52e3744ab4d0c05c20aa065258e84c49fd4226f5191b2ed29712710b4" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ - "time 0.3.17", + "proc-macro2", + "quote", + "syn 2.0.79", ] [[package]] @@ -4253,8 +5397,8 @@ version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c" dependencies = [ - "proc-macro2 1.0.50", - "quote 1.0.23", + "proc-macro2", + "quote", "syn 1.0.107", "synstructure", ] diff --git a/Cargo.toml b/Cargo.toml index c4f8090..9f97343 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,15 +1,43 @@ [package] -name = "verifier-cli" -version = "0.1.0" +name = "solana-verify" +version = "0.4.0" edition = "2021" - +description = "A CLI tool for building verifiable Solana programs" +license = "MIT" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -clap = { version = "4.1.4", features = ["derive"] } -anyhow = "1.0.68" -cmd_lib = "1.3.0" -solana-client = "1.14.10" -solana-sdk = "1.14.10" -sha1 = "0.10.5" -hex = "0.3.1" \ No newline at end of file +anyhow = "1.0.79" +borsh = { version = "1.2.1", features = ["derive"] } +cargo-lock = "9.0.0" # missing in workspace +cargo_toml = "0.15.3" # missing in workspace +clap = "2.33.1" # version of v1.18 does not support derive +crossbeam-channel = "0.5.11" +hex = "0.4.3" +indicatif = "0.17.7" +lazy_static = "1.4.0" +pathdiff = "0.2.0" # missing in workspace +reqwest = "0.11.23" +regex = "1.11.1" +serde = { version = "1.0.195", features = ["derive"] } +serde_json = "1.0.111" +sha256 = "1.1.1" # missing in workspace +signal-hook = "0.3.17" +solana-clap-utils = "=1.18.23" +solana-cli-config = "=1.18.23" +solana-client = "=1.18.23" +solana-sdk = "=1.18.23" +tokio = { version = "1.29.1", features = ["full"] } +solana-account-decoder = "1.18.23" +bincode = "1.3.3" +bs58 = "0.5.1" +base64 = "0.22.1" +solana-transaction-status = "=1.18.23" + +[dependencies.uuid] +version = "1.2.2" +features = [ + "v4", # Lets you generate random UUIDs + "fast-rng", # Use a faster (but still sufficiently random) RNG + "macro-diagnostics", # Enable better diagnostics for compile-time UUIDs +] diff --git a/README.md b/README.md index dd6292c..b3a9ae8 100644 --- a/README.md +++ b/README.md @@ -1,78 +1,57 @@ -# Solana Verifiable Build CLI +# Solana Verified Builds -## Installation +This repository demonstrates how to implement verified builds for Solana programs. Verified builds ensure that your deployed program matches exactly with your public source code, promoting transparency and security in the Solana ecosystem. -In order for this CLI to work properly, you must have `docker` installed on your computer. Follow the steps here: https://docs.docker.com/engine/install/ to install Docker (based on your platform) +## What are Verified Builds? -Once the installation is complete, make sure that the server has been started: (https://docs.docker.com/config/daemon/start/) +Verified builds allow developers and users to verify that a deployed Solana program matches its source code. This verification: -To install the verifier cli, run the following in your shell: +- Ensures program authenticity +- Promotes transparency +- Builds user trust +- Makes source code discoverable -``` -bash <(curl -sSf https://raw.githubusercontent.com/Ellipsis-Labs/solana-verifiable-build/master/verifier-cli-install.sh) -``` - -## Example Walkthrough - -After installing the CLI, we can test the program verification against the following immutable mainnet program: `2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn` +## Quick Start -Check it out here: https://solana.fm/address/2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn?cluster=mainnet-qn1 +1. Install prerequisites: -### Verification with Docker + - Docker + - Cargo + - Solana Verify CLI (`cargo install solana-verify`) -Run the following command: +2. Build your program: -``` -verifier-cli verify-from-image -e examples/hello_world/target/deploy/hello_world.so -i ellipsislabs/hello_world_verifiable_build:latest -p 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn +```bash +solana-verify build ``` -This the output: +3. Deploy and verify: -``` -Verifying image: "ellipsislabs/hello_world_verifiable_build:latest", on network "https://api.mainnet-beta.solana.com" against program ID 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn -Executable path in container: "examples/hello_world/target/deploy/hello_world.so" +```bash +# Deploy +solana program deploy -u $NETWORK_URL target/deploy/$PROGRAM_LIB_NAME.so --program-id $PROGRAM_ID -Executable matches on-chain program data ✅ -``` - -This command loads up the image stored at [ellipsislabs/hello_world_verifiable_build:latest](https://hub.docker.com/layers/ellipsislabs/hello_world_verifiable_build/latest/images/sha256-d8b51c04c739999da618df4271d8d088fdcb3a0d8474044ebf434ebb993b5c7d?context=explore), and verifies that the hash of the executable path in the container is the same as the hash of the on-chain program supplied to the command. Because the build was already uploaded to an image, there is no need for a full rebuild of the executable which takes an extremely long time. - -### Manual Verification - -To get the hash of the of this program, we can run the following: +# Verify against repository -> upload your build data on chain +solana-verify verify-from-repo -u $NETWORK_URL --program-id $PROGRAM_ID https://github.com/$REPO_PATH -``` -verifier-cli get-program-hash -p 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn +# Trigger a remote job +solana-verify remote submit-job --program-id $PROGRAM_ID --uploader $THE_PUBKEY_THAT_UPLOADED_YOUR_BUILD_DATA ``` -Which will return the following hash: +## Documentation -``` -627a5b29a06179d08ac5eab2c085703e59decbe6 -``` +For detailed instructions and best practices, please refer to the [official Solana documentation on verified builds](https://solana.com/developers/guides/advanced/verified-builds). -By default, this command will strip any trailing zeros away from the program executable file and run the sha1 algorithm against it to compute the hash. +## Security Considerations +While verified builds enhance transparency, they should not be considered a complete security solution. Always: -To manually verify this build, one could run the following from the root of this repository. _This command takes a long time because it is building the binary in a Docker container_ +- Review the source code +- Use trusted build environments +- Consider using governance solutions for program upgrades -``` -cd examples/hello_world -verifier-cli build - -``` - -Now we can check the resulting hash from the build. - -``` -verifier-cli get-executable-hash -f target/deploy/hello_world.so +For responsible disclosure of bugs related to verified builds CLI, please email maintainers@ellipsislabs.xyz with a detailed description of the attack vector. -``` - -This will return the hash of the stripped executable - -``` - -627a5b29a06179d08ac5eab2c085703e59decbe6 +## Contributing -``` +Contributions are welcome! Please feel free to submit a Pull Request. diff --git a/build-all-images.sh b/build-all-images.sh new file mode 100644 index 0000000..71398ff --- /dev/null +++ b/build-all-images.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +# Change directory to where the Dockerfiles are located +cd ./docker + +# Iterate over each Dockerfile in the directory +for dockerfile in *; do + # Check if the file is actually a Dockerfile + if [ -f "$dockerfile" ] && [ "${dockerfile##*.}" == "Dockerfile" ]; then + # Extract image name from Dockerfile name + image_name="${dockerfile%Dockerfile}" + # Remove the last character from the image name + image_name="${image_name%?}" + # Interpolate image_name with "solana." + image_name="solana.$image_name" + echo "Building image: $image_name" + # Build the Docker image + docker build -t "$image_name" -f "$dockerfile" . + fi +done diff --git a/docker/v1.10.1.Dockerfile b/docker/v1.10.1.Dockerfile new file mode 100644 index 0000000..b14409d --- /dev/null +++ b/docker/v1.10.1.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.1/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.10.Dockerfile b/docker/v1.10.10.Dockerfile new file mode 100644 index 0000000..38c7609 --- /dev/null +++ b/docker/v1.10.10.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.10/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.11.Dockerfile b/docker/v1.10.11.Dockerfile new file mode 100644 index 0000000..5c23c11 --- /dev/null +++ b/docker/v1.10.11.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.11/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.12.Dockerfile b/docker/v1.10.12.Dockerfile new file mode 100644 index 0000000..80b82b0 --- /dev/null +++ b/docker/v1.10.12.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.12/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.13.Dockerfile b/docker/v1.10.13.Dockerfile new file mode 100644 index 0000000..c737897 --- /dev/null +++ b/docker/v1.10.13.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.13/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.14.Dockerfile b/docker/v1.10.14.Dockerfile new file mode 100644 index 0000000..599ce11 --- /dev/null +++ b/docker/v1.10.14.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.14/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.15.Dockerfile b/docker/v1.10.15.Dockerfile new file mode 100644 index 0000000..aa7d78c --- /dev/null +++ b/docker/v1.10.15.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.15/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.17.Dockerfile b/docker/v1.10.17.Dockerfile new file mode 100644 index 0000000..b51a9c8 --- /dev/null +++ b/docker/v1.10.17.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.17/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.19.Dockerfile b/docker/v1.10.19.Dockerfile new file mode 100644 index 0000000..ec0e904 --- /dev/null +++ b/docker/v1.10.19.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.19/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.2.Dockerfile b/docker/v1.10.2.Dockerfile new file mode 100644 index 0000000..098aaf8 --- /dev/null +++ b/docker/v1.10.2.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.2/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.20.Dockerfile b/docker/v1.10.20.Dockerfile new file mode 100644 index 0000000..e3c38f8 --- /dev/null +++ b/docker/v1.10.20.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.20/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.21.Dockerfile b/docker/v1.10.21.Dockerfile new file mode 100644 index 0000000..40ee372 --- /dev/null +++ b/docker/v1.10.21.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.21/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.22.Dockerfile b/docker/v1.10.22.Dockerfile new file mode 100644 index 0000000..ce89658 --- /dev/null +++ b/docker/v1.10.22.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.22/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.23.Dockerfile b/docker/v1.10.23.Dockerfile new file mode 100644 index 0000000..65befc1 --- /dev/null +++ b/docker/v1.10.23.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.23/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.24.Dockerfile b/docker/v1.10.24.Dockerfile new file mode 100644 index 0000000..28269bc --- /dev/null +++ b/docker/v1.10.24.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.24/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.25.Dockerfile b/docker/v1.10.25.Dockerfile new file mode 100644 index 0000000..2f5435d --- /dev/null +++ b/docker/v1.10.25.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.25/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.26.Dockerfile b/docker/v1.10.26.Dockerfile new file mode 100644 index 0000000..2a7edfe --- /dev/null +++ b/docker/v1.10.26.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.26/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.28.Dockerfile b/docker/v1.10.28.Dockerfile new file mode 100644 index 0000000..900da45 --- /dev/null +++ b/docker/v1.10.28.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.28/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.29.Dockerfile b/docker/v1.10.29.Dockerfile new file mode 100644 index 0000000..81fc1cf --- /dev/null +++ b/docker/v1.10.29.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.29/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.3.Dockerfile b/docker/v1.10.3.Dockerfile new file mode 100644 index 0000000..e277ef6 --- /dev/null +++ b/docker/v1.10.3.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.3/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.30.Dockerfile b/docker/v1.10.30.Dockerfile new file mode 100644 index 0000000..8fedace --- /dev/null +++ b/docker/v1.10.30.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.30/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.31.Dockerfile b/docker/v1.10.31.Dockerfile new file mode 100644 index 0000000..2d6ed9b --- /dev/null +++ b/docker/v1.10.31.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.31/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.32.Dockerfile b/docker/v1.10.32.Dockerfile new file mode 100644 index 0000000..2623537 --- /dev/null +++ b/docker/v1.10.32.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.32/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.33.Dockerfile b/docker/v1.10.33.Dockerfile new file mode 100644 index 0000000..a6bd694 --- /dev/null +++ b/docker/v1.10.33.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.33/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.34.Dockerfile b/docker/v1.10.34.Dockerfile new file mode 100644 index 0000000..89ae234 --- /dev/null +++ b/docker/v1.10.34.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.34/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.35.Dockerfile b/docker/v1.10.35.Dockerfile new file mode 100644 index 0000000..5c3c142 --- /dev/null +++ b/docker/v1.10.35.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.35/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.38.Dockerfile b/docker/v1.10.38.Dockerfile new file mode 100644 index 0000000..946171c --- /dev/null +++ b/docker/v1.10.38.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.38/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.39.Dockerfile b/docker/v1.10.39.Dockerfile new file mode 100644 index 0000000..1fb4374 --- /dev/null +++ b/docker/v1.10.39.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.39/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.4.Dockerfile b/docker/v1.10.4.Dockerfile new file mode 100644 index 0000000..b6a5452 --- /dev/null +++ b/docker/v1.10.4.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.4/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.40.Dockerfile b/docker/v1.10.40.Dockerfile new file mode 100644 index 0000000..98415ae --- /dev/null +++ b/docker/v1.10.40.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.40/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.41.Dockerfile b/docker/v1.10.41.Dockerfile new file mode 100644 index 0000000..5da2ed7 --- /dev/null +++ b/docker/v1.10.41.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.41/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.5.Dockerfile b/docker/v1.10.5.Dockerfile new file mode 100644 index 0000000..1f51145 --- /dev/null +++ b/docker/v1.10.5.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.5/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.6.Dockerfile b/docker/v1.10.6.Dockerfile new file mode 100644 index 0000000..4a8eadb --- /dev/null +++ b/docker/v1.10.6.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.6/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.7.Dockerfile b/docker/v1.10.7.Dockerfile new file mode 100644 index 0000000..24ba151 --- /dev/null +++ b/docker/v1.10.7.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.7/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.8.Dockerfile b/docker/v1.10.8.Dockerfile new file mode 100644 index 0000000..e18d0e6 --- /dev/null +++ b/docker/v1.10.8.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.8/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.10.9.Dockerfile b/docker/v1.10.9.Dockerfile new file mode 100644 index 0000000..e60360d --- /dev/null +++ b/docker/v1.10.9.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.10.9/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.11.0.Dockerfile b/docker/v1.11.0.Dockerfile new file mode 100644 index 0000000..860a7f7 --- /dev/null +++ b/docker/v1.11.0.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:9fe1f39bec70576e2bd568fafb194b2a532a6f2928bc0b951ac2c0a69a2be9fe + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.11.0/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.11.1.Dockerfile b/docker/v1.11.1.Dockerfile new file mode 100644 index 0000000..a61a44c --- /dev/null +++ b/docker/v1.11.1.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:9fe1f39bec70576e2bd568fafb194b2a532a6f2928bc0b951ac2c0a69a2be9fe + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.11.1/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.11.10.Dockerfile b/docker/v1.11.10.Dockerfile new file mode 100644 index 0000000..ed4d3a6 --- /dev/null +++ b/docker/v1.11.10.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:9fe1f39bec70576e2bd568fafb194b2a532a6f2928bc0b951ac2c0a69a2be9fe + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.11.10/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.11.2.Dockerfile b/docker/v1.11.2.Dockerfile new file mode 100644 index 0000000..cb3e86d --- /dev/null +++ b/docker/v1.11.2.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:9fe1f39bec70576e2bd568fafb194b2a532a6f2928bc0b951ac2c0a69a2be9fe + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.11.2/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.11.3.Dockerfile b/docker/v1.11.3.Dockerfile new file mode 100644 index 0000000..38cbc90 --- /dev/null +++ b/docker/v1.11.3.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:9fe1f39bec70576e2bd568fafb194b2a532a6f2928bc0b951ac2c0a69a2be9fe + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.11.3/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.11.4.Dockerfile b/docker/v1.11.4.Dockerfile new file mode 100644 index 0000000..524e33f --- /dev/null +++ b/docker/v1.11.4.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:9fe1f39bec70576e2bd568fafb194b2a532a6f2928bc0b951ac2c0a69a2be9fe + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.11.4/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.11.5.Dockerfile b/docker/v1.11.5.Dockerfile new file mode 100644 index 0000000..da5072e --- /dev/null +++ b/docker/v1.11.5.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:9fe1f39bec70576e2bd568fafb194b2a532a6f2928bc0b951ac2c0a69a2be9fe + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.11.5/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.11.6.Dockerfile b/docker/v1.11.6.Dockerfile new file mode 100644 index 0000000..ff55f35 --- /dev/null +++ b/docker/v1.11.6.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:9fe1f39bec70576e2bd568fafb194b2a532a6f2928bc0b951ac2c0a69a2be9fe + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.11.6/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.13.1.Dockerfile b/docker/v1.13.1.Dockerfile new file mode 100644 index 0000000..983019b --- /dev/null +++ b/docker/v1.13.1.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.13.1/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.13.2.Dockerfile b/docker/v1.13.2.Dockerfile new file mode 100644 index 0000000..4fe7a9a --- /dev/null +++ b/docker/v1.13.2.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.13.2/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.13.3.Dockerfile b/docker/v1.13.3.Dockerfile new file mode 100644 index 0000000..7aa5d66 --- /dev/null +++ b/docker/v1.13.3.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.13.3/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.13.4.Dockerfile b/docker/v1.13.4.Dockerfile new file mode 100644 index 0000000..333352d --- /dev/null +++ b/docker/v1.13.4.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.13.4/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.13.5.Dockerfile b/docker/v1.13.5.Dockerfile new file mode 100644 index 0000000..6311d34 --- /dev/null +++ b/docker/v1.13.5.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.13.5/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.13.6.Dockerfile b/docker/v1.13.6.Dockerfile new file mode 100644 index 0000000..98115d8 --- /dev/null +++ b/docker/v1.13.6.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.13.6/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.13.7.Dockerfile b/docker/v1.13.7.Dockerfile new file mode 100644 index 0000000..664a64a --- /dev/null +++ b/docker/v1.13.7.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:b33af7ffbb3bf98940f8326d9563ca403e315a33d9434303df76bdc325b0f5c4 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.13.7/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.1.Dockerfile b/docker/v1.14.1.Dockerfile new file mode 100644 index 0000000..1787fc9 --- /dev/null +++ b/docker/v1.14.1.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.1/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.10.Dockerfile b/docker/v1.14.10.Dockerfile new file mode 100644 index 0000000..671fed4 --- /dev/null +++ b/docker/v1.14.10.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.10/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.11.Dockerfile b/docker/v1.14.11.Dockerfile new file mode 100644 index 0000000..17302b4 --- /dev/null +++ b/docker/v1.14.11.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.11/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.12.Dockerfile b/docker/v1.14.12.Dockerfile new file mode 100644 index 0000000..f248825 --- /dev/null +++ b/docker/v1.14.12.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.12/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.13.Dockerfile b/docker/v1.14.13.Dockerfile new file mode 100644 index 0000000..fa5e7f4 --- /dev/null +++ b/docker/v1.14.13.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.13/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.14.Dockerfile b/docker/v1.14.14.Dockerfile new file mode 100644 index 0000000..1309b7c --- /dev/null +++ b/docker/v1.14.14.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.14/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.15.Dockerfile b/docker/v1.14.15.Dockerfile new file mode 100644 index 0000000..77d1d0e --- /dev/null +++ b/docker/v1.14.15.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.15/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.16.Dockerfile b/docker/v1.14.16.Dockerfile new file mode 100644 index 0000000..3b469e1 --- /dev/null +++ b/docker/v1.14.16.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.16/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.17.Dockerfile b/docker/v1.14.17.Dockerfile new file mode 100644 index 0000000..6b2c0f8 --- /dev/null +++ b/docker/v1.14.17.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.17/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.18.Dockerfile b/docker/v1.14.18.Dockerfile new file mode 100644 index 0000000..0babe77 --- /dev/null +++ b/docker/v1.14.18.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.18/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.19.Dockerfile b/docker/v1.14.19.Dockerfile new file mode 100644 index 0000000..8c53328 --- /dev/null +++ b/docker/v1.14.19.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.19/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.2.Dockerfile b/docker/v1.14.2.Dockerfile new file mode 100644 index 0000000..81fe06b --- /dev/null +++ b/docker/v1.14.2.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.2/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.20.Dockerfile b/docker/v1.14.20.Dockerfile new file mode 100644 index 0000000..62042c1 --- /dev/null +++ b/docker/v1.14.20.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.20/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.21.Dockerfile b/docker/v1.14.21.Dockerfile new file mode 100644 index 0000000..4547de1 --- /dev/null +++ b/docker/v1.14.21.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.21/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.22.Dockerfile b/docker/v1.14.22.Dockerfile new file mode 100644 index 0000000..50d9352 --- /dev/null +++ b/docker/v1.14.22.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.22/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.23.Dockerfile b/docker/v1.14.23.Dockerfile new file mode 100644 index 0000000..d247516 --- /dev/null +++ b/docker/v1.14.23.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.23/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.24.Dockerfile b/docker/v1.14.24.Dockerfile new file mode 100644 index 0000000..0d6c7bf --- /dev/null +++ b/docker/v1.14.24.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.24/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.25.Dockerfile b/docker/v1.14.25.Dockerfile new file mode 100644 index 0000000..3ade3ab --- /dev/null +++ b/docker/v1.14.25.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.25/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.26.Dockerfile b/docker/v1.14.26.Dockerfile new file mode 100644 index 0000000..173f25d --- /dev/null +++ b/docker/v1.14.26.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.26/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.27.Dockerfile b/docker/v1.14.27.Dockerfile new file mode 100644 index 0000000..6fab2c3 --- /dev/null +++ b/docker/v1.14.27.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.27/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.28.Dockerfile b/docker/v1.14.28.Dockerfile new file mode 100644 index 0000000..dadef16 --- /dev/null +++ b/docker/v1.14.28.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.28/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.29.Dockerfile b/docker/v1.14.29.Dockerfile new file mode 100644 index 0000000..06c0a9b --- /dev/null +++ b/docker/v1.14.29.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.29/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.3.Dockerfile b/docker/v1.14.3.Dockerfile new file mode 100644 index 0000000..efcdbe7 --- /dev/null +++ b/docker/v1.14.3.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.3/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.4.Dockerfile b/docker/v1.14.4.Dockerfile new file mode 100644 index 0000000..6c96339 --- /dev/null +++ b/docker/v1.14.4.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.4/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.5.Dockerfile b/docker/v1.14.5.Dockerfile new file mode 100644 index 0000000..e65aa14 --- /dev/null +++ b/docker/v1.14.5.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.5/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.6.Dockerfile b/docker/v1.14.6.Dockerfile new file mode 100644 index 0000000..6c14441 --- /dev/null +++ b/docker/v1.14.6.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.6/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.7.Dockerfile b/docker/v1.14.7.Dockerfile new file mode 100644 index 0000000..c67eb4d --- /dev/null +++ b/docker/v1.14.7.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.7/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.8.Dockerfile b/docker/v1.14.8.Dockerfile new file mode 100644 index 0000000..f83b15e --- /dev/null +++ b/docker/v1.14.8.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.8/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.14.9.Dockerfile b/docker/v1.14.9.Dockerfile new file mode 100644 index 0000000..5aa4c60 --- /dev/null +++ b/docker/v1.14.9.Dockerfile @@ -0,0 +1,14 @@ +FROM --platform=linux/amd64 rust@sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39 + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \ + chmod +x solana_install.sh && \ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS=v1.14.9/" solana_install.sh && \ + ./solana_install.sh && \ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash diff --git a/docker/v1.16.0.Dockerfile b/docker/v1.16.0.Dockerfile new file mode 100644 index 0000000..de23d08 --- /dev/null +++ b/docker/v1.16.0.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.0/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.1.Dockerfile b/docker/v1.16.1.Dockerfile new file mode 100644 index 0000000..6502147 --- /dev/null +++ b/docker/v1.16.1.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.1/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.10.Dockerfile b/docker/v1.16.10.Dockerfile new file mode 100644 index 0000000..8fe6d7c --- /dev/null +++ b/docker/v1.16.10.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.10/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.11.Dockerfile b/docker/v1.16.11.Dockerfile new file mode 100644 index 0000000..54b90ad --- /dev/null +++ b/docker/v1.16.11.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.11/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.12.Dockerfile b/docker/v1.16.12.Dockerfile new file mode 100644 index 0000000..851d1fa --- /dev/null +++ b/docker/v1.16.12.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.12/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.13.Dockerfile b/docker/v1.16.13.Dockerfile new file mode 100644 index 0000000..177b979 --- /dev/null +++ b/docker/v1.16.13.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.13/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.14.Dockerfile b/docker/v1.16.14.Dockerfile new file mode 100644 index 0000000..80e92a8 --- /dev/null +++ b/docker/v1.16.14.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.14/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.15.Dockerfile b/docker/v1.16.15.Dockerfile new file mode 100644 index 0000000..e0967f1 --- /dev/null +++ b/docker/v1.16.15.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.15/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.16.Dockerfile b/docker/v1.16.16.Dockerfile new file mode 100644 index 0000000..35bd54f --- /dev/null +++ b/docker/v1.16.16.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.16/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.17.Dockerfile b/docker/v1.16.17.Dockerfile new file mode 100644 index 0000000..2610e21 --- /dev/null +++ b/docker/v1.16.17.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.17/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.18.Dockerfile b/docker/v1.16.18.Dockerfile new file mode 100644 index 0000000..7065fff --- /dev/null +++ b/docker/v1.16.18.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.18/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.19.Dockerfile b/docker/v1.16.19.Dockerfile new file mode 100644 index 0000000..57bacfa --- /dev/null +++ b/docker/v1.16.19.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.19/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.2.Dockerfile b/docker/v1.16.2.Dockerfile new file mode 100644 index 0000000..cadad9d --- /dev/null +++ b/docker/v1.16.2.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.2/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.20.Dockerfile b/docker/v1.16.20.Dockerfile new file mode 100644 index 0000000..6ab94c9 --- /dev/null +++ b/docker/v1.16.20.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.20/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.21.Dockerfile b/docker/v1.16.21.Dockerfile new file mode 100644 index 0000000..92ddcfd --- /dev/null +++ b/docker/v1.16.21.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.21/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.22.Dockerfile b/docker/v1.16.22.Dockerfile new file mode 100644 index 0000000..8b1c66e --- /dev/null +++ b/docker/v1.16.22.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.22/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.23.Dockerfile b/docker/v1.16.23.Dockerfile new file mode 100644 index 0000000..6afef5a --- /dev/null +++ b/docker/v1.16.23.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.23/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.24.Dockerfile b/docker/v1.16.24.Dockerfile new file mode 100644 index 0000000..68a8b7b --- /dev/null +++ b/docker/v1.16.24.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.24/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.25.Dockerfile b/docker/v1.16.25.Dockerfile new file mode 100644 index 0000000..02e3f9d --- /dev/null +++ b/docker/v1.16.25.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.25/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.26.Dockerfile b/docker/v1.16.26.Dockerfile new file mode 100644 index 0000000..ba34de3 --- /dev/null +++ b/docker/v1.16.26.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.26/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.27.Dockerfile b/docker/v1.16.27.Dockerfile new file mode 100644 index 0000000..277a476 --- /dev/null +++ b/docker/v1.16.27.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.27/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.3.Dockerfile b/docker/v1.16.3.Dockerfile new file mode 100644 index 0000000..463716f --- /dev/null +++ b/docker/v1.16.3.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.3/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.4.Dockerfile b/docker/v1.16.4.Dockerfile new file mode 100644 index 0000000..929dd05 --- /dev/null +++ b/docker/v1.16.4.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.4/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.5.Dockerfile b/docker/v1.16.5.Dockerfile new file mode 100644 index 0000000..03f1dc3 --- /dev/null +++ b/docker/v1.16.5.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.5/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.6.Dockerfile b/docker/v1.16.6.Dockerfile new file mode 100644 index 0000000..4eaf9c0 --- /dev/null +++ b/docker/v1.16.6.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.6/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.7.Dockerfile b/docker/v1.16.7.Dockerfile new file mode 100644 index 0000000..5c46eb5 --- /dev/null +++ b/docker/v1.16.7.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.7/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.8.Dockerfile b/docker/v1.16.8.Dockerfile new file mode 100644 index 0000000..c134440 --- /dev/null +++ b/docker/v1.16.8.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.8/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.16.9.Dockerfile b/docker/v1.16.9.Dockerfile new file mode 100644 index 0000000..837689b --- /dev/null +++ b/docker/v1.16.9.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7e0e2c6199fb5f309742c5eba637415c25ca2bed47fa5e80e274d4510ddfa3a + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.16.9/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.0.Dockerfile b/docker/v1.17.0.Dockerfile new file mode 100644 index 0000000..867396f --- /dev/null +++ b/docker/v1.17.0.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:6a2ac38604fce995fd586c8d760147f71d9113dcbe84a7fcddcb30c60a1ec7ee + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.0/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.1.Dockerfile b/docker/v1.17.1.Dockerfile new file mode 100644 index 0000000..25d717f --- /dev/null +++ b/docker/v1.17.1.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.1/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.10.Dockerfile b/docker/v1.17.10.Dockerfile new file mode 100644 index 0000000..398c08b --- /dev/null +++ b/docker/v1.17.10.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.10/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.11.Dockerfile b/docker/v1.17.11.Dockerfile new file mode 100644 index 0000000..bf05503 --- /dev/null +++ b/docker/v1.17.11.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.11/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.12.Dockerfile b/docker/v1.17.12.Dockerfile new file mode 100644 index 0000000..08e8c78 --- /dev/null +++ b/docker/v1.17.12.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.12/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.13.Dockerfile b/docker/v1.17.13.Dockerfile new file mode 100644 index 0000000..256d5f7 --- /dev/null +++ b/docker/v1.17.13.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.13/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.14.Dockerfile b/docker/v1.17.14.Dockerfile new file mode 100644 index 0000000..6ebad52 --- /dev/null +++ b/docker/v1.17.14.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.14/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.15.Dockerfile b/docker/v1.17.15.Dockerfile new file mode 100644 index 0000000..3159683 --- /dev/null +++ b/docker/v1.17.15.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.15/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.16.Dockerfile b/docker/v1.17.16.Dockerfile new file mode 100644 index 0000000..e9f7b76 --- /dev/null +++ b/docker/v1.17.16.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.16/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.17.Dockerfile b/docker/v1.17.17.Dockerfile new file mode 100644 index 0000000..08cfeae --- /dev/null +++ b/docker/v1.17.17.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.17/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.18.Dockerfile b/docker/v1.17.18.Dockerfile new file mode 100644 index 0000000..3d2ef51 --- /dev/null +++ b/docker/v1.17.18.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.18/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.19.Dockerfile b/docker/v1.17.19.Dockerfile new file mode 100644 index 0000000..6ff8ae6 --- /dev/null +++ b/docker/v1.17.19.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.19/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.2.Dockerfile b/docker/v1.17.2.Dockerfile new file mode 100644 index 0000000..55c479b --- /dev/null +++ b/docker/v1.17.2.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.2/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.20.Dockerfile b/docker/v1.17.20.Dockerfile new file mode 100644 index 0000000..b81d2cc --- /dev/null +++ b/docker/v1.17.20.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.20/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.21.Dockerfile b/docker/v1.17.21.Dockerfile new file mode 100644 index 0000000..92dafac --- /dev/null +++ b/docker/v1.17.21.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.21/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.22.Dockerfile b/docker/v1.17.22.Dockerfile new file mode 100644 index 0000000..82372a5 --- /dev/null +++ b/docker/v1.17.22.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.22/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.23.Dockerfile b/docker/v1.17.23.Dockerfile new file mode 100644 index 0000000..04b40e3 --- /dev/null +++ b/docker/v1.17.23.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.23/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.24.Dockerfile b/docker/v1.17.24.Dockerfile new file mode 100644 index 0000000..d8859e8 --- /dev/null +++ b/docker/v1.17.24.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.24/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.25.Dockerfile b/docker/v1.17.25.Dockerfile new file mode 100644 index 0000000..7a1fd7a --- /dev/null +++ b/docker/v1.17.25.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.25/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.26.Dockerfile b/docker/v1.17.26.Dockerfile new file mode 100644 index 0000000..78178ea --- /dev/null +++ b/docker/v1.17.26.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.26/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.27.Dockerfile b/docker/v1.17.27.Dockerfile new file mode 100644 index 0000000..d73b7a7 --- /dev/null +++ b/docker/v1.17.27.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.27/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.28.Dockerfile b/docker/v1.17.28.Dockerfile new file mode 100644 index 0000000..17914cf --- /dev/null +++ b/docker/v1.17.28.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.28/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.29.Dockerfile b/docker/v1.17.29.Dockerfile new file mode 100644 index 0000000..ce1c707 --- /dev/null +++ b/docker/v1.17.29.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.29/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.3.Dockerfile b/docker/v1.17.3.Dockerfile new file mode 100644 index 0000000..f607ab2 --- /dev/null +++ b/docker/v1.17.3.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.3/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.30.Dockerfile b/docker/v1.17.30.Dockerfile new file mode 100644 index 0000000..20b0ed2 --- /dev/null +++ b/docker/v1.17.30.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.30/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.31.Dockerfile b/docker/v1.17.31.Dockerfile new file mode 100644 index 0000000..57f84c0 --- /dev/null +++ b/docker/v1.17.31.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.31/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.32.Dockerfile b/docker/v1.17.32.Dockerfile new file mode 100644 index 0000000..d11cf9e --- /dev/null +++ b/docker/v1.17.32.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.32/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.33.Dockerfile b/docker/v1.17.33.Dockerfile new file mode 100644 index 0000000..95f72ec --- /dev/null +++ b/docker/v1.17.33.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.33/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.34.Dockerfile b/docker/v1.17.34.Dockerfile new file mode 100644 index 0000000..ae4576b --- /dev/null +++ b/docker/v1.17.34.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.34/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.4.Dockerfile b/docker/v1.17.4.Dockerfile new file mode 100644 index 0000000..7872a6e --- /dev/null +++ b/docker/v1.17.4.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.4/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.5.Dockerfile b/docker/v1.17.5.Dockerfile new file mode 100644 index 0000000..e3ffd8c --- /dev/null +++ b/docker/v1.17.5.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.5/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.6.Dockerfile b/docker/v1.17.6.Dockerfile new file mode 100644 index 0000000..fe361da --- /dev/null +++ b/docker/v1.17.6.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.6/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.7.Dockerfile b/docker/v1.17.7.Dockerfile new file mode 100644 index 0000000..566091c --- /dev/null +++ b/docker/v1.17.7.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.7/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.8.Dockerfile b/docker/v1.17.8.Dockerfile new file mode 100644 index 0000000..6cb0a23 --- /dev/null +++ b/docker/v1.17.8.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.8/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.17.9.Dockerfile b/docker/v1.17.9.Dockerfile new file mode 100644 index 0000000..fd6d016 --- /dev/null +++ b/docker/v1.17.9.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:e5a28b9e772535dc50205b4684b4e1cd113bb52e02e54ff387015c55c561e477 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.17.9/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.0.Dockerfile b/docker/v1.18.0.Dockerfile new file mode 100644 index 0000000..9b21b3c --- /dev/null +++ b/docker/v1.18.0.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.0/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.1.Dockerfile b/docker/v1.18.1.Dockerfile new file mode 100644 index 0000000..424a993 --- /dev/null +++ b/docker/v1.18.1.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.1/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.10.Dockerfile b/docker/v1.18.10.Dockerfile new file mode 100644 index 0000000..93cd410 --- /dev/null +++ b/docker/v1.18.10.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.10/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.11.Dockerfile b/docker/v1.18.11.Dockerfile new file mode 100644 index 0000000..841c7cd --- /dev/null +++ b/docker/v1.18.11.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.11/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.12.Dockerfile b/docker/v1.18.12.Dockerfile new file mode 100644 index 0000000..3b289d1 --- /dev/null +++ b/docker/v1.18.12.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.12/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.13.Dockerfile b/docker/v1.18.13.Dockerfile new file mode 100644 index 0000000..9e96737 --- /dev/null +++ b/docker/v1.18.13.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.13/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.14.Dockerfile b/docker/v1.18.14.Dockerfile new file mode 100644 index 0000000..8156dc8 --- /dev/null +++ b/docker/v1.18.14.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.14/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.15.Dockerfile b/docker/v1.18.15.Dockerfile new file mode 100644 index 0000000..a0c0e36 --- /dev/null +++ b/docker/v1.18.15.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.15/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.16.Dockerfile b/docker/v1.18.16.Dockerfile new file mode 100644 index 0000000..f4e658c --- /dev/null +++ b/docker/v1.18.16.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.16/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.17.Dockerfile b/docker/v1.18.17.Dockerfile new file mode 100644 index 0000000..07a68e9 --- /dev/null +++ b/docker/v1.18.17.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.17/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.18.Dockerfile b/docker/v1.18.18.Dockerfile new file mode 100644 index 0000000..1661182 --- /dev/null +++ b/docker/v1.18.18.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.18/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.19.Dockerfile b/docker/v1.18.19.Dockerfile new file mode 100644 index 0000000..96058e4 --- /dev/null +++ b/docker/v1.18.19.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.19/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.2.Dockerfile b/docker/v1.18.2.Dockerfile new file mode 100644 index 0000000..c6cae02 --- /dev/null +++ b/docker/v1.18.2.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.2/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.20.Dockerfile b/docker/v1.18.20.Dockerfile new file mode 100644 index 0000000..589a1e1 --- /dev/null +++ b/docker/v1.18.20.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.20/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.21.Dockerfile b/docker/v1.18.21.Dockerfile new file mode 100644 index 0000000..31fdc00 --- /dev/null +++ b/docker/v1.18.21.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.21/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.22.Dockerfile b/docker/v1.18.22.Dockerfile new file mode 100644 index 0000000..8886a00 --- /dev/null +++ b/docker/v1.18.22.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.22/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.23.Dockerfile b/docker/v1.18.23.Dockerfile new file mode 100644 index 0000000..e7896d6 --- /dev/null +++ b/docker/v1.18.23.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.23/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.24.Dockerfile b/docker/v1.18.24.Dockerfile new file mode 100644 index 0000000..3b5a996 --- /dev/null +++ b/docker/v1.18.24.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v1.18.24/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.25.Dockerfile b/docker/v1.18.25.Dockerfile new file mode 100644 index 0000000..14e3526 --- /dev/null +++ b/docker/v1.18.25.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v1.18.25/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.26.Dockerfile b/docker/v1.18.26.Dockerfile new file mode 100644 index 0000000..b922024 --- /dev/null +++ b/docker/v1.18.26.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v1.18.26/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.3.Dockerfile b/docker/v1.18.3.Dockerfile new file mode 100644 index 0000000..0288196 --- /dev/null +++ b/docker/v1.18.3.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.3/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.4.Dockerfile b/docker/v1.18.4.Dockerfile new file mode 100644 index 0000000..c743285 --- /dev/null +++ b/docker/v1.18.4.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.4/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.5.Dockerfile b/docker/v1.18.5.Dockerfile new file mode 100644 index 0000000..fa5a4e8 --- /dev/null +++ b/docker/v1.18.5.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.5/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.6.Dockerfile b/docker/v1.18.6.Dockerfile new file mode 100644 index 0000000..f3df9ee --- /dev/null +++ b/docker/v1.18.6.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.6/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.7.Dockerfile b/docker/v1.18.7.Dockerfile new file mode 100644 index 0000000..adc6829 --- /dev/null +++ b/docker/v1.18.7.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.7/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.8.Dockerfile b/docker/v1.18.8.Dockerfile new file mode 100644 index 0000000..cb5742f --- /dev/null +++ b/docker/v1.18.8.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.8/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v1.18.9.Dockerfile b/docker/v1.18.9.Dockerfile new file mode 100644 index 0000000..a6419ef --- /dev/null +++ b/docker/v1.18.9.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:b7b25312e49dfbe6cab04c89d5a8ed5df2df971406a3b5c5ac43e247b5821b5f + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/v1.18.9/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.0.Dockerfile b/docker/v2.0.0.Dockerfile new file mode 100644 index 0000000..409dcb3 --- /dev/null +++ b/docker/v2.0.0.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.0/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.1.Dockerfile b/docker/v2.0.1.Dockerfile new file mode 100644 index 0000000..2b3ff36 --- /dev/null +++ b/docker/v2.0.1.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.1/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.10.Dockerfile b/docker/v2.0.10.Dockerfile new file mode 100644 index 0000000..3a5163c --- /dev/null +++ b/docker/v2.0.10.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.10/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.11.Dockerfile b/docker/v2.0.11.Dockerfile new file mode 100644 index 0000000..896a1d7 --- /dev/null +++ b/docker/v2.0.11.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.11/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.12.Dockerfile b/docker/v2.0.12.Dockerfile new file mode 100644 index 0000000..02ec14a --- /dev/null +++ b/docker/v2.0.12.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.12/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.13.Dockerfile b/docker/v2.0.13.Dockerfile new file mode 100644 index 0000000..2881b63 --- /dev/null +++ b/docker/v2.0.13.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.13/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.14.Dockerfile b/docker/v2.0.14.Dockerfile new file mode 100644 index 0000000..591cbde --- /dev/null +++ b/docker/v2.0.14.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.14/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.15.Dockerfile b/docker/v2.0.15.Dockerfile new file mode 100644 index 0000000..03d9f2e --- /dev/null +++ b/docker/v2.0.15.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.15/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.16.Dockerfile b/docker/v2.0.16.Dockerfile new file mode 100644 index 0000000..d0a5016 --- /dev/null +++ b/docker/v2.0.16.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.16/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.17.Dockerfile b/docker/v2.0.17.Dockerfile new file mode 100644 index 0000000..e61e8d4 --- /dev/null +++ b/docker/v2.0.17.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.17/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.18.Dockerfile b/docker/v2.0.18.Dockerfile new file mode 100644 index 0000000..2846e3d --- /dev/null +++ b/docker/v2.0.18.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.18/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.19.Dockerfile b/docker/v2.0.19.Dockerfile new file mode 100644 index 0000000..790c871 --- /dev/null +++ b/docker/v2.0.19.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.19/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.2.Dockerfile b/docker/v2.0.2.Dockerfile new file mode 100644 index 0000000..812b02b --- /dev/null +++ b/docker/v2.0.2.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.2/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.20.Dockerfile b/docker/v2.0.20.Dockerfile new file mode 100644 index 0000000..a746e32 --- /dev/null +++ b/docker/v2.0.20.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.20/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.21.Dockerfile b/docker/v2.0.21.Dockerfile new file mode 100644 index 0000000..e9a82c8 --- /dev/null +++ b/docker/v2.0.21.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.21/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.22.Dockerfile b/docker/v2.0.22.Dockerfile new file mode 100644 index 0000000..52bd2a8 --- /dev/null +++ b/docker/v2.0.22.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.22/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.3.Dockerfile b/docker/v2.0.3.Dockerfile new file mode 100644 index 0000000..a1a6d6e --- /dev/null +++ b/docker/v2.0.3.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.3/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.4.Dockerfile b/docker/v2.0.4.Dockerfile new file mode 100644 index 0000000..f6062b2 --- /dev/null +++ b/docker/v2.0.4.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.4/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.5.Dockerfile b/docker/v2.0.5.Dockerfile new file mode 100644 index 0000000..619c02a --- /dev/null +++ b/docker/v2.0.5.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.5/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.6.Dockerfile b/docker/v2.0.6.Dockerfile new file mode 100644 index 0000000..aed224d --- /dev/null +++ b/docker/v2.0.6.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.6/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.7.Dockerfile b/docker/v2.0.7.Dockerfile new file mode 100644 index 0000000..2d48ba6 --- /dev/null +++ b/docker/v2.0.7.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.7/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.8.Dockerfile b/docker/v2.0.8.Dockerfile new file mode 100644 index 0000000..91ee898 --- /dev/null +++ b/docker/v2.0.8.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.8/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.0.9.Dockerfile b/docker/v2.0.9.Dockerfile new file mode 100644 index 0000000..cc992b7 --- /dev/null +++ b/docker/v2.0.9.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:653bd24b9a8f9800c67df55fea5637a97152153fd744a4ef78dd41f7ddc40144 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.0.9/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.1.0.Dockerfile b/docker/v2.1.0.Dockerfile new file mode 100644 index 0000000..6458771 --- /dev/null +++ b/docker/v2.1.0.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:62afc139057dc9d3eda02e490677911b55a208ba22d6f7315f3c5c5851e31a36 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.0/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.1.1.Dockerfile b/docker/v2.1.1.Dockerfile new file mode 100644 index 0000000..80659e0 --- /dev/null +++ b/docker/v2.1.1.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:62afc139057dc9d3eda02e490677911b55a208ba22d6f7315f3c5c5851e31a36 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.1/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.1.2.Dockerfile b/docker/v2.1.2.Dockerfile new file mode 100644 index 0000000..ff28612 --- /dev/null +++ b/docker/v2.1.2.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:62afc139057dc9d3eda02e490677911b55a208ba22d6f7315f3c5c5851e31a36 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.2/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.1.3.Dockerfile b/docker/v2.1.3.Dockerfile new file mode 100644 index 0000000..bc7c1db --- /dev/null +++ b/docker/v2.1.3.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:62afc139057dc9d3eda02e490677911b55a208ba22d6f7315f3c5c5851e31a36 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.3/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.1.4.Dockerfile b/docker/v2.1.4.Dockerfile new file mode 100644 index 0000000..81c9086 --- /dev/null +++ b/docker/v2.1.4.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:62afc139057dc9d3eda02e490677911b55a208ba22d6f7315f3c5c5851e31a36 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.4/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.1.5.Dockerfile b/docker/v2.1.5.Dockerfile new file mode 100644 index 0000000..d4e304a --- /dev/null +++ b/docker/v2.1.5.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:62afc139057dc9d3eda02e490677911b55a208ba22d6f7315f3c5c5851e31a36 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.5/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.1.6.Dockerfile b/docker/v2.1.6.Dockerfile new file mode 100644 index 0000000..d846d43 --- /dev/null +++ b/docker/v2.1.6.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:62afc139057dc9d3eda02e490677911b55a208ba22d6f7315f3c5c5851e31a36 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.6/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.1.7.Dockerfile b/docker/v2.1.7.Dockerfile new file mode 100644 index 0000000..c782a5e --- /dev/null +++ b/docker/v2.1.7.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:62afc139057dc9d3eda02e490677911b55a208ba22d6f7315f3c5c5851e31a36 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.7/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.1.8.Dockerfile b/docker/v2.1.8.Dockerfile new file mode 100644 index 0000000..5d28005 --- /dev/null +++ b/docker/v2.1.8.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:62afc139057dc9d3eda02e490677911b55a208ba22d6f7315f3c5c5851e31a36 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.8/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/docker/v2.1.9.Dockerfile b/docker/v2.1.9.Dockerfile new file mode 100644 index 0000000..271a898 --- /dev/null +++ b/docker/v2.1.9.Dockerfile @@ -0,0 +1,8 @@ +FROM --platform=linux/amd64 rust@sha256:62afc139057dc9d3eda02e490677911b55a208ba22d6f7315f3c5c5851e31a36 + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.9/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash diff --git a/examples/hello_world/hello_world.dockerfile b/examples/hello_world/hello_world.dockerfile new file mode 100644 index 0000000..faf2609 --- /dev/null +++ b/examples/hello_world/hello_world.dockerfile @@ -0,0 +1,7 @@ +# Get rust and solana toolchain +FROM ellipsislabs/solana:latest +# Install the Solana Verify CLI +RUN git clone https://github.com/Ellipsis-Labs/solana-verifiable-build.git /build +RUN git checkout 08c4a64 +# Get the code of the program to build and verify +RUN cd examples/hello_world && cargo build-sbf -- --locked --frozen \ No newline at end of file diff --git a/generate_dockerfiles.py b/generate_dockerfiles.py new file mode 100644 index 0000000..c41bdf8 --- /dev/null +++ b/generate_dockerfiles.py @@ -0,0 +1,300 @@ +import subprocess +import os +import argparse +import requests +import tomllib +import re + +parser = argparse.ArgumentParser() +parser.add_argument("--upload", action="store_true") +parser.add_argument("--skip_cache", action="store_true") +parser.add_argument("--version") +args = parser.parse_args() + +# Array of Solana version mapped to rust version hashes +RUST_DOCKER_IMAGESHA_MAP = { + "1.68.0": "sha256:79892de83d1af9109c47a4566a24a0b240348bb8c088f1bccc52645c4c70ec39" +} + +RUST_VERSION_PLACEHOLDER = "$RUST_VERSION" +SOLANA_VERSION_PLACEHOLDER = "$SOLANA_VERSION" +AGAVE_VERSION_PLACEHOLDER = "$AGAVE_VERSION" + +# Dockerfile template for Solana versions >= 1.15 +base_dockerfile_sol = f""" +FROM --platform=linux/amd64 rust@{RUST_VERSION_PLACEHOLDER} + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.solana.com/{SOLANA_VERSION_PLACEHOLDER}/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash +""" + +# Dockerfile template for Solana versions < 1.15 +base_dockerfile_sol_pre15 = f""" +FROM --platform=linux/amd64 rust@{RUST_VERSION_PLACEHOLDER} + +RUN apt-get update && apt-get install -qy git gnutls-bin curl + +# Download and modify the Solana install script to install the specified version +RUN curl -sSfL "https://release.solana.com/v1.18.20/install" -o solana_install.sh && \\ + chmod +x solana_install.sh && \\ + sed -i "s/^SOLANA_INSTALL_INIT_ARGS=.*/SOLANA_INSTALL_INIT_ARGS={SOLANA_VERSION_PLACEHOLDER}/" solana_install.sh && \\ + ./solana_install.sh && \\ + rm solana_install.sh + +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build +CMD /bin/bash +""" + +# Dockerfile template for Agave +base_dockerfile_agave = f""" +FROM --platform=linux/amd64 rust@{RUST_VERSION_PLACEHOLDER} + +RUN apt-get update && apt-get install -qy git gnutls-bin +RUN sh -c "$(curl -sSfL https://release.anza.xyz/{AGAVE_VERSION_PLACEHOLDER}/install)" +ENV PATH="/root/.local/share/solana/install/active_release/bin:$PATH" +WORKDIR /build + +CMD /bin/bash +""" + +# Skipping these because the are not valid releases or where yanked +SKIPPED_VERSIONS = { + "v1.15", "v1.14.0", "v1.10.0", "v1.10.16", "v1.10.18", + "v1.10.27", "v1.10.36", "v1.10.37", "v1.11.7", "v1.11.8", "v1.11.9", + "v1.13.0", +} + +# Determine release information for Solana or Agave +def get_release_info(version_tag): + """ + Determines if a version is a Solana or Agave release and provides relevant info. + Returns a dictionary with base_dockerfile_text, version_placeholder, and the URL for the toolchain. + """ + version_parts = version_tag.strip("v").split(".") + if not all(part.isdigit() for part in version_parts): + print(f"Skipping non-numeric tag: {version_tag}") + return None + + major, minor, patch = map(int, version_parts) + + if major == 1 and minor == 15: + print(f"Skipping yanked v1.15.x release: {version_tag}") + return None + + if version_tag in SKIPPED_VERSIONS: + print(f"Skipping yanked release: {version_tag}") + return None + + # It would also be possible to generate more images for older versions but is it necessary? + if major == 1 and minor < 10: + print(f"Skipping all releases before 10 release: {version_tag}") + return None + + # All releases 14 and below have a broken installer, so we need to use a custom script with a newer installer + if (major == 1 and minor < 15): + release_info = { + "base_dockerfile_text": base_dockerfile_sol_pre15, + "version_placeholder": SOLANA_VERSION_PLACEHOLDER, + "url": f"https://raw.githubusercontent.com/solana-labs/solana/{version_tag}/rust-toolchain.toml" + } + # Everything from 1.15.0 to 1.18.24 we want to get from solana labs + elif (major == 1 and minor >= 15) and not (minor == 18 and patch >= 24): + release_info = { + "base_dockerfile_text": base_dockerfile_sol, + "version_placeholder": SOLANA_VERSION_PLACEHOLDER, + "url": f"https://raw.githubusercontent.com/solana-labs/solana/{version_tag}/rust-toolchain.toml" + } + #Everything after we need to get from anza + elif (major == 1 and minor == 18 and patch >= 24) or major >= 2: + release_info = { + "base_dockerfile_text": base_dockerfile_agave, + "version_placeholder": AGAVE_VERSION_PLACEHOLDER, + "url": f"https://raw.githubusercontent.com/anza-xyz/agave/{version_tag}/rust-toolchain.toml" + } + else: + print(f"Skipping {version_tag} as it does not meet Solana or Agave criteria.") + return None + return release_info + +# Function to get Solana releases +def get_solana_releases(): + output = subprocess.check_output( + ["git", "ls-remote", "--tags", "https://github.com/solana-labs/solana"] + ) + tags = [ + elem.split("\t")[1].split("/")[-1] + for elem in output.decode("utf-8").split("\n") + if elem + ] + return tags + +# Function to get Agave releases +def get_agave_releases(): + output = subprocess.check_output( + ["git", "ls-remote", "--tags", "https://github.com/anza-xyz/agave"] + ) + tags = [ + elem.split("\t")[1].split("/")[-1] + for elem in output.decode("utf-8").split("\n") + if elem + ] + return tags + +# Function to get Rust toolchain for each release +def get_toolchain(version_tag): + if "v1.14" in version_tag: + return "1.68.0" + + release_info = get_release_info(version_tag) + if release_info is None: + return None + + url = release_info["url"] + response = requests.get(url, headers={"Accept": "application/vnd.github.v3.raw"}) + if response.status_code == 200: + parsed_data = tomllib.loads(response.text) + return parsed_data["toolchain"]["channel"] + print(f"Failed to fetch rust-toolchain.toml for {version_tag}") + # Fallback to rust-version.ci for older versions + print(f"Attempting to retrieve Rust version from rust-version.ci for {version_tag}") + return get_rust_version_from_ci(version_tag) + +def get_rust_version_from_ci(version_tag): + url = f"https://raw.githubusercontent.com/solana-labs/solana/{version_tag}/ci/rust-version.sh" + response = requests.get(url) + if response.status_code == 200: + match = re.search(r'stable_version=(\d+\.\d+\.\d+)', response.text) + if match: + return match.group(1) + else: + print(f"No stable Rust version found in {version_tag}") + else: + print(f"Failed to fetch rust-version.sh for {version_tag}") + return None + +# Process releases and generate Dockerfiles +def process_releases(releases): + for release in releases: + release_info = get_release_info(release) + if release_info is None: + continue + + base_dockerfile_text = release_info["base_dockerfile_text"] + version_placeholder = release_info["version_placeholder"] + + rust_version = get_toolchain(release) + print(f"Generating Dockerfile for {release} with Rust version {rust_version}") + + if rust_version is None: + print(f"Skipping {release} due to missing Rust version.") + continue + + if rust_version not in RUST_DOCKER_IMAGESHA_MAP and rust_version != "1.68.0": + response = requests.get( + f"https://hub.docker.com/v2/namespaces/library/repositories/rust/tags/{rust_version}" + ) + if response.status_code == 200: + for image in response.json()["images"]: + if image["architecture"] == "amd64": + RUST_DOCKER_IMAGESHA_MAP[rust_version] = image["digest"] + break + if rust_version not in RUST_DOCKER_IMAGESHA_MAP: + print(f"Failed to fetch Rust image for {rust_version}") + continue + + dockerfile = base_dockerfile_text.replace( + version_placeholder, release + ).replace( + RUST_VERSION_PLACEHOLDER, RUST_DOCKER_IMAGESHA_MAP[rust_version] + ).lstrip("\n") + + path = f"docker/{release}.Dockerfile" + if os.path.exists(path): + with open(path, "r") as f: + if f.read() != dockerfile: + dirty_set.add(release.strip("v")) + else: + dirty_set.add(release.strip("v")) + with open(path, "w") as f: + f.write(dockerfile) + dockerfiles[release] = path + +# Main execution +solana_releases = get_solana_releases() +agave_releases = get_agave_releases() + +dockerfiles = {} +dirty_set = set() + +process_releases(solana_releases) +process_releases(agave_releases) + +print(RUST_DOCKER_IMAGESHA_MAP) + + +digest_set = set() +if not args.skip_cache: + print("Fetching existing images") + response = requests.get( + "https://hub.docker.com/v2/namespaces/solanafoundation/repositories/solana-verifiable-build/tags?page_size=1000" + ) + for result in response.json()["results"]: + print(result) + if result["name"] != "latest": + try: + digest_set.add(result["name"]) + except Exception as e: + print(e) + continue + +if args.upload: + print("Uploading all Dockerfiles") + for tag, dockerfile in dockerfiles.items(): + # Strip the `v` from the tag to keep the versions consistent in Docker + stripped_tag = tag.strip("v") + + (major, minor, patch) = stripped_tag.split(".") + + print(stripped_tag, args.version) + + force_build = False + if args.version is not None: + ver = args.version.split(".") + if len(ver) == 2: + a_major, a_minor = ver + a_patch = patch + if len(ver) == 3: + a_major, a_minor, a_patch = ver + if major != a_major or minor != a_minor or a_patch != patch: + print(f"Skipping {stripped_tag}") + continue + force_build = True + + if ( + stripped_tag in digest_set + and stripped_tag not in dirty_set + and not force_build + ): + print(f"Already built image for {stripped_tag}, skipping") + continue + if stripped_tag in dirty_set: + print(f"Dockerfile for {stripped_tag} needs to be modified") + version_tag = f"solana:{stripped_tag}" + print(version_tag) + current_directory = os.getcwd() + res = subprocess.call( + f"docker build -t {version_tag} - < {current_directory}/{dockerfile}", + shell=True, + ) + if res == 0: + subprocess.call( + f"docker tag {version_tag} solanafoundation/solana-verifiable-build/{version_tag}", shell=True + ) + subprocess.call(f"docker push solanafoundation/solana-verifiable-build/{version_tag}", shell=True) + else: + continue \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..c207ada --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,9 @@ +[project] +name = "solana-verifiable-build" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.12" +dependencies = [ + "requests>=2.32.3", +] diff --git a/src/api/client.rs b/src/api/client.rs new file mode 100644 index 0000000..50224fc --- /dev/null +++ b/src/api/client.rs @@ -0,0 +1,290 @@ +use anyhow::anyhow; +use crossbeam_channel::{unbounded, Receiver}; +use indicatif::{HumanDuration, ProgressBar, ProgressStyle}; +use reqwest::{Client, Response}; +use serde_json::json; +use solana_client::rpc_client::RpcClient; +use solana_sdk::pubkey::Pubkey; +use std::sync::atomic::Ordering; +use std::thread; +use std::time::{Duration, Instant}; + +use crate::api::models::{ + ErrorResponse, JobResponse, JobStatus, JobVerificationResponse, RemoteStatusResponseWrapper, + VerifyResponse, +}; +use crate::solana_program::get_program_pda; +use crate::SIGNAL_RECEIVED; +use crate::{get_genesis_hash, MAINNET_GENESIS_HASH}; + +// URL for the remote server +pub const REMOTE_SERVER_URL: &str = "https://verify.osec.io"; + +fn loading_animation(receiver: Receiver) { + let started = Instant::now(); + let spinner_style = + ProgressStyle::with_template("[{elapsed_precise}] {prefix:.bold.dim} {spinner} {wide_msg}") + .unwrap() + .tick_chars("⠁⠂⠄⡀⢀⠠⠐⠈ "); + + let pb = ProgressBar::new_spinner(); + pb.set_style(spinner_style); + pb.enable_steady_tick(Duration::from_millis(100)); + pb.set_message("Request sent. Awaiting server response. This may take a moment... ⏳"); + + loop { + // Check if interrupt signal was received + if SIGNAL_RECEIVED.load(Ordering::Relaxed) { + pb.finish_with_message("❌ Operation interrupted by user."); + break; + } + + match receiver.try_recv() { + Ok(result) => { + if result { + pb.finish_with_message(format!( + "✅ Process completed. (Done in {})\n", + HumanDuration(started.elapsed()) + )); + } else { + pb.finish_with_message("❌ Request processing failed."); + println!("❌ Time elapsed : {}", HumanDuration(started.elapsed())); + } + break; + } + Err(_) => { + if SIGNAL_RECEIVED.load(Ordering::Relaxed) { + pb.finish_with_message("❌ Operation interrupted by user."); + break; + } + thread::sleep(Duration::from_millis(10)); + } + } + } + pb.abandon(); // Ensure the progress bar is cleaned up +} + +fn print_verification_status( + program_id: &str, + status: bool, + status_response: &JobVerificationResponse, +) { + let status_message = if status { + format!("Program {} has been verified. ✅", program_id) + } else { + format!("Program {} has not been verified. ❌", program_id) + }; + let message = if status { + "The provided GitHub build matches the on-chain hash." + } else { + "The provided GitHub build does not match the on-chain hash." + }; + println!("{}", status_message); + println!("{}", message); + println!("On Chain Hash: {}", status_response.on_chain_hash.as_str()); + println!( + "Executable Hash: {}", + status_response.executable_hash.as_str() + ); + println!("Repo URL: {}", status_response.repo_url.as_str()); +} + +pub async fn send_job_with_uploader_to_remote( + connection: &RpcClient, + program_id: &Pubkey, + uploader: &Pubkey, +) -> anyhow::Result<()> { + // Check that PDA exists before sending job + let genesis_hash = get_genesis_hash(connection)?; + if genesis_hash != MAINNET_GENESIS_HASH { + return Err(anyhow!("Remote verification only works with mainnet. Please omit the --remote flag to verify locally.")); + } + get_program_pda(connection, program_id, Some(uploader.to_string())).await?; + + let client = Client::builder() + .timeout(Duration::from_secs(18000)) + .build()?; + + // Send the POST request + let response = client + .post(format!("{}/verify-with-signer", REMOTE_SERVER_URL)) + .json(&json!({ + "program_id": program_id.to_string(), + "signer": uploader.to_string(), + "repository": "", + "commit_hash": "", + })) + .send() + .await?; + + handle_submission_response(&client, response, program_id).await +} + +pub async fn handle_submission_response( + client: &Client, + response: Response, + program_id: &Pubkey, +) -> anyhow::Result<()> { + if response.status().is_success() { + // First get the raw text to preserve it in case of parsing failure + let response_text = response.text().await?; + let status_response = + serde_json::from_str::(&response_text).map_err(|e| { + eprintln!("Failed to parse response as VerifyResponse: {}", e); + eprintln!("Raw response: {}", response_text); + anyhow!("Failed to parse server response") + })?; + let request_id = status_response.request_id; + println!("Verification request sent with request id: {}", request_id); + println!("Verification in progress... ⏳"); + + // Span new thread for polling the server for status + // Create a channel for communication between threads + let (sender, receiver) = unbounded(); + let handle = thread::spawn(move || loading_animation(receiver)); + + loop { + // Check for interrupt signal before polling + if SIGNAL_RECEIVED.load(Ordering::Relaxed) { + let _ = sender.send(false); + handle.join().unwrap(); + break; // Exit the loop and continue with normal error handling + } + + let status = check_job_status(client, &request_id).await?; + match status.status { + JobStatus::InProgress => { + if SIGNAL_RECEIVED.load(Ordering::Relaxed) { + let _ = sender.send(false); + handle.join().unwrap(); + break; + } + thread::sleep(Duration::from_secs(10)); + } + JobStatus::Completed => { + let _ = sender.send(true); + handle.join().unwrap(); + let status_response = status.respose.unwrap(); + + if status_response.executable_hash == status_response.on_chain_hash { + print_verification_status( + program_id.to_string().as_str(), + true, + &status_response, + ); + } else { + print_verification_status( + program_id.to_string().as_str(), + false, + &status_response, + ); + } + break; + } + JobStatus::Failed => { + let _ = sender.send(false); + handle.join().unwrap(); + let status_response: JobVerificationResponse = status.respose.unwrap(); + println!("Program {} has not been verified. ❌", program_id); + eprintln!("Error message: {}", status_response.message.as_str()); + println!( + "You can check the logs for more details here: {}/logs/{}", + REMOTE_SERVER_URL, request_id + ); + break; + } + JobStatus::Unknown => { + let _ = sender.send(false); + handle.join().unwrap(); + println!("Program {} has not been verified. ❌", program_id); + break; + } + } + } + let url = format!("https://verify.osec.io/status/{}", program_id); + println!("Check the verification status at: {}", url); + println!( + "Job url: {}", + &format!("{}/job/{}", REMOTE_SERVER_URL, request_id) + ); + + Ok(()) + } else if response.status() == 409 { + let response = response.json::().await?; + eprintln!("Error: {}", response.error.as_str()); + let url = format!("{}/status/{}", REMOTE_SERVER_URL, program_id); + println!("Check the status at: {}", url); + Ok(()) + } else { + eprintln!("Encountered an error while attempting to send the job to remote"); + Err(anyhow!("{:?}", response.text().await?))?; + let url = format!("{}/status/{}", REMOTE_SERVER_URL, program_id); + println!("Check the verification status at: {}", url); + Ok(()) + } +} + +async fn check_job_status(client: &Client, request_id: &str) -> anyhow::Result { + // Get /job/:id + let response = client + .get(format!("{}/job/{}", REMOTE_SERVER_URL, request_id)) + .send() + .await + .unwrap(); + + if response.status().is_success() { + // Parse the response + let response: JobVerificationResponse = response.json().await?; + match response.status { + JobStatus::InProgress => { + thread::sleep(Duration::from_secs(5)); + Ok(JobResponse { + status: JobStatus::InProgress, + respose: None, + }) + } + JobStatus::Completed => Ok(JobResponse { + status: JobStatus::Completed, + respose: Some(response), + }), + JobStatus::Failed => Ok(JobResponse { + status: JobStatus::Failed, + respose: Some(response), + }), + JobStatus::Unknown => Ok(JobResponse { + status: JobStatus::Unknown, + respose: Some(response), + }), + } + } else { + Err(anyhow!( + "Encountered an error while attempting to check job status : {:?}", + response.text().await? + ))? + } +} + +pub async fn get_remote_status(program_id: Pubkey) -> anyhow::Result<()> { + let client = Client::builder() + .timeout(Duration::from_secs(18000)) + .build()?; + + let response = client + .get(format!("{}/status-all/{}", REMOTE_SERVER_URL, program_id,)) + .send() + .await?; + + let status: RemoteStatusResponseWrapper = response.json().await?; + println!("{}", status); + Ok(()) +} + +pub async fn get_remote_job(job_id: &str) -> anyhow::Result<()> { + let client = Client::builder() + .timeout(Duration::from_secs(18000)) + .build()?; + + let job = check_job_status(&client, job_id).await?; + println!("{}", job); + Ok(()) +} diff --git a/src/api/mod.rs b/src/api/mod.rs new file mode 100644 index 0000000..b9e2267 --- /dev/null +++ b/src/api/mod.rs @@ -0,0 +1,8 @@ +mod client; +mod models; +mod solana; + +pub use client::get_remote_job; +pub use client::get_remote_status; +pub use client::send_job_with_uploader_to_remote; +pub use solana::get_last_deployed_slot; diff --git a/src/api/models.rs b/src/api/models.rs new file mode 100644 index 0000000..e3f23cf --- /dev/null +++ b/src/api/models.rs @@ -0,0 +1,123 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "lowercase")] +pub enum Status { + Success, + Error, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct VerifyResponse { + pub status: JobStatus, + pub request_id: String, + pub message: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct StatusResponse { + pub is_verified: bool, + pub message: String, + pub on_chain_hash: String, + pub executable_hash: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct ErrorResponse { + pub status: Status, + pub error: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct JobResponse { + pub status: JobStatus, + pub respose: Option, +} + +impl std::fmt::Display for JobResponse { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + if let Some(response) = &self.respose { + writeln!(f, "{}", response)?; + } else { + writeln!(f, "Status: {:?}", self.status)?; + } + Ok(()) + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub enum JobStatus { + #[serde(rename = "in_progress")] + InProgress, + #[serde(rename = "completed")] + Completed, + #[serde(rename = "failed")] + Failed, + #[serde(rename = "unknown")] + Unknown, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct JobVerificationResponse { + pub status: JobStatus, + pub message: String, + pub on_chain_hash: String, + pub executable_hash: String, + pub repo_url: String, +} + +impl std::fmt::Display for JobVerificationResponse { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + writeln!(f, "Status: {:?}", self.status)?; + writeln!(f, "Message: {}", self.message)?; + writeln!(f, "On-chain Hash: {}", self.on_chain_hash)?; + writeln!(f, "Executable Hash: {}", self.executable_hash)?; + write!(f, "Repository URL: {}", self.repo_url) + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct RemoteStatusResponse { + pub signer: String, + pub is_verified: bool, + pub on_chain_hash: String, + pub executable_hash: String, + pub repo_url: String, + pub commit: String, + pub last_verified_at: String, +} + +impl std::fmt::Display for RemoteStatusResponse { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + writeln!(f, "Verification Status for Signer: {}", self.signer)?; + writeln!( + f, + "Verified: {}", + if self.is_verified { "✅" } else { "❌" } + )?; + writeln!(f, "On-chain Hash: {}", self.on_chain_hash)?; + writeln!(f, "Executable Hash: {}", self.executable_hash)?; + writeln!(f, "Repository URL: {}", self.repo_url)?; + writeln!(f, "Commit: {}", self.commit)?; + write!(f, "Last Verified: {}", self.last_verified_at) + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct RemoteStatusResponseWrapper(Vec); + +impl std::fmt::Display for RemoteStatusResponseWrapper { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + for (i, response) in self.0.iter().enumerate() { + if i > 0 { + writeln!(f)?; + writeln!( + f, + "----------------------------------------------------------------" + )?; + } + write!(f, "{}", response)?; + } + Ok(()) + } +} diff --git a/src/api/solana.rs b/src/api/solana.rs new file mode 100644 index 0000000..1605b2f --- /dev/null +++ b/src/api/solana.rs @@ -0,0 +1,126 @@ +#![allow(dead_code)] + +use reqwest::Client; +use serde::Deserialize; +use solana_client::rpc_client::RpcClient; +use std::error::Error; + +#[derive(Deserialize)] +struct RpcResponse { + result: Option, + id: u64, +} + +#[derive(Deserialize)] +struct AccountInfoResponse { + context: Context, + value: Option, +} + +#[derive(Deserialize)] +struct Context { + slot: u64, +} + +#[derive(Deserialize)] +struct AccountValue { + data: AccountData, + executable: bool, + lamports: u64, + owner: String, + #[serde(rename = "rentEpoch")] + rent_epoch: u64, + space: u64, +} + +#[derive(Deserialize)] +struct AccountData { + parsed: ParsedData, + program: String, + space: u64, +} + +#[derive(Deserialize)] +struct ParsedData { + info: ProgramInfo, + #[serde(rename = "type")] + data_type: String, +} + +#[derive(Deserialize)] +struct ProgramInfo { + #[serde(rename = "programData")] + program_data: Option, + data: Option>, + slot: Option, +} + +async fn get_account_info( + client: &Client, + rpc_url: &str, + address: &str, +) -> anyhow::Result { + let body = serde_json::json!({ + "jsonrpc": "2.0", + "id": 1, + "method": "getAccountInfo", + "params": [ + address, + { + "encoding": "jsonParsed" + } + ] + }); + + let response = client.post(rpc_url).json(&body).send().await?; + + let response: RpcResponse = response.json().await?; + if let Some(value) = response.result { + return value + .value + .ok_or_else(|| anyhow::anyhow!("No value found in account info response")); + } + anyhow::bail!("No result found in account info response"); +} + +pub async fn get_last_deployed_slot( + connection: &RpcClient, + program_address: &str, +) -> Result> { + let client = Client::new(); + + // Step 1: Get account info for the program address + let account_info = get_account_info(&client, &connection.url(), program_address).await?; + let program_data_address = account_info + .data + .parsed + .info + .program_data + .ok_or("No programData found in program account response")?; + + // Step 2: Get account info for the program data address + let program_data_info = + get_account_info(&client, &connection.url(), &program_data_address).await?; + let last_deployed_slot = program_data_info + .data + .parsed + .info + .slot + .ok_or("No slot found in program data account response")?; + + Ok(last_deployed_slot) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[tokio::test] + async fn test_get_last_deployed_slot() { + let rpc_url = "https://docs-demo.solana-mainnet.quiknode.pro"; + let program_address = "verifycLy8mB96wd9wqq3WDXQwM4oU6r42Th37Db9fC"; + let last_deployed_slot = + get_last_deployed_slot(&RpcClient::new(rpc_url), program_address).await; + assert!(last_deployed_slot.is_ok()); + } +} diff --git a/src/image_config.rs b/src/image_config.rs new file mode 100644 index 0000000..e778fb3 --- /dev/null +++ b/src/image_config.rs @@ -0,0 +1,213 @@ +/// THIS FILE IS AUTOGENERATED. DO NOT MODIFY +use lazy_static::lazy_static; +use std::collections::BTreeMap; + +lazy_static! { + pub static ref IMAGE_MAP: BTreeMap<(u32, u32, u32), &'static str> = { + let mut m = BTreeMap::new(); + m.insert((1, 10, 1), "sha256:ee0d8b732fe559e52e2c135ed38749593d2d9d9b44aa482635a0b0f3509cebac"); + m.insert((1, 10, 2), "sha256:124c490b219834873ae7c6863f2a99caa46e2955997090945312093245409ad3"); + m.insert((1, 10, 3), "sha256:482be243c4e773d3483f34243e9baaac349580183a6bc7ab5325e36e9baaa19a"); + m.insert((1, 10, 4), "sha256:e061f807705b7fce54c04902d3897130f5778d3aa3215236ce6f7296174b5e15"); + m.insert((1, 10, 5), "sha256:3c683817ac96de5da0f7a71aa87cc047fffc48609ff91c4b998063d35244194e"); + m.insert((1, 10, 6), "sha256:e4813b08a261d7d797d6afc066c05c0d2cf728a06eaa85eb869a4674ef16131b"); + m.insert((1, 10, 7), "sha256:eaac757911fd62ba3ed7d4eda7049cad6fdc38b2f8d866632a9e1258f356e1b2"); + m.insert((1, 10, 8), "sha256:28b544c568bf110b818597683dd0200f06186b1bb128dd0114dd3e6a7834cb87"); + m.insert((1, 10, 9), "sha256:abde8ddd3e330455efb2ab77f7bdf8ceda77680522a683802b89895d4772030e"); + m.insert((1, 10, 10), "sha256:aae15690bee783d31a6b9230f9581ebc237b1e56a10ef4ab00c4b07ebed3cc02"); + m.insert((1, 10, 11), "sha256:40e9c9d3f64654921e71fd485307678ac6cb791ba5f1836d9a0a6c5d38746249"); + m.insert((1, 10, 12), "sha256:d1eb99141bc1391e87dd853a8e9188819edfde4708ab03be93ec81c649c53523"); + m.insert((1, 10, 13), "sha256:1b09317677e2fa47a6fc63ac93948b7bbbc72b2bd8592960c1e11b914808b2ec"); + m.insert((1, 10, 14), "sha256:b53f0c0683c13e67265c0b6440f36d00155d2ce97b2823d355c285b782eca64d"); + m.insert((1, 10, 15), "sha256:c5c635cfd5881087ca14471342d2d8351b40a97bff38b624ecf73da5eafb1aee"); + m.insert((1, 10, 17), "sha256:e0c5eca9f1b65424a6d14861c9b8b8296f9bb1d7f78c2720b0a840b64201cd41"); + m.insert((1, 10, 19), "sha256:ac0c1b579c4a415091de9b125e3c2c8531a5befa59c9ff8082897ba32a41e8a4"); + m.insert((1, 10, 20), "sha256:3a82a9f4e4009df7771711070c3c086bcdf1b944d9659363d3d3dfd8f5523afa"); + m.insert((1, 10, 21), "sha256:49c2789fabecd78f9dbac7998cc4362a77a6ec3ff853f49cb2a1c17e134aa601"); + m.insert((1, 10, 22), "sha256:57b9c75c7e7ac4f9dffb59b4ec19704061dc67b9b095ab792ef99c8ed43b623d"); + m.insert((1, 10, 23), "sha256:51d20066613ed7fa5f8599dc47936ca703a218eaca0489a87a8d2cc1948d7847"); + m.insert((1, 10, 24), "sha256:c2789be1e1c0933950b8219b9179ae3d4cc71963918f871362b4f841a9bcf502"); + m.insert((1, 10, 25), "sha256:d63dc331fb83e3d7a340d4151ace2e844945bcce727653e655fd70bdd0f22d00"); + m.insert((1, 10, 26), "sha256:cdd0322bf46342cbe60e44836c42b8999454ba96fb208fad2b47df6d6de2e577"); + m.insert((1, 10, 28), "sha256:2efe0e466d7131e5ef8ced064d740979f590fbbbb860aeebf74209c1e844290c"); + m.insert((1, 10, 29), "sha256:97c96db195ceceb6ccf9f454e0f0d2892ee0e534377de11331970f96603816e1"); + m.insert((1, 10, 30), "sha256:9ef9f47390cf2d27ab6bc2d1f6f3d037815a8a2203e643bfa5951759ca8826c4"); + m.insert((1, 10, 31), "sha256:6699e61b469348f50f7f120ebc2343f65f894f07a096fc8196e9ba7a5167798d"); + m.insert((1, 10, 32), "sha256:1986e0d983b33bbf3cbd998a701af8f342a332077ccccddf550f41444ce20264"); + m.insert((1, 10, 33), "sha256:ee9ad7809009a99a70f659f7cba959e0c3c124e10f771b524914fd42f2b605a8"); + m.insert((1, 10, 34), "sha256:64f54e0aa08594c489f3586fb1ca6c92d466d143d8d30f7465629bf271e463c3"); + m.insert((1, 10, 35), "sha256:081b6054898bafda97d3f4adf9f281229ec674233d6237bfacd9b519b37f68b2"); + m.insert((1, 10, 38), "sha256:353cd2088d6ba04035a50f38d47faf793a5b66aa4d816b21004fdcb477314bb2"); + m.insert((1, 10, 39), "sha256:d8b2ca56efbded387ce7f7d1627eb3b1498b20a13611efe98d07b259316f543e"); + m.insert((1, 10, 40), "sha256:cdf18019161a01c8e65defc2d26a6a3f6977e15d44b27e9d786bf28fb5d63103"); + m.insert((1, 10, 41), "sha256:e8fc71a777cd5f4d2595be541eadfd2e97a3051d45e9b58a8638936a4fd9798e"); + m.insert((1, 11, 0), "sha256:6a41d00a242588527194b6d8835d04d25f29c6e3198582ec9e9a02c17f37617a"); + m.insert((1, 11, 1), "sha256:6c8a321fed4eca9e4551abff8c6a2c6cd509e9e06b979031a562090d40c95a82"); + m.insert((1, 11, 2), "sha256:819d614a1fbb999a9b3ad2ed8b089a86829a269ef7f5af6785db290835444698"); + m.insert((1, 11, 3), "sha256:c5a3a42c428bb92dc63917e9e4c8702c32ed3fba7835daf163f608028dd07a89"); + m.insert((1, 11, 4), "sha256:e8f3df9a63da3f68ba22292df3132720e9ebbe8364947bb7b02d1ff77e190fe5"); + m.insert((1, 11, 5), "sha256:39a9284493ab77aec1376e859ff67bdd170d3f654b7781465d89ce32897cd80f"); + m.insert((1, 11, 6), "sha256:83d62c54ddca2f3d298c8a262276929edbd3ad97c633b32ec01563c3f4d3e585"); + m.insert((1, 11, 10), "sha256:4daff6e8e10465752b3fe20008748cb5e43e2ad6ab1b40ed4ee5bb760bb7399b"); + m.insert((1, 13, 1), "sha256:f091fca763f10ae73419af9fc02471a74f11f28e945f03daec4207b32dcde7d1"); + m.insert((1, 13, 2), "sha256:400df2fe763ea4ccc080b5f2cb78ff2d658558aaff30df538b80bdb0b888cadb"); + m.insert((1, 13, 3), "sha256:ad80b3873b2e53085e05b143a71040d74886e3fa3919d287ae9d35f1700ec25d"); + m.insert((1, 13, 4), "sha256:7a9494345fbaa40a2cd54ffd6ff3c44c2951afdb1d9ade348278cba801b3ca98"); + m.insert((1, 13, 5), "sha256:8677ed32441c473f342f2625807cd17801c690ddccc2c9692b571e23c2786a9b"); + m.insert((1, 13, 6), "sha256:c418a940178812491b47adac5bbb6aac59d27d61e0ab126c9a103152c49abe6b"); + m.insert((1, 13, 7), "sha256:38fa8ee04b93eee82592abde83dfa2852df60dfe85602ff946d4077bdeb88e91"); + m.insert((1, 14, 1), "sha256:255458e76a872bfe00ecbf3f5dc2b431d5ce7fe04fb663bdacfa796a9055000b"); + m.insert((1, 14, 2), "sha256:a7918b15e721330947d306000c892eb9b69960d1d3b1f354f13b9a018810c507"); + m.insert((1, 14, 3), "sha256:aead8dc4e049d2190d56968f178791b7647b7c8a5822a3a6603169604abf9217"); + m.insert((1, 14, 4), "sha256:36dd459e5e9850876ab8d50897f590c45793c468d297b24f2bb2a6806717e813"); + m.insert((1, 14, 5), "sha256:980f9c0ee379fe76ebfdaacc3e8641d67915246b479d101aeb96d75536ca6d52"); + m.insert((1, 14, 6), "sha256:886210830eb386c189276ac4ee724d2025cdc7ea9cd26399fefb5276fdcfcad3"); + m.insert((1, 14, 7), "sha256:bbe0b6c9a3032b8fe228cf9fa4ef408bce6647ed0e3dcc9f9ee86613bb7a51cf"); + m.insert((1, 14, 8), "sha256:07234d4255365240651de5d846f9df8179a9fbf9e44fbc819a935bafefd055fb"); + m.insert((1, 14, 9), "sha256:9b16f14b5d1a8004a036d1b3ac5abc0431d6f8239937d247ccb5569919d89ade"); + m.insert((1, 14, 10), "sha256:f4a7f98be3aeda2a5cae0d255ac3027e6ee4441c41499e97d970092f55b21d71"); + m.insert((1, 14, 11), "sha256:4e643332b45a34fa66576a403e79ad5de3f5f82f9b921a7ac18018ebc3f5210c"); + m.insert((1, 14, 12), "sha256:1ffe61632a84f1dc504280d1672023ebc920dc2bf2f0bcc959fe285b690664a1"); + m.insert((1, 14, 13), "sha256:c09d75641f8b418d4f0960cdde046582e4779a457627411ddf369afc2c0c75b1"); + m.insert((1, 14, 14), "sha256:7d2c2670cf799eda9eec70b4ac0e388c7336d8907b4aedbc4d6979d75d511cda"); + m.insert((1, 14, 15), "sha256:e40ab6ab90dfe1fb2542be255d3fe1cd5f5385e198488ed3ec70be6894314c67"); + m.insert((1, 14, 16), "sha256:a0a6190dea92b9ed7d7fd1005f93f91a2c95b1caacb2d846c145725ee285dfcb"); + m.insert((1, 14, 17), "sha256:6779c1f4157252a6e78fb6a1236a27b7a0130cc6760b4509a6eeeb78ecc3b684"); + m.insert((1, 14, 18), "sha256:48edaac5c2e16dbe6bf933615591736cbb346f6c2c96f7023e905145895d8c63"); + m.insert((1, 14, 19), "sha256:f58e3b01d63bbbec46b645e9615fe37b6a463074dc55414e1b36a647de6c7981"); + m.insert((1, 14, 20), "sha256:cfcb3e254a2fc373459175916e5000c368c070e09bd806ff37174ebcd0c4f1ea"); + m.insert((1, 14, 21), "sha256:f743b18f19488763f3aa257b15b6a2b60d267f23e9ea2fdd986f54fca069b8c7"); + m.insert((1, 14, 22), "sha256:149d4892484b1437e043c187afbaeeb3633b9f358cbe27ccad63e532c3c81005"); + m.insert((1, 14, 23), "sha256:afe97a24937533e50b2f83dbbded50f62e9859904cfe4cde40c29576c2c9d99d"); + m.insert((1, 14, 24), "sha256:fdcb245764f74c664120a5d1b27fa722d7c94ac309b57c667cbf7683434c83fe"); + m.insert((1, 14, 25), "sha256:a85a366bee24c3e4e20d971628954817c1387c733684a9d8b416eb65639cc5a0"); + m.insert((1, 14, 26), "sha256:ab6b092dabefd21acd666548bc75020f9fd8dad07fece7db493bb85676219e82"); + m.insert((1, 14, 27), "sha256:71138c2b2eb7e6c1a5e0527a9b8c045289d62a2437f7cae593543bb47e446d98"); + m.insert((1, 14, 28), "sha256:24989aca10abc3e5747df2b43732beae6240b3cdc156ceba44bba4051a6eca76"); + m.insert((1, 14, 29), "sha256:80792a6a0f02568f6fa402a872dd34a8fca05701d971427cdc9ccf6317a9f60b"); + m.insert((1, 16, 0), "sha256:7139aa85eaa6aa6e6dd93a342fe4c198fcc4ba835f1349d4bd43e083f1b73d4d"); + m.insert((1, 16, 1), "sha256:2e585871d4a164f0bcd0381cf169afc393f20630c7a835eee136053dd620cb0c"); + m.insert((1, 16, 2), "sha256:5575fb255576206abefae6bc48aabb83bb82044e5e493135f52a1334330af1bd"); + m.insert((1, 16, 3), "sha256:f9c4bcdc55e7aeabbd1e698de0d3e0b9623198bf14dbe5d86c0837a82e09c3e6"); + m.insert((1, 16, 4), "sha256:98119d48d756920ecc139da6117aed11af73ae33eac44331b01e2a0e4e463983"); + m.insert((1, 16, 5), "sha256:80ada1d2ad49b84ca7601a77c16944d41ec2e355906519e7c394baa38bcf600e"); + m.insert((1, 16, 6), "sha256:088aa52b13e1c7117e886d68542474e4dc58709128297b53a00095d678fd1873"); + m.insert((1, 16, 7), "sha256:699c490c03992321eed313cc1f2d9399746313653c6f0fe15ca1b769df278b29"); + m.insert((1, 16, 8), "sha256:03dd4eaca9810a7817cef9a25b0619cf451064594e2670025ffaab2c8588bb94"); + m.insert((1, 16, 9), "sha256:c9c0fe6d2bd67d23848e5f94f22611f3cd819c311b50c2559928321980d8f672"); + m.insert((1, 16, 10), "sha256:5b8ee61bf0d8e7c0390301f91f221aa0029597c671d2de90f57fceacd8ac10e0"); + m.insert((1, 16, 11), "sha256:d371bec494d2e36f4c8ca6c1cf50d46bef9d0cc813de639ee8b089ba8a603131"); + m.insert((1, 16, 12), "sha256:438191d0350d5e0c91d891928151c98e9f312f3849aee38f8cb54b2029ab1f55"); + m.insert((1, 16, 13), "sha256:7d3ec2da00a246adab933082167b99f662e5aa7dd3d098c4601332d7362ba0a9"); + m.insert((1, 16, 14), "sha256:e9cfc73adb9d966d9aed5a10a4943726f42002fe25ac9506e3c32e4580e7d743"); + m.insert((1, 16, 15), "sha256:3197ee7f185a0a16bdda88cc672f8bf8418340f505ccac5a36fee8d2b1996d5f"); + m.insert((1, 16, 16), "sha256:d078bd07af47cfafc293e871950bd8c277bbf64019bf17367da6fe8fb4c240ea"); + m.insert((1, 16, 17), "sha256:f0da7fd1857615be5c7f3a0d83e222b61ad276d6df6b24dfc9773bbf1f4e14fb"); + m.insert((1, 16, 18), "sha256:d0cec0a5ac7b4d37f2b3031cbe644bf476b82b9e2ab0a4f2c658255d08961399"); + m.insert((1, 16, 19), "sha256:77c86c896ed630e19600b811d4eef064da11d6d762f833b9d2eea957e5793a24"); + m.insert((1, 16, 20), "sha256:ee9889e6a42e45bb652db37274be002912e144f08414ea7588a2a57e483a9f54"); + m.insert((1, 16, 21), "sha256:2747a1f2a01c11031aa9c6fb099439e135d12c4dacc7280225c2471b320acad3"); + m.insert((1, 16, 22), "sha256:4d3e5ac2a4301b4472bce726c650a0b438d108a43230dd791ab0a6effa239507"); + m.insert((1, 16, 23), "sha256:b96f582a0afa718bd1bdf8d6446901fab478a40464819a394eb60e13e0774ed4"); + m.insert((1, 16, 24), "sha256:77d61aa8de7a801c12d12e96f09ad358b3e418dbb1f5db794f9b60a1ae2265f8"); + m.insert((1, 16, 25), "sha256:43206149a565ec35da95b1a909f4714f5d5f0d8241c31df24189e517acd18467"); + m.insert((1, 16, 26), "sha256:466e573b4bf3bc596f55fee0f8ab8c27d39bd05bc2c32cec4a862cd41ddc903f"); + m.insert((1, 16, 27), "sha256:1dc8431e3796a0c855d335d2e23bfb41af482d8a1cde0d14aaaf6e4f996cbb15"); + m.insert((1, 17, 0), "sha256:fb5ab0d782524434bffcb17b243697cf8745a6f028bb0be47226e915587ae106"); + m.insert((1, 17, 1), "sha256:76f899df4ee94c8ecf6e2ea01df16c9ab342a04b69ec02676b1c4ab059ab675c"); + m.insert((1, 17, 2), "sha256:88fd751abe4d423bee76462dd7c5d3458ad55a966cad7aba48c5f2f02439c316"); + m.insert((1, 17, 3), "sha256:ed08f6c0ef488239bc9a1ff8e66bd55414ff01d0d5fa4ffec803a99c5eda7d20"); + m.insert((1, 17, 4), "sha256:8b538ab5dcfb206f1e68a4d21bdee74ee38bc9bd4bd061543bbccff8cfb70382"); + m.insert((1, 17, 5), "sha256:222e3d887dcd8a34dafc1d1cae49412e03734810c70ed3e25e9f747f6f303c81"); + m.insert((1, 17, 6), "sha256:b9a7edd6108e7d74cce6c83b85c478fde3af1b658b57946fb08879891115dc84"); + m.insert((1, 17, 7), "sha256:8af92cecf06960a33e9624fa5495c753da17686813c098f8d61bc875cad0ff82"); + m.insert((1, 17, 8), "sha256:d39a047822a802fb6752e4e61cc653b778d5e9ce007055244846911cb25772af"); + m.insert((1, 17, 9), "sha256:e7af10038469c81a968b29af7b162de43bb02cdb7aa1f3b0a7baabda0694a47b"); + m.insert((1, 17, 10), "sha256:58524a0d7d76d0eeda862e687e54f40f1130656ef07112bd75b496dc577769b5"); + m.insert((1, 17, 11), "sha256:746c9d7bfb991924550928dd3843ee0cc8786095381469e0e7a942c9e320296c"); + m.insert((1, 17, 12), "sha256:78d6100202850529cde37148fc5e8c75e70ef4ef473977100748626b2c471920"); + m.insert((1, 17, 13), "sha256:8ac42479a320d0fad24f981dd7e75d5951cf2580dd4710af6d63ab9ea6dfcaa6"); + m.insert((1, 17, 14), "sha256:83f84e8eacbc684f702ef0113bc9177f5415b5aa7a69b47ecd523f3e2c893f28"); + m.insert((1, 17, 15), "sha256:4ae0df0122465ece07059abdd7ae9cc9170f42489d8cc48aee263cc520211d19"); + m.insert((1, 17, 16), "sha256:2e03e7f0b9893ba71dcf3c6b6767dc92ae5daecb0530dd93eca66029f5670838"); + m.insert((1, 17, 17), "sha256:b192f5a364fdc8edaa38cca256be2a2cc4592f297dea50500b7ec7061febcbdc"); + m.insert((1, 17, 18), "sha256:c18ef5aa62adfe17893e673b999a5d15323b93bab08553fd3f63dbac251eca62"); + m.insert((1, 17, 19), "sha256:449941d2a203a52e3d95297adf4a0dd87b995ab59dac0dc8db1296a9a44a9173"); + m.insert((1, 17, 20), "sha256:6f3f380b292bbebfeaa1b035106b70796ec54d3dc9bf8a57a0e2d6523e901339"); + m.insert((1, 17, 21), "sha256:f028c8e248b7aa0b6b1c6d1919c75b7ac12bb592badd896a83c91193a5a422b9"); + m.insert((1, 17, 22), "sha256:adf9063f6553d48236ff18f8985921583e0ff6598b2b5dfbf13b3969c5387d1d"); + m.insert((1, 17, 23), "sha256:1d56de603cbe21ff9d740518e0ae48caff03a5827e7a68ebf474a27bf20def93"); + m.insert((1, 17, 24), "sha256:6847ef73fd583b888071f0e6569ab3ab5e34a621b402b9b430b92dbb4e217d37"); + m.insert((1, 17, 25), "sha256:3b32c8394ee98507289de8a6d63e964a629a4f4f13dbc9c05354e228c415ab92"); + m.insert((1, 17, 26), "sha256:4670d3c55898929f0ca875b2df2d2e35a40f8e3dd1847d6fdab36e9e229a9d23"); + m.insert((1, 17, 27), "sha256:238a089c8077d4bbfbb8bef4516e03da47e1161518d32224b641dfd94986fe96"); + m.insert((1, 17, 28), "sha256:efb9bc4ba4a3d3b682203b3253629cfee534f69f68bbd21cc5401214ae684c2b"); + m.insert((1, 17, 29), "sha256:218c627883518399b53b4590e39b503254c07b2704a58591b074003c98f2969a"); + m.insert((1, 17, 30), "sha256:adc7009cddb0cb6cb9e6e83fd1585941af79c81b6c6240de0cbd847096dda5fb"); + m.insert((1, 17, 31), "sha256:ebdc5d33cf6a817da0de906477dafd1476a17c79e235903b635095f003bd77c1"); + m.insert((1, 17, 32), "sha256:a489ad642c4c0e2ec1b484c9456220084051bcdf1df348541c565de8d67183ec"); + m.insert((1, 17, 33), "sha256:2bf0bc950b6561bc1650ca4c39165f0e57072bf59e6e7749f1ba056945a0ff17"); + m.insert((1, 17, 34), "sha256:775b8a77f67c01203612d82b8e57b60c0ec3dc16c40bc1e9407abd7a54b835a8"); + m.insert((1, 18, 0), "sha256:11c4c1520ad008bf14df1c25e516455514fadddd22d55d56eefad9f5e6a734c1"); + m.insert((1, 18, 1), "sha256:593bf5ca482ab69ac112740799595418096176ff9a912b884e41ebf0c272e59f"); + m.insert((1, 18, 2), "sha256:dc8fd4bdc4546af0a9bb23150ce5034f2f3296c7b56a20ab60cc3d8cf45d9e9c"); + m.insert((1, 18, 3), "sha256:c5cf7ef036915214abc8798b7731ec7a79d8c3dd363feb3018bcf3aab9990a08"); + m.insert((1, 18, 4), "sha256:da103fcb44a23e326e897f30d3b5821a878e566355b0d0a8569f1704d258f213"); + m.insert((1, 18, 5), "sha256:535605c3eb3adfc8df92bf19bf15578dcd93fd4e65784add7e5f7f674779ad39"); + m.insert((1, 18, 6), "sha256:e55c77666145564fbd2913f4949b58da32ce7fc89e52394cac9726a6c3c7694b"); + m.insert((1, 18, 7), "sha256:f276fee74cd617a776241afc7a69f5cadff5a9ee75d2c5ed51be4b0d5e0a3678"); + m.insert((1, 18, 8), "sha256:5d3936df3889481c935c83c908ae7c40d52f800c51a4724d30a7f187a379e21a"); + m.insert((1, 18, 9), "sha256:1491674874420a4763c8b72e65da4035166a2730ba694fdf5225d9dbdc5d742d"); + m.insert((1, 18, 10), "sha256:e11f047643ef67b54d0fd55e12802399919609f8d5f9592ace498c43f850a879"); + m.insert((1, 18, 11), "sha256:1443b6dc7cd8880da6ed31a6de5eb4ab71acbb0f5152650e423a38524aed7efb"); + m.insert((1, 18, 12), "sha256:93f7877b5f6a5c8b38cef65c0c485f78ec8c416f510c0434f893127170535040"); + m.insert((1, 18, 13), "sha256:b71cfa1856f2e51a66a677d3b70b6417caf199bae50992bd966c3840abf1203c"); + m.insert((1, 18, 14), "sha256:7158a643ef938a1ccba55e6e3d314f0f892529093eb9a17091c7393dbdaa34ac"); + m.insert((1, 18, 15), "sha256:f3682ce269baccc41505585cb5b78444e330cbbb2b2d1c79312917c292c30638"); + m.insert((1, 18, 16), "sha256:1388b6e423013b0a4a1b67b3481b1c35f5a13034af97d9059439d923c19f1c87"); + m.insert((1, 18, 17), "sha256:78df045659a84dfb1ba481ef69e6d89b0573a2d43c15cde5f371e320450cf334"); + m.insert((1, 18, 18), "sha256:89cfdc265e1f0cb474dd18b728417830921dc11ba9138ebb26fe02ae6d53c06d"); + m.insert((1, 18, 19), "sha256:25e4973b5ccb7d8eca1cc1e90fe07edb7a799075c78ac5a91cc4ff95fb4f3ec3"); + m.insert((1, 18, 20), "sha256:c0f0d46ad6027a3e834e7d1026a8e2750613d2eac77688910596f15baf250309"); + m.insert((1, 18, 21), "sha256:d72ae60cb3890bcf444ab9f626e6db380235a2c0ef1e8aee1bc530fe3633c4be"); + m.insert((1, 18, 22), "sha256:7804e1076ef24d4840f4fec24c88b5be8008e947cad2705516666a9f24b39de3"); + m.insert((1, 18, 23), "sha256:4e6d3e75b2dc4d37c1278b2b6869265208e775e1397d5dc4b7bd4fc2c8dbd76f"); + m.insert((1, 18, 24), "sha256:f5777341da94aa8f43aa2e18102a4324c5d844aa9d982db5184f537fe56d5597"); + m.insert((1, 18, 25), "sha256:21e754f431b660d884dbacd96da9bbc5d4ad484524a6c9e751b833a8c66e28c0"); + m.insert((1, 18, 26), "sha256:f3d3a4adaa8008644fc4535373c6818275c7e35a0b07660890b4a95ef434221e"); + m.insert((2, 0, 0), "sha256:3be902b4886bbdb78152251df2134a598c862074cdaa8e125e457401f4789f22"); + m.insert((2, 0, 1), "sha256:934f326cad20acb5605bbcd091011bad9e2b8750ec93eb6b9bdfbb584494430d"); + m.insert((2, 0, 2), "sha256:8863bf1687d94dfdbb7627ad561d63b2d6326faec252d9f86a9f65aafd8f9dde"); + m.insert((2, 0, 3), "sha256:e7dd0e6ddb467633bec229ebc76751c42b7f96fd94b756c8e8213acee41baa0f"); + m.insert((2, 0, 4), "sha256:17176f8ee4f6aac1c7d8c5325ef38cf98552e02c9a9f2ce8f01068af30216525"); + m.insert((2, 0, 5), "sha256:110a530982848de9a6fad0e66cd963284a0ab4bae92577291a434467e39641f5"); + m.insert((2, 0, 6), "sha256:e9bb0fe9ba54d87d3a52c5cf76e22dbee7bc8d47a2891d3fdc341177c8dbf0e5"); + m.insert((2, 0, 7), "sha256:9b9958c335fd9ca3c5bd8ef4626cea864278a66bdf62f869265d6d16d1c68840"); + m.insert((2, 0, 8), "sha256:275a3af4f5251cee064f80fa895cacc5bdabdaaa88cc912c51a5705f0c3fff6f"); + m.insert((2, 0, 9), "sha256:9fb669de80f65605b090b2aed2a14072799d754c12d3252cf993332d0868571d"); + m.insert((2, 0, 10), "sha256:bd0dabde1ebc4efbf593a07952df8511aa4a7680f07986409a57c7aad9f27400"); + m.insert((2, 0, 11), "sha256:f737382419ad2fe2fba8ca20f93ee00086ed5694f056be79f676d44f2358f51c"); + m.insert((2, 0, 12), "sha256:7b3ba5526fcf830537447e9e7f62f90a213eed552b89fd08b409b593cf984934"); + m.insert((2, 0, 13), "sha256:b59946326904ffdfc4ec711b74e0ca2132ba69bf56c2fdbb5a795af65695f280"); + m.insert((2, 0, 14), "sha256:50852861690e5cc97976f855dcca9094e127ae7850cc6cf35c0450c839f0b1df"); + m.insert((2, 0, 15), "sha256:37074d98411cbf37d1f0c7078878814cbc88bed0e7ad73cce78fff5326c94fbd"); + m.insert((2, 0, 16), "sha256:efa2a7c93579ab00da292e599b0169d01ffca7fe1a74594d522d3a651ae70eb0"); + m.insert((2, 0, 17), "sha256:e02cfef2deb5376b354af9149310ffeb5ec60d1ca46b3b22e57af439d28c47c6"); + m.insert((2, 0, 18), "sha256:1d11389dd5720d05b308501a81c2decad083440b3ea7511aaca19035379db425"); + m.insert((2, 0, 19), "sha256:690df5cb60f3a00ab64db63c0df78efedbc83b8c9ff0794cea30bec1444ea9db"); + m.insert((2, 0, 20), "sha256:2ab8a9c4a7d208ed97eaa65110ad3002b9731f370bdfa0f11fe67c3bf9ec043d"); + m.insert((2, 0, 21), "sha256:caf0ce6fb8b48aec0e1750246360ddbe53adddab2a9f39c6a248d584ee3c1c89"); + m.insert((2, 0, 22), "sha256:c205fd8d6cf88e2d226a1f2b66b7a03285fde519cd26ad3d2156a5de8cf577b5"); + m.insert((2, 1, 0), "sha256:d08b07367937bcf7ed6eb9c6ad5741cbb309c96246a554a4f266e386724953f5"); + m.insert((2, 1, 1), "sha256:fc6edcdf3db4ab6a58fb67698b59ff9ba49023ae5f01c3761c991dc9e0dab8d7"); + m.insert((2, 1, 2), "sha256:49f2269b6dfe51fca6761613dbcedc47d76ce6d1795c7e85e6a4aa8a093801b5"); + m.insert((2, 1, 3), "sha256:87b8ed00dc4480e9233b2ec8cdff4f906eee5198d984ac6453aa14034da782b2"); + m.insert((2, 1, 4), "sha256:6597378c87a9a9e59d5a9b75d68d1097e74afcd11bde4b5079f06f94372aae80"); + m.insert((2, 1, 5), "sha256:f386972c8af6a19d7fd35e7cc90d36cf5c4fdb5ad9989eb6a47297aec1afa110"); + m.insert((2, 1, 6), "sha256:51b00aaf9fcd5eefc2da83b9dd416a4ea69c092424a29051681cbfda209ad78e"); + m.insert((2, 1, 7), "sha256:2d5facb2a697b57ef01b86605a94991ecd2fd81728a40a127176fa6dd3fe1d19"); + m.insert((2, 1, 8), "sha256:84a2f138142d2279ff058dffa3886fcbf6ca811431ad4806065cba56ec5ae9cb"); + m.insert((2, 1, 9), "sha256:a00890657d7f6c84d6511b202bbe38f44f6de358b80a65317410747e1ff79ed6"); + m + }; +} diff --git a/src/main.rs b/src/main.rs index 7615f82..8516800 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,180 +1,1027 @@ -use std::io::Read; - -use clap::{Parser, Subcommand}; -use cmd_lib::{init_builtin_logger, run_cmd, run_fun}; -use sha1::{Digest, Sha1}; +use anyhow::anyhow; +use api::{ + get_last_deployed_slot, get_remote_job, get_remote_status, send_job_with_uploader_to_remote, +}; +use base64::{prelude::BASE64_STANDARD, Engine}; +use bincode::serialize; +use cargo_lock::Lockfile; +use cargo_toml::Manifest; +use clap::{App, AppSettings, Arg, ArgMatches, SubCommand}; +use signal_hook::{ + consts::{SIGINT, SIGTERM}, + iterator::Signals, +}; +use solana_cli_config::{Config, CONFIG_FILE}; use solana_client::rpc_client::RpcClient; +use solana_program::get_address_from_keypair_or_config; use solana_sdk::{ bpf_loader_upgradeable::{self, UpgradeableLoaderState}, pubkey::Pubkey, }; - -#[derive(Parser, Debug)] -#[clap(author = "Ellipsis", version, about)] -struct Arguments { - #[clap(subcommand)] - subcommand: SubCommand, -} - -#[derive(Subcommand, Debug)] -enum SubCommand { - /// Deterministically build the program in an Docker container - Build { - /// Path to mount to the docker image - filepath: Option, - #[clap(short, long)] - base_image: Option, - }, - /// Verifies a cached build from a docker image - VerifyFromImage { - #[clap(short, long)] - executable_path_in_image: String, - #[clap(short, long)] - image: String, - #[clap(short, long, default_value = "https://api.mainnet-beta.solana.com")] - url: String, - #[clap(short, long)] - program_id: Pubkey, - }, - /// Get the hash of a program binary from an executable file - GetExecutableHash { - /// Path to the executable - filepath: String, - }, - /// Get the hash of a program binary from the deployed on-chain program - GetProgramHash { - #[clap(short, long, default_value = "https://api.mainnet-beta.solana.com")] - url: String, - /// Program ID - program_id: Pubkey, - }, - /// Get the hash of a program binary from the deployed buffer address - GetBufferHash { - #[clap(short, long, default_value = "https://api.mainnet-beta.solana.com")] - url: String, - /// Address of the buffer account containing the deployed program data - buffer_address: Pubkey, +use solana_transaction_status::UiTransactionEncoding; +use std::{ + io::Read, + path::PathBuf, + process::{Command, Stdio}, + sync::{ + atomic::{AtomicBool, Ordering}, + Arc, }, +}; +use uuid::Uuid; +pub mod api; +#[rustfmt::skip] +pub mod image_config; +pub mod solana_program; +use image_config::IMAGE_MAP; + +#[cfg(test)] +mod test; + +use crate::solana_program::{ + compose_transaction, find_build_params_pda, get_all_pdas_available, get_program_pda, + process_close, resolve_rpc_url, upload_program_verification_data, InputParams, + OtterBuildParams, OtterVerifyInstructions, +}; + +const MAINNET_GENESIS_HASH: &str = "5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d"; + +pub fn get_network(network_str: &str) -> &str { + match network_str { + "devnet" | "dev" | "d" => "https://api.devnet.solana.com", + "mainnet" | "main" | "m" | "mainnet-beta" => "https://api.mainnet-beta.solana.com", + "localnet" | "localhost" | "l" | "local" => "http://localhost:8899", + _ => network_str, + } } -fn main() -> anyhow::Result<()> { - let args = Arguments::parse(); - match args.subcommand { - SubCommand::Build { - filepath, - base_image, - } => build(filepath, base_image), - SubCommand::VerifyFromImage { - executable_path_in_image: executable_path, - image, - url: network, - program_id, - } => verify_from_image(executable_path, image, network, program_id), - SubCommand::GetExecutableHash { filepath } => { - let mut f = std::fs::File::open(&filepath)?; - let metadata = std::fs::metadata(&filepath)?; - let mut buffer = vec![0; metadata.len() as usize]; - f.read(&mut buffer)?; - let program_hash = get_binary_hash(buffer); +// At the top level, make the signal handler accessible throughout the program +lazy_static::lazy_static! { + static ref SIGNAL_RECEIVED: Arc = Arc::new(AtomicBool::new(false)); +} + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + // Handle SIGTERM and SIGINT gracefully by stopping the docker container + let mut signals = Signals::new([SIGTERM, SIGINT])?; + let mut container_id: Option = None; + let mut temp_dir: Option = None; + + let handle = signals.handle(); + std::thread::spawn(move || { + if signals.forever().next().is_some() { + SIGNAL_RECEIVED.store(true, Ordering::Relaxed); + } + }); + + // Add a function to check if we should abort + let check_signal = |container_id: &mut Option, temp_dir: &mut Option| { + if SIGNAL_RECEIVED.load(Ordering::Relaxed) { + println!("\nReceived interrupt signal, cleaning up..."); + + if let Some(container_id) = container_id.take() { + if std::process::Command::new("docker") + .args(["kill", &container_id]) + .output() + .is_err() + { + println!("Failed to close docker container"); + } else { + println!("Stopped container {}", container_id) + } + } + + if let Some(temp_dir) = temp_dir.take() { + if std::process::Command::new("rm") + .args(["-rf", &temp_dir]) + .output() + .is_err() + { + println!("Failed to remove temporary directory"); + } else { + println!("Removed temporary directory {}", temp_dir); + } + } + + std::process::exit(130); + } + }; + + let matches = App::new("solana-verify") + .author("Ellipsis Labs ") + .version(env!("CARGO_PKG_VERSION")) + .about("A CLI tool for building verifiable Solana programs") + .setting(AppSettings::SubcommandRequiredElseHelp) + .arg(Arg::with_name("url") + .short("u") + .long("url") + .global(true) + .takes_value(true) + .help("Optionally include your RPC endpoint. Defaults to Solana CLI config file")) + .arg(Arg::with_name("compute-unit-price") + .long("compute-unit-price") + .global(true) + .takes_value(true) + .default_value("100000") + .help("Priority fee in micro-lamports per compute unit")) + .subcommand(SubCommand::with_name("build") + .about("Deterministically build the program in a Docker container") + .arg(Arg::with_name("mount-directory") + .help("Path to mount to the docker image") + .takes_value(true)) + .arg(Arg::with_name("library-name") + .long("library-name") + .takes_value(true) + .help("Which binary file to build")) + .arg(Arg::with_name("base-image") + .short("b") + .long("base-image") + .takes_value(true) + .help("Optionally specify a custom base docker image to use for building")) + .arg(Arg::with_name("bpf") + .long("bpf") + .help("If the program requires cargo build-bpf (instead of cargo build-sbf), set this flag")) + .arg(Arg::with_name("cargo-args") + .multiple(true) + .last(true) + .help("Arguments to pass to the underlying `cargo build-sbf` command"))) + .subcommand(SubCommand::with_name("verify-from-image") + .about("Verifies a cached build from a docker image") + .arg(Arg::with_name("executable-path-in-image") + .short("e") + .long("executable-path-in-image") + .takes_value(true) + .required(true) + .help("Path to the executable solana program within the source code repository in the docker image")) + .arg(Arg::with_name("image") + .short("i") + .long("image") + .takes_value(true) + .required(true) + .help("Image that contains the source code to be verified")) + .arg(Arg::with_name("program-id") + .short("p") + .long("program-id") + .takes_value(true) + .required(true) + .help("The Program ID of the program to verify")) + .arg(Arg::with_name("current-dir") + .long("current-dir") + .help("Verify in current directory"))) + .subcommand(SubCommand::with_name("get-executable-hash") + .about("Get the hash of a program binary from an executable file") + .arg(Arg::with_name("filepath") + .required(true) + .help("Path to the executable solana program"))) + .subcommand(SubCommand::with_name("get-program-hash") + .about("Get the hash of a program binary from the deployed on-chain program") + .arg(Arg::with_name("program-id") + .required(true) + .help("The Program ID of the program to verify"))) + .subcommand(SubCommand::with_name("get-buffer-hash") + .about("Get the hash of a program binary from the deployed buffer address") + .arg(Arg::with_name("buffer-address") + .required(true) + .help("Address of the buffer account containing the deployed program data"))) + .subcommand(SubCommand::with_name("verify-from-repo") + .about("Builds and verifies a program from a given repository URL and a program ID") + .arg(Arg::with_name("remote") + .long("remote") + .help("Send the verify command to a remote machine") + .default_value("false") + .takes_value(false)) + .arg(Arg::with_name("mount-path") + .long("mount-path") + .takes_value(true) + .default_value("") + .help("Relative path to the root directory or the source code repository from which to build the program")) + .arg(Arg::with_name("repo-url") + .required(true) + .help("The HTTPS URL of the repo to clone")) + .arg(Arg::with_name("commit-hash") + .long("commit-hash") + .takes_value(true) + .help("Commit hash to checkout. Required to know the correct program snapshot. Will fallback to HEAD if not provided")) + .arg(Arg::with_name("program-id") + .long("program-id") + .required(true) + .takes_value(true) + .help("The Program ID of the program to verify")) + .arg(Arg::with_name("base-image") + .short("b") + .long("base-image") + .takes_value(true) + .help("Optionally specify a custom base docker image to use for building")) + .arg(Arg::with_name("library-name") + .long("library-name") + .takes_value(true) + .help("Specify the name of the library to build and verify")) + .arg(Arg::with_name("bpf") + .long("bpf") + .help("If the program requires cargo build-bpf (instead of cargo build-sbf), set this flag")) + .arg(Arg::with_name("current-dir") + .long("current-dir") + .help("Verify in current directory")) + .arg(Arg::with_name("skip-prompt") + .short("y") + .long("skip-prompt") + .help("Skip the prompt to write verify data on chain without user confirmation")) + .arg(Arg::with_name("keypair") + .short("k") + .long("keypair") + .takes_value(true) + .help("Optionally specify a keypair to use for uploading the program verification args")) + .arg(Arg::with_name("cargo-args") + .multiple(true) + .last(true) + .help("Arguments to pass to the underlying `cargo build-sbf` command")) + .arg(Arg::with_name("skip-build") + .long("skip-build") + .help("Skip building and verification, only upload the PDA") + .takes_value(false))) + .subcommand(SubCommand::with_name("export-pda-tx") + .about("Export the transaction as base58 for use with Squads") + .arg(Arg::with_name("uploader") + .long("uploader") + .takes_value(true) + .required(true) + .help("Specifies an address to use for uploading the program verification args (should be the program authority)")) + .arg(Arg::with_name("encoding") + .long("encoding") + .takes_value(true) + .default_value("base58") + .possible_values(&["base58", "base64"]) + .help("The encoding to use for the transaction")) + .arg(Arg::with_name("mount-path") + .long("mount-path") + .takes_value(true) + .default_value("") + .help("Relative path to the root directory or the source code repository from which to build the program")) + .arg(Arg::with_name("repo-url") + .required(true) + .help("The HTTPS URL of the repo to clone")) + .arg(Arg::with_name("commit-hash") + .long("commit-hash") + .takes_value(true) + .help("Commit hash to checkout. Required to know the correct program snapshot. Will fallback to HEAD if not provided")) + .arg(Arg::with_name("program-id") + .long("program-id") + .required(true) + .takes_value(true) + .help("The Program ID of the program to verify")) + .arg(Arg::with_name("base-image") + .short("b") + .long("base-image") + .takes_value(true) + .help("Optionally specify a custom base docker image to use for building")) + .arg(Arg::with_name("library-name") + .long("library-name") + .takes_value(true) + .help("Specify the name of the library to build and verify")) + .arg(Arg::with_name("bpf") + .long("bpf") + .help("If the program requires cargo build-bpf (instead of cargo build-sbf), set this flag")) + .arg(Arg::with_name("cargo-args") + .multiple(true) + .last(true) + .help("Arguments to pass to the underlying `cargo build-sbf` command"))) + .subcommand(SubCommand::with_name("close") + .about("Close the otter-verify PDA account associated with the given program ID") + .arg(Arg::with_name("program-id") + .long("program-id") + .required(true) + .takes_value(true) + .help("The address of the program to close the PDA"))) + .arg(Arg::with_name("export") + .long("export") + .required(false) + .help("Print the transaction as base58 for use with Squads")) + .subcommand(SubCommand::with_name("list-program-pdas") + .about("List all the PDA information associated with a program ID. Requires custom RPC endpoint") + .arg(Arg::with_name("program-id") + .long("program-id") + .required(true) + .takes_value(true))) + .subcommand(SubCommand::with_name("get-program-pda") + .about("Get uploaded PDA information for a given program ID and signer") + .arg(Arg::with_name("program-id") + .long("program-id") + .required(true) + .takes_value(true) + ) + .arg(Arg::with_name("signer") + .short("s") + .long("signer") + .required(false) + .takes_value(true) + .help("Signer to get the PDA for") + ) + ) + .subcommand(SubCommand::with_name("remote") + .about("Send a command to a remote machine") + .setting(AppSettings::SubcommandRequiredElseHelp) + .subcommand(SubCommand::with_name("get-status") + .about("Get the verification status of a program") + .arg(Arg::with_name("program-id") + .long("program-id") + .required(true) + .takes_value(true) + .help("The program address to fetch verification status for"))) + + .subcommand(SubCommand::with_name("get-job") + .about("Get the status of a verification job") + .arg(Arg::with_name("job-id") + .long("job-id") + .required(true) + .takes_value(true))) + .subcommand(SubCommand::with_name("submit-job") + .about("Submit a verification job with with on-chain information") + .arg(Arg::with_name("program-id") + .long("program-id") + .required(true) + .takes_value(true)) + .arg(Arg::with_name("uploader") + .long("uploader") + .required(true) + .takes_value(true) + .help("This is the address that uploaded verified build information for the program-id"))) + ) + .get_matches(); + + let connection = resolve_rpc_url(matches.value_of("url").map(|s| s.to_string()))?; + let res = match matches.subcommand() { + ("build", Some(sub_m)) => { + let mount_directory = sub_m.value_of("mount-directory").map(|s| s.to_string()); + let library_name = sub_m.value_of("library-name").map(|s| s.to_string()); + let base_image = sub_m.value_of("base-image").map(|s| s.to_string()); + let bpf_flag = sub_m.is_present("bpf"); + let cargo_args = sub_m + .values_of("cargo-args") + .unwrap_or_default() + .map(|s| s.to_string()) + .collect(); + build( + mount_directory, + library_name, + base_image, + bpf_flag, + cargo_args, + &mut container_id, + ) + } + ("verify-from-image", Some(sub_m)) => { + let executable_path = sub_m.value_of("executable-path-in-image").unwrap(); + let image = sub_m.value_of("image").unwrap(); + let program_id = sub_m.value_of("program-id").unwrap(); + let current_dir = sub_m.is_present("current-dir"); + verify_from_image( + executable_path.to_string(), + image.to_string(), + matches.value_of("url").map(|s| s.to_string()), + Pubkey::try_from(program_id)?, + current_dir, + &mut temp_dir, + &mut container_id, + ) + } + ("get-executable-hash", Some(sub_m)) => { + let filepath = sub_m.value_of("filepath").map(|s| s.to_string()).unwrap(); + let program_hash = get_file_hash(&filepath)?; println!("{}", program_hash); Ok(()) } - SubCommand::GetBufferHash { - url, - buffer_address, - } => { - let client = RpcClient::new(url); - let offset = UpgradeableLoaderState::size_of_buffer_metadata(); - let account_data = client.get_account_data(&buffer_address)?[offset..].to_vec(); - let program_hash = get_binary_hash(account_data); - println!("{}", program_hash); + ("get-buffer-hash", Some(sub_m)) => { + let buffer_address = sub_m.value_of("buffer-address").unwrap(); + let buffer_hash = get_buffer_hash( + matches.value_of("url").map(|s| s.to_string()), + Pubkey::try_from(buffer_address)?, + )?; + println!("{}", buffer_hash); Ok(()) } - SubCommand::GetProgramHash { url, program_id } => { - let client = RpcClient::new(url); - let program_buffer = - Pubkey::find_program_address(&[program_id.as_ref()], &bpf_loader_upgradeable::id()) - .0; - let offset = UpgradeableLoaderState::size_of_programdata_metadata(); - let account_data = client.get_account_data(&program_buffer)?[offset..].to_vec(); - let program_hash = get_binary_hash(account_data); + ("get-program-hash", Some(sub_m)) => { + let program_id = sub_m.value_of("program-id").unwrap(); + let program_hash = get_program_hash(&connection, Pubkey::try_from(program_id)?)?; println!("{}", program_hash); Ok(()) } + ("verify-from-repo", Some(sub_m)) => { + let skip_build = sub_m.is_present("skip-build"); + let remote = sub_m.is_present("remote"); + let mount_path = sub_m.value_of("mount-path").map(|s| s.to_string()).unwrap(); + let repo_url = sub_m.value_of("repo-url").map(|s| s.to_string()).unwrap(); + let program_id = sub_m.value_of("program-id").unwrap(); + let base_image = sub_m.value_of("base-image").map(|s| s.to_string()); + let library_name = sub_m.value_of("library-name").map(|s| s.to_string()); + let bpf_flag = sub_m.is_present("bpf"); + let current_dir = sub_m.is_present("current-dir"); + let skip_prompt = sub_m.is_present("skip-prompt"); + let path_to_keypair = sub_m.value_of("keypair").map(|s| s.to_string()); + let compute_unit_price = matches + .value_of("compute-unit-price") + .unwrap() + .parse::() + .unwrap_or(100000); + let cargo_args: Vec = sub_m + .values_of("cargo-args") + .unwrap_or_default() + .map(|s| s.to_string()) + .collect(); + + let commit_hash = get_commit_hash(sub_m, &repo_url)?; + + println!("Skipping prompt: {}", skip_prompt); + verify_from_repo( + remote, + mount_path, + &connection, + repo_url, + Some(commit_hash), + Pubkey::try_from(program_id)?, + base_image, + library_name, + bpf_flag, + cargo_args, + current_dir, + skip_prompt, + path_to_keypair, + compute_unit_price, + skip_build, + &mut container_id, + &mut temp_dir, + &check_signal, + ) + .await + } + ("close", Some(sub_m)) => { + let program_id = sub_m.value_of("program-id").unwrap(); + let compute_unit_price = matches + .value_of("compute-unit-price") + .unwrap() + .parse::() + .unwrap_or(100000); + process_close( + Pubkey::try_from(program_id)?, + &connection, + compute_unit_price, + ) + .await + } + ("export-pda-tx", Some(sub_m)) => { + let uploader = sub_m.value_of("uploader").unwrap(); + let mount_path = sub_m.value_of("mount-path").map(|s| s.to_string()).unwrap(); + let repo_url = sub_m.value_of("repo-url").map(|s| s.to_string()).unwrap(); + let program_id = sub_m.value_of("program-id").unwrap(); + let base_image = sub_m.value_of("base-image").map(|s| s.to_string()); + let library_name = sub_m.value_of("library-name").map(|s| s.to_string()); + let bpf_flag = sub_m.is_present("bpf"); + let encoding = sub_m.value_of("encoding").unwrap(); + + let encoding: UiTransactionEncoding = match encoding { + "base58" => UiTransactionEncoding::Base58, + "base64" => UiTransactionEncoding::Base64, + _ => { + return Err(anyhow!("Unsupported encoding: {}", encoding)); + } + }; + + let compute_unit_price = matches + .value_of("compute-unit-price") + .unwrap() + .parse::() + .unwrap_or(100000); + + let commit_hash = get_commit_hash(sub_m, &repo_url)?; + let cargo_args: Vec = sub_m + .values_of("cargo-args") + .unwrap_or_default() + .map(|s| s.to_string()) + .collect(); + + let connection = resolve_rpc_url(matches.value_of("url").map(|s| s.to_string()))?; + println!("Using connection url: {}", connection.url()); + + export_pda_tx( + &connection, + Pubkey::try_from(program_id)?, + Pubkey::try_from(uploader)?, + repo_url, + commit_hash, + mount_path, + library_name, + base_image, + bpf_flag, + &mut temp_dir, + encoding, + cargo_args, + compute_unit_price, + ) + .await + } + ("list-program-pdas", Some(sub_m)) => { + let program_id = sub_m.value_of("program-id").unwrap(); + list_program_pdas(Pubkey::try_from(program_id)?, &connection).await + } + ("get-program-pda", Some(sub_m)) => { + let program_id = sub_m.value_of("program-id").unwrap(); + let signer = sub_m.value_of("signer").map(|s| s.to_string()); + print_program_pda(Pubkey::try_from(program_id)?, signer, &connection).await + } + ("remote", Some(sub_m)) => match sub_m.subcommand() { + ("get-status", Some(sub_m)) => { + let program_id = sub_m.value_of("program-id").unwrap(); + get_remote_status(Pubkey::try_from(program_id)?).await + } + ("get-job", Some(sub_m)) => { + let job_id = sub_m.value_of("job-id").unwrap(); + get_remote_job(job_id).await + } + ("submit-job", Some(sub_m)) => { + let program_id = sub_m.value_of("program-id").unwrap(); + let uploader = sub_m.value_of("uploader").unwrap(); + + send_job_with_uploader_to_remote( + &connection, + &Pubkey::try_from(program_id)?, + &Pubkey::try_from(uploader)?, + ) + .await + } + _ => unreachable!(), + }, + // Handle other subcommands in a similar manner, for now let's panic + _ => panic!( + "Unknown subcommand: {:?}\nUse '--help' to see available commands", + matches.subcommand().0 + ), + }; + + handle.close(); + res +} + +pub fn get_client(url: Option) -> RpcClient { + let config = match CONFIG_FILE.as_ref() { + Some(config_file) => Config::load(config_file).unwrap_or_else(|_| { + println!("Failed to load config file: {}", config_file); + Config::default() + }), + None => Config::default(), + }; + let url = &get_network(&url.unwrap_or(config.json_rpc_url)).to_string(); + RpcClient::new(url) +} + +fn get_commit_hash_from_remote(repo_url: &str) -> anyhow::Result { + // Fetch the symbolic reference of the default branch + let output = Command::new("git") + .arg("ls-remote") + .arg("--symref") + .arg(repo_url) + .output() + .map_err(|e| anyhow::anyhow!("Failed to run git ls-remote: {}", e))?; + + if !output.status.success() { + return Err(anyhow::anyhow!( + "Failed to fetch default branch information: {}", + String::from_utf8_lossy(&output.stderr) + )); + } + + // Find out if the branch is called master or main + let output_str = String::from_utf8(output.stdout)?; + let default_branch = output_str + .lines() + .find_map(|line| { + if line.starts_with("ref: refs/heads/") { + Some( + line.trim_start_matches("ref: refs/heads/") + .split_whitespace() + .next()? + .to_string(), + ) + } else { + None + } + }) + .ok_or_else(|| { + anyhow::anyhow!( + "Unable to determine default branch from remote repository '{}'", + repo_url + ) + })?; + + println!("Default branch detected: {}", default_branch); + + // Fetch the latest commit hash for the default branch + let hash_output = Command::new("git") + .arg("ls-remote") + .arg(repo_url) + .arg(&default_branch) + .output() + .map_err(|e| anyhow::anyhow!("Failed to fetch commit hash for default branch: {}", e))?; + + if !hash_output.status.success() { + return Err(anyhow::anyhow!( + "Failed to fetch commit hash: {}", + String::from_utf8_lossy(&hash_output.stderr) + )); } + + // Parse and return the commit hash + String::from_utf8(hash_output.stdout)? + .split_whitespace() + .next() + .map(|s| s.to_string()) + .ok_or_else(|| anyhow::anyhow!("Failed to parse commit hash from git ls-remote output")) } -pub fn get_binary_hash(bytes: Vec) -> String { - let mut hasher = Sha1::new(); - let mut buffer = bytes +pub fn get_binary_hash(program_data: Vec) -> String { + let buffer = program_data .into_iter() .rev() .skip_while(|&x| x == 0) + .collect::>() + .into_iter() + .rev() .collect::>(); - buffer = buffer.iter().map(|x| *x).rev().collect::>(); - hasher.update(&buffer); - let program_hash = hasher.finalize(); - hex::encode(program_hash) + sha256::digest(&buffer[..]) +} + +pub fn get_file_hash(filepath: &str) -> Result { + let mut f = std::fs::File::open(filepath)?; + let metadata = std::fs::metadata(filepath)?; + let mut buffer = vec![0; metadata.len() as usize]; + f.read_exact(&mut buffer)?; + Ok(get_binary_hash(buffer)) +} + +pub fn get_buffer_hash(url: Option, buffer_address: Pubkey) -> anyhow::Result { + let client = get_client(url); + let offset = UpgradeableLoaderState::size_of_buffer_metadata(); + let account_data = client.get_account_data(&buffer_address)?[offset..].to_vec(); + let program_hash = get_binary_hash(account_data); + Ok(program_hash) } -pub fn build(filepath: Option, base_image: Option) -> anyhow::Result<()> { - let path = filepath.unwrap_or( +pub fn get_program_hash(client: &RpcClient, program_id: Pubkey) -> anyhow::Result { + // First check if the program account exists + if client.get_account(&program_id).is_err() { + return Err(anyhow!("Program {} is not deployed", program_id)); + } + + let program_buffer = + Pubkey::find_program_address(&[program_id.as_ref()], &bpf_loader_upgradeable::id()).0; + + // Then check if the program data account exists + match client.get_account_data(&program_buffer) { + Ok(data) => { + let offset = UpgradeableLoaderState::size_of_programdata_metadata(); + let account_data = data[offset..].to_vec(); + let program_hash = get_binary_hash(account_data); + Ok(program_hash) + } + Err(_) => Err(anyhow!( + "Could not find program data for {}. This could mean:\n\ + 1. The program is not deployed\n\ + 2. The program is not upgradeable\n\ + 3. The program was deployed with a different loader", + program_id + )), + } +} + +pub fn get_genesis_hash(client: &RpcClient) -> anyhow::Result { + let genesis_hash = client.get_genesis_hash()?; + Ok(genesis_hash.to_string()) +} + +pub fn get_docker_resource_limits() -> Option<(String, String)> { + let memory = std::env::var("SVB_DOCKER_MEMORY_LIMIT").ok(); + let cpus = std::env::var("SVB_DOCKER_CPU_LIMIT").ok(); + if memory.is_some() || cpus.is_some() { + println!( + "Using docker resource limits: memory: {:?}, cpus: {:?}", + memory, cpus + ); + } else { + // Print message to user that they can set these environment variables to limit docker resources + println!("No Docker resource limits are set."); + println!("You can set the SVB_DOCKER_MEMORY_LIMIT and SVB_DOCKER_CPU_LIMIT environment variables to limit Docker resources."); + println!("For example: SVB_DOCKER_MEMORY_LIMIT=2g SVB_DOCKER_CPU_LIMIT=2."); + } + memory.zip(cpus) +} + +pub fn build( + mount_directory: Option, + library_name: Option, + base_image: Option, + bpf_flag: bool, + cargo_args: Vec, + container_id_opt: &mut Option, +) -> anyhow::Result<()> { + let mut mount_path = mount_directory.unwrap_or( std::env::current_dir()? .as_os_str() .to_str() - .ok_or(anyhow::Error::msg("Invalid path string"))? + .ok_or_else(|| anyhow::Error::msg("Invalid path string"))? .to_string(), ); - println!("Mounting path: {}", path); - let image = base_image.unwrap_or("ellipsislabs/solana:latest".to_string()); - init_builtin_logger(); - let container_id = run_fun!( - docker run - --rm - -v $path:/work - -dit $image - sh -c "cargo build-sbf -- --locked --frozen" - )?; - run_cmd!(docker logs --follow $container_id)?; + mount_path = mount_path.trim_end_matches('/').to_string(); + println!("Mounting path: {}", mount_path); + + let lockfile = format!("{}/Cargo.lock", mount_path); + if !std::path::Path::new(&lockfile).exists() { + println!("Mount directory must contain a Cargo.lock file"); + return Err(anyhow!(format!("No lockfile found at {}", lockfile))); + } + + let build_command = if bpf_flag { "build-bpf" } else { "build-sbf" }; + + let (major, minor, patch) = get_pkg_version_from_cargo_lock("solana-program", &lockfile)?; + + let mut solana_version: Option = None; + let image: String = base_image.unwrap_or_else(|| { + if bpf_flag { + // Use this for backwards compatibility with anchor verified builds + solana_version = Some("v1.13.5".to_string()); + "projectserum/build@sha256:75b75eab447ebcca1f471c98583d9b5d82c4be122c470852a022afcf9c98bead".to_string() + } else if let Some(digest) = IMAGE_MAP.get(&(major, minor, patch)) { + println!("Found docker image for Solana version {}.{}.{}", major, minor, patch); + solana_version = Some(format!("v{}.{}.{}", major, minor, patch)); + format!("solanafoundation/solana-verifiable-build@{}", digest) + } else { + println!("Unable to find docker image for Solana version {}.{}.{}", major, minor, patch); + let prev = IMAGE_MAP.range(..(major, minor, patch)).next_back(); + let next = IMAGE_MAP.range((major, minor, patch)..).next(); + let (version, digest) = if let Some((version, digest)) = prev { + (version, digest) + } else if let Some((version, digest)) = next { + (version, digest) + } else { + println!("Unable to find backup docker image for Solana version {}.{}.{}", major, minor, patch); + std::process::exit(1); + }; + println!("Using backup docker image for Solana version {}.{}.{}", version.0, version.1, version.2); + solana_version = Some(format!("v{}.{}.{}", version.0, version.1, version.2)); + format!("solanafoundation/solana-verifiable-build@{}", digest) + } + }); + + let mut manifest_path = None; + + let relative_build_path = std::process::Command::new("find") + .args([&mount_path, "-name", "Cargo.toml"]) + .output() + .map_err(|e| { + anyhow::format_err!( + "Failed to find Cargo.toml files in root directory: {}", + e.to_string() + ) + }) + .and_then(|output| { + for p in String::from_utf8(output.stdout)?.split("\n") { + match get_lib_name_from_cargo_toml(p) { + Ok(name) => { + if name == library_name.clone().unwrap_or_default() { + manifest_path = Some(p.to_string().replace(&mount_path, "")); + return Ok(p + .to_string() + .replace("Cargo.toml", "") + .replace(&mount_path, "")); + } + } + Err(_) => { + continue; + } + } + } + Err(anyhow!("No Cargo.toml files found")) + }) + .unwrap_or_else(|_| "".to_string()); + + let workdir = std::process::Command::new("docker") + .args(["run", "--rm", &image, "pwd"]) + .stderr(Stdio::inherit()) + .output() + .map_err(|e| anyhow::format_err!("Failed to get workdir: {}", e.to_string())) + .and_then(|output| parse_output(output.stdout))?; + + println!("Workdir: {}", workdir); + + let build_path = format!("{}/{}", workdir, relative_build_path); + println!("Building program at {}", build_path); + + let manifest_path_filter = manifest_path + .clone() + .map(|m| vec!["--manifest-path".to_string(), format!("{}/{}", workdir, m)]) + .unwrap_or_else(Vec::new); + + if manifest_path.is_some() { + println!( + "Building manifest path: {}/{}", + workdir, + manifest_path.unwrap() + ); + } + + // change directory to program/build dir + let mount_params = format!("{}:{}", mount_path, workdir); + let container_id = { + let mut cmd = std::process::Command::new("docker"); + cmd.args(["run", "--rm", "-v", &mount_params, "-dit"]); + cmd.stderr(Stdio::inherit()); + + if let Some((memory_limit, cpu_limit)) = get_docker_resource_limits() { + cmd.arg("--memory") + .arg(memory_limit) + .arg("--cpus") + .arg(cpu_limit); + } + + let output = cmd + .args([&image, "bash"]) + .output() + .map_err(|e| anyhow!("Docker build failed: {}", e.to_string()))?; + + parse_output(output.stdout)? + }; + + // Set the container id so we can kill it later if the process is interrupted + container_id_opt.replace(container_id.clone()); + + // Solana v1.17 uses Rust 1.73, which defaults to the sparse registry, making + // this fetch unnecessary, but requires us to omit the "frozen" argument + let locked_args = if major == 1 && minor < 17 { + // First, we resolve the dependencies and cache them in the Docker container + // ARM processors running Linux have a bug where the build fails if the dependencies are not preloaded. + // Running the build without the pre-fetch will cause the container to run out of memory. + // This is a workaround for that issue. + std::process::Command::new("docker") + .args(["exec", &container_id]) + .args([ + "cargo", + "--config", + "net.git-fetch-with-cli=true", + "fetch", + "--locked", + ]) + .stderr(Stdio::inherit()) + .stdout(Stdio::inherit()) + .output()?; + println!("Finished fetching build dependencies"); + + ["--frozen", "--locked"].as_slice() + } else { + // To be totally safe, force the build to use the sparse registry + [ + "--config", + "registries.crates-io.protocol=\"sparse\"", + "--locked", + ] + .as_slice() + }; + + std::process::Command::new("docker") + .args(["exec", "-w", &build_path, &container_id]) + .args(["cargo", build_command]) + .args(["--"]) + .args(locked_args) + .args(manifest_path_filter) + .args(cargo_args) + .stderr(Stdio::inherit()) + .stdout(Stdio::inherit()) + .output()?; + + println!("Finished building program"); + println!("Program Solana version: v{}.{}.{}", major, minor, patch); + + if let Some(solana_version) = solana_version { + println!("Docker image Solana version: {}", solana_version); + } + + if let Some(program_name) = library_name { + let executable_path = std::process::Command::new("find") + .args([ + &format!("{}/target/deploy", mount_path), + "-name", + &format!("{}.so", program_name), + ]) + .output() + .map_err(|e| anyhow!("Failed to find program: {}", e.to_string())) + .and_then(|output| parse_output(output.stdout))?; + let executable_hash = get_file_hash(&executable_path)?; + println!("{}", executable_hash); + } + std::process::Command::new("docker") + .args(["kill", &container_id]) + .output()?; Ok(()) } pub fn verify_from_image( executable_path: String, image: String, - network: String, + network: Option, program_id: Pubkey, + current_dir: bool, + temp_dir: &mut Option, + container_id_opt: &mut Option, ) -> anyhow::Result<()> { println!( "Verifying image: {:?}, on network {:?} against program ID {}", image, network, program_id ); println!("Executable path in container: {:?}", executable_path); - println!(""); - let output = run_fun!( - docker run --rm - -it $image sh -c - "(wc -c $executable_path && shasum $executable_path) | tr '\n' ' '" - | tail -n 1 - | awk "{print $1, $3}" - )?; + println!(" "); + + let workdir = std::process::Command::new("docker") + .args(["run", "--rm", &image, "pwd"]) + .stderr(Stdio::inherit()) + .output() + .map_err(|e| anyhow::format_err!("Failed to get workdir: {}", e.to_string())) + .and_then(|output| parse_output(output.stdout))?; + + println!("Workdir: {}", workdir); - let tokens = output.split_whitespace().collect::>(); - let executable_size = tokens[0].parse::()?; - let executable_hash = tokens[1]; - let client = RpcClient::new(network); + let container_id = { + let mut cmd = std::process::Command::new("docker"); + cmd.args(["run", "--rm", "-dit"]); + cmd.stderr(Stdio::inherit()); + + if let Some((memory_limit, cpu_limit)) = get_docker_resource_limits() { + cmd.arg("--memory") + .arg(memory_limit) + .arg("--cpus") + .arg(cpu_limit); + } + + let output = cmd + .args([&image]) + .output() + .map_err(|e| anyhow!("Docker build failed: {}", e.to_string()))?; + parse_output(output.stdout)? + }; + + container_id_opt.replace(container_id.clone()); + + let uuid = Uuid::new_v4().to_string(); + + // Create a temporary directory to clone the repo into + let verify_dir = if current_dir { + format!( + "{}/.{}", + std::env::current_dir()? + .as_os_str() + .to_str() + .ok_or_else(|| anyhow::Error::msg("Invalid path string"))?, + uuid.clone() + ) + } else { + "/tmp".to_string() + }; + + temp_dir.replace(verify_dir.clone()); + + let program_filepath = format!("{}/program.so", verify_dir); + std::process::Command::new("docker") + .args([ + "cp", + format!("{}:{}/{}", container_id, workdir, executable_path).as_str(), + program_filepath.as_str(), + ]) + .stdout(Stdio::inherit()) + .stderr(Stdio::inherit()) + .output() + .map_err(|e| anyhow::format_err!("Failed to copy executable file {}", e.to_string()))?; + + let executable_hash: String = get_file_hash(program_filepath.as_str())?; + let client = get_client(network); let program_buffer = Pubkey::find_program_address(&[program_id.as_ref()], &bpf_loader_upgradeable::id()).0; - let offset = UpgradeableLoaderState::size_of_programdata_metadata(); - let account_data = &client.get_account_data(&program_buffer)?[offset..offset + executable_size]; - let mut hasher = Sha1::new(); - hasher.update(account_data); - let program_hash = hasher.finalize(); - println!("Executable hash (un-stripped): {}", executable_hash); - println!("Program hash (un-stripped): {}", hex::encode(program_hash)); - - if hex::encode(program_hash) != executable_hash { + let account_data = &client.get_account_data(&program_buffer)?[offset..]; + let program_hash = get_binary_hash(account_data.to_vec()); + println!("Executable hash: {}", executable_hash); + println!("Program hash: {}", program_hash); + + // Cleanup docker and rm file + std::process::Command::new("docker") + .args(["kill", container_id.as_str()]) + .stderr(Stdio::inherit()) + .output() + .map_err(|e| anyhow::format_err!("Docker kill failed: {}", e.to_string()))?; + + std::process::Command::new("rm") + .args([program_filepath]) + .stderr(Stdio::inherit()) + .output() + .map_err(|e| { + anyhow::format_err!("Failed to remove temp program file: {}", e.to_string()) + })?; + + if program_hash != executable_hash { println!("Executable hash mismatch"); return Err(anyhow::Error::msg("Executable hash mismatch")); } else { @@ -182,3 +1029,493 @@ pub fn verify_from_image( } Ok(()) } + +fn build_args( + relative_mount_path: &str, + library_name_opt: Option, + verify_tmp_root_path: &str, + base_image: Option, + bpf_flag: bool, + cargo_args: Vec, +) -> anyhow::Result<(Vec, String, String)> { + let mut args: Vec = Vec::new(); + if !relative_mount_path.is_empty() { + args.push("--mount-path".to_string()); + args.push(relative_mount_path.to_string()); + } + // Get the absolute build path to the solana program directory to build inside docker + let mount_path = PathBuf::from(verify_tmp_root_path).join(relative_mount_path); + + args.push("--library-name".to_string()); + let library_name = match library_name_opt.clone() { + Some(p) => p, + None => { + std::process::Command::new("find") + .args([mount_path.to_str().unwrap(), "-name", "Cargo.toml"]) + .output() + .map_err(|e| { + anyhow::format_err!( + "Failed to find Cargo.toml files in root directory: {}", + e.to_string() + ) + }) + .and_then(|output| { + let mut options = vec![]; + for path in String::from_utf8(output.stdout)?.split("\n") { + match get_lib_name_from_cargo_toml(path) { + Ok(name) => { + options.push(name); + } + Err(_) => { + continue; + } + } + } + if options.len() != 1 { + println!( + "Found multiple possible targets in root directory: {:?}", + options + ); + println!( + "Please explicitly specify the target with the --library-name option", + ); + Err(anyhow::format_err!( + "Failed to find unique Cargo.toml file in root directory" + )) + } else { + Ok(options[0].clone()) + } + })? + } + }; + args.push(library_name.clone()); + + if let Some(base_image) = &base_image { + args.push("--base-image".to_string()); + args.push(base_image.clone()); + } + + if bpf_flag { + args.push("--bpf".to_string()); + } + + if !cargo_args.is_empty() { + args.push("--".to_string()); + for arg in &cargo_args { + args.push(arg.clone()); + } + } + + Ok((args, mount_path.to_str().unwrap().to_string(), library_name)) +} + +fn clone_repo_and_checkout( + repo_url: &str, + current_dir: bool, + base_name: &str, + commit_hash: Option, + temp_dir_opt: &mut Option, +) -> anyhow::Result<(String, String)> { + let uuid = Uuid::new_v4().to_string(); + + // Create a temporary directory to clone the repo into + let verify_dir = if current_dir { + format!( + "{}/.{}", + std::env::current_dir()? + .as_os_str() + .to_str() + .ok_or_else(|| anyhow::Error::msg("Invalid path string"))?, + uuid.clone() + ) + } else { + format!("/tmp/solana-verify/{}", uuid) + }; + + temp_dir_opt.replace(verify_dir.clone()); + + let verify_tmp_root_path = format!("{}/{}", verify_dir, base_name); + println!("Cloning repo into: {}", verify_tmp_root_path); + + std::process::Command::new("git") + .args(["clone", repo_url, &verify_tmp_root_path]) + .stdout(Stdio::inherit()) + .output()?; + + if let Some(commit_hash) = commit_hash.as_ref() { + let result = std::process::Command::new("git") + .args(["-C", &verify_tmp_root_path]) + .args(["checkout", commit_hash]) + .output() + .map_err(|e| anyhow!("Failed to checkout commit hash: {:?}", e)); + if result.is_ok() { + println!("Checked out commit hash: {}", commit_hash); + } else { + std::process::Command::new("rm") + .args(["-rf", verify_dir.as_str()]) + .output()?; + Err(anyhow!("Encountered error in git setup: {:?}", result))?; + } + } + + Ok((verify_tmp_root_path, verify_dir)) +} + +fn get_basename(repo_url: &str) -> anyhow::Result { + let base_name = std::process::Command::new("basename") + .arg(repo_url) + .output() + .map_err(|e| anyhow!("Failed to get basename of repo_url: {:?}", e)) + .and_then(|output| parse_output(output.stdout))?; + Ok(base_name) +} + +#[allow(clippy::too_many_arguments)] +pub async fn verify_from_repo( + remote: bool, + relative_mount_path: String, + connection: &RpcClient, + repo_url: String, + commit_hash: Option, + program_id: Pubkey, + base_image: Option, + library_name_opt: Option, + bpf_flag: bool, + cargo_args: Vec, + current_dir: bool, + skip_prompt: bool, + path_to_keypair: Option, + compute_unit_price: u64, + mut skip_build: bool, + container_id_opt: &mut Option, + temp_dir_opt: &mut Option, + check_signal: &dyn Fn(&mut Option, &mut Option), +) -> anyhow::Result<()> { + // Set skip_build to true if remote is true + skip_build |= remote; + + // Get source code from repo_url + let base_name = get_basename(&repo_url)?; + + check_signal(container_id_opt, temp_dir_opt); + + let (verify_tmp_root_path, verify_dir) = clone_repo_and_checkout( + &repo_url, + current_dir, + &base_name, + commit_hash.clone(), + temp_dir_opt, + )?; + + check_signal(container_id_opt, temp_dir_opt); + + let (args, mount_path, library_name) = build_args( + &relative_mount_path, + library_name_opt.clone(), + &verify_tmp_root_path, + base_image.clone(), + bpf_flag, + cargo_args.clone(), + )?; + println!("Build path: {:?}", mount_path); + println!("Verifying program: {}", library_name); + + check_signal(container_id_opt, temp_dir_opt); + + let result: Result<(String, String), anyhow::Error> = if !skip_build { + build_and_verify_repo( + mount_path, + base_image.clone(), + bpf_flag, + library_name.clone(), + connection, + program_id, + cargo_args.clone(), + container_id_opt, + ) + } else { + Ok(("skipped".to_string(), "skipped".to_string())) + }; + + // Cleanup no matter the result + std::process::Command::new("rm") + .args(["-rf", &verify_dir]) + .output()?; + + // Handle the result + match result { + Ok((build_hash, program_hash)) => { + if !skip_build { + println!("Executable Program Hash from repo: {}", build_hash); + println!("On-chain Program Hash: {}", program_hash); + } + + if skip_build || build_hash == program_hash { + if skip_build { + println!("Skipping local build and writing verify data on chain"); + } else { + println!("Program hash matches ✅"); + } + + upload_program_verification_data( + repo_url.clone(), + &commit_hash.clone(), + args.iter().map(|s| s.to_string()).collect(), + program_id, + connection, + skip_prompt, + path_to_keypair.clone(), + compute_unit_price, + ) + .await?; + + if remote { + check_signal(container_id_opt, temp_dir_opt); + let genesis_hash = get_genesis_hash(connection)?; + if genesis_hash != MAINNET_GENESIS_HASH { + return Err(anyhow!("Remote verification only works with mainnet. Please omit the --remote flag to verify locally.")); + } + + let uploader = get_address_from_keypair_or_config(path_to_keypair.as_ref())?; + println!( + "Sending verify command to remote machine with uploader: {}", + &uploader + ); + println!( + "\nPlease note that if the desired uploader is not the provided keypair, you will need to run `solana-verify remote submit-job --program-id {} --uploader .\n", + &program_id, + ); + send_job_with_uploader_to_remote(connection, &program_id, &uploader).await?; + } + + Ok(()) + } else { + println!("Program hashes do not match ❌"); + println!("Executable Program Hash from repo: {}", build_hash); + println!("On-chain Program Hash: {}", program_hash); + Ok(()) + } + } + Err(e) => Err(anyhow!("Error verifying program: {:?}", e)), + } +} + +#[allow(clippy::too_many_arguments)] +pub fn build_and_verify_repo( + mount_path: String, + base_image: Option, + bpf_flag: bool, + library_name: String, + connection: &RpcClient, + program_id: Pubkey, + cargo_args: Vec, + container_id_opt: &mut Option, +) -> anyhow::Result<(String, String)> { + // Build the code using the docker container + let executable_filename = format!("{}.so", &library_name); + build( + Some(mount_path.clone()), + Some(library_name), + base_image, + bpf_flag, + cargo_args, + container_id_opt, + )?; + + // Get the hash of the build + let executable_path = std::process::Command::new("find") + .args([ + &format!("{}/target/deploy", mount_path), + "-name", + executable_filename.as_str(), + ]) + .output() + .map_err(|e| anyhow::format_err!("Failed to find executable file {}", e.to_string())) + .and_then(|output| parse_output(output.stdout))?; + println!("Executable file found at path: {:?}", executable_path); + let build_hash = get_file_hash(&executable_path)?; + + // Get the hash of the deployed program + println!( + "Fetching on-chain program data for program ID: {}", + program_id, + ); + let program_hash = get_program_hash(connection, program_id)?; + + Ok((build_hash, program_hash)) +} + +pub fn parse_output(output: Vec) -> anyhow::Result { + let parsed_output = String::from_utf8(output)? + .strip_suffix("\n") + .ok_or_else(|| anyhow!("Failed to parse output"))? + .to_string(); + Ok(parsed_output) +} + +pub fn get_pkg_version_from_cargo_lock( + package_name: &str, + cargo_lock_file: &str, +) -> anyhow::Result<(u32, u32, u32)> { + let lockfile = Lockfile::load(cargo_lock_file)?; + let res = lockfile + .packages + .iter() + .filter(|pkg| pkg.name.to_string() == *package_name) + .filter_map(|pkg| { + let version = pkg.version.clone().to_string(); + let version_parts: Vec<&str> = version.split(".").collect(); + if version_parts.len() == 3 { + let major = version_parts[0].parse::().unwrap_or(0); + let minor = version_parts[1].parse::().unwrap_or(0); + let patch = version_parts[2].parse::().unwrap_or(0); + return Some((major, minor, patch)); + } + None + }) + .next() + .ok_or_else(|| anyhow!("Failed to parse solana-program version from Cargo.lock"))?; + Ok(res) +} + +pub fn get_lib_name_from_cargo_toml(cargo_toml_file: &str) -> anyhow::Result { + let manifest = Manifest::from_path(cargo_toml_file)?; + let lib = manifest + .lib + .ok_or_else(|| anyhow!("Failed to parse lib from Cargo.toml"))?; + lib.name + .ok_or_else(|| anyhow!("Failed to parse lib name from Cargo.toml")) +} + +pub fn get_pkg_name_from_cargo_toml(cargo_toml_file: &str) -> Option { + let manifest = Manifest::from_path(cargo_toml_file).ok()?; + let pkg = manifest.package?; + Some(pkg.name) +} + +pub fn print_build_params(pubkey: &Pubkey, build_params: &OtterBuildParams) { + println!("----------------------------------------------------------------"); + println!("Address: {:?}", pubkey); + println!("----------------------------------------------------------------"); + println!("{}", build_params); +} + +pub async fn list_program_pdas(program_id: Pubkey, client: &RpcClient) -> anyhow::Result<()> { + let pdas = get_all_pdas_available(client, &program_id).await?; + for (pda, build_params) in pdas { + print_build_params(&pda, &build_params); + } + Ok(()) +} + +pub async fn print_program_pda( + program_id: Pubkey, + signer: Option, + client: &RpcClient, +) -> anyhow::Result<()> { + let (pda, build_params) = get_program_pda(client, &program_id, signer).await?; + print_build_params(&pda, &build_params); + Ok(()) +} + +pub fn get_commit_hash(sub_m: &ArgMatches, repo_url: &str) -> anyhow::Result { + let commit_hash = sub_m + .value_of("commit-hash") + .map(String::from) + .or_else(|| { + get_commit_hash_from_remote(repo_url).ok() // Dynamically determine commit hash from remote + }) + .ok_or_else(|| { + anyhow::anyhow!("Commit hash must be provided or inferred from the remote repository") + })?; + + println!("Commit hash from remote: {}", commit_hash); + Ok(commit_hash) +} + +#[allow(clippy::too_many_arguments)] +async fn export_pda_tx( + connection: &RpcClient, + program_id: Pubkey, + uploader: Pubkey, + repo_url: String, + commit_hash: String, + mount_path: String, + library_name: Option, + base_image: Option, + bpf_flag: bool, + temp_dir: &mut Option, + encoding: UiTransactionEncoding, + cargo_args: Vec, + compute_unit_price: u64, +) -> anyhow::Result<()> { + let last_deployed_slot = get_last_deployed_slot(connection, &program_id.to_string()) + .await + .map_err(|err| anyhow!("Unable to get last deployed slot: {}", err))?; + + let (temp_root_path, verify_dir) = clone_repo_and_checkout( + &repo_url, + true, + &get_basename(&repo_url)?, + Some(commit_hash.clone()), + temp_dir, + )?; + + let input_params = InputParams { + version: env!("CARGO_PKG_VERSION").to_string(), + git_url: repo_url, + commit: commit_hash.clone(), + args: build_args( + &mount_path, + library_name.clone(), + &temp_root_path, + base_image.clone(), + bpf_flag, + cargo_args, + )? + .0, + deployed_slot: last_deployed_slot, + }; + + std::process::Command::new("rm") + .args(["-rf", &verify_dir]) + .output()?; + + let (pda, _) = find_build_params_pda(&program_id, &uploader); + + // check if account already exists + let instruction = match connection.get_account(&pda) { + Ok(account_info) => { + if !account_info.data.is_empty() { + println!("PDA already exists, creating update transaction"); + OtterVerifyInstructions::Update + } else { + println!("PDA does not exist, creating initialize transaction"); + OtterVerifyInstructions::Initialize + } + } + Err(_) => OtterVerifyInstructions::Initialize, + }; + + let tx = compose_transaction( + &input_params, + uploader, + pda, + program_id, + instruction, + compute_unit_price, + ); + + // serialize the transaction to base58 + match encoding { + UiTransactionEncoding::Base58 => { + println!("{}", bs58::encode(serialize(&tx)?).into_string()); + } + UiTransactionEncoding::Base64 => { + println!("{}", BASE64_STANDARD.encode(serialize(&tx)?)); + } + _ => unreachable!(), + } + + Ok(()) +} diff --git a/src/solana_program.rs b/src/solana_program.rs new file mode 100644 index 0000000..2a3aaea --- /dev/null +++ b/src/solana_program.rs @@ -0,0 +1,425 @@ +use anyhow::anyhow; +use solana_cli_config::Config; +use solana_client::{ + rpc_client::RpcClient, + rpc_config::RpcProgramAccountsConfig, + rpc_filter::{Memcmp, RpcFilterType}, +}; +use std::{ + io::{self, Read, Write}, + str::FromStr, +}; + +use borsh::{to_vec, BorshDeserialize, BorshSerialize}; +use solana_sdk::{ + compute_budget::ComputeBudgetInstruction, instruction::AccountMeta, message::Message, + pubkey::Pubkey, signature::Keypair, signer::Signer, system_program, transaction::Transaction, +}; + +use solana_account_decoder::UiAccountEncoding; +use solana_sdk::commitment_config::{CommitmentConfig, CommitmentLevel}; + +use crate::api::get_last_deployed_slot; + +const OTTER_VERIFY_PROGRAM_ID: Pubkey = + solana_sdk::pubkey!("verifycLy8mB96wd9wqq3WDXQwM4oU6r42Th37Db9fC"); +const OTTER_SIGNER: &str = "9VWiUUhgNoRwTH5NVehYJEDwcotwYX3VgW4MChiHPAqU"; + +#[derive(BorshDeserialize, BorshSerialize, Debug)] +pub struct OtterBuildParams { + pub address: Pubkey, + pub signer: Pubkey, + pub version: String, + pub git_url: String, + pub commit: String, + pub args: Vec, + pub deployed_slot: u64, + bump: u8, +} +impl std::fmt::Display for OtterBuildParams { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + writeln!(f, "Program Id: {}", self.address)?; + writeln!(f, "Signer: {}", self.signer)?; + writeln!(f, "Git Url: {}", self.git_url)?; + writeln!(f, "Commit: {}", self.commit)?; + writeln!(f, "Deployed Slot: {}", self.deployed_slot)?; + writeln!(f, "Args: {:?}", self.args)?; + writeln!(f, "Version: {}", self.version)?; + Ok(()) + } +} + +pub fn prompt_user_input(message: &str) -> bool { + let mut buffer = [0; 1]; + print!("{}", message); + let _ = io::stdout().flush(); + io::stdin() + .read_exact(&mut buffer) + .expect("Unable to read user input"); + matches!(buffer[0] as char, 'Y' | 'y') +} + +#[derive(BorshSerialize, BorshDeserialize)] +pub struct InputParams { + pub version: String, + pub git_url: String, + pub commit: String, + pub args: Vec, + pub deployed_slot: u64, +} + +#[derive(PartialEq)] +pub enum OtterVerifyInstructions { + Initialize, + Update, + Close, +} + +impl OtterVerifyInstructions { + fn get_discriminant(&self) -> Vec { + match self { + OtterVerifyInstructions::Initialize => vec![175, 175, 109, 31, 13, 152, 155, 237], + OtterVerifyInstructions::Update => vec![219, 200, 88, 176, 158, 63, 253, 127], + OtterVerifyInstructions::Close => vec![98, 165, 201, 177, 108, 65, 206, 96], + } + } +} + +fn create_ix_data(params: &InputParams, ix: &OtterVerifyInstructions) -> Vec { + let mut data = ix.get_discriminant(); // Discriminant for the instruction + let params_data = to_vec(¶ms).expect("Unable to serialize params"); + data.extend_from_slice(¶ms_data); + data +} + +fn get_keypair_from_path(path: &str) -> anyhow::Result { + solana_clap_utils::keypair::keypair_from_path(&Default::default(), path, "keypair", false) + .map_err(|err| anyhow!("Unable to get signer from path: {}", err)) +} + +fn get_user_config() -> anyhow::Result<(Keypair, RpcClient)> { + let config_file = solana_cli_config::CONFIG_FILE + .as_ref() + .ok_or_else(|| anyhow!("Unable to get config file path"))?; + let cli_config: Config = Config::load(config_file)?; + + let signer = get_keypair_from_path(&cli_config.keypair_path)?; + + let rpc_client = RpcClient::new(cli_config.json_rpc_url.clone()); + Ok((signer, rpc_client)) +} + +pub fn compose_transaction( + params: &InputParams, + signer_pubkey: Pubkey, + pda_account: Pubkey, + program_address: Pubkey, + instruction: OtterVerifyInstructions, + compute_unit_price: u64, +) -> Transaction { + let ix_data = if instruction != OtterVerifyInstructions::Close { + create_ix_data(params, &instruction) + } else { + instruction.get_discriminant() + }; + + let mut accounts_meta_vec = vec![ + AccountMeta::new(pda_account, false), + AccountMeta::new_readonly(signer_pubkey, true), + AccountMeta::new_readonly(program_address, false), + ]; + + if instruction != OtterVerifyInstructions::Close { + accounts_meta_vec.push(AccountMeta::new_readonly(system_program::ID, false)); + } + + let ix = solana_sdk::instruction::Instruction::new_with_bytes( + OTTER_VERIFY_PROGRAM_ID, + &ix_data, + accounts_meta_vec, + ); + + let message = if compute_unit_price > 0 { + // Add compute budget instruction for priority fees only if price > 0 + let compute_budget_ix = + ComputeBudgetInstruction::set_compute_unit_price(compute_unit_price); + Message::new(&[compute_budget_ix, ix], Some(&signer_pubkey)) + } else { + Message::new(&[ix], Some(&signer_pubkey)) + }; + + Transaction::new_unsigned(message) +} + +fn process_otter_verify_ixs( + params: &InputParams, + pda_account: Pubkey, + program_address: Pubkey, + instruction: OtterVerifyInstructions, + rpc_client: &RpcClient, + path_to_keypair: Option, + compute_unit_price: u64, +) -> anyhow::Result<()> { + let user_config = get_user_config()?; + let signer = if let Some(path_to_keypair) = path_to_keypair { + get_keypair_from_path(&path_to_keypair)? + } else { + user_config.0 + }; + let connection = rpc_client; + + let mut tx = compose_transaction( + params, + signer.pubkey(), + pda_account, + program_address, + instruction, + compute_unit_price, + ); + + tx.sign(&[&signer], connection.get_latest_blockhash()?); + + let tx_id = connection + .send_and_confirm_transaction_with_spinner(&tx) + .map_err(|err| { + println!("{:?}", err); + anyhow!("Failed to send transaction to the network.") + })?; + println!("Program uploaded successfully. Transaction ID: {}", tx_id); + Ok(()) +} + +pub fn resolve_rpc_url(url: Option) -> anyhow::Result { + let connection = match url.as_deref() { + Some("m") => RpcClient::new("https://api.mainnet-beta.solana.com"), + Some("d") => RpcClient::new("https://api.devnet.solana.com"), + Some("t") => RpcClient::new("https://api.testnet.solana.com"), + Some("l") => RpcClient::new("http://localhost:8899"), + Some(url) => RpcClient::new(url), + None => { + if let Ok(cli_config) = get_user_config() { + cli_config.1 + } else { + RpcClient::new("https://api.mainnet-beta.solana.com") + } + } + }; + + Ok(connection) +} + +pub fn get_address_from_keypair_or_config( + path_to_keypair: Option<&String>, +) -> anyhow::Result { + if let Some(path_to_keypair) = path_to_keypair { + Ok(get_keypair_from_path(path_to_keypair)?.pubkey()) + } else { + Ok(get_user_config()?.0.pubkey()) + } +} + +#[allow(clippy::too_many_arguments)] +pub async fn upload_program_verification_data( + git_url: String, + commit: &Option, + args: Vec, + program_address: Pubkey, + connection: &RpcClient, + skip_prompt: bool, + path_to_keypair: Option, + compute_unit_price: u64, +) -> anyhow::Result<()> { + if skip_prompt + || prompt_user_input( + "Do you want to upload the program verification to the Solana Blockchain? (y/n) ", + ) + { + println!("Uploading the program verification params to the Solana blockchain..."); + + let signer_pubkey: Pubkey = get_address_from_keypair_or_config(path_to_keypair.as_ref())?; + + // let rpc_url = connection.url(); + println!("Using connection url: {}", connection.url()); + + let last_deployed_slot = get_last_deployed_slot(connection, &program_address.to_string()) + .await + .map_err(|err| anyhow!("Unable to get last deployed slot: {}", err))?; + + let input_params = InputParams { + version: env!("CARGO_PKG_VERSION").to_string(), + git_url, + commit: commit.clone().unwrap_or_default(), + args, + deployed_slot: last_deployed_slot, + }; + + // Possible PDA-1: Signer is current signer then we can update the program + let pda_account_1 = find_build_params_pda(&program_address, &signer_pubkey).0; + + // Possible PDA-2: signer is otter signer + let otter_signer = Pubkey::from_str(OTTER_SIGNER)?; + let pda_account_2 = find_build_params_pda(&program_address, &otter_signer).0; + + if connection.get_account(&pda_account_1).is_ok() { + println!("Program already uploaded by the current signer. Updating the program."); + process_otter_verify_ixs( + &input_params, + pda_account_1, + program_address, + OtterVerifyInstructions::Update, + connection, + path_to_keypair, + compute_unit_price, + )?; + } else if connection.get_account(&pda_account_2).is_ok() { + let wanna_create_new_pda = skip_prompt || prompt_user_input( + "Program already uploaded by another signer. Do you want to upload a new program? (Y/n)" + ); + if wanna_create_new_pda { + process_otter_verify_ixs( + &input_params, + pda_account_1, + program_address, + OtterVerifyInstructions::Initialize, + connection, + path_to_keypair, + compute_unit_price, + )?; + } + return Ok(()); + } else { + // Else Create new PDA and upload the program + process_otter_verify_ixs( + &input_params, + pda_account_1, + program_address, + OtterVerifyInstructions::Initialize, + connection, + path_to_keypair, + compute_unit_price, + )?; + } + } else { + println!("Exiting without uploading the program."); + } + + Ok(()) +} + +pub fn find_build_params_pda(program_id: &Pubkey, signer: &Pubkey) -> (Pubkey, u8) { + let seeds: &[&[u8]; 3] = &[b"otter_verify", &signer.to_bytes(), &program_id.to_bytes()]; + Pubkey::find_program_address(seeds, &OTTER_VERIFY_PROGRAM_ID) +} + +pub async fn process_close( + program_address: Pubkey, + connection: &RpcClient, + compute_unit_price: u64, +) -> anyhow::Result<()> { + let user_config = get_user_config()?; + let signer = user_config.0; + let signer_pubkey = signer.pubkey(); + + let last_deployed_slot = get_last_deployed_slot(connection, &program_address.to_string()) + .await + .map_err(|err| anyhow!("Unable to get last deployed slot: {}", err))?; + + let pda_account = find_build_params_pda(&program_address, &signer_pubkey).0; + + if connection.get_account(&pda_account).is_ok() { + process_otter_verify_ixs( + &InputParams { + version: "".to_string(), + git_url: "".to_string(), + commit: "".to_string(), + args: vec![], + deployed_slot: last_deployed_slot, + }, + pda_account, + program_address, + OtterVerifyInstructions::Close, + connection, + None, + compute_unit_price, + )?; + } else { + return Err(anyhow!( + "No PDA found for signer {:?} and program address {:?}. Make sure you are providing the program address, not the PDA address. Check that a signer exists for the program by running `solana-verify list-program-pdas --program-id {:?}`", + signer_pubkey, + program_address, + program_address + )); + } + + Ok(()) +} + +pub async fn get_program_pda( + client: &RpcClient, + program_id: &Pubkey, + signer_pubkey: Option, +) -> anyhow::Result<(Pubkey, OtterBuildParams)> { + let signer_pubkey = if let Some(signer_pubkey) = signer_pubkey { + Pubkey::from_str(&signer_pubkey)? + } else { + get_user_config()?.0.pubkey() + }; + + let pda = find_build_params_pda(program_id, &signer_pubkey).0; + let account = client + .get_account_with_commitment( + &pda, + CommitmentConfig { + commitment: CommitmentLevel::Confirmed, + }, + ) + .unwrap(); + if let Some(account) = account.value { + Ok(( + pda, + OtterBuildParams::try_from_slice(&account.data[8..]) + .map_err(|err| anyhow!("Unable to parse build params: {}", err))?, + )) + } else { + Err(anyhow!( + "PDA not found for {:?} and uploader {:?}. Make sure you've uploaded the PDA to mainnet.", + program_id, + signer_pubkey + )) + } +} + +pub async fn get_all_pdas_available( + client: &RpcClient, + program_id_pubkey: &Pubkey, +) -> anyhow::Result> { + let filter = vec![RpcFilterType::Memcmp(Memcmp::new_base58_encoded( + 8, + &program_id_pubkey.to_bytes(), + ))]; + + let config = RpcProgramAccountsConfig { + filters: Some(filter), + account_config: solana_client::rpc_config::RpcAccountInfoConfig { + encoding: Some(UiAccountEncoding::Base64), + data_slice: None, + commitment: Some(CommitmentConfig { + commitment: CommitmentLevel::Confirmed, + }), + min_context_slot: None, + }, + with_context: None, + }; + + let accounts = client.get_program_accounts_with_config(&OTTER_VERIFY_PROGRAM_ID, config)?; + + let mut pdas = vec![]; + for account in accounts { + let otter_build_params = OtterBuildParams::try_from_slice(&account.1.data[8..]); + if let Ok(otter_build_params) = otter_build_params { + pdas.push((account.0, otter_build_params)); + } + } + + Ok(pdas) +} diff --git a/src/test.rs b/src/test.rs new file mode 100644 index 0000000..e0d5c2d --- /dev/null +++ b/src/test.rs @@ -0,0 +1,171 @@ +mod tests { + use anyhow::Context; + use regex::Regex; + use std::io::Write; + use std::process::Stdio; + + fn test_verify_program_hash_helper(expected_hash: &str, args: &[&str]) -> anyhow::Result<()> { + let mut child = std::process::Command::new("./target/debug/solana-verify") + .args(args) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .context("Failed to execute solana-verify command")?; + + if let Some(mut stdin) = child.stdin.take() { + stdin.write_all(b"n")?; + } + + let output = child + .wait_with_output() + .context("Failed to wait for solana-verify command")?; + + if !output.status.success() { + let error = String::from_utf8_lossy(&output.stderr); + anyhow::bail!("Command failed: {}", error); + } + + // Print the last 10 lines of the output + let output_str = String::from_utf8_lossy(&output.stdout); + let lines: Vec<&str> = output_str.split('\n').collect(); + let last_10_lines: Vec = lines.iter().rev().take(10).map(|s| s.to_string()).collect(); + println!("Last 10 lines of output:\n{}", last_10_lines.join("\n")); + + let re = Regex::new(r"Executable Program Hash from repo: ([a-f0-9]{64})") + .context("Failed to compile regex")?; + + let program_hash = re + .captures(&output_str) + .context("Could not find program hash in output")? + .get(1) + .context("Invalid capture group")? + .as_str(); + + assert_eq!( + program_hash, expected_hash, + "Program hash {} does not match expected value {}", + program_hash, expected_hash + ); + + Ok(()) + } + + #[test] + fn test_phoenix_v1() -> anyhow::Result<()> { + const EXPECTED_HASH: &str = "6877a5b732b3494b828a324ec846d526d962223959534dbaf4209e0da3b2d6a9"; + let args: Vec<&str> = + "verify-from-repo -um --program-id PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY https://github.com/Ellipsis-Labs/phoenix-v1".split(" ").collect(); + test_verify_program_hash_helper(EXPECTED_HASH, &args)?; + Ok(()) + } + + #[test] + fn test_squads_v3() -> anyhow::Result<()> { + const EXPECTED_HASH: &str = "72da599d9ee14b2a03a23ccfa6f06d53eea4a00825ad2191929cbd78fb69205c"; + let args: Vec<&str> = "verify-from-repo https://github.com/Squads-Protocol/squads-mpl --commit-hash c95b7673d616c377a349ca424261872dfcf8b19d --program-id SMPLecH534NA9acpos4G6x7uf3LWbCAwZQE9e8ZekMu -um --library-name squads_mpl --bpf".split(" ").collect(); + test_verify_program_hash_helper(EXPECTED_HASH, &args)?; + Ok(()) + } + + #[test] + fn test_drift_v2() -> anyhow::Result<()> { + const EXPECTED_HASH: &str = "e31d58edeabc3c30bf6f2aa60bfaa5e492b41ec203e9006404b463e5adee5828"; + let args: Vec<&str> = "verify-from-repo -um --program-id dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH https://github.com/drift-labs/protocol-v2 --commit-hash 110d3ff4f8ba07c178d69f9bfc7b30194fac56d6 --library-name drift".split(" ").collect(); + test_verify_program_hash_helper(EXPECTED_HASH, &args)?; + Ok(()) + } + + #[test] + fn test_marginfi_v2() -> anyhow::Result<()> { + const EXPECTED_HASH: &str = "890d68f48f96991016222b1fcbc2cc81b8ef2dcbf280c44fe378c523c108fad5"; + let args: Vec<&str> = "verify-from-repo -um --program-id MFv2hWf31Z9kbCa1snEPYctwafyhdvnV7FZnsebVacA https://github.com/mrgnlabs/marginfi-v2 --commit-hash d33e649e415c354cc2a1e3c49131725552d69ba0 --library-name marginfi".split(" ").collect(); + test_verify_program_hash_helper(EXPECTED_HASH, &args)?; + Ok(()) + } + + #[test] + fn test_games_preset() -> anyhow::Result<()> { + const EXPECTED_HASH: &str = "668ff275819d9276362c6a2636d2a392afe224296e815481b94474785f490025"; + let args: Vec<&str> = "verify-from-repo -um --program-id MkabCfyUD6rBTaYHpgKBBpBo5qzWA2pK2hrGGKMurJt https://github.com/solana-developers/solana-game-preset --commit-hash eaf772fd1f21fe03a9974587f5680635e970be38 --mount-path program".split(" ").collect(); + test_verify_program_hash_helper(EXPECTED_HASH, &args)?; + Ok(()) + } + + #[test] + fn test_agave_2_1() -> anyhow::Result<()> { + const EXPECTED_HASH: &str = "29e7713aa3c48e242e2847bc031fe2a03eb61aae5ecaec8728131e16934de465"; + let args: Vec<&str> = "verify-from-repo https://github.com/Woody4618/verify-2-1 --program-id kGYz2q2WUYCXhKpgUF4AMR3seDA9eg8sbirP5dhbyhy --commit-hash e0f138fb58b669791c823f44f878cb3547a92a26".split(" ").collect(); + test_verify_program_hash_helper(EXPECTED_HASH, &args)?; + Ok(()) + } + + #[test] + fn test_local_example() -> anyhow::Result<()> { + const EXPECTED_HASH: &str = "08d91368d349c2b56c712422f6d274a1e8f1946ff2ecd1dc3efc3ebace52a760"; + + let args: Vec<&str> = "build ./examples/hello_world".split(" ").collect(); + let child = std::process::Command::new("./target/debug/solana-verify") + .args(args) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .context("Failed to execute solana-verify command")?; + + let output = child + .wait_with_output() + .context("Failed to wait for solana-verify command")?; + + if !output.status.success() { + let error = String::from_utf8_lossy(&output.stderr); + anyhow::bail!("Command failed: {}", error); + } + + + let args: Vec<&str> = "get-executable-hash ./examples/hello_world/target/deploy/hello_world.so".split(" ").collect(); + let child = std::process::Command::new("./target/debug/solana-verify") + .args(&args) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .context("Failed to execute solana-verify command")?; + + let output = child + .wait_with_output() + .context("Failed to wait for solana-verify command")?; + + if !output.status.success() { + let error = String::from_utf8_lossy(&output.stderr).trim().to_string(); + anyhow::bail!("Command failed: {}", error); + } + + let hash = String::from_utf8_lossy(&output.stdout).trim().to_string(); + assert_eq!(hash, EXPECTED_HASH, "Program hash {} does not match expected value {}", hash, EXPECTED_HASH); + Ok(()) + } + + + #[test] + fn test_verify_from_image() -> anyhow::Result<()> { + let args: Vec<&str> = "verify-from-image -e examples/hello_world/target/deploy/hello_world.so -i ellipsislabs/hello_world_verifiable_build:latest -p 2ZrriTQSVekoj414Ynysd48jyn4AX6ZF4TTJRqHfbJfn".split(" ").collect(); + let child = std::process::Command::new("./target/debug/solana-verify") + .args(args) + .stdin(Stdio::piped()) + .stdout(Stdio::piped()) + .stderr(Stdio::piped()) + .spawn() + .context("Failed to execute solana-verify command")?; + + let output = child + .wait_with_output() + .context("Failed to wait for solana-verify command")?; + + if !output.status.success() { + let error = String::from_utf8_lossy(&output.stderr); + anyhow::bail!("Command failed: {}", error); + } + Ok(()) + } +} \ No newline at end of file diff --git a/update_image_whitelist.py b/update_image_whitelist.py new file mode 100644 index 0000000..00cf2a0 --- /dev/null +++ b/update_image_whitelist.py @@ -0,0 +1,92 @@ +import re +import re +import requests +import os + +github_token = os.environ.get('GITHUB_TOKEN') +use_ghcr = os.environ.get('USE_GHCR', 'false').lower() == 'true' +headers = {'Authorization': f'Bearer {github_token}'} + +def fetch_all_tags(repository): + """Fetches all tags for a given Docker Hub repository across all pages.""" + url = f"https://hub.docker.com/v2/repositories/{repository}/tags/" + all_tags = [] + page = 1 + page_size = 100 # Maximum page size Docker Hub allows + + while True: + response = requests.get(url, params={"page": page, "page_size": page_size}) + if response.status_code != 200: + raise Exception(f"Failed to get Docker images: {response.status_code} {response.text}") + + response_data = response.json() + + all_tags.extend(response_data.get("results", [])) + print(f"Fetched page {page} with {len(response_data.get('results', []))} tags.") + + if not response_data.get("next"): + break + page += 1 + + return all_tags + +if use_ghcr: + response = requests.get( + "https://api.github.com/users/ngundotra/packages/container/solana/versions?per_page=100", + headers=headers + ) + if response.status_code != 200: + raise Exception(f"Failed to get Docker images: {response.status_code} {response.text}") + results = response.json() +else: + repository = "solanafoundation/solana-verifiable-build" + results = fetch_all_tags(repository) + +digest_map = {} +for result in results: + if use_ghcr: + # For GHCR, extract version from metadata + metadata = result.get("metadata", {}) + container = metadata.get("container", {}) + tags = container.get("tags", []) + for tag in tags: + match = re.match(r'(\d+)\.(\d+)\.(\d+)', tag) + if match: + major, minor, patch = map(int, match.groups()) + digest_map[(major, minor, patch)] = result["name"] # "name" contains the digest for GHCR + break + else: + tag_name = result["name"] + if tag_name != "latest": + match = re.match(r'^(\d+)\.(\d+)\.(\d+)$', tag_name) + if match: + try: + major, minor, patch = map(int, match.groups()) + digest_map[(major, minor, patch)] = result["digest"] + except ValueError as e: + print(f"Skipping invalid version tag '{tag_name}': {e}") + +entries = [] +for k, v in sorted(digest_map.items()): + entries.append(f' m.insert({k}, "{v}");') + +mappings = "\n".join(entries) + +code = f""" +/// THIS FILE IS AUTOGENERATED. DO NOT MODIFY +use lazy_static::lazy_static; +use std::collections::BTreeMap; + +lazy_static! {{ + pub static ref IMAGE_MAP: BTreeMap<(u32, u32, u32), &'static str> = {{ + let mut m = BTreeMap::new(); +{mappings} + m + }}; +}} +""" + +print(code) + +with open("src/image_config.rs", "w") as f: + f.write(code.lstrip("\n")) diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..2717733 --- /dev/null +++ b/uv.lock @@ -0,0 +1,94 @@ +version = 1 +requires-python = ">=3.12" + +[[package]] +name = "certifi" +version = "2024.8.30" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/ee/9b19140fe824b367c04c5e1b369942dd754c4c5462d5674002f75c4dedc1/certifi-2024.8.30.tar.gz", hash = "sha256:bec941d2aa8195e248a60b31ff9f0558284cf01a52591ceda73ea9afffd69fd9", size = 168507 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/90/3c9ff0512038035f59d279fddeb79f5f1eccd8859f06d6163c58798b9487/certifi-2024.8.30-py3-none-any.whl", hash = "sha256:922820b53db7a7257ffbda3f597266d435245903d80737e34f8a45ff3e3230d8", size = 167321 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f2/4f/e1808dc01273379acc506d18f1504eb2d299bd4131743b9fc54d7be4df1e/charset_normalizer-3.4.0.tar.gz", hash = "sha256:223217c3d4f82c3ac5e29032b3f1c2eb0fb591b72161f86d93f5719079dae93e", size = 106620 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/0b/4b7a70987abf9b8196845806198975b6aab4ce016632f817ad758a5aa056/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0713f3adb9d03d49d365b70b84775d0a0d18e4ab08d12bc46baa6132ba78aaf6", size = 194445 }, + { url = "https://files.pythonhosted.org/packages/50/89/354cc56cf4dd2449715bc9a0f54f3aef3dc700d2d62d1fa5bbea53b13426/charset_normalizer-3.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:de7376c29d95d6719048c194a9cf1a1b0393fbe8488a22008610b0361d834ecf", size = 125275 }, + { url = "https://files.pythonhosted.org/packages/fa/44/b730e2a2580110ced837ac083d8ad222343c96bb6b66e9e4e706e4d0b6df/charset_normalizer-3.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a51b48f42d9358460b78725283f04bddaf44a9358197b889657deba38f329db", size = 119020 }, + { url = "https://files.pythonhosted.org/packages/9d/e4/9263b8240ed9472a2ae7ddc3e516e71ef46617fe40eaa51221ccd4ad9a27/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b295729485b06c1a0683af02a9e42d2caa9db04a373dc38a6a58cdd1e8abddf1", size = 139128 }, + { url = "https://files.pythonhosted.org/packages/6b/e3/9f73e779315a54334240353eaea75854a9a690f3f580e4bd85d977cb2204/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ee803480535c44e7f5ad00788526da7d85525cfefaf8acf8ab9a310000be4b03", size = 149277 }, + { url = "https://files.pythonhosted.org/packages/1a/cf/f1f50c2f295312edb8a548d3fa56a5c923b146cd3f24114d5adb7e7be558/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d59d125ffbd6d552765510e3f31ed75ebac2c7470c7274195b9161a32350284", size = 142174 }, + { url = "https://files.pythonhosted.org/packages/16/92/92a76dc2ff3a12e69ba94e7e05168d37d0345fa08c87e1fe24d0c2a42223/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cda06946eac330cbe6598f77bb54e690b4ca93f593dee1568ad22b04f347c15", size = 143838 }, + { url = "https://files.pythonhosted.org/packages/a4/01/2117ff2b1dfc61695daf2babe4a874bca328489afa85952440b59819e9d7/charset_normalizer-3.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07afec21bbbbf8a5cc3651aa96b980afe2526e7f048fdfb7f1014d84acc8b6d8", size = 146149 }, + { url = "https://files.pythonhosted.org/packages/f6/9b/93a332b8d25b347f6839ca0a61b7f0287b0930216994e8bf67a75d050255/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6b40e8d38afe634559e398cc32b1472f376a4099c75fe6299ae607e404c033b2", size = 140043 }, + { url = "https://files.pythonhosted.org/packages/ab/f6/7ac4a01adcdecbc7a7587767c776d53d369b8b971382b91211489535acf0/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:b8dcd239c743aa2f9c22ce674a145e0a25cb1566c495928440a181ca1ccf6719", size = 148229 }, + { url = "https://files.pythonhosted.org/packages/9d/be/5708ad18161dee7dc6a0f7e6cf3a88ea6279c3e8484844c0590e50e803ef/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:84450ba661fb96e9fd67629b93d2941c871ca86fc38d835d19d4225ff946a631", size = 151556 }, + { url = "https://files.pythonhosted.org/packages/5a/bb/3d8bc22bacb9eb89785e83e6723f9888265f3a0de3b9ce724d66bd49884e/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:44aeb140295a2f0659e113b31cfe92c9061622cadbc9e2a2f7b8ef6b1e29ef4b", size = 149772 }, + { url = "https://files.pythonhosted.org/packages/f7/fa/d3fc622de05a86f30beea5fc4e9ac46aead4731e73fd9055496732bcc0a4/charset_normalizer-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1db4e7fefefd0f548d73e2e2e041f9df5c59e178b4c72fbac4cc6f535cfb1565", size = 144800 }, + { url = "https://files.pythonhosted.org/packages/9a/65/bdb9bc496d7d190d725e96816e20e2ae3a6fa42a5cac99c3c3d6ff884118/charset_normalizer-3.4.0-cp312-cp312-win32.whl", hash = "sha256:5726cf76c982532c1863fb64d8c6dd0e4c90b6ece9feb06c9f202417a31f7dd7", size = 94836 }, + { url = "https://files.pythonhosted.org/packages/3e/67/7b72b69d25b89c0b3cea583ee372c43aa24df15f0e0f8d3982c57804984b/charset_normalizer-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:b197e7094f232959f8f20541ead1d9862ac5ebea1d58e9849c1bf979255dfac9", size = 102187 }, + { url = "https://files.pythonhosted.org/packages/f3/89/68a4c86f1a0002810a27f12e9a7b22feb198c59b2f05231349fbce5c06f4/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dd4eda173a9fcccb5f2e2bd2a9f423d180194b1bf17cf59e3269899235b2a114", size = 194617 }, + { url = "https://files.pythonhosted.org/packages/4f/cd/8947fe425e2ab0aa57aceb7807af13a0e4162cd21eee42ef5b053447edf5/charset_normalizer-3.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e9e3c4c9e1ed40ea53acf11e2a386383c3304212c965773704e4603d589343ed", size = 125310 }, + { url = "https://files.pythonhosted.org/packages/5b/f0/b5263e8668a4ee9becc2b451ed909e9c27058337fda5b8c49588183c267a/charset_normalizer-3.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:92a7e36b000bf022ef3dbb9c46bfe2d52c047d5e3f3343f43204263c5addc250", size = 119126 }, + { url = "https://files.pythonhosted.org/packages/ff/6e/e445afe4f7fda27a533f3234b627b3e515a1b9429bc981c9a5e2aa5d97b6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54b6a92d009cbe2fb11054ba694bc9e284dad30a26757b1e372a1fdddaf21920", size = 139342 }, + { url = "https://files.pythonhosted.org/packages/a1/b2/4af9993b532d93270538ad4926c8e37dc29f2111c36f9c629840c57cd9b3/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ffd9493de4c922f2a38c2bf62b831dcec90ac673ed1ca182fe11b4d8e9f2a64", size = 149383 }, + { url = "https://files.pythonhosted.org/packages/fb/6f/4e78c3b97686b871db9be6f31d64e9264e889f8c9d7ab33c771f847f79b7/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:35c404d74c2926d0287fbd63ed5d27eb911eb9e4a3bb2c6d294f3cfd4a9e0c23", size = 142214 }, + { url = "https://files.pythonhosted.org/packages/2b/c9/1c8fe3ce05d30c87eff498592c89015b19fade13df42850aafae09e94f35/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4796efc4faf6b53a18e3d46343535caed491776a22af773f366534056c4e1fbc", size = 144104 }, + { url = "https://files.pythonhosted.org/packages/ee/68/efad5dcb306bf37db7db338338e7bb8ebd8cf38ee5bbd5ceaaaa46f257e6/charset_normalizer-3.4.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7fdd52961feb4c96507aa649550ec2a0d527c086d284749b2f582f2d40a2e0d", size = 146255 }, + { url = "https://files.pythonhosted.org/packages/0c/75/1ed813c3ffd200b1f3e71121c95da3f79e6d2a96120163443b3ad1057505/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:92db3c28b5b2a273346bebb24857fda45601aef6ae1c011c0a997106581e8a88", size = 140251 }, + { url = "https://files.pythonhosted.org/packages/7d/0d/6f32255c1979653b448d3c709583557a4d24ff97ac4f3a5be156b2e6a210/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab973df98fc99ab39080bfb0eb3a925181454d7c3ac8a1e695fddfae696d9e90", size = 148474 }, + { url = "https://files.pythonhosted.org/packages/ac/a0/c1b5298de4670d997101fef95b97ac440e8c8d8b4efa5a4d1ef44af82f0d/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4b67fdab07fdd3c10bb21edab3cbfe8cf5696f453afce75d815d9d7223fbe88b", size = 151849 }, + { url = "https://files.pythonhosted.org/packages/04/4f/b3961ba0c664989ba63e30595a3ed0875d6790ff26671e2aae2fdc28a399/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:aa41e526a5d4a9dfcfbab0716c7e8a1b215abd3f3df5a45cf18a12721d31cb5d", size = 149781 }, + { url = "https://files.pythonhosted.org/packages/d8/90/6af4cd042066a4adad58ae25648a12c09c879efa4849c705719ba1b23d8c/charset_normalizer-3.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ffc519621dce0c767e96b9c53f09c5d215578e10b02c285809f76509a3931482", size = 144970 }, + { url = "https://files.pythonhosted.org/packages/cc/67/e5e7e0cbfefc4ca79025238b43cdf8a2037854195b37d6417f3d0895c4c2/charset_normalizer-3.4.0-cp313-cp313-win32.whl", hash = "sha256:f19c1585933c82098c2a520f8ec1227f20e339e33aca8fa6f956f6691b784e67", size = 94973 }, + { url = "https://files.pythonhosted.org/packages/65/97/fc9bbc54ee13d33dc54a7fcf17b26368b18505500fc01e228c27b5222d80/charset_normalizer-3.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:707b82d19e65c9bd28b81dde95249b07bf9f5b90ebe1ef17d9b57473f8a64b7b", size = 102308 }, + { url = "https://files.pythonhosted.org/packages/bf/9b/08c0432272d77b04803958a4598a51e2a4b51c06640af8b8f0f908c18bf2/charset_normalizer-3.4.0-py3-none-any.whl", hash = "sha256:fe9f97feb71aa9896b81973a7bbada8c49501dc73e58a10fcef6663af95e5079", size = 49446 }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442 }, +] + +[[package]] +name = "requests" +version = "2.32.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/70/2bf7780ad2d390a8d301ad0b550f1581eadbd9a20f896afe06353c2a2913/requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", size = 131218 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/9b/335f9764261e915ed497fcdeb11df5dfd6f7bf257d4a6a2a686d80da4d54/requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6", size = 64928 }, +] + +[[package]] +name = "solana-verifiable-build" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "requests" }, +] + +[package.metadata] +requires-dist = [{ name = "requests", specifier = ">=2.32.3" }] + +[[package]] +name = "urllib3" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", size = 300677 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338 }, +] diff --git a/verifier-cli-install.sh b/verifier-cli-install.sh index 2709b17..0fa86ee 100755 --- a/verifier-cli-install.sh +++ b/verifier-cli-install.sh @@ -19,7 +19,7 @@ abort_on_error() { fi } -CYN "Verifier CLI installation script" +CYN "Solana Verify CLI installation script" echo "---------------------------------------" echo "" @@ -40,16 +40,19 @@ case "$PROCESSOR" in ;; esac -BIN="verifier-cli" -VERSION="0.1.0-x86_64-unknown-linux-gnu" +BIN="solana-verify" +SUFFIX="linux" if [ "$OS_FLAVOUR" = Darwin ]; then + SUFFIX="macos" +fi - VERSION="0.1.0-x86_64-apple-darwin" - +if ["$OS_FLAVOUR" = Windows ]; then + echo "Windows is not currently supported using this installer." + exit 1 fi -DIST="$VERSION" +DIST="$BIN-$SUFFIX" # creates a temporary directory to save the distribution file SOURCE="$(mktemp -d)" @@ -58,9 +61,9 @@ echo "$(CYN "1.") 🖥 $(CYN "Downloading distribution")" echo "" # downloads the distribution file -REMOTE="https://github.com/Ellipsis-Labs/solana-verifiable-build/releases/download/v0.1.2/" -echo " => downloading from: $(CYN $REMOTE$BIN)" -curl -L $REMOTE$BIN --output "$SOURCE/$DIST" +REMOTE="https://github.com/Ellipsis-Labs/solana-verifiable-build/releases/latest/download/" +echo " => downloading from: $(CYN $REMOTE$DIST)" +curl -L $REMOTE$DIST --output "$SOURCE/$DIST" abort_on_error $? SIZE=$(wc -c "$SOURCE/$DIST" | grep -oE "[0-9]+" | head -n 1) @@ -126,7 +129,7 @@ else echo " => adding '$TARGET' to 'PATH' variable in '$ENV_FILE'" echo "export PATH=\"$HOME/bin:\$PATH\"" >> "$ENV_FILE" else - echo " => adding '$TARGET' to 'PATH' variable to execute 'verifier-cli' from any directory." + echo " => adding '$TARGET' to 'PATH' variable to execute 'solana-verify' from any directory." echo " - file '$(CYN $ENV_FILE)' was not found" echo "" echo -n "$(CYN "Would you like to create '$ENV_FILE'? [y/n]") (default 'n'): "