Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
ae7cd3e
test: reproduce rwasm aggregate output growth
dmitry123 Aug 6, 2026
698ffca
chore: add graphify-out into gitignore
dmitry123 Aug 6, 2026
5bd279c
fix(codec): validate collection bodies before allocation
dmitry123 Aug 6, 2026
40cb584
fix(node): fail-closed genesis signature verification for built-in ne…
dmitry123 Aug 6, 2026
b2a12d9
fix(security): authenticate runtime-upgrade release artifacts before …
dmitry123 Aug 6, 2026
189449a
fix(security): revoke planned upgrade authority on ownership transitions
dmitry123 Aug 6, 2026
60c2e14
fix(precompile): charge EIP-7951 P256 verification gas
hedwig0x Aug 6, 2026
653954a
fix(fee-manager): don't allow to change owner to zero
dmitry123 Aug 6, 2026
561e2ba
fix(runtime): add test covering non-charged initial memory
dmitry123 Aug 6, 2026
9944bf2
fix(runtime): fix failing tests after rwasm upgrade
dmitry123 Aug 7, 2026
cfb1f33
fix(security): bound linear memory held across nested contract frames
dmitry123 Aug 7, 2026
fd2aa79
fix: reject overlong token metadata and error on malformed UTF-8 reads
dmitry123 Aug 7, 2026
486d1f6
fix(sdk): use solidity padding for signed and fixed-bytes mapping keys
dmitry123 Aug 7, 2026
53cb96e
fix(sdk-derive): encode event data with top-level argument semantics
dmitry123 Aug 7, 2026
2055b76
fix(universal-token): reject non-canonical creation payloads before p…
dmitry123 Aug 7, 2026
0d893ce
fix(build): key ABI structs by module path so artifacts stop dependin…
dmitry123 Aug 7, 2026
1ac524d
fix(build): verify docker image digest before running contract builds
dmitry123 Aug 7, 2026
bedb743
fix(evm): ignore unrepresentable memory offsets when resumed copy len…
dmitry123 Aug 7, 2026
3586350
docs(evm): explain why the delegated EVM runtime pins Osaka instead o…
dmitry123 Aug 7, 2026
2b91e95
docs(runtime-upgrade): explain why upgrades bypass wasm and rwasm siz…
dmitry123 Aug 7, 2026
c124a84
fix(sdk-derive): fail compilation on unsupported solidity functions a…
dmitry123 Aug 7, 2026
86ff970
fix(runtime): write ed25519 addition result to the first operand pointer
dmitry123 Aug 7, 2026
89754ac
fix(sdk): widen storage vec index math to u256 so large indices canno…
dmitry123 Aug 7, 2026
cbc6388
fix(runtime-upgrade): emit the installed code hash for canonical prec…
dmitry123 Aug 7, 2026
0ecb535
fix(webauthn): parse client data json strictly in verifyStrict instea…
dmitry123 Aug 7, 2026
9e90a4b
fix(codec): validate the full aligned word when decoding integers so …
dmitry123 Aug 7, 2026
d6dc4e6
docs(evm): explain that blob opcodes return zero because Fluent has n…
dmitry123 Aug 7, 2026
6cc7aff
fix(sdk-derive): issue static calls for generated view and pure clien…
dmitry123 Aug 7, 2026
bd2549a
fix(sdk-derive): encode indexed reference event topics with Solidity'…
dmitry123 Aug 7, 2026
e3159fb
fix(sdk-derive): resolve struct components before hashing selectors s…
dmitry123 Aug 7, 2026
981d344
fix: address remaining coderabbit findings
dmitry123 Aug 7, 2026
ab476a0
refactor: share bounded release fetcher
dmitry123 Aug 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions .github/scripts/verify-built-in-genesis.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
#!/usr/bin/env bash
set -euo pipefail

repo_root=$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)
chainspec="$repo_root/crates/node/src/chainspec.rs"
key_source="$repo_root/crates/release-verify/src/key.rs"
expected_fingerprint=0A6D05E5DD98069BA184ED8304A68D620D5208FD

tmp_dir=$(mktemp -d)
trap 'rm -rf "$tmp_dir"' EXIT

