Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
eedf95a
Remove temporary branch triggers from CI workflows
mikemaccana Apr 10, 2026
7779d48
Replace verbose FORCE_JAVASCRIPT_ACTIONS_TO_NODE24 comment with blog URL
mikemaccana Apr 10, 2026
9e0c226
Use pnpm/action-setup in Anchor CI instead of npm i -g pnpm
mikemaccana Apr 10, 2026
91dc75f
Replace collapsible details sections with plain headings in README
mikemaccana Apr 10, 2026
db6e649
Reorder to Anchor, Pinocchio, Native throughout
mikemaccana Apr 10, 2026
361ebda
Add missing project links to README
mikemaccana Apr 10, 2026
d0c9db5
Update pnpm to current
mikemaccana Apr 10, 2026
c0801dd
Specify pnpm version in 1 place (package.json)
mikemaccana Apr 10, 2026
1fb50ed
Upgrade Anchor programs from 1.0.0-rc.5 to 1.0.0 stable
mikemaccana-edwardbot Apr 12, 2026
3aa419a
feat: add LiteSVM Rust tests for all Anchor programs
mikemaccana-edwardbot Apr 12, 2026
de2b5c3
feat: add Quasar variants for hello-solana, counter, and transfer-sol
mikemaccana-edwardbot Apr 12, 2026
ff2d820
feat: add Quasar variants for checking-accounts, create-account, prog…
mikemaccana-edwardbot Apr 12, 2026
d42323b
ci: add Quasar workflow for build and test
mikemaccana-edwardbot Apr 12, 2026
a945935
feat: add Phase 3 Quasar examples (dynamic String types)
mikemaccana-edwardbot Apr 12, 2026
dd37c21
feat: add Quasar variants for repository-layout, rent, and cross-prog…
mikemaccana-edwardbot Apr 12, 2026
82b4b9c
tokens: add Quasar ports for create-token, transfer-tokens, and escrow
mikemaccana-edwardbot Apr 12, 2026
91dd75e
tokens: add Quasar ports for pda-mint-authority and token-fundraiser
mikemaccana-edwardbot Apr 12, 2026
078bc51
tokens: port all 5 previously-skipped examples to Quasar
mikemaccana-edwardbot Apr 12, 2026
ef169a4
feat: add Quasar variants for 12 token-2022 examples
mikemaccana-edwardbot Apr 12, 2026
aebb7a2
feat: add Quasar variants for 6 transfer-hook token-2022 examples
mikemaccana-edwardbot Apr 12, 2026
c852fc3
feat: add Quasar variants for compression and oracle examples
mikemaccana-edwardbot Apr 12, 2026
1ec4e63
Add Quasar port of allow-block-list-token transfer hook example
mikemaccana-edwardbot Apr 12, 2026
584c6dc
docs: add Quasar to README framework listings
mikemaccana-edwardbot Apr 12, 2026
4fd3fa4
chore: remove legacy TypeScript tests from Anchor examples
mikemaccana-edwardbot Apr 12, 2026
1ab55e4
Replace magic numbers with DISCRIMINATOR + INIT_SPACE
Apr 8, 2026
7acb36b
Replace @coral-xyz/anchor with @anchor-lang/core
Apr 8, 2026
33edeee
refactor(basics): convert impl blocks to free handle_* functions
mikemaccana-edwardbot Apr 12, 2026
cd72458
refactor(tokens): convert impl blocks to free handle_* functions
mikemaccana-edwardbot Apr 12, 2026
e31c902
refactor(compression+oracles): convert impl blocks to free handle_* f…
mikemaccana-edwardbot Apr 12, 2026
ba3f793
refactor: use free functions instead of impl methods in all Anchor ex…
mikemaccana-edwardbot Apr 12, 2026
2caa041
docs: use 💫 emoji for Quasar (quasar is a cosmic object, not a crysta…
mikemaccana-edwardbot Apr 13, 2026
b050f3a
Merge remote-tracking branch 'origin/anchor-10-existing-tests'
mikemaccana Apr 13, 2026
32d8882
Merge remote-tracking branch 'origin/litesvm-tests'
mikemaccana Apr 13, 2026
e760c2a
Merge remote-tracking branch 'origin/remove-web3-tests'
mikemaccana Apr 13, 2026
ced4942
Merge remote-tracking branch 'origin/anchor-free-functions'
mikemaccana Apr 13, 2026
9b49522
fix: remove erroneous _mut prefix from initialize parameter
mikemaccana-edwardbot Apr 13, 2026
1451214
fix: update quasar CLI crate name to quasar-cli
mikemaccana-edwardbot Apr 13, 2026
990d970
docs: add Quasar CI badge to README
mikemaccana-edwardbot Apr 13, 2026
370b86c
fix: regenerate pnpm lockfile for @anchor-lang/core 1.0.0
mikemaccana-edwardbot Apr 13, 2026
77f0590
docs: reorder frameworks to Anchor, Quasar, Pinocchio, Native
mikemaccana-edwardbot Apr 13, 2026
1d7a0de
Merge pull request #4 from mikemaccana/fix-ci-failures
mikemaccana Apr 13, 2026
e49467a
We already mention pnpm in each example
mikemaccana Apr 13, 2026
a2924b6
Minor tweaks
mikemaccana Apr 13, 2026
3638dab
Link to quasar in the readme should be https://quasar-lang.com/docs
mikemaccana Apr 13, 2026
05a26ea
Fix typos
mikemaccana Apr 13, 2026
e0e2db2
Fix CI test failures: rename AccountConstraints structs, fix clippy, …
mikemaccana Apr 13, 2026
4d665cd
Fix CI failures: Rust lint, Anchor, and Quasar workflows
mikemaccana Apr 14, 2026
19257b3
Fix Anchor and Quasar CI failures
mikemaccana Apr 14, 2026
55c3622
Fix rustfmt: reformat concat! macro call in test_hand.rs
mikemaccana Apr 14, 2026
ed20d28
Fix remaining Quasar CI failures
mikemaccana Apr 14, 2026
9b6972f
Fix Quasar token-2022 extension opcodes, sizes, and instruction formats
mikemaccana Apr 14, 2026
1ede0be
Fix transfer-fee mint_size and metadata MetadataPointer COption flags
mikemaccana Apr 14, 2026
6049b57
Fix metadata MetadataPointerInstruction encoding: use PodCOption (4-b…
mikemaccana Apr 14, 2026
5dab3ae
Fix metadata MetadataPointerInstruction: use OptionalNonZeroPubkey (6…
mikemaccana Apr 14, 2026
f4311a4
Fix metadata quasar: 234-byte account + over-fund lamports for realloc
mikemaccana Apr 15, 2026
a8f816e
Fix metadata quasar: use opcode 45 for TokenMetadataExtension
mikemaccana Apr 15, 2026
5d25100
Fix token-2022 metadata: use 8-byte discriminator for TokenMetadataIn…
mikemaccana Apr 15, 2026
81da8e5
Fix metadata: remove update_authority/mint from instruction data
mikemaccana Apr 15, 2026
3c72bbd
Fix metadata: create account at full size upfront, no CPI realloc needed
mikemaccana Apr 15, 2026
d1557a3
Fix metadata: revert to base-size account, mark mint writable in CPI
mikemaccana Apr 15, 2026
3be9824
Fix metadata: add payer+system_program to TokenMetadataInitialize CPI
mikemaccana Apr 15, 2026
c756622
Fix metadata: use 4-account TokenMetadataInitialize CPI matching spl-…
mikemaccana Apr 15, 2026
8627e64
Fix TokenMetadataInitialize realloc: pre-allocate full mint size
mikemaccana Apr 15, 2026
46feca0
Remove WIP tokens/token-2022/metadata/quasar until sol_realloc works …
mikemaccana Apr 15, 2026
f3b5b04
Merge pull request #5 from mikemaccana/fix-actions
mikemaccana Apr 16, 2026
e0c1dcc
Fix GitHub Actions: anchor 1.0.0 CLI and Quasar.toml path field
mikemaccana Apr 16, 2026
f43b807
Fix anchor CI: run keys sync before build for 1.0.0 compatibility
mikemaccana Apr 16, 2026
1975db6
Minor README tweaks
mikemaccana Apr 16, 2026
6b71a40
Use quiknode-labs for CI badge (don't merge this upstream)
mikemaccana Apr 16, 2026
3ee5f60
Fix anchor CI: surfpool, transfer-hook API, DecodeError, fixture files
mikemaccana Apr 16, 2026
5b929bc
Fix anchor CI: DecodeError (five8_core version) and cross-program-inv…
mikemaccana Apr 16, 2026
3b7bda9
Fix lever dir
mikemaccana Apr 16, 2026
af61d7c
feat: add LiteSVM Rust tests for all Anchor programs
mikemaccana-edwardbot Apr 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
14 changes: 14 additions & 0 deletions .github/.ghaignore
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,20 @@ tokens/escrow/anchor

# not live
tokens/token-2022/group/anchor
tokens/token-2022/group/quasar

# CPI quasar project uses subdirectories (hand/ and lever/) instead of a root Quasar.toml
basics/cross-program-invocation/quasar

# has Cargo.toml but no Quasar.toml
tokens/spl-token-minter/quasar
tokens/external-delegate-token-master/quasar
tokens/nft-minter/quasar
tokens/nft-operations/quasar
tokens/token-swap/quasar

# build failed - outdated quasar-lang API (no AccountView.data, no log_64)
oracles/pyth/quasar

# error in tests
tokens/external-delegate-token-master/anchor
Expand Down
18 changes: 10 additions & 8 deletions .github/workflows/anchor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ on:
push:
branches:
- main
- anchor-1.0
- fix-biome-errors
pull_request:
types: [opened, synchronize, reopened]
branches:
Expand All @@ -17,9 +15,7 @@ env:
MAX_JOBS: 64
MIN_PROJECTS_PER_JOB: 4
MIN_PROJECTS_FOR_MATRIX: 4
# Force all JavaScript-based actions to use Node.js 24 runtime.
# Node.js 20 actions are deprecated and will stop working June 2026.
# This catches composite actions whose internal dependencies still reference @v4.
# See https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true

jobs:
Expand Down Expand Up @@ -110,18 +106,21 @@ jobs:
failed_projects: ${{ steps.set-failed.outputs.failed_projects }}
steps:
- uses: actions/checkout@v5
- uses: pnpm/action-setup@v4
- uses: heyAyushh/setup-anchor@v4.999
with:
anchor-version: 0.32.1
anchor-version: 1.0.0
solana-cli-version: stable
- name: Display Versions and Install pnpm
- name: Install Surfpool
run: curl -sL https://run.surfpool.run/ | bash
- name: Display Versions
run: |
solana -V
# it's okay to use --force in github action since all programs are tested in isolation
solana-keygen new --no-bip39-passphrase --force
rustc -V
anchor -V
npm i -g pnpm
surfpool --version
- name: Build and Test
env:
TOTAL_PROJECTS: ${{ needs.changes.outputs.total_projects }}
Expand All @@ -140,6 +139,9 @@ jobs:
return 1
fi

# Sync program IDs (Anchor 1.0.0 requires keypair and declare_id! to match)
anchor keys sync

# Run anchor build
if ! anchor build; then
echo "::error::anchor build failed for $project"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ on:
push:
branches:
- main
- fix-biome-errors
pull_request:
types: [opened, synchronize, reopened]
branches:
Expand All @@ -16,9 +15,7 @@ env:
MAX_JOBS: 64
MIN_PROJECTS_PER_JOB: 4
MIN_PROJECTS_FOR_MATRIX: 4
# Force all JavaScript-based actions to use Node.js 24 runtime.
# Node.js 20 actions are deprecated and will stop working June 2026.
# This catches composite actions whose internal dependencies still reference @v4.
# See https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true

jobs:
Expand All @@ -41,7 +38,7 @@ jobs:
native:
- added|modified: '**/native/**'
workflow:
- added|modified: '.github/workflows/solana-native.yml'
- added|modified: '.github/workflows/native.yml'
- name: Analyze Changes
id: analyze
run: |
Expand Down Expand Up @@ -194,7 +191,6 @@ jobs:
# Make the script executable
chmod +x build_and_test.sh

# pnpm is already installed via pnpm/action-setup
- name: Setup Solana Stable
uses: heyAyushh/setup-solana@v5.9
with:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ on:
push:
branches:
- main
- fix-biome-errors
pull_request:
types: [opened, synchronize, reopened]
branches:
Expand All @@ -16,9 +15,7 @@ env:
MAX_JOBS: 64
MIN_PROJECTS_PER_JOB: 4
MIN_PROJECTS_FOR_MATRIX: 4
# Force all JavaScript-based actions to use Node.js 24 runtime.
# Node.js 20 actions are deprecated and will stop working June 2026.
# This catches composite actions whose internal dependencies still reference @v4.
# See https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true

jobs:
Expand All @@ -41,7 +38,7 @@ jobs:
pinocchio:
- added|modified: '**/pinocchio/**'
workflow:
- added|modified: '.github/workflows/solana-pinocchio.yml'
- added|modified: '.github/workflows/pinocchio.yml'
- name: Analyze Changes
id: analyze
run: |
Expand Down Expand Up @@ -194,7 +191,6 @@ jobs:
# Make the script executable
chmod +x build_and_test.sh

# pnpm is already installed via pnpm/action-setup
- name: Setup Solana Stable
uses: heyAyushh/setup-solana@v5.9
with:
Expand Down
236 changes: 236 additions & 0 deletions .github/workflows/quasar.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,236 @@
name: Quasar

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
# Force all JavaScript-based actions to use Node.js 24 runtime.
# Node.js 20 actions are deprecated and will stop working June 2026.
# This catches composite actions whose internal dependencies still reference @v4.
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true

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@v5
- uses: dorny/paths-filter@v4
id: changes
if: github.event_name == 'pull_request'
with:
list-files: shell
filters: |
quasar:
- added|modified: '**/quasar/**'
workflow:
- added|modified: '.github/workflows/quasar.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 "quasar" | 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.quasar }}" == "true" ]]; then
changed_files=(${{ steps.changes.outputs.quasar_files }})
projects=$(for file in "${changed_files[@]}"; do dirname "${file}" | grep quasar | sed 's#/quasar/.*#/quasar#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

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@v5
- 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

# Build with quasar CLI
if ! quasar build; then
echo "::error::quasar build failed for $project"
echo "$project: quasar build failed with $solana_version" >> $GITHUB_WORKSPACE/failed_projects.txt
cd - > /dev/null
return 1
fi

# Run Rust tests (quasar examples use cargo test with quasar-svm)
if ! cargo test; then
echo "::error::cargo test failed for $project"
echo "$project: cargo test 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

chmod +x build_and_test.sh
- name: Setup Solana Stable
uses: heyAyushh/setup-solana@v5.9
with:
solana-cli-version: stable
- name: Install Quasar CLI
run: cargo install --git https://github.com/blueshift-gg/quasar quasar-cli --locked
- name: Build and Test with Stable
run: |
source build_and_test.sh
solana -V
rustc -V
quasar --version || true
process_projects "stable"

- 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@v5
- name: Create job summary
run: |
echo "## Quasar Workflow Summary" >> $GITHUB_STEP_SUMMARY
echo "- Total projects: ${{ needs.changes.outputs.total_projects }}" >> $GITHUB_STEP_SUMMARY

# List all processed projects
echo "<details>" >> $GITHUB_STEP_SUMMARY
echo "<summary>Projects processed (click to expand)</summary>" >> $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 "</details>" >> $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 "<details>" >> $GITHUB_STEP_SUMMARY
echo "<summary>Failed projects (click to expand)</summary>" >> $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 "</details>" >> $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
Loading
Loading