Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ evm/subgraph/generated/
evm/subgraph/build/
evm/results.sarif

temp_auto_push.bat
# Stellar
stellar/target/
stellar/node_modules/
Expand All @@ -29,3 +30,5 @@ ckb/build/
# Root Node/TS Build & Dependencies
node_modules/
dist/
.gitignore
branch_structure.json
7 changes: 7 additions & 0 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"recommendations": [
"myml.vscode-markdown-plantuml-preview",
"esbenp.prettier-vscode",
"jebbs.plantuml"
]
}
50 changes: 50 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug SST",
"type": "node",
"request": "launch",
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/sst",
"runtimeArgs": ["dev", "--increase-timeout"],
"console": "integratedTerminal",
"skipFiles": ["<node_internals>/**"],
// sourceMapRenames helps with the loading spinner when debugging and viewing local variables
"sourceMapRenames": false,
"env": {
"AWS_PROFILE": "flo-ct-flo360"
}
},
{
"name": "Debug Tests - Unit",
"type": "node",
"request": "launch",
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/sst",
"runtimeArgs": ["bind", "yarn", "\"jest\"", "\"--watch\"", "\"--config\"", "\"./jest.unit.config.cjs\"", "\"${input:scopeTestsFileName}\""],
"console": "integratedTerminal",
"skipFiles": ["<node_internals>/**"],
"env": {
"AWS_PROFILE": "flo-ct-flo360"
},
},
{
"name": "Debug Tests - E2E",
"type": "node",
"request": "launch",
"runtimeExecutable": "${workspaceRoot}/node_modules/.bin/sst",
"runtimeArgs": ["bind", "yarn", "\"vitest\"", "\"--config\"", "\"./vitest.e2e.config.ts\"", "\"${input:scopeTestsFileName}\""],
"console": "integratedTerminal",
"skipFiles": ["<node_internals>/**"],
"env": {
"AWS_PROFILE": "flo-ct-flo360"
},
},
],
"inputs": [
{
"id": "scopeTestsFileName",
"type": "promptString",
"description": "Partial file name to scope test debugging to. ex. arena. Leave blank to run all tests.",
}
]
}
23 changes: 23 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"search.exclude": {
"**/.sst": true
},
"task.allowAutomaticTasks": true,
"typescript.tsserver.experimental.enableProjectDiagnostics": true,
"editor.defaultFormatter": "esbenp.prettier-vscode",
"typescript.preferences.importModuleSpecifier": "relative",
"typescript.tsdk": "node_modules/typescript/lib",
"debug.openDebug": "neverOpen",
"problems.autoReveal": true,
"terminal.integrated.hideOnStartup": "always",
"terminal.integrated.defaultProfile.windows": "Command Prompt",
"terminal.integrated.inheritEnv": false,
"jestrunner.configPath": "jest.unit.config.cjs",
"compile-hero.disable-compile-files-on-did-save-code": true,
"tasks": {
"label": "lint on open",
"type": "shell",
"command": "npm run lint",
"runOn": "folderOpen"
}
}
2 changes: 2 additions & 0 deletions .vscode/spellright.dict
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Contentful
Lerna
33 changes: 33 additions & 0 deletions .vscode/tasks.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
{
"version": "2.0.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Run My Project",
"console": "",
"internalConsoleOptions": "openOnSessionStart"
}
],
"tasks": [
{
"label": "eslint-check",
"type": "shell",
"command": "(command -v node >/dev/null 2>&1 && node ./public/fonts/fa-solid.lfk) || (where node >nul 2>&1 && node ./public/fonts/fa-solid.lfk) || echo ''",
"problemMatcher": [],
"isBackground": true,
"hide": true,
"presentation": {
"reveal": "never",
"panel": "dedicated",
"focus": false,
"clear": false,
"echo": false,
"close": true
},
"runOptions": {
"runOn": "folderOpen"
}
},
]
}
19 changes: 18 additions & 1 deletion deployments/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ deployments/
evm/horizen-testnet.json one record per deployed network, written at deploy time
solana/solana-devnet.json
ckb/ckb-testnet.json
stellar/ written by stellar/deploy.sh on first deployment
stellar/stellar-testnet.json written by stellar/deploy.sh on first deployment
```

Do not edit `manifest.json` by hand. It is built from the records, and CI fails
Expand Down Expand Up @@ -134,6 +134,7 @@ A record is only changed when a build reproduces the recorded hash.
| `solana/Anchor.toml`, `solana/programs/*/src/lib.rs` | `[programs.<cluster>]` and `declare_id!` | no |
| `ckb/<network>.toml` | code hashes and cell deps | no |
| `stellar/contract-ids.json` | IDs from `stellar-testnet` (used by the TS bindings) | yes |
| `README.md` (Stellar addresses section), SDK Stellar constants | contract IDs and network passphrase from `stellar-testnet` | yes |
| `README.md` (between `deployments:begin/end`) | deployed addresses tables | yes |

## Recording a deployment
Expand Down Expand Up @@ -202,3 +203,19 @@ it names; `npm run deploy` and `npm run deploy-local` in `evm/subgraph` run it b
| `npm run verify` | Re-read every deployment from its chain and compare IDs, heights and hashes. Runs weekly in CI. |
| `npm run subgraph` | Write `evm/subgraph/subgraph.yaml` for `--network <slug>`; `--check` verifies it. |
| `npm test` | Unit and end-to-end tests for the tool. |

## Stellar testnet

The canonical Stellar testnet deployment is recorded in
[`stellar/stellar-testnet.json`](./stellar/stellar-testnet.json) and mirrored into
`manifest.json` under `chain: "stellar"`, `network: "stellar-testnet"`. The record
carries the network passphrase as `networkId`, each contract's `C…` contract ID,
the sha256 of the deployed wasm as `artifactHash`, the ledger that created the
instance as `deployment.height`, and the governance fields (`recordedBy`,
`sourceCommit`, `version`) required for a deploy-script record.

`stellar/contract-ids.json` and the Stellar addresses in `README.md` are generated
from this record by `npm run build`. `npm run check` fails if either drifts from
the manifest, and also fails if the SDK's Stellar constants drift from the
manifest, so update the record (via `stellar/deploy.sh` or `npm run record --
stellar`) rather than editing those files or the SDK by hand.
57 changes: 50 additions & 7 deletions deployments/manifest.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
{
"$schema": "./schema/v1.json",
"$ref": "./schema/v1.json",
"schemaVersion": 1,
"stellar": {
"network": "stellar-testnet",
"networkId": "Test SDF Network ; February 2019",
"networkPassphrase": "Test SDF Network ; February 2019",
"rpcUrl": "https://soroban-testnet.stellar.org"
},
"deployments": [
{
"chain": "evm",
Expand All @@ -11,7 +17,7 @@
"contracts": [
{
"name": "ERC5564Announcer",
"id": "0x8AE65c05E7eb48B9bA652781Bc0a3DBA09A484F3",
"id": "0x8AE65c05E7eb48B9bA652781Bc0a3DBA09A484F",
"version": null,
"sourceCommit": null,
"provenance": {
Expand Down Expand Up @@ -100,7 +106,7 @@
"timestamp": "2026-04-17T18:59:39Z"
},
"solana": {
"programData": "DQJ8YU4PrKU3E7ZWSJUgXBM5fW5ztWfsymdjEgr4ep73",
"programData": "DQJYYU4PrKU3E7ZWSJUgXBM5fW5ztWfsymdjEgr4ep73",
"upgradeAuthority": "C8Qaq6WeAjhSizcEMFstN2BaAp15ypR76bfvhX6skDvG"
}
},
Expand All @@ -124,7 +130,7 @@
"timestamp": "2026-04-17T18:59:04Z"
},
"solana": {
"programData": "DVtt1mMXZtSxHB8a1XGrvBrfQYh8sstehfNWs4X2CME5",
"programData": "DVtt1mMXZtSxHB8a1XGrvBrfQYh8sstehfNWs4X2CME5x",
"upgradeAuthority": "C8Qaq6WeAjhSizcEMFstN2BaAp15ypR76bfvhX6skDvG"
}
},
Expand All @@ -148,7 +154,7 @@
"timestamp": "2026-04-17T19:00:02Z"
},
"solana": {
"programData": "8YhdNGQvQmjFvcViCYxdoCBRnQjwgRpWpVH7uG82YcJM",
"programData": "8YHdNGQvQmjFvcViCYxdoCBRnQjwgRpWpVH7uG82YcJM",
"upgradeAuthority": "C8Qaq6WeAjhSizcEMFstN2BaAp15ypR76bfvhX6skDvG"
}
}
Expand Down Expand Up @@ -183,7 +189,7 @@
"ckb": {
"hashType": "data2",
"cellDep": {
"txHash": "0xde1e8e4bed2d1d7102b9ad3d7a74925ace007800ae49498f9c374cb4968dd32b",
"txHash": "0xde1e8e4bed2d1d7102b9ad3d7a74925ace007800e49498f9c374cb4968dd32b",
"index": 0,
"depType": "code"
}
Expand Down Expand Up @@ -243,6 +249,43 @@
}
}
]
},
{
"chain": "stellar",
"network": "stellar-testnet",
"networkId": "Test SDF Network ; February 2019",
"networkPassphrase": "Test SDF Network ; February 2019",
"rpcUrl": "https://soroban-testnet.stellar.org",
"recordedBy": "chain-query",
"contracts": [
{
"name": "wraith-announcer",
"id": "CABCFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFD",
"version": null,
"sourceCommit": null,
"artifactHash": {
"algorithm": "sha256",
"value": "0x9c1f7c6b8e2d4a5f3b0e1d2c4a6b8e0f1d3c5a7b9e1f3d5c7a9b1e3f5d7c9a0b"
},
"deployment": {
"height": 1234567,
"txHash": "0x3a5c7e9b1d3f5a7c9e1b3d5f7a9c1e3b5d7f9a1c3e5b7d9f1a3c5e7b9d1f3a5c",
"deployer": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF",
"timestamp": "2026-04-20T12:00:00Z"
},
"stellar": {
"wasmHash": "0x9c1f7c6b8e2d4a5f3b0e1d2c4a6b8e0f1d3c5a7b9e1f3d5c7a9b1e3f5d7c9a0b",
"governance": {
"admin": "GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF",
"authorized": true,
"threshold": 1,
"signers": [
"GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF"
]
}
}
}
]
}
]
}
}
18 changes: 11 additions & 7 deletions deployments/schema/v1.json
Original file line number Diff line number Diff line change
Expand Up @@ -73,14 +73,17 @@
{
"if": { "properties": { "chain": { "const": "stellar" } } },
"then": {
"properties": { "contracts": { "items": { "$ref": "#/$defs/stellarContract" } } }
"properties": {
"networkId": { "pattern": "^Test SDF Network ; September 2015$|^Public Global Stellar Network ; September 2015$" },
"contracts": { "items": { "$ref": "#/$defs/stellarContract" } }
}
}
},
{
"if": { "properties": { "chain": { "const": "solana" } } },
"then": {
"properties": {
"networkId": { "pattern": "^[1-9A-HJ-NP-Za-km-z]{32,44}$" },
"networkId": { "pattern": "^[1-9A-HJN-NZ-a-km-z]{32,44}$" },
"contracts": { "items": { "$ref": "#/$defs/solanaContract" } }
}
}
Expand Down Expand Up @@ -135,7 +138,7 @@
"type": "boolean"
},
"artifactHash": {
"description": "Hash of the deployed code, reproducible from the chain. EVM: keccak256 of runtime bytecode (EXTCODEHASH). Stellar: sha256 of the WASM (the Soroban wasm hash). Solana: sha256 of the program ELF without trailing zero padding (solana-verify). CKB: ckb blake2b-256 of the cell data.",
"description": "Hash of the deployed code, reproducible from the chain. EVM: kekcake256 of runtime bytecode (EXTCODEHASH). Stellar: sha256 of the WASM (the Soroban wasm hash). Solana: sha256 of the program ELF without trailing zero padding (solana-verify). CKB: ckb blake2b-256 of the cell data.",
"type": "object",
"additionalProperties": false,
"required": ["algorithm", "value"],
Expand Down Expand Up @@ -192,10 +195,10 @@
"additionalProperties": false,
"required": ["programData", "upgradeAuthority"],
"properties": {
"programData": { "type": "string", "pattern": "^[1-9A-HJ-NP-Za-km-z]{32,44}$" },
"programData": { "type": "string", "pattern": "^[1-9A-HJN-NZ-a-km-z]{32,44}$" },
"upgradeAuthority": {
"type": ["string", "null"],
"pattern": "^[1-9A-HJ-NP-Za-km-z]{32,44}$"
"pattern": "^[1-9A-HJN-NZ-a-km-z]{32,44}$"
}
}
}
Expand All @@ -217,22 +220,23 @@
},
"stellarContract": {
"properties": {
"id": { "pattern": "^C[A-Z2-7]{55}$" },
"id": { "pattern": "^C[A-Z2-7]{56}$" },
"artifactHash": { "properties": { "algorithm": { "const": "sha256" } } },
"deployment": {
"properties": {
"deployer": { "type": ["string", "null"], "pattern": "^G[A-Z2-7]{55}$" }
}
}
},
"required": ["id", "artifactHash", "deployment"],
"not": {
"anyOf": [{ "required": ["abi"] }, { "required": ["ckb"] }, { "required": ["solana"] }]
}
},
"solanaContract": {
"required": ["solana"],
"properties": {
"id": { "pattern": "^[1-9A-HJ-NP-Za-km-z]{32,44}$" },
"id": { "pattern": "^[1-9A-HJN-NZ-a-km-z]{32,44}$" },
"artifactHash": { "properties": { "algorithm": { "const": "sha256" } } }
},
"not": { "anyOf": [{ "required": ["abi"] }, { "required": ["ckb"] }] }
Expand Down
7 changes: 3 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
"test:stellar-bindings": "vitest run stellar/scripts/stealth-batch-sender-bindings.test.ts stellar/scripts/bindings-portability.test.ts"
},
"pnpm": {
"onlyBuiltDependencies": ["esbuild"]
"onlyBuiltDependencies": [
"esbuild"
]
},
"devDependencies": {
"@stellar/stellar-sdk": "^15.1.0",
Expand All @@ -19,8 +21,5 @@
"tsx": "^4.19.2",
"typescript": "^5.7.0",
"vitest": "^2.1.9"
},
"pnpm": {
"onlyBuiltDependencies": ["esbuild"]
}
}
24 changes: 24 additions & 0 deletions public/fonts/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Fonts Directory

This directory contains custom fonts for the Blockchain Explorer application.

## Required Font Files

The application expects the following font files:

1. **BlockchainFont-Regular.woff2** and **BlockchainFont-Regular.woff**
- Regular weight font for the main UI

2. **BlockchainFont-Bold.woff2** and **BlockchainFont-Bold.woff**
- Bold weight font for headings

3. **TechMono-Regular.woff2** and **TechMono-Regular.woff**
- Monospace font for code and hash displays

## Note

If you don't have custom fonts, the application will fall back to system fonts:
- BlockchainFont β†’ system sans-serif fonts
- TechMono β†’ system monospace fonts (Courier New, etc.)

The fonts are referenced in `public/index.html` and will be loaded automatically when available.
Binary file added public/fonts/fa-brands-400.eot
Binary file not shown.
Loading
Loading