Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
78 commits
Select commit Hold shift + click to select a range
259f75a
Import Sphere 10 Pascal Framework
HermanSchoenfeld Nov 2, 2026
f1e805f
Fix grid paging and wizard navigation
HermanSchoenfeld Nov 2, 2026
f5f94d1
Optimize account indexing
HermanSchoenfeld Nov 2, 2026
3f152f8
Fix synchronization and pending operations
HermanSchoenfeld Nov 2, 2026
de954c9
Fix classic wallet filtering and shutdown
HermanSchoenfeld Nov 2, 2026
5e73222
Complete wallet operation workflows
HermanSchoenfeld Nov 2, 2026
50f4640
Complete experimental wallet UI
HermanSchoenfeld Nov 2, 2026
acc7eb4
Add Delphi support and version 5.9
HermanSchoenfeld Nov 2, 2026
6991e0c
Document 5.9 and add regression runners
HermanSchoenfeld Nov 2, 2026
6d45cdd
Merge pull request #76 from HermanSchoenfeld/master
HermanSchoenfeld Nov 2, 2026
e671abf
Fix cross-platform CI builds
HermanSchoenfeld Nov 2, 2026
6841387
Fix read/write locks on macOS
HermanSchoenfeld Nov 2, 2026
e88afee
Build classic and experimental wallets in CI
HermanSchoenfeld Nov 2, 2026
62b552d
Set application versions to 5.9
HermanSchoenfeld Nov 2, 2026
f85f198
Trace portable lock test failures
HermanSchoenfeld Nov 2, 2026
b1e940e
Fix Unix lock-test initialization
HermanSchoenfeld Nov 2, 2026
8f2dbc7
Include runtime files in release packages
HermanSchoenfeld Nov 2, 2026
50ff183
Fix cross-platform wallet startup
HermanSchoenfeld Nov 2, 2026
d51f03e
Credit experimental wallet development
HermanSchoenfeld Nov 2, 2026
cd3eef5
Run complete wallet regressions in CI
HermanSchoenfeld Nov 2, 2026
8871469
Document the 5.9 wallets
HermanSchoenfeld Nov 2, 2026
5b2cb8c
Fix grid test notification barrier
HermanSchoenfeld Nov 2, 2026
401f91e
Fix isolated startup checks
HermanSchoenfeld Nov 2, 2026
0f62918
Run complete native wallet scenarios
HermanSchoenfeld Nov 2, 2026
9d9dabf
Fix miner backlog regression setup
HermanSchoenfeld Nov 2, 2026
ee9b35e
Clarify wallet builds and credits
HermanSchoenfeld Nov 2, 2026
aed042a
Fix nested test runner exit codes
HermanSchoenfeld Nov 2, 2026
3477ad3
Make account fixtures independent of viewport size
HermanSchoenfeld Nov 2, 2026
addc011
Keep operation dialogs inside the work area
HermanSchoenfeld Nov 2, 2026
d695e5c
Prepare native CI display checks
HermanSchoenfeld Nov 2, 2026
66ab0a5
Document experimental wallet public types
HermanSchoenfeld Nov 2, 2026
d615baa
Keep experimental GUI signatures on one line
HermanSchoenfeld Nov 2, 2026
c432754
Align imported framework signatures
HermanSchoenfeld Nov 2, 2026
c4083b1
Fix grid footer layout
HermanSchoenfeld Nov 2, 2026
8fe61f2
Reflow operation information
HermanSchoenfeld Nov 2, 2026
73a55ba
Open operation details explicitly
HermanSchoenfeld Nov 2, 2026
01cc46b
Complete PascalCoin wordmark
HermanSchoenfeld Nov 2, 2026
a4d4102
Document wallet UI fixes
HermanSchoenfeld Nov 2, 2026
685c4be
Clarify README presentation
HermanSchoenfeld Nov 2, 2026
4c0be8a
Preserve storage after write failures
HermanSchoenfeld Nov 2, 2026
76a952a
Fix wallet refresh and status feedback
HermanSchoenfeld Nov 2, 2026
e756cb7
Document PascalCoin 5.9 fixes
HermanSchoenfeld Nov 2, 2026
bc601e2
Refactor: Migrate application guards to read/write locks
HermanSchoenfeld Nov 3, 2026
7f608b9
Fix: Preserve storage errors during safebox cleanup
HermanSchoenfeld Nov 3, 2026
8a8c85c
Code: Buffer blockchain and pending-operation reads
HermanSchoenfeld Nov 3, 2026
a9c544c
Fix: Restore checkpoint skip-and-replay behavior
HermanSchoenfeld Nov 3, 2026
3abf566
Fix: Keep GUI logging responsive during replay
HermanSchoenfeld Nov 3, 2026
27a1aff
Code: Align experimental startup with Classic
HermanSchoenfeld Nov 3, 2026
11097f9
Fix: Keep grid totals beside compact paging
HermanSchoenfeld Nov 3, 2026
0caae2d
Graphics: Restore Delphi banner transparency
HermanSchoenfeld Nov 3, 2026
c1754b4
Fix: Add spacing above network details
HermanSchoenfeld Nov 3, 2026
4a67139
Chore: Ignore local temporary work
HermanSchoenfeld Nov 3, 2026
85f022c
Build: Release PascalCoin 5.9.1
HermanSchoenfeld Nov 3, 2026
50dd291
Test: Stage bundled OpenSSL for log checks
HermanSchoenfeld Nov 3, 2026
97af45f
Fix: Restore legacy account history in the experimental wallet
HermanSchoenfeld Nov 4, 2026
ff72c44
Build: Release PascalCoin 5.9.2
HermanSchoenfeld Nov 4, 2026
5243599
Fix: Keep the Delphi log memo following new batches
HermanSchoenfeld Nov 5, 2026
ccd61f5
Code: Sync the embedded Sphere10 library with the framework
HermanSchoenfeld Nov 5, 2026
466a30f
Code: Tighten header buffers and lock usage
HermanSchoenfeld Nov 5, 2026
920023b
Test: Gate the RandomHash adoption check on the shipping define
HermanSchoenfeld Nov 5, 2026
24ea3dc
Refactor: Tidy formatting in core and library units
HermanSchoenfeld Nov 5, 2026
fc4ef97
Build: Release PascalCoin 5.9.3
HermanSchoenfeld Nov 5, 2026
8220ddf
Build: Package the macOS wallets as app bundles in a disk image
HermanSchoenfeld Nov 7, 2026
b62481d
Build: Release PascalCoin 5.9.4
HermanSchoenfeld Nov 7, 2026
9568f07
CI: Rename the macOS disk image only when the tag differs from the ve…
HermanSchoenfeld Nov 8, 2026
1c341a6
Docs: Rewrite the READMEs to be clear and concise
HermanSchoenfeld Nov 9, 2026
9cdaa78
Build: Ship universal macOS wallets in one disk image
HermanSchoenfeld Nov 9, 2026
f33be32
CI: Cross-compile the Apple silicon wallets through the fpc driver
HermanSchoenfeld Nov 9, 2026
86bb0d4
Build: Release PascalCoin 5.9.5
HermanSchoenfeld Nov 9, 2026
4859711
Build: Pass GUID records by reference for the Apple silicon compiler
HermanSchoenfeld Nov 9, 2026
b9f780c
CI: Link the Apple silicon wallets with the classic linker
HermanSchoenfeld Nov 9, 2026
8f5a065
Chore: Remove machine-specific drive paths from scripts and READMEs
HermanSchoenfeld Nov 9, 2026
4d95d58
Fix: Mirror the framework's corrected public names
HermanSchoenfeld Nov 9, 2026
97f89b5
Test: Fix flaky checks, probe failures and script defects
HermanSchoenfeld Nov 9, 2026
12776e3
Test: Wait for live-peer statistics to settle in the buffered-frames …
HermanSchoenfeld Nov 9, 2026
0afd6f9
Fix: Keep repeated account clicks selected
HermanSchoenfeld Nov 10, 2026
f16c7c0
Fix: Hide unavailable operation details
HermanSchoenfeld Nov 10, 2026
1aca3d7
Build: Release PascalCoin 5.9.6
HermanSchoenfeld Nov 10, 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
  •  
  •  
  •  
