diff --git a/.github/workflows/poseidon.yml b/.github/workflows/poseidon.yml
new file mode 100644
index 000000000..41dc3ec52
--- /dev/null
+++ b/.github/workflows/poseidon.yml
@@ -0,0 +1,276 @@
+name: Poseidon
+
+on:
+ schedule:
+ - cron: "0 0 * * *"
+ push:
+ branches:
+ - main
+ pull_request:
+ types: [opened, synchronize, reopened]
+ branches:
+ - main
+
+env:
+ MAX_JOBS: 64
+ MIN_PROJECTS_PER_JOB: 4
+ MIN_PROJECTS_FOR_MATRIX: 4
+
+jobs:
+ changes:
+ runs-on: ubuntu-latest
+ permissions:
+ pull-requests: read
+ outputs:
+ changed_projects: ${{ steps.analyze.outputs.changed_projects }}
+ total_projects: ${{ steps.analyze.outputs.total_projects }}
+ matrix: ${{ steps.matrix.outputs.matrix }}
+ steps:
+ - uses: actions/checkout@v4
+ - uses: dorny/paths-filter@v3
+ id: changes
+ if: github.event_name == 'pull_request'
+ with:
+ list-files: shell
+ filters: |
+ poseidon:
+ - added|modified: '**/poseidon/**'
+ workflow:
+ - added|modified: '.github/workflows/poseidon.yml'
+ - name: Analyze Changes
+ id: analyze
+ run: |
+ # Generate ignore pattern, excluding comments
+ ignore_pattern=$(grep -v '^#' .github/.ghaignore | grep -v '^$' | tr '\n' '|' | sed 's/|$//')
+ echo "Ignore pattern: $ignore_pattern"
+
+ function get_projects() {
+ find . -type d -name "poseidon" | grep -vE "$ignore_pattern" | sort
+ }
+
+ # Determine which projects to build and test
+ if [[ "${{ github.event_name }}" == "push" || "${{ github.event_name }}" == "schedule" || "${{ steps.changes.outputs.workflow }}" == "true" ]]; then
+ projects=$(get_projects)
+ elif [[ "${{ steps.changes.outputs.poseidon }}" == "true" ]]; then
+ changed_files=(${{ steps.changes.outputs.poseidon_files }})
+ projects=$(for file in "${changed_files[@]}"; do dirname "${file}" | grep poseidon | sed 's#/poseidon/.*#/poseidon#g'; done | grep -vE "$ignore_pattern" | sort -u)
+ else
+ projects=""
+ fi
+
+ # Output project information
+ if [[ -n "$projects" ]]; then
+ echo "Projects to build and test"
+ echo "$projects"
+ total_projects=$(echo "$projects" | wc -l)
+ echo "Total projects: $total_projects"
+ echo "total_projects=$total_projects" >> $GITHUB_OUTPUT
+ echo "changed_projects=$(echo "$projects" | jq -R -s -c 'split("\n")[:-1]')" >> $GITHUB_OUTPUT
+ else
+ echo "No projects to build and test."
+ echo "total_projects=0" >> $GITHUB_OUTPUT
+ echo "changed_projects=[]" >> $GITHUB_OUTPUT
+ fi
+ - name: Generate matrix
+ id: matrix
+ run: |
+ total_projects=${{ steps.analyze.outputs.total_projects }}
+ max_jobs=${{ env.MAX_JOBS }}
+ min_projects_per_job=${{ env.MIN_PROJECTS_PER_JOB }}
+ min_projects_for_matrix=${{ env.MIN_PROJECTS_FOR_MATRIX }}
+
+ # Generate matrix based on number of projects
+ if [ "$total_projects" -lt "$min_projects_for_matrix" ]; then
+ echo "matrix=[0]" >> $GITHUB_OUTPUT
+ else
+ projects_per_job=$(( (total_projects + max_jobs - 1) / max_jobs ))
+ projects_per_job=$(( projects_per_job > min_projects_per_job ? projects_per_job : min_projects_per_job ))
+ num_jobs=$(( (total_projects + projects_per_job - 1) / projects_per_job ))
+
+ indices=$(seq 0 $(( num_jobs - 1 )))
+ echo "matrix=[$(echo $indices | tr ' ' ',')]" >> $GITHUB_OUTPUT
+ fi
+
+ build-and-test:
+ needs: changes
+ if: needs.changes.outputs.total_projects != '0'
+ runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ index: ${{ fromJson(needs.changes.outputs.matrix) }}
+ name: build-and-test-group-${{ matrix.index }}
+ outputs:
+ failed_projects: ${{ steps.set-failed.outputs.failed_projects }}
+ steps:
+ - uses: actions/checkout@v4
+ - uses: heyAyushh/setup-anchor@v4.4
+ with:
+ anchor-version: 0.30.1
+ solana-cli-version: stable
+ node-version: 20.x
+ use-avm: false
+
+ # Get Poseidon repo commit SHA for cache key
+ - name: Get Poseidon commit SHA
+ id: poseidon-sha
+ run: |
+ POSEIDON_SHA=$(git ls-remote https://github.com/Turbin3/poseidon HEAD | cut -f1)
+ echo "sha=$POSEIDON_SHA" >> $GITHUB_OUTPUT
+
+ # Setup Rust cache
+ - name: Setup Rust cache
+ uses: Swatinem/rust-cache@v2
+ with:
+ shared-key: "poseidon-cli"
+ cache-on-failure: true
+ workspaces: |
+ ~/.cargo/bin/poseidon -> Cargo.lock
+
+ # Cache Poseidon binary
+ - name: Cache Poseidon binary
+ id: cache-poseidon
+ uses: actions/cache@v3
+ with:
+ path: ~/.cargo/bin/poseidon
+ key: poseidon-${{ runner.os }}-${{ steps.poseidon-sha.outputs.sha }}
+
+ # Install Poseidon CLI only if not cached
+ - name: Install Poseidon CLI
+ if: steps.cache-poseidon.outputs.cache-hit != 'true'
+ run: |
+ cargo install --git https://github.com/Turbin3/poseidon
+ - name: Display Versions and Install pnpm
+ run: |
+ solana -V
+ solana-keygen new --no-bip39-passphrase
+ rustc -V
+ poseidon --version
+ npm i -g pnpm
+ - name: Build and Test
+ env:
+ TOTAL_PROJECTS: ${{ needs.changes.outputs.total_projects }}
+ PROJECTS_PER_JOB: ${{ env.MIN_PROJECTS_PER_JOB }}
+ run: |
+ function build_and_test() {
+ local project=$1
+ echo "Building and Testing $project"
+ cd "$project" || return 1
+
+ # Install dependencies
+ if ! pnpm install --frozen-lockfile; then
+ echo "::error::pnpm install failed for $project"
+ echo "$project: pnpm install failed" >> $GITHUB_WORKSPACE/failed_projects.txt
+ cd - > /dev/null
+ return 1
+ fi
+
+ # Run poseidon build
+ if ! poseidon build; then
+ echo "::error::poseidon build failed for $project"
+ echo "$project: poseidon build failed" >> $GITHUB_WORKSPACE/failed_projects.txt
+ rm -rf target
+ cd - > /dev/null
+ return 1
+ fi
+
+
+ # Run poseidon test
+ if ! poseidon test; then
+ echo "::error::poseidon test failed for $project"
+ echo "$project: poseidon test failed" >> $GITHUB_WORKSPACE/failed_projects.txt
+ rm -rf target node_modules
+ cd - > /dev/null
+ return 1
+ fi
+
+ echo "Build and tests succeeded for $project."
+ rm -rf target node_modules
+ cd - > /dev/null
+ return 0
+ }
+
+ # Determine which projects to build in this job
+ readarray -t all_projects < <(echo '${{ needs.changes.outputs.changed_projects }}' | jq -r '.[]?')
+ start_index=$(( ${{ matrix.index }} * PROJECTS_PER_JOB ))
+ end_index=$(( start_index + PROJECTS_PER_JOB ))
+ end_index=$(( end_index > TOTAL_PROJECTS ? TOTAL_PROJECTS : end_index ))
+
+ echo "Projects to build and test in this job"
+ for i in $(seq $start_index $(( end_index - 1 ))); do
+ echo "${all_projects[$i]}"
+ done
+
+ # Build and test projects
+ failed=false
+ failed_projects=()
+ for i in $(seq $start_index $(( end_index - 1 ))); do
+ echo "::group::Building and testing ${all_projects[$i]}"
+ if ! build_and_test "${all_projects[$i]}"; then
+ failed=true
+ failed_projects+=("${all_projects[$i]}")
+ fi
+ echo "::endgroup::"
+ done
+
+ if [[ "$failed" == "true" ]]; then
+ echo "::group::Failed projects"
+ cat $GITHUB_WORKSPACE/failed_projects.txt
+ echo "::endgroup::"
+ echo "failed_projects=${failed_projects[@]}" >> $GITHUB_OUTPUT
+ exit 1
+ else
+ echo "failed_projects=" >> $GITHUB_OUTPUT
+ fi
+
+ - name: Set failed projects output
+ id: set-failed
+ if: failure()
+ run: |
+ # Prepare failed projects list for output
+ failed_projects=$(cat $GITHUB_WORKSPACE/failed_projects.txt | jq -R -s -c 'split("\n")[:-1]')
+ echo "failed_projects=$failed_projects" >> $GITHUB_OUTPUT
+
+ summary:
+ needs: [changes, build-and-test]
+ if: always()
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Create job summary
+ run: |
+ echo "## Poseidon Workflow Summary" >> $GITHUB_STEP_SUMMARY
+ echo "- Total projects: ${{ needs.changes.outputs.total_projects }}" >> $GITHUB_STEP_SUMMARY
+
+ # List all processed projects
+ echo "" >> $GITHUB_STEP_SUMMARY
+ echo "Projects processed (click to expand)
" >> $GITHUB_STEP_SUMMARY
+ echo "" >> $GITHUB_STEP_SUMMARY
+ echo '${{ needs.changes.outputs.changed_projects }}' | jq -r '.[]' | while read project; do
+ echo "- $project" >> $GITHUB_STEP_SUMMARY
+ done
+ echo "" >> $GITHUB_STEP_SUMMARY
+ echo " " >> $GITHUB_STEP_SUMMARY
+
+ # Report build and test results
+ if [[ "${{ needs.build-and-test.result }}" == "failure" ]]; then
+ echo "## :x: Build or tests failed" >> $GITHUB_STEP_SUMMARY
+ echo "" >> $GITHUB_STEP_SUMMARY
+ echo "Failed projects (click to expand)
" >> $GITHUB_STEP_SUMMARY
+ echo "" >> $GITHUB_STEP_SUMMARY
+ failed_projects='${{ needs.build-and-test.outputs.failed_projects }}'
+ if [[ -n "$failed_projects" ]]; then
+ echo "$failed_projects" | jq -r '.[]' | while IFS=: read -r project failure_reason; do
+ echo "- **$project**" >> $GITHUB_STEP_SUMMARY
+ echo " - Failure reason: $failure_reason" >> $GITHUB_STEP_SUMMARY
+ done
+ else
+ echo "No failed projects reported. This might indicate an unexpected error in the workflow." >> $GITHUB_STEP_SUMMARY
+ fi
+ echo "" >> $GITHUB_STEP_SUMMARY
+ echo " " >> $GITHUB_STEP_SUMMARY
+ elif [[ "${{ needs.build-and-test.result }}" == "success" ]]; then
+ echo "## :white_check_mark: All builds and tests passed" >> $GITHUB_STEP_SUMMARY
+ else
+ echo "## :warning: Build and test job was skipped or canceled" >> $GITHUB_STEP_SUMMARY
+ fi
\ No newline at end of file
diff --git a/.github/workflows/solana-native.yml b/.github/workflows/solana-native.yml
index 5e79ae979..c3462dd52 100644
--- a/.github/workflows/solana-native.yml
+++ b/.github/workflows/solana-native.yml
@@ -11,107 +11,246 @@ on:
branches:
- main
+env:
+ MAX_JOBS: 64
+ MIN_PROJECTS_PER_JOB: 4
+ MIN_PROJECTS_FOR_MATRIX: 4
+
jobs:
- build:
+ changes:
runs-on: ubuntu-latest
- strategy:
- matrix:
- node-version: [20.x]
- solana-version: [stable]
+ permissions:
+ pull-requests: read
+ outputs:
+ changed_projects: ${{ steps.analyze.outputs.changed_projects }}
+ total_projects: ${{ steps.analyze.outputs.total_projects }}
+ matrix: ${{ steps.matrix.outputs.matrix }}
steps:
- uses: actions/checkout@v4
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v4
+ - uses: dorny/paths-filter@v3
+ id: changes
+ if: github.event_name == 'pull_request'
with:
- node-version: ${{ matrix.node-version }}
- check-latest: true
- - uses: heyAyushh/setup-solana@v5.5
- with:
- solana-cli-version: ${{ matrix.solana-version }}
- - run: solana -V
- shell: bash
- - name: Install pnpm
+ list-files: shell
+ filters: |
+ native:
+ - added|modified: '**/native/**'
+ workflow:
+ - added|modified: '.github/workflows/solana-native.yml'
+ - name: Analyze Changes
+ id: analyze
run: |
- npm install --global pnpm
- - name: Build Native programs
+ # Generate ignore pattern, excluding comments
+ ignore_pattern=$(grep -v '^#' .github/.ghaignore | grep -v '^$' | tr '\n' '|' | sed 's/|$//')
+ echo "Ignore pattern: $ignore_pattern"
+
+ function get_projects() {
+ find . -type d -name "native" | grep -vE "$ignore_pattern" | sort
+ }
+
+ # Determine which projects to build and test
+ if [[ "${{ github.event_name }}" == "push" || "${{ github.event_name }}" == "schedule" || "${{ steps.changes.outputs.workflow }}" == "true" ]]; then
+ projects=$(get_projects)
+ elif [[ "${{ steps.changes.outputs.native }}" == "true" ]]; then
+ changed_files=(${{ steps.changes.outputs.native_files }})
+ projects=$(for file in "${changed_files[@]}"; do dirname "${file}" | grep native | sed 's#/native/.*#/native#g'; done | grep -vE "$ignore_pattern" | sort -u)
+ else
+ projects=""
+ fi
+
+ # Output project information
+ if [[ -n "$projects" ]]; then
+ echo "Projects to build and test"
+ echo "$projects"
+ total_projects=$(echo "$projects" | wc -l)
+ echo "Total projects: $total_projects"
+ echo "total_projects=$total_projects" >> $GITHUB_OUTPUT
+ echo "changed_projects=$(echo "$projects" | jq -R -s -c 'split("\n")[:-1]')" >> $GITHUB_OUTPUT
+ else
+ echo "No projects to build and test."
+ echo "total_projects=0" >> $GITHUB_OUTPUT
+ echo "changed_projects=[]" >> $GITHUB_OUTPUT
+ fi
+ - name: Generate matrix
+ id: matrix
run: |
- declare -a ProjectDirs=($(find . -type d -name "native"| grep -v -f <(grep . .github/.ghaignore | grep -v '^$')))
- echo "Projects to Build:"
- printf "%s\n" "${ProjectDirs[@]}"
- for projectDir in "${ProjectDirs[@]}"; do
- echo "
- ********
- Building $projectDir
- ********"
- cd $projectDir
- if pnpm build; then
- echo "Build succeeded for $projectDir."
- else
- failed=true
- failed_builds+=($projectDir)
- echo "Build failed for $projectDir. Continuing with the next program."
- fi
- cd - > /dev/null
- done
- if [ "$failed" = true ]; then
- echo "Programs that failed building:"
- printf "%s\n" "${failed_builds[@]}"
- exit 1
+ total_projects=${{ steps.analyze.outputs.total_projects }}
+ max_jobs=${{ env.MAX_JOBS }}
+ min_projects_per_job=${{ env.MIN_PROJECTS_PER_JOB }}
+ min_projects_for_matrix=${{ env.MIN_PROJECTS_FOR_MATRIX }}
+
+ if [ "$total_projects" -lt "$min_projects_for_matrix" ]; then
+ echo "matrix=[0]" >> $GITHUB_OUTPUT
else
- echo "All programs built successfully."
+ projects_per_job=$(( (total_projects + max_jobs - 1) / max_jobs ))
+ projects_per_job=$(( projects_per_job > min_projects_per_job ? projects_per_job : min_projects_per_job ))
+ num_jobs=$(( (total_projects + projects_per_job - 1) / projects_per_job ))
+
+ indices=$(seq 0 $(( num_jobs - 1 )))
+ echo "matrix=[$(echo $indices | tr ' ' ',')]" >> $GITHUB_OUTPUT
fi
- shell: bash
- test:
+ build-and-test:
+ needs: changes
+ if: needs.changes.outputs.total_projects != '0'
runs-on: ubuntu-latest
strategy:
+ fail-fast: false
matrix:
- node-version: [20.x]
- solana-version: [1.18.17, stable]
+ index: ${{ fromJson(needs.changes.outputs.matrix) }}
+ name: build-and-test-group-${{ matrix.index }}
+ outputs:
+ failed_projects: ${{ steps.set-failed.outputs.failed_projects }}
steps:
- uses: actions/checkout@v4
- - name: Use Node.js ${{ matrix.node-version }}
+ - name: Use Node.js
uses: actions/setup-node@v4
with:
- node-version: ${{ matrix.node-version }}
+ node-version: 20.x
check-latest: true
- - uses: heyAyushh/setup-solana@v5.4
- with:
- solana-cli-version: ${{ matrix.solana-version }}
- - run: solana block
- shell: bash
- - name: Install pnpm
+ - name: Setup build environment
+ id: setup
run: |
+ # Create the build and test function
+ cat << 'EOF' > build_and_test.sh
+ function build_and_test() {
+ local project=$1
+ local solana_version=$2
+ echo "Building and Testing $project with Solana $solana_version"
+ cd "$project" || return 1
+
+ # Install dependencies
+ if ! pnpm install --frozen-lockfile; then
+ echo "::error::pnpm install failed for $project"
+ echo "$project: pnpm install failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt
+ cd - > /dev/null
+ return 1
+ fi
+
+ # Build
+ if ! pnpm build; then
+ echo "::error::build failed for $project"
+ echo "$project: build failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt
+ cd - > /dev/null
+ return 1
+ fi
+
+ # Test
+ if ! pnpm build-and-test; then
+ echo "::error::tests failed for $project"
+ echo "$project: tests failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt
+ cd - > /dev/null
+ return 1
+ fi
+
+ echo "Build and tests succeeded for $project with $solana_version version."
+ cd - > /dev/null
+ return 0
+ }
+
+ function process_projects() {
+ local solana_version=$1
+
+ readarray -t all_projects < <(echo '${{ needs.changes.outputs.changed_projects }}' | jq -r '.[]?')
+ start_index=$(( ${{ matrix.index }} * ${{ env.MIN_PROJECTS_PER_JOB }} ))
+ end_index=$(( start_index + ${{ env.MIN_PROJECTS_PER_JOB }} ))
+ end_index=$(( end_index > ${{ needs.changes.outputs.total_projects }} ? ${{ needs.changes.outputs.total_projects }} : end_index ))
+
+ echo "Projects to build and test in this job"
+ for i in $(seq $start_index $(( end_index - 1 ))); do
+ echo "${all_projects[$i]}"
+ done
+
+ failed=false
+ for i in $(seq $start_index $(( end_index - 1 ))); do
+ echo "::group::Building and testing ${all_projects[$i]}"
+ if ! build_and_test "${all_projects[$i]}" "$solana_version"; then
+ failed=true
+ fi
+ echo "::endgroup::"
+ done
+
+ return $([ "$failed" = true ] && echo 1 || echo 0)
+ }
+ EOF
+
+ # Make the script executable
+ chmod +x build_and_test.sh
+
+ # Install pnpm
npm install --global pnpm
- - name: Test solana native programs
+ - name: Setup Solana stable
+ uses: heyAyushh/setup-solana@v5.5
+ with:
+ solana-cli-version: stable
+ - name: Build and Test with Stable
+ run: |
+ source build_and_test.sh
+ solana -V
+ rustc -V
+ process_projects "stable"
+ - name: Setup Solana 1.18.17
+ uses: heyAyushh/setup-solana@v5.5
+ with:
+ solana-cli-version: 1.18.17
+ - name: Build and Test with 1.18.17
run: |
+ source build_and_test.sh
solana -V
rustc -V
- declare -a ProjectDirs=($(find . -type d -name "native"| grep -v -f <(grep . .github/.ghaignore | grep -v '^$')))
- echo "Projects to Test:"
- printf "%s\n" "${ProjectDirs[@]}"
- for projectDir in "${ProjectDirs[@]}"; do
- echo "
- ********
- Testing $projectDir
- ********"
- cd $projectDir
- pnpm install --frozen-lockfile
- if pnpm build-and-test; then
- echo "Tests succeeded for $projectDir."
+ process_projects "1.18.17"
+
+ - name: Set failed projects output
+ id: set-failed
+ if: failure()
+ run: |
+ if [ -f "$GITHUB_WORKSPACE/failed_projects.txt" ]; then
+ failed_projects=$(cat $GITHUB_WORKSPACE/failed_projects.txt | jq -R -s -c 'split("\n")[:-1]')
+ echo "failed_projects=$failed_projects" >> $GITHUB_OUTPUT
+ else
+ echo "failed_projects=[]" >> $GITHUB_OUTPUT
+ fi
+
+ summary:
+ needs: [changes, build-and-test]
+ if: always()
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Create job summary
+ run: |
+ echo "## Native Workflow Summary" >> $GITHUB_STEP_SUMMARY
+ echo "- Total projects: ${{ needs.changes.outputs.total_projects }}" >> $GITHUB_STEP_SUMMARY
+
+ # List all processed projects
+ echo "" >> $GITHUB_STEP_SUMMARY
+ echo "Projects processed (click to expand)
" >> $GITHUB_STEP_SUMMARY
+ echo "" >> $GITHUB_STEP_SUMMARY
+ echo '${{ needs.changes.outputs.changed_projects }}' | jq -r '.[]' | while read project; do
+ echo "- $project" >> $GITHUB_STEP_SUMMARY
+ done
+ echo "" >> $GITHUB_STEP_SUMMARY
+ echo " " >> $GITHUB_STEP_SUMMARY
+
+ # Report build and test results
+ if [[ "${{ needs.build-and-test.result }}" == "failure" ]]; then
+ echo "## :x: Build or tests failed" >> $GITHUB_STEP_SUMMARY
+ echo "" >> $GITHUB_STEP_SUMMARY
+ echo "Failed projects (click to expand)
" >> $GITHUB_STEP_SUMMARY
+ echo "" >> $GITHUB_STEP_SUMMARY
+ failed_projects='${{ needs.build-and-test.outputs.failed_projects }}'
+ if [[ -n "$failed_projects" ]]; then
+ echo "$failed_projects" | jq -r '.[]' | while IFS=: read -r project failure_reason; do
+ echo "- **$project**" >> $GITHUB_STEP_SUMMARY
+ echo " - Failure reason: $failure_reason" >> $GITHUB_STEP_SUMMARY
+ done
else
- failed=true
- failed_tests+=($projectDir)
- echo "Tests failed for $projectDir. Continuing with the next program."
+ echo "No failed projects reported. This might indicate an unexpected error in the workflow." >> $GITHUB_STEP_SUMMARY
fi
- cd - > /dev/null
- done
- if [ "$failed" = true ]; then
- echo "*****************************"
- echo "Programs that failed testing:"
- printf "%s\n" "${failed_tests[@]}"
- exit 1
+ echo "" >> $GITHUB_STEP_SUMMARY
+ echo " " >> $GITHUB_STEP_SUMMARY
+ elif [[ "${{ needs.build-and-test.result }}" == "success" ]]; then
+ echo "## :white_check_mark: All builds and tests passed" >> $GITHUB_STEP_SUMMARY
else
- echo "All tests passed."
+ echo "## :warning: Build and test job was skipped or canceled" >> $GITHUB_STEP_SUMMARY
fi
- shell: bash
diff --git a/.github/workflows/steel.yml b/.github/workflows/steel.yml
index 842222755..ac3a5e2e5 100644
--- a/.github/workflows/steel.yml
+++ b/.github/workflows/steel.yml
@@ -11,107 +11,327 @@ on:
branches:
- main
+env:
+ MAX_JOBS: 64
+ MIN_PROJECTS_PER_JOB: 4
+ MIN_PROJECTS_FOR_MATRIX: 4
+
jobs:
- build:
+ changes:
runs-on: ubuntu-latest
- strategy:
- matrix:
- node-version: [20.x]
- solana-version: [stable]
+ permissions:
+ pull-requests: read
+ outputs:
+ changed_projects: ${{ steps.analyze.outputs.changed_projects }}
+ total_projects: ${{ steps.analyze.outputs.total_projects }}
+ matrix: ${{ steps.matrix.outputs.matrix }}
steps:
- uses: actions/checkout@v4
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v4
+ - uses: dorny/paths-filter@v3
+ id: changes
+ if: github.event_name == 'pull_request'
with:
- node-version: ${{ matrix.node-version }}
- check-latest: true
- - uses: heyAyushh/setup-solana@v5.4
+ list-files: shell
+ filters: |
+ steel:
+ - added|modified: '**/steel/**'
+ workflow:
+ - added|modified: '.github/workflows/steel.yml'
+ - name: Analyze Changes
+ id: analyze
+ run: |
+ # Generate ignore pattern, excluding comments
+ ignore_pattern=$(grep -v '^#' .github/.ghaignore | grep -v '^$' | tr '\n' '|' | sed 's/|$//')
+ echo "Ignore pattern: $ignore_pattern"
+
+ function get_projects() {
+ find . -type d -name "steel" | grep -vE "$ignore_pattern" | sort
+ }
+
+ # Determine which projects to build and test
+ if [[ "${{ github.event_name }}" == "push" || "${{ github.event_name }}" == "schedule" || "${{ steps.changes.outputs.workflow }}" == "true" ]]; then
+ projects=$(get_projects)
+ elif [[ "${{ steps.changes.outputs.steel }}" == "true" ]]; then
+ changed_files=(${{ steps.changes.outputs.steel_files }})
+ projects=$(for file in "${changed_files[@]}"; do dirname "${file}" | grep steel | sed 's#/steel/.*#/steel#g'; done | grep -vE "$ignore_pattern" | sort -u)
+ else
+ projects=""
+ fi
+
+ # Output project information
+ if [[ -n "$projects" ]]; then
+ echo "Projects to build and test"
+ echo "$projects"
+ total_projects=$(echo "$projects" | wc -l)
+ echo "Total projects: $total_projects"
+ echo "total_projects=$total_projects" >> $GITHUB_OUTPUT
+ echo "changed_projects=$(echo "$projects" | jq -R -s -c 'split("\n")[:-1]')" >> $GITHUB_OUTPUT
+ else
+ echo "No projects to build and test."
+ echo "total_projects=0" >> $GITHUB_OUTPUT
+ echo "changed_projects=[]" >> $GITHUB_OUTPUT
+ fi
+ - name: Generate matrix
+ id: matrix
+ run: |
+ total_projects=${{ steps.analyze.outputs.total_projects }}
+ max_jobs=${{ env.MAX_JOBS }}
+ min_projects_per_job=${{ env.MIN_PROJECTS_PER_JOB }}
+ min_projects_for_matrix=${{ env.MIN_PROJECTS_FOR_MATRIX }}
+
+ if [ "$total_projects" -lt "$min_projects_for_matrix" ]; then
+ echo "matrix=[0]" >> $GITHUB_OUTPUT
+ else
+ projects_per_job=$(( (total_projects + max_jobs - 1) / max_jobs ))
+ projects_per_job=$(( projects_per_job > min_projects_per_job ? projects_per_job : min_projects_per_job ))
+ num_jobs=$(( (total_projects + projects_per_job - 1) / projects_per_job ))
+
+ indices=$(seq 0 $(( num_jobs - 1 )))
+ echo "matrix=[$(echo $indices | tr ' ' ',')]" >> $GITHUB_OUTPUT
+ fi
+
+ rust-checks:
+ needs: changes
+ if: ${{ github.event_name == 'pull_request' && needs.changes.outputs.total_projects != '0' }}
+ name: Rust Checks
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: dtolnay/rust-toolchain@stable
with:
- solana-cli-version: ${{ matrix.solana-version }}
- - run: solana block
- shell: bash
- - name: Install pnpm
+ components: rustfmt, clippy
+ - name: Run sccache-cache
+ if: github.event_name != 'release'
+ uses: mozilla-actions/sccache-action@v0.0.6
+ - name: Set Rust cache env vars
+ if: github.event_name != 'release'
run: |
- npm install --global pnpm
- - name: Build Steel native programs
+ echo "SCCACHE_GHA_ENABLED=true" >> $GITHUB_ENV
+ echo "RUSTC_WRAPPER=sccache" >> $GITHUB_ENV
+ - name: Run fmt and clippy
run: |
- declare -a ProjectDirs=($(find . -type d -name "steel"| grep -v -f <(grep . .github/.ghaignore | grep -v '^$')))
- echo "Projects to Build:"
- printf "%s\n" "${ProjectDirs[@]}"
- for projectDir in "${ProjectDirs[@]}"; do
- echo "
- ********
- Building $projectDir
- ********"
- cd $projectDir
- if pnpm build; then
- echo "Build succeeded for $projectDir."
- else
- failed=true
- failed_builds+=($projectDir)
- echo "Build failed for $projectDir. Continuing with the next program."
+ readarray -t all_projects < <(echo '${{ needs.changes.outputs.changed_projects }}' | jq -r '.[]?')
+ for project in "${all_projects[@]}"; do
+ echo "::group::Checking ${project}"
+ if [ ! -f "${project}/Cargo.toml" ]; then
+ echo "::error::No Cargo.toml found in ${project}"
+ exit 1
fi
- cd - > /dev/null
+ cd "${project}"
+ cargo fmt --check
+ cargo clippy --all-features -- -D warnings
+ cd - > /dev/null
+ echo "::endgroup::"
done
- if [ "$failed" = true ]; then
- echo "Programs that failed building:"
- printf "%s\n" "${failed_builds[@]}"
- exit 1
- else
- echo "All programs built successfully."
- fi
- shell: bash
- test:
+ build-and-test:
+ needs: changes
+ if: needs.changes.outputs.total_projects != '0'
runs-on: ubuntu-latest
strategy:
+ fail-fast: false
matrix:
- node-version: [20.x]
- solana-version: [1.18.17, stable]
+ index: ${{ fromJson(needs.changes.outputs.matrix) }}
+ name: build-and-test-group-${{ matrix.index }}
+ outputs:
+ failed_projects: ${{ steps.set-failed.outputs.failed_projects }}
steps:
- uses: actions/checkout@v4
- - name: Use Node.js ${{ matrix.node-version }}
+ - uses: dtolnay/rust-toolchain@stable
+ - name: Run sccache-cache
+ if: github.event_name != 'release'
+ uses: mozilla-actions/sccache-action@v0.0.6
+ - name: Set Rust cache env vars
+ if: github.event_name != 'release'
+ run: |
+ echo "SCCACHE_GHA_ENABLED=true" >> $GITHUB_ENV
+ echo "RUSTC_WRAPPER=sccache" >> $GITHUB_ENV
+ - uses: actions/cache@v3
+ with:
+ path: ~/.cargo/bin/steel
+ key: ${{ runner.os }}-steel-cli
+ - name: Use Node.js
uses: actions/setup-node@v4
with:
- node-version: ${{ matrix.node-version }}
+ node-version: 20.x
check-latest: true
- - uses: heyAyushh/setup-solana@v5.4
- with:
- solana-cli-version: ${{ matrix.solana-version }}
- - run: solana block
- shell: bash
- - name: Install pnpm
+ - name: Setup build environment
+ id: setup
run: |
npm install --global pnpm
- - name: Test Steel native programs
+
+ # Create the build and test function
+ cat << 'EOF' > build_and_test.sh
+ function build_and_test() {
+ local project=$1
+ local solana_version=$2
+ echo "Building and Testing $project with Solana $solana_version"
+ cd "$project" || return 1
+
+ # Install dependencies
+ if [ -f "package.json" ]; then
+ if ! pnpm install --frozen-lockfile; then
+ echo "::error::pnpm install failed for $project"
+ echo "$project: pnpm install failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt
+ cd - > /dev/null
+ return 1
+ fi
+
+ # Build
+ if ! pnpm build; then
+ echo "::error::build failed for $project"
+ echo "$project: build failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt
+ cd - > /dev/null
+ return 1
+ fi
+
+ # Test
+ if ! pnpm build-and-test; then
+ echo "::error::tests failed for $project"
+ echo "$project: tests failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt
+ cd - > /dev/null
+ return 1
+ fi
+ else
+ # Use Steel CLI
+ if ! cargo install --quiet steel-cli; then
+ echo "::error::steel-cli installation failed for $project"
+ echo "$project: steel-cli installation failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt
+ cd - > /dev/null
+ return 1
+ fi
+
+ # Build
+ if ! steel build; then
+ echo "::error::steel build failed for $project"
+ echo "$project: steel build failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt
+ cd - > /dev/null
+ return 1
+ fi
+
+ # Test
+ if ! steel test; then
+ echo "::error::steel test failed for $project"
+ echo "$project: steel test failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt
+ cd - > /dev/null
+ return 1
+ fi
+ fi
+
+ echo "Build and tests succeeded for $project with $solana_version version."
+ cd - > /dev/null
+ return 0
+ }
+
+ function process_projects() {
+ local solana_version=$1
+
+ readarray -t all_projects < <(echo '${{ needs.changes.outputs.changed_projects }}' | jq -r '.[]?')
+ start_index=$(( ${{ matrix.index }} * ${{ env.MIN_PROJECTS_PER_JOB }} ))
+ end_index=$(( start_index + ${{ env.MIN_PROJECTS_PER_JOB }} ))
+ end_index=$(( end_index > ${{ needs.changes.outputs.total_projects }} ? ${{ needs.changes.outputs.total_projects }} : end_index ))
+
+ echo "Projects to build and test in this job"
+ for i in $(seq $start_index $(( end_index - 1 ))); do
+ echo "${all_projects[$i]}"
+ done
+
+ failed=false
+ for i in $(seq $start_index $(( end_index - 1 ))); do
+ echo "::group::Building and testing ${all_projects[$i]}"
+ if ! build_and_test "${all_projects[$i]}" "$solana_version"; then
+ failed=true
+ fi
+ echo "::endgroup::"
+ done
+
+ return $([ "$failed" = true ] && echo 1 || echo 0)
+ }
+ EOF
+
+ # Make the script executable
+ chmod +x build_and_test.sh
+
+ - name: Setup Solana stable
+ uses: heyAyushh/setup-solana@v5.4
+ with:
+ solana-cli-version: stable
+ - name: Build and Test with Stable
+ env:
+ SCCACHE_GHA_ENABLED: "true"
+ RUSTC_WRAPPER: "sccache"
run: |
+ source build_and_test.sh
solana -V
rustc -V
- declare -a ProjectDirs=($(find . -type d -name "steel"| grep -v -f <(grep . .github/.ghaignore | grep -v '^$')))
- echo "Projects to Test:"
- printf "%s\n" "${ProjectDirs[@]}"
- for projectDir in "${ProjectDirs[@]}"; do
- echo "
- ********
- Testing $projectDir
- ********"
- cd $projectDir
- pnpm install --frozen-lockfile
- if pnpm build-and-test; then
- echo "Tests succeeded for $projectDir."
+ process_projects "stable"
+ sccache --show-stats
+ - name: Setup Solana 1.18.17
+ uses: heyAyushh/setup-solana@v5.4
+ with:
+ solana-cli-version: 1.18.17
+ - name: Build and Test with 1.18.17
+ env:
+ SCCACHE_GHA_ENABLED: "true"
+ RUSTC_WRAPPER: "sccache"
+ run: |
+ source build_and_test.sh
+ solana -V
+ rustc -V
+ process_projects "1.18.17"
+ sccache --show-stats
+
+ - name: Set failed projects output
+ id: set-failed
+ if: failure()
+ run: |
+ if [ -f "$GITHUB_WORKSPACE/failed_projects.txt" ]; then
+ failed_projects=$(cat $GITHUB_WORKSPACE/failed_projects.txt | jq -R -s -c 'split("\n")[:-1]')
+ echo "failed_projects=$failed_projects" >> $GITHUB_OUTPUT
+ else
+ echo "failed_projects=[]" >> $GITHUB_OUTPUT
+ fi
+
+ summary:
+ needs: [changes, build-and-test]
+ if: always()
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - name: Create job summary
+ run: |
+ echo "## Steel Workflow Summary" >> $GITHUB_STEP_SUMMARY
+ echo "- Total projects: ${{ needs.changes.outputs.total_projects }}" >> $GITHUB_STEP_SUMMARY
+
+ # List all processed projects
+ echo "" >> $GITHUB_STEP_SUMMARY
+ echo "Projects processed (click to expand)
" >> $GITHUB_STEP_SUMMARY
+ echo "" >> $GITHUB_STEP_SUMMARY
+ echo '${{ needs.changes.outputs.changed_projects }}' | jq -r '.[]' | while read project; do
+ echo "- $project" >> $GITHUB_STEP_SUMMARY
+ done
+ echo "" >> $GITHUB_STEP_SUMMARY
+ echo " " >> $GITHUB_STEP_SUMMARY
+
+ # Report build and test results
+ if [[ "${{ needs.build-and-test.result }}" == "failure" ]]; then
+ echo "## :x: Build or tests failed" >> $GITHUB_STEP_SUMMARY
+ echo "" >> $GITHUB_STEP_SUMMARY
+ echo "Failed projects (click to expand)
" >> $GITHUB_STEP_SUMMARY
+ echo "" >> $GITHUB_STEP_SUMMARY
+ failed_projects='${{ needs.build-and-test.outputs.failed_projects }}'
+ if [[ -n "$failed_projects" ]]; then
+ echo "$failed_projects" | jq -r '.[]' | while IFS=: read -r project failure_reason; do
+ echo "- **$project**" >> $GITHUB_STEP_SUMMARY
+ echo " - Failure reason: $failure_reason" >> $GITHUB_STEP_SUMMARY
+ done
else
- failed=true
- failed_tests+=($projectDir)
- echo "Tests failed for $projectDir. Continuing with the next program."
+ echo "No failed projects reported. This might indicate an unexpected error in the workflow." >> $GITHUB_STEP_SUMMARY
fi
- cd - > /dev/null
- done
- if [ "$failed" = true ]; then
- echo "*****************************"
- echo "Programs that failed testing:"
- printf "%s\n" "${failed_tests[@]}"
- exit 1
+ echo "" >> $GITHUB_STEP_SUMMARY
+ echo " " >> $GITHUB_STEP_SUMMARY
+ elif [[ "${{ needs.build-and-test.result }}" == "success" ]]; then
+ echo "## :white_check_mark: All builds and tests passed" >> $GITHUB_STEP_SUMMARY
else
- echo "All tests passed."
+ echo "## :warning: Build and test job was skipped or canceled" >> $GITHUB_STEP_SUMMARY
fi
- shell: bash
diff --git a/.husky/pre-commit b/.husky/pre-commit
index a16d8b1d5..2312dc587 100644
--- a/.husky/pre-commit
+++ b/.husky/pre-commit
@@ -1,4 +1 @@
-#!/usr/bin/env sh
-. "$(dirname "$0")/_/husky.sh"
-
npx lint-staged
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index ed0528a34..554928614 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -16,17 +16,46 @@ We welcome contributions in the form of code, documentation, bug reports, featur
## General coding and writing guidelines
-Please follow the [Contributing and Style Guide from the Developer Content Repo](https://github.com/solana-foundation/developer-content/blob/main/CONTRIBUTING.md).
+Please follow the [Contributing and Style Guide from the Developer Content Repo](https://github.com/solana-foundation/developer-content/blob/main/CONTRIBUTING.md).
Specifically for code in this repo:
1. Use pnpm as the default package manager for the project. You can [install pnpm by following the instructions](https://pnpm.io/installation). Commit `pnpm-lock.yaml` to the repository.
-2. Anchor programs should be in directory `anchor`, programs written for Solana Native should be in directory `native`, TypeScript in `poseidon` and Python in `seahorse`.
+2. Solana Programs written for Anchor framework should be in directory (`anchor`)[https://www.anchor-lang.com], Solana Native in (`native`)[https://solana.com/developers/guides/getstarted/intro-to-native-rust], Steel Framework in (`steel`)[https://github.com/regolith-labs/steel], TypeScript in (`poseidon`)[https://github.com/Turbin3/poseidon], respectively.
+ - Project path structure: `/program-examples/category/example-name/`
+ - Project path structure example for anchor: `/program-examples/category/example-name/anchor`
3. Tests for Solana native programs, steel framework programs, and Anchor should be written with [solana-bankrun](https://kevinheavey.github.io/solana-bankrun)
-4. For Solana native programs and Steel framework programs ensure adding these mandatory pnpm run scripts to your `package.json` file for successful CI/CD builds:
+4. Steel framework programs must be organized as a Cargo workspace with separate projects for API and program:
+ - Project path structure: `/program-examples/category/example-name/steel`
+ - Initialise project using `steel new `
+ - Must be a Cargo workspace with two separate projects:
+ - `api`: Contains API-related code
+ - `program`: Contains the program implementation
+ - Steel projects should NOT be added in the root [`Cargo.toml` file](https://github.com/solana-developers/program-examples/blob/main/Cargo.toml)
+
+ This structure ensures proper organization and separation of concerns.
+
+5. For Steel framework programs:
+ - Steel CLI is the recommended way to build and test programs:
+ ```bash
+ # Install Steel CLI (one-time setup)
+ cargo install steel-cli
+
+ # Create a new Steel project
+ steel new
+
+ # Build the program
+ steel build
+
+ # Run tests
+ steel test
+ ```
+ - Alternatively, you can use package.json scripts if you need custom build/test configurations as Solana native one described below.
+
+6. For Solana native programs ensure adding these mandatory pnpm run scripts to your `package.json` file for successful CI/CD builds:
```json
"scripts": {
@@ -37,20 +66,33 @@ Specifically for code in this repo:
},
```
-5. Test command for Anchor should execute `pnpm test` instead of `yarn run test` for anchor programs. Replace `yarn` with `pnpm` in `[script]` table inside [Anchor.toml file.](https://www.anchor-lang.com/docs/manifest#scripts-required-for-testing)
+Alternatively, You can add `steel test` and `steel build` as commands according to your project.
-6. TypeScript, JavaScript and JSON files are formatted and linted using
+"scripts": {
+ "test": "steel test",
+ "build-and-test": "steel build && steel test",
+ "build": "steel build",
+ "deploy": "solana program deploy ./program/target/so/program.so"
+},
+
+7. Test command for Anchor should execute `pnpm test` instead of `yarn run test` for anchor programs. Replace `yarn` with `pnpm` in `[script]` table inside [Anchor.toml file.](https://www.anchor-lang.com/docs/manifest#scripts-required-for-testing)
+
+```
+[scripts]
+test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts"
+```
+
+8. TypeScript, JavaScript and JSON files are formatted and linted using
[Biome](https://biomejs.dev/). Execute the following command to format and lint your code at the root of this project before submitting a pull request:
```bash
-pnpm check:fix
+pnpm fix
```
-7. Some projects can be ignored from the building and testing process by adding the project name to the `.gitignore` file.
+9. Some projects can be ignored from the building and testing process by adding the project name to the `.gitignore` file.
When removing or updating an example, please ensure that the example is removed from the `.gitignore` file
and there's a change in that example's directory.
-
## Code of Conduct
We are committed to providing a friendly, safe, and welcoming environment for all contributors, regardless of their background, experience level, or personal characteristics. As a contributor, you are expected to:
diff --git a/Cargo.toml b/Cargo.toml
index c13e8b8c0..0b9149215 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -15,7 +15,6 @@ members = [
"basics/cross-program-invocation/anchor/programs/*",
"basics/hello-solana/native/program",
"basics/hello-solana/anchor/programs/*",
- "basics/hello-solana/steel/program",
"basics/pda-rent-payer/native/program",
"basics/pda-rent-payer/anchor/programs/*",
"basics/processing-instructions/native/program",
diff --git a/basics/hello-solana/native/package.json b/basics/hello-solana/native/package.json
index e772d7dca..76cd4def3 100644
--- a/basics/hello-solana/native/package.json
+++ b/basics/hello-solana/native/package.json
@@ -1,6 +1,6 @@
{
"scripts": {
- "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts",
+ "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/index.test.ts",
"build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test",
"build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so",
"deploy": "solana program deploy ./program/target/so/hello_solana_program.so"
diff --git a/basics/hello-solana/native/tests/test.ts b/basics/hello-solana/native/tests/index.test.ts
similarity index 100%
rename from basics/hello-solana/native/tests/test.ts
rename to basics/hello-solana/native/tests/index.test.ts
diff --git a/basics/hello-solana/poseidon/.gitignore b/basics/hello-solana/poseidon/.gitignore
new file mode 100644
index 000000000..2e0446b07
--- /dev/null
+++ b/basics/hello-solana/poseidon/.gitignore
@@ -0,0 +1,7 @@
+.anchor
+.DS_Store
+target
+**/*.rs.bk
+node_modules
+test-ledger
+.yarn
diff --git a/basics/hello-solana/poseidon/.prettierignore b/basics/hello-solana/poseidon/.prettierignore
new file mode 100644
index 000000000..414258343
--- /dev/null
+++ b/basics/hello-solana/poseidon/.prettierignore
@@ -0,0 +1,7 @@
+.anchor
+.DS_Store
+target
+node_modules
+dist
+build
+test-ledger
diff --git a/basics/hello-solana/poseidon/Anchor.toml b/basics/hello-solana/poseidon/Anchor.toml
new file mode 100644
index 000000000..cd7e6a9ac
--- /dev/null
+++ b/basics/hello-solana/poseidon/Anchor.toml
@@ -0,0 +1,18 @@
+[toolchain]
+
+[features]
+resolution = true
+skip-lint = false
+
+[programs.localnet]
+hello_solana = "84mLf5VZKf58tQ1VkUtsthxuR8fSeDLv8ZKemANC53oF"
+
+[registry]
+url = "https://api.apr.dev"
+
+[provider]
+cluster = "Localnet"
+wallet = "~/.config/solana/id.json"
+
+[scripts]
+test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts"
diff --git a/basics/hello-solana/poseidon/Cargo.toml b/basics/hello-solana/poseidon/Cargo.toml
new file mode 100644
index 000000000..f39770481
--- /dev/null
+++ b/basics/hello-solana/poseidon/Cargo.toml
@@ -0,0 +1,14 @@
+[workspace]
+members = [
+ "programs/*"
+]
+resolver = "2"
+
+[profile.release]
+overflow-checks = true
+lto = "fat"
+codegen-units = 1
+[profile.release.build-override]
+opt-level = 3
+incremental = false
+codegen-units = 1
diff --git a/basics/hello-solana/poseidon/migrations/deploy.ts b/basics/hello-solana/poseidon/migrations/deploy.ts
new file mode 100644
index 000000000..64a1c3599
--- /dev/null
+++ b/basics/hello-solana/poseidon/migrations/deploy.ts
@@ -0,0 +1,12 @@
+// Migrations are an early feature. Currently, they're nothing more than this
+// single deploy script that's invoked from the CLI, injecting a provider
+// configured from the workspace's Anchor.toml.
+
+const anchor = require('@coral-xyz/anchor');
+
+module.exports = async (provider) => {
+ // Configure client to use the provider.
+ anchor.setProvider(provider);
+
+ // Add your deploy script here.
+};
diff --git a/basics/hello-solana/poseidon/package.json b/basics/hello-solana/poseidon/package.json
new file mode 100644
index 000000000..b036f2ff6
--- /dev/null
+++ b/basics/hello-solana/poseidon/package.json
@@ -0,0 +1,20 @@
+{
+ "license": "ISC",
+ "scripts": {
+ "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w",
+ "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check"
+ },
+ "dependencies": {
+ "@coral-xyz/anchor": "^0.30.1"
+ },
+ "devDependencies": {
+ "chai": "^4.3.4",
+ "mocha": "^9.0.3",
+ "ts-mocha": "^10.0.0",
+ "@types/bn.js": "^5.1.0",
+ "@types/chai": "^4.3.0",
+ "@types/mocha": "^9.0.0",
+ "typescript": "^4.3.5",
+ "prettier": "^2.6.2"
+ }
+}
diff --git a/basics/hello-solana/poseidon/pnpm-lock.yaml b/basics/hello-solana/poseidon/pnpm-lock.yaml
new file mode 100644
index 000000000..6b827e36f
--- /dev/null
+++ b/basics/hello-solana/poseidon/pnpm-lock.yaml
@@ -0,0 +1,1387 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ dependencies:
+ '@coral-xyz/anchor':
+ specifier: ^0.30.1
+ version: 0.30.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+ devDependencies:
+ '@types/bn.js':
+ specifier: ^5.1.0
+ version: 5.1.6
+ '@types/chai':
+ specifier: ^4.3.0
+ version: 4.3.20
+ '@types/mocha':
+ specifier: ^9.0.0
+ version: 9.1.1
+ chai:
+ specifier: ^4.3.4
+ version: 4.5.0
+ mocha:
+ specifier: ^9.0.3
+ version: 9.2.2
+ prettier:
+ specifier: ^2.6.2
+ version: 2.8.8
+ ts-mocha:
+ specifier: ^10.0.0
+ version: 10.0.0(mocha@9.2.2)
+ typescript:
+ specifier: ^4.3.5
+ version: 4.9.5
+
+packages:
+
+ '@babel/runtime@7.26.0':
+ resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==}
+ engines: {node: '>=6.9.0'}
+
+ '@coral-xyz/anchor-errors@0.30.1':
+ resolution: {integrity: sha512-9Mkradf5yS5xiLWrl9WrpjqOrAV+/W2RQHDlbnAZBivoGpOs1ECjoDCkVk4aRG8ZdiFiB8zQEVlxf+8fKkmSfQ==}
+ engines: {node: '>=10'}
+
+ '@coral-xyz/anchor@0.30.1':
+ resolution: {integrity: sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ==}
+ engines: {node: '>=11'}
+
+ '@coral-xyz/borsh@0.30.1':
+ resolution: {integrity: sha512-aaxswpPrCFKl8vZTbxLssA2RvwX2zmKLlRCIktJOwW+VpVwYtXRtlWiIP+c2pPRKneiTiWCN2GEMSH9j1zTlWQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@solana/web3.js': ^1.68.0
+
+ '@noble/curves@1.6.0':
+ resolution: {integrity: sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==}
+ engines: {node: ^14.21.3 || >=16}
+
+ '@noble/hashes@1.5.0':
+ resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==}
+ engines: {node: ^14.21.3 || >=16}
+
+ '@solana/buffer-layout@4.0.1':
+ resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==}
+ engines: {node: '>=5.10'}
+
+ '@solana/web3.js@1.95.5':
+ resolution: {integrity: sha512-hU9cBrbg1z6gEjLH9vwIckGBVB78Ijm0iZFNk4ocm5OD82piPwuk3MeQ1rfiKD9YQtr95krrcaopb49EmQJlRg==}
+
+ '@swc/helpers@0.5.15':
+ resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
+
+ '@types/bn.js@5.1.6':
+ resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==}
+
+ '@types/chai@4.3.20':
+ resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==}
+
+ '@types/connect@3.4.38':
+ resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==}
+
+ '@types/json5@0.0.29':
+ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+
+ '@types/mocha@9.1.1':
+ resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==}
+
+ '@types/node@12.20.55':
+ resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
+
+ '@types/node@22.9.1':
+ resolution: {integrity: sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg==}
+
+ '@types/uuid@8.3.4':
+ resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==}
+
+ '@types/ws@7.4.7':
+ resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==}
+
+ '@types/ws@8.5.13':
+ resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==}
+
+ '@ungap/promise-all-settled@1.1.2':
+ resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==}
+
+ JSONStream@1.3.5:
+ resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
+ hasBin: true
+
+ agentkeepalive@4.5.0:
+ resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==}
+ engines: {node: '>= 8.0.0'}
+
+ ansi-colors@4.1.1:
+ resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==}
+ engines: {node: '>=6'}
+
+ ansi-regex@5.0.1:
+ resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+ engines: {node: '>=8'}
+
+ ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
+ argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+ arrify@1.0.1:
+ resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==}
+ engines: {node: '>=0.10.0'}
+
+ assertion-error@1.1.0:
+ resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
+
+ balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+ base-x@3.0.10:
+ resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==}
+
+ base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ bigint-buffer@1.1.5:
+ resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==}
+ engines: {node: '>= 10.0.0'}
+
+ binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+
+ bindings@1.5.0:
+ resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==}
+
+ bn.js@5.2.1:
+ resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==}
+
+ borsh@0.7.0:
+ resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==}
+
+ brace-expansion@1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ browser-stdout@1.3.1:
+ resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==}
+
+ bs58@4.0.1:
+ resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==}
+
+ buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+ buffer-layout@1.2.2:
+ resolution: {integrity: sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==}
+ engines: {node: '>=4.5'}
+
+ buffer@6.0.3:
+ resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==}
+
+ bufferutil@4.0.8:
+ resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==}
+ engines: {node: '>=6.14.2'}
+
+ camelcase@6.3.0:
+ resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+ engines: {node: '>=10'}
+
+ chai@4.5.0:
+ resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==}
+ engines: {node: '>=4'}
+
+ chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+
+ check-error@1.0.3:
+ resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==}
+
+ chokidar@3.5.3:
+ resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
+ engines: {node: '>= 8.10.0'}
+
+ cliui@7.0.4:
+ resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
+
+ color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+
+ color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ commander@2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
+ concat-map@0.0.1:
+ resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=}
+
+ cross-fetch@3.1.8:
+ resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==}
+
+ crypto-hash@1.3.0:
+ resolution: {integrity: sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==}
+ engines: {node: '>=8'}
+
+ debug@4.3.3:
+ resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
+ decamelize@4.0.0:
+ resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==}
+ engines: {node: '>=10'}
+
+ deep-eql@4.1.4:
+ resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==}
+ engines: {node: '>=6'}
+
+ delay@5.0.0:
+ resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==}
+ engines: {node: '>=10'}
+
+ diff@3.5.0:
+ resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==}
+ engines: {node: '>=0.3.1'}
+
+ diff@5.0.0:
+ resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==}
+ engines: {node: '>=0.3.1'}
+
+ dot-case@3.0.4:
+ resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+
+ emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ es6-promise@4.2.8:
+ resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==}
+
+ es6-promisify@5.0.0:
+ resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==}
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+
+ eventemitter3@4.0.7:
+ resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
+
+ eventemitter3@5.0.1:
+ resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+
+ eyes@0.1.8:
+ resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==}
+ engines: {node: '> 0.1.90'}
+
+ fast-stable-stringify@1.0.0:
+ resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==}
+
+ file-uri-to-path@1.0.0:
+ resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==}
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
+ find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+
+ flat@5.0.2:
+ resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==}
+ hasBin: true
+
+ fs.realpath@1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ get-caller-file@2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+
+ get-func-name@2.0.2:
+ resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==}
+
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ glob@7.2.0:
+ resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==}
+ deprecated: Glob versions prior to v9 are no longer supported
+
+ growl@1.10.5:
+ resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==}
+ engines: {node: '>=4.x'}
+
+ has-flag@4.0.0:
+ resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+ engines: {node: '>=8'}
+
+ he@1.2.0:
+ resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+ hasBin: true
+
+ humanize-ms@1.2.1:
+ resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==}
+
+ ieee754@1.2.1:
+ resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+
+ inflight@1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
+
+ inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ is-plain-obj@2.1.0:
+ resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==}
+ engines: {node: '>=8'}
+
+ is-unicode-supported@0.1.0:
+ resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+ engines: {node: '>=10'}
+
+ isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+ isomorphic-ws@4.0.1:
+ resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==}
+ peerDependencies:
+ ws: '*'
+
+ jayson@4.1.2:
+ resolution: {integrity: sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA==}
+ engines: {node: '>=8'}
+ hasBin: true
+
+ js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+
+ json-stringify-safe@5.0.1:
+ resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
+
+ json5@1.0.2:
+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+ hasBin: true
+
+ jsonparse@1.3.1:
+ resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
+ engines: {'0': node >= 0.2.0}
+
+ locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+
+ log-symbols@4.1.0:
+ resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+ engines: {node: '>=10'}
+
+ loupe@2.3.7:
+ resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
+
+ lower-case@2.0.2:
+ resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+
+ make-error@1.3.6:
+ resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+
+ minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+
+ minimatch@4.2.1:
+ resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==}
+ engines: {node: '>=10'}
+
+ minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ mkdirp@0.5.6:
+ resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
+ hasBin: true
+
+ mocha@9.2.2:
+ resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==}
+ engines: {node: '>= 12.0.0'}
+ hasBin: true
+
+ ms@2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+
+ ms@2.1.3:
+ resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+
+ nanoid@3.3.1:
+ resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ no-case@3.0.4:
+ resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+
+ node-fetch@2.7.0:
+ resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==}
+ engines: {node: 4.x || >=6.0.0}
+ peerDependencies:
+ encoding: ^0.1.0
+ peerDependenciesMeta:
+ encoding:
+ optional: true
+
+ node-gyp-build@4.8.4:
+ resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==}
+ hasBin: true
+
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
+ once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+
+ p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+
+ p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+
+ pako@2.1.0:
+ resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==}
+
+ path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+
+ path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+
+ pathval@1.1.1:
+ resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
+
+ picomatch@2.3.1:
+ resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+ engines: {node: '>=8.6'}
+
+ prettier@2.8.8:
+ resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
+
+ randombytes@2.1.0:
+ resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+
+ readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+
+ regenerator-runtime@0.14.1:
+ resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
+ require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+
+ rpc-websockets@9.0.4:
+ resolution: {integrity: sha512-yWZWN0M+bivtoNLnaDbtny4XchdAIF5Q4g/ZsC5UC61Ckbp0QczwO8fg44rV3uYmY4WHd+EZQbn90W1d8ojzqQ==}
+
+ safe-buffer@5.2.1:
+ resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+ serialize-javascript@6.0.0:
+ resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==}
+
+ snake-case@3.0.4:
+ resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==}
+
+ source-map-support@0.5.21:
+ resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+
+ source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+
+ string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+
+ strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+
+ strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+
+ superstruct@0.15.5:
+ resolution: {integrity: sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==}
+
+ superstruct@2.0.2:
+ resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==}
+ engines: {node: '>=14.0.0'}
+
+ supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+
+ supports-color@8.1.1:
+ resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+ engines: {node: '>=10'}
+
+ text-encoding-utf-8@1.0.2:
+ resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==}
+
+ through@2.3.8:
+ resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ toml@3.0.0:
+ resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==}
+
+ tr46@0.0.3:
+ resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+
+ ts-mocha@10.0.0:
+ resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==}
+ engines: {node: '>= 6.X.X'}
+ hasBin: true
+ peerDependencies:
+ mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X
+
+ ts-node@7.0.1:
+ resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==}
+ engines: {node: '>=4.2.0'}
+ hasBin: true
+
+ tsconfig-paths@3.15.0:
+ resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ type-detect@4.1.0:
+ resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==}
+ engines: {node: '>=4'}
+
+ typescript@4.9.5:
+ resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==}
+ engines: {node: '>=4.2.0'}
+ hasBin: true
+
+ undici-types@6.19.8:
+ resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
+
+ utf-8-validate@5.0.10:
+ resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==}
+ engines: {node: '>=6.14.2'}
+
+ uuid@8.3.2:
+ resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
+ hasBin: true
+
+ webidl-conversions@3.0.1:
+ resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+
+ whatwg-url@5.0.0:
+ resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+
+ which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+
+ workerpool@6.2.0:
+ resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==}
+
+ wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+
+ wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+ ws@7.5.10:
+ resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==}
+ engines: {node: '>=8.3.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: ^5.0.2
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+
+ ws@8.18.0:
+ resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+
+ y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+
+ yargs-parser@20.2.4:
+ resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==}
+ engines: {node: '>=10'}
+
+ yargs-unparser@2.0.0:
+ resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==}
+ engines: {node: '>=10'}
+
+ yargs@16.2.0:
+ resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==}
+ engines: {node: '>=10'}
+
+ yn@2.0.0:
+ resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==}
+ engines: {node: '>=4'}
+
+ yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+
+snapshots:
+
+ '@babel/runtime@7.26.0':
+ dependencies:
+ regenerator-runtime: 0.14.1
+
+ '@coral-xyz/anchor-errors@0.30.1': {}
+
+ '@coral-xyz/anchor@0.30.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)':
+ dependencies:
+ '@coral-xyz/anchor-errors': 0.30.1
+ '@coral-xyz/borsh': 0.30.1(@solana/web3.js@1.95.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))
+ '@noble/hashes': 1.5.0
+ '@solana/web3.js': 1.95.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+ bn.js: 5.2.1
+ bs58: 4.0.1
+ buffer-layout: 1.2.2
+ camelcase: 6.3.0
+ cross-fetch: 3.1.8
+ crypto-hash: 1.3.0
+ eventemitter3: 4.0.7
+ pako: 2.1.0
+ snake-case: 3.0.4
+ superstruct: 0.15.5
+ toml: 3.0.0
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - utf-8-validate
+
+ '@coral-xyz/borsh@0.30.1(@solana/web3.js@1.95.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))':
+ dependencies:
+ '@solana/web3.js': 1.95.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+ bn.js: 5.2.1
+ buffer-layout: 1.2.2
+
+ '@noble/curves@1.6.0':
+ dependencies:
+ '@noble/hashes': 1.5.0
+
+ '@noble/hashes@1.5.0': {}
+
+ '@solana/buffer-layout@4.0.1':
+ dependencies:
+ buffer: 6.0.3
+
+ '@solana/web3.js@1.95.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)':
+ dependencies:
+ '@babel/runtime': 7.26.0
+ '@noble/curves': 1.6.0
+ '@noble/hashes': 1.5.0
+ '@solana/buffer-layout': 4.0.1
+ agentkeepalive: 4.5.0
+ bigint-buffer: 1.1.5
+ bn.js: 5.2.1
+ borsh: 0.7.0
+ bs58: 4.0.1
+ buffer: 6.0.3
+ fast-stable-stringify: 1.0.0
+ jayson: 4.1.2(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+ node-fetch: 2.7.0
+ rpc-websockets: 9.0.4
+ superstruct: 2.0.2
+ transitivePeerDependencies:
+ - bufferutil
+ - encoding
+ - utf-8-validate
+
+ '@swc/helpers@0.5.15':
+ dependencies:
+ tslib: 2.8.1
+
+ '@types/bn.js@5.1.6':
+ dependencies:
+ '@types/node': 22.9.1
+
+ '@types/chai@4.3.20': {}
+
+ '@types/connect@3.4.38':
+ dependencies:
+ '@types/node': 12.20.55
+
+ '@types/json5@0.0.29':
+ optional: true
+
+ '@types/mocha@9.1.1': {}
+
+ '@types/node@12.20.55': {}
+
+ '@types/node@22.9.1':
+ dependencies:
+ undici-types: 6.19.8
+
+ '@types/uuid@8.3.4': {}
+
+ '@types/ws@7.4.7':
+ dependencies:
+ '@types/node': 12.20.55
+
+ '@types/ws@8.5.13':
+ dependencies:
+ '@types/node': 22.9.1
+
+ '@ungap/promise-all-settled@1.1.2': {}
+
+ JSONStream@1.3.5:
+ dependencies:
+ jsonparse: 1.3.1
+ through: 2.3.8
+
+ agentkeepalive@4.5.0:
+ dependencies:
+ humanize-ms: 1.2.1
+
+ ansi-colors@4.1.1: {}
+
+ ansi-regex@5.0.1: {}
+
+ ansi-styles@4.3.0:
+ dependencies:
+ color-convert: 2.0.1
+
+ anymatch@3.1.3:
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+
+ argparse@2.0.1: {}
+
+ arrify@1.0.1: {}
+
+ assertion-error@1.1.0: {}
+
+ balanced-match@1.0.2: {}
+
+ base-x@3.0.10:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ base64-js@1.5.1: {}
+
+ bigint-buffer@1.1.5:
+ dependencies:
+ bindings: 1.5.0
+
+ binary-extensions@2.3.0: {}
+
+ bindings@1.5.0:
+ dependencies:
+ file-uri-to-path: 1.0.0
+
+ bn.js@5.2.1: {}
+
+ borsh@0.7.0:
+ dependencies:
+ bn.js: 5.2.1
+ bs58: 4.0.1
+ text-encoding-utf-8: 1.0.2
+
+ brace-expansion@1.1.11:
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
+
+ browser-stdout@1.3.1: {}
+
+ bs58@4.0.1:
+ dependencies:
+ base-x: 3.0.10
+
+ buffer-from@1.1.2: {}
+
+ buffer-layout@1.2.2: {}
+
+ buffer@6.0.3:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
+ bufferutil@4.0.8:
+ dependencies:
+ node-gyp-build: 4.8.4
+ optional: true
+
+ camelcase@6.3.0: {}
+
+ chai@4.5.0:
+ dependencies:
+ assertion-error: 1.1.0
+ check-error: 1.0.3
+ deep-eql: 4.1.4
+ get-func-name: 2.0.2
+ loupe: 2.3.7
+ pathval: 1.1.1
+ type-detect: 4.1.0
+
+ chalk@4.1.2:
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ check-error@1.0.3:
+ dependencies:
+ get-func-name: 2.0.2
+
+ chokidar@3.5.3:
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.3
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ cliui@7.0.4:
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+
+ color-convert@2.0.1:
+ dependencies:
+ color-name: 1.1.4
+
+ color-name@1.1.4: {}
+
+ commander@2.20.3: {}
+
+ concat-map@0.0.1: {}
+
+ cross-fetch@3.1.8:
+ dependencies:
+ node-fetch: 2.7.0
+ transitivePeerDependencies:
+ - encoding
+
+ crypto-hash@1.3.0: {}
+
+ debug@4.3.3(supports-color@8.1.1):
+ dependencies:
+ ms: 2.1.2
+ optionalDependencies:
+ supports-color: 8.1.1
+
+ decamelize@4.0.0: {}
+
+ deep-eql@4.1.4:
+ dependencies:
+ type-detect: 4.1.0
+
+ delay@5.0.0: {}
+
+ diff@3.5.0: {}
+
+ diff@5.0.0: {}
+
+ dot-case@3.0.4:
+ dependencies:
+ no-case: 3.0.4
+ tslib: 2.8.1
+
+ emoji-regex@8.0.0: {}
+
+ es6-promise@4.2.8: {}
+
+ es6-promisify@5.0.0:
+ dependencies:
+ es6-promise: 4.2.8
+
+ escalade@3.2.0: {}
+
+ escape-string-regexp@4.0.0: {}
+
+ eventemitter3@4.0.7: {}
+
+ eventemitter3@5.0.1: {}
+
+ eyes@0.1.8: {}
+
+ fast-stable-stringify@1.0.0: {}
+
+ file-uri-to-path@1.0.0: {}
+
+ fill-range@7.1.1:
+ dependencies:
+ to-regex-range: 5.0.1
+
+ find-up@5.0.0:
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+
+ flat@5.0.2: {}
+
+ fs.realpath@1.0.0: {}
+
+ fsevents@2.3.3:
+ optional: true
+
+ get-caller-file@2.0.5: {}
+
+ get-func-name@2.0.2: {}
+
+ glob-parent@5.1.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob@7.2.0:
+ dependencies:
+ fs.realpath: 1.0.0
+ inflight: 1.0.6
+ inherits: 2.0.4
+ minimatch: 3.1.2
+ once: 1.4.0
+ path-is-absolute: 1.0.1
+
+ growl@1.10.5: {}
+
+ has-flag@4.0.0: {}
+
+ he@1.2.0: {}
+
+ humanize-ms@1.2.1:
+ dependencies:
+ ms: 2.1.3
+
+ ieee754@1.2.1: {}
+
+ inflight@1.0.6:
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+
+ inherits@2.0.4: {}
+
+ is-binary-path@2.1.0:
+ dependencies:
+ binary-extensions: 2.3.0
+
+ is-extglob@2.1.1: {}
+
+ is-fullwidth-code-point@3.0.0: {}
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ is-number@7.0.0: {}
+
+ is-plain-obj@2.1.0: {}
+
+ is-unicode-supported@0.1.0: {}
+
+ isexe@2.0.0: {}
+
+ isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)):
+ dependencies:
+ ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+
+ jayson@4.1.2(bufferutil@4.0.8)(utf-8-validate@5.0.10):
+ dependencies:
+ '@types/connect': 3.4.38
+ '@types/node': 12.20.55
+ '@types/ws': 7.4.7
+ JSONStream: 1.3.5
+ commander: 2.20.3
+ delay: 5.0.0
+ es6-promisify: 5.0.0
+ eyes: 0.1.8
+ isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10))
+ json-stringify-safe: 5.0.1
+ uuid: 8.3.2
+ ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
+ js-yaml@4.1.0:
+ dependencies:
+ argparse: 2.0.1
+
+ json-stringify-safe@5.0.1: {}
+
+ json5@1.0.2:
+ dependencies:
+ minimist: 1.2.8
+ optional: true
+
+ jsonparse@1.3.1: {}
+
+ locate-path@6.0.0:
+ dependencies:
+ p-locate: 5.0.0
+
+ log-symbols@4.1.0:
+ dependencies:
+ chalk: 4.1.2
+ is-unicode-supported: 0.1.0
+
+ loupe@2.3.7:
+ dependencies:
+ get-func-name: 2.0.2
+
+ lower-case@2.0.2:
+ dependencies:
+ tslib: 2.8.1
+
+ make-error@1.3.6: {}
+
+ minimatch@3.1.2:
+ dependencies:
+ brace-expansion: 1.1.11
+
+ minimatch@4.2.1:
+ dependencies:
+ brace-expansion: 1.1.11
+
+ minimist@1.2.8: {}
+
+ mkdirp@0.5.6:
+ dependencies:
+ minimist: 1.2.8
+
+ mocha@9.2.2:
+ dependencies:
+ '@ungap/promise-all-settled': 1.1.2
+ ansi-colors: 4.1.1
+ browser-stdout: 1.3.1
+ chokidar: 3.5.3
+ debug: 4.3.3(supports-color@8.1.1)
+ diff: 5.0.0
+ escape-string-regexp: 4.0.0
+ find-up: 5.0.0
+ glob: 7.2.0
+ growl: 1.10.5
+ he: 1.2.0
+ js-yaml: 4.1.0
+ log-symbols: 4.1.0
+ minimatch: 4.2.1
+ ms: 2.1.3
+ nanoid: 3.3.1
+ serialize-javascript: 6.0.0
+ strip-json-comments: 3.1.1
+ supports-color: 8.1.1
+ which: 2.0.2
+ workerpool: 6.2.0
+ yargs: 16.2.0
+ yargs-parser: 20.2.4
+ yargs-unparser: 2.0.0
+
+ ms@2.1.2: {}
+
+ ms@2.1.3: {}
+
+ nanoid@3.3.1: {}
+
+ no-case@3.0.4:
+ dependencies:
+ lower-case: 2.0.2
+ tslib: 2.8.1
+
+ node-fetch@2.7.0:
+ dependencies:
+ whatwg-url: 5.0.0
+
+ node-gyp-build@4.8.4:
+ optional: true
+
+ normalize-path@3.0.0: {}
+
+ once@1.4.0:
+ dependencies:
+ wrappy: 1.0.2
+
+ p-limit@3.1.0:
+ dependencies:
+ yocto-queue: 0.1.0
+
+ p-locate@5.0.0:
+ dependencies:
+ p-limit: 3.1.0
+
+ pako@2.1.0: {}
+
+ path-exists@4.0.0: {}
+
+ path-is-absolute@1.0.1: {}
+
+ pathval@1.1.1: {}
+
+ picomatch@2.3.1: {}
+
+ prettier@2.8.8: {}
+
+ randombytes@2.1.0:
+ dependencies:
+ safe-buffer: 5.2.1
+
+ readdirp@3.6.0:
+ dependencies:
+ picomatch: 2.3.1
+
+ regenerator-runtime@0.14.1: {}
+
+ require-directory@2.1.1: {}
+
+ rpc-websockets@9.0.4:
+ dependencies:
+ '@swc/helpers': 0.5.15
+ '@types/uuid': 8.3.4
+ '@types/ws': 8.5.13
+ buffer: 6.0.3
+ eventemitter3: 5.0.1
+ uuid: 8.3.2
+ ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)
+ optionalDependencies:
+ bufferutil: 4.0.8
+ utf-8-validate: 5.0.10
+
+ safe-buffer@5.2.1: {}
+
+ serialize-javascript@6.0.0:
+ dependencies:
+ randombytes: 2.1.0
+
+ snake-case@3.0.4:
+ dependencies:
+ dot-case: 3.0.4
+ tslib: 2.8.1
+
+ source-map-support@0.5.21:
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+
+ source-map@0.6.1: {}
+
+ string-width@4.2.3:
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ strip-ansi@6.0.1:
+ dependencies:
+ ansi-regex: 5.0.1
+
+ strip-bom@3.0.0:
+ optional: true
+
+ strip-json-comments@3.1.1: {}
+
+ superstruct@0.15.5: {}
+
+ superstruct@2.0.2: {}
+
+ supports-color@7.2.0:
+ dependencies:
+ has-flag: 4.0.0
+
+ supports-color@8.1.1:
+ dependencies:
+ has-flag: 4.0.0
+
+ text-encoding-utf-8@1.0.2: {}
+
+ through@2.3.8: {}
+
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
+ toml@3.0.0: {}
+
+ tr46@0.0.3: {}
+
+ ts-mocha@10.0.0(mocha@9.2.2):
+ dependencies:
+ mocha: 9.2.2
+ ts-node: 7.0.1
+ optionalDependencies:
+ tsconfig-paths: 3.15.0
+
+ ts-node@7.0.1:
+ dependencies:
+ arrify: 1.0.1
+ buffer-from: 1.1.2
+ diff: 3.5.0
+ make-error: 1.3.6
+ minimist: 1.2.8
+ mkdirp: 0.5.6
+ source-map-support: 0.5.21
+ yn: 2.0.0
+
+ tsconfig-paths@3.15.0:
+ dependencies:
+ '@types/json5': 0.0.29
+ json5: 1.0.2
+ minimist: 1.2.8
+ strip-bom: 3.0.0
+ optional: true
+
+ tslib@2.8.1: {}
+
+ type-detect@4.1.0: {}
+
+ typescript@4.9.5: {}
+
+ undici-types@6.19.8: {}
+
+ utf-8-validate@5.0.10:
+ dependencies:
+ node-gyp-build: 4.8.4
+ optional: true
+
+ uuid@8.3.2: {}
+
+ webidl-conversions@3.0.1: {}
+
+ whatwg-url@5.0.0:
+ dependencies:
+ tr46: 0.0.3
+ webidl-conversions: 3.0.1
+
+ which@2.0.2:
+ dependencies:
+ isexe: 2.0.0
+
+ workerpool@6.2.0: {}
+
+ wrap-ansi@7.0.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ wrappy@1.0.2: {}
+
+ ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10):
+ optionalDependencies:
+ bufferutil: 4.0.8
+ utf-8-validate: 5.0.10
+
+ ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10):
+ optionalDependencies:
+ bufferutil: 4.0.8
+ utf-8-validate: 5.0.10
+
+ y18n@5.0.8: {}
+
+ yargs-parser@20.2.4: {}
+
+ yargs-unparser@2.0.0:
+ dependencies:
+ camelcase: 6.3.0
+ decamelize: 4.0.0
+ flat: 5.0.2
+ is-plain-obj: 2.1.0
+
+ yargs@16.2.0:
+ dependencies:
+ cliui: 7.0.4
+ escalade: 3.2.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ string-width: 4.2.3
+ y18n: 5.0.8
+ yargs-parser: 20.2.4
+
+ yn@2.0.0: {}
+
+ yocto-queue@0.1.0: {}
diff --git a/basics/hello-solana/poseidon/programs/hello-solana/Cargo.toml b/basics/hello-solana/poseidon/programs/hello-solana/Cargo.toml
new file mode 100644
index 000000000..0c48f57af
--- /dev/null
+++ b/basics/hello-solana/poseidon/programs/hello-solana/Cargo.toml
@@ -0,0 +1,20 @@
+[package]
+name = "hello-solana"
+version = "0.1.0"
+description = "Created with Anchor"
+edition = "2021"
+
+[lib]
+crate-type = ["cdylib", "lib"]
+name = "hello_solana"
+
+[features]
+default = []
+cpi = ["no-entrypoint"]
+no-entrypoint = []
+no-idl = []
+no-log-ix-name = []
+idl-build = ["anchor-lang/idl-build"]
+
+[dependencies]
+anchor-lang = "0.30.1"
diff --git a/basics/hello-solana/poseidon/programs/hello-solana/Xargo.toml b/basics/hello-solana/poseidon/programs/hello-solana/Xargo.toml
new file mode 100644
index 000000000..475fb71ed
--- /dev/null
+++ b/basics/hello-solana/poseidon/programs/hello-solana/Xargo.toml
@@ -0,0 +1,2 @@
+[target.bpfel-unknown-unknown.dependencies.std]
+features = []
diff --git a/basics/hello-solana/poseidon/programs/hello-solana/src/lib.rs b/basics/hello-solana/poseidon/programs/hello-solana/src/lib.rs
new file mode 100644
index 000000000..70294503b
--- /dev/null
+++ b/basics/hello-solana/poseidon/programs/hello-solana/src/lib.rs
@@ -0,0 +1,11 @@
+use anchor_lang::prelude::*;
+declare_id!("84mLf5VZKf58tQ1VkUtsthxuR8fSeDLv8ZKemANC53oF");
+#[program]
+pub mod hello_solana {
+ use super::*;
+ pub fn initialize(ctx: Context) -> Result<()> {
+ Ok(())
+ }
+}
+#[derive(Accounts)]
+pub struct InitializeContext {}
diff --git a/basics/hello-solana/poseidon/tests/hello-solana.ts b/basics/hello-solana/poseidon/tests/hello-solana.ts
new file mode 100644
index 000000000..632da9edc
--- /dev/null
+++ b/basics/hello-solana/poseidon/tests/hello-solana.ts
@@ -0,0 +1,16 @@
+import * as anchor from '@coral-xyz/anchor';
+import { Program } from '@coral-xyz/anchor';
+import { HelloSolana } from '../target/types/hello_solana';
+
+describe('hello-solana', () => {
+ // Configure the client to use the local cluster.
+ anchor.setProvider(anchor.AnchorProvider.env());
+
+ const program = anchor.workspace.HelloSolana as Program;
+
+ it('Is initialized!', async () => {
+ // Add your test here.
+ const tx = await program.methods.initialize().rpc();
+ console.log('Your transaction signature', tx);
+ });
+});
diff --git a/basics/hello-solana/poseidon/ts-programs/package.json b/basics/hello-solana/poseidon/ts-programs/package.json
new file mode 100644
index 000000000..8e55452d9
--- /dev/null
+++ b/basics/hello-solana/poseidon/ts-programs/package.json
@@ -0,0 +1,15 @@
+{
+ "name": "ts-programs",
+ "version": "1.0.0",
+ "main": "index.js",
+ "scripts": {
+ "test": "echo \"Error: no test specified\" && exit 1"
+ },
+ "keywords": [],
+ "author": "",
+ "license": "ISC",
+ "description": "",
+ "dependencies": {
+ "@solanaturbine/poseidon": "^0.0.10"
+ }
+}
diff --git a/basics/hello-solana/poseidon/ts-programs/src/helloSolana.ts b/basics/hello-solana/poseidon/ts-programs/src/helloSolana.ts
new file mode 100644
index 000000000..dd7495dc7
--- /dev/null
+++ b/basics/hello-solana/poseidon/ts-programs/src/helloSolana.ts
@@ -0,0 +1,9 @@
+import { Pubkey, type Result } from '@solanaturbine/poseidon';
+
+export default class HelloSolana {
+ static PROGRAM_ID = new Pubkey('84mLf5VZKf58tQ1VkUtsthxuR8fSeDLv8ZKemANC53oF');
+
+ initialize(): Result {
+ // Write your program here
+ }
+}
diff --git a/basics/hello-solana/poseidon/tsconfig.json b/basics/hello-solana/poseidon/tsconfig.json
new file mode 100644
index 000000000..cd5d2e3d0
--- /dev/null
+++ b/basics/hello-solana/poseidon/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "compilerOptions": {
+ "types": ["mocha", "chai"],
+ "typeRoots": ["./node_modules/@types"],
+ "lib": ["es2015"],
+ "module": "commonjs",
+ "target": "es6",
+ "esModuleInterop": true
+ }
+}
diff --git a/basics/hello-solana/steel/Cargo.toml b/basics/hello-solana/steel/Cargo.toml
new file mode 100644
index 000000000..be454182e
--- /dev/null
+++ b/basics/hello-solana/steel/Cargo.toml
@@ -0,0 +1,21 @@
+[workspace]
+resolver = "2"
+members = ["program"]
+
+[workspace.package]
+version = "0.1.0"
+edition = "2021"
+license = "Apache-2.0"
+homepage = ""
+documentation = ""
+repository = ""
+readme = "./README.md"
+keywords = ["solana"]
+
+[workspace.dependencies]
+bytemuck = "1.14"
+num_enum = "0.7"
+solana-program = "1.18"
+steel = "2.0"
+thiserror = "1.0"
+solana-sdk = "1.18"
diff --git a/basics/hello-solana/steel/cargo.toml b/basics/hello-solana/steel/cargo.toml
deleted file mode 100644
index 9cf5ee9d0..000000000
--- a/basics/hello-solana/steel/cargo.toml
+++ /dev/null
@@ -1,8 +0,0 @@
-[workspace]
-members = [
- "program",
-]
-resolver = "2"
-
-[profile.release]
-overflow-checks = true
diff --git a/basics/hello-solana/steel/package.json b/basics/hello-solana/steel/package.json
index f054a3685..7b16847c5 100644
--- a/basics/hello-solana/steel/package.json
+++ b/basics/hello-solana/steel/package.json
@@ -3,7 +3,7 @@
"version": "1.0.0",
"description": "hello world with steel framework for solana",
"scripts": {
- "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts",
+ "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/index.test.ts",
"build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test",
"build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so",
"deploy": "solana program deploy ./program/target/so/hello_solana_program.so"
diff --git a/basics/hello-solana/steel/tests/test.ts b/basics/hello-solana/steel/tests/index.test.ts
similarity index 100%
rename from basics/hello-solana/steel/tests/test.ts
rename to basics/hello-solana/steel/tests/index.test.ts