390 Rumpel wallets with Hyperbeat S1 points signed the Hyperbeat Foundation Terms of Use via ERC-1271 (Safe smart contract signatures).
- Distribution: 2025-10-30T12:01:33.494Z
- Merkle Root:
0x7feac2f301baf6c53b6ae89eaf6313d075f2387cf1281e15d52d97c86d5f717b - Wallets: 390 Hyperbeat S1 earners
- Signature Timestamp: 2025-11-21T02:28:50.713Z
Each wallet signed this message (with their own checksum address):
I accept the Hyperbeat Foundation Terms of Use
Address: <wallet>
Timestamp: 2025-11-21T02:28:50.713Z
The digest stored in each Safe is keccak256(toUtf8Bytes(message)).
The batch was executed across 6 transactions on HyperEVM (chain 999):
| Part | Transaction | Wallets |
|---|---|---|
| 1 | 0x2a9ee6aa... |
75 |
| 2 | 0xe1827682... |
75 |
| 3 | 0x9b087b21... |
75 |
| 4 | 0xdd670ff4... |
75 |
| 5 | 0xfd31659d... |
75 |
| 6 | 0xbb38257a... |
15 |
Total: 390 wallets across 6 transactions.
All verification can be done with just cast (from Foundry) - no npm/bun install needed.
Pick any wallet from hyperbeat-messages.json and verify its signature:
# Example: first wallet
cast call --rpc-url https://rpc.hyperliquid.xyz/evm \
0x00A630E6E5b8475b7f9af710231DD9536C53222F \
'isValidSignature(bytes32,bytes)(bytes4)' \
0xbca21e78bf8ef75ea43ba888ccbd049536b67ba9623bcf2b66546afad4f4fc9a \
0x
# Should return: 0x1626ba7e (ERC-1271 magic value = valid signature)Recompute the keccak256 hash of a message to confirm it matches:
# Build the message for any wallet (replace address)
ADDRESS="0x00A630E6E5b8475b7f9af710231DD9536C53222F"
MESSAGE="I accept the Hyperbeat Foundation Terms of Use
Address: ${ADDRESS}
Timestamp: 2025-11-21T02:28:50.713Z"
# Compute hash (cast keccak expects hex input, so we convert)
cast keccak "$(cast --from-utf8 "$MESSAGE")"
# Should return: 0xbca21e78bf8ef75ea43ba888ccbd049536b67ba9623bcf2b66546afad4f4fc9aEach transaction emits SignMsg(bytes32) events from the SignMessageLib. You can verify:
Via Explorer: Click any tx link above → Events tab → look for SignMsg events with topic 0xe7f4675038f4f6034dfcbbb24c4dc08e4ebf10eb9d257d3d02c0f38d122ac6e4
Via cast:
# Get logs for first transaction
cast receipt --rpc-url https://rpc.hyperliquid.xyz/evm \
0x2a9ee6aaa3a3228825032e87c123d04bccb2fd872b660915e6df2a4c093ac101 \
--json | jq '.logs | length'
# Returns number of events (multiple per tx - ExecutionSuccess, SignMsg, etc.)Loop through all wallets:
# Download the messages file
curl -sL https://gist.githubusercontent.com/jparklev/a063f02a46643f1e2dcab00f7b4546f4/raw/hyperbeat-messages.json -o messages.json
# Verify each (will take a few minutes)
jq -r '.wallets[] | "\(.address) \(.hash)"' messages.json | while read addr hash; do
result=$(cast call --rpc-url https://rpc.hyperliquid.xyz/evm "$addr" 'isValidSignature(bytes32,bytes)(bytes4)' "$hash" 0x 2>/dev/null)
if [ "$result" = "0x1626ba7e" ]; then
echo "$addr: ✅"
else
echo "$addr: ❌ ($result)"
fi
done| File | Description |
|---|---|
hyperbeat-messages.json |
All 390 wallets with address, balance, message, timestamp, and keccak256 hash |
hyperbeat-wallets.json |
Just addresses and Hyperbeat S1 balances |
verify-1271.mjs |
JS script to verify all signatures (requires ethers) |
verify-hashes.mjs |
JS script to recompute all hashes (requires ethers) |
If you prefer the JS scripts (require bun or node + ethers):
npm install ethers
bun verify-1271.mjs # Verify all ERC-1271 signatures
bun verify-hashes.mjs # Recompute all message hashes2025-12-01: Fixed timestamp mismatch. The original gist used timestamp 2025-11-21T01:53:29.097Z but the actual on-chain execution used 2025-11-21T02:28:50.713Z. This caused isValidSignature calls to fail. All hashes and the verify script have been regenerated with the correct timestamp.