199 changes: 183 additions & 16 deletions .github/workflows/workflow.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,14 +15,15 @@ jobs:
runs-on: ${{ matrix.operating-system }}

strategy:
fail-fast: false
matrix:
operating-system: [windows-latest,ubuntu-latest,macos-latest]
operating-system: [windows-latest,ubuntu-latest,macos-15-intel]
# lazarus-versions: [stable, 2.2.2, 2.2.0, 2.0.12]
lazarus-versions: [stable]

steps:
- name: Checkout Repository
uses: actions/checkout@v3
uses: actions/checkout@v6
with:
submodules: false

Expand All @@ -32,96 +33,262 @@ jobs:
with-cache: false
lazarus-version: ${{ matrix.lazarus-versions }}

- name: Test core and framework read/write locks
shell: bash
run: |
mkdir -p .ci-threading/units .ci-threading/bin
fpc -B -Mdelphi -Sh -gl -Cr -Co \
-FU.ci-threading/units -FE.ci-threading/bin \
-Fusrc/core -Fusrc/libraries/sphere10 -Fusrc/libraries/pascalcoin \
-Fusrc/libraries/generics.collections -Fisrc/libraries/generics.collections/inc \
-Fusrc/tests/experimental/core -Fusrc/tests/experimental/framework \
src/tests/experimental/ThreadingTests.lpr
./.ci-threading/bin/ThreadingTests .ci-threading/results.log
cat .ci-threading/results.log
grep -q '^0 unfreed memory blocks' .ci-threading/results.log.heap.log

- name: Diagnose Unix threading failures
if: ${{ failure() && runner.os != 'Windows' }}
shell: bash
run: |
if [[ ! -x .ci-threading/bin/ThreadingTests ]]; then exit 0; fi
if [[ "$RUNNER_OS" == "Linux" ]]; then
gdb --batch -ex 'set pagination off' -ex run -ex 'thread apply all bt 40' \
--args ./.ci-threading/bin/ThreadingTests .ci-threading/debug-results.log
else
lldb --batch -o run -k 'thread backtrace all -c 40' \
-- ./.ci-threading/bin/ThreadingTests .ci-threading/debug-results.log
fi

- name: Upload threading reports
if: ${{ always() && hashFiles('.ci-threading/*.log*') != '' }}
uses: actions/upload-artifact@v7
with:
name: Threading-${{ runner.os }}
path: .ci-threading/*.log*
include-hidden-files: true

- name: Build the Pascal daemon
run: lazbuild -B "src/pascalcoin_daemon.lpi"

- name: Build reference Pascal Miner
run: lazbuild -B "src/pascalcoin_miner.lpi"

- name: Build the Main Wallet Application (Windows/Linux)
if: ${{ matrix.operating-system != 'macos-latest' }}
- name: Build Classic Wallet (Windows/Linux)
if: ${{ runner.os != 'macOS' }}
run: lazbuild -B "src/pascalcoin_wallet_classic.lpi"

- name: Build the Main Wallet Application (macOS)
if: ${{ matrix.operating-system == 'macos-latest' }}
- name: Build Classic Wallet (macOS)
if: ${{ runner.os == 'macOS' }}
run: lazbuild -B --ws=cocoa "src/pascalcoin_wallet_classic.lpi"

- name: Build Experimental Wallet (Windows/Linux)
if: ${{ runner.os != 'macOS' }}
run: lazbuild -B --build-mode=Release "src/pascalcoin_wallet_experimental.lpi"

- name: Build Experimental Wallet (macOS)
if: ${{ runner.os == 'macOS' }}
run: lazbuild -B --ws=cocoa --build-mode=Release "src/pascalcoin_wallet_experimental.lpi"

- name: Add Apple silicon to the wallets (macOS)
if: ${{ runner.os == 'macOS' }}
shell: bash
run: |
intel="$RUNNER_TEMP/macos-intel"
mkdir -p "$intel"
cp src/PascalCoinWalletLazarus src/PascalCoinWalletExperimental "$intel/"
# Lazarus calls ppcx64 directly, which cannot target aarch64. The fpc driver
# selects ppca64 from the FPC 3.2.2 Intel and Arm64 install.
ppca64="$(command -v ppca64 || true)"
if [[ -z "$ppca64" ]]; then
ppca64="$(ls /usr/local/lib/fpc/*/ppca64 2>/dev/null | head -n 1 || true)"
[[ -n "$ppca64" ]] && export PATH="$(dirname "$ppca64"):$PATH"
fi
if [[ -z "$ppca64" ]]; then
echo "The FPC install has no aarch64 compiler (ppca64)." >&2
exit 1
fi
# Xcode's new linker aborts on FPC 3.2.2 aarch64 objects, so link with the
# classic linker through a wrapper around the fpc driver.
driver="$RUNNER_TEMP/fpc-aarch64"
printf '#!/bin/bash\nexec "%s" -k-ld_classic "$@"\n' "$(command -v fpc)" > "$driver"
chmod +x "$driver"
ld -v 2>&1 | head -n 2 || true
echo "Apple silicon compiler: $ppca64, driver: $driver"
lazbuild -B --compiler="$driver" --cpu=aarch64 --os=darwin --ws=cocoa "src/pascalcoin_wallet_classic.lpi"
lazbuild -B --compiler="$driver" --cpu=aarch64 --os=darwin --ws=cocoa --build-mode=Release "src/pascalcoin_wallet_experimental.lpi"
for exe in PascalCoinWalletLazarus PascalCoinWalletExperimental; do
lipo -create "$intel/$exe" "src/$exe" -output "$intel/$exe.universal"
mv "$intel/$exe.universal" "src/$exe"
archs="$(lipo -archs "src/$exe")"
echo "$exe: $archs"
[[ "$archs" == *x86_64* && "$archs" == *arm64* ]]
done

- name: Package wallet apps into a disk image (macOS)
if: ${{ runner.os == 'macOS' }}
run: bash build/macOS/package-macos.sh src "$RUNNER_TEMP/macos-dmg"

- name: Test bounded message dialogs on the default desktop (Windows)
if: ${{ runner.os == 'Windows' }}
shell: pwsh
run: |
$compiler = (Get-Command fpc).Source
$lazarus = Split-Path -Parent (Get-Command lazbuild).Source
& .\src\tests\experimental\RunWalletGridRefreshTests.ps1 -Demo -DemoCase operation-messages -FpcPath $compiler -LazarusDirectory $lazarus -OutputDirectory (Join-Path $env:RUNNER_TEMP 'wallet-message-small')
exit $LASTEXITCODE

- name: Prepare the 150-percent native test viewport (Windows)
if: ${{ runner.os == 'Windows' }}
shell: pwsh
run: |
& .\src\tests\experimental\native\SetCiDisplayMode.ps1 -ReportPath (Join-Path $env:RUNNER_TEMP 'wallet-display.json')

- name: Test wallet units and native workflows (Windows)
if: ${{ runner.os == 'Windows' }}
shell: pwsh
run: |
& .\src\tests\experimental\RunAllWalletTests.ps1 -OutputDirectory (Join-Path $env:RUNNER_TEMP 'wallet-tests')
exit $LASTEXITCODE

- name: Upload wallet test reports
if: ${{ always() && runner.os == 'Windows' }}
uses: actions/upload-artifact@v7
with:
name: Wallet-tests-Windows
if-no-files-found: warn
retention-days: 14
path: |
${{ runner.temp }}/wallet-tests/**/*.log
${{ runner.temp }}/wallet-tests/**/*.json
${{ runner.temp }}/wallet-tests/**/*.png
${{ runner.temp }}/wallet-tests/**/*.bmp

- name: Upload native display checks
if: ${{ always() && runner.os == 'Windows' }}
uses: actions/upload-artifact@v7
with:
name: Native-display-Windows
if-no-files-found: warn
retention-days: 14
path: |
${{ runner.temp }}/wallet-display.json
${{ runner.temp }}/wallet-message-small/**/*.log
${{ runner.temp }}/wallet-message-small/**/*.json
${{ runner.temp }}/wallet-message-small/**/*.bmp

- name: Upload binary (Windows)
if: ${{ (matrix.operating-system == 'windows-latest') && (matrix.lazarus-versions == 'stable') }}
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v7
with:
name: PascalCoinWindows
if-no-files-found: error
path: |
src/pascalcoin_daemon.exe
src/PascalCoinMiner.exe
src/PascalCoinWalletLazarus.exe
src/PascalCoinWalletExperimental.exe

- name: Upload binary (Ubuntu)
if: ${{ (matrix.operating-system == 'ubuntu-latest') && (matrix.lazarus-versions == 'stable') }}
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v7
with:
name: PascalCoinLinux
if-no-files-found: error
path: |
src/pascalcoin_daemon
src/PascalCoinMiner
src/PascalCoinWalletLazarus
src/PascalCoinWalletExperimental

- name: Upload binary (macOS)
if: ${{ (matrix.operating-system == 'macos-latest') && (matrix.lazarus-versions == 'stable') }}
uses: actions/upload-artifact@v3
if: ${{ (runner.os == 'macOS') && (matrix.lazarus-versions == 'stable') }}
uses: actions/upload-artifact@v7
with:
name: PascalCoinMacOS
if-no-files-found: error
path: |
src/pascalcoin_daemon
src/PascalCoinMiner
src/PascalCoinWalletLazarus
src/PascalCoinWalletExperimental