awk '
/-----BEGIN PGP PUBLIC KEY BLOCK-----/ {
sub(/^.*"-----BEGIN/, "-----BEGIN")
print
in_key = 1
next
}
in_key {
if (/-----END PGP PUBLIC KEY BLOCK-----/) {
sub(/";.*/, "")
print
exit
}
print
}
' "$key_source" > "$tmp_dir/release-key.asc"

actual_fingerprint=$(
gpg --batch --with-colons --import-options show-only --import "$tmp_dir/release-key.asc" 2>/dev/null |
awk -F: '$1 == "fpr" { print $10; exit }'
)
if [[ "$actual_fingerprint" != "$expected_fingerprint" ]]; then
echo "embedded release key fingerprint mismatch: $actual_fingerprint" >&2
exit 1
fi

export GNUPGHOME="$tmp_dir/gnupg"
mkdir -m 700 "$GNUPGHOME"
gpg --batch --quiet --import "$tmp_dir/release-key.asc"

assets=(
'fluent-devnet|v0.5.7|genesis-v0.5.7.json.gz|91b9a427805d45dd14e46a0cd517bcc85f350fe7dfc38fa96f6ff0ebf5e864da'
'fluent-testnet|v0.3.4-dev|genesis-v0.3.4-dev.json.gz|8cd30358c5664375e6739bc48302445e7ee10fd0158bedb788505e5c590983bd'
'fluent-mainnet|v1.0.0|genesis-mainnet-v1.0.0.json.gz|72cb4b3b7b15de952bd1094281a1f2430cb711bc473a0520f92aa3e2b1bdb643'
)

for spec in "${assets[@]}"; do
IFS='|' read -r network tag name expected_sha256 <<< "$spec"
grep -Fq "$tag" "$chainspec"
grep -Fq "$expected_sha256" "$chainspec"

base_url="https://github.com/fluentlabs-xyz/fluentbase/releases/download/$tag"
curl --fail --location --silent --show-error --retry 3 --retry-all-errors \
"$base_url/$name" --output "$tmp_dir/$name"
curl --fail --location --silent --show-error --retry 3 --retry-all-errors \
"$base_url/$name.asc" --output "$tmp_dir/$name.asc"

actual_sha256=$(sha256sum "$tmp_dir/$name" | awk '{print $1}')
if [[ "$actual_sha256" != "$expected_sha256" ]]; then
echo "$network: sha256 mismatch: expected $expected_sha256, got $actual_sha256" >&2
exit 1
fi
gpg --batch --verify "$tmp_dir/$name.asc" "$tmp_dir/$name"
echo "$network: authenticated $name ($actual_sha256)"
done
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ jobs:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
- name: Check release workflow hardening
run: ./.github/scripts/check-release-supply-chain.sh .github/workflows/release.yml
- name: Authenticate built-in genesis assets
run: bash ./.github/scripts/verify-built-in-genesis.sh

tests:
name: Tests (${{ matrix.name }})
Expand Down
10 changes: 9 additions & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,13 @@ jobs:
for i in $(seq 1 40); do
if docker pull "$IMAGE"; then
echo "Builder image is available"
digest="$(docker image inspect "$IMAGE" --format '{{range .RepoDigests}}{{println .}}{{end}}{{.Id}}' | sed '/^$/d' | head -n1)"
# Only a registry digest proves where the image came from; the local image ID
# does not, and the build refuses to run an image it cannot attribute.
digest="$(docker image inspect "$IMAGE" --format '{{range .RepoDigests}}{{println .}}{{end}}' | sed '/^$/d' | head -n1)"
if [[ -z "$digest" ]]; then
echo "Builder image $IMAGE has no registry digest" >&2
exit 1
fi
echo "digest=$digest" >> "$GITHUB_OUTPUT"
exit 0
fi
Expand All @@ -144,6 +150,8 @@ jobs:
FLUENTBASE_BUILD_DOCKER_IMAGE: ${{ steps.build_image.outputs.image }}
FLUENTBASE_BUILD_DOCKER_TAG: ${{ steps.build_image.outputs.tag }}
FLUENTBASE_BUILD_DOCKER_DIGEST: ${{ steps.build_image.outputs.digest }}
# A dry run builds the image locally, so it has no digest to verify.
FLUENTBASE_BUILD_ALLOW_UNVERIFIED_IMAGE: ${{ github.event.inputs.dry_run == 'true' }}
run: |
cargo build --release --locked
sha256sum \
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,4 @@ genesis-*.json
node_modules
evm-e2e/tests/
datadir
graphify-out/
Loading
Loading