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}
+
+ +