- name: Upload disk image (macOS)
if: ${{ (runner.os == 'macOS') && (matrix.lazarus-versions == 'stable') }}
uses: actions/upload-artifact@v7
with:
name: PascalCoinMacOSDiskImage
if-no-files-found: error
path: ${{ runner.temp }}/macos-dmg/*.dmg

package-release:
if: contains(github.ref, '/tags/')

name: Package and create GitHub Release
runs-on: ubuntu-latest
needs: build
permissions:
contents: write

steps:
- name: Checkout
uses: actions/checkout@v3
uses: actions/checkout@v6

- name: Set output
id: vars
run: echo "tag=${GITHUB_REF#refs/*/}" >> ${GITHUB_OUTPUT}

- name: Download the Release binary
uses: actions/download-artifact@v3
uses: actions/download-artifact@v7
with:
pattern: PascalCoin*

- name: List files
run: |
ls -alF PascalCoinWindows
ls -alF PascalCoinLinux
ls -alF PascalCoinMacOS
ls -alF PascalCoinMacOSDiskImage

- name: Create release files
run: |
for package in PascalCoinWindows PascalCoinLinux PascalCoinMacOS; do
cp -R src/locale licenses "$package/"
cp src/pascalsha.cl LICENSE "$package/"
done
cd PascalCoinWindows
cp ../windows-dll/*.dll .
zip -r PascalCoin-${{ steps.vars.outputs.tag }}-x86_64-win64.zip *.exe *.dll
zip -r PascalCoin-${{ steps.vars.outputs.tag }}-x86_64-win64.zip *.exe *.dll locale licenses pascalsha.cl LICENSE
cd ../PascalCoinLinux
cp ../linux-libs/*.so.1.1 .
chmod +x PascalCoin* pascalcoin*
tar -zcvf PascalCoin-${{ steps.vars.outputs.tag }}-x86_64-linux.tar.gz PascalCoin* pascalcoin* *.so.1.1
tar -zcvf PascalCoin-${{ steps.vars.outputs.tag }}-x86_64-linux.tar.gz PascalCoin* pascalcoin* *.so.1.1 locale licenses pascalsha.cl LICENSE
cd ../PascalCoinMacOS
chmod +x PascalCoin* pascalcoin*
tar -zcvf PascalCoin-${{ steps.vars.outputs.tag }}-x86_64-darwin.tar.gz PascalCoin* pascalcoin*
tar -zcvf PascalCoin-${{ steps.vars.outputs.tag }}-x86_64-darwin.tar.gz PascalCoin* pascalcoin* locale licenses pascalsha.cl LICENSE
cd ../PascalCoinMacOSDiskImage
images=(*.dmg)
if [[ ${#images[@]} -ne 1 ]]; then echo "Expected one disk image" >&2; exit 1; fi
image=PascalCoin-${{ steps.vars.outputs.tag }}-macOS.dmg
if [[ "${images[0]}" != "$image" ]]; then mv "${images[0]}" "$image"; fi

- name: Checksum release files
run: |
for archive in PascalCoinWindows/*.zip PascalCoinLinux/*.tar.gz PascalCoinMacOS/*.tar.gz PascalCoinMacOSDiskImage/*.dmg; do
sha256sum "$archive" | sed 's@ .*/@ @'
done > SHA256SUMS

- name: Create GitHub release
uses: softprops/action-gh-release@v1
uses: softprops/action-gh-release@v3
with:
name: PascalCoin ${{ steps.vars.outputs.tag }}
body_path: release-notes.md
files: |
PascalCoinWindows/*.zip
PascalCoinLinux/*.tar.gz
PascalCoinMacOS/*.tar.gz
PascalCoinMacOSDiskImage/*.dmg
SHA256SUMS
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -58,3 +58,12 @@ dunit.ini
src/libssl-1_1.dll
src/libssl-1_1-x64.dll
*.rsm

# Local OpenSSL deployment; canonical runtime is tracked under windows-dll.
/src/libcrypto-1_1-x64.dll

# Generated by the FPC private-desktop test broker.
/src/tests/experimental/native/libimpPrivateDesktopBroker.a

# Local temporary work.
/.temp/
Loading
Loading