diff --git a/chaincode/reserve-manager/go/reserve_manager.go b/chaincode/reserve-manager/go/reserve_manager.go
index 3c4aec7..6ff154b 100644
--- a/chaincode/reserve-manager/go/reserve_manager.go
+++ b/chaincode/reserve-manager/go/reserve_manager.go
@@ -100,9 +100,8 @@ func (s *ReserveManagerContract) CreateReserve(ctx contractapi.TransactionContex
return fmt.Errorf("reserve %s already exists", request.ReserveID)
}
- // Parse total amount
- totalAmount, err := strconv.ParseFloat(request.TotalAmount, 64)
- if err != nil {
+ // Validate total amount parses as a number
+ if _, err := strconv.ParseFloat(request.TotalAmount, 64); err != nil {
return fmt.Errorf("invalid total amount: %v", err)
}
diff --git a/config/omnl-journal-matrix.json b/config/omnl-journal-matrix.json
index 6b3ab4d..6019c2d 100644
--- a/config/omnl-journal-matrix.json
+++ b/config/omnl-journal-matrix.json
@@ -1,5 +1,5 @@
{
- "description": "IPSAS double-entry journal matrix for OMNL Hybx (Fineract). Every entry debits one GL and credits a distinct GL. Phase C interoffice: HO leg 2100→2410, branch leg 1410→2100. Served path: smom-dbis-138/config/omnl-journal-matrix.json (override OMNL_JOURNAL_MATRIX_PATH).",
+ "description": "IPSAS double-entry journal matrix for OMNL Hybx (Fineract). Every entry debits one GL and credits a distinct GL. Phase C interoffice: HO leg 2100\u21922410, branch leg 1410\u21922100. Served path: smom-dbis-138/config/omnl-journal-matrix.json (override OMNL_JOURNAL_MATRIX_PATH).",
"source": "OMNL_IPSAS_COMPLIANCE_MATRIX",
"currencyCode": "USD",
"dateFormat": "yyyy-MM-dd",
@@ -13,7 +13,7 @@
"debitGlCode": "1000",
"creditGlCode": "2000",
"amount": 900000000000,
- "narrative": "Opening Balance Migration (Head Office) — Dr settlement asset / Cr M1 central pool",
+ "narrative": "Opening Balance Migration (Head Office) \u2014 Dr settlement asset / Cr M1 central pool",
"ipsasRef": "IPSAS 3, 28",
"moneyLayer": "M1"
},
@@ -23,7 +23,7 @@
"debitGlCode": "1050",
"creditGlCode": "2000",
"amount": 250000000000,
- "narrative": "Treasury Conversion — Dr M0 reserve / Cr M1 central pool (Head Office)",
+ "narrative": "Treasury Conversion \u2014 Dr M0 reserve / Cr M1 central pool (Head Office)",
"ipsasRef": "IPSAS 28, 29",
"moneyLayer": "M0"
},
@@ -33,7 +33,7 @@
"debitGlCode": "2100",
"creditGlCode": "2410",
"amount": 2900000000,
- "narrative": "Phase C HO leg — Shamrayan Available (M1) Office 2: Dr M1 circulating / Cr due to branch",
+ "narrative": "Phase C HO leg \u2014 Shamrayan Available (M1) Office 2: Dr M1 circulating / Cr due to branch",
"ipsasRef": "IPSAS 28",
"moneyLayer": "M1"
},
@@ -43,7 +43,7 @@
"debitGlCode": "1410",
"creditGlCode": "2100",
"amount": 2900000000,
- "narrative": "Phase C branch leg — Shamrayan Available (M1) Office 2: Dr due from HO / Cr M1 circulating",
+ "narrative": "Phase C branch leg \u2014 Shamrayan Available (M1) Office 2: Dr due from HO / Cr M1 circulating",
"ipsasRef": "IPSAS 28",
"moneyLayer": "M1"
},
@@ -53,7 +53,7 @@
"debitGlCode": "2000",
"creditGlCode": "2100",
"amount": 2100000000,
- "narrative": "Shamrayan Restricted — Dr M1 central pool / Cr M1 restricted escrow (Office 2)",
+ "narrative": "Shamrayan Restricted \u2014 Dr M1 central pool / Cr M1 restricted escrow (Office 2)",
"ipsasRef": "IPSAS 28",
"moneyLayer": "M1"
},
@@ -63,7 +63,7 @@
"debitGlCode": "2000",
"creditGlCode": "2100",
"amount": 350000000000,
- "narrative": "HYBX Capitalization Escrow — Dr M1 central pool / Cr M1 restricted (Office 3)",
+ "narrative": "HYBX Capitalization Escrow \u2014 Dr M1 central pool / Cr M1 restricted (Office 3)",
"ipsasRef": "IPSAS 28",
"moneyLayer": "M1"
},
@@ -73,7 +73,7 @@
"debitGlCode": "2100",
"creditGlCode": "2410",
"amount": 5000000000,
- "narrative": "Phase C HO leg — TAJ Allocation (M1) Office 4",
+ "narrative": "Phase C HO leg \u2014 TAJ Allocation (M1) Office 4",
"ipsasRef": "IPSAS 28",
"moneyLayer": "M1"
},
@@ -83,7 +83,7 @@
"debitGlCode": "1410",
"creditGlCode": "2100",
"amount": 5000000000,
- "narrative": "Phase C branch leg — TAJ Allocation (M1) Office 4",
+ "narrative": "Phase C branch leg \u2014 TAJ Allocation (M1) Office 4",
"ipsasRef": "IPSAS 28",
"moneyLayer": "M1"
},
@@ -93,7 +93,7 @@
"debitGlCode": "2100",
"creditGlCode": "2410",
"amount": 5000000000,
- "narrative": "Phase C HO leg — Aseret Allocation (M1) Office 5",
+ "narrative": "Phase C HO leg \u2014 Aseret Allocation (M1) Office 5",
"ipsasRef": "IPSAS 28",
"moneyLayer": "M1"
},
@@ -103,7 +103,7 @@
"debitGlCode": "1410",
"creditGlCode": "2100",
"amount": 5000000000,
- "narrative": "Phase C branch leg — Aseret Allocation (M1) Office 5",
+ "narrative": "Phase C branch leg \u2014 Aseret Allocation (M1) Office 5",
"ipsasRef": "IPSAS 28",
"moneyLayer": "M1"
},
@@ -113,7 +113,7 @@
"debitGlCode": "2100",
"creditGlCode": "2410",
"amount": 5000000000,
- "narrative": "Phase C HO leg — Mann Li Allocation (M1) Office 6",
+ "narrative": "Phase C HO leg \u2014 Mann Li Allocation (M1) Office 6",
"ipsasRef": "IPSAS 28",
"moneyLayer": "M1"
},
@@ -123,7 +123,7 @@
"debitGlCode": "1410",
"creditGlCode": "2100",
"amount": 5000000000,
- "narrative": "Phase C branch leg — Mann Li Allocation (M1) Office 6",
+ "narrative": "Phase C branch leg \u2014 Mann Li Allocation (M1) Office 6",
"ipsasRef": "IPSAS 28",
"moneyLayer": "M1"
},
@@ -133,7 +133,7 @@
"debitGlCode": "2100",
"creditGlCode": "2410",
"amount": 50000000000,
- "narrative": "Phase C HO leg — OSJ Allocation (M1) Office 7",
+ "narrative": "Phase C HO leg \u2014 OSJ Allocation (M1) Office 7",
"ipsasRef": "IPSAS 28",
"moneyLayer": "M1"
},
@@ -143,7 +143,7 @@
"debitGlCode": "1410",
"creditGlCode": "2100",
"amount": 50000000000,
- "narrative": "Phase C branch leg — OSJ Allocation (M1) Office 7",
+ "narrative": "Phase C branch leg \u2014 OSJ Allocation (M1) Office 7",
"ipsasRef": "IPSAS 28",
"moneyLayer": "M1"
},
@@ -153,7 +153,7 @@
"debitGlCode": "2100",
"creditGlCode": "2410",
"amount": 50000000000,
- "narrative": "Phase C HO leg — Alltra Allocation (M1) Office 8",
+ "narrative": "Phase C HO leg \u2014 Alltra Allocation (M1) Office 8",
"ipsasRef": "IPSAS 28",
"moneyLayer": "M1"
},
@@ -163,7 +163,7 @@
"debitGlCode": "1410",
"creditGlCode": "2100",
"amount": 50000000000,
- "narrative": "Phase C branch leg — Alltra Allocation (M1) Office 8",
+ "narrative": "Phase C branch leg \u2014 Alltra Allocation (M1) Office 8",
"ipsasRef": "IPSAS 28",
"moneyLayer": "M1"
},
@@ -173,7 +173,7 @@
"debitGlCode": "2100",
"creditGlCode": "2410",
"amount": 1000000000,
- "narrative": "HOSPITALLERS-24 opening HO leg — Dr M1 circulating / Cr due to Office 24",
+ "narrative": "HOSPITALLERS-24 opening HO leg \u2014 Dr M1 circulating / Cr due to Office 24",
"ipsasRef": "IPSAS 28",
"moneyLayer": "M1"
},
@@ -183,19 +183,80 @@
"debitGlCode": "1410",
"creditGlCode": "2100",
"amount": 1000000000,
- "narrative": "HOSPITALLERS-24 opening branch leg — Dr due from HO / Cr M1 circulating (live $1B post)",
+ "narrative": "HOSPITALLERS-24 opening branch leg \u2014 Dr due from HO / Cr M1 circulating (live $1B post)",
"ipsasRef": "IPSAS 28",
"moneyLayer": "M1"
},
+ {
+ "memo": "T-H24-S1-HO",
+ "officeId": 1,
+ "debitGlCode": "2100",
+ "creditGlCode": "2410",
+ "amount": 100000000000,
+ "narrative": "HOSPITALLERS-24 supplement S1 HO leg",
+ "ipsasRef": "IPSAS 28, 29",
+ "moneyLayer": "M1"
+ },
+ {
+ "memo": "T-H24-S1-BR",
+ "officeId": 24,
+ "debitGlCode": "1410",
+ "creditGlCode": "2100",
+ "amount": 100000000000,
+ "narrative": "HOSPITALLERS-24 supplement S1 branch leg",
+ "ipsasRef": "IPSAS 28, 29",
+ "moneyLayer": "M1"
+ },
+ {
+ "memo": "T-H24-S2-HO",
+ "officeId": 1,
+ "debitGlCode": "2100",
+ "creditGlCode": "2410",
+ "amount": 100000000000,
+ "narrative": "HOSPITALLERS-24 supplement S2 HO leg",
+ "ipsasRef": "IPSAS 28, 29",
+ "moneyLayer": "M1"
+ },
+ {
+ "memo": "T-H24-S2-BR",
+ "officeId": 24,
+ "debitGlCode": "1410",
+ "creditGlCode": "2100",
+ "amount": 100000000000,
+ "narrative": "HOSPITALLERS-24 supplement S2 branch leg",
+ "ipsasRef": "IPSAS 28, 29",
+ "moneyLayer": "M1"
+ },
+ {
+ "memo": "T-H24-S3-HO",
+ "officeId": 1,
+ "debitGlCode": "2100",
+ "creditGlCode": "2410",
+ "amount": 99000000000,
+ "narrative": "HOSPITALLERS-24 supplement S3 HO leg",
+ "ipsasRef": "IPSAS 28, 29",
+ "moneyLayer": "M1"
+ },
+ {
+ "memo": "T-H24-S3-BR",
+ "officeId": 24,
+ "debitGlCode": "1410",
+ "creditGlCode": "2100",
+ "amount": 99000000000,
+ "narrative": "HOSPITALLERS-24 supplement S3 branch leg",
+ "ipsasRef": "IPSAS 28, 29",
+ "moneyLayer": "M1"
+ },
{
"memo": "T-M1M2",
"officeId": 24,
"debitGlCode": "2100",
"creditGlCode": "2200",
"amount": 0,
- "narrative": "M1→M2 broad-money conversion — Dr M1 circulating / Cr M2 broad money",
+ "narrative": "M1\u2192M2 broad-money conversion \u2014 Dr M1 circulating / Cr M2 broad money",
"ipsasRef": "IPSAS 28, 29",
- "moneyLayer": "M2"
+ "moneyLayer": "M2",
+ "variableAmount": true
},
{
"memo": "T-M2M3",
@@ -203,9 +264,10 @@
"debitGlCode": "2200",
"creditGlCode": "2300",
"amount": 0,
- "narrative": "M2→M3 token load — Dr M2 broad money / Cr M3 on-chain token liability",
+ "narrative": "M2\u2192M3 token load \u2014 Dr M2 broad money / Cr M3 on-chain token liability",
"ipsasRef": "IPSAS 28, 29",
- "moneyLayer": "M3"
+ "moneyLayer": "M3",
+ "variableAmount": true
},
{
"memo": "T-M2M4",
@@ -213,9 +275,10 @@
"debitGlCode": "2200",
"creditGlCode": "1000",
"amount": 0,
- "narrative": "M2→M4 SWIFT/RTGS outbound — Dr M2 broad money / Cr settlement suspense (GL 1000)",
+ "narrative": "M2\u2192M4 SWIFT/RTGS outbound \u2014 Dr M2 broad money / Cr settlement suspense (GL 1000)",
"ipsasRef": "IPSAS 2, 28",
- "moneyLayer": "M4"
+ "moneyLayer": "M4",
+ "variableAmount": true
},
{
"memo": "T-M1M4",
@@ -223,9 +286,10 @@
"debitGlCode": "2100",
"creditGlCode": "1000",
"amount": 0,
- "narrative": "M1→M4 SWIFT/RTGS outbound — Dr M1 circulating / Cr settlement suspense (GL 1000)",
+ "narrative": "M1\u2192M4 SWIFT/RTGS outbound \u2014 Dr M1 circulating / Cr settlement suspense (GL 1000)",
"ipsasRef": "IPSAS 2, 28",
- "moneyLayer": "M4"
+ "moneyLayer": "M4",
+ "variableAmount": true
},
{
"memo": "T-M4-IN",
@@ -233,9 +297,10 @@
"debitGlCode": "1000",
"creditGlCode": "2200",
"amount": 0,
- "narrative": "M4 inbound SWIFT settled — Dr settlement suspense / Cr M2 broad money",
+ "narrative": "M4 inbound SWIFT settled \u2014 Dr settlement suspense / Cr M2 broad money",
"ipsasRef": "IPSAS 2, 28",
- "moneyLayer": "M4"
+ "moneyLayer": "M4",
+ "variableAmount": true
},
{
"memo": "T-SBLC",
@@ -243,9 +308,10 @@
"debitGlCode": "1410",
"creditGlCode": "2100",
"amount": 0,
- "narrative": "SBLC trade finance — Dr inter-office receivable / Cr M1",
+ "narrative": "SBLC trade finance \u2014 Dr inter-office receivable / Cr M1",
"ipsasRef": "IPSAS 28, 29",
- "moneyLayer": "M4"
+ "moneyLayer": "M4",
+ "variableAmount": true
},
{
"memo": "T-DLC",
@@ -253,9 +319,10 @@
"debitGlCode": "1410",
"creditGlCode": "1000",
"amount": 0,
- "narrative": "Documentary LC — Dr contingent receivable / Cr M4 settlement suspense",
+ "narrative": "Documentary LC \u2014 Dr contingent receivable / Cr M4 settlement suspense",
"ipsasRef": "IPSAS 2, 28",
- "moneyLayer": "M4"
+ "moneyLayer": "M4",
+ "variableAmount": true
},
{
"memo": "T-BG",
@@ -263,9 +330,10 @@
"debitGlCode": "1410",
"creditGlCode": "2100",
"amount": 0,
- "narrative": "Bank guarantee — Dr contingent receivable / Cr M1",
+ "narrative": "Bank guarantee \u2014 Dr contingent receivable / Cr M1",
"ipsasRef": "IPSAS 28, 29",
- "moneyLayer": "M4"
+ "moneyLayer": "M4",
+ "variableAmount": true
},
{
"memo": "T-LS",
@@ -273,9 +341,10 @@
"debitGlCode": "1000",
"creditGlCode": "2200",
"amount": 0,
- "narrative": "Letter of settlement — Dr M4 suspense / Cr M2",
+ "narrative": "Letter of settlement \u2014 Dr M4 suspense / Cr M2",
"ipsasRef": "IPSAS 2, 28",
- "moneyLayer": "M4"
+ "moneyLayer": "M4",
+ "variableAmount": true
},
{
"memo": "SETTLE-NOSTRO",
@@ -283,9 +352,10 @@
"debitGlCode": "13010",
"creditGlCode": "2000",
"amount": 0,
- "narrative": "Nostro settlement — Dr FX nostro asset / Cr M1 central pool",
+ "narrative": "Nostro settlement \u2014 Dr FX nostro asset / Cr M1 central pool",
"ipsasRef": "IPSAS 28",
- "moneyLayer": "M1"
+ "moneyLayer": "M1",
+ "variableAmount": true
}
]
}
diff --git a/config/omnl-production-domains.v1.json b/config/omnl-production-domains.v1.json
index 9dc5de1..89bdf74 100644
--- a/config/omnl-production-domains.v1.json
+++ b/config/omnl-production-domains.v1.json
@@ -48,6 +48,23 @@
"host": "office24.omdnl.org",
"product": "office-24",
"defaultRoute": "/office-24"
+ },
+ {
+ "host": "bank.omnl.omdnl.org",
+ "product": "office-24",
+ "defaultRoute": "/office-24",
+ "aliasOf": "office24.omdnl.org",
+ "dnsZone": "omdnl.org",
+ "notes": "Cloudflare A + NPMplus; operator-controlled"
+ },
+ {
+ "host": "bank.omnl.hybxfinance.io",
+ "product": "office-24",
+ "defaultRoute": "/office-24",
+ "aliasOf": "office24.omdnl.org",
+ "dnsZone": "hybxfinance.io",
+ "externalOnly": true,
+ "notes": "HYBX Route53 — optional; use bank.omnl.omdnl.org if operator lacks AWS access"
}
]
}
diff --git a/config/omnl-supported-chains.v1.json b/config/omnl-supported-chains.v1.json
index ac04f46..83e2cc2 100644
--- a/config/omnl-supported-chains.v1.json
+++ b/config/omnl-supported-chains.v1.json
@@ -6,7 +6,7 @@
"primaryChainId": 138,
"mirrorChainId": 651940,
"settlementOfficeId": 24,
- "generatedAt": "2026-06-28T15:22:27.822Z",
+ "generatedAt": "2026-07-06T00:25:58.964Z",
"chains": [
{
"chainId": 138,
diff --git a/deploy/nginx/omnl-common-locations.conf b/deploy/nginx/omnl-common-locations.conf
index e08127f..ec6f588 100644
--- a/deploy/nginx/omnl-common-locations.conf
+++ b/deploy/nginx/omnl-common-locations.conf
@@ -33,6 +33,17 @@ location /exchange/ {
proxy_read_timeout 120s;
}
+location /assets/ {
+ proxy_pass http://omnl_frontend;
+ proxy_http_version 1.1;
+ proxy_set_header Host $host;
+ proxy_set_header X-Real-IP $remote_addr;
+ proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+ proxy_set_header X-Forwarded-Proto $scheme;
+ proxy_buffering off;
+ proxy_request_buffering off;
+}
+
# token-aggregation HTML consoles (/omnl/compliance, /omnl/dashboard, /omnl/terminal)
location /omnl/ {
include /etc/nginx/omnl-portal-auth-current.conf.inc;
diff --git a/deploy/nginx/omnl-domains.conf b/deploy/nginx/omnl-domains.conf
index a88f410..f7797bd 100644
--- a/deploy/nginx/omnl-domains.conf
+++ b/deploy/nginx/omnl-domains.conf
@@ -28,7 +28,7 @@ server {
add_header X-OMNL-Chains "128" always;
location = / {
- return 302 /trade;
+ return 302 https://$host/trade;
}
include /etc/nginx/snippets/omnl-common-locations.conf;
@@ -44,7 +44,7 @@ server {
add_header X-OMNL-Chains "128" always;
location = / {
- return 302 /central-bank;
+ return 302 https://$host/central-bank;
}
include /etc/nginx/snippets/omnl-common-locations.conf;
@@ -60,7 +60,7 @@ server {
add_header X-OMNL-Chains "128" always;
location = / {
- return 302 /central-bank;
+ return 302 https://$host/central-bank;
}
include /etc/nginx/snippets/omnl-common-locations.conf;
@@ -76,7 +76,7 @@ server {
add_header X-OMNL-Chains "128" always;
location = / {
- return 302 /trade;
+ return 302 https://$host/trade;
}
include /etc/nginx/snippets/omnl-common-locations.conf;
@@ -92,23 +92,23 @@ server {
add_header X-OMNL-Chains "128" always;
location = / {
- return 302 /swap;
+ return 302 https://$host/swap;
}
include /etc/nginx/snippets/omnl-common-locations.conf;
}
-# Office 24 settlement — office24.omdnl.org
+# Office 24 settlement — office24.omdnl.org + operator alias bank.omnl.omdnl.org
server {
listen 80;
listen [::]:80;
- server_name office24.omdnl.org;
+ server_name office24.omdnl.org bank.omnl.omdnl.org;
add_header X-OMNL-Product "office-24" always;
add_header X-OMNL-Chains "128" always;
location = / {
- return 302 /office-24;
+ return 302 https://$host/office-24;
}
include /etc/nginx/snippets/omnl-common-locations.conf;
diff --git a/fabric/chaincode/bridge/bridge.go b/fabric/chaincode/bridge/bridge.go
index 569ebea..22ace09 100644
--- a/fabric/chaincode/bridge/bridge.go
+++ b/fabric/chaincode/bridge/bridge.go
@@ -3,7 +3,6 @@ package main
import (
"encoding/json"
"fmt"
- "strconv"
"github.com/hyperledger/fabric-contract-api-go/contractapi"
)
diff --git a/frontend-dapp/ENV_SETUP_COMPLETE.md b/frontend-dapp/ENV_SETUP_COMPLETE.md
index c22516d..1d7f4b0 100644
--- a/frontend-dapp/ENV_SETUP_COMPLETE.md
+++ b/frontend-dapp/ENV_SETUP_COMPLETE.md
@@ -12,7 +12,7 @@ Location: `smom-dbis-138/frontend-dapp/.env`
1. **Reown/WalletConnect Project ID**
```
- VITE_WALLETCONNECT_PROJECT_ID=b890bbeeff48275b4a115e2ef105195a
+ VITE_WALLETCONNECT_PROJECT_ID=56972cec44a77f83975463494711e8fa
```
- Used by wagmi for WalletConnect connector
- Configured in `src/config/wagmi.ts`
diff --git a/frontend-dapp/package.json b/frontend-dapp/package.json
index b81e00d..4cb940f 100644
--- a/frontend-dapp/package.json
+++ b/frontend-dapp/package.json
@@ -13,6 +13,8 @@
"test:coverage": "vitest --coverage"
},
"dependencies": {
+ "@emotion/react": "^11.14.0",
+ "@emotion/styled": "^11.14.1",
"@safe-global/api-kit": "^4.0.1",
"@safe-global/protocol-kit": "^1.3.0",
"@tanstack/react-query": "^5.90.21",
@@ -22,6 +24,9 @@
"@walletconnect/ethereum-provider": "^2.23.5",
"autoprefixer": "^10.4.24",
"ethers": "^5.8.0",
+ "lit": "^3.3.3",
+ "lit-element": "^4.2.2",
+ "lit-html": "^3.3.3",
"postcss": "^8.5.6",
"react": "^18.3.1",
"react-dom": "^18.3.1",
diff --git a/frontend-dapp/src/components/layout/Layout.tsx b/frontend-dapp/src/components/layout/Layout.tsx
index d55e4c6..e67b3bd 100644
--- a/frontend-dapp/src/components/layout/Layout.tsx
+++ b/frontend-dapp/src/components/layout/Layout.tsx
@@ -1,14 +1,10 @@
-import { Link, useLocation } from 'react-router-dom'
+import { Link, Outlet, useLocation } from 'react-router-dom'
import { useRef } from 'react'
import WalletConnect from '../wallet/WalletConnect'
import WalletDisconnectNotice from '../wallet/WalletDisconnectNotice'
import { defaultFrontendExplorerUrl } from '../../config/networks'
-interface LayoutProps {
- children: React.ReactNode
-}
-
-export default function Layout({ children }: LayoutProps) {
+export default function Layout() {
const location = useLocation()
const userInitiatedDisconnectRef = useRef(false)
@@ -73,7 +69,9 @@ export default function Layout({ children }: LayoutProps) {
- {children}
+
+
+