From b3a8fe449676bd7c53cbfb17b6ca9719ec39cd8b Mon Sep 17 00:00:00 2001 From: defiQUG Date: Mon, 2 Mar 2026 11:37:34 -0800 Subject: [PATCH] chore: sync all changes to Gitea - Config, docs, scripts, and backup manifests - Submodule refs unchanged (m = modified content in submodules) Made-with: Cursor --- .../rules/operator-context-lan-proxmox.mdc | 10 + .cursor/worktrees.json | 5 + .env.example | 310 ---- .github/workflows/validate-config.yml | 7 + .github/workflows/validate-omnl-rail.yml | 33 + .gitignore | 15 + CRUNCHY-21-20260224-TR1-1B-AUDIT.zip | Bin 0 -> 2992 bytes INTEGRATIONS_QUICK_REFERENCE.md | 2 + SAMAMA-20-20260224-TR1-500M-AUDIT.tar.gz | Bin 0 -> 1415 bytes SAMAMA-20-20260224-TR1-500M-AUDIT.zip | Bin 0 -> 3078 bytes backups/npmplus/backup-20260222_030001.tar.gz | Bin 0 -> 5142 bytes .../api/access_lists.json | 1 + .../api/certificates.json | 685 ++++++++ .../api/proxy_hosts.json | 1394 ++++++++++++++++ .../certificates/cert_list.txt | 0 .../database/database.sql | 1 + .../database/database.sqlite | 0 .../backup-20260222_030001/manifest.json | 19 + .../volumes/volume_list.txt | 1 + backups/npmplus/backup-20260222_161826.tar.gz | Bin 0 -> 5133 bytes .../api/access_lists.json | 1 + .../api/certificates.json | 685 ++++++++ .../api/proxy_hosts.json | 1394 ++++++++++++++++ .../certificates/cert_list.txt | 0 .../database/database.sql | 1 + .../database/database.sqlite | 0 .../backup-20260222_161826/manifest.json | 19 + .../volumes/volume_list.txt | 1 + backups/npmplus/backup-20260222_162326.tar.gz | Bin 0 -> 5130 bytes .../api/access_lists.json | 1 + .../api/certificates.json | 685 ++++++++ .../api/proxy_hosts.json | 1394 ++++++++++++++++ .../certificates/cert_list.txt | 0 .../database/database.sql | 1 + .../database/database.sqlite | 0 .../backup-20260222_162326/manifest.json | 19 + .../volumes/volume_list.txt | 1 + backups/npmplus/backup-20260223_030001.tar.gz | Bin 0 -> 5135 bytes .../api/access_lists.json | 1 + .../api/certificates.json | 685 ++++++++ .../api/proxy_hosts.json | 1394 ++++++++++++++++ .../certificates/cert_list.txt | 0 .../database/database.sql | 1 + .../database/database.sqlite | 0 .../backup-20260223_030001/manifest.json | 19 + .../volumes/volume_list.txt | 1 + backups/npmplus/backup-20260223_235202.tar.gz | Bin 0 -> 5132 bytes .../api/access_lists.json | 1 + .../api/certificates.json | 685 ++++++++ .../api/proxy_hosts.json | 1394 ++++++++++++++++ .../certificates/cert_list.txt | 0 .../database/database.sql | 1 + .../database/database.sqlite | 0 .../backup-20260223_235202/manifest.json | 19 + .../volumes/volume_list.txt | 1 + backups/npmplus/backup-20260224_021431.tar.gz | Bin 0 -> 5129 bytes .../api/access_lists.json | 1 + .../api/certificates.json | 685 ++++++++ .../api/proxy_hosts.json | 1394 ++++++++++++++++ .../certificates/cert_list.txt | 0 .../database/database.sql | 1 + .../database/database.sqlite | 0 .../backup-20260224_021431/manifest.json | 19 + .../volumes/volume_list.txt | 1 + backups/npmplus/backup-20260224_030001.tar.gz | Bin 0 -> 5136 bytes .../api/access_lists.json | 1 + .../api/certificates.json | 685 ++++++++ .../api/proxy_hosts.json | 1394 ++++++++++++++++ .../certificates/cert_list.txt | 0 .../database/database.sql | 1 + .../database/database.sqlite | 0 .../backup-20260224_030001/manifest.json | 19 + .../volumes/volume_list.txt | 1 + backups/npmplus/backup-20260224_062338.tar.gz | Bin 0 -> 5118 bytes .../api/access_lists.json | 1 + .../api/certificates.json | 685 ++++++++ .../api/proxy_hosts.json | 1394 ++++++++++++++++ .../certificates/cert_list.txt | 0 .../database/database.sql | 1 + .../database/database.sqlite | 0 .../backup-20260224_062338/manifest.json | 19 + .../volumes/volume_list.txt | 1 + backups/npmplus/backup-20260225_030001.tar.gz | Bin 0 -> 5139 bytes .../api/access_lists.json | 1 + .../api/certificates.json | 685 ++++++++ .../api/proxy_hosts.json | 1394 ++++++++++++++++ .../certificates/cert_list.txt | 0 .../database/database.sql | 1 + .../database/database.sqlite | 0 .../backup-20260225_030001/manifest.json | 19 + .../volumes/volume_list.txt | 1 + backups/npmplus/backup-20260226_030001.tar.gz | Bin 0 -> 5290 bytes .../api/access_lists.json | 1 + .../api/certificates.json | 685 ++++++++ .../api/proxy_hosts.json | 1394 ++++++++++++++++ .../certificates/cert_list.txt | 0 .../database/database.sql | 1 + .../database/database.sqlite | 0 .../backup-20260226_030001/manifest.json | 19 + .../volumes/volume_list.txt | 1 + backups/npmplus/backup-20260227_030002.tar.gz | Bin 0 -> 5288 bytes .../api/access_lists.json | 1 + .../api/certificates.json | 685 ++++++++ .../api/proxy_hosts.json | 1394 ++++++++++++++++ .../certificates/cert_list.txt | 0 .../database/database.sql | 1 + .../database/database.sqlite | 0 .../backup-20260227_030002/manifest.json | 19 + .../volumes/volume_list.txt | 1 + backups/npmplus/backup-20260227_182609.tar.gz | Bin 0 -> 5303 bytes .../api/access_lists.json | 1 + .../api/certificates.json | 685 ++++++++ .../api/proxy_hosts.json | 1394 ++++++++++++++++ .../certificates/cert_list.txt | 0 .../database/database.sql | 1 + .../database/database.sqlite | 0 .../backup-20260227_182609/manifest.json | 19 + .../volumes/volume_list.txt | 1 + backups/npmplus/backup-20260228_030001.tar.gz | Bin 0 -> 5312 bytes .../api/access_lists.json | 1 + .../api/certificates.json | 685 ++++++++ .../api/proxy_hosts.json | 1394 ++++++++++++++++ .../certificates/cert_list.txt | 0 .../database/database.sql | 1 + .../database/database.sqlite | 0 .../backup-20260228_030001/manifest.json | 19 + .../volumes/volume_list.txt | 1 + backups/npmplus/backup-20260301_030001.tar.gz | Bin 0 -> 5313 bytes .../api/access_lists.json | 1 + .../api/certificates.json | 685 ++++++++ .../api/proxy_hosts.json | 1394 ++++++++++++++++ .../certificates/cert_list.txt | 0 .../database/database.sql | 1 + .../database/database.sqlite | 0 .../backup-20260301_030001/manifest.json | 19 + .../volumes/volume_list.txt | 1 + backups/npmplus/backup-20260302_030001.tar.gz | Bin 0 -> 5438 bytes .../api/access_lists.json | 1 + .../api/certificates.json | 698 ++++++++ .../api/proxy_hosts.json | 1425 +++++++++++++++++ .../certificates/cert_list.txt | 0 .../database/database.sql | 1 + .../database/database.sqlite | 0 .../backup-20260302_030001/manifest.json | 19 + .../volumes/volume_list.txt | 1 + config/ip-addresses.conf | 7 + config/smart-contracts-master.json | 156 -- config/token-mapping-multichain.json | 1254 ++++++++++++++- config/token-mapping.json | 64 - ...L_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md | 373 +++++ .../ALL_RECOMMENDATIONS_HIGH_PRIORITY.md | 136 ++ .../ALL_RECOMMENDATIONS_OPERATOR_ONLY.md | 140 ++ docs/00-meta/ARCHIVE_CANDIDATES.md | 8 +- .../BLITZKRIEG_SOURCE_DOCUMENT_INDEX.md | 53 - ...ETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md | 72 + docs/00-meta/CW_BRIDGE_TASK_LIST.md | 118 ++ .../DBIS_CORE_TS_FIXES_DETAILED_LIST.md | 184 +++ .../DOCUMENTATION_CONSOLIDATION_PLAN.md | 17 +- docs/00-meta/FULL_PARALLEL_EXECUTION_ORDER.md | 4 +- docs/00-meta/GAPS_STATUS.md | 41 + .../MAINNET_LIQUIDITY_AND_RAMPS_PRIORITY.md | 112 ++ docs/00-meta/MASTER_DOCUMENTATION_INDEX.md | 41 - docs/00-meta/MASTER_PLAN.md | 6 +- docs/00-meta/NEXT_STEPS_2101_AND_STORAGE.md | 80 + docs/00-meta/NEXT_STEPS_ALL.md | 6 +- .../00-meta/NEXT_STEPS_AND_REMAINING_TODOS.md | 105 +- docs/00-meta/NEXT_STEPS_FOR_YOU.md | 19 +- docs/00-meta/NEXT_STEPS_INDEX.md | 42 +- docs/00-meta/NEXT_STEPS_MASTER.md | 7 +- ...RATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md | 122 ++ docs/00-meta/OPERATOR_CONTEXT_VERIFIED.md | 19 + docs/00-meta/OPERATOR_READY_CHECKLIST.md | 39 +- docs/00-meta/PHASES_AND_TASKS_MASTER.md | 4 +- ...LACEHOLDERS_AND_REQUIRED_ADDITIONS_LIST.md | 4 +- .../RECOMMENDATIONS_OPERATOR_CHECKLIST.md | 8 +- ...NG_COMPONENTS_TASKS_AND_RECOMMENDATIONS.md | 4 +- .../REMAINING_ITEMS_FULL_PARALLEL_LIST.md | 2 +- docs/00-meta/REMAINING_TASKS.md | 31 + .../REMAINING_TASKS_BREAKDOWN_MISSING_INFO.md | 248 +++ .../REMAINING_WORK_BREAKDOWN_AND_ANSWERS.md | 6 +- docs/00-meta/REMAINING_WORK_DETAILED_STEPS.md | 6 +- docs/00-meta/REMAINING_WORK_DETAILED_TASKS.md | 4 +- docs/00-meta/REPOSITORIES_AND_PRS_CHAIN138.md | 148 ++ .../STILL_NOT_DONE_EXECUTION_CHECKLIST.md | 84 + ..._RUNBOOKS_REMAINING_AND_RECOMMENDATIONS.md | 142 -- .../TASKS_TO_INCREASE_ALL_E2E_FLOWS.md | 160 ++ docs/00-meta/TASK_CHECK_REPORT.md | 130 ++ docs/00-meta/TASK_LIST_REVIEW_2026_03_01.md | 63 + docs/00-meta/TODOS_CONSOLIDATED.md | 84 +- docs/00-meta/TODO_TASK_LIST_MASTER.md | 24 +- .../00-meta/WAVE2_WAVE3_OPERATOR_CHECKLIST.md | 2 +- .../WHATS_LEFT_OPERATOR_AND_EXTERNAL.md | 59 + .../AI_AGENTS_57XX_DEPLOYMENT_TASKS.md | 231 +++ ...AI_AGENTS_57XX_MCP_CONTRACTS_AND_CHAINS.md | 90 ++ .../PROXMOX_HA_CLUSTER_ROADMAP.md | 2 +- .../R630_13_NODE_DOD_HA_MASTER_PLAN.md | 273 ++++ docs/02-architecture/VMID_ALLOCATION_FINAL.md | 81 +- .../ADD_LIQUIDITY_PMM_CHAIN138_RUNBOOK.md | 49 + .../CONTRACT_DEPLOYMENT_RUNBOOK.md | 45 +- .../DEPLOYMENT_ORDER_OF_OPERATIONS.md | 194 +++ ...EXT_STEPS_PMM_FULL_PARITY_AND_ALL_POOLS.md | 118 ++ .../03-deployment/PRE_DEPLOYMENT_CHECKLIST.md | 175 ++ ...RECOMMENDATIONS_AND_FIXES_BEFORE_DEPLOY.md | 141 ++ .../REQUIRED_FIXES_AND_DEPLOYMENTS_STATUS.md | 42 + docs/03-deployment/RPC_2101_READONLY_FIX.md | 57 + ...ANSACTION_MIRROR_CHAIN138_COLLISION_FIX.md | 62 + ...DEPLOYED_CONTRACTS_PRE_DEPLOYMENT_TASKS.md | 116 ++ docs/03-deployment/sankofa-studio.env.example | 44 + .../22_TOKENS_13_CHAINS_DEPLOYMENT_RUNBOOK.md | 131 ++ docs/04-configuration/ALL_VMIDS_ENDPOINTS.md | 7 + .../CHAIN138_X402_TOKEN_SUPPORT.md | 44 + .../C_TO_CW_MAPPER_MAPPING.md | 51 + .../DETAILED_GAPS_AND_ISSUES_LIST.md | 173 ++ .../DEX_AND_AGGREGATORS_CHAIN138_EXPLAINER.md | 200 +++ .../EXPLORER_FUNCTIONALITY_REVIEW.md | 51 + .../EXPLORER_GAPS_AND_RECOMMENDATIONS.md | 125 ++ .../EXPLORER_METAMASK_TECHNICAL_RESPONSE.md | 170 ++ .../EXPLORER_TOKENS_GRU_POLICY.md | 42 + .../EXPLORER_TROUBLESHOOTING.md | 18 + .../FULL_PARITY_TOKEN_COVERAGE_RUNBOOK.md | 146 ++ ...ND_DOCS_REVIEW_GAPS_AND_INCONSISTENCIES.md | 114 ++ .../GRU_M00_DIAMOND_FACET_MAP.md | 202 +++ .../GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md | 175 ++ ...DIAMOND_REVIEW_GAPS_AND_RECOMMENDATIONS.md | 263 +++ .../INGRESS_VERIFICATION_RUNBOOK.md | 2 + .../IPFS_TOKEN_LOGOS_RUNBOOK.md | 180 +++ ...2_INTAKE_GATEWAY_CONTRACT_MULTI_NETWORK.md | 176 ++ .../ISO4217_COMPLIANT_TOKEN_MATRIX.md | 168 ++ .../MAINNET_RAMP_USER_FLOWS.md | 42 + .../MIGRATION_PLAN_R630_01_DATA.md | 140 ++ .../PHYSICAL_DRIVES_AND_CONFIG.md | 69 + ...RICE_FEED_CHAIN138_METAMASK_AND_WALLETS.md | 120 ++ .../PR_ADDITIONS_VALIDATION_REPORT.md | 171 ++ docs/04-configuration/README.md | 41 + docs/04-configuration/RPC_ENDPOINTS_MASTER.md | 3 +- .../SECRETS_CONSOLIDATED_DOWNLOAD.env | 205 +++ ...MART_CONTRACTS_ISO20022_FIN_METHODOLOGY.md | 262 +++ .../STORAGE_FIX_R630_01_AND_THIN5.md | 64 + .../STORAGE_RECOMMENDATIONS_BY_FILL_RATE.md | 145 ++ .../THIRDWEB_BRIDGE_VS_CCIP.md | 41 + .../THIRDWEB_WALLETS_INTEGRATION.md | 124 ++ .../TOKEN_AGGREGATION_REPORT_API_RUNBOOK.md | 124 ++ .../TOKEN_LISTS_E2E_VERIFICATION.md | 94 ++ docs/04-configuration/TOKEN_LIST_PR_REVIEW.md | 198 +++ .../VERIFICATION_GAPS_AND_TODOS.md | 6 +- .../coingecko/COINGECKO_SUBMISSION_GUIDE.md | 10 +- .../coingecko/exports/report-cmc-1.json | 1 + .../coingecko/exports/report-cmc-10.json | 1 + .../coingecko/exports/report-cmc-100.json | 1 + .../coingecko/exports/report-cmc-1111.json | 1 + .../coingecko/exports/report-cmc-137.json | 1 + .../coingecko/exports/report-cmc-138.json | 1 + .../coingecko/exports/report-cmc-25.json | 1 + .../coingecko/exports/report-cmc-42161.json | 1 + .../coingecko/exports/report-cmc-42220.json | 1 + .../coingecko/exports/report-cmc-43114.json | 1 + .../coingecko/exports/report-cmc-56.json | 1 + .../coingecko/exports/report-cmc-651940.json | 1 + .../coingecko/exports/report-cmc-8453.json | 1 + .../coingecko/exports/report-coingecko-1.json | 1 + .../exports/report-coingecko-10.json | 1 + .../exports/report-coingecko-100.json | 1 + .../exports/report-coingecko-1111.json | 1 + .../exports/report-coingecko-137.json | 1 + .../exports/report-coingecko-138.json | 1 + .../exports/report-coingecko-25.json | 1 + .../exports/report-coingecko-42161.json | 1 + .../exports/report-coingecko-42220.json | 1 + .../exports/report-coingecko-43114.json | 1 + .../exports/report-coingecko-56.json | 1 + .../exports/report-coingecko-651940.json | 1 + .../exports/report-coingecko-8453.json | 1 + .../exports/report-cross-chain-138.json | 1 + .../coingecko/exports/token-list-all.json | 1 + .../coingecko/logos/ipfs-manifest.json | 122 ++ .../scripts/prepare-token-logos-512x512.sh | 85 + .../metamask/DUAL_CHAIN_NETWORKS.json | 72 +- .../DUAL_CHAIN_TOKEN_LIST.tokenlist.json | 970 +++++++++-- .../CRUNCHYGALAXY_OFFICE_AND_1B_FUNDING.md | 184 +++ .../LEDGER_ALLOCATION_GL_MAPPING.md | 4 +- .../LEDGER_ALLOCATION_POSTING_RUNBOOK.md | 10 +- .../MATERIAL_POSTING_POLICY.md | 44 + .../OFFICE_20_AUDIT_PACKET.md | 74 + .../OFFICE_20_DR_RUNBOOK.md | 60 + .../OFFICE_20_FIRE_DRILL_RUNBOOK.md | 67 + .../OFFICE_2_READINESS_CONFIRMATION.md | 38 + .../OFFICE_2_SHAMRAYAN_RUNBOOK.md | 1021 ++++++++++++ .../OMNL_CLIENT_API_TO_UI_MAPPING.md | 98 ++ .../OMNL_CLIENT_NAMES_FIX.md | 112 ++ .../OMNL_ENTITY_MASTER_DATA.json | 386 +++++ .../OMNL_ENTITY_MASTER_DATA.md | 110 ++ .../OMNL_GL_ACCOUNTS_FX_GRU.md | 108 ++ .../OMNL_GL_ACCOUNTS_REQUIRED.md | 106 ++ .../OMNL_JOURNAL_LEDGER_MATRIX.md | 135 ++ .../OMNL_OFFICES_POPULATE.md | 72 + .../OMNL_OFFICE_2_ACCESS_SECURITY_TEST.md | 138 ++ .../OMNL_OFFICE_ADDRESS_BOOK.md | 56 + .../OMNL_OFFICE_BALANCES.md | 193 +++ .../OMNL_OFFICE_LOGINS_AND_CREDENTIALS.md | 134 ++ .../OMNL_OFFICE_MASTER_RUNBOOK_INDEX.md | 69 + ...MNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md | 175 ++ ...MNL_POSTING_AND_RECONCILIATION_EVIDENCE.md | 65 + .../OMNL_PRODUCT_NAMESPACE_OFFICE20.md | 30 + .../OMNL_TRANSACTION_SEQUENCE_FULL.md | 124 ++ .../OPERATING_RAILS.md | 202 +++ .../P2P_SETTLEMENT_CRUNCHYGALAXY_RAIL.md | 179 +++ .../PELICAN_MOTORS_OFFICE_RUNBOOK.md | 93 ++ .../PRODUCTION_OPS_OFFICE20.md | 160 ++ .../mifos-omnl-central-bank/README.md | 13 + .../SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md | 177 ++ .../TRANCHE_1_500M_RUNBOOK.md | 437 +++++ ...l-journal-matrix-m0-m1-supplement-11b.json | 17 + .../omnl-journal-matrix-phase-a-b-only.json | 12 + ...nl-journal-matrix-phase-c-interoffice.json | 25 + ...-matrix-phase-c-offices-18-19-of-only.json | 10 + ...l-journal-matrix-phase-c-offices-9-19.json | 31 + .../omnl-journal-matrix-samama-5b.json | 25 + ...rix-shamrayan-2000-to-2100-correction.json | 24 + .../omnl-journal-matrix.json | 99 ++ .../omnl-office-address-book.json | 63 + docs/04-configuration/pr-ready/README.md | 50 + .../04-configuration/pr-ready/eip155-138.json | 46 + ...COMPLETION_RUN_20260224_TASKS_AND_TODOS.md | 46 + .../NEXT_STEPS_RUN_20260222_131244.md | 652 ++++++++ .../NEXT_STEPS_RUN_20260222_161727.md | 652 ++++++++ ...NEXT_STEPS_RUN_20260223_SMOM_DEPLOYMENT.md | 33 + .../NEXT_STEPS_RUN_20260224_021728.md | 648 ++++++++ .../all_e2e_results.json | 964 +++++++++++ .../cacti-alltra_d-bis_org_https_headers.txt | 20 + .../cacti-hybx_d-bis_org_https_headers.txt | 20 + .../codespaces_d-bis_org_https_headers.txt | 17 + .../dapp_d-bis_org_https_headers.txt | 17 + .../dbis-admin_d-bis_org_https_headers.txt | 18 + .../dbis-api-2_d-bis_org_https_headers.txt | 18 + .../dbis-api_d-bis_org_https_headers.txt | 18 + .../dev_d-bis_org_https_headers.txt | 17 + .../explorer_d-bis_org_blockscout_api.txt | 1 + .../explorer_d-bis_org_https_headers.txt | 20 + .../gitea_d-bis_org_https_headers.txt | 17 + .../mifos_d-bis_org_https_headers.txt | 14 + .../mim4u_org_https_headers.txt | 20 + .../phoenix_sankofa_nexus_https_headers.txt | 20 + .../rpc-alltra-2_d-bis_org_rpc_response.txt | 1 + .../rpc-alltra-3_d-bis_org_rpc_response.txt | 1 + .../rpc-alltra_d-bis_org_rpc_response.txt | 1 + .../rpc-fireblocks_d-bis_org_rpc_response.txt | 1 + .../rpc-http-prv_d-bis_org_rpc_response.txt | 1 + .../rpc-http-pub_d-bis_org_rpc_response.txt | 1 + .../rpc-hybx-2_d-bis_org_rpc_response.txt | 1 + .../rpc-hybx-3_d-bis_org_rpc_response.txt | 1 + .../rpc-hybx_d-bis_org_rpc_response.txt | 1 + .../rpc2_d-bis_org_rpc_response.txt | 1 + .../rpc_d-bis_org_rpc_response.txt | 1 + .../rpc_defi-oracle_io_rpc_response.txt | 1 + ...ublic-0138_defi-oracle_io_rpc_response.txt | 1 + .../sankofa_nexus_https_headers.txt | 19 + .../secure_d-bis_org_https_headers.txt | 18 + .../secure_mim4u_org_https_headers.txt | 20 + .../the-order_sankofa_nexus_https_headers.txt | 20 + .../training_mim4u_org_https_headers.txt | 20 + .../verification_report.md | 314 ++++ .../www_mim4u_org_https_headers.txt | 18 + ...ww_phoenix_sankofa_nexus_https_headers.txt | 20 + .../www_sankofa_nexus_https_headers.txt | 20 + .../all_e2e_results.json | 964 +++++++++++ .../cacti-alltra_d-bis_org_https_headers.txt | 20 + .../cacti-hybx_d-bis_org_https_headers.txt | 20 + .../codespaces_d-bis_org_https_headers.txt | 17 + .../dapp_d-bis_org_https_headers.txt | 17 + .../dbis-admin_d-bis_org_https_headers.txt | 18 + .../dbis-api-2_d-bis_org_https_headers.txt | 18 + .../dbis-api_d-bis_org_https_headers.txt | 18 + .../dev_d-bis_org_https_headers.txt | 17 + .../explorer_d-bis_org_blockscout_api.txt | 1 + .../explorer_d-bis_org_https_headers.txt | 20 + .../gitea_d-bis_org_https_headers.txt | 17 + .../mifos_d-bis_org_https_headers.txt | 14 + .../mim4u_org_https_headers.txt | 20 + .../phoenix_sankofa_nexus_https_headers.txt | 20 + .../rpc-alltra-2_d-bis_org_rpc_response.txt | 1 + .../rpc-alltra-3_d-bis_org_rpc_response.txt | 1 + .../rpc-alltra_d-bis_org_rpc_response.txt | 1 + .../rpc-fireblocks_d-bis_org_rpc_response.txt | 1 + .../rpc-http-prv_d-bis_org_rpc_response.txt | 1 + .../rpc-http-pub_d-bis_org_rpc_response.txt | 1 + .../rpc-hybx-2_d-bis_org_rpc_response.txt | 1 + .../rpc-hybx-3_d-bis_org_rpc_response.txt | 1 + .../rpc-hybx_d-bis_org_rpc_response.txt | 1 + .../rpc2_d-bis_org_rpc_response.txt | 1 + .../rpc_d-bis_org_rpc_response.txt | 1 + .../rpc_defi-oracle_io_rpc_response.txt | 1 + ...ublic-0138_defi-oracle_io_rpc_response.txt | 1 + .../sankofa_nexus_https_headers.txt | 19 + .../secure_d-bis_org_https_headers.txt | 18 + .../secure_mim4u_org_https_headers.txt | 20 + .../the-order_sankofa_nexus_https_headers.txt | 20 + .../training_mim4u_org_https_headers.txt | 20 + .../verification_report.md | 314 ++++ .../www_mim4u_org_https_headers.txt | 18 + ...ww_phoenix_sankofa_nexus_https_headers.txt | 20 + .../www_sankofa_nexus_https_headers.txt | 20 + .../all_e2e_results.json | 964 +++++++++++ .../cacti-alltra_d-bis_org_https_headers.txt | 20 + .../cacti-hybx_d-bis_org_https_headers.txt | 20 + .../codespaces_d-bis_org_https_headers.txt | 17 + .../dapp_d-bis_org_https_headers.txt | 17 + .../dbis-admin_d-bis_org_https_headers.txt | 18 + .../dbis-api-2_d-bis_org_https_headers.txt | 18 + .../dbis-api_d-bis_org_https_headers.txt | 18 + .../dev_d-bis_org_https_headers.txt | 17 + .../explorer_d-bis_org_blockscout_api.txt | 1 + .../explorer_d-bis_org_https_headers.txt | 20 + .../gitea_d-bis_org_https_headers.txt | 17 + .../mifos_d-bis_org_https_headers.txt | 14 + .../mim4u_org_https_headers.txt | 20 + .../phoenix_sankofa_nexus_https_headers.txt | 20 + .../rpc-alltra-2_d-bis_org_rpc_response.txt | 1 + .../rpc-alltra-3_d-bis_org_rpc_response.txt | 1 + .../rpc-alltra_d-bis_org_rpc_response.txt | 1 + .../rpc-fireblocks_d-bis_org_rpc_response.txt | 1 + .../rpc-http-prv_d-bis_org_rpc_response.txt | 1 + .../rpc-http-pub_d-bis_org_rpc_response.txt | 1 + .../rpc-hybx-2_d-bis_org_rpc_response.txt | 1 + .../rpc-hybx-3_d-bis_org_rpc_response.txt | 1 + .../rpc-hybx_d-bis_org_rpc_response.txt | 1 + .../rpc2_d-bis_org_rpc_response.txt | 1 + .../rpc_d-bis_org_rpc_response.txt | 1 + .../rpc_defi-oracle_io_rpc_response.txt | 1 + ...ublic-0138_defi-oracle_io_rpc_response.txt | 1 + .../sankofa_nexus_https_headers.txt | 19 + .../secure_d-bis_org_https_headers.txt | 18 + .../secure_mim4u_org_https_headers.txt | 20 + .../the-order_sankofa_nexus_https_headers.txt | 20 + .../training_mim4u_org_https_headers.txt | 20 + .../verification_report.md | 314 ++++ .../www_mim4u_org_https_headers.txt | 18 + ...ww_phoenix_sankofa_nexus_https_headers.txt | 20 + .../www_sankofa_nexus_https_headers.txt | 20 + .../all_e2e_results.json | 955 +++++++++++ .../cacti-alltra_d-bis_org_https_headers.txt | 20 + .../cacti-hybx_d-bis_org_https_headers.txt | 20 + .../codespaces_d-bis_org_https_headers.txt | 17 + .../dapp_d-bis_org_https_headers.txt | 17 + .../dbis-admin_d-bis_org_https_headers.txt | 18 + .../dbis-api-2_d-bis_org_https_headers.txt | 18 + .../dbis-api_d-bis_org_https_headers.txt | 18 + .../dev_d-bis_org_https_headers.txt | 17 + .../explorer_d-bis_org_blockscout_api.txt | 1 + .../explorer_d-bis_org_https_headers.txt | 20 + .../gitea_d-bis_org_https_headers.txt | 17 + .../mifos_d-bis_org_https_headers.txt | 14 + .../mim4u_org_https_headers.txt | 18 + .../phoenix_sankofa_nexus_https_headers.txt | 20 + .../rpc-alltra-2_d-bis_org_rpc_response.txt | 1 + .../rpc-alltra-3_d-bis_org_rpc_response.txt | 1 + .../rpc-alltra_d-bis_org_rpc_response.txt | 1 + .../rpc-fireblocks_d-bis_org_rpc_response.txt | 1 + .../rpc-http-prv_d-bis_org_rpc_response.txt | 1 + .../rpc-http-pub_d-bis_org_rpc_response.txt | 1 + .../rpc-hybx-2_d-bis_org_rpc_response.txt | 1 + .../rpc-hybx-3_d-bis_org_rpc_response.txt | 1 + .../rpc-hybx_d-bis_org_rpc_response.txt | 1 + .../rpc2_d-bis_org_rpc_response.txt | 1 + .../rpc_d-bis_org_rpc_response.txt | 1 + .../rpc_defi-oracle_io_rpc_response.txt | 1 + ...ublic-0138_defi-oracle_io_rpc_response.txt | 1 + .../sankofa_nexus_https_headers.txt | 19 + .../secure_d-bis_org_https_headers.txt | 18 + .../secure_mim4u_org_https_headers.txt | 18 + .../the-order_sankofa_nexus_https_headers.txt | 20 + .../training_mim4u_org_https_headers.txt | 18 + .../verification_report.md | 314 ++++ .../www_mim4u_org_https_headers.txt | 18 + ...ww_phoenix_sankofa_nexus_https_headers.txt | 20 + .../www_sankofa_nexus_https_headers.txt | 20 + .../cacti-hybx_d-bis_org_https_headers.txt | 14 + .../dapp_d-bis_org_https_headers.txt | 17 + .../dbis-admin_d-bis_org_https_headers.txt | 18 + .../dbis-api_d-bis_org_https_headers.txt | 18 + .../dev_d-bis_org_https_headers.txt | 17 + .../mifos_d-bis_org_https_headers.txt | 14 + .../mim4u_org_https_headers.txt | 20 + .../phoenix_sankofa_nexus_https_headers.txt | 20 + .../rpc-alltra-2_d-bis_org_rpc_response.txt | 1 + .../rpc-alltra-3_d-bis_org_rpc_response.txt | 1 + .../rpc-alltra_d-bis_org_rpc_response.txt | 1 + .../rpc-http-pub_d-bis_org_rpc_response.txt | 1 + .../rpc-hybx-2_d-bis_org_rpc_response.txt | 1 + .../rpc-hybx-3_d-bis_org_rpc_response.txt | 1 + .../rpc2_d-bis_org_rpc_response.txt | 1 + .../rpc_d-bis_org_rpc_response.txt | 1 + ...ublic-0138_defi-oracle_io_rpc_response.txt | 1 + .../sankofa_nexus_https_headers.txt | 19 + .../studio_sankofa_nexus_https_headers.txt | 2 + .../the-order_sankofa_nexus_https_headers.txt | 20 + .../www_mim4u_org_https_headers.txt | 20 + .../www_sankofa_nexus_https_headers.txt | 20 + .../cacti-hybx_d-bis_org_https_headers.txt | 14 + .../dbis-admin_d-bis_org_https_headers.txt | 18 + .../mifos_d-bis_org_https_headers.txt | 14 + .../rpc-alltra-3_d-bis_org_rpc_response.txt | 1 + .../rpc-alltra_d-bis_org_rpc_response.txt | 1 + .../rpc-http-pub_d-bis_org_rpc_response.txt | 1 + .../rpc-hybx-2_d-bis_org_rpc_response.txt | 1 + .../sankofa_nexus_https_headers.txt | 19 + .../all_e2e_results.json | 984 ++++++++++++ .../cacti-alltra_d-bis_org_https_headers.txt | 14 + .../cacti-hybx_d-bis_org_https_headers.txt | 14 + .../codespaces_d-bis_org_https_headers.txt | 17 + .../dapp_d-bis_org_https_headers.txt | 17 + .../dbis-admin_d-bis_org_https_headers.txt | 18 + .../dbis-api-2_d-bis_org_https_headers.txt | 18 + .../dbis-api_d-bis_org_https_headers.txt | 18 + .../dev_d-bis_org_https_headers.txt | 17 + .../explorer_d-bis_org_blockscout_api.txt | 1 + .../explorer_d-bis_org_https_headers.txt | 20 + .../gitea_d-bis_org_https_headers.txt | 17 + .../mifos_d-bis_org_https_headers.txt | 14 + .../mim4u_org_https_headers.txt | 20 + .../phoenix_sankofa_nexus_https_headers.txt | 20 + .../rpc-alltra-2_d-bis_org_rpc_response.txt | 1 + .../rpc-alltra-3_d-bis_org_rpc_response.txt | 1 + .../rpc-alltra_d-bis_org_rpc_response.txt | 1 + .../rpc-fireblocks_d-bis_org_rpc_response.txt | 1 + .../rpc-http-prv_d-bis_org_rpc_response.txt | 1 + .../rpc-http-pub_d-bis_org_rpc_response.txt | 1 + .../rpc-hybx-2_d-bis_org_rpc_response.txt | 1 + .../rpc-hybx-3_d-bis_org_rpc_response.txt | 1 + .../rpc-hybx_d-bis_org_rpc_response.txt | 1 + .../rpc2_d-bis_org_rpc_response.txt | 1 + .../rpc_d-bis_org_rpc_response.txt | 1 + .../rpc_defi-oracle_io_rpc_response.txt | 1 + ...ublic-0138_defi-oracle_io_rpc_response.txt | 1 + .../sankofa_nexus_https_headers.txt | 19 + .../secure_d-bis_org_https_headers.txt | 18 + .../secure_mim4u_org_https_headers.txt | 20 + .../studio_sankofa_nexus_https_headers.txt | 13 + .../the-order_sankofa_nexus_https_headers.txt | 20 + .../training_mim4u_org_https_headers.txt | 20 + .../verification_report.md | 321 ++++ .../www_mim4u_org_https_headers.txt | 20 + ...ww_phoenix_sankofa_nexus_https_headers.txt | 20 + .../www_sankofa_nexus_https_headers.txt | 20 + .../rpc-502-diagnostics-20260227-181345.txt | 22 + .../rpc-502-diagnostics-20260227-210017.txt | 429 +++++ .../rpc-502-diagnostics-20260227-211819.txt | 429 +++++ .../E2E_CLOUDFLARE_DOMAINS_RUNBOOK.md | 1 + ...CRITICAL_ISSUE_BLOCK_PRODUCTION_STOPPED.md | 21 +- docs/06-besu/MASTER_INDEX.md | 2 +- .../CHAIN138_COMPLETE_ROUTING_TABLE.md | 219 --- .../CONFIG_READY_CHAINS_COMPLETION_RUNBOOK.md | 89 +- docs/07-ccip/CW_BRIDGE_APPROACH.md | 65 + docs/07-ccip/CW_DEPLOY_AND_WIRE_RUNBOOK.md | 215 +++ ...ER_COVERAGE_BRIDGES_AND_LIQUIDITY_POOLS.md | 121 -- ...APPER_GAPS_DEPLOYMENTS_AND_IMPROVEMENTS.md | 145 -- docs/07-ccip/README.md | 60 - .../TOKEN_MAPPING_AND_MAINNET_ADDRESSES.md | 129 -- docs/07-ccip/WEMIX_TOKEN_VERIFICATION.md | 2 + .../BLOCKSCOUT_VERIFICATION_GUIDE.md | 14 +- .../DAPP_CONSOLE_ERRORS_METAMASK.md | 42 + .../PUBLIC_RPC_WEBSOCKET_502.md | 27 + docs/09-troubleshooting/README.md | 31 - .../SCRIPT_HEADER_TEMPLATE.md | 71 + .../ADDRESS_MATRIX_AND_STATUS.md | 215 +++ docs/11-references/API_DOCUMENTATION.md | 1 + .../11-references/CHAIN138_TOKEN_ADDRESSES.md | 111 -- .../CONTRACT_ADDRESSES_REFERENCE.md | 19 +- .../CONTRACT_INVENTORY_AND_VERIFICATION.md | 188 --- .../11-references/CONTRACT_NEXT_STEPS_LIST.md | 25 +- docs/11-references/CW_TOKENS_AND_NETWORKS.md | 78 + .../DEPLOYED_COINS_TOKENS_AND_NETWORKS.md | 132 ++ .../DEPLOYER_WALLET_FUNDING_PLAN_PMM_POOLS.md | 153 ++ .../DEX_AND_CROSS_CHAIN_CONTRACTS_NEEDED.md | 10 +- docs/11-references/GAPS_FILLED_2026-02-27.md | 63 + .../LINK_TOKEN_ADDRESSES_REFERENCE.md | 49 + ...QUIDITY_DEPTH_500M_PER_TOKEN_MULTICHAIN.md | 123 ++ .../LIQUIDITY_POOLS_MASTER_MAP.md | 34 +- docs/11-references/PMM_DEX_ROUTING_STATUS.md | 134 ++ .../POOLS_AND_NETWORKS_FULL_DESIGN.md | 112 ++ .../POOL_ACCESS_DASHBOARD_API_MCP.md | 105 ++ docs/11-references/README.md | 47 - ...OKENS_AND_NETWORKS_MINTABLE_TO_DEPLOYER.md | 203 +++ ...OKENS_DEPLOYER_DEPLOYED_ON_OTHER_CHAINS.md | 153 ++ .../TOKEN_CATEGORIES_CANONICAL.md | 133 ++ .../TOKEN_LIST_AUTHORING_GUIDE.md | 448 ------ .../QUICK_REFERENCE_CARDS.md | 2 +- docs/ALL_IMPROVEMENTS_AND_GAPS_INDEX.md | 324 +--- docs/GALATIC_SUMMARY.md | 236 +++ docs/GAPS_AND_RECOMMENDATIONS_CONSOLIDATED.md | 6 +- docs/MASTER_INDEX.md | 691 +------- docs/OPTIONAL_RECOMMENDATIONS_INDEX.md | 13 +- docs/README.md | 370 +---- docs/REQUIRED_FIXES_UPDATES_GAPS.md | 9 +- docs/RUNBOOKS_MASTER_INDEX.md | 108 +- docs/VAULT_SYSTEM_MASTER_TECHNICAL_PLAN.md | 2 +- docs/api/omnl-fineract-openapi.json | 1 + ...S_RAIL_ADDONS_CODE_COMPLETION_TASK_LIST.md | 164 ++ ...S_RAIL_AND_PROJECT_COMPLETION_MASTER_V1.md | 156 ++ .../DBIS_RAIL_AUDIT_READINESS_CHECKLIST_V1.md | 133 ++ .../DBIS_RAIL_AUDIT_READINESS_RESULTS_V1.md | 162 ++ .../dbis-rail/DBIS_RAIL_CONTROL_MAPPING_V1.md | 55 + .../DBIS_RAIL_CONVERSION_ROUTER_SPEC_V1_5.md | 164 ++ ..._CANONICALIZATION_AND_TEST_VECTORS_V1_5.md | 201 +++ ...DBIS_RAIL_LEDGER_ATTESTATION_ADDON_V1_5.md | 121 ++ .../dbis-rail/DBIS_RAIL_REGULATOR_BRIEF_V1.md | 153 ++ docs/dbis-rail/DBIS_RAIL_RULEBOOK_V1.md | 289 ++++ .../DBIS_RAIL_SECURITY_THREAT_MODEL_V1.md | 253 +++ .../DBIS_RAIL_STABLECOIN_POLICY_V1_5.md | 99 ++ docs/dbis-rail/DBIS_RAIL_TECHNICAL_SPEC_V1.md | 496 ++++++ ...N_COORDINATION_WITH_TRANSCRIPT_540AE663.md | 149 ++ docs/dbis-rail/README.md | 18 + docs/images/README.md | 13 + docs/images/explorer-blocks.png | Bin 0 -> 4149701 bytes docs/images/explorer-home.png | Bin 0 -> 4900203 bytes docs/images/explorer-transactions.png | Bin 0 -> 5151111 bytes .../GRU_M00_DIAMOND_DEPLOYMENT_RUNBOOK.md | 116 ++ omnl-fineract/.gitignore | 1 + pnpm-lock.yaml | 110 +- ...lic-rpc-e2e-stability-20260222_124405.json | 98 ++ ...ublic-rpc-e2e-stability-20260222_124405.md | 27 + ...lic-rpc-e2e-stability-20260222_124603.json | 98 ++ ...ublic-rpc-e2e-stability-20260222_124603.md | 27 + ...lic-rpc-e2e-stability-20260222_124830.json | 94 ++ ...ublic-rpc-e2e-stability-20260222_124830.md | 27 + ...lic-rpc-e2e-stability-20260222_134242.json | 98 ++ ...ublic-rpc-e2e-stability-20260222_134242.md | 27 + ...lic-rpc-e2e-stability-20260222_135401.json | 98 ++ ...ublic-rpc-e2e-stability-20260222_135401.md | 27 + reports/rpc_nodes_test_20260222_214342.json | 715 +++++++++ reports/rpc_nodes_test_20260222_214342.md | 43 + .../src/handlers/rpc-handler.ts | 262 --- .../5702-inference/docker-compose.yml | 18 + scripts/57xx-deploy/5703-agent/.env.example | 13 + .../57xx-deploy/5703-agent/docker-compose.yml | 24 + scripts/57xx-deploy/5704-state/.env.example | 2 + .../57xx-deploy/5704-state/docker-compose.yml | 47 + scripts/57xx-deploy/README.md | 39 + scripts/57xx-deploy/copy-to-opt-ai.sh | 28 + scripts/INSTALL_TUNNEL.sh | 2 +- scripts/QUICK_SSH_SETUP.sh | 2 +- scripts/access-omada-cloud-controller.sh | 2 +- scripts/activate-storage-r630-01.sh | 2 +- scripts/activate-storage-r630-02.sh | 2 +- scripts/analyze-all-domains.sh | 2 +- scripts/apply-remaining-operator-fixes.sh | 79 + scripts/audit-all-vm-ips.sh | 2 +- scripts/audit-proxmox-rpc-besu-heap.sh | 4 +- scripts/audit-proxmox-rpc-storage.sh | 118 +- scripts/besu-collect-all-enodes.sh | 2 +- scripts/besu-deploy-allowlist.sh | 2 +- scripts/besu-extract-enode-nodekey.sh | 2 +- scripts/besu-extract-enode-rpc.sh | 2 +- scripts/besu-generate-allowlist.sh | 2 +- scripts/besu-validate-allowlist.sh | 2 +- scripts/besu-verify-peers.sh | 2 +- scripts/besu/enable-trace-api-vmid2201.sh | 78 + scripts/burn-weth9-deployer.sh | 97 ++ scripts/burn-weth9-from-keys.sh | 91 ++ scripts/check-and-start-rpc-2101.sh | 37 + scripts/check-network-rpc-138.sh | 65 + scripts/cleanup-docs-secrets.sh | 2 +- scripts/cleanup-markdown-files.sh | 2 +- scripts/clear-all-transaction-pools.sh | 17 +- scripts/clear-rpc-2201-txpool.sh | 47 + scripts/clear-rpc-database-complete.sh | 2 +- scripts/cloudflare/add-studio-sankofa-dns.sh | 59 + scripts/complete-all-blockscout-setup.sh | 2 +- .../complete-all-installations-and-tasks.sh | 2 +- scripts/complete-all-remaining-tasks-final.sh | 2 +- scripts/complete-all-restoration.sh | 2 +- ...mplete-all-tasks-parallel-comprehensive.sh | 2 +- scripts/complete-all-tasks-parallel.sh | 2 +- scripts/complete-blockscout-firewall-fix.sh | 2 +- scripts/complete-explorer-restoration.sh | 2 +- scripts/complete-ipfs-logo-next-steps.sh | 87 + scripts/complete-setup.sh | 2 +- scripts/complete-validation.sh | 2 +- scripts/comprehensive-ip-audit.sh | 2 +- scripts/consolidate-all-duplicates.sh | 2 +- scripts/consolidate-duplicate-status-files.sh | 2 +- scripts/consolidate-secrets-into-file.sh | 117 ++ ...nvert-database-containers-to-privileged.sh | 2 +- scripts/convert-dhcp-to-static.sh | 2 +- .../convert-to-privileged-and-install-all.sh | 2 +- scripts/create-missing-dns-records.sh | 2 +- scripts/create-proxmox-token.sh | 2 +- ...eploy-token-aggregation-for-publication.sh | 48 + ...loyer-balance-chain138-and-funding-plan.sh | 113 ++ .../check-deployer-nonce-and-balance.sh | 50 + .../create-all-pmm-pools-chain138.sh | 63 + .../deployment/deploy-gov-portals-to-7804.sh | 2 +- ...-mirror-and-pmm-pool-after-txpool-clear.sh | 91 +- ...y-transaction-mirror-chain138-nonce-fix.sh | 33 + .../deployment/preflight-chain138-deploy.sh | 93 ++ .../deployment/run-all-next-steps-chain138.sh | 100 ++ .../deployment/run-before-deploy-checks.sh | 85 + scripts/deployment/run-cw-remaining-steps.sh | 138 ++ .../set-dotenv-c-tokens-and-register-gru.sh | 88 + .../deployment/set-missing-dotenv-chain138.sh | 37 + .../test-all-contracts-before-deploy.sh | 87 + scripts/diagnose-explorer-status.sh | 2 +- scripts/diagnose-proxmox-hosts.sh | 2 +- scripts/diagnose-tunnels.sh | 2 +- scripts/diagnose-vmid5000-status.sh | 2 +- scripts/enable-root-ssh-container.sh | 2 +- scripts/enable-storage-r630-hosts.sh | 2 +- scripts/execute-all-remaining-tasks.sh | 2 +- scripts/execute-validator-updates-now.sh | 2 +- ...xport-all-token-reports-for-publication.sh | 69 + scripts/final-verification-and-summary.sh | 2 +- scripts/find-device-192.168.11.14.sh | 2 +- scripts/fix-wsl-ip.sh | 2 +- scripts/generate-comprehensive-report.sh | 2 +- scripts/generate-review-report.sh | 2 +- scripts/health/check-rpc-vms-health.sh | 5 +- scripts/health/verify-lxc-configs-on-hosts.sh | 68 + scripts/identify-dhcp-containers.sh | 2 +- scripts/install-wscat-in-rpc-containers.sh | 90 ++ scripts/investigate-ip-192.168.11.14.sh | 2 +- .../investigate-rpc-transaction-failures.sh | 2 +- .../investigate-transaction-persistence.sh | 2 +- scripts/list_vms.sh | 2 +- scripts/load-env.sh | 2 +- scripts/lookup-mac-vendor.sh | 2 +- .../fix-storage-r630-01-and-thin5.sh | 116 ++ scripts/maintenance/health-check-rpc-2101.sh | 8 + .../migrate-ct-r630-01-data-to-thin1.sh | 82 + .../maintenance/migrate-vmid-5000-to-thin2.sh | 52 + scripts/manage/snapshot-before-change.sh | 2 +- scripts/migrate-hostnames-proxmox.sh | 2 +- scripts/migrate-secrets-to-admin-vault.sh | 2 +- scripts/migrate-secrets-to-vault.sh | 2 +- scripts/migrate-vms-fixed.sh | 2 +- scripts/migrate-vms-to-r630-01-api.sh | 2 +- scripts/migrate-vms-to-r630-01.sh | 2 +- scripts/mim4u-install-nginx-and-fix-502.sh | 16 +- scripts/monitor-bridge-health.sh | 2 +- .../monitoring/monitor-blockchain-health.sh | 12 +- scripts/monitoring/simple-alert.sh | 2 +- scripts/move-pve2-vms-to-r630-02.sh | 2 +- scripts/network-configuration-review.sh | 2 +- .../add-studio-sankofa-npmplus-proxy.sh | 99 ++ .../nginx-proxy-manager/complete-migration.sh | 2 +- .../delete-sankofa-proxy-hosts.sh | 2 +- .../diagnose-npmplus-error.sh | 2 +- .../manual-ssl-config-guide.sh | 2 +- .../migrate-configs-to-npmplus.sh | 4 +- .../nginx-proxy-manager/migrate-to-npmplus.sh | 2 +- .../post-install-migration.sh | 2 +- .../nginx-proxy-manager/reset-npm-password.sh | 2 +- .../run-npmplus-migration.sh | 2 +- scripts/npmplus/automate-ha-setup.sh | 2 +- .../automate-phase1-create-container.sh | 2 +- scripts/npmplus/automate-phase2-cert-sync.sh | 2 +- scripts/npmplus/automate-phase3-keepalived.sh | 2 +- .../npmplus/automate-phase4-sync-config.sh | 2 +- scripts/npmplus/automate-phase5-monitoring.sh | 2 +- scripts/npmplus/export-primary-config.sh | 2 +- scripts/npmplus/import-secondary-config.sh | 2 +- .../keepalived/check-npmplus-health.sh | 2 +- .../npmplus/keepalived/keepalived-notify.sh | 2 +- scripts/npmplus/sync-certificates.sh | 2 +- scripts/npmplus/sync-config.sh | 2 +- scripts/omnl/README.md | 86 +- scripts/omnl/create-office-and-fund.sh | 128 ++ scripts/omnl/office2-5b-full-execution.sh | 268 ++++ scripts/omnl/office2-shamrayan-dryrun.sh | 177 ++ scripts/omnl/omnl-audit-packet-office20.sh | 128 ++ scripts/omnl/omnl-baseline-create.sh | 29 + scripts/omnl/omnl-client-names-fix.sh | 121 ++ scripts/omnl/omnl-clients-create-9-15.sh | 117 ++ scripts/omnl/omnl-clients-remove-15.sh | 64 + scripts/omnl/omnl-config-hash.sh | 34 + scripts/omnl/omnl-entity-data-apply.sh | 183 +++ scripts/omnl/omnl-gl-accounts-create.sh | 2 + .../omnl/omnl-gl-accounts-fx-gru-create.sh | 134 ++ scripts/omnl/omnl-gl-closures-post.sh | 85 + scripts/omnl/omnl-je-checker.sh | 85 + scripts/omnl/omnl-je-maker.sh | 56 + scripts/omnl/omnl-je-reverse-by-reference.sh | 90 ++ scripts/omnl/omnl-ledger-post-from-matrix.sh | 179 +++ .../omnl/omnl-monitor-office20-movement.sh | 45 + scripts/omnl/omnl-office-create-pelican.sh | 75 + scripts/omnl/omnl-office-create-samama.sh | 135 ++ .../omnl/omnl-office2-access-security-test.sh | 139 ++ scripts/omnl/omnl-offices-populate-15.sh | 113 ++ scripts/omnl/omnl-operator-rail.sh | 119 ++ scripts/omnl/omnl-reconciliation-office20.sh | 69 + .../omnl/omnl-user-shamrayan-office-create.sh | 42 + scripts/omnl/resolve_ids.sh | 85 + scripts/omnl/validate-rail.sh | 40 + scripts/organize-docs-directory.sh | 2 +- scripts/organize-remaining-root-files.sh | 2 +- scripts/organize-root-files.sh | 2 +- scripts/patch-nginx-explorer-config.sh | 54 + scripts/perform-immediate-actions.sh | 2 +- scripts/provision-admin-vault.sh | 2 +- scripts/proxmox-security-hardening.sh | 2 +- scripts/proxmox/assign-vlan-to-container.sh | 2 +- scripts/proxmox/assign-vlan-to-vm.sh | 2 +- scripts/proxmox/migrate-besu-to-vlans.sh | 2 +- scripts/quick-proxmox-inventory.sh | 2 +- scripts/reassign-vlan200-to-vlan11.sh | 2 +- scripts/reconfigure-vault-network.sh | 2 +- ...-containers-privileged-and-complete-all.sh | 2 +- scripts/remediate-proxmox-rpc-stability.sh | 7 +- scripts/resolve-ip-conflicts.sh | 2 +- scripts/restart-wsl.sh | 2 +- scripts/restore-explorer-complete.sh | 2 +- scripts/review-proxmox-configs.sh | 2 +- scripts/review-r630-02-containers.sh | 2 +- scripts/review-r630-02-services-complete.sh | 2 +- scripts/run-before-pr-validations.sh | 56 + scripts/run-blockscout-config-direct.sh | 2 +- .../run-completable-tasks-from-anywhere.sh | 8 +- scripts/run-database-migrations.sh | 2 +- scripts/run-dbis-database-migrations.sh | 2 +- scripts/run-e2e-flow-tasks-full-parallel.sh | 148 ++ scripts/run-order-database-migrations.sh | 2 +- scripts/run-rpc-node-suite-all-hosts.sh | 53 + scripts/run-via-proxmox-ssh.sh | 26 +- scripts/scan-all-containers.sh | 2 +- scripts/set-blockscout-static-ip.sh | 2 +- scripts/set-container-password.sh | 2 +- scripts/set-password-no-console.sh | 2 +- scripts/setup.sh | 2 +- scripts/setup_ssh_tunnel.sh | 2 +- scripts/skip-stuck-transactions.sh | 2 +- scripts/start-and-configure-all-services.sh | 2 +- scripts/start-blockscout-from-pve2.sh | 2 +- scripts/start-blockscout-on-proxmox.sh | 2 +- scripts/start-blockscout-service.sh | 2 +- scripts/start-blockscout-via-api.sh | 2 +- scripts/start-services-manually.sh | 2 +- scripts/stop_ssh_tunnel.sh | 2 +- scripts/sync-dual-chain-configs.sh | 40 + scripts/truth-network/README.md | 51 + .../deploy-and-register-truth-on-chain138.sh | 63 + .../deploy-chain-registry-and-truth.sh | 62 + scripts/truth-network/package.json | 13 + .../register-truth-in-chain-registry.sh | 51 + .../unifi/add-vlan11-secondary-ip-ifupdown.sh | 2 +- .../unifi/add-vlan11-secondary-ip-netplan.sh | 2 +- .../unifi/add-vlan11-secondary-ip-simple.sh | 2 +- .../unifi/add-vlan11-secondary-ip-systemd.sh | 4 +- scripts/unifi/add-vlan11-secondary-ip.sh | 2 +- scripts/unifi/change-ip-to-vlan11-netplan.sh | 2 +- scripts/unifi/change-ip-to-vlan11.sh | 2 +- scripts/unifi/create-firewall-rules.sh | 2 +- scripts/unifi/monitor-health.sh | 2 +- scripts/unifi/run-with-manual-add.sh | 2 +- scripts/update-all-validators-txpool.sh | 2 +- scripts/update-cloudflared-token-vmid102.sh | 2 +- scripts/update-cluster-node-names.sh | 2 +- scripts/update-sankofa-npmplus-proxy-hosts.sh | 2 +- scripts/update-service-dependencies.sh | 2 +- scripts/update-token.sh | 2 +- scripts/update-validator-config-standalone.sh | 2 +- scripts/upgrade-nodejs-to-v22.sh | 2 +- scripts/upload-token-logos-to-ipfs.sh | 153 ++ scripts/validation/validate-config-files.sh | 38 +- scripts/validator-txpool-one-liners.sh | 2 +- scripts/vault-health-check.sh | 2 +- scripts/verify-all-systems.sh | 12 +- scripts/verify-contracts-blockscout.sh | 21 +- .../check-chain138-token-permit-support.sh | 72 + .../verify/check-contracts-on-chain-138.sh | 19 +- .../verify/check-public-rpc-stability-e2e.sh | 250 +++ .../verify/export-cloudflare-dns-records.sh | 1 + .../run-contract-verification-with-proxy.sh | 8 +- scripts/verify/run-shellcheck.sh | 7 +- scripts/verify/verify-end-to-end-routing.sh | 3 +- scripts/weth9-list-holders.sh | 42 + scripts/weth9-zero-supply.md | 57 + .../templates/besu-configs/config-rpc.toml | 7 +- token-lists/lists/all-mainnet.tokenlist.json | 61 +- token-lists/lists/cronos.tokenlist.json | 179 ++- token-lists/lists/dbis-138.tokenlist.json | 123 +- x402-api/.env.example | 16 + x402-api/.gitignore | 3 + x402-api/README.md | 60 + x402-api/package.json | 16 + x402-api/src/index.js | 131 ++ 883 files changed, 73580 insertions(+), 4796 deletions(-) create mode 100644 .cursor/rules/operator-context-lan-proxmox.mdc create mode 100644 .cursor/worktrees.json delete mode 100644 .env.example create mode 100644 .github/workflows/validate-omnl-rail.yml create mode 100644 CRUNCHY-21-20260224-TR1-1B-AUDIT.zip create mode 100644 SAMAMA-20-20260224-TR1-500M-AUDIT.tar.gz create mode 100644 SAMAMA-20-20260224-TR1-500M-AUDIT.zip create mode 100644 backups/npmplus/backup-20260222_030001.tar.gz create mode 100644 backups/npmplus/backup-20260222_030001/api/access_lists.json create mode 100644 backups/npmplus/backup-20260222_030001/api/certificates.json create mode 100644 backups/npmplus/backup-20260222_030001/api/proxy_hosts.json create mode 100644 backups/npmplus/backup-20260222_030001/certificates/cert_list.txt create mode 100644 backups/npmplus/backup-20260222_030001/database/database.sql create mode 100644 backups/npmplus/backup-20260222_030001/database/database.sqlite create mode 100644 backups/npmplus/backup-20260222_030001/manifest.json create mode 100644 backups/npmplus/backup-20260222_030001/volumes/volume_list.txt create mode 100644 backups/npmplus/backup-20260222_161826.tar.gz create mode 100644 backups/npmplus/backup-20260222_161826/api/access_lists.json create mode 100644 backups/npmplus/backup-20260222_161826/api/certificates.json create mode 100644 backups/npmplus/backup-20260222_161826/api/proxy_hosts.json create mode 100644 backups/npmplus/backup-20260222_161826/certificates/cert_list.txt create mode 100644 backups/npmplus/backup-20260222_161826/database/database.sql create mode 100644 backups/npmplus/backup-20260222_161826/database/database.sqlite create mode 100644 backups/npmplus/backup-20260222_161826/manifest.json create mode 100644 backups/npmplus/backup-20260222_161826/volumes/volume_list.txt create mode 100644 backups/npmplus/backup-20260222_162326.tar.gz create mode 100644 backups/npmplus/backup-20260222_162326/api/access_lists.json create mode 100644 backups/npmplus/backup-20260222_162326/api/certificates.json create mode 100644 backups/npmplus/backup-20260222_162326/api/proxy_hosts.json create mode 100644 backups/npmplus/backup-20260222_162326/certificates/cert_list.txt create mode 100644 backups/npmplus/backup-20260222_162326/database/database.sql create mode 100644 backups/npmplus/backup-20260222_162326/database/database.sqlite create mode 100644 backups/npmplus/backup-20260222_162326/manifest.json create mode 100644 backups/npmplus/backup-20260222_162326/volumes/volume_list.txt create mode 100644 backups/npmplus/backup-20260223_030001.tar.gz create mode 100644 backups/npmplus/backup-20260223_030001/api/access_lists.json create mode 100644 backups/npmplus/backup-20260223_030001/api/certificates.json create mode 100644 backups/npmplus/backup-20260223_030001/api/proxy_hosts.json create mode 100644 backups/npmplus/backup-20260223_030001/certificates/cert_list.txt create mode 100644 backups/npmplus/backup-20260223_030001/database/database.sql create mode 100644 backups/npmplus/backup-20260223_030001/database/database.sqlite create mode 100644 backups/npmplus/backup-20260223_030001/manifest.json create mode 100644 backups/npmplus/backup-20260223_030001/volumes/volume_list.txt create mode 100644 backups/npmplus/backup-20260223_235202.tar.gz create mode 100644 backups/npmplus/backup-20260223_235202/api/access_lists.json create mode 100644 backups/npmplus/backup-20260223_235202/api/certificates.json create mode 100644 backups/npmplus/backup-20260223_235202/api/proxy_hosts.json create mode 100644 backups/npmplus/backup-20260223_235202/certificates/cert_list.txt create mode 100644 backups/npmplus/backup-20260223_235202/database/database.sql create mode 100644 backups/npmplus/backup-20260223_235202/database/database.sqlite create mode 100644 backups/npmplus/backup-20260223_235202/manifest.json create mode 100644 backups/npmplus/backup-20260223_235202/volumes/volume_list.txt create mode 100644 backups/npmplus/backup-20260224_021431.tar.gz create mode 100644 backups/npmplus/backup-20260224_021431/api/access_lists.json create mode 100644 backups/npmplus/backup-20260224_021431/api/certificates.json create mode 100644 backups/npmplus/backup-20260224_021431/api/proxy_hosts.json create mode 100644 backups/npmplus/backup-20260224_021431/certificates/cert_list.txt create mode 100644 backups/npmplus/backup-20260224_021431/database/database.sql create mode 100644 backups/npmplus/backup-20260224_021431/database/database.sqlite create mode 100644 backups/npmplus/backup-20260224_021431/manifest.json create mode 100644 backups/npmplus/backup-20260224_021431/volumes/volume_list.txt create mode 100644 backups/npmplus/backup-20260224_030001.tar.gz create mode 100644 backups/npmplus/backup-20260224_030001/api/access_lists.json create mode 100644 backups/npmplus/backup-20260224_030001/api/certificates.json create mode 100644 backups/npmplus/backup-20260224_030001/api/proxy_hosts.json create mode 100644 backups/npmplus/backup-20260224_030001/certificates/cert_list.txt create mode 100644 backups/npmplus/backup-20260224_030001/database/database.sql create mode 100644 backups/npmplus/backup-20260224_030001/database/database.sqlite create mode 100644 backups/npmplus/backup-20260224_030001/manifest.json create mode 100644 backups/npmplus/backup-20260224_030001/volumes/volume_list.txt create mode 100644 backups/npmplus/backup-20260224_062338.tar.gz create mode 100644 backups/npmplus/backup-20260224_062338/api/access_lists.json create mode 100644 backups/npmplus/backup-20260224_062338/api/certificates.json create mode 100644 backups/npmplus/backup-20260224_062338/api/proxy_hosts.json create mode 100644 backups/npmplus/backup-20260224_062338/certificates/cert_list.txt create mode 100644 backups/npmplus/backup-20260224_062338/database/database.sql create mode 100644 backups/npmplus/backup-20260224_062338/database/database.sqlite create mode 100644 backups/npmplus/backup-20260224_062338/manifest.json create mode 100644 backups/npmplus/backup-20260224_062338/volumes/volume_list.txt create mode 100644 backups/npmplus/backup-20260225_030001.tar.gz create mode 100644 backups/npmplus/backup-20260225_030001/api/access_lists.json create mode 100644 backups/npmplus/backup-20260225_030001/api/certificates.json create mode 100644 backups/npmplus/backup-20260225_030001/api/proxy_hosts.json create mode 100644 backups/npmplus/backup-20260225_030001/certificates/cert_list.txt create mode 100644 backups/npmplus/backup-20260225_030001/database/database.sql create mode 100644 backups/npmplus/backup-20260225_030001/database/database.sqlite create mode 100644 backups/npmplus/backup-20260225_030001/manifest.json create mode 100644 backups/npmplus/backup-20260225_030001/volumes/volume_list.txt create mode 100644 backups/npmplus/backup-20260226_030001.tar.gz create mode 100644 backups/npmplus/backup-20260226_030001/api/access_lists.json create mode 100644 backups/npmplus/backup-20260226_030001/api/certificates.json create mode 100644 backups/npmplus/backup-20260226_030001/api/proxy_hosts.json create mode 100644 backups/npmplus/backup-20260226_030001/certificates/cert_list.txt create mode 100644 backups/npmplus/backup-20260226_030001/database/database.sql create mode 100644 backups/npmplus/backup-20260226_030001/database/database.sqlite create mode 100644 backups/npmplus/backup-20260226_030001/manifest.json create mode 100644 backups/npmplus/backup-20260226_030001/volumes/volume_list.txt create mode 100644 backups/npmplus/backup-20260227_030002.tar.gz create mode 100644 backups/npmplus/backup-20260227_030002/api/access_lists.json create mode 100644 backups/npmplus/backup-20260227_030002/api/certificates.json create mode 100644 backups/npmplus/backup-20260227_030002/api/proxy_hosts.json create mode 100644 backups/npmplus/backup-20260227_030002/certificates/cert_list.txt create mode 100644 backups/npmplus/backup-20260227_030002/database/database.sql create mode 100644 backups/npmplus/backup-20260227_030002/database/database.sqlite create mode 100644 backups/npmplus/backup-20260227_030002/manifest.json create mode 100644 backups/npmplus/backup-20260227_030002/volumes/volume_list.txt create mode 100644 backups/npmplus/backup-20260227_182609.tar.gz create mode 100644 backups/npmplus/backup-20260227_182609/api/access_lists.json create mode 100644 backups/npmplus/backup-20260227_182609/api/certificates.json create mode 100644 backups/npmplus/backup-20260227_182609/api/proxy_hosts.json create mode 100644 backups/npmplus/backup-20260227_182609/certificates/cert_list.txt create mode 100644 backups/npmplus/backup-20260227_182609/database/database.sql create mode 100644 backups/npmplus/backup-20260227_182609/database/database.sqlite create mode 100644 backups/npmplus/backup-20260227_182609/manifest.json create mode 100644 backups/npmplus/backup-20260227_182609/volumes/volume_list.txt create mode 100644 backups/npmplus/backup-20260228_030001.tar.gz create mode 100644 backups/npmplus/backup-20260228_030001/api/access_lists.json create mode 100644 backups/npmplus/backup-20260228_030001/api/certificates.json create mode 100644 backups/npmplus/backup-20260228_030001/api/proxy_hosts.json create mode 100644 backups/npmplus/backup-20260228_030001/certificates/cert_list.txt create mode 100644 backups/npmplus/backup-20260228_030001/database/database.sql create mode 100644 backups/npmplus/backup-20260228_030001/database/database.sqlite create mode 100644 backups/npmplus/backup-20260228_030001/manifest.json create mode 100644 backups/npmplus/backup-20260228_030001/volumes/volume_list.txt create mode 100644 backups/npmplus/backup-20260301_030001.tar.gz create mode 100644 backups/npmplus/backup-20260301_030001/api/access_lists.json create mode 100644 backups/npmplus/backup-20260301_030001/api/certificates.json create mode 100644 backups/npmplus/backup-20260301_030001/api/proxy_hosts.json create mode 100644 backups/npmplus/backup-20260301_030001/certificates/cert_list.txt create mode 100644 backups/npmplus/backup-20260301_030001/database/database.sql create mode 100644 backups/npmplus/backup-20260301_030001/database/database.sqlite create mode 100644 backups/npmplus/backup-20260301_030001/manifest.json create mode 100644 backups/npmplus/backup-20260301_030001/volumes/volume_list.txt create mode 100644 backups/npmplus/backup-20260302_030001.tar.gz create mode 100644 backups/npmplus/backup-20260302_030001/api/access_lists.json create mode 100644 backups/npmplus/backup-20260302_030001/api/certificates.json create mode 100644 backups/npmplus/backup-20260302_030001/api/proxy_hosts.json create mode 100644 backups/npmplus/backup-20260302_030001/certificates/cert_list.txt create mode 100644 backups/npmplus/backup-20260302_030001/database/database.sql create mode 100644 backups/npmplus/backup-20260302_030001/database/database.sqlite create mode 100644 backups/npmplus/backup-20260302_030001/manifest.json create mode 100644 backups/npmplus/backup-20260302_030001/volumes/volume_list.txt delete mode 100644 config/smart-contracts-master.json delete mode 100644 config/token-mapping.json create mode 100644 docs/00-meta/ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md create mode 100644 docs/00-meta/ALL_RECOMMENDATIONS_HIGH_PRIORITY.md create mode 100644 docs/00-meta/ALL_RECOMMENDATIONS_OPERATOR_ONLY.md delete mode 100644 docs/00-meta/BLITZKRIEG_SOURCE_DOCUMENT_INDEX.md create mode 100644 docs/00-meta/COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md create mode 100644 docs/00-meta/CW_BRIDGE_TASK_LIST.md create mode 100644 docs/00-meta/DBIS_CORE_TS_FIXES_DETAILED_LIST.md create mode 100644 docs/00-meta/GAPS_STATUS.md create mode 100644 docs/00-meta/MAINNET_LIQUIDITY_AND_RAMPS_PRIORITY.md delete mode 100644 docs/00-meta/MASTER_DOCUMENTATION_INDEX.md create mode 100644 docs/00-meta/NEXT_STEPS_2101_AND_STORAGE.md create mode 100644 docs/00-meta/OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md create mode 100644 docs/00-meta/OPERATOR_CONTEXT_VERIFIED.md create mode 100644 docs/00-meta/REMAINING_TASKS.md create mode 100644 docs/00-meta/REMAINING_TASKS_BREAKDOWN_MISSING_INFO.md create mode 100644 docs/00-meta/REPOSITORIES_AND_PRS_CHAIN138.md create mode 100644 docs/00-meta/STILL_NOT_DONE_EXECUTION_CHECKLIST.md delete mode 100644 docs/00-meta/TASKS_RUNBOOKS_REMAINING_AND_RECOMMENDATIONS.md create mode 100644 docs/00-meta/TASKS_TO_INCREASE_ALL_E2E_FLOWS.md create mode 100644 docs/00-meta/TASK_CHECK_REPORT.md create mode 100644 docs/00-meta/TASK_LIST_REVIEW_2026_03_01.md create mode 100644 docs/00-meta/WHATS_LEFT_OPERATOR_AND_EXTERNAL.md create mode 100644 docs/02-architecture/AI_AGENTS_57XX_DEPLOYMENT_TASKS.md create mode 100644 docs/02-architecture/AI_AGENTS_57XX_MCP_CONTRACTS_AND_CHAINS.md create mode 100644 docs/02-architecture/R630_13_NODE_DOD_HA_MASTER_PLAN.md create mode 100644 docs/03-deployment/ADD_LIQUIDITY_PMM_CHAIN138_RUNBOOK.md create mode 100644 docs/03-deployment/DEPLOYMENT_ORDER_OF_OPERATIONS.md create mode 100644 docs/03-deployment/NEXT_STEPS_PMM_FULL_PARITY_AND_ALL_POOLS.md create mode 100644 docs/03-deployment/PRE_DEPLOYMENT_CHECKLIST.md create mode 100644 docs/03-deployment/RECOMMENDATIONS_AND_FIXES_BEFORE_DEPLOY.md create mode 100644 docs/03-deployment/REQUIRED_FIXES_AND_DEPLOYMENTS_STATUS.md create mode 100644 docs/03-deployment/RPC_2101_READONLY_FIX.md create mode 100644 docs/03-deployment/TRANSACTION_MIRROR_CHAIN138_COLLISION_FIX.md create mode 100644 docs/03-deployment/UNDEPLOYED_CONTRACTS_PRE_DEPLOYMENT_TASKS.md create mode 100644 docs/03-deployment/sankofa-studio.env.example create mode 100644 docs/04-configuration/22_TOKENS_13_CHAINS_DEPLOYMENT_RUNBOOK.md create mode 100644 docs/04-configuration/CHAIN138_X402_TOKEN_SUPPORT.md create mode 100644 docs/04-configuration/C_TO_CW_MAPPER_MAPPING.md create mode 100644 docs/04-configuration/DETAILED_GAPS_AND_ISSUES_LIST.md create mode 100644 docs/04-configuration/DEX_AND_AGGREGATORS_CHAIN138_EXPLAINER.md create mode 100644 docs/04-configuration/EXPLORER_FUNCTIONALITY_REVIEW.md create mode 100644 docs/04-configuration/EXPLORER_GAPS_AND_RECOMMENDATIONS.md create mode 100644 docs/04-configuration/EXPLORER_METAMASK_TECHNICAL_RESPONSE.md create mode 100644 docs/04-configuration/EXPLORER_TOKENS_GRU_POLICY.md create mode 100644 docs/04-configuration/FULL_PARITY_TOKEN_COVERAGE_RUNBOOK.md create mode 100644 docs/04-configuration/GRU_M00_DIAMOND_DOCS_REVIEW_GAPS_AND_INCONSISTENCIES.md create mode 100644 docs/04-configuration/GRU_M00_DIAMOND_FACET_MAP.md create mode 100644 docs/04-configuration/GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md create mode 100644 docs/04-configuration/GRU_M00_DIAMOND_REVIEW_GAPS_AND_RECOMMENDATIONS.md create mode 100644 docs/04-configuration/IPFS_TOKEN_LOGOS_RUNBOOK.md create mode 100644 docs/04-configuration/ISO20022_INTAKE_GATEWAY_CONTRACT_MULTI_NETWORK.md create mode 100644 docs/04-configuration/ISO4217_COMPLIANT_TOKEN_MATRIX.md create mode 100644 docs/04-configuration/MAINNET_RAMP_USER_FLOWS.md create mode 100644 docs/04-configuration/MIGRATION_PLAN_R630_01_DATA.md create mode 100644 docs/04-configuration/PHYSICAL_DRIVES_AND_CONFIG.md create mode 100644 docs/04-configuration/PRICE_FEED_CHAIN138_METAMASK_AND_WALLETS.md create mode 100644 docs/04-configuration/PR_ADDITIONS_VALIDATION_REPORT.md create mode 100644 docs/04-configuration/SECRETS_CONSOLIDATED_DOWNLOAD.env create mode 100644 docs/04-configuration/SMART_CONTRACTS_ISO20022_FIN_METHODOLOGY.md create mode 100644 docs/04-configuration/STORAGE_FIX_R630_01_AND_THIN5.md create mode 100644 docs/04-configuration/STORAGE_RECOMMENDATIONS_BY_FILL_RATE.md create mode 100644 docs/04-configuration/THIRDWEB_BRIDGE_VS_CCIP.md create mode 100644 docs/04-configuration/THIRDWEB_WALLETS_INTEGRATION.md create mode 100644 docs/04-configuration/TOKEN_AGGREGATION_REPORT_API_RUNBOOK.md create mode 100644 docs/04-configuration/TOKEN_LISTS_E2E_VERIFICATION.md create mode 100644 docs/04-configuration/TOKEN_LIST_PR_REVIEW.md create mode 100644 docs/04-configuration/coingecko/exports/report-cmc-1.json create mode 100644 docs/04-configuration/coingecko/exports/report-cmc-10.json create mode 100644 docs/04-configuration/coingecko/exports/report-cmc-100.json create mode 100644 docs/04-configuration/coingecko/exports/report-cmc-1111.json create mode 100644 docs/04-configuration/coingecko/exports/report-cmc-137.json create mode 100644 docs/04-configuration/coingecko/exports/report-cmc-138.json create mode 100644 docs/04-configuration/coingecko/exports/report-cmc-25.json create mode 100644 docs/04-configuration/coingecko/exports/report-cmc-42161.json create mode 100644 docs/04-configuration/coingecko/exports/report-cmc-42220.json create mode 100644 docs/04-configuration/coingecko/exports/report-cmc-43114.json create mode 100644 docs/04-configuration/coingecko/exports/report-cmc-56.json create mode 100644 docs/04-configuration/coingecko/exports/report-cmc-651940.json create mode 100644 docs/04-configuration/coingecko/exports/report-cmc-8453.json create mode 100644 docs/04-configuration/coingecko/exports/report-coingecko-1.json create mode 100644 docs/04-configuration/coingecko/exports/report-coingecko-10.json create mode 100644 docs/04-configuration/coingecko/exports/report-coingecko-100.json create mode 100644 docs/04-configuration/coingecko/exports/report-coingecko-1111.json create mode 100644 docs/04-configuration/coingecko/exports/report-coingecko-137.json create mode 100644 docs/04-configuration/coingecko/exports/report-coingecko-138.json create mode 100644 docs/04-configuration/coingecko/exports/report-coingecko-25.json create mode 100644 docs/04-configuration/coingecko/exports/report-coingecko-42161.json create mode 100644 docs/04-configuration/coingecko/exports/report-coingecko-42220.json create mode 100644 docs/04-configuration/coingecko/exports/report-coingecko-43114.json create mode 100644 docs/04-configuration/coingecko/exports/report-coingecko-56.json create mode 100644 docs/04-configuration/coingecko/exports/report-coingecko-651940.json create mode 100644 docs/04-configuration/coingecko/exports/report-coingecko-8453.json create mode 100644 docs/04-configuration/coingecko/exports/report-cross-chain-138.json create mode 100644 docs/04-configuration/coingecko/exports/token-list-all.json create mode 100644 docs/04-configuration/coingecko/logos/ipfs-manifest.json create mode 100755 docs/04-configuration/coingecko/scripts/prepare-token-logos-512x512.sh create mode 100644 docs/04-configuration/mifos-omnl-central-bank/CRUNCHYGALAXY_OFFICE_AND_1B_FUNDING.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/MATERIAL_POSTING_POLICY.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OFFICE_20_AUDIT_PACKET.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OFFICE_20_DR_RUNBOOK.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OFFICE_20_FIRE_DRILL_RUNBOOK.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OFFICE_2_READINESS_CONFIRMATION.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OFFICE_2_SHAMRAYAN_RUNBOOK.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OMNL_CLIENT_API_TO_UI_MAPPING.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OMNL_CLIENT_NAMES_FIX.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OMNL_ENTITY_MASTER_DATA.json create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OMNL_ENTITY_MASTER_DATA.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OMNL_GL_ACCOUNTS_FX_GRU.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OMNL_GL_ACCOUNTS_REQUIRED.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OMNL_JOURNAL_LEDGER_MATRIX.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICES_POPULATE.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICE_2_ACCESS_SECURITY_TEST.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICE_ADDRESS_BOOK.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICE_BALANCES.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICE_LOGINS_AND_CREDENTIALS.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICE_MASTER_RUNBOOK_INDEX.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OMNL_POSTING_AND_RECONCILIATION_EVIDENCE.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OMNL_PRODUCT_NAMESPACE_OFFICE20.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OMNL_TRANSACTION_SEQUENCE_FULL.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/OPERATING_RAILS.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/P2P_SETTLEMENT_CRUNCHYGALAXY_RAIL.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/PELICAN_MOTORS_OFFICE_RUNBOOK.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/PRODUCTION_OPS_OFFICE20.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/TRANCHE_1_500M_RUNBOOK.md create mode 100644 docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-m0-m1-supplement-11b.json create mode 100644 docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-phase-a-b-only.json create mode 100644 docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-phase-c-interoffice.json create mode 100644 docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-phase-c-offices-18-19-of-only.json create mode 100644 docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-phase-c-offices-9-19.json create mode 100644 docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-samama-5b.json create mode 100644 docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-shamrayan-2000-to-2100-correction.json create mode 100644 docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix.json create mode 100644 docs/04-configuration/mifos-omnl-central-bank/omnl-office-address-book.json create mode 100644 docs/04-configuration/pr-ready/README.md create mode 100644 docs/04-configuration/pr-ready/eip155-138.json create mode 100644 docs/04-configuration/verification-evidence/COMPLETION_RUN_20260224_TASKS_AND_TODOS.md create mode 100644 docs/04-configuration/verification-evidence/NEXT_STEPS_RUN_20260222_131244.md create mode 100644 docs/04-configuration/verification-evidence/NEXT_STEPS_RUN_20260222_161727.md create mode 100644 docs/04-configuration/verification-evidence/NEXT_STEPS_RUN_20260223_SMOM_DEPLOYMENT.md create mode 100644 docs/04-configuration/verification-evidence/NEXT_STEPS_RUN_20260224_021728.md create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/all_e2e_results.json create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/cacti-alltra_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/cacti-hybx_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/codespaces_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/dapp_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/dbis-admin_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/dbis-api-2_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/dbis-api_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/dev_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/explorer_d-bis_org_blockscout_api.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/explorer_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/gitea_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/mifos_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/mim4u_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/phoenix_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/rpc-alltra-2_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/rpc-alltra-3_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/rpc-alltra_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/rpc-fireblocks_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/rpc-http-prv_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/rpc-http-pub_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/rpc-hybx-2_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/rpc-hybx-3_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/rpc-hybx_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/rpc2_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/rpc_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/rpc_defi-oracle_io_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/rpc_public-0138_defi-oracle_io_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/secure_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/secure_mim4u_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/the-order_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/training_mim4u_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/verification_report.md create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/www_mim4u_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/www_phoenix_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_131245/www_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/all_e2e_results.json create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/cacti-alltra_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/cacti-hybx_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/codespaces_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/dapp_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/dbis-admin_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/dbis-api-2_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/dbis-api_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/dev_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/explorer_d-bis_org_blockscout_api.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/explorer_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/gitea_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/mifos_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/mim4u_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/phoenix_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/rpc-alltra-2_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/rpc-alltra-3_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/rpc-alltra_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/rpc-fireblocks_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/rpc-http-prv_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/rpc-http-pub_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/rpc-hybx-2_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/rpc-hybx-3_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/rpc-hybx_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/rpc2_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/rpc_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/rpc_defi-oracle_io_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/rpc_public-0138_defi-oracle_io_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/secure_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/secure_mim4u_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/the-order_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/training_mim4u_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/verification_report.md create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/www_mim4u_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/www_phoenix_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260222_161727/www_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/all_e2e_results.json create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/cacti-alltra_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/cacti-hybx_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/codespaces_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/dapp_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/dbis-admin_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/dbis-api-2_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/dbis-api_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/dev_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/explorer_d-bis_org_blockscout_api.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/explorer_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/gitea_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/mifos_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/mim4u_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/phoenix_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/rpc-alltra-2_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/rpc-alltra-3_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/rpc-alltra_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/rpc-fireblocks_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/rpc-http-prv_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/rpc-http-pub_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/rpc-hybx-2_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/rpc-hybx-3_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/rpc-hybx_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/rpc2_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/rpc_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/rpc_defi-oracle_io_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/rpc_public-0138_defi-oracle_io_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/secure_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/secure_mim4u_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/the-order_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/training_mim4u_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/verification_report.md create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/www_mim4u_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/www_phoenix_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260224_021728/www_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/all_e2e_results.json create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/cacti-alltra_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/cacti-hybx_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/codespaces_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/dapp_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/dbis-admin_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/dbis-api-2_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/dbis-api_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/dev_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/explorer_d-bis_org_blockscout_api.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/explorer_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/gitea_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/mifos_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/mim4u_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/phoenix_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/rpc-alltra-2_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/rpc-alltra-3_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/rpc-alltra_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/rpc-fireblocks_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/rpc-http-prv_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/rpc-http-pub_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/rpc-hybx-2_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/rpc-hybx-3_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/rpc-hybx_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/rpc2_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/rpc_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/rpc_defi-oracle_io_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/rpc_public-0138_defi-oracle_io_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/secure_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/secure_mim4u_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/the-order_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/training_mim4u_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/verification_report.md create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/www_mim4u_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/www_phoenix_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260227_211933/www_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_115554/cacti-hybx_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_115554/dapp_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_115554/dbis-admin_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_115554/dbis-api_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_115554/dev_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_115554/mifos_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_115554/mim4u_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_115554/phoenix_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_115554/rpc-alltra-2_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_115554/rpc-alltra-3_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_115554/rpc-alltra_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_115554/rpc-http-pub_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_115554/rpc-hybx-2_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_115554/rpc-hybx-3_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_115554/rpc2_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_115554/rpc_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_115554/rpc_public-0138_defi-oracle_io_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_115554/sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_115554/studio_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_115554/the-order_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_115554/www_mim4u_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_115554/www_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_121858/cacti-hybx_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_121858/dbis-admin_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_121858/mifos_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_121858/rpc-alltra-3_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_121858/rpc-alltra_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_121858/rpc-http-pub_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_121858/rpc-hybx-2_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_121858/sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/all_e2e_results.json create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/cacti-alltra_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/cacti-hybx_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/codespaces_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/dapp_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/dbis-admin_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/dbis-api-2_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/dbis-api_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/dev_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/explorer_d-bis_org_blockscout_api.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/explorer_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/gitea_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/mifos_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/mim4u_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/phoenix_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/rpc-alltra-2_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/rpc-alltra-3_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/rpc-alltra_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/rpc-fireblocks_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/rpc-http-prv_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/rpc-http-pub_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/rpc-hybx-2_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/rpc-hybx-3_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/rpc-hybx_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/rpc2_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/rpc_d-bis_org_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/rpc_defi-oracle_io_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/rpc_public-0138_defi-oracle_io_rpc_response.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/secure_d-bis_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/secure_mim4u_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/studio_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/the-order_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/training_mim4u_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/verification_report.md create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/www_mim4u_org_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/www_phoenix_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/e2e-verification-20260301_213835/www_sankofa_nexus_https_headers.txt create mode 100644 docs/04-configuration/verification-evidence/rpc-502-diagnostics-20260227-181345.txt create mode 100644 docs/04-configuration/verification-evidence/rpc-502-diagnostics-20260227-210017.txt create mode 100644 docs/04-configuration/verification-evidence/rpc-502-diagnostics-20260227-211819.txt delete mode 100644 docs/07-ccip/CHAIN138_COMPLETE_ROUTING_TABLE.md create mode 100644 docs/07-ccip/CW_BRIDGE_APPROACH.md create mode 100644 docs/07-ccip/CW_DEPLOY_AND_WIRE_RUNBOOK.md delete mode 100644 docs/07-ccip/MAPPER_COVERAGE_BRIDGES_AND_LIQUIDITY_POOLS.md delete mode 100644 docs/07-ccip/MAPPER_GAPS_DEPLOYMENTS_AND_IMPROVEMENTS.md delete mode 100644 docs/07-ccip/README.md delete mode 100644 docs/07-ccip/TOKEN_MAPPING_AND_MAINNET_ADDRESSES.md create mode 100644 docs/09-troubleshooting/DAPP_CONSOLE_ERRORS_METAMASK.md create mode 100644 docs/09-troubleshooting/PUBLIC_RPC_WEBSOCKET_502.md delete mode 100644 docs/09-troubleshooting/README.md create mode 100644 docs/10-best-practices/SCRIPT_HEADER_TEMPLATE.md create mode 100644 docs/11-references/ADDRESS_MATRIX_AND_STATUS.md delete mode 100644 docs/11-references/CHAIN138_TOKEN_ADDRESSES.md delete mode 100644 docs/11-references/CONTRACT_INVENTORY_AND_VERIFICATION.md create mode 100644 docs/11-references/CW_TOKENS_AND_NETWORKS.md create mode 100644 docs/11-references/DEPLOYED_COINS_TOKENS_AND_NETWORKS.md create mode 100644 docs/11-references/DEPLOYER_WALLET_FUNDING_PLAN_PMM_POOLS.md create mode 100644 docs/11-references/GAPS_FILLED_2026-02-27.md create mode 100644 docs/11-references/LINK_TOKEN_ADDRESSES_REFERENCE.md create mode 100644 docs/11-references/LIQUIDITY_DEPTH_500M_PER_TOKEN_MULTICHAIN.md create mode 100644 docs/11-references/PMM_DEX_ROUTING_STATUS.md create mode 100644 docs/11-references/POOLS_AND_NETWORKS_FULL_DESIGN.md create mode 100644 docs/11-references/POOL_ACCESS_DASHBOARD_API_MCP.md delete mode 100644 docs/11-references/README.md create mode 100644 docs/11-references/TOKENS_AND_NETWORKS_MINTABLE_TO_DEPLOYER.md create mode 100644 docs/11-references/TOKENS_DEPLOYER_DEPLOYED_ON_OTHER_CHAINS.md create mode 100644 docs/11-references/TOKEN_CATEGORIES_CANONICAL.md delete mode 100644 docs/11-references/TOKEN_LIST_AUTHORING_GUIDE.md create mode 100644 docs/GALATIC_SUMMARY.md create mode 100644 docs/api/omnl-fineract-openapi.json create mode 100644 docs/dbis-rail/DBIS_RAIL_ADDONS_CODE_COMPLETION_TASK_LIST.md create mode 100644 docs/dbis-rail/DBIS_RAIL_AND_PROJECT_COMPLETION_MASTER_V1.md create mode 100644 docs/dbis-rail/DBIS_RAIL_AUDIT_READINESS_CHECKLIST_V1.md create mode 100644 docs/dbis-rail/DBIS_RAIL_AUDIT_READINESS_RESULTS_V1.md create mode 100644 docs/dbis-rail/DBIS_RAIL_CONTROL_MAPPING_V1.md create mode 100644 docs/dbis-rail/DBIS_RAIL_CONVERSION_ROUTER_SPEC_V1_5.md create mode 100644 docs/dbis-rail/DBIS_RAIL_HASH_CANONICALIZATION_AND_TEST_VECTORS_V1_5.md create mode 100644 docs/dbis-rail/DBIS_RAIL_LEDGER_ATTESTATION_ADDON_V1_5.md create mode 100644 docs/dbis-rail/DBIS_RAIL_REGULATOR_BRIEF_V1.md create mode 100644 docs/dbis-rail/DBIS_RAIL_RULEBOOK_V1.md create mode 100644 docs/dbis-rail/DBIS_RAIL_SECURITY_THREAT_MODEL_V1.md create mode 100644 docs/dbis-rail/DBIS_RAIL_STABLECOIN_POLICY_V1_5.md create mode 100644 docs/dbis-rail/DBIS_RAIL_TECHNICAL_SPEC_V1.md create mode 100644 docs/dbis-rail/IMPLEMENTATION_COORDINATION_WITH_TRANSCRIPT_540AE663.md create mode 100644 docs/dbis-rail/README.md create mode 100644 docs/images/README.md create mode 100644 docs/images/explorer-blocks.png create mode 100644 docs/images/explorer-home.png create mode 100644 docs/images/explorer-transactions.png create mode 100644 docs/runbooks/GRU_M00_DIAMOND_DEPLOYMENT_RUNBOOK.md create mode 100644 reports/public-rpc-e2e-stability-20260222_124405.json create mode 100644 reports/public-rpc-e2e-stability-20260222_124405.md create mode 100644 reports/public-rpc-e2e-stability-20260222_124603.json create mode 100644 reports/public-rpc-e2e-stability-20260222_124603.md create mode 100644 reports/public-rpc-e2e-stability-20260222_124830.json create mode 100644 reports/public-rpc-e2e-stability-20260222_124830.md create mode 100644 reports/public-rpc-e2e-stability-20260222_134242.json create mode 100644 reports/public-rpc-e2e-stability-20260222_134242.md create mode 100644 reports/public-rpc-e2e-stability-20260222_135401.json create mode 100644 reports/public-rpc-e2e-stability-20260222_135401.md create mode 100644 reports/rpc_nodes_test_20260222_214342.json create mode 100644 reports/rpc_nodes_test_20260222_214342.md delete mode 100644 rpc-translator-138/src/handlers/rpc-handler.ts create mode 100644 scripts/57xx-deploy/5702-inference/docker-compose.yml create mode 100644 scripts/57xx-deploy/5703-agent/.env.example create mode 100644 scripts/57xx-deploy/5703-agent/docker-compose.yml create mode 100644 scripts/57xx-deploy/5704-state/.env.example create mode 100644 scripts/57xx-deploy/5704-state/docker-compose.yml create mode 100644 scripts/57xx-deploy/README.md create mode 100755 scripts/57xx-deploy/copy-to-opt-ai.sh create mode 100644 scripts/apply-remaining-operator-fixes.sh create mode 100644 scripts/besu/enable-trace-api-vmid2201.sh create mode 100755 scripts/burn-weth9-deployer.sh create mode 100755 scripts/burn-weth9-from-keys.sh create mode 100755 scripts/check-and-start-rpc-2101.sh create mode 100755 scripts/check-network-rpc-138.sh create mode 100755 scripts/clear-rpc-2201-txpool.sh create mode 100755 scripts/cloudflare/add-studio-sankofa-dns.sh create mode 100755 scripts/complete-ipfs-logo-next-steps.sh create mode 100644 scripts/consolidate-secrets-into-file.sh create mode 100755 scripts/deploy-token-aggregation-for-publication.sh create mode 100755 scripts/deployment/check-deployer-balance-chain138-and-funding-plan.sh create mode 100755 scripts/deployment/check-deployer-nonce-and-balance.sh create mode 100755 scripts/deployment/create-all-pmm-pools-chain138.sh create mode 100755 scripts/deployment/deploy-transaction-mirror-chain138-nonce-fix.sh create mode 100755 scripts/deployment/preflight-chain138-deploy.sh create mode 100755 scripts/deployment/run-all-next-steps-chain138.sh create mode 100755 scripts/deployment/run-before-deploy-checks.sh create mode 100755 scripts/deployment/run-cw-remaining-steps.sh create mode 100755 scripts/deployment/set-dotenv-c-tokens-and-register-gru.sh create mode 100644 scripts/deployment/set-missing-dotenv-chain138.sh create mode 100755 scripts/deployment/test-all-contracts-before-deploy.sh create mode 100755 scripts/export-all-token-reports-for-publication.sh create mode 100644 scripts/health/verify-lxc-configs-on-hosts.sh create mode 100644 scripts/install-wscat-in-rpc-containers.sh create mode 100644 scripts/maintenance/fix-storage-r630-01-and-thin5.sh create mode 100644 scripts/maintenance/migrate-ct-r630-01-data-to-thin1.sh create mode 100644 scripts/maintenance/migrate-vmid-5000-to-thin2.sh create mode 100755 scripts/nginx-proxy-manager/add-studio-sankofa-npmplus-proxy.sh create mode 100755 scripts/omnl/create-office-and-fund.sh create mode 100755 scripts/omnl/office2-5b-full-execution.sh create mode 100755 scripts/omnl/office2-shamrayan-dryrun.sh create mode 100755 scripts/omnl/omnl-audit-packet-office20.sh create mode 100755 scripts/omnl/omnl-baseline-create.sh create mode 100644 scripts/omnl/omnl-client-names-fix.sh create mode 100644 scripts/omnl/omnl-clients-create-9-15.sh create mode 100644 scripts/omnl/omnl-clients-remove-15.sh create mode 100755 scripts/omnl/omnl-config-hash.sh create mode 100644 scripts/omnl/omnl-entity-data-apply.sh create mode 100644 scripts/omnl/omnl-gl-accounts-fx-gru-create.sh create mode 100755 scripts/omnl/omnl-gl-closures-post.sh create mode 100755 scripts/omnl/omnl-je-checker.sh create mode 100755 scripts/omnl/omnl-je-maker.sh create mode 100755 scripts/omnl/omnl-je-reverse-by-reference.sh create mode 100644 scripts/omnl/omnl-ledger-post-from-matrix.sh create mode 100755 scripts/omnl/omnl-monitor-office20-movement.sh create mode 100644 scripts/omnl/omnl-office-create-pelican.sh create mode 100755 scripts/omnl/omnl-office-create-samama.sh create mode 100755 scripts/omnl/omnl-office2-access-security-test.sh create mode 100644 scripts/omnl/omnl-offices-populate-15.sh create mode 100755 scripts/omnl/omnl-operator-rail.sh create mode 100755 scripts/omnl/omnl-reconciliation-office20.sh create mode 100644 scripts/omnl/omnl-user-shamrayan-office-create.sh create mode 100755 scripts/omnl/resolve_ids.sh create mode 100755 scripts/omnl/validate-rail.sh create mode 100644 scripts/patch-nginx-explorer-config.sh create mode 100755 scripts/run-before-pr-validations.sh create mode 100755 scripts/run-e2e-flow-tasks-full-parallel.sh create mode 100644 scripts/run-rpc-node-suite-all-hosts.sh create mode 100644 scripts/sync-dual-chain-configs.sh create mode 100644 scripts/truth-network/README.md create mode 100755 scripts/truth-network/deploy-and-register-truth-on-chain138.sh create mode 100755 scripts/truth-network/deploy-chain-registry-and-truth.sh create mode 100644 scripts/truth-network/package.json create mode 100755 scripts/truth-network/register-truth-in-chain-registry.sh create mode 100755 scripts/upload-token-logos-to-ipfs.sh mode change 100644 => 100755 scripts/validation/validate-config-files.sh create mode 100755 scripts/verify/check-chain138-token-permit-support.sh create mode 100755 scripts/verify/check-public-rpc-stability-e2e.sh create mode 100755 scripts/weth9-list-holders.sh create mode 100644 scripts/weth9-zero-supply.md create mode 100644 x402-api/.env.example create mode 100644 x402-api/.gitignore create mode 100644 x402-api/README.md create mode 100644 x402-api/package.json create mode 100644 x402-api/src/index.js diff --git a/.cursor/rules/operator-context-lan-proxmox.mdc b/.cursor/rules/operator-context-lan-proxmox.mdc new file mode 100644 index 0000000..93f2ce8 --- /dev/null +++ b/.cursor/rules/operator-context-lan-proxmox.mdc @@ -0,0 +1,10 @@ +--- +description: This machine has LAN and Proxmox access; operator scripts can be run from here +alwaysApply: true +--- + +# Operator context — LAN and Proxmox + +**Remember:** This machine **is** LAN/operator — it has LAN and Proxmox access to 192.168.11.x. Operator scripts **can and should** be run from here when the user asks to run operator tasks. + +When suggesting or running operator/LAN tasks (e.g. `run-all-operator-tasks-from-lan.sh`, contract verification, NPMplus backup, nginx/VMID 5000, token-aggregation DB, E2E checks), assume this host can reach Proxmox hosts (192.168.11.10–12), Chain 138 RPC (192.168.11.211:8545), NPMplus, and Blockscout. Do not treat operator tasks as "unrunnable from this environment" unless a specific credential or network constraint is missing. Only credentials in `.env` (e.g. `NPM_PASSWORD`, `PRIVATE_KEY`) are required to execute them. diff --git a/.cursor/worktrees.json b/.cursor/worktrees.json new file mode 100644 index 0000000..77e9744 --- /dev/null +++ b/.cursor/worktrees.json @@ -0,0 +1,5 @@ +{ + "setup-worktree": [ + "npm install" + ] +} diff --git a/.env.example b/.env.example deleted file mode 100644 index 1dd6f56..0000000 --- a/.env.example +++ /dev/null @@ -1,310 +0,0 @@ -# ============================================================================ -# Proxmox Workspace - Root Environment Variables -# ============================================================================ -# Copy to .env in repo root and/or ~/.env (scripts use repo root .env when -# run from repo; setup.sh and load-env.sh use ~/.env for PROXMOX_*). -# DO NOT commit actual .env files to version control -# ============================================================================ - -# ---------------------------------------------------------------------------- -# Proxmox Configuration -# ---------------------------------------------------------------------------- -PROXMOX_ML110=192.168.11.10 -PROXMOX_R630_01=192.168.11.11 -PROXMOX_R630_02=192.168.11.12 -PROXMOX_HOST=192.168.11.11 -PROXMOX_PORT=8006 -PROXMOX_USER=root@pam -# Create token: ./scripts/proxmox/create-and-store-proxmox-api-token.sh (or Datacenter → API Tokens in UI) -PROXMOX_TOKEN_NAME=your-token-name -PROXMOX_TOKEN_VALUE=your-token-secret-value -PROXMOX_ALLOW_ELEVATED=false - -# ---------------------------------------------------------------------------- -# Cloudflare Configuration (both methods supported) -# ---------------------------------------------------------------------------- -# Scripts (DNS, NPMplus, tunnel): use CLOUDFLARE_API_TOKEN first, else CLOUDFLARE_EMAIL + CLOUDFLARE_API_KEY. -# Certbot (dns-cloudflare): use ONE method per credentials file (token-only OR email+key-only). -# See: docs/04-configuration/CLOUDFLARE_CREDENTIALS_BOTH_METHODS.md -CLOUDFLARE_API_TOKEN=your-cloudflare-api-token -CLOUDFLARE_EMAIL=your-email@example.com -CLOUDFLARE_API_KEY=your-cloudflare-api-key -CLOUDFLARE_ZONE_ID_D_BIS_ORG=your-zone-id -CLOUDFLARE_ZONE_ID_MIM4U_ORG=your-zone-id -CLOUDFLARE_ZONE_ID_SANKOFA_NEXUS=your-zone-id -CLOUDFLARE_ZONE_ID_DEFI_ORACLE_IO=your-zone-id -# Optional fallback for d-bis.org (create-dns-record-rpc-core, update-all-dns-to-public-ip) -# CLOUDFLARE_ZONE_ID=your-d-bis-org-zone-id -# Required for Chain 138 RPC DNS: rpc.defi-oracle.io, wss.defi-oracle.io, rpc.public-0138.defi-oracle.io -CLOUDFLARE_TUNNEL_TOKEN=your-tunnel-token -CLOUDFLARE_ORIGIN_CA_KEY=your-origin-ca-key -CLOUDFLARE_ACCOUNT_ID=your-account-id -# Tunnel ID for Option B RPC DNS (set-rpc-dns-to-tunnel.sh): from Zero Trust → Tunnels → tunnel UUID -# CLOUDFLARE_TUNNEL_ID=10ab22da-8ea3-4e2e-a896-27ece2211a05 -# Alltra/HYBX tunnel (configure-alltra-hybx-tunnel-and-dns.sh) -# CLOUDFLARE_TUNNEL_ID_ALLTRA_HYBX=892bd3fe-c6fa-4ddf-8b60-a8ed2b849c3d -# Mifos on r630-02 (configure-mifos-dns.sh tunnel mode; install-tunnel-mifos-r630-02.sh) -# CLOUDFLARE_TUNNEL_ID_MIFOS_R630_02=your-tunnel-uuid -# CLOUDFLARE_TUNNEL_TOKEN_MIFOS_R630_02=your-tunnel-token -# Fineract API (central-bank-config scripts). Use full API path e.g. https://mifos.d-bis.org/fineract-provider/api/v1 -# MIFOS_BASE_URL=https://mifos.d-bis.org/fineract-provider/api/v1 -# MIFOS_TENANT=default -# MIFOS_USER=mifos -# MIFOS_PASSWORD=your-fineract-password -# MIFOS_INSECURE=0 -# OMNL tenancy (https://omnl.hybxfinance.io/) – same scripts, different vars if needed -# OMNL_FINERACT_BASE_URL=https://omnl.hybxfinance.io/fineract-provider/api/v1 -# OMNL_FINERACT_TENANT=omnl -# OMNL_FINERACT_USER=app.omnl -# OMNL_FINERACT_PASSWORD=your-omnl-fineract-password -# Certbot dns_cloudflare (optional): in the file certbot reads, use ONE of: -# dns_cloudflare_email=your-email@example.com + dns_cloudflare_api_key=your-api-key -# OR dns_cloudflare_api_token=your-api-token - -# ---------------------------------------------------------------------------- -# ClouDNS (Certbot dns-cloudns) – NPMplus Certbot DNS challenge -# ---------------------------------------------------------------------------- -# For NPMplus TLS: Add TLS Certificate → DNS Challenge → ClouDNS → paste output of: -# ./scripts/certbot/print-cloudns-credentials-from-env.sh -# See: https://www.cloudns.net/api-settings/ -CLOUDNS_AUTH_ID=1234 -CLOUDNS_AUTH_PASSWORD=your-cloudns-api-password -# Optional: use sub-account (one of the two below, not both) -# CLOUDNS_SUB_AUTH_ID=1234 -# CLOUDNS_SUB_AUTH_USER=foobar - -# ---------------------------------------------------------------------------- -# NPM (Nginx Proxy Manager) / NPMplus Configuration -# ---------------------------------------------------------------------------- -# Required for: update-npmplus-proxy-hosts-api.sh, configure-npmplus-domains.js, -# scripts/fix-rpc-chain138-npmplus.sh (RPC ChainID 138 + Ledger) -# scripts/complete-chain138-rpc-setup.sh (full Chain 138 RPC from .env) -# See: docs/04-configuration/NEXT_STEPS_CHAIN138_RPC.md for complete .env → script mapping -# NPMplus (VMID 10233) is reachable on 192.168.11.167:81 (eth1). All five NPMplus instances (10233, 10234, 10235, 10236, 10237) use the same NPM_EMAIL and NPM_PASSWORD. -NPM_URL=https://192.168.11.167:81 -NPM_EMAIL=admin@example.org -NPM_PASSWORD=your-npm-password -# NPM_HOST = NPMplus container IP (for split-DNS, LAN tests, verify-ws) -NPM_HOST=192.168.11.167 -# NPM_PROXMOX_HOST / NPMPLUS_HOST = Proxmox host where NPMplus runs (SSH for pct exec, backup) -NPM_PROXMOX_HOST=192.168.11.11 -NPMPLUS_HOST=192.168.11.11 -NPM_VMID=10233 -# NPMPLUS_VMID = same as NPM_VMID (used by list-npmplus-certificates-status, install-certbot-dns-cloudflare-in-npm, backup-npmplus, etc.) -NPMPLUS_VMID=10233 - -# NPMplus Mifos (VMID 10237, 192.168.11.171) — tunnel origin for mifos.d-bis.org → 5800. Same NPM_EMAIL/NPM_PASSWORD as above. -# NPM_URL_MIFOS=https://192.168.11.171:81 - -# NPMplus Alltra/HYBX (dedicated instance for Alltra + HYBX Sentries, RPC, Cacti, Firefly, Fabric, Indy) -# See: docs/04-configuration/NPMPLUS_ALLTRA_HYBX_MASTER_PLAN.md -NPMPLUS_ALLTRA_HYBX_VMID=10235 -IP_NPMPLUS_ALLTRA_HYBX=192.168.11.169 - -# ---------------------------------------------------------------------------- -# Fastly (edge CDN / origin) -# ---------------------------------------------------------------------------- -# For Fastly API (purge, service config, health). See docs/05-network/CLOUDFLARE_ROUTING_MASTER.md -FASTLY_API_TOKEN=your-fastly-api-token - -# ---------------------------------------------------------------------------- -# Network Configuration -# ---------------------------------------------------------------------------- -# PUBLIC_IP: used by update-all-dns-to-public-ip.sh for all Cloudflare A records (Chain 138 RPC) -PUBLIC_IP=76.53.10.36 -PROXMOX_HOST_FOR_TEST=192.168.11.11 - -# ---------------------------------------------------------------------------- -# UniFi (UDM Pro) API – Official Network API (X-API-KEY) -# ---------------------------------------------------------------------------- -# Used by: create-firewall-rules.sh, UNIFI_API_SETUP.md, unifi:cli -# Get API key: UniFi Network UI → Settings → System → API (or Developer / API Access) -UNIFI_UDM_URL=https://192.168.0.1 -UNIFI_API_KEY=your-unifi-api-key -UNIFI_API_MODE=official -UNIFI_SITE_ID=default -UNIFI_VERIFY_SSL=false - -# ---------------------------------------------------------------------------- -# OMNIS Backend Configuration -# ---------------------------------------------------------------------------- -# Database -DATABASE_URL=postgresql://user:password@localhost:5432/omnis - -# JWT Authentication (REQUIRED - no defaults for security) -JWT_SECRET=your-strong-random-jwt-secret-min-32-chars -JWT_REFRESH_SECRET=your-strong-random-refresh-secret-min-32-chars -JWT_EXPIRES_IN=7d -JWT_REFRESH_EXPIRES_IN=30d - -# File Storage -STORAGE_TYPE=local -STORAGE_PATH=./uploads - -# AWS S3 (if using S3 storage) -AWS_REGION=us-east-1 -AWS_ACCESS_KEY_ID=your-aws-access-key -AWS_SECRET_ACCESS_KEY=your-aws-secret-key -AWS_S3_BUCKET=omnis-uploads - -# Azure Blob Storage (if using Azure storage) -AZURE_STORAGE_CONNECTION_STRING=your-azure-connection-string -AZURE_STORAGE_CONTAINER=omnis-uploads - -# ---------------------------------------------------------------------------- -# The Order Configuration -# ---------------------------------------------------------------------------- -# See the-order/packages/shared/src/env.ts for complete schema - -# Database -# DATABASE_URL=postgresql://user:password@localhost:5432/theorder - -# Storage -# STORAGE_TYPE=s3 -# STORAGE_BUCKET=the-order-documents -# STORAGE_REGION=us-east-1 -# AWS_ACCESS_KEY_ID=your-aws-key -# AWS_SECRET_ACCESS_KEY=your-aws-secret - -# KMS -# KMS_TYPE=aws -# KMS_KEY_ID=your-kms-key-id -# KMS_REGION=us-east-1 - -# Authentication -# JWT_SECRET=your-jwt-secret-min-32-chars -# OIDC_ISSUER=https://your-oidc-issuer.com -# OIDC_CLIENT_ID=your-client-id -# OIDC_CLIENT_SECRET=your-client-secret - -# ---------------------------------------------------------------------------- -# dbis_core AS4 Settlement (optional - enables real API calls) -# ---------------------------------------------------------------------------- -# SANCTIONS_API_URL=https://... # OFAC/EU/UN sanctions screening -# AML_SERVICE_URL=https://... # AML/CTF checks -# LEDGER_SERVICE_URL=https://... # Ledger balance queries for liquidity - -# dbis_core IRU (optional) -# AWS_SES_REGION=us-east-1 -# AWS_ACCESS_KEY_ID=... -# AWS_SECRET_ACCESS_KEY=... -# SANCTIONS_OFAC_API_URL=... -# SANCTIONS_EU_API_URL=... -# SANCTIONS_UN_API_URL=... - -# ---------------------------------------------------------------------------- -# Verification Scripts (scripts/verify/) -# ---------------------------------------------------------------------------- -# See docs/04-configuration/VERIFICATION_GAPS_AND_TODOS.md -# FABRIC_CHAIN_ID=999 # Fabric chain ID for quote-service (when integrated) -# BRIDGE_REGISTRY_ADDRESS= # For bridge quote service - -# ---------------------------------------------------------------------------- -# SMOM-DBIS-138 Blockchain Configuration -# ---------------------------------------------------------------------------- -# Canonical place for Chain 138 deploy: smom-dbis-138/.env (PRIVATE_KEY, RPC_URL or RPC_URL_138). -# Optional deployments (docs/07-ccip/OPTIONAL_DEPLOYMENTS_START_HERE.md): set in smom-dbis-138/.env: -# ORACLE_PRICE_FEED or RESERVE_KEEPER (Phase 4), DODO_VENDING_MACHINE_ADDRESS (Phase 7), -# GAS_PRICE_138 (if "Replacement transaction underpriced"), CRONOS_RPC_URL (other-chain AddressMapper). -# Scripts source both root .env and smom-dbis-138/.env via load-project-env.sh; no need to duplicate here. -# Deployment Account (MOVE TO HSM - DO NOT STORE IN FILES) -# PRIVATE_KEY=0x... # ⚠️ Set in smom-dbis-138/.env (or here); never commit real key - -# RPC Endpoints (see docs/04-configuration/RPC_ENDPOINTS_MASTER.md for Infura/Alchemy/public options) -ETHEREUM_MAINNET_RPC=https://eth.llamarpc.com -RPC_URL_138=https://rpc.d-bis.org - -# Tezos / Etherlink / Jumper (see docs/07-ccip/TEZOS_NETWORK_CONFIG_ENV_MATRIX.md) -CHAIN_651940_RPC_URL=https://mainnet-rpc.alltra.global -ETHERLINK_RPC_URL=https://node.mainnet.etherlink.com -TEZOS_RPC_URL=https://api.tzkt.io -ETHERLINK_CCIP_SELECTOR= -TEZOS_BRIDGE_ENABLED=false -ETHERLINK_BRIDGE_ENABLED=false -TEZOS_RELAY_ORACLE_KEY= -ETHERLINK_RELAY_BRIDGE= -ETHERLINK_RELAY_PRIVATE_KEY= -JUMPER_API_KEY= - -# Contract Verification (Etherscan / Blockscan — same key for both) -ETHERSCAN_API_KEY=your-etherscan-api-key -# Optional: Infura RPC/Gas — set ETHEREUM_MAINNET_RPC to https://mainnet.infura.io/v3/, INFURA_GAS_API, etc. in smom-dbis-138/.env - -# External Integrations (see reports/API_KEYS_REQUIRED.md) -ONEINCH_API_KEY= -MOONPAY_API_KEY= -MOONPAY_SECRET_KEY= -RAMP_NETWORK_API_KEY= -ONRAMPER_API_KEY= - -# ---------------------------------------------------------------------------- -# Alerts & Monitoring (dbis_core alert.service) -# ---------------------------------------------------------------------------- -# See: reports/API_KEYS_REQUIRED.md -SLACK_WEBHOOK_URL= -PAGERDUTY_INTEGRATION_KEY= -EMAIL_ALERT_API_URL= -EMAIL_ALERT_RECIPIENTS= - -# ---------------------------------------------------------------------------- -# Legal / E-Signature (the-order legal-documents) -# ---------------------------------------------------------------------------- -E_SIGNATURE_BASE_URL= - -# ---------------------------------------------------------------------------- -# OTC (dbis_core) -# ---------------------------------------------------------------------------- -CRYPTO_COM_API_KEY= -CRYPTO_COM_API_SECRET= - -# ---------------------------------------------------------------------------- -# Bridge (optional: LayerZero, Wormhole) -# ---------------------------------------------------------------------------- -# LAYERZERO_*= -# WORMHOLE_*= - -# ---------------------------------------------------------------------------- -# Price Feed & Market Data APIs -# ---------------------------------------------------------------------------- -# CoinGecko API Key (for Oracle Publisher and Token Aggregation services) -# Get free key at: https://www.coingecko.com/en/api/pricing -COINGECKO_API_KEY=your-coingecko-api-key - -# CoinDesk API Key (price/market data) -COINDESK_API_KEY=your-coindesk-api-key - -# ---------------------------------------------------------------------------- -# Explorer Configuration -# ---------------------------------------------------------------------------- -# See explorer-monorepo/deployment/ENVIRONMENT_TEMPLATE.env - -# ---------------------------------------------------------------------------- -# MetaMask Integration -# ---------------------------------------------------------------------------- -# See metamask-integration/.env.example - -# ---------------------------------------------------------------------------- -# Gitea (Dev VM / d-bis org) -# ---------------------------------------------------------------------------- -# For push-to-gitea.sh and gitea-create-orgs-and-repos.sh. Create token at: -# https://gitea.d-bis.org/user/settings/applications (scopes: write:organization, write:repository) -# GITEA_URL=https://gitea.d-bis.org -# GITEA_TOKEN= - -# ---------------------------------------------------------------------------- -# Security Notes -# ---------------------------------------------------------------------------- -# 1. NEVER commit .env files to version control -# 2. Use strong, randomly generated secrets (min 32 characters for JWT) -# 3. Rotate secrets regularly -# 4. Use HSM/Key Vault for private keys (never store in files) -# 5. Limit access to .env files (chmod 600) -# 6. Use different secrets for development, staging, and production - -# ---------------------------------------------------------------------------- -# Environment-Specific Overrides -# ---------------------------------------------------------------------------- -# For development: NODE_ENV=development -# For staging: NODE_ENV=staging -# For production: NODE_ENV=production -NODE_ENV=development diff --git a/.github/workflows/validate-config.yml b/.github/workflows/validate-config.yml index f421181..99c5ff2 100644 --- a/.github/workflows/validate-config.yml +++ b/.github/workflows/validate-config.yml @@ -9,12 +9,16 @@ on: - 'scripts/verify/run-all-validation.sh' - 'scripts/run-completable-tasks-from-anywhere.sh' - '.github/workflows/validate-config.yml' + - 'token-lists/**' + - 'explorer-monorepo/backend/api/rest/config/metamask/**' push: branches: [master] paths: - 'config/**' - 'scripts/validation/**' - '.github/workflows/validate-config.yml' + - 'token-lists/**' + - 'explorer-monorepo/backend/api/rest/config/metamask/**' jobs: validate: @@ -29,3 +33,6 @@ jobs: - name: Completable tasks (dry-run) run: bash scripts/run-completable-tasks-from-anywhere.sh --dry-run + + - name: Shellcheck (optional) + run: bash scripts/verify/run-shellcheck.sh --optional diff --git a/.github/workflows/validate-omnl-rail.yml b/.github/workflows/validate-omnl-rail.yml new file mode 100644 index 0000000..45b2567 --- /dev/null +++ b/.github/workflows/validate-omnl-rail.yml @@ -0,0 +1,33 @@ +# Validate OMNL operator rail: .gitignore, resolve_ids pattern, shellcheck on scripts/omnl. +name: Validate OMNL Rail + +on: + pull_request: + paths: + - 'scripts/omnl/**' + - '.gitignore' + - '.github/workflows/validate-omnl-rail.yml' + push: + branches: [master] + paths: + - 'scripts/omnl/**' + - '.github/workflows/validate-omnl-rail.yml' + +jobs: + validate-omnl-rail: + name: OMNL rail checks + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: .gitignore and resolve_ids + run: bash scripts/omnl/validate-rail.sh + + - name: Shellcheck (optional) + run: | + if command -v shellcheck >/dev/null 2>&1; then + shellcheck -x scripts/omnl/*.sh || true + else + echo "Shellcheck not installed; skipping." + fi diff --git a/.gitignore b/.gitignore index dcbc50d..83a2988 100644 --- a/.gitignore +++ b/.gitignore @@ -48,5 +48,20 @@ venv/ __pycache__/ *.pyc +# CoinGecko/CMC token logos (generated by prepare-token-logos-512x512.sh) +docs/04-configuration/coingecko/logos/*.png + # Ephemeral phase markers .phase1-event-status + +# OMNL operator rail (env-specific IDs, reconciliation, audit packets, posted refs) +ids.env +reconciliation/ + +# Office 2 Shamrayan P2P credentials (runbook-only; never commit) +.env.office2-p2p +**/.env.office2-p2p +.posted_refs +*.payload.json +*.payload.sha256 +audit_log.jsonl diff --git a/CRUNCHY-21-20260224-TR1-1B-AUDIT.zip b/CRUNCHY-21-20260224-TR1-1B-AUDIT.zip new file mode 100644 index 0000000000000000000000000000000000000000..996550cc521efe9080018ae1fcfa120881501ef5 GIT binary patch literal 2992 zcma)8c|4SP7$1x=gQRjyv`Ef!j5{G$v|@~Vlyi(x<7Q?S%OnPi91-PAc8#3Nid;n+ z8di=HiKI}79NAVR_Lcp_Dm%UJ=lQ+A_n+VQ^L(H0^Zh+$#w=iV(E1~4V{89;^Y0=I zIsn3uT=7I%A2&BV7N@8ntB6okMJOsN%PJgIR#Q-tx3+?TSaRNF@Ko=;woN{Wt{oF@ZqtKu9w_*up^f1kyl`7)bm-2;?OciiY59nf=6LUdFAm zR!6LDiUL0ZpYvo(a2)XtQ!T7B8Ho5WqYTAAlli!K?d>9WGKycHZ&bRUhTHu^mb|Or zijEBzRJ_d3X4`ZBrZrfrt@O^{hEu$K|S?m&SCQt)457Q+rhZq+aO!6lI zGl>GTmZ7$#6E=P*36%u6OvXsDNdp}leqL&qblHa}HA6gYO7K1>_LZzOTX{~}mGci= zNzqz1$MZUEXmIWBe5_n2SrdI|0A4byDJHDX8l)88xO+wWirOhcdg)-l`hj6CkvFG* z@_{3wG=?rbLR3q6#Kg5hsMbi?bmFa7FWl+k{Lb00>s}8W*2JIy7fMug7_dXyti_WhX;ZJ_u}Tu!UR+BxV-ko>U=ZKD9mqOgi^xwxERd;P>1T+pd%lDqxM;n3IQ`DZ>j0W zY6w9Qvg>d>GmCD!IO<@uq*}8-q1ddBmuKc+fd|83zgf8jRXW?Fa;bfM%ZHiijY7x9 ztIukc1rR)L#VjWbW>dVHx>b5sBRR!Ot(Re^dZnt5iBbtQZ?C5`3tr5Om-_qk14lF0 zOr`xTrUHCVV~{1*>bTJ9_*G7S$PGng5vfKmS7ux&gb%SAzFT3?fg*W`XN6bk8oM^X zfU8s0k6;6fKN8|U+Qy^6bovY)Dt*NAaRd=vvNrn zPs3OwzEKZ*Vpn*qHKGu5(1n@3&_9%N$6s&v>bxFqqOt4Jyw=-D;k^Rg5w8n9&S!4v zr*+OCGMJ)Q0B51hAkZB@ zsYR!Hs*ZM#IjDV7!P#LM{m@oW^AzNcK*dBJ+!rH5H%HTQ}n*gGZj@^ z7i|9|00o8{SxSQ>$#ke)GFz+GWLyk~kmbt;g8>anTt6N5Ff@mp%hs5$wgwYAVHQe3 z2Y4+cPVi=quxyHP-KdUFC8_xW#Kr>g9b)`qR9-kD=8I8%LyRhP4KA7pC#XBSzVhDv z=D-&qEdyM*c|k@ZcoAJk45Vd}s})F%ia*CB|6}cseLzS3HrA2R?xTkFvu3IfWT{$#NkrHEudu0v6dgG3m$-^J-mVoZKDy$tkCd#m_+&|y zUMpnQE2SdjV0^EGaCvFe)0togJM%`bSx&S{#tX6K-j5@(nGmwdv&YE@Ljm<8BRM_8 z)FVR%X`k>BJ;^SfcWWoZnX<1KE{h0qce)4K>l#s3Iq#f|?yzsF<_V7sk`91!X-tib z$QtF30mWxx7Gl|H?0^H5tv}qLx4P?JhC>MJ#t^d2h&DiW8bLNdfWm=**cIg zhWq;N-3r$Qpfbqmi@-N-VgT_QxA4{kzjpMkh*Q8&#sG1fzXOQhXs7Ln|MkPIh{CK4 z5&zd68RLI#8(Z-MAq?@qaJ*q6-^cNPTY4*^DH}t?of>?nWLbeEKp-~Y6$c7Pg0BDl E13WxF&;S4c literal 0 HcmV?d00001 diff --git a/INTEGRATIONS_QUICK_REFERENCE.md b/INTEGRATIONS_QUICK_REFERENCE.md index cb5db75..a570448 100644 --- a/INTEGRATIONS_QUICK_REFERENCE.md +++ b/INTEGRATIONS_QUICK_REFERENCE.md @@ -2,6 +2,8 @@ **Date:** 2026-01-31 **Quick lookup for all recommended integrations** +**→ Full ecosystem summary for stakeholders:** [docs/GALATIC_SUMMARY.md](docs/GALATIC_SUMMARY.md) — Chain 138 build-out, DEX/aggregator routing, On-Ramp/Off-Ramp, Fireblocks, bridges, and integrations. + --- ## ✅ Active Integrations (Implemented) diff --git a/SAMAMA-20-20260224-TR1-500M-AUDIT.tar.gz b/SAMAMA-20-20260224-TR1-500M-AUDIT.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..8b3b482eb1a36a29e82ddcd974cf4a39f80d23bd GIT binary patch literal 1415 zcmV;21$g=&iwFP!000001MOMcZsRr(&9lFP(9;Hu9Fh`saghh#cI(1P3denEu?Q%N zik0YMNOF*Dut5Kz{lb1pNnL!29V^ytsKXh~Ax&qlpQ*9u`HW+zVu%fh zv92PdTN*mtdkKL;OhV)@G6`J%tz-`oq?;N-Na`V7Okod@7qMO=voxa#0DFFv1#F96 zUHku3==Sv=_1nGUelxqt{)G*>z=p0rxc-K2-dlen9`^uzvA5hJAAJ4C360oEZ zSbWrF9~h62N+3LL^k^nDWW5TpiuFb}jxru)X{(`vG@{dV5@*fJG>(?bA{-QOck?--e9JbMxehP;11sHLUCtM8FYTPNA z9||2BPL&o=784vJ)Y7e%ru_h63qs`pC{xO=c-He1sd+ewLw=Yq>ESeqFFDIn`EV1) zH-}aKd%Z z(>-oe#%)HS#W2-%opQ^;F4Syn%P|Xk16Pr_e{a0n`q#w&%HlrPMos)Y6iM9`$1G~5JfT^f2bPH184Z>-Q&Ii9C<1Voe~SiRc18zPF`^-t zeNT^1hTtboU2vNB1fP1H!P!3e`;R|CSMClp038}#DJwmDB3gxc?mlk_ev@&z{p2sC zphbgttH_Toj=R-_<0ZhUsw{qyFl2?B}*nmX=IY5*1&;bb20ps ziXA;0tolV!dGb{6C}3`smX(WO!~=d!qio#~FM@9D=A$DW!NqinMbXz5r8nc?a}tNE z^B9O+m=w+~k`v?pHFW~MzXV=#A(Gj*Je`bYkp!|+9$S|8-V=+67;QiTYYm<{o z>M>Hg{gd&iJyeH-c4sggj0gR*mz>H5pvXp`#&L;Ix(d-R^!Azf$Te-eVlMoMQj`Bz zSlDxI)bW48e%A6oGIsg@E#%4hKV^wOm3yfYhf$yw{!@_axf?apNuiwZX&9W|=OZ)Irbu@f(rlM&&=tg*Sk!Q-t1%+DwPj-J>V`J&+R0Bb1p!ILR-82ecWBXC+mu7}BD81D#T6C|g7=ncwy`i=R?KI@Rs?c3LoperGVQ zx(ZSkr6LXmFDRMk((bfDsbI2(?pU7fnVx4ttI|rUTZ5BX=i6CalICk8`RX2N ziye?_$Z_Bn9Jk!TZG!mcKJX->A-xj)HzQ}gdNjYj555g{jj!)I(LW%Mz5kP!xzDvx z$Nw?H>-?YW^8Z`NocbT#Tlz+|^yi)*@T1jR{xrYqKEm8IH0W^)Y0%-e<06C{Xc2;$ z;XzZkY!@P;LvAt0CWsNjkw=(ET#r-Tv>Mf}B#eK=;QJ3qP5f{E^X7>*YR~`hUi@Py zTxb{nZy_&m|6ln?C%@QDXW@D5-9IrFeJdyG+|`f9*~v~e%Rl&&p$-5j003akxugI9 literal 0 HcmV?d00001 diff --git a/SAMAMA-20-20260224-TR1-500M-AUDIT.zip b/SAMAMA-20-20260224-TR1-500M-AUDIT.zip new file mode 100644 index 0000000000000000000000000000000000000000..2c6046e974fa452ca85c882e0d9bd4d183929512 GIT binary patch literal 3078 zcma);c|4T+9>*U$S+bT~k?vS#Y(rVIWIZ|dt;p8In8q@L84zvuV-^LxL(-|y$USQs-f9s+hAYf(GLuZRC^ zqJS`f@OMMwWwGw=Xjh~nTvidTs0>$BJT0rBa9Z`0g1oH_8^GWlpNP!&DozgsJXd0laiVg@?BTSE_z97m>Nw^R8h*%Mfa3(g_!H zyQcoZkJPUA(k2>ict>%)L!Y*oR$4Qv;^dO%Yz;QjbRs2rQ!-q9| zN1IAt%&}0^DbWp8c7V3je2jUs2mX{TC4%h*xsn}WXYHFhk{2DIcGq2zJElkgGTnvt zj@!N&i5uwE$S6r={?x!zPc*{Y-c4BxF=e>keX^8lB6N%;OJDDA@fVFv55@7*ds>Dh z^5!g%YdyqmE^kw-xePWoFRXI@Hw-)?c8+X?+2e&^2#Od1K!$c0a2SLS?g|z!=Yhjw zzD9y4E*-tIz6*96lgtpN_I32W;(s3DD_VOlw6f}=t3~Tk z1bt(Sn&YQk+*< z#2k6e#$orv6PzUl)9Z%vFU-U@pQd!^tc)j~4Cc@J^ID3qq|W_g=-a-|aip@NM40#= z#VCS`K>zP=pJUDbfvOxG@q#R7(LH;%`S2k|wPHQX`AsHZe@mgRUWQ8SCUeyNlU#wlTb1okjbdb9~wbtghwIqiva5uhlMkp0dO99&YFI5^wF+k0uM4qjFoSk5S$9(O0J`u-V9@SJ z9Bo}_-fuA@!MP3A)}tGxxs#|526dTUPp;2%z&=`) zN}x;%a!E%tx#T)95s8zMLa>$c^+3-*$(^2`N4MltNjy_j1VQU!Pu;B)B9lA&`BWox zg)o1=Z|~ZBs2nd1dZt+2L>7lk;@g>%Uzt7#M z)ZXv2`{rDuvY@{>nE*hYb}soLU6B~PiwD-<4}0ndJDB#vfgjU*WFcrap3jVv`M zG=OnN_DMkbm25nU^km|D40%*v4ZB&2LAc(qsj;M`h^Lxjq07`6innyuwzV3PrftQnH#(5-|6f` zFa4{3w0R^^k@e_{a(P)>E8&EftwNpb!vuBjdYJpgqVI*5e`^Bht*fe6(uKLlp5tF zRK`SbkA>HIW}dv(vqGAx>b$v3Jw;WSj|rY+*dL&Oy|zg51w|bVt^E!V7_MJ%Hp4?lm0>10}bl zMUL|d++TbmAB7}L>Yf^Kb(TIy+yQqYcyUX!BjC+lBmS zu-S!xfdL4i_Ou~;#~j+Y|83xVapNGBhE3lTzT3`0;{R#odkx$n?r#lyiBxdZqe1+x zQ5=l8zp(Bl%7CSo2Jxq5_F(+|bz?8TjhQC@n~!&^$iayFQ+h9vz(SMwqXhpEnh7)l Q09e3R91LI!>(1Z50hPOAhX4Qo literal 0 HcmV?d00001 diff --git a/backups/npmplus/backup-20260222_030001.tar.gz b/backups/npmplus/backup-20260222_030001.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..ba362b2e387a8e2227da7c99fd41e90e62defef2 GIT binary patch literal 5142 zcmV+x6zS_9iwFP!000001MOXFkJ~o7p3nIe#PmZFpz@HSBzsf@*lwHM4bUb3!9UP+z{4*K5@DfvQ=C6c1$TZcm0Nk*hDuO2>pZ+tll#^2^M%Z9cGZQC9~ z3?W2U7hN9oim=~z*-zAWA^&rETp$-Yp6fxck1rs?(D5#S+v!s@9P_*gG5{{3q=?6Y zcCzzldW`D7|6Ll-rzGzN2kpK;qTkExxwf=bK-~Z>2@BaPvBcR8>Km77PzrF?UfBg0Bi(@~PISzF+jQ?qn zL=!>>{U3Rn?0OH``0pd<$@q6&*Np#z9RK$MfXgDHTwes!*`*IIpFrXAd)A_Y$uJBG zvTS2P+p_J?5c?4N$hP2s{-tW2%%-z=o)7P)QOKGjXk)y2>Nd@b^3=86L*Af=5dE`i zGMr~IJ9}Fcv)sSB;#+xrf3W#f<1{HqQslG;dmVa$K4&lramE}5Z|nQ_UC%T8e~6>a_t(9L^!wwj?@#pr^ZgHT{Ji+SfK4hONeeJZ z=SgTRfM;?vjDKEf*;xl@=l_AF{*R!U{||Afe1GC@PT{||CBe1B@| zbQc3?KmM_Y95en8aR|OYXV~uM1`>{cOJA7atKG>EgTc-C3$%gZs{;#|jTKqmtr$Lkq zlVDo9HNLDoC&9RgtRRkyEa-*SD9U?jws6Y)zUVtiv-=6H3C6ckax)}JFpA5QlOWEQXGd{5{>I!# zaT=9w9{ywy-USK0AoFBRq8s)eE9sIV;Jr=BO_V%PQO8k2HtxSVN3x8bNak_8>Ai~M z^nQ3xMmc>DQVi#_n=A;)lP6&gH+z`RXA4Pj@3)j;KE5SWvh>a^pL6}zTo?MzK@p`% zzIdSJO(>%bYde%@^7*JjM7}urV(}ImI2|bB)KSH$i+986?c?Y{1Esc$xL3|PZHhhQBTs@-8v>hx`Pzrq+9*v!lFtGPB@L8%umPk@U1$$ex0X!#Pkb1hhDkmg z-%`+#?GBJ?xK(|tX_`ebRJIPAS0KxZHDwCha@Q?`Yf#dci^X05Afq}??91$ zBgxn7Yw}%r-_^+>i!78U-*|2~n7}?6jqn6It}_Y84jH)4$P2;%;mIg~6IfmXeE9hE z`rQ3llP5PJ6c+KDS&)Qj7EFVL4$i;bu;2B@>9nRjd#G>ZQT>tDQi(~ClVqGd&Wd4h zlaU4vI2b?h=XNBBFTdB*!^Z8m_@O*oM-a9xAP8ik0UP${+D8K+K_JV%W-VR%M_=8_ z(mZGCRxc!z$f772$D|jf>Qfo&aw@})naWOSD!Ud=Ws3=_uR4|C{tgOP7|doGlbAc` z5T2fW67Z~}TJBOcbKK_HJ;0lX*Vzy;!eS!!sBXGeG?{$81VMZsJmx<<>Glt*@9^zE{rKzK4S% zXdmr;f>+T5FlQ=BLJ+1TPhJ*aVHtp^c+EP#r+D(g=i4X; z?AlRA@>Q221v&e%q(P%DW%>}uN)Gl)s zEvWt4$L?;_K8q|{huU4QODnu3l(y0}ayWZ?JB}w$q%Y)=wIth9S zd6?(wUPz~z=}~K@hjm1MxIo&;#ATYXr|A&HVt@BKbSrfTEB&rk z1f;m7zwiB#gFE-Nu|7^ibJhPof3epMYc$^{39TCiVgH9R-tP+@@kF|4gZ=!EZWn^D`Qi^k*e0o;ssYpO7A#yzU56`w;n#w!OR~ z-kPjtN5^V*Q61p+<`go?RYpBIZS}+?SDj;Wm1yBH?+uly77K4E@@;L^Vs=M*(-0gP{nwMC0q=u zOcvHG(^=ptsJE#DRQIqI4NYLv1U5}z^OOUd=Sc6ORr`F>iZphyT%fC;PP=CJ`ACP| z?QYrquv&;=cf;<6-3_~U><$r^1X}Ogw$oTLUk|3n6>>^2mB#WH&SmMs|0PVvwL+%G9cU$BIDR-=77NhGU#Ynri zTQ=zNLompB-Z|oR+1ua^Xq~@J`nGz zPh`956RfIoo+ww%0aG+P96BU+K{>TKsGdo0jR)F@Z!CQ3IPGhy)C1nwAIAPL_J^@Q zTG}7^(F_oAZN;?#q8K`$jdxLIwDJTxwm|T6*u=%y87HrSDeblneOGK|aJ9wsBhQ*O z#hS*YRweHGy_NQ+ZyA;2^i>X1z)BK25_=ch?&?j+Mn7~^eMFsAk+{R{D(b8G>yrrA z)7WgrW;-_mefBondD6Pl0v^PLf@HMrY8M|{(E5?f;@4IrJRqx^viOGIPmv zB|0sOue4am1nZ;Oy@ZNUjEF=ZRuEqw_gzgk(nN>5oqFE|lv9DQb!y-lbAIwTSkzAVp(% zI?rJ%A~QTset06WX1n&*i3@*ou^9cm!tU?ybsTkFMqo?@WfOrh{y7tYIqL|FQerLi zU3E&=UbfFD{gn3pKJZo!hTsjs8-h0k-}T<#iUcnIy0d-OjmBzL>2@J$Jz#OX3-Tlrt;n&d79|ngI*DOp2L2k zz6<%EivwRE7df8mL9b7LkNU{%UjW$Ui#8qeya+M?E~2D}$AWgU^JjW|F{AidAA<4E zO`ZE3|BlypovrcTcg*-d#PQ{6K+jRyyT;?P>YD@ZRELDfccqz?e2|z6y)L^Y(U_D9 zW*J0gw$AoG)Dms9q1T2AN|ichsBFB3Yrz444oeW_+#yR{t~Mg-h?b{u0$gt_cnkqP z*=t2fe4_nXgu)x}TgV87=ZZJ@vLUc--=-f!nvAvGvJ>H@A<1U}Rg78)uda_&c=azU z7M^(MF0ME59fhSc3*u}&9WgVl*6l}`SyCbOkH`9>+TrCRCm z;p5ZmbN6p5(EO%#x{dlH$rElWZ%r-Qg}YaknPC*|uB}w6crQF#x<4sWp5~0n5Z}~K zih9SwkfGjne55#8d7|BwmXyH?AF2znQ_2W~*-V`*p0rk{i2=W3q@jruqKRE7La54C z;VX{~7A($W*dMqlP^}=GMo9~Z*Y#0g2Kur#%h}+Ior;)2sKs)!a}?_E>`!*HXk+(P zCD}dc(?)i-nj$82!*jB8kEDk!<VukQ#WP2L$>tDu=+{Dc^6i9#Tge1`x*M^NUGjV zRFD>K@~6$!wHBM7xD3AkBKUUY#h9oidSq=d%fIC0_=u$VM4p5&+jQNvRj13 zNH{4S%WSDnzmiByA!kb_y@8VSkSkh%zv57}ieGyX-yP{qV}zhOkJfc*!=>$tEtb(5i5WT0rr(P3g5E; zv6cX_rU0ES7iohAE!HfU00*VZ^+;@c1OXzp?3^z^aaMb6%y1gIlEP2nL$ z`^^(==C`V_=^o7o)>xcVL4fk2o{clUjY`f^OT=+Sc{rR4L8Z*qzGTRj7g@8cMF_N^ zmsEb76Ja|qr(S;Y4JAwYN%n*|fc)ko9r7VBRoej1<{p+441;Q73y#9Q+Vw~rztpBZQd2iZAE#W ztn}Jm<#wO9pD?!iw4ysj*@>%4u4IRfEW5Uo#a5p-vU63xeeS^E=I7sjL29xq_;H(03tIlHL5yN+%>~0pc_W0k?J!e7(G4 z^(3x}I4{@qjnd*Oj_$}+GMicmyH}HW9Mi{%lHQC=ztSuJ{oRLQLhgr?C?>C7(?_5` zL-6X;r(b+P@117;pjx|U`}t#DkSU0xQ5Iy6zW+W2`Fwl}SXYo{AfzH37b!h8rtcdi zH(-*^Nb;)9BYh9D*Ngk2^0ou$(?$Y zgO(XQlHTe(Iq;#PVuQsg)NFwYC6a4C%6w>^Y^O}OOq*sC0WJ$kozdEg)2lfw7_mw@ z`ut`QhaIu4@(pzJ3O%wC!5aU{3Y z)(*{TGSkTh8c-%vl9@2f&&doO$raVKWvN7TN;{oOB6T4Yd1ISP9x0K1Ya1se z`DrO|xJKhO3S1|t16aEE5JQ>mqa)P{+1`&x31)hR0s?84&?XSpxfEMVPhVsUicXR7g18gfuNo2 z{FxrZ>hFJ-#?vv$+rdGz?~myBw;jiP|AQQo??3xFh@-sd77vBqJ=h0!ZM**aBX?u` z_gvSy09L!NT75k6@Bib+cfY><2Nd@b^3*lzLbu}^f~>ZpOfWp=BpQ&1Nt$tY0_V?3aIF+ z8~8y$^1Pg5*BY$doV!Z-l=;SE{`u@rE!M6X{|f=Oq5wA1{}3Dhwu>#J{~h9xegDN@ zy0a0Ybq}fjxApyduH_j1Kg7}G`|I9A`u*|N_lK5izW*VPALri}ut^0ZX#qy*GzpCb z@I;Q9@y{zQJL>?={6AKy|0CDT|A#nKzCZiNE-s)(^FRCk^l5A}{~zS2`To?_X)gxQ zeEego2bl4Hh(qxGIm320H;{1rL))R?*!ccEXd^TJ4{>~X1{O|}(pQ6f3x`8SDEWtj zG~pdSRu5Q~XCn{cxdY>JoQ8C!sB7tZ*jltq?-P;@raApzc`rEseVC5@C>bRFxO8iL zS$apUU%iK(7}N_Uj^>l0_FkxQ&vV0ZIH}T%H{HalSY^jMLy7b05WNRJwWi zlYV&TC-j2MlQoKN*n2FcOA4R&HYGPv@<2r$M+sTG|MDEkGI}DJ#__uMDvs0p!95w~ z^g&25m`-joKO`GZ!W?dBkWVLbNpbJDkYOI&k}+9$=N8YodTXu=eP_Rj(j=ch(BdYP zQ3jPA$}{p*pcGjEQ7~V7*0nZD(~#s7pF&9krLI*2QcS1t<}h_C$&~-Zhrwx>$esSb1(g@j@CGKkY@IEwv@TvoOj(2pFFq=@LVu=dZv56d3l`(NIHBK<~^ui4k+ zd3oRE$pMQjlqcV~PS_t=Ju)2Pk!3sfC=6`UckH3-hd#ukp>K_>@)F>~$Ia_=_h(Hu zZbB$5;x`jN3De9U`w1PKf4gD7>jvq#qCI=4Z{$(^kycWPNs*Hz$Q~!fz`w~z4F?>I zANX@S62zC^s_9|v_FMc=o~Cd;D)pb{n`l?YQ;6~^YVYR&6tFdUw@Z$`1|q-NlKsbHDD3U z4wcnXC={#Xjz9Z&YZsxXN;EL+6l` z`zQ2c{rKUB&;R}9EqED?0CT32Bm`kf^5jJU=9U47idU@Tdx|Fye7=oxz^)x-BwuzZ zQjoKs>sS2_yk{H?0-s&3WE?s+KL7j^7^dMPAbuXjk4AG5Yc9}Hq;{FBXin`^A&0wB z`y}ch9cp*nHm&fseMN@c4Y?a~H{^a;a<>)9T^6relKV=-*Clr?YIjjC-_nuaO~}JESNB5N z^-K>NGrd(s^oI+iolIP&9($S&K`i!nuR^y{hu|V~>-4nIM?rV|m~ExGXkxZ!8?!a> z+UBev$~szF8OoIfZxTU}E z{+@$7=asQVj4g6PwuqV5p6s;No~2bctLdfETEa;ULzW;5F_(H+mr6^gKbE2B+1hs2 zYEsinL27wsJB<{i6U^~ALzvqlnDYjmGz>UPV6r@{or`-D6+~xAL)#`@rJLB8bY|{* zLMGiZ$4Ta9bd=qUjxH}mK@c3k&4?OPg>f_P$;}8w>+SgXr3`(`_@%9#oHCBa_O#J_ zgj-x;=Tu_sfHBKV*Hf_BQOQ@Z*-6=3khSJ7$c)F}96Sc>JI!_HPMbirQ;+%fNFvp&l^TH*^_Fbls0R5j#x99wd{Eo^lWW=c}Kj}SKwbngcM-R?2;k8LBQOhgxPN$lY0I4Ty{bH$#I|r)F`eiNq9&~nyx^h6p zT0pJyrt1NP|qF7Lc3+RhAyG1gd^nq7_iJU|Oqg>B01{UU&mjAxs@{ZY6>& z0)$nH!!4?3VQrTIgXt*BNco9%YMmn7E>vA?pn5t`g(61f6Rs>ZsPX|&9jG!{bS9b3 z0#8A`O&y>*hplL60-GkVX#$(49N0WZdKazQ=aW{Xv5VybUG1cm6}wM|I_!?xW%t8s zA%@)zyBl^l?B23FL|hVRwd;#ad7ryOT+ecMqW8z)gO+<4*|jSt^xPq*QH|WdbOuxL zlCl*{WwnErFonBmAq=KE&ShlRmdw|Ksd0sz5=^DB{JC>ky6}GiQ>95-ZN%3WKDF)UHC3tsZ|o0ae;E72*dGn;kNju`h`6@m z$^cOe9Y8K%t3mTxc>*n4AowY4;$rNKlh?qMc3Y=vmDtSSYK!Sdo;7QV)s0K7O5D|Z zEA36+GAhUEs~o0)l_Yc|_AYAd>W#E*xYq3^M&-0iBu*KKe~nci;9^hb7_?uNV;9f9@GQ*;GB`|a6< zInMoHtUR4`*ub|CLIdc+K60=8Np!`Hsl5Apo+i5YpbDAg+BW+Mdyd8boFDiCI?#4| z(8ZYk9`@+@3t+YRqIJhKFZ>LEizq4LK+sNh{!EWAW)wf^LooiisdJy>pALJ+-W>l3 zA~XIEaeUbf=-Enp*SH>%7EOXohqR#QNb~RcATbwuU35#LfRqYm8AN8b&h|dk5^c1m z*P04Sl{#jqti6WQvHHNWJ-f%dLl(MRWkl2#El=YFXyaoFaAU6(CGm;&XAugo&u<|k z6rLmA;0sv*ArH}yAx*~GZrO_P(vaj6pDIQTgjdx^D!l5K6$?*1bm!OWd$x4x%o2I< zJcZ}5bRUbFuNJqF_%2?9<%uJePJUjI*;1Z-qmSGgZ`wG3%xBvS`?MGpm(TRniV#};k4btso+-wP3~Jx0thP#gv#luNc0E>Uhd z9CnX|@hjT|gvfet* zGZ$Nwvzj4&yOTQBG0%zy>wg)nOX_pYu#R}6=tx*^;6JYJq>go)Pnt1U|EpkKl6AjK z_>nA_-5b_fak^RNQ7At^r0rnI&3g5c`v6cX_rU30N7io^dbLC)Tu1gIlEP2oXB`^^aXWy+pO@wDFrXV_!kl{jjNSgA!U*Ro-gBUi~}+=1A+8cpMvK2DT$CuIDUUit6uJ`56aKNv+ZdHISy0{t0+m!CfUmvDD|^);CbX0{4{nw4wbXHRrB&9f`E3_iXp8(pzB zv%hxPUqM0gV*bL_ZnAb=X$LQHT0U+yCn{x2ySzquXin@>a*LyYJ`V0T%;1sqR_DpS zXDKQ+Se!!57N}4nx#pwHhvvy<%5=lDX*LnyvXImnt*tn{n!|z-tCXYfdiIe5ijDFO zbn^`QTzN^c&Zm@>PyZar$G5eKyi8!iP3I*tLyCH`d^cvdO!YXDTWV{EW;L1VWCQgn zlPSqe80P0>29M;5s@t+uB08m=P9+j_)YgFrgU6f%@sW6~Vp~9&@FW`v3gvdK9L8|P zu9Uea{&=nw(N0+s2`X>0CG^MlDZbC|;%8^`|vbtRH?06+l%e55ac literal 0 HcmV?d00001 diff --git a/backups/npmplus/backup-20260222_161826/api/access_lists.json b/backups/npmplus/backup-20260222_161826/api/access_lists.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/backups/npmplus/backup-20260222_161826/api/access_lists.json @@ -0,0 +1 @@ +[] diff --git a/backups/npmplus/backup-20260222_161826/api/certificates.json b/backups/npmplus/backup-20260222_161826/api/certificates.json new file mode 100644 index 0000000..b1a17ad --- /dev/null +++ b/backups/npmplus/backup-20260222_161826/api/certificates.json @@ -0,0 +1,685 @@ +[ + { + "id": 146, + "created_on": "2026-02-07 00:46:21", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cacti-alltra.d-bis.org", + "domain_names": [ + "cacti-alltra.d-bis.org" + ], + "expires_on": "2026-05-08 04:47:55", + "meta": {} + }, + { + "id": 147, + "created_on": "2026-02-07 00:46:43", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cacti-hybx.d-bis.org", + "domain_names": [ + "cacti-hybx.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:19", + "meta": {} + }, + { + "id": 155, + "created_on": "2026-02-20 22:27:52", + "modified_on": "2026-02-20 22:27:52", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "codespaces.d-bis.org", + "domain_names": [ + "codespaces.d-bis.org" + ], + "expires_on": "2026-02-20 22:27:52", + "meta": {} + }, + { + "id": 156, + "created_on": "2026-02-20 22:28:48", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "codespaces.d-bis.org", + "domain_names": [ + "codespaces.d-bis.org" + ], + "expires_on": "2026-05-22 02:30:34", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n", + "letsencrypt_agree": true + } + }, + { + "id": 134, + "created_on": "2026-01-29 22:52:44", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cross-all.defi-oracle.io", + "domain_names": [ + "cross-all.defi-oracle.io" + ], + "expires_on": "2026-04-30 02:54:15", + "meta": {} + }, + { + "id": 162, + "created_on": "2026-02-20 22:36:34", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dapp.d-bis.org", + "domain_names": [ + "dapp.d-bis.org" + ], + "expires_on": "2026-05-22 02:38:20", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 46, + "created_on": "2026-01-16 16:54:36", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-admin.d-bis.org", + "domain_names": [ + "dbis-admin.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:11", + "meta": {} + }, + { + "id": 47, + "created_on": "2026-01-16 16:54:47", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-api-2.d-bis.org", + "domain_names": [ + "dbis-api-2.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:22", + "meta": {} + }, + { + "id": 48, + "created_on": "2026-01-16 16:54:58", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-api.d-bis.org", + "domain_names": [ + "dbis-api.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:33", + "meta": {} + }, + { + "id": 157, + "created_on": "2026-02-20 22:29:37", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dev.d-bis.org", + "domain_names": [ + "dev.d-bis.org" + ], + "expires_on": "2026-05-22 02:31:22", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 145, + "created_on": "2026-02-06 19:14:04", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "explorer.d-bis.org", + "domain_names": [ + "explorer.d-bis.org" + ], + "expires_on": "2026-05-07 23:15:36", + "meta": { + "letsencrypt_agree": true, + "dns_challenge": true, + "nginx_online": true, + "nginx_err": null, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0" + } + }, + { + "id": 144, + "created_on": "2026-02-06 19:05:50", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "explorer.defi-oracle.io", + "domain_names": [ + "explorer.defi-oracle.io" + ], + "expires_on": "2026-05-07 23:07:35", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 158, + "created_on": "2026-02-20 22:30:18", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "gitea.d-bis.org", + "domain_names": [ + "gitea.d-bis.org" + ], + "expires_on": "2026-05-22 02:32:04", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 50, + "created_on": "2026-01-16 16:55:25", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "mim4u.org", + "domain_names": [ + "mim4u.org" + ], + "expires_on": "2026-04-16 20:57:01", + "meta": {} + }, + { + "id": 51, + "created_on": "2026-01-16 16:55:37", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "phoenix.sankofa.nexus", + "domain_names": [ + "phoenix.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:57:08", + "meta": {} + }, + { + "id": 159, + "created_on": "2026-02-20 22:31:08", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.ml110.d-bis.org", + "domain_names": [ + "pve.ml110.d-bis.org" + ], + "expires_on": "2026-05-22 02:32:54", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 160, + "created_on": "2026-02-20 22:31:51", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.r630-01.d-bis.org", + "domain_names": [ + "pve.r630-01.d-bis.org" + ], + "expires_on": "2026-05-22 02:33:37", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 161, + "created_on": "2026-02-20 22:32:35", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.r630-02.d-bis.org", + "domain_names": [ + "pve.r630-02.d-bis.org" + ], + "expires_on": "2026-05-22 02:34:21", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 148, + "created_on": "2026-02-07 00:46:56", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-2.d-bis.org", + "domain_names": [ + "rpc-alltra-2.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:31", + "meta": {} + }, + { + "id": 149, + "created_on": "2026-02-07 00:47:10", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-3.d-bis.org", + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:46", + "meta": {} + }, + { + "id": 150, + "created_on": "2026-02-07 08:15:35", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-3.d-bis.org", + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:06", + "meta": {} + }, + { + "id": 151, + "created_on": "2026-02-07 08:15:43", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra.d-bis.org", + "domain_names": [ + "rpc-alltra.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:18", + "meta": {} + }, + { + "id": 163, + "created_on": "2026-02-21 17:45:18", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-fireblocks.d-bis.org", + "domain_names": [ + "rpc-fireblocks.d-bis.org" + ], + "expires_on": "2026-05-22 21:47:15", + "meta": {} + }, + { + "id": 52, + "created_on": "2026-01-16 16:55:45", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-http-prv.d-bis.org", + "domain_names": [ + "rpc-http-prv.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:20", + "meta": {} + }, + { + "id": 53, + "created_on": "2026-01-16 16:55:57", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-http-pub.d-bis.org", + "domain_names": [ + "rpc-http-pub.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:30", + "meta": {} + }, + { + "id": 152, + "created_on": "2026-02-07 08:15:56", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx-2.d-bis.org", + "domain_names": [ + "rpc-hybx-2.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:31", + "meta": {} + }, + { + "id": 153, + "created_on": "2026-02-07 08:16:09", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx-3.d-bis.org", + "domain_names": [ + "rpc-hybx-3.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:45", + "meta": {} + }, + { + "id": 154, + "created_on": "2026-02-07 08:16:22", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx.d-bis.org", + "domain_names": [ + "rpc-hybx.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:58", + "meta": {} + }, + { + "id": 54, + "created_on": "2026-01-16 16:56:06", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-ws-prv.d-bis.org", + "domain_names": [ + "rpc-ws-prv.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:38", + "meta": {} + }, + { + "id": 55, + "created_on": "2026-01-16 16:56:16", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-ws-pub.d-bis.org", + "domain_names": [ + "rpc-ws-pub.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:51", + "meta": {} + }, + { + "id": 141, + "created_on": "2026-01-30 09:33:59", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc.d-bis.org", + "domain_names": [ + "rpc.d-bis.org" + ], + "expires_on": "2026-04-30 13:35:45", + "meta": { + "letsencrypt_agree": true, + "dns_challenge": true, + "nginx_online": false, + "nginx_err": "nginx: [emerg] cannot load certificate \"/data/tls/certbot/live/npm-135/fullchain.pem\": BIO_new_file() failed (SSL: error:80000002:system library::No such file or directory:calling fopen(/data/tls/certbot/live/npm-135/fullchain.pem, r) error:10000080:BIO routines::no such file)\nnginx: configuration file /usr/local/nginx/conf/nginx.conf test failed", + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\ndns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0" + } + }, + { + "id": 56, + "created_on": "2026-01-16 16:56:30", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc.public-0138.defi-oracle.io", + "domain_names": [ + "rpc.public-0138.defi-oracle.io" + ], + "expires_on": "2026-04-16 20:58:05", + "meta": {} + }, + { + "id": 137, + "created_on": "2026-01-29 23:39:01", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc2.d-bis.org", + "domain_names": [ + "rpc2.d-bis.org" + ], + "expires_on": "2026-04-30 03:40:50", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 57, + "created_on": "2026-01-16 16:56:41", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "sankofa.nexus", + "domain_names": [ + "sankofa.nexus" + ], + "expires_on": "2026-04-16 20:58:17", + "meta": {} + }, + { + "id": 58, + "created_on": "2026-01-16 16:56:53", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "secure.d-bis.org", + "domain_names": [ + "secure.d-bis.org" + ], + "expires_on": "2026-04-16 20:58:28", + "meta": {} + }, + { + "id": 59, + "created_on": "2026-01-16 16:57:05", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "secure.mim4u.org", + "domain_names": [ + "secure.mim4u.org" + ], + "expires_on": "2026-04-16 20:58:40", + "meta": {} + }, + { + "id": 60, + "created_on": "2026-01-16 16:57:17", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "the-order.sankofa.nexus", + "domain_names": [ + "the-order.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:58:53", + "meta": {} + }, + { + "id": 61, + "created_on": "2026-01-16 16:57:31", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "training.mim4u.org", + "domain_names": [ + "training.mim4u.org" + ], + "expires_on": "2026-04-16 20:59:06", + "meta": {} + }, + { + "id": 164, + "created_on": "2026-02-21 17:46:22", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc-fireblocks.d-bis.org", + "domain_names": [ + "ws.rpc-fireblocks.d-bis.org" + ], + "expires_on": "2026-05-22 21:48:21", + "meta": {} + }, + { + "id": 138, + "created_on": "2026-01-29 23:41:20", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc.d-bis.org", + "domain_names": [ + "ws.rpc.d-bis.org" + ], + "expires_on": "2026-04-30 03:43:05", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 139, + "created_on": "2026-01-29 23:42:13", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc2.d-bis.org", + "domain_names": [ + "ws.rpc2.d-bis.org" + ], + "expires_on": "2026-04-30 03:43:58", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 140, + "created_on": "2026-01-29 23:43:09", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "wss.defi-oracle.io", + "domain_names": [ + "wss.defi-oracle.io" + ], + "expires_on": "2026-04-30 03:44:57", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 62, + "created_on": "2026-01-16 16:57:41", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.mim4u.org", + "domain_names": [ + "www.mim4u.org" + ], + "expires_on": "2026-04-16 20:59:17", + "meta": {} + }, + { + "id": 63, + "created_on": "2026-01-16 16:57:52", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.phoenix.sankofa.nexus", + "domain_names": [ + "www.phoenix.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:59:28", + "meta": {} + }, + { + "id": 64, + "created_on": "2026-01-16 16:58:06", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.sankofa.nexus", + "domain_names": [ + "www.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:59:41", + "meta": {} + } +] diff --git a/backups/npmplus/backup-20260222_161826/api/proxy_hosts.json b/backups/npmplus/backup-20260222_161826/api/proxy_hosts.json new file mode 100644 index 0000000..aaefd8a --- /dev/null +++ b/backups/npmplus/backup-20260222_161826/api/proxy_hosts.json @@ -0,0 +1,1394 @@ +[ + { + "id": 37, + "created_on": "2026-02-07 00:42:23", + "modified_on": "2026-02-07 00:46:30", + "owner_user_id": 1, + "domain_names": [ + "cacti-alltra.d-bis.org" + ], + "forward_host": "192.168.11.177", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 146, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 38, + "created_on": "2026-02-07 00:42:24", + "modified_on": "2026-02-07 00:46:53", + "owner_user_id": 1, + "domain_names": [ + "cacti-hybx.d-bis.org" + ], + "forward_host": "192.168.11.251", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 147, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 41, + "created_on": "2026-02-07 20:41:16", + "modified_on": "2026-02-20 22:29:09", + "owner_user_id": 1, + "domain_names": [ + "codespaces.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 156, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 22, + "created_on": "2026-01-18 22:19:18", + "modified_on": "2026-01-29 22:52:50", + "owner_user_id": 1, + "domain_names": [ + "cross-all.defi-oracle.io" + ], + "forward_host": "192.168.11.211", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 134, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 49, + "created_on": "2026-02-20 22:27:16", + "modified_on": "2026-02-20 22:37:53", + "owner_user_id": 1, + "domain_names": [ + "dapp.d-bis.org" + ], + "forward_host": "192.168.11.58", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 162, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 13, + "created_on": "2026-01-16 14:41:02", + "modified_on": "2026-02-22 16:11:53", + "owner_user_id": 1, + "domain_names": [ + "dbis-admin.d-bis.org" + ], + "forward_host": "192.168.11.130", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 46, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 15, + "created_on": "2026-01-16 14:41:04", + "modified_on": "2026-02-22 16:12:11", + "owner_user_id": 1, + "domain_names": [ + "dbis-api-2.d-bis.org" + ], + "forward_host": "192.168.11.156", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 47, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 14, + "created_on": "2026-01-16 14:41:03", + "modified_on": "2026-02-22 16:12:02", + "owner_user_id": 1, + "domain_names": [ + "dbis-api.d-bis.org" + ], + "forward_host": "192.168.11.155", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 48, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 45, + "created_on": "2026-02-13 20:32:33", + "modified_on": "2026-02-13 20:32:33", + "owner_user_id": 1, + "domain_names": [ + "dbis.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3001, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 39, + "created_on": "2026-02-07 20:41:12", + "modified_on": "2026-02-20 22:29:57", + "owner_user_id": 1, + "domain_names": [ + "dev.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 157, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 8, + "created_on": "2026-01-16 14:40:58", + "modified_on": "2026-02-22 16:10:44", + "owner_user_id": 1, + "domain_names": [ + "explorer.d-bis.org" + ], + "forward_host": "192.168.11.140", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 145, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers (unsafe-eval for ethers.js v5)\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 30, + "created_on": "2026-01-31 00:13:09", + "modified_on": "2026-02-06 19:09:43", + "owner_user_id": 1, + "domain_names": [ + "explorer.defi-oracle.io" + ], + "forward_host": "192.168.11.140", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 144, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 40, + "created_on": "2026-02-07 20:41:14", + "modified_on": "2026-02-20 22:30:39", + "owner_user_id": 1, + "domain_names": [ + "gitea.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 158, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 46, + "created_on": "2026-02-13 20:32:35", + "modified_on": "2026-02-13 20:32:35", + "owner_user_id": 1, + "domain_names": [ + "iccc.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3002, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 17, + "created_on": "2026-01-16 14:41:05", + "modified_on": "2026-02-22 16:12:41", + "owner_user_id": 1, + "domain_names": [ + "mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 50, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 47, + "created_on": "2026-02-13 20:32:37", + "modified_on": "2026-02-13 20:32:37", + "owner_user_id": 1, + "domain_names": [ + "omnl.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3003, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 5, + "created_on": "2026-01-16 14:40:55", + "modified_on": "2026-01-16 17:01:49", + "owner_user_id": 1, + "domain_names": [ + "phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.50", + "forward_port": 4000, + "access_list_id": 0, + "certificate_id": 51, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 42, + "created_on": "2026-02-07 20:41:17", + "modified_on": "2026-02-20 22:31:27", + "owner_user_id": 1, + "domain_names": [ + "pve.ml110.d-bis.org" + ], + "forward_host": "192.168.11.10", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 159, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 43, + "created_on": "2026-02-07 20:41:19", + "modified_on": "2026-02-20 22:32:14", + "owner_user_id": 1, + "domain_names": [ + "pve.r630-01.d-bis.org" + ], + "forward_host": "192.168.11.11", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 160, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 44, + "created_on": "2026-02-07 20:41:21", + "modified_on": "2026-02-20 22:32:57", + "owner_user_id": 1, + "domain_names": [ + "pve.r630-02.d-bis.org" + ], + "forward_host": "192.168.11.12", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 161, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 32, + "created_on": "2026-02-07 00:42:16", + "modified_on": "2026-02-07 00:47:07", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra-2.d-bis.org" + ], + "forward_host": "192.168.11.173", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 148, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 33, + "created_on": "2026-02-07 00:42:17", + "modified_on": "2026-02-07 08:15:41", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "forward_host": "192.168.11.174", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 150, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 31, + "created_on": "2026-02-07 00:42:15", + "modified_on": "2026-02-07 08:15:53", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra.d-bis.org" + ], + "forward_host": "192.168.11.172", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 151, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 50, + "created_on": "2026-02-21 17:37:16", + "modified_on": "2026-02-22 16:11:34", + "owner_user_id": 1, + "domain_names": [ + "rpc-fireblocks.d-bis.org" + ], + "forward_host": "192.168.11.232", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 163, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 11, + "created_on": "2026-01-16 14:41:00", + "modified_on": "2026-02-22 16:10:55", + "owner_user_id": 1, + "domain_names": [ + "rpc-http-prv.d-bis.org" + ], + "forward_host": "192.168.11.211", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 52, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 9, + "created_on": "2026-01-16 14:40:59", + "modified_on": "2026-02-22 16:10:49", + "owner_user_id": 1, + "domain_names": [ + "rpc-http-pub.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 53, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 35, + "created_on": "2026-02-07 00:42:20", + "modified_on": "2026-02-07 08:16:06", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx-2.d-bis.org" + ], + "forward_host": "192.168.11.247", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 152, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 36, + "created_on": "2026-02-07 00:42:22", + "modified_on": "2026-02-07 08:16:19", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx-3.d-bis.org" + ], + "forward_host": "192.168.11.248", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 153, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 34, + "created_on": "2026-02-07 00:42:19", + "modified_on": "2026-02-07 08:16:32", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx.d-bis.org" + ], + "forward_host": "192.168.11.246", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 154, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 12, + "created_on": "2026-01-16 14:41:01", + "modified_on": "2026-02-22 16:10:57", + "owner_user_id": 1, + "domain_names": [ + "rpc-ws-prv.d-bis.org" + ], + "forward_host": "192.168.11.211", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 54, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 10, + "created_on": "2026-01-16 14:40:59", + "modified_on": "2026-02-22 16:10:53", + "owner_user_id": 1, + "domain_names": [ + "rpc-ws-pub.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 55, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 26, + "created_on": "2026-01-29 16:35:10", + "modified_on": "2026-02-22 16:11:18", + "owner_user_id": 1, + "domain_names": [ + "rpc.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 141, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\ndns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 24, + "created_on": "2026-01-29 15:38:44", + "modified_on": "2026-02-22 16:11:03", + "owner_user_id": 1, + "domain_names": [ + "rpc.defi-oracle.io" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 56, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 21, + "created_on": "2026-01-16 14:41:09", + "modified_on": "2026-02-22 16:10:58", + "owner_user_id": 1, + "domain_names": [ + "rpc.public-0138.defi-oracle.io" + ], + "forward_host": "192.168.11.240", + "forward_port": 443, + "access_list_id": 0, + "certificate_id": 56, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "https", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 27, + "created_on": "2026-01-29 16:35:11", + "modified_on": "2026-02-22 16:11:22", + "owner_user_id": 1, + "domain_names": [ + "rpc2.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 137, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 3, + "created_on": "2026-01-16 14:40:54", + "modified_on": "2026-01-16 17:01:32", + "owner_user_id": 1, + "domain_names": [ + "sankofa.nexus" + ], + "forward_host": "192.168.11.51", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 57, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "add_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 16, + "created_on": "2026-01-16 14:41:04", + "modified_on": "2026-02-22 16:12:28", + "owner_user_id": 1, + "domain_names": [ + "secure.d-bis.org" + ], + "forward_host": "192.168.11.130", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 58, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 19, + "created_on": "2026-01-16 14:41:07", + "modified_on": "2026-02-22 16:12:56", + "owner_user_id": 1, + "domain_names": [ + "secure.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 59, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 7, + "created_on": "2026-01-16 14:40:57", + "modified_on": "2026-01-16 17:02:09", + "owner_user_id": 1, + "domain_names": [ + "the-order.sankofa.nexus" + ], + "forward_host": "192.168.11.36", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 60, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 20, + "created_on": "2026-01-16 14:41:08", + "modified_on": "2026-02-22 16:13:20", + "owner_user_id": 1, + "domain_names": [ + "training.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 61, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 51, + "created_on": "2026-02-21 17:37:45", + "modified_on": "2026-02-22 16:11:37", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc-fireblocks.d-bis.org" + ], + "forward_host": "192.168.11.232", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 164, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 28, + "created_on": "2026-01-29 16:35:12", + "modified_on": "2026-02-22 16:11:26", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 138, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 29, + "created_on": "2026-01-29 16:35:12", + "modified_on": "2026-02-22 16:11:29", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc2.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 139, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 25, + "created_on": "2026-01-29 15:38:45", + "modified_on": "2026-02-22 16:11:15", + "owner_user_id": 1, + "domain_names": [ + "wss.defi-oracle.io" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 140, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 18, + "created_on": "2026-01-16 14:41:06", + "modified_on": "2026-01-16 17:02:14", + "owner_user_id": 1, + "domain_names": [ + "www.mim4u.org" + ], + "forward_host": "192.168.11.36", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 62, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 6, + "created_on": "2026-01-16 14:40:56", + "modified_on": "2026-01-16 17:02:17", + "owner_user_id": 1, + "domain_names": [ + "www.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.50", + "forward_port": 4000, + "access_list_id": 0, + "certificate_id": 63, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 4, + "created_on": "2026-01-16 14:40:55", + "modified_on": "2026-01-16 17:02:19", + "owner_user_id": 1, + "domain_names": [ + "www.sankofa.nexus" + ], + "forward_host": "192.168.11.51", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 64, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 48, + "created_on": "2026-02-13 20:32:39", + "modified_on": "2026-02-13 20:32:39", + "owner_user_id": 1, + "domain_names": [ + "xom.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3004, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + } +] diff --git a/backups/npmplus/backup-20260222_161826/certificates/cert_list.txt b/backups/npmplus/backup-20260222_161826/certificates/cert_list.txt new file mode 100644 index 0000000..e69de29 diff --git a/backups/npmplus/backup-20260222_161826/database/database.sql b/backups/npmplus/backup-20260222_161826/database/database.sql new file mode 100644 index 0000000..77149a3 --- /dev/null +++ b/backups/npmplus/backup-20260222_161826/database/database.sql @@ -0,0 +1 @@ +Database file not found diff --git a/backups/npmplus/backup-20260222_161826/database/database.sqlite b/backups/npmplus/backup-20260222_161826/database/database.sqlite new file mode 100644 index 0000000..e69de29 diff --git a/backups/npmplus/backup-20260222_161826/manifest.json b/backups/npmplus/backup-20260222_161826/manifest.json new file mode 100644 index 0000000..5caf010 --- /dev/null +++ b/backups/npmplus/backup-20260222_161826/manifest.json @@ -0,0 +1,19 @@ +{ + "timestamp": "20260222_161826", + "backup_date": "2026-02-22T16:18:36-08:00", + "npmplus_vmid": "10233", + "npmplus_host": "192.168.11.11", + "npm_url": "https://192.168.11.167:81", + "backup_contents": { + "database": { + "sql_dump": "present", + "sqlite_file": "missing" + }, + "api_exports": { + "proxy_hosts": "present", + "certificates": "present", + "access_lists": "present" + }, + "certificate_files": "missing" + } +} diff --git a/backups/npmplus/backup-20260222_161826/volumes/volume_list.txt b/backups/npmplus/backup-20260222_161826/volumes/volume_list.txt new file mode 100644 index 0000000..4545150 --- /dev/null +++ b/backups/npmplus/backup-20260222_161826/volumes/volume_list.txt @@ -0,0 +1 @@ +DRIVER VOLUME NAME diff --git a/backups/npmplus/backup-20260222_162326.tar.gz b/backups/npmplus/backup-20260222_162326.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..6a4fd5d3ad8ad42a1af7b1403d2da33688833bbd GIT binary patch literal 5130 zcmV+l6!q&LiwFP!000001MOXFkK4AI&gc9JV)`KoP41HKB7DqEc)Mt2VVfM)u*UAX0!-%0A9ptk&Gnm zROc`B7*>D(`z)DF2yF)kjlRF*v+wVE?6m#rJUfBtij#I)!ZkA>Mi_y_h~xBmMh ze{1~rcyr*i`>NH)GyncSe|rDVcb@<|{`v8j|M~SD`0(Se?_QqzsqAsAqh|b1!ZaQe zHt7GLS-S5%RO7z~-L3KOd7d5rM>+oQB>-1N%(%V?C)29{Tx~(&>U-W|4wFF?7G&9` z
gU!Wf#9ANg(e&9Is*6DOIO=fg(KZzsW96AW&%~N+7Ey`0js0;mm7ee-D)nqWs z6MputD5f;Hz7|{gy`T>_o@$h(1xX9adhpj_C)jg_!;q5IZ`kkXzmq{Uo4?~UCzSOl zud+ND7i2Jwlk)v0F{N>OdsUwPYu@TAoW=w4IL&h5PJmx4dweS2hgM#CMDijY$0H`X z>IUIxL?|ui*o_7oHy5r_J|*3H%)eg#WyIPw<9{i@RusTy`X3+vuFojJ>VHQ#RNsI3 zm+pLo7~Mmu|LuJLp4Wqx|BrDr`TnN&P=0^B^ZlJ3vfuw0$IpxJ3;3i0(yRdEY?emW z0(d4z&G;9Umc4a=X7j&W>i@|4|BiC#e1HCreOy4z=6}|XJ&o&F{y)Z1^Zl8v(_Rdq z`S`~^^6dCO#v%Fsf?>O#8%R3-q3bblY<>S8#GW1h$2h*e1WTt$>8ruLrNbd7jQpcP zmWmD^rw1G-a8ZEp!hvx$$s#sW)V1^j>?~Vm4=Kq9Gs^x~-U}{%A7zs;P6uf?Dcu@h zSDuq_RK%SyNs2t|Mx9|yyIH<)%KX0QJI?ZlFpnzzNxk0HRx9qjVXgYk(xtO@z04oU zsc^Trykx9r*}`oM+1~154MTYo<->yq11&clp=;b z7(icvQse-{zKxD9L8gI0F8yaf38Y5V%Z{dtqE zn-B(z!8V)!b zKZxh{B#5uSSJT7B?RWU0JX=K&2uTP6c3__mdw3JTzLX$f2i@?N9{XdiZsi%JT;1wM zWE^)GN=6Ck#+m+92HTvr^!Z zl(%j43Oy?@{vG&CMzcIFp1^+-hNYZ-OT&o0W%&>Aug*{NM32swrzz=toR&}k->%Y( zrtx_E?Fxj+L-<60*y{EVrtgUDKmYjayN{pV|JVBuwO#)8`E%#DJS)hEcVd0u4}g7e z^0s`Xnr@%Sm<<+^cYe!~c=W`2(ISsW1)EA^Hk3LKcO>o1XW990YOb?<&80Nf*JBfN zI7^BS%}3xBCCT{J4}gyHcq;x1yqcvn9FtC5j_UQl$$gl-0`r_2zyrGh>s>r0MAmt; z`ItSL*n0D9Jh>H5mcLy#VS*d7ChTjcOsEytc%bF~Seprn;;{ZM+3=6m71E47;}3vG zFgr|EE1@u~PCDWI<854oohs45u}6z6r>ko$2#mcr<#H#Tocw#n+EDQ;amD*xO4(_^ z)cz^^SU-RK>C6BA_71#`$ACLiNg9DDBQ$+gfQ4lM;^GbO_<`Xm0AKE63i!3-oX}O5 zA_J8F+`Q`d-~;DiFbetQO2%Ph|Tyue*Cbg?vMJsB@?tauh zjXTJM+C9HbE4*!AktKIa?v~swxgVF@T}^UV#j952j(Yo&yAic}tx|j6QoE&gOYN50 zFPPe0ncj{%5cA*}X4<%l+ACU`P>tg z9yVrrr;6y07f3ssxJ*6v3>|`4?(bfQZj}zfW$4y3S1cIlP9L+aG#72m_F`kUHeTDD z6=YdQD{I3EJbAcwX>GuM;2P(1lp~30ttQrn+hU9WuIA|z85`iWpeJ(;5|HAK{l5DL z1^3ugDM`lpavv_R7|KL_p!tDNE33XuSZ})4*rQv4NDG| z98OLSvh_9sIUuM@4(4gGYjQAJO^Mnihf1^1l7l6O=R*!yX;jRM@+oV?EL!#g$Cw=Q z>1a_p(rm4D57*Iyw@P?zl1kL_ioElwW+XxC*;>C?sp2kxsf}TA=O)RAm9l1yEJ#0V|-ISKV3z)d;4w>XsQykL!iEFqOj8ljl|<$Rj{l zr#Rd^iv_Z|e;=5Rt2k?Wzm`DCJQ_z z^)^j_>K(VDp$%->z@`mso^xRH66syGYF|uRQN}Ko3v|~t*UZ^{HZ);()GoUpR|~Q1 zZrR8~?ip36b{Ko8-qYo2g&WRzNa&f0U7eKv8J975(f}B1C1KsDH zBVLug4c>yr`P;0I&EP)JezfxKRQQAOJZOgIKGuf{C46CYK zCdzelz_iVdz0wuC%;sQvCc8E68za89@Tu!Iuc=ZEcx!)H`@`BF*8XT{f6$W|AoALZ zYXd|tbikAuw2uK|lqb-#1%jW$CN9>_IC~9DYqxbL@Z@HOP+QDA@@!aBtZrNyRpPGR zTj^l>mQ^{g~A|mTF1hgV?$a$aasJziiAgGbz2tS^7~oxyDf`2fr-4|5>{C&YJmO$5IL&u7 zm=Dg@6U9tM=X2Ny$&SwRAD!}DDAx;8G!;EZ7{|>=Cq2l56ocXEK8LM{?C?DM;R)rM z?b=%>FZ?aUV$Amndw6&-an!XLfw2{oZ3M>p=WGP#q9ZU`iM5VU7+Fc_=JpVy^mE$# z`^Z~4Sc10%ZwcNKeA|0}YZAQNq!tO@+#AgZ{u~xy9XVcNiQN*rC3Z{fZ4I~7y6nGBMDF)h;p;ZIWK8ciX8IF5PWMAzi;lp0=xMqFU;h5` zg*`6);H*5GcKE<|5JCg!BaHm(a2j6=V~TeFpjm2q52lbgzU%Uzu;)4A&&7dXKo7cp z5BAuQe!M@zsvvXMISvTvlNGyb2m)+8ML`ns-3?g$|XLlcJ zg*IB#YeNNPN*y;;HeSQ)IDO!_f!h<^AxmAZG9v2AmZu2-Np6#fva3P zvqB!cOyPMv-N#|(D>GuF|>O~qg3&Mc(!zZGNf$hjHwV`*H4Lhw}Tyyde04@=49o| zc2`EVf$f(?nm~G1Ah+8PUW(6d_e*=iw`#4;C!XWH=nS8BjZ6 zG>Ov&5U=W^!3^wWd1ksV7CV(OgH($ZWaldD@ElTh(|BX|RV~?V^=TqIq^F2U-SC3! zyc6kROF1-`oT1z>)|-tyx#_e}U~d9^D$tSp1~MbHy97$-B3J=4I~QI0Tm)Uk*42Kw zlYpyHuktYJY8leXNv;p@iXIv$cY1&qW%I;YS7V9v4rpr;Z9GQoFwh(ZGL$Q}6fRNj zcmj4$h4Mx=SzR}6ygNN%+gZ!%X9eedSlyFnTrBKoCx9nX^={*WG;ot|H`mu%!~zNy z-+vc;d+K6L%#!f}q+ES@71sXrBj(L)#+CXiD~3) zsifD}k{}npbIq}iM5E|LSa0AzuI{9dbyrN9u~`4RU|o@Qze@N~ zESNnQ)_HNddFE4-U`b6c9goK{=?Ckn&(M`CfC~ZkG&Tx9xB#({0I{I}-5nQcjRq~( zEVuysrOWk1YpnSSo39v!V-hl*YB0fXmK~4M3mu=>^ti|biC-Z^T z7U$Fupt`7M?Tn9L$ys`dIG!vIM{psi%Um5!hJ1NZXPP$%f!6d=%1>}2?B?ZE%TK+b zWGO$zo)AZn-)v|izl~l^1B_X~KZI3XBweE8+PX`^g_z zcnxRYojy&3=W3=PdWw+YQg}$2@_kt0H5Z+s;5@x~S1Pv^<@u`8YX_Cv18qKG?DT0w zcbc-3SCw4J4xU(cO(%<;K22oj>6&Zua0kypzTu8NPoM2tjqz`mw^mE7nYh^NLCos` z@ABL7nyu!qR8{|q%S}2`$(34YT4p ziSNmEI-PVN_O8dXBw>#er`;);d}CMs&-Wh(DR~%-*$*5| z#Rkh$sQCgFMkF_4l=;{^*-V*km^RHP0$di7x}dcc=T~!BGGeuI^!>m+Q9!X#zJY0; zL0>2@DcAY5vhvxV6Z!adHj!5eOuFg3LS{%)Pgd{7?3bw?Cvr>e?9i+yGm~tfK4UU1 znMuR^g3REFTv2sfmMTQ2wbQ9Wf}Y+w5NYsOkRU!0uT^Xds1lxHBSER$ZnVP~zTB0v z@Wh|al_J|IOCdq+O}3=|_7y!dJKH#E$rz0ii%t(S>Oye2~f0*vz?uFlt7d3#Un+U zE5-pW(pp5Cw4Q{Zx-~FK+XdRj9x*D6)o&=HP}nq0QfcOdAT4#Zqr*wdXz_sNz6}Z~ sY8t6ht#>8Gev?30>r!kiJ#(qK)f%oX*J=-Y*kkMXe@5lsY5+h10Fco#mjD0& literal 0 HcmV?d00001 diff --git a/backups/npmplus/backup-20260222_162326/api/access_lists.json b/backups/npmplus/backup-20260222_162326/api/access_lists.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/backups/npmplus/backup-20260222_162326/api/access_lists.json @@ -0,0 +1 @@ +[] diff --git a/backups/npmplus/backup-20260222_162326/api/certificates.json b/backups/npmplus/backup-20260222_162326/api/certificates.json new file mode 100644 index 0000000..b1a17ad --- /dev/null +++ b/backups/npmplus/backup-20260222_162326/api/certificates.json @@ -0,0 +1,685 @@ +[ + { + "id": 146, + "created_on": "2026-02-07 00:46:21", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cacti-alltra.d-bis.org", + "domain_names": [ + "cacti-alltra.d-bis.org" + ], + "expires_on": "2026-05-08 04:47:55", + "meta": {} + }, + { + "id": 147, + "created_on": "2026-02-07 00:46:43", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cacti-hybx.d-bis.org", + "domain_names": [ + "cacti-hybx.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:19", + "meta": {} + }, + { + "id": 155, + "created_on": "2026-02-20 22:27:52", + "modified_on": "2026-02-20 22:27:52", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "codespaces.d-bis.org", + "domain_names": [ + "codespaces.d-bis.org" + ], + "expires_on": "2026-02-20 22:27:52", + "meta": {} + }, + { + "id": 156, + "created_on": "2026-02-20 22:28:48", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "codespaces.d-bis.org", + "domain_names": [ + "codespaces.d-bis.org" + ], + "expires_on": "2026-05-22 02:30:34", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n", + "letsencrypt_agree": true + } + }, + { + "id": 134, + "created_on": "2026-01-29 22:52:44", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cross-all.defi-oracle.io", + "domain_names": [ + "cross-all.defi-oracle.io" + ], + "expires_on": "2026-04-30 02:54:15", + "meta": {} + }, + { + "id": 162, + "created_on": "2026-02-20 22:36:34", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dapp.d-bis.org", + "domain_names": [ + "dapp.d-bis.org" + ], + "expires_on": "2026-05-22 02:38:20", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 46, + "created_on": "2026-01-16 16:54:36", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-admin.d-bis.org", + "domain_names": [ + "dbis-admin.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:11", + "meta": {} + }, + { + "id": 47, + "created_on": "2026-01-16 16:54:47", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-api-2.d-bis.org", + "domain_names": [ + "dbis-api-2.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:22", + "meta": {} + }, + { + "id": 48, + "created_on": "2026-01-16 16:54:58", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-api.d-bis.org", + "domain_names": [ + "dbis-api.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:33", + "meta": {} + }, + { + "id": 157, + "created_on": "2026-02-20 22:29:37", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dev.d-bis.org", + "domain_names": [ + "dev.d-bis.org" + ], + "expires_on": "2026-05-22 02:31:22", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 145, + "created_on": "2026-02-06 19:14:04", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "explorer.d-bis.org", + "domain_names": [ + "explorer.d-bis.org" + ], + "expires_on": "2026-05-07 23:15:36", + "meta": { + "letsencrypt_agree": true, + "dns_challenge": true, + "nginx_online": true, + "nginx_err": null, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0" + } + }, + { + "id": 144, + "created_on": "2026-02-06 19:05:50", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "explorer.defi-oracle.io", + "domain_names": [ + "explorer.defi-oracle.io" + ], + "expires_on": "2026-05-07 23:07:35", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 158, + "created_on": "2026-02-20 22:30:18", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "gitea.d-bis.org", + "domain_names": [ + "gitea.d-bis.org" + ], + "expires_on": "2026-05-22 02:32:04", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 50, + "created_on": "2026-01-16 16:55:25", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "mim4u.org", + "domain_names": [ + "mim4u.org" + ], + "expires_on": "2026-04-16 20:57:01", + "meta": {} + }, + { + "id": 51, + "created_on": "2026-01-16 16:55:37", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "phoenix.sankofa.nexus", + "domain_names": [ + "phoenix.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:57:08", + "meta": {} + }, + { + "id": 159, + "created_on": "2026-02-20 22:31:08", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.ml110.d-bis.org", + "domain_names": [ + "pve.ml110.d-bis.org" + ], + "expires_on": "2026-05-22 02:32:54", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 160, + "created_on": "2026-02-20 22:31:51", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.r630-01.d-bis.org", + "domain_names": [ + "pve.r630-01.d-bis.org" + ], + "expires_on": "2026-05-22 02:33:37", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 161, + "created_on": "2026-02-20 22:32:35", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.r630-02.d-bis.org", + "domain_names": [ + "pve.r630-02.d-bis.org" + ], + "expires_on": "2026-05-22 02:34:21", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 148, + "created_on": "2026-02-07 00:46:56", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-2.d-bis.org", + "domain_names": [ + "rpc-alltra-2.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:31", + "meta": {} + }, + { + "id": 149, + "created_on": "2026-02-07 00:47:10", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-3.d-bis.org", + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:46", + "meta": {} + }, + { + "id": 150, + "created_on": "2026-02-07 08:15:35", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-3.d-bis.org", + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:06", + "meta": {} + }, + { + "id": 151, + "created_on": "2026-02-07 08:15:43", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra.d-bis.org", + "domain_names": [ + "rpc-alltra.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:18", + "meta": {} + }, + { + "id": 163, + "created_on": "2026-02-21 17:45:18", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-fireblocks.d-bis.org", + "domain_names": [ + "rpc-fireblocks.d-bis.org" + ], + "expires_on": "2026-05-22 21:47:15", + "meta": {} + }, + { + "id": 52, + "created_on": "2026-01-16 16:55:45", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-http-prv.d-bis.org", + "domain_names": [ + "rpc-http-prv.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:20", + "meta": {} + }, + { + "id": 53, + "created_on": "2026-01-16 16:55:57", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-http-pub.d-bis.org", + "domain_names": [ + "rpc-http-pub.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:30", + "meta": {} + }, + { + "id": 152, + "created_on": "2026-02-07 08:15:56", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx-2.d-bis.org", + "domain_names": [ + "rpc-hybx-2.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:31", + "meta": {} + }, + { + "id": 153, + "created_on": "2026-02-07 08:16:09", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx-3.d-bis.org", + "domain_names": [ + "rpc-hybx-3.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:45", + "meta": {} + }, + { + "id": 154, + "created_on": "2026-02-07 08:16:22", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx.d-bis.org", + "domain_names": [ + "rpc-hybx.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:58", + "meta": {} + }, + { + "id": 54, + "created_on": "2026-01-16 16:56:06", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-ws-prv.d-bis.org", + "domain_names": [ + "rpc-ws-prv.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:38", + "meta": {} + }, + { + "id": 55, + "created_on": "2026-01-16 16:56:16", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-ws-pub.d-bis.org", + "domain_names": [ + "rpc-ws-pub.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:51", + "meta": {} + }, + { + "id": 141, + "created_on": "2026-01-30 09:33:59", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc.d-bis.org", + "domain_names": [ + "rpc.d-bis.org" + ], + "expires_on": "2026-04-30 13:35:45", + "meta": { + "letsencrypt_agree": true, + "dns_challenge": true, + "nginx_online": false, + "nginx_err": "nginx: [emerg] cannot load certificate \"/data/tls/certbot/live/npm-135/fullchain.pem\": BIO_new_file() failed (SSL: error:80000002:system library::No such file or directory:calling fopen(/data/tls/certbot/live/npm-135/fullchain.pem, r) error:10000080:BIO routines::no such file)\nnginx: configuration file /usr/local/nginx/conf/nginx.conf test failed", + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\ndns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0" + } + }, + { + "id": 56, + "created_on": "2026-01-16 16:56:30", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc.public-0138.defi-oracle.io", + "domain_names": [ + "rpc.public-0138.defi-oracle.io" + ], + "expires_on": "2026-04-16 20:58:05", + "meta": {} + }, + { + "id": 137, + "created_on": "2026-01-29 23:39:01", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc2.d-bis.org", + "domain_names": [ + "rpc2.d-bis.org" + ], + "expires_on": "2026-04-30 03:40:50", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 57, + "created_on": "2026-01-16 16:56:41", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "sankofa.nexus", + "domain_names": [ + "sankofa.nexus" + ], + "expires_on": "2026-04-16 20:58:17", + "meta": {} + }, + { + "id": 58, + "created_on": "2026-01-16 16:56:53", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "secure.d-bis.org", + "domain_names": [ + "secure.d-bis.org" + ], + "expires_on": "2026-04-16 20:58:28", + "meta": {} + }, + { + "id": 59, + "created_on": "2026-01-16 16:57:05", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "secure.mim4u.org", + "domain_names": [ + "secure.mim4u.org" + ], + "expires_on": "2026-04-16 20:58:40", + "meta": {} + }, + { + "id": 60, + "created_on": "2026-01-16 16:57:17", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "the-order.sankofa.nexus", + "domain_names": [ + "the-order.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:58:53", + "meta": {} + }, + { + "id": 61, + "created_on": "2026-01-16 16:57:31", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "training.mim4u.org", + "domain_names": [ + "training.mim4u.org" + ], + "expires_on": "2026-04-16 20:59:06", + "meta": {} + }, + { + "id": 164, + "created_on": "2026-02-21 17:46:22", + "modified_on": "2026-02-21 20:01:51", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc-fireblocks.d-bis.org", + "domain_names": [ + "ws.rpc-fireblocks.d-bis.org" + ], + "expires_on": "2026-05-22 21:48:21", + "meta": {} + }, + { + "id": 138, + "created_on": "2026-01-29 23:41:20", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc.d-bis.org", + "domain_names": [ + "ws.rpc.d-bis.org" + ], + "expires_on": "2026-04-30 03:43:05", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 139, + "created_on": "2026-01-29 23:42:13", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc2.d-bis.org", + "domain_names": [ + "ws.rpc2.d-bis.org" + ], + "expires_on": "2026-04-30 03:43:58", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 140, + "created_on": "2026-01-29 23:43:09", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "wss.defi-oracle.io", + "domain_names": [ + "wss.defi-oracle.io" + ], + "expires_on": "2026-04-30 03:44:57", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 62, + "created_on": "2026-01-16 16:57:41", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.mim4u.org", + "domain_names": [ + "www.mim4u.org" + ], + "expires_on": "2026-04-16 20:59:17", + "meta": {} + }, + { + "id": 63, + "created_on": "2026-01-16 16:57:52", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.phoenix.sankofa.nexus", + "domain_names": [ + "www.phoenix.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:59:28", + "meta": {} + }, + { + "id": 64, + "created_on": "2026-01-16 16:58:06", + "modified_on": "2026-02-21 20:01:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.sankofa.nexus", + "domain_names": [ + "www.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:59:41", + "meta": {} + } +] diff --git a/backups/npmplus/backup-20260222_162326/api/proxy_hosts.json b/backups/npmplus/backup-20260222_162326/api/proxy_hosts.json new file mode 100644 index 0000000..f60b669 --- /dev/null +++ b/backups/npmplus/backup-20260222_162326/api/proxy_hosts.json @@ -0,0 +1,1394 @@ +[ + { + "id": 37, + "created_on": "2026-02-07 00:42:23", + "modified_on": "2026-02-07 00:46:30", + "owner_user_id": 1, + "domain_names": [ + "cacti-alltra.d-bis.org" + ], + "forward_host": "192.168.11.177", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 146, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 38, + "created_on": "2026-02-07 00:42:24", + "modified_on": "2026-02-07 00:46:53", + "owner_user_id": 1, + "domain_names": [ + "cacti-hybx.d-bis.org" + ], + "forward_host": "192.168.11.251", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 147, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 41, + "created_on": "2026-02-07 20:41:16", + "modified_on": "2026-02-20 22:29:09", + "owner_user_id": 1, + "domain_names": [ + "codespaces.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 156, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 22, + "created_on": "2026-01-18 22:19:18", + "modified_on": "2026-01-29 22:52:50", + "owner_user_id": 1, + "domain_names": [ + "cross-all.defi-oracle.io" + ], + "forward_host": "192.168.11.211", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 134, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 49, + "created_on": "2026-02-20 22:27:16", + "modified_on": "2026-02-20 22:37:53", + "owner_user_id": 1, + "domain_names": [ + "dapp.d-bis.org" + ], + "forward_host": "192.168.11.58", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 162, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 13, + "created_on": "2026-01-16 14:41:02", + "modified_on": "2026-02-22 19:22:13", + "owner_user_id": 1, + "domain_names": [ + "dbis-admin.d-bis.org" + ], + "forward_host": "192.168.11.130", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 46, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 15, + "created_on": "2026-01-16 14:41:04", + "modified_on": "2026-02-22 19:22:34", + "owner_user_id": 1, + "domain_names": [ + "dbis-api-2.d-bis.org" + ], + "forward_host": "192.168.11.156", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 47, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 14, + "created_on": "2026-01-16 14:41:03", + "modified_on": "2026-02-22 19:22:27", + "owner_user_id": 1, + "domain_names": [ + "dbis-api.d-bis.org" + ], + "forward_host": "192.168.11.155", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 48, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 45, + "created_on": "2026-02-13 20:32:33", + "modified_on": "2026-02-13 20:32:33", + "owner_user_id": 1, + "domain_names": [ + "dbis.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3001, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 39, + "created_on": "2026-02-07 20:41:12", + "modified_on": "2026-02-20 22:29:57", + "owner_user_id": 1, + "domain_names": [ + "dev.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 157, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 8, + "created_on": "2026-01-16 14:40:58", + "modified_on": "2026-02-22 19:18:49", + "owner_user_id": 1, + "domain_names": [ + "explorer.d-bis.org" + ], + "forward_host": "192.168.11.140", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 145, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers (unsafe-eval for ethers.js v5)\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 30, + "created_on": "2026-01-31 00:13:09", + "modified_on": "2026-02-06 19:09:43", + "owner_user_id": 1, + "domain_names": [ + "explorer.defi-oracle.io" + ], + "forward_host": "192.168.11.140", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 144, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 40, + "created_on": "2026-02-07 20:41:14", + "modified_on": "2026-02-20 22:30:39", + "owner_user_id": 1, + "domain_names": [ + "gitea.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 158, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 46, + "created_on": "2026-02-13 20:32:35", + "modified_on": "2026-02-13 20:32:35", + "owner_user_id": 1, + "domain_names": [ + "iccc.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3002, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 17, + "created_on": "2026-01-16 14:41:05", + "modified_on": "2026-02-22 19:22:58", + "owner_user_id": 1, + "domain_names": [ + "mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 50, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 47, + "created_on": "2026-02-13 20:32:37", + "modified_on": "2026-02-13 20:32:37", + "owner_user_id": 1, + "domain_names": [ + "omnl.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3003, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 5, + "created_on": "2026-01-16 14:40:55", + "modified_on": "2026-01-16 17:01:49", + "owner_user_id": 1, + "domain_names": [ + "phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.50", + "forward_port": 4000, + "access_list_id": 0, + "certificate_id": 51, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 42, + "created_on": "2026-02-07 20:41:17", + "modified_on": "2026-02-20 22:31:27", + "owner_user_id": 1, + "domain_names": [ + "pve.ml110.d-bis.org" + ], + "forward_host": "192.168.11.10", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 159, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 43, + "created_on": "2026-02-07 20:41:19", + "modified_on": "2026-02-20 22:32:14", + "owner_user_id": 1, + "domain_names": [ + "pve.r630-01.d-bis.org" + ], + "forward_host": "192.168.11.11", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 160, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 44, + "created_on": "2026-02-07 20:41:21", + "modified_on": "2026-02-20 22:32:57", + "owner_user_id": 1, + "domain_names": [ + "pve.r630-02.d-bis.org" + ], + "forward_host": "192.168.11.12", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 161, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 32, + "created_on": "2026-02-07 00:42:16", + "modified_on": "2026-02-07 00:47:07", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra-2.d-bis.org" + ], + "forward_host": "192.168.11.173", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 148, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 33, + "created_on": "2026-02-07 00:42:17", + "modified_on": "2026-02-07 08:15:41", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "forward_host": "192.168.11.174", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 150, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 31, + "created_on": "2026-02-07 00:42:15", + "modified_on": "2026-02-07 08:15:53", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra.d-bis.org" + ], + "forward_host": "192.168.11.172", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 151, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 50, + "created_on": "2026-02-21 17:37:16", + "modified_on": "2026-02-22 19:21:47", + "owner_user_id": 1, + "domain_names": [ + "rpc-fireblocks.d-bis.org" + ], + "forward_host": "192.168.11.232", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 163, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 11, + "created_on": "2026-01-16 14:41:00", + "modified_on": "2026-02-22 19:19:23", + "owner_user_id": 1, + "domain_names": [ + "rpc-http-prv.d-bis.org" + ], + "forward_host": "192.168.11.211", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 52, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 9, + "created_on": "2026-01-16 14:40:59", + "modified_on": "2026-02-22 19:18:56", + "owner_user_id": 1, + "domain_names": [ + "rpc-http-pub.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 53, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 35, + "created_on": "2026-02-07 00:42:20", + "modified_on": "2026-02-07 08:16:06", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx-2.d-bis.org" + ], + "forward_host": "192.168.11.247", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 152, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 36, + "created_on": "2026-02-07 00:42:22", + "modified_on": "2026-02-07 08:16:19", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx-3.d-bis.org" + ], + "forward_host": "192.168.11.248", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 153, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 34, + "created_on": "2026-02-07 00:42:19", + "modified_on": "2026-02-07 08:16:32", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx.d-bis.org" + ], + "forward_host": "192.168.11.246", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 154, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 12, + "created_on": "2026-01-16 14:41:01", + "modified_on": "2026-02-22 19:19:35", + "owner_user_id": 1, + "domain_names": [ + "rpc-ws-prv.d-bis.org" + ], + "forward_host": "192.168.11.211", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 54, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 10, + "created_on": "2026-01-16 14:40:59", + "modified_on": "2026-02-22 19:19:06", + "owner_user_id": 1, + "domain_names": [ + "rpc-ws-pub.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 55, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 26, + "created_on": "2026-01-29 16:35:10", + "modified_on": "2026-02-22 19:20:19", + "owner_user_id": 1, + "domain_names": [ + "rpc.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 141, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\ndns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 24, + "created_on": "2026-01-29 15:38:44", + "modified_on": "2026-02-22 19:20:04", + "owner_user_id": 1, + "domain_names": [ + "rpc.defi-oracle.io" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 56, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 21, + "created_on": "2026-01-16 14:41:09", + "modified_on": "2026-02-22 19:19:47", + "owner_user_id": 1, + "domain_names": [ + "rpc.public-0138.defi-oracle.io" + ], + "forward_host": "192.168.11.240", + "forward_port": 443, + "access_list_id": 0, + "certificate_id": 56, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "https", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 27, + "created_on": "2026-01-29 16:35:11", + "modified_on": "2026-02-22 19:20:29", + "owner_user_id": 1, + "domain_names": [ + "rpc2.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 137, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 3, + "created_on": "2026-01-16 14:40:54", + "modified_on": "2026-01-16 17:01:32", + "owner_user_id": 1, + "domain_names": [ + "sankofa.nexus" + ], + "forward_host": "192.168.11.51", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 57, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "add_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 16, + "created_on": "2026-01-16 14:41:04", + "modified_on": "2026-02-22 19:22:42", + "owner_user_id": 1, + "domain_names": [ + "secure.d-bis.org" + ], + "forward_host": "192.168.11.130", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 58, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 19, + "created_on": "2026-01-16 14:41:07", + "modified_on": "2026-02-22 19:23:16", + "owner_user_id": 1, + "domain_names": [ + "secure.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 59, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 7, + "created_on": "2026-01-16 14:40:57", + "modified_on": "2026-01-16 17:02:09", + "owner_user_id": 1, + "domain_names": [ + "the-order.sankofa.nexus" + ], + "forward_host": "192.168.11.36", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 60, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 20, + "created_on": "2026-01-16 14:41:08", + "modified_on": "2026-02-22 19:23:27", + "owner_user_id": 1, + "domain_names": [ + "training.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 61, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 51, + "created_on": "2026-02-21 17:37:45", + "modified_on": "2026-02-22 19:22:04", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc-fireblocks.d-bis.org" + ], + "forward_host": "192.168.11.232", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 164, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 28, + "created_on": "2026-01-29 16:35:12", + "modified_on": "2026-02-22 19:20:49", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 138, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 29, + "created_on": "2026-01-29 16:35:12", + "modified_on": "2026-02-22 19:20:57", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc2.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 139, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 25, + "created_on": "2026-01-29 15:38:45", + "modified_on": "2026-02-22 19:20:12", + "owner_user_id": 1, + "domain_names": [ + "wss.defi-oracle.io" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 140, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 18, + "created_on": "2026-01-16 14:41:06", + "modified_on": "2026-01-16 17:02:14", + "owner_user_id": 1, + "domain_names": [ + "www.mim4u.org" + ], + "forward_host": "192.168.11.36", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 62, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 6, + "created_on": "2026-01-16 14:40:56", + "modified_on": "2026-01-16 17:02:17", + "owner_user_id": 1, + "domain_names": [ + "www.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.50", + "forward_port": 4000, + "access_list_id": 0, + "certificate_id": 63, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 4, + "created_on": "2026-01-16 14:40:55", + "modified_on": "2026-01-16 17:02:19", + "owner_user_id": 1, + "domain_names": [ + "www.sankofa.nexus" + ], + "forward_host": "192.168.11.51", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 64, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 48, + "created_on": "2026-02-13 20:32:39", + "modified_on": "2026-02-13 20:32:39", + "owner_user_id": 1, + "domain_names": [ + "xom.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3004, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + } +] diff --git a/backups/npmplus/backup-20260222_162326/certificates/cert_list.txt b/backups/npmplus/backup-20260222_162326/certificates/cert_list.txt new file mode 100644 index 0000000..e69de29 diff --git a/backups/npmplus/backup-20260222_162326/database/database.sql b/backups/npmplus/backup-20260222_162326/database/database.sql new file mode 100644 index 0000000..77149a3 --- /dev/null +++ b/backups/npmplus/backup-20260222_162326/database/database.sql @@ -0,0 +1 @@ +Database file not found diff --git a/backups/npmplus/backup-20260222_162326/database/database.sqlite b/backups/npmplus/backup-20260222_162326/database/database.sqlite new file mode 100644 index 0000000..e69de29 diff --git a/backups/npmplus/backup-20260222_162326/manifest.json b/backups/npmplus/backup-20260222_162326/manifest.json new file mode 100644 index 0000000..cb38896 --- /dev/null +++ b/backups/npmplus/backup-20260222_162326/manifest.json @@ -0,0 +1,19 @@ +{ + "timestamp": "20260222_162326", + "backup_date": "2026-02-22T16:23:36-08:00", + "npmplus_vmid": "10233", + "npmplus_host": "192.168.11.11", + "npm_url": "https://192.168.11.167:81", + "backup_contents": { + "database": { + "sql_dump": "present", + "sqlite_file": "missing" + }, + "api_exports": { + "proxy_hosts": "present", + "certificates": "present", + "access_lists": "present" + }, + "certificate_files": "missing" + } +} diff --git a/backups/npmplus/backup-20260222_162326/volumes/volume_list.txt b/backups/npmplus/backup-20260222_162326/volumes/volume_list.txt new file mode 100644 index 0000000..4545150 --- /dev/null +++ b/backups/npmplus/backup-20260222_162326/volumes/volume_list.txt @@ -0,0 +1 @@ +DRIVER VOLUME NAME diff --git a/backups/npmplus/backup-20260223_030001.tar.gz b/backups/npmplus/backup-20260223_030001.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..71570dc833914d92a6867ebd82efadc6e08cc963 GIT binary patch literal 5135 zcmV+q6!7aGiwFP!000001MOXFkJ~o7p3nIe#PmZFp!SfWBzsf@*lwHM4bUb3!9UQwP44*K5@Dc@*YA}LzFOou|7Nk*hDuO2>pZ+tlnN8e`CjsqPZIu0H{ z3?W2U7i}Kwim=!7_)paHp!jonTp$m*J&4&KtR2G8MHj$p^(ktO87;ybfQvXSl98mH z>iiQuhSlHyE=y(;LfgSXv+s}D_jf&PzyDDV#rL2893(Lf@Pz|DQj;`}fpm6y;Z!w3-APNhz zY}0{G$HAW=4j>GW+kt)dmwD@SI+-RjI=Gv}5pRy5gYo96+l&_FscWZ;{C*c9_TQ?> zV3sHR>}^p@X>fHVw(@&HfAgtESz3^^psWXf9d?2}XE+QgS^b9nj{Y|pM6>xjPIE$8 zkMb(ZlW{=?<2WhbZxT})r#F}7=|AVKF2iX&AP>_l7w!c3wX%oD@_lIKrAH($;&D7; zqN{EYjz)yia*o|-uyJ$YD&( znvZ|%L*I`7V;qw2FBrD_xq+nPAGsc6*x3C3J%oHa{*Q5dc>$JAlhRj%drOByP8j(| zgDe#tKClNM3|uF0@WO#{Imse6Q`EKe0}Pifv-_0fgBfLil=ni5-$&UbjMG6HPD;1N zmzC!v92IdVOp+oGyHRHt({7e8oHD;J`i`^wKFp&^e^Re^xz&n0Z&<57T)K4Du9x{E z!3uZF{8?Rpaf;Gpz^*qU{MSW3Bg-z~=r&Go1|$uKNqKS{CUkjrm}H}G+rpW5~pP2{;P8&&)JD|mL!|rt0c+p2lr%1 z*@KW`Fq_`wVMMl`gge}v0i8`3k`mr;DMLECB@?pr&MlvF{nkPk_Re7uXDMAg(DEjX zQ3jPA$}@B}oFjrRPQF;Y#Rg9MnmBcJaq8jyaC-YVd@w+%K>D9L8gI0L=Jq3gNhXylT<=MMca3K1R;LpX-zCBTP|+t(NF&zo%B zgfLhnZ>C`yWqCLWQ#LsNcEf+y9c7b>_WYr~kw^VUT1zD%1tsYyf1DPB@FpiU9B?## z5YO#N5MO?;riYE&@9;x;wu&GeM?w&&gZg~fqw4_mr38UG&NXl8vH#4~tvsWYt6SZO zjN=YN$tWS+IMbiXP@7X3cI{MlPE*;nbShg+P(9tL4EOd>xT0`6HJHS_ev9z*owI;v z71auts+i+8&mI8YBD|gq5hE-oVxQ^OTvLON3f>N2e9c+g9NrAroiLijsfpE#>r^!Z zl(%j43Oy?@{vG&4MzcIF9>Ko|!%|MareVb1vit}5Pv@t3qDSZRsau+5q!91r1@W5`sdKZrgk#*i| zK4y<5w%$A&Pj1AM`~mO? zW{1gYB@~9$Nhh3typ4;nQzaTW_Gppibajmdfw32-T<)ZklmE_G8!CP!u6VyqDLW0A z+COC<>*o(Yeg5Cy-hx;07;tAQNh1(tgr+YGu&@k3T)gHT-!nV~;PY)v0l#*f6T0eB zWPtLYn^*lFyyqMYMj^jk$vA9meE#(pFwCMyKtdWPk5+S$Yc9ysq;{37XhrSV-H+O* zamO*CcF%9q3UAw2WXauq4w@WHt9sPLog>>tg z9yMlqSVi>53#6S*T&5m-h7Lh2_jj*Dw@QcLGIZ;iD;5lNr;piInu|7O`($IbHeTDD z6=YdQD{BJ=o;+N;v^G#baE#C9#0VFt_0QRX7o&XAs&rJM{qMbjj6)A84u)UM6&gEV*FBtzE%8k?R#j7zDYcBXN~3~ z+~Nv5uM%TNj9KQUo`UU;TE2qqPTJmryfuG8ZaoH1!DGO`(_Ggui(uv_h+$fjr4^G! zz8HJ0aP+iQ6XO_EHc68ss3y4aykS+71F0rjX|pi! zLsft~m{Z6mS6TJsywww%T=f)_t7Hq0MQ^A|wODvV(H?oT(>v0gBnUy1PG$DujdIToq;Gfvku;gIL z;pF5XTW=$fgM)O*!8|Q?O%6t@DV=u7q0%h0nnyt0&;W~QoRtc|7Qi)n#k#|1Tj3h`sTk97qRon$oRn{+W*$QYTIF03)H=Usw^P60IDiIUEC}S7P1-k2+Yv$}e8=A1Y(=NLoR|~Q1 zZrR5fZ@HwNC3j2imfS75AC=r4nHQwov65SiUV!u>?GD_}3v&7p404}$ zj(An}Hh2RX=Wnw>`_am`Q{iLQ3vfShHTTMb!me6IW7cpd+LmLdXR=-O8CF$! znkd)J0n;`+_DWamGMj_xne5iMZ;bfb!l$m=yrxPu;H~{(?GI~zSo@=){XtJ=fXHhr zt_={q&;e6soP7)sqdb9@EfD-1HgU0b#@TCNTDz^oz>}L9LTxeg$g^QhvAS_-REfKK zZ>59jTUO;bf0e@)uu_DMIX0yA6PLxWtVno7R<~vGEx(^7zuU6-PiK~BwJg5YmMKsu zEGKs!I6|DK=@e1i5=J15Ck#uIGEyfAr@vtKjDJh2H-U0T$d0M-O}?hJ2DfTuH0v}yu)^16ttf^)9+wu$C>iubg8 z*qU=D)u`J6E`wjqx5sy z`}@dSIaq?X1aAr65`5cxe`^xF+@ux>-rO6_2>u)vU>!MLVu{@nyCrr@>}?af%p2o$ z5aydRV<*6>x+WDZn=<=DHtDkeI}y3tSB0^R*Ic`Z5u>!GLV3ViYV ziwk=^^@FqWY}(-iA36>mK(0Qat8f}$31fxD=kAPu z-?!uc7{{0GfS#+hca0x78by%$E5|hYugOuP@xcu0Zpf#_2Zt zkEBkxnR{z0(JtM+s>}>yX!jhgQpE?Es7m)IL&|o}m!zk(MUTh$i--2&pPN4`2CwuwZ#6!{NZqfZ7S8 zNt`x-cvT+_W?(PNGt+&s*r|*eq*|;XJ6EF)&*5Y@jW>2*)so#-pC+<%^b|3v8(xr| zcOpG(DTn5gGn5;~db5!yH=Py=>~(-o1v+xqKxU+Nmq6)UgeqWW=c1=R7a>=%b+upa zB;ab*t2~6dT86Z8lIsJ!qK5{`VGr=4Y@RslYAli70c|a!jmL-`2Aab_hH}N0!X?U~ z7kC}MFD6RCPPaX}im$+w&9Yb{~{ z1&i;$3cfvcF(zioc!8s_`tlI)UN84j0J~;gnAC3RiF=C6>=tP;5pu1Oq#J+|EpkKk#)aH z_)#pFJs8$`ak_ctQ>$>#5Jkl`DV?0rs>u3O}#_v5^3=p#a?-7io|886A{U^1x>^bFR5^QVQJ9F&PRCJEJE-I=y+j;OmWLy_5Om619ZH6Lc~NJYHwb~&^is-Ca3bvHLkh3C=nMtt>CL-RxvePASCw8nsNC*p^9f_8 zPb0e1l%2e)GHGie5`v2S&H2(*C7cwFF&F{Q)LYfsI$-)Q-Yxls{%PU?_;;Kk!xu$QJ z6<0}oN3PQ8q=T?`HJ&92dz?7!PRZmeyYk=PeHf(VelU&`^6E8v1okrmuReYHB>?Q+ zSswJ~YxkUhKGK3rKoSr0Fn&_29tZauX7DI_>+@tk zfSQU8mZwnj1uBe4uEi+xv3atYGTkt3nok6{EF|@W)>fQf&0)!i)ymQL1NTG$#YXuC zrg;W^p}eGA=hMo{_k}@rWNB@0BCisdbkli-%p6TUS-l&xU#5DT$St+AL$jXDOtOLc zjLEcQCJploGD9bFMb&Ltst}#lPNxb9dV1?Xq`_lBg7`!eXT`RFD&Z+M5|qmAT04y4 z%Uvl8PyFdzDYBii6cW_lWJ~Ig?^i_NYm_(TmQ74~bCKwuJ}L%xwsF#upOFHGD>PoK zz_pS(fR%d>ag;d$($`52fU*Wwf?@+B1=C2FSp9}F3WZJ6B$Z}P2+~qlJ35@Sj1~`Q x?%SY{qNb55)p}P_>^BL7wJycR(leKuTdm>Ra;^5Thds8A{|7PeJc9s00RV$e8|451 literal 0 HcmV?d00001 diff --git a/backups/npmplus/backup-20260223_030001/api/access_lists.json b/backups/npmplus/backup-20260223_030001/api/access_lists.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/backups/npmplus/backup-20260223_030001/api/access_lists.json @@ -0,0 +1 @@ +[] diff --git a/backups/npmplus/backup-20260223_030001/api/certificates.json b/backups/npmplus/backup-20260223_030001/api/certificates.json new file mode 100644 index 0000000..b23a32b --- /dev/null +++ b/backups/npmplus/backup-20260223_030001/api/certificates.json @@ -0,0 +1,685 @@ +[ + { + "id": 146, + "created_on": "2026-02-07 00:46:21", + "modified_on": "2026-02-22 20:01:53", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cacti-alltra.d-bis.org", + "domain_names": [ + "cacti-alltra.d-bis.org" + ], + "expires_on": "2026-05-08 04:47:55", + "meta": {} + }, + { + "id": 147, + "created_on": "2026-02-07 00:46:43", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cacti-hybx.d-bis.org", + "domain_names": [ + "cacti-hybx.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:19", + "meta": {} + }, + { + "id": 155, + "created_on": "2026-02-20 22:27:52", + "modified_on": "2026-02-20 22:27:52", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "codespaces.d-bis.org", + "domain_names": [ + "codespaces.d-bis.org" + ], + "expires_on": "2026-02-20 22:27:52", + "meta": {} + }, + { + "id": 156, + "created_on": "2026-02-20 22:28:48", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "codespaces.d-bis.org", + "domain_names": [ + "codespaces.d-bis.org" + ], + "expires_on": "2026-05-22 02:30:34", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n", + "letsencrypt_agree": true + } + }, + { + "id": 134, + "created_on": "2026-01-29 22:52:44", + "modified_on": "2026-02-22 20:01:53", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cross-all.defi-oracle.io", + "domain_names": [ + "cross-all.defi-oracle.io" + ], + "expires_on": "2026-04-30 02:54:15", + "meta": {} + }, + { + "id": 162, + "created_on": "2026-02-20 22:36:34", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dapp.d-bis.org", + "domain_names": [ + "dapp.d-bis.org" + ], + "expires_on": "2026-05-22 02:38:20", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 46, + "created_on": "2026-01-16 16:54:36", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-admin.d-bis.org", + "domain_names": [ + "dbis-admin.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:11", + "meta": {} + }, + { + "id": 47, + "created_on": "2026-01-16 16:54:47", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-api-2.d-bis.org", + "domain_names": [ + "dbis-api-2.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:22", + "meta": {} + }, + { + "id": 48, + "created_on": "2026-01-16 16:54:58", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-api.d-bis.org", + "domain_names": [ + "dbis-api.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:33", + "meta": {} + }, + { + "id": 157, + "created_on": "2026-02-20 22:29:37", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dev.d-bis.org", + "domain_names": [ + "dev.d-bis.org" + ], + "expires_on": "2026-05-22 02:31:22", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 145, + "created_on": "2026-02-06 19:14:04", + "modified_on": "2026-02-22 20:01:53", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "explorer.d-bis.org", + "domain_names": [ + "explorer.d-bis.org" + ], + "expires_on": "2026-05-07 23:15:36", + "meta": { + "letsencrypt_agree": true, + "dns_challenge": true, + "nginx_online": true, + "nginx_err": null, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0" + } + }, + { + "id": 144, + "created_on": "2026-02-06 19:05:50", + "modified_on": "2026-02-22 20:01:53", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "explorer.defi-oracle.io", + "domain_names": [ + "explorer.defi-oracle.io" + ], + "expires_on": "2026-05-07 23:07:35", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 158, + "created_on": "2026-02-20 22:30:18", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "gitea.d-bis.org", + "domain_names": [ + "gitea.d-bis.org" + ], + "expires_on": "2026-05-22 02:32:04", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 50, + "created_on": "2026-01-16 16:55:25", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "mim4u.org", + "domain_names": [ + "mim4u.org" + ], + "expires_on": "2026-04-16 20:57:01", + "meta": {} + }, + { + "id": 51, + "created_on": "2026-01-16 16:55:37", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "phoenix.sankofa.nexus", + "domain_names": [ + "phoenix.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:57:08", + "meta": {} + }, + { + "id": 159, + "created_on": "2026-02-20 22:31:08", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.ml110.d-bis.org", + "domain_names": [ + "pve.ml110.d-bis.org" + ], + "expires_on": "2026-05-22 02:32:54", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 160, + "created_on": "2026-02-20 22:31:51", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.r630-01.d-bis.org", + "domain_names": [ + "pve.r630-01.d-bis.org" + ], + "expires_on": "2026-05-22 02:33:37", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 161, + "created_on": "2026-02-20 22:32:35", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.r630-02.d-bis.org", + "domain_names": [ + "pve.r630-02.d-bis.org" + ], + "expires_on": "2026-05-22 02:34:21", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 148, + "created_on": "2026-02-07 00:46:56", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-2.d-bis.org", + "domain_names": [ + "rpc-alltra-2.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:31", + "meta": {} + }, + { + "id": 149, + "created_on": "2026-02-07 00:47:10", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-3.d-bis.org", + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:46", + "meta": {} + }, + { + "id": 150, + "created_on": "2026-02-07 08:15:35", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-3.d-bis.org", + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:06", + "meta": {} + }, + { + "id": 151, + "created_on": "2026-02-07 08:15:43", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra.d-bis.org", + "domain_names": [ + "rpc-alltra.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:18", + "meta": {} + }, + { + "id": 163, + "created_on": "2026-02-21 17:45:18", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-fireblocks.d-bis.org", + "domain_names": [ + "rpc-fireblocks.d-bis.org" + ], + "expires_on": "2026-05-22 21:47:15", + "meta": {} + }, + { + "id": 52, + "created_on": "2026-01-16 16:55:45", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-http-prv.d-bis.org", + "domain_names": [ + "rpc-http-prv.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:20", + "meta": {} + }, + { + "id": 53, + "created_on": "2026-01-16 16:55:57", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-http-pub.d-bis.org", + "domain_names": [ + "rpc-http-pub.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:30", + "meta": {} + }, + { + "id": 152, + "created_on": "2026-02-07 08:15:56", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx-2.d-bis.org", + "domain_names": [ + "rpc-hybx-2.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:31", + "meta": {} + }, + { + "id": 153, + "created_on": "2026-02-07 08:16:09", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx-3.d-bis.org", + "domain_names": [ + "rpc-hybx-3.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:45", + "meta": {} + }, + { + "id": 154, + "created_on": "2026-02-07 08:16:22", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx.d-bis.org", + "domain_names": [ + "rpc-hybx.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:58", + "meta": {} + }, + { + "id": 54, + "created_on": "2026-01-16 16:56:06", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-ws-prv.d-bis.org", + "domain_names": [ + "rpc-ws-prv.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:38", + "meta": {} + }, + { + "id": 55, + "created_on": "2026-01-16 16:56:16", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-ws-pub.d-bis.org", + "domain_names": [ + "rpc-ws-pub.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:51", + "meta": {} + }, + { + "id": 141, + "created_on": "2026-01-30 09:33:59", + "modified_on": "2026-02-22 20:01:53", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc.d-bis.org", + "domain_names": [ + "rpc.d-bis.org" + ], + "expires_on": "2026-04-30 13:35:45", + "meta": { + "letsencrypt_agree": true, + "dns_challenge": true, + "nginx_online": false, + "nginx_err": "nginx: [emerg] cannot load certificate \"/data/tls/certbot/live/npm-135/fullchain.pem\": BIO_new_file() failed (SSL: error:80000002:system library::No such file or directory:calling fopen(/data/tls/certbot/live/npm-135/fullchain.pem, r) error:10000080:BIO routines::no such file)\nnginx: configuration file /usr/local/nginx/conf/nginx.conf test failed", + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\ndns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0" + } + }, + { + "id": 56, + "created_on": "2026-01-16 16:56:30", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc.public-0138.defi-oracle.io", + "domain_names": [ + "rpc.public-0138.defi-oracle.io" + ], + "expires_on": "2026-04-16 20:58:05", + "meta": {} + }, + { + "id": 137, + "created_on": "2026-01-29 23:39:01", + "modified_on": "2026-02-22 20:01:53", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc2.d-bis.org", + "domain_names": [ + "rpc2.d-bis.org" + ], + "expires_on": "2026-04-30 03:40:50", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 57, + "created_on": "2026-01-16 16:56:41", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "sankofa.nexus", + "domain_names": [ + "sankofa.nexus" + ], + "expires_on": "2026-04-16 20:58:17", + "meta": {} + }, + { + "id": 58, + "created_on": "2026-01-16 16:56:53", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "secure.d-bis.org", + "domain_names": [ + "secure.d-bis.org" + ], + "expires_on": "2026-04-16 20:58:28", + "meta": {} + }, + { + "id": 59, + "created_on": "2026-01-16 16:57:05", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "secure.mim4u.org", + "domain_names": [ + "secure.mim4u.org" + ], + "expires_on": "2026-04-16 20:58:40", + "meta": {} + }, + { + "id": 60, + "created_on": "2026-01-16 16:57:17", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "the-order.sankofa.nexus", + "domain_names": [ + "the-order.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:58:53", + "meta": {} + }, + { + "id": 61, + "created_on": "2026-01-16 16:57:31", + "modified_on": "2026-02-22 20:01:53", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "training.mim4u.org", + "domain_names": [ + "training.mim4u.org" + ], + "expires_on": "2026-04-16 20:59:06", + "meta": {} + }, + { + "id": 164, + "created_on": "2026-02-21 17:46:22", + "modified_on": "2026-02-22 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc-fireblocks.d-bis.org", + "domain_names": [ + "ws.rpc-fireblocks.d-bis.org" + ], + "expires_on": "2026-05-22 21:48:21", + "meta": {} + }, + { + "id": 138, + "created_on": "2026-01-29 23:41:20", + "modified_on": "2026-02-22 20:01:53", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc.d-bis.org", + "domain_names": [ + "ws.rpc.d-bis.org" + ], + "expires_on": "2026-04-30 03:43:05", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 139, + "created_on": "2026-01-29 23:42:13", + "modified_on": "2026-02-22 20:01:53", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc2.d-bis.org", + "domain_names": [ + "ws.rpc2.d-bis.org" + ], + "expires_on": "2026-04-30 03:43:58", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 140, + "created_on": "2026-01-29 23:43:09", + "modified_on": "2026-02-22 20:01:53", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "wss.defi-oracle.io", + "domain_names": [ + "wss.defi-oracle.io" + ], + "expires_on": "2026-04-30 03:44:57", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 62, + "created_on": "2026-01-16 16:57:41", + "modified_on": "2026-02-22 20:01:53", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.mim4u.org", + "domain_names": [ + "www.mim4u.org" + ], + "expires_on": "2026-04-16 20:59:17", + "meta": {} + }, + { + "id": 63, + "created_on": "2026-01-16 16:57:52", + "modified_on": "2026-02-22 20:01:53", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.phoenix.sankofa.nexus", + "domain_names": [ + "www.phoenix.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:59:28", + "meta": {} + }, + { + "id": 64, + "created_on": "2026-01-16 16:58:06", + "modified_on": "2026-02-22 20:01:53", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.sankofa.nexus", + "domain_names": [ + "www.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:59:41", + "meta": {} + } +] diff --git a/backups/npmplus/backup-20260223_030001/api/proxy_hosts.json b/backups/npmplus/backup-20260223_030001/api/proxy_hosts.json new file mode 100644 index 0000000..f60b669 --- /dev/null +++ b/backups/npmplus/backup-20260223_030001/api/proxy_hosts.json @@ -0,0 +1,1394 @@ +[ + { + "id": 37, + "created_on": "2026-02-07 00:42:23", + "modified_on": "2026-02-07 00:46:30", + "owner_user_id": 1, + "domain_names": [ + "cacti-alltra.d-bis.org" + ], + "forward_host": "192.168.11.177", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 146, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 38, + "created_on": "2026-02-07 00:42:24", + "modified_on": "2026-02-07 00:46:53", + "owner_user_id": 1, + "domain_names": [ + "cacti-hybx.d-bis.org" + ], + "forward_host": "192.168.11.251", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 147, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 41, + "created_on": "2026-02-07 20:41:16", + "modified_on": "2026-02-20 22:29:09", + "owner_user_id": 1, + "domain_names": [ + "codespaces.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 156, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 22, + "created_on": "2026-01-18 22:19:18", + "modified_on": "2026-01-29 22:52:50", + "owner_user_id": 1, + "domain_names": [ + "cross-all.defi-oracle.io" + ], + "forward_host": "192.168.11.211", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 134, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 49, + "created_on": "2026-02-20 22:27:16", + "modified_on": "2026-02-20 22:37:53", + "owner_user_id": 1, + "domain_names": [ + "dapp.d-bis.org" + ], + "forward_host": "192.168.11.58", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 162, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 13, + "created_on": "2026-01-16 14:41:02", + "modified_on": "2026-02-22 19:22:13", + "owner_user_id": 1, + "domain_names": [ + "dbis-admin.d-bis.org" + ], + "forward_host": "192.168.11.130", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 46, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 15, + "created_on": "2026-01-16 14:41:04", + "modified_on": "2026-02-22 19:22:34", + "owner_user_id": 1, + "domain_names": [ + "dbis-api-2.d-bis.org" + ], + "forward_host": "192.168.11.156", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 47, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 14, + "created_on": "2026-01-16 14:41:03", + "modified_on": "2026-02-22 19:22:27", + "owner_user_id": 1, + "domain_names": [ + "dbis-api.d-bis.org" + ], + "forward_host": "192.168.11.155", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 48, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 45, + "created_on": "2026-02-13 20:32:33", + "modified_on": "2026-02-13 20:32:33", + "owner_user_id": 1, + "domain_names": [ + "dbis.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3001, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 39, + "created_on": "2026-02-07 20:41:12", + "modified_on": "2026-02-20 22:29:57", + "owner_user_id": 1, + "domain_names": [ + "dev.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 157, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 8, + "created_on": "2026-01-16 14:40:58", + "modified_on": "2026-02-22 19:18:49", + "owner_user_id": 1, + "domain_names": [ + "explorer.d-bis.org" + ], + "forward_host": "192.168.11.140", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 145, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers (unsafe-eval for ethers.js v5)\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 30, + "created_on": "2026-01-31 00:13:09", + "modified_on": "2026-02-06 19:09:43", + "owner_user_id": 1, + "domain_names": [ + "explorer.defi-oracle.io" + ], + "forward_host": "192.168.11.140", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 144, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 40, + "created_on": "2026-02-07 20:41:14", + "modified_on": "2026-02-20 22:30:39", + "owner_user_id": 1, + "domain_names": [ + "gitea.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 158, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 46, + "created_on": "2026-02-13 20:32:35", + "modified_on": "2026-02-13 20:32:35", + "owner_user_id": 1, + "domain_names": [ + "iccc.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3002, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 17, + "created_on": "2026-01-16 14:41:05", + "modified_on": "2026-02-22 19:22:58", + "owner_user_id": 1, + "domain_names": [ + "mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 50, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 47, + "created_on": "2026-02-13 20:32:37", + "modified_on": "2026-02-13 20:32:37", + "owner_user_id": 1, + "domain_names": [ + "omnl.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3003, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 5, + "created_on": "2026-01-16 14:40:55", + "modified_on": "2026-01-16 17:01:49", + "owner_user_id": 1, + "domain_names": [ + "phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.50", + "forward_port": 4000, + "access_list_id": 0, + "certificate_id": 51, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 42, + "created_on": "2026-02-07 20:41:17", + "modified_on": "2026-02-20 22:31:27", + "owner_user_id": 1, + "domain_names": [ + "pve.ml110.d-bis.org" + ], + "forward_host": "192.168.11.10", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 159, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 43, + "created_on": "2026-02-07 20:41:19", + "modified_on": "2026-02-20 22:32:14", + "owner_user_id": 1, + "domain_names": [ + "pve.r630-01.d-bis.org" + ], + "forward_host": "192.168.11.11", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 160, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 44, + "created_on": "2026-02-07 20:41:21", + "modified_on": "2026-02-20 22:32:57", + "owner_user_id": 1, + "domain_names": [ + "pve.r630-02.d-bis.org" + ], + "forward_host": "192.168.11.12", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 161, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 32, + "created_on": "2026-02-07 00:42:16", + "modified_on": "2026-02-07 00:47:07", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra-2.d-bis.org" + ], + "forward_host": "192.168.11.173", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 148, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 33, + "created_on": "2026-02-07 00:42:17", + "modified_on": "2026-02-07 08:15:41", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "forward_host": "192.168.11.174", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 150, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 31, + "created_on": "2026-02-07 00:42:15", + "modified_on": "2026-02-07 08:15:53", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra.d-bis.org" + ], + "forward_host": "192.168.11.172", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 151, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 50, + "created_on": "2026-02-21 17:37:16", + "modified_on": "2026-02-22 19:21:47", + "owner_user_id": 1, + "domain_names": [ + "rpc-fireblocks.d-bis.org" + ], + "forward_host": "192.168.11.232", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 163, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 11, + "created_on": "2026-01-16 14:41:00", + "modified_on": "2026-02-22 19:19:23", + "owner_user_id": 1, + "domain_names": [ + "rpc-http-prv.d-bis.org" + ], + "forward_host": "192.168.11.211", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 52, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 9, + "created_on": "2026-01-16 14:40:59", + "modified_on": "2026-02-22 19:18:56", + "owner_user_id": 1, + "domain_names": [ + "rpc-http-pub.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 53, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 35, + "created_on": "2026-02-07 00:42:20", + "modified_on": "2026-02-07 08:16:06", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx-2.d-bis.org" + ], + "forward_host": "192.168.11.247", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 152, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 36, + "created_on": "2026-02-07 00:42:22", + "modified_on": "2026-02-07 08:16:19", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx-3.d-bis.org" + ], + "forward_host": "192.168.11.248", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 153, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 34, + "created_on": "2026-02-07 00:42:19", + "modified_on": "2026-02-07 08:16:32", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx.d-bis.org" + ], + "forward_host": "192.168.11.246", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 154, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 12, + "created_on": "2026-01-16 14:41:01", + "modified_on": "2026-02-22 19:19:35", + "owner_user_id": 1, + "domain_names": [ + "rpc-ws-prv.d-bis.org" + ], + "forward_host": "192.168.11.211", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 54, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 10, + "created_on": "2026-01-16 14:40:59", + "modified_on": "2026-02-22 19:19:06", + "owner_user_id": 1, + "domain_names": [ + "rpc-ws-pub.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 55, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 26, + "created_on": "2026-01-29 16:35:10", + "modified_on": "2026-02-22 19:20:19", + "owner_user_id": 1, + "domain_names": [ + "rpc.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 141, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\ndns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 24, + "created_on": "2026-01-29 15:38:44", + "modified_on": "2026-02-22 19:20:04", + "owner_user_id": 1, + "domain_names": [ + "rpc.defi-oracle.io" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 56, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 21, + "created_on": "2026-01-16 14:41:09", + "modified_on": "2026-02-22 19:19:47", + "owner_user_id": 1, + "domain_names": [ + "rpc.public-0138.defi-oracle.io" + ], + "forward_host": "192.168.11.240", + "forward_port": 443, + "access_list_id": 0, + "certificate_id": 56, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "https", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 27, + "created_on": "2026-01-29 16:35:11", + "modified_on": "2026-02-22 19:20:29", + "owner_user_id": 1, + "domain_names": [ + "rpc2.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 137, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 3, + "created_on": "2026-01-16 14:40:54", + "modified_on": "2026-01-16 17:01:32", + "owner_user_id": 1, + "domain_names": [ + "sankofa.nexus" + ], + "forward_host": "192.168.11.51", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 57, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "add_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 16, + "created_on": "2026-01-16 14:41:04", + "modified_on": "2026-02-22 19:22:42", + "owner_user_id": 1, + "domain_names": [ + "secure.d-bis.org" + ], + "forward_host": "192.168.11.130", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 58, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 19, + "created_on": "2026-01-16 14:41:07", + "modified_on": "2026-02-22 19:23:16", + "owner_user_id": 1, + "domain_names": [ + "secure.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 59, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 7, + "created_on": "2026-01-16 14:40:57", + "modified_on": "2026-01-16 17:02:09", + "owner_user_id": 1, + "domain_names": [ + "the-order.sankofa.nexus" + ], + "forward_host": "192.168.11.36", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 60, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 20, + "created_on": "2026-01-16 14:41:08", + "modified_on": "2026-02-22 19:23:27", + "owner_user_id": 1, + "domain_names": [ + "training.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 61, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 51, + "created_on": "2026-02-21 17:37:45", + "modified_on": "2026-02-22 19:22:04", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc-fireblocks.d-bis.org" + ], + "forward_host": "192.168.11.232", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 164, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 28, + "created_on": "2026-01-29 16:35:12", + "modified_on": "2026-02-22 19:20:49", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 138, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 29, + "created_on": "2026-01-29 16:35:12", + "modified_on": "2026-02-22 19:20:57", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc2.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 139, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 25, + "created_on": "2026-01-29 15:38:45", + "modified_on": "2026-02-22 19:20:12", + "owner_user_id": 1, + "domain_names": [ + "wss.defi-oracle.io" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 140, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 18, + "created_on": "2026-01-16 14:41:06", + "modified_on": "2026-01-16 17:02:14", + "owner_user_id": 1, + "domain_names": [ + "www.mim4u.org" + ], + "forward_host": "192.168.11.36", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 62, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 6, + "created_on": "2026-01-16 14:40:56", + "modified_on": "2026-01-16 17:02:17", + "owner_user_id": 1, + "domain_names": [ + "www.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.50", + "forward_port": 4000, + "access_list_id": 0, + "certificate_id": 63, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 4, + "created_on": "2026-01-16 14:40:55", + "modified_on": "2026-01-16 17:02:19", + "owner_user_id": 1, + "domain_names": [ + "www.sankofa.nexus" + ], + "forward_host": "192.168.11.51", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 64, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 48, + "created_on": "2026-02-13 20:32:39", + "modified_on": "2026-02-13 20:32:39", + "owner_user_id": 1, + "domain_names": [ + "xom.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3004, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + } +] diff --git a/backups/npmplus/backup-20260223_030001/certificates/cert_list.txt b/backups/npmplus/backup-20260223_030001/certificates/cert_list.txt new file mode 100644 index 0000000..e69de29 diff --git a/backups/npmplus/backup-20260223_030001/database/database.sql b/backups/npmplus/backup-20260223_030001/database/database.sql new file mode 100644 index 0000000..77149a3 --- /dev/null +++ b/backups/npmplus/backup-20260223_030001/database/database.sql @@ -0,0 +1 @@ +Database file not found diff --git a/backups/npmplus/backup-20260223_030001/database/database.sqlite b/backups/npmplus/backup-20260223_030001/database/database.sqlite new file mode 100644 index 0000000..e69de29 diff --git a/backups/npmplus/backup-20260223_030001/manifest.json b/backups/npmplus/backup-20260223_030001/manifest.json new file mode 100644 index 0000000..495e982 --- /dev/null +++ b/backups/npmplus/backup-20260223_030001/manifest.json @@ -0,0 +1,19 @@ +{ + "timestamp": "20260223_030001", + "backup_date": "2026-02-23T03:00:14-08:00", + "npmplus_vmid": "10233", + "npmplus_host": "192.168.11.11", + "npm_url": "https://192.168.11.167:81", + "backup_contents": { + "database": { + "sql_dump": "present", + "sqlite_file": "missing" + }, + "api_exports": { + "proxy_hosts": "present", + "certificates": "present", + "access_lists": "present" + }, + "certificate_files": "missing" + } +} diff --git a/backups/npmplus/backup-20260223_030001/volumes/volume_list.txt b/backups/npmplus/backup-20260223_030001/volumes/volume_list.txt new file mode 100644 index 0000000..4545150 --- /dev/null +++ b/backups/npmplus/backup-20260223_030001/volumes/volume_list.txt @@ -0,0 +1 @@ +DRIVER VOLUME NAME diff --git a/backups/npmplus/backup-20260223_235202.tar.gz b/backups/npmplus/backup-20260223_235202.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..6eb0b00321e791498a401c75fa1504029f992b43 GIT binary patch literal 5132 zcmV+n6!YsJiwFP!000001MOXFkJ~o7p3nIe!t_HDp!SHQD0@@{*lwHM4bUb3!9UP+z{4*K5@DfvQsB$A?K%kEIv?Mz0bF0URwd~bX?_9x#K^B%OJYeR@e z5MlcJ)kT|!O^*S_>?astoBz2wE&vA30AdFrcwqx%)6*7i^(ktOMV9-iWnF}E9!&)8 zWarQH7*~J)yCho7NY)Mx8hwB0(C_ciU(EME#v%Fs<NH)GyncSe|-1vw;wHf{QJW%|MTlx>-~?vzJ1a4Q<>vfN6q-3`EfWU zbkP5iCGo!Zkd6NVaCXK&#@LMiqa6SD!m=*&kaB(Q&*qn&b-4qD%kNo>5+;pjmw{9|8 zq!BxNo9FY)ySn0AxdU$qww`K|#5sxcjP_u!Lr>7>^v8Zi)_OzW7s%wQI)zN`S2>fKBv2=wPP*xnN-QzhfM- z@4xz`Uycy1dr0-aC*Oa72ae(YV;oJszwSMx-yiYcpV@x{+kF4y96v9=uf--6D^7B2 znk?eLSOCxDs2Tsf(z3S>(9Hi+>i^UvF!TQr4wdiE{;`h>sLA|ae1FL71;hWxIBLE> zwRPHy0W=!_RPna~a-kXjM>z!FpEGRta{~#-KX5Pw2lxGLrvCwm&GVb@l6;%P*F!=Ot$X7K1b4&o`@Gw zwC%l$qU3&bPsSO25R#7;^PAKU$j*~6hZ`Jai}_Mg-21I$m`!fUjI6wKtLNOjHP?l{ zv!91aoGl+{brZ@cqsk7&nQSpG5s@uVzF5A+7EXtXICWHUiqU>Jy?q=%XrL5g&?ZU; z2Bjy2QU}OT3Mux02V4nCp>075=4;Qs)<$U(kZkT#C~2V7wQE3%=oH=@rnr(!`A>Wt zoCa|=n%q**k@)5bP}xbU1KouIVOYJKM9CtUMt({zE8C3dM-E7whxA!k`|qru);+8r ze|u-;$u|;zO~1z97581A9I?nkaq^9egW=R3kntEzZ3jEkVB(M=cE+wB_yA4EzCE>z zOIRO1?p~j}KWnmc6GCATy_x%Qkfi?1kLlq2+YS3$f0E29+OvoHMjq84X(N@0Ek>f`8O%4;eey@1AlH$g81@#H9c(I{s})6XR8PTLIFX59vHG=53W5h6cPmJ!E4r% zMdI|;tu)Cprf&5EG7WnaC6kEs!$f^518q)a$T3sdDNSY9!l`UIK@C)=GBnsj;R^iu zTw@Z$!xrJ`!jph!71eT=s+i-p&mI8YJiN|^hyfB4u}gJprl~CxA_VY;7UgTk+WPRO z!0!3MER1!mUR0;5X`sAqqnGPhf${IGPh_%4!~D_u7ok{6v#+rq(6=o9Vg0A~Q<><| z`}{a3y$|yO3f9-lILYF0I{kWS`O&@qnEkNR?H^R%;oE=u@z=K>KEC_syZ5zS{`2Wm z@3%C`$%J*HeZUVE{ov$H@k%w_K9VUNEF|symPFy?k@m{+G@RsgDh=sS>fPUxxL3}y zyG&a|x6SKdF@?Mrstd|*yrZ0c6vPl}w`9E1N7jfoKNiQr$_2%E?&W~PN zWloL70=pjVoj*oI)Oox4ls+2Ydi!iRyWvk3e_b`9f*aE&^lQgds1?_^&x-%hHZu~0 ze*ImN@gM6e#0h=IA1oHZ>`_^*g+j49>-pu!+qwunRiJ@kFUylOTVG>IVD!Z^CU??H z$$uBLO~!vErg*=NGkV&hYX6*mte-#p^!a~(duzQ4rxtUjk~pw}gkcSG*SC3i=W+-32qHMzsV zzT~b&?YLEH9~x>m)NZKVQ2QBEyCc%uVGke{JVR6)mr;8~OC4(OKP0nWK<@hU+l0j7 zLqGH5Z^_i}$K+v=se2)vdZq`Bncl7<`r`%CP9`o>k3CI?AQJn#H=$dpLvR(k#rlc` z1zqq^r)}_+A%!OuOdycl9wVBlPQjl7n*-j$`=>&5;&JgB~2R zeknuWI)1tFJv2q%ESx!uM)MJBafKbO#MlvImZ`3%V7H@^uVA;6vbP{@&0mljkHI;3 z4A^%nbq&1;X4*jv)0ix+m@MMO*c*jopsbo`yPK0)934S5L5=4PqnaE@HBm~NwLL7> zOv;u6&jy~OZ7=VMw>qoY(XpB_r~=%in1u5v_{Ob<-oJG$swIjmZc;0)>;ox9X;T6!fTUMqLx?WolZ3)0a8!a`bAO| zcL`LP^~+igJ%H(y*8)(H7EtTF>3TqII}B@px))HT1tgb1m8A!)fvR71YXej*nAWOW zdN4h%7v8{B2vaQ1t%QI@fRIXYxH5|c(7Asfm`=l#6rWh9)+t2oLe)hEs;2{0AYxQL z;mTHmDnsjDjLKxuo2NPpJO%YOb%2VGThY)2HcepD1U64Ouz8O3E?TwEC#^_h7v%!o zeUer-?7kT5usdv*-H)q<7-ft}im>ed!KyJ=@)j-XF&gTJB}& z)UKS+bBCNpHF5*f5~kuMWgD2vY6q=h3ii`N7)*7X%h0JUnXd;^;|e(?m`Y>$OXsq5 z;r|Mz8_$_8OtnB-R~A_lq^Gg!-+;9I9FiS!*8Vza!pX{Cr@uUxf%HB*gtxAF!pV_Q zYV0{<&l!8p*mEtDySVgF19#nu-1oER7`eCatkWR(mP_gxayR5|$lZ|pQOO;OydcGn zmCRzq9#D(4Lwi3jNcSNa;5_df@v7`?>y6bof1CC(8Qcfjk5;^$3LCT7LqpF|+$+oG zcGc1vvzj~6wj4V>k?pEau&T;=qFglxOxf(%D_yZqZ4Rnu(p#gUHsWgwpE^$Snkv*n4Am}-4;$rNKlh?qMc3ZbS zEH*Q^+G6^VXU&>ob>mX25_k39N(a-ojLLEPDu*dxB?%pgy^9*VdOP|QQhY?6RgtL0 z?JBCP`RkJi*VEW+#%4P=0)6&2+j-Ku(gGg96$TO0I^xzGYtnkhW$`O35+0G&O<8=y z?^y*6oTup&k>3(ZAe1LGOOvD8)b-{wMRj>f6SOe~ zz%!j7i~(?l1^`q_38n^sbc^kk0ia))JWuJLDPwkQ0#uh4H70;D0iHX<8x!Ds=80BK z04%PHxGp&7C~upnpQm`A^$%NfPNy2RS;KltI?YgkRz49$Ru5pEh@xMWs6=b`OPm0D z4x3M#RFsoXMS5R_juo03Oou@xK#k){$7NjUDdNwzXn~%=y zAPZ77hNtr!wjwga^W=vo5Noy@Z=JaCHy4Z1-z)6?{$9sX*JcF9R8Te%7~`Ka5ty@% zz$hiwQY%ND()H~jO6jMx_xF*vaxesM2;LC9A^5iU{#GP-u}RGnyuLS@68tGFz&dig z#1Ok7c0=rj*xM#{kv9hR0AianBj_PnU6YEIO_}{6nf2-adjYxISB0gVLf&g$~KQ14Ee($p?wK z(CeyO98O4~U=~4SX6roNhgzbI*7Vv^L8(&543(|dz&(3t*^cK7cz4K3m#d73I-=!i zoB$ovr2u#KT2T_8Xnz)=@P_;rGD6{D@djVewjlH%{TR|@tfwto5nd9IZ0=LVsDbdR z`bdRW{jy@=iHGj;dPC2VE}c0L@{T4v%+h`6^CN1+I&F9j)+ahDo%~%zW=nDMjZ$Vy zxzgdo$KC65_pd9^{HAfbjrt?W6K+axO(oieyH^#NVHE8cDwHZd5ZVj(Cq>F`&X^4G zb^WBMcY4S!cCB?hpg38%qTQ8Nl!07+6dhHFfj^(Clf_PJb($FRJ4PCsI3b$Yha!Zk zY#F|C*SgKCPH&<)SY4tJ!7t>n;La+-2ONNqO4V$*41ff2<4J3g$tD1*u&C2pAL=kMmAYpH)Xur18&<{!|Epm=Y3cmi!&~k_Os2Q z__%n#33JlGO}^V)U2EYBC>VVIRq&1F#h9oigFPr+eR&voZrNwB1*mx{+@mGpzu)Mwy`6~Ltc2MQa7 zA6$S)OMpmIfX)*aX^jRg)-0F+hlR_vBev~8fPgJK=gW?W1t^}b)&lG*XKy149r0-j z4=CDiu4psARV_{jcjg1DEzYSRKzUKm+8G~$g0s{Taj+;4hjSsw%Um5!hHQCJZ=N;? zf!6er%8zp*Jk86gmY;k>$wGdTJt2-Dzr|Qbep|ho$PcN>4+sIsF<_TU49h=ms=_?! z(}V$46&NA<*1~fY_LD!b@EXp(Px>?wo}-w8h$SJzmGGc6<@>P0Yc4uX!C|#|S17kN z<+-xbYX_Cveb#)!c+#g4-6_gWTvc){JJ7N0nobr^`ZSRpRyEhe;SQFAe9attxI4CM zB(-MZqOS)Ks|Wm)-&WUbHGie5`hV#PD*r*>h0I8L^E)e@5GT16C4OLWYxk_LmshNw z#8n<;#hSixl3zvP9l46()U*SdU;<^+;(Vt^bxHzS>#kmndimaU0;8Vmx3u*;V;r+&3pMoSBosY zV$0y8tD?~rYg7K(XTMrG$@1k3SG&pDb)_A>#A)%k)tso5E$#9e<s3Tsh*cMPGJjq6a zLb+WlhcR5SD`n}4@6MGX+9^vSLFG-hg#P$pMFhS^d6RD0M3pxO@c!uzMA=k+S_&Mh z(0Gjk*GlRDlI}gkP)4!Skxue-KO!ZV=@|;B!t-fx)=r9wSSMNH40RTusMuLY3N-Ov zJVK;7d>qgqtwp2>>q&5`TURFO_8u`ZjMZ-_BT?8CO;Taz1Sc(dwWGsHOKb6f;=Tb6(RWm literal 0 HcmV?d00001 diff --git a/backups/npmplus/backup-20260223_235202/api/access_lists.json b/backups/npmplus/backup-20260223_235202/api/access_lists.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/backups/npmplus/backup-20260223_235202/api/access_lists.json @@ -0,0 +1 @@ +[] diff --git a/backups/npmplus/backup-20260223_235202/api/certificates.json b/backups/npmplus/backup-20260223_235202/api/certificates.json new file mode 100644 index 0000000..7b8d732 --- /dev/null +++ b/backups/npmplus/backup-20260223_235202/api/certificates.json @@ -0,0 +1,685 @@ +[ + { + "id": 146, + "created_on": "2026-02-07 00:46:21", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cacti-alltra.d-bis.org", + "domain_names": [ + "cacti-alltra.d-bis.org" + ], + "expires_on": "2026-05-08 04:47:55", + "meta": {} + }, + { + "id": 147, + "created_on": "2026-02-07 00:46:43", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cacti-hybx.d-bis.org", + "domain_names": [ + "cacti-hybx.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:19", + "meta": {} + }, + { + "id": 155, + "created_on": "2026-02-20 22:27:52", + "modified_on": "2026-02-20 22:27:52", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "codespaces.d-bis.org", + "domain_names": [ + "codespaces.d-bis.org" + ], + "expires_on": "2026-02-20 22:27:52", + "meta": {} + }, + { + "id": 156, + "created_on": "2026-02-20 22:28:48", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "codespaces.d-bis.org", + "domain_names": [ + "codespaces.d-bis.org" + ], + "expires_on": "2026-05-22 02:30:34", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n", + "letsencrypt_agree": true + } + }, + { + "id": 134, + "created_on": "2026-01-29 22:52:44", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cross-all.defi-oracle.io", + "domain_names": [ + "cross-all.defi-oracle.io" + ], + "expires_on": "2026-04-30 02:54:15", + "meta": {} + }, + { + "id": 162, + "created_on": "2026-02-20 22:36:34", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dapp.d-bis.org", + "domain_names": [ + "dapp.d-bis.org" + ], + "expires_on": "2026-05-22 02:38:20", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 46, + "created_on": "2026-01-16 16:54:36", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-admin.d-bis.org", + "domain_names": [ + "dbis-admin.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:11", + "meta": {} + }, + { + "id": 47, + "created_on": "2026-01-16 16:54:47", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-api-2.d-bis.org", + "domain_names": [ + "dbis-api-2.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:22", + "meta": {} + }, + { + "id": 48, + "created_on": "2026-01-16 16:54:58", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-api.d-bis.org", + "domain_names": [ + "dbis-api.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:33", + "meta": {} + }, + { + "id": 157, + "created_on": "2026-02-20 22:29:37", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dev.d-bis.org", + "domain_names": [ + "dev.d-bis.org" + ], + "expires_on": "2026-05-22 02:31:22", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 145, + "created_on": "2026-02-06 19:14:04", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "explorer.d-bis.org", + "domain_names": [ + "explorer.d-bis.org" + ], + "expires_on": "2026-05-07 23:15:36", + "meta": { + "letsencrypt_agree": true, + "dns_challenge": true, + "nginx_online": true, + "nginx_err": null, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0" + } + }, + { + "id": 144, + "created_on": "2026-02-06 19:05:50", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "explorer.defi-oracle.io", + "domain_names": [ + "explorer.defi-oracle.io" + ], + "expires_on": "2026-05-07 23:07:35", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 158, + "created_on": "2026-02-20 22:30:18", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "gitea.d-bis.org", + "domain_names": [ + "gitea.d-bis.org" + ], + "expires_on": "2026-05-22 02:32:04", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 50, + "created_on": "2026-01-16 16:55:25", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "mim4u.org", + "domain_names": [ + "mim4u.org" + ], + "expires_on": "2026-04-16 20:57:01", + "meta": {} + }, + { + "id": 51, + "created_on": "2026-01-16 16:55:37", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "phoenix.sankofa.nexus", + "domain_names": [ + "phoenix.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:57:08", + "meta": {} + }, + { + "id": 159, + "created_on": "2026-02-20 22:31:08", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.ml110.d-bis.org", + "domain_names": [ + "pve.ml110.d-bis.org" + ], + "expires_on": "2026-05-22 02:32:54", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 160, + "created_on": "2026-02-20 22:31:51", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.r630-01.d-bis.org", + "domain_names": [ + "pve.r630-01.d-bis.org" + ], + "expires_on": "2026-05-22 02:33:37", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 161, + "created_on": "2026-02-20 22:32:35", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.r630-02.d-bis.org", + "domain_names": [ + "pve.r630-02.d-bis.org" + ], + "expires_on": "2026-05-22 02:34:21", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 148, + "created_on": "2026-02-07 00:46:56", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-2.d-bis.org", + "domain_names": [ + "rpc-alltra-2.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:31", + "meta": {} + }, + { + "id": 149, + "created_on": "2026-02-07 00:47:10", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-3.d-bis.org", + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:46", + "meta": {} + }, + { + "id": 150, + "created_on": "2026-02-07 08:15:35", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-3.d-bis.org", + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:06", + "meta": {} + }, + { + "id": 151, + "created_on": "2026-02-07 08:15:43", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra.d-bis.org", + "domain_names": [ + "rpc-alltra.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:18", + "meta": {} + }, + { + "id": 163, + "created_on": "2026-02-21 17:45:18", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-fireblocks.d-bis.org", + "domain_names": [ + "rpc-fireblocks.d-bis.org" + ], + "expires_on": "2026-05-22 21:47:15", + "meta": {} + }, + { + "id": 52, + "created_on": "2026-01-16 16:55:45", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-http-prv.d-bis.org", + "domain_names": [ + "rpc-http-prv.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:20", + "meta": {} + }, + { + "id": 53, + "created_on": "2026-01-16 16:55:57", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-http-pub.d-bis.org", + "domain_names": [ + "rpc-http-pub.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:30", + "meta": {} + }, + { + "id": 152, + "created_on": "2026-02-07 08:15:56", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx-2.d-bis.org", + "domain_names": [ + "rpc-hybx-2.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:31", + "meta": {} + }, + { + "id": 153, + "created_on": "2026-02-07 08:16:09", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx-3.d-bis.org", + "domain_names": [ + "rpc-hybx-3.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:45", + "meta": {} + }, + { + "id": 154, + "created_on": "2026-02-07 08:16:22", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx.d-bis.org", + "domain_names": [ + "rpc-hybx.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:58", + "meta": {} + }, + { + "id": 54, + "created_on": "2026-01-16 16:56:06", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-ws-prv.d-bis.org", + "domain_names": [ + "rpc-ws-prv.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:38", + "meta": {} + }, + { + "id": 55, + "created_on": "2026-01-16 16:56:16", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-ws-pub.d-bis.org", + "domain_names": [ + "rpc-ws-pub.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:51", + "meta": {} + }, + { + "id": 141, + "created_on": "2026-01-30 09:33:59", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc.d-bis.org", + "domain_names": [ + "rpc.d-bis.org" + ], + "expires_on": "2026-04-30 13:35:45", + "meta": { + "letsencrypt_agree": true, + "dns_challenge": true, + "nginx_online": false, + "nginx_err": "nginx: [emerg] cannot load certificate \"/data/tls/certbot/live/npm-135/fullchain.pem\": BIO_new_file() failed (SSL: error:80000002:system library::No such file or directory:calling fopen(/data/tls/certbot/live/npm-135/fullchain.pem, r) error:10000080:BIO routines::no such file)\nnginx: configuration file /usr/local/nginx/conf/nginx.conf test failed", + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\ndns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0" + } + }, + { + "id": 56, + "created_on": "2026-01-16 16:56:30", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc.public-0138.defi-oracle.io", + "domain_names": [ + "rpc.public-0138.defi-oracle.io" + ], + "expires_on": "2026-04-16 20:58:05", + "meta": {} + }, + { + "id": 137, + "created_on": "2026-01-29 23:39:01", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc2.d-bis.org", + "domain_names": [ + "rpc2.d-bis.org" + ], + "expires_on": "2026-04-30 03:40:50", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 57, + "created_on": "2026-01-16 16:56:41", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "sankofa.nexus", + "domain_names": [ + "sankofa.nexus" + ], + "expires_on": "2026-04-16 20:58:17", + "meta": {} + }, + { + "id": 58, + "created_on": "2026-01-16 16:56:53", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "secure.d-bis.org", + "domain_names": [ + "secure.d-bis.org" + ], + "expires_on": "2026-04-16 20:58:28", + "meta": {} + }, + { + "id": 59, + "created_on": "2026-01-16 16:57:05", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "secure.mim4u.org", + "domain_names": [ + "secure.mim4u.org" + ], + "expires_on": "2026-04-16 20:58:40", + "meta": {} + }, + { + "id": 60, + "created_on": "2026-01-16 16:57:17", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "the-order.sankofa.nexus", + "domain_names": [ + "the-order.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:58:53", + "meta": {} + }, + { + "id": 61, + "created_on": "2026-01-16 16:57:31", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "training.mim4u.org", + "domain_names": [ + "training.mim4u.org" + ], + "expires_on": "2026-04-16 20:59:06", + "meta": {} + }, + { + "id": 164, + "created_on": "2026-02-21 17:46:22", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc-fireblocks.d-bis.org", + "domain_names": [ + "ws.rpc-fireblocks.d-bis.org" + ], + "expires_on": "2026-05-22 21:48:21", + "meta": {} + }, + { + "id": 138, + "created_on": "2026-01-29 23:41:20", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc.d-bis.org", + "domain_names": [ + "ws.rpc.d-bis.org" + ], + "expires_on": "2026-04-30 03:43:05", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 139, + "created_on": "2026-01-29 23:42:13", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc2.d-bis.org", + "domain_names": [ + "ws.rpc2.d-bis.org" + ], + "expires_on": "2026-04-30 03:43:58", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 140, + "created_on": "2026-01-29 23:43:09", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "wss.defi-oracle.io", + "domain_names": [ + "wss.defi-oracle.io" + ], + "expires_on": "2026-04-30 03:44:57", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 62, + "created_on": "2026-01-16 16:57:41", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.mim4u.org", + "domain_names": [ + "www.mim4u.org" + ], + "expires_on": "2026-04-16 20:59:17", + "meta": {} + }, + { + "id": 63, + "created_on": "2026-01-16 16:57:52", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.phoenix.sankofa.nexus", + "domain_names": [ + "www.phoenix.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:59:28", + "meta": {} + }, + { + "id": 64, + "created_on": "2026-01-16 16:58:06", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.sankofa.nexus", + "domain_names": [ + "www.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:59:41", + "meta": {} + } +] diff --git a/backups/npmplus/backup-20260223_235202/api/proxy_hosts.json b/backups/npmplus/backup-20260223_235202/api/proxy_hosts.json new file mode 100644 index 0000000..dce5b13 --- /dev/null +++ b/backups/npmplus/backup-20260223_235202/api/proxy_hosts.json @@ -0,0 +1,1394 @@ +[ + { + "id": 37, + "created_on": "2026-02-07 00:42:23", + "modified_on": "2026-02-07 00:46:30", + "owner_user_id": 1, + "domain_names": [ + "cacti-alltra.d-bis.org" + ], + "forward_host": "192.168.11.177", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 146, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 38, + "created_on": "2026-02-07 00:42:24", + "modified_on": "2026-02-07 00:46:53", + "owner_user_id": 1, + "domain_names": [ + "cacti-hybx.d-bis.org" + ], + "forward_host": "192.168.11.251", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 147, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 41, + "created_on": "2026-02-07 20:41:16", + "modified_on": "2026-02-20 22:29:09", + "owner_user_id": 1, + "domain_names": [ + "codespaces.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 156, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 22, + "created_on": "2026-01-18 22:19:18", + "modified_on": "2026-01-29 22:52:50", + "owner_user_id": 1, + "domain_names": [ + "cross-all.defi-oracle.io" + ], + "forward_host": "192.168.11.211", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 134, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 49, + "created_on": "2026-02-20 22:27:16", + "modified_on": "2026-02-20 22:37:53", + "owner_user_id": 1, + "domain_names": [ + "dapp.d-bis.org" + ], + "forward_host": "192.168.11.58", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 162, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 13, + "created_on": "2026-01-16 14:41:02", + "modified_on": "2026-02-22 19:22:13", + "owner_user_id": 1, + "domain_names": [ + "dbis-admin.d-bis.org" + ], + "forward_host": "192.168.11.130", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 46, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 15, + "created_on": "2026-01-16 14:41:04", + "modified_on": "2026-02-22 19:22:34", + "owner_user_id": 1, + "domain_names": [ + "dbis-api-2.d-bis.org" + ], + "forward_host": "192.168.11.156", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 47, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 14, + "created_on": "2026-01-16 14:41:03", + "modified_on": "2026-02-22 19:22:27", + "owner_user_id": 1, + "domain_names": [ + "dbis-api.d-bis.org" + ], + "forward_host": "192.168.11.155", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 48, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 45, + "created_on": "2026-02-13 20:32:33", + "modified_on": "2026-02-13 20:32:33", + "owner_user_id": 1, + "domain_names": [ + "dbis.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3001, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 39, + "created_on": "2026-02-07 20:41:12", + "modified_on": "2026-02-20 22:29:57", + "owner_user_id": 1, + "domain_names": [ + "dev.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 157, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 8, + "created_on": "2026-01-16 14:40:58", + "modified_on": "2026-02-24 02:50:57", + "owner_user_id": 1, + "domain_names": [ + "explorer.d-bis.org" + ], + "forward_host": "192.168.11.140", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 145, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers (unsafe-eval for ethers.js v5)\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 30, + "created_on": "2026-01-31 00:13:09", + "modified_on": "2026-02-06 19:09:43", + "owner_user_id": 1, + "domain_names": [ + "explorer.defi-oracle.io" + ], + "forward_host": "192.168.11.140", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 144, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 40, + "created_on": "2026-02-07 20:41:14", + "modified_on": "2026-02-20 22:30:39", + "owner_user_id": 1, + "domain_names": [ + "gitea.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 158, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 46, + "created_on": "2026-02-13 20:32:35", + "modified_on": "2026-02-13 20:32:35", + "owner_user_id": 1, + "domain_names": [ + "iccc.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3002, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 17, + "created_on": "2026-01-16 14:41:05", + "modified_on": "2026-02-22 19:22:58", + "owner_user_id": 1, + "domain_names": [ + "mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 50, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 47, + "created_on": "2026-02-13 20:32:37", + "modified_on": "2026-02-13 20:32:37", + "owner_user_id": 1, + "domain_names": [ + "omnl.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3003, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 5, + "created_on": "2026-01-16 14:40:55", + "modified_on": "2026-01-16 17:01:49", + "owner_user_id": 1, + "domain_names": [ + "phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.50", + "forward_port": 4000, + "access_list_id": 0, + "certificate_id": 51, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 42, + "created_on": "2026-02-07 20:41:17", + "modified_on": "2026-02-20 22:31:27", + "owner_user_id": 1, + "domain_names": [ + "pve.ml110.d-bis.org" + ], + "forward_host": "192.168.11.10", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 159, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 43, + "created_on": "2026-02-07 20:41:19", + "modified_on": "2026-02-20 22:32:14", + "owner_user_id": 1, + "domain_names": [ + "pve.r630-01.d-bis.org" + ], + "forward_host": "192.168.11.11", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 160, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 44, + "created_on": "2026-02-07 20:41:21", + "modified_on": "2026-02-20 22:32:57", + "owner_user_id": 1, + "domain_names": [ + "pve.r630-02.d-bis.org" + ], + "forward_host": "192.168.11.12", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 161, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 32, + "created_on": "2026-02-07 00:42:16", + "modified_on": "2026-02-07 00:47:07", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra-2.d-bis.org" + ], + "forward_host": "192.168.11.173", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 148, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 33, + "created_on": "2026-02-07 00:42:17", + "modified_on": "2026-02-07 08:15:41", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "forward_host": "192.168.11.174", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 150, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 31, + "created_on": "2026-02-07 00:42:15", + "modified_on": "2026-02-07 08:15:53", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra.d-bis.org" + ], + "forward_host": "192.168.11.172", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 151, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 50, + "created_on": "2026-02-21 17:37:16", + "modified_on": "2026-02-22 19:21:47", + "owner_user_id": 1, + "domain_names": [ + "rpc-fireblocks.d-bis.org" + ], + "forward_host": "192.168.11.232", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 163, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 11, + "created_on": "2026-01-16 14:41:00", + "modified_on": "2026-02-22 19:19:23", + "owner_user_id": 1, + "domain_names": [ + "rpc-http-prv.d-bis.org" + ], + "forward_host": "192.168.11.211", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 52, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 9, + "created_on": "2026-01-16 14:40:59", + "modified_on": "2026-02-24 02:51:49", + "owner_user_id": 1, + "domain_names": [ + "rpc-http-pub.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 53, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 35, + "created_on": "2026-02-07 00:42:20", + "modified_on": "2026-02-07 08:16:06", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx-2.d-bis.org" + ], + "forward_host": "192.168.11.247", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 152, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 36, + "created_on": "2026-02-07 00:42:22", + "modified_on": "2026-02-07 08:16:19", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx-3.d-bis.org" + ], + "forward_host": "192.168.11.248", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 153, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 34, + "created_on": "2026-02-07 00:42:19", + "modified_on": "2026-02-07 08:16:32", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx.d-bis.org" + ], + "forward_host": "192.168.11.246", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 154, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 12, + "created_on": "2026-01-16 14:41:01", + "modified_on": "2026-02-22 19:19:35", + "owner_user_id": 1, + "domain_names": [ + "rpc-ws-prv.d-bis.org" + ], + "forward_host": "192.168.11.211", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 54, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 10, + "created_on": "2026-01-16 14:40:59", + "modified_on": "2026-02-22 19:19:06", + "owner_user_id": 1, + "domain_names": [ + "rpc-ws-pub.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 55, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 26, + "created_on": "2026-01-29 16:35:10", + "modified_on": "2026-02-22 19:20:19", + "owner_user_id": 1, + "domain_names": [ + "rpc.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 141, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\ndns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 24, + "created_on": "2026-01-29 15:38:44", + "modified_on": "2026-02-22 19:20:04", + "owner_user_id": 1, + "domain_names": [ + "rpc.defi-oracle.io" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 56, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 21, + "created_on": "2026-01-16 14:41:09", + "modified_on": "2026-02-22 19:19:47", + "owner_user_id": 1, + "domain_names": [ + "rpc.public-0138.defi-oracle.io" + ], + "forward_host": "192.168.11.240", + "forward_port": 443, + "access_list_id": 0, + "certificate_id": 56, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "https", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 27, + "created_on": "2026-01-29 16:35:11", + "modified_on": "2026-02-22 19:20:29", + "owner_user_id": 1, + "domain_names": [ + "rpc2.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 137, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 3, + "created_on": "2026-01-16 14:40:54", + "modified_on": "2026-01-16 17:01:32", + "owner_user_id": 1, + "domain_names": [ + "sankofa.nexus" + ], + "forward_host": "192.168.11.51", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 57, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "add_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 16, + "created_on": "2026-01-16 14:41:04", + "modified_on": "2026-02-22 19:22:42", + "owner_user_id": 1, + "domain_names": [ + "secure.d-bis.org" + ], + "forward_host": "192.168.11.130", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 58, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 19, + "created_on": "2026-01-16 14:41:07", + "modified_on": "2026-02-22 19:23:16", + "owner_user_id": 1, + "domain_names": [ + "secure.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 59, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 7, + "created_on": "2026-01-16 14:40:57", + "modified_on": "2026-01-16 17:02:09", + "owner_user_id": 1, + "domain_names": [ + "the-order.sankofa.nexus" + ], + "forward_host": "192.168.11.36", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 60, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 20, + "created_on": "2026-01-16 14:41:08", + "modified_on": "2026-02-22 19:23:27", + "owner_user_id": 1, + "domain_names": [ + "training.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 61, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 51, + "created_on": "2026-02-21 17:37:45", + "modified_on": "2026-02-22 19:22:04", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc-fireblocks.d-bis.org" + ], + "forward_host": "192.168.11.232", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 164, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 28, + "created_on": "2026-01-29 16:35:12", + "modified_on": "2026-02-22 19:20:49", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 138, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 29, + "created_on": "2026-01-29 16:35:12", + "modified_on": "2026-02-22 19:20:57", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc2.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 139, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 25, + "created_on": "2026-01-29 15:38:45", + "modified_on": "2026-02-22 19:20:12", + "owner_user_id": 1, + "domain_names": [ + "wss.defi-oracle.io" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 140, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 18, + "created_on": "2026-01-16 14:41:06", + "modified_on": "2026-01-16 17:02:14", + "owner_user_id": 1, + "domain_names": [ + "www.mim4u.org" + ], + "forward_host": "192.168.11.36", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 62, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 6, + "created_on": "2026-01-16 14:40:56", + "modified_on": "2026-01-16 17:02:17", + "owner_user_id": 1, + "domain_names": [ + "www.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.50", + "forward_port": 4000, + "access_list_id": 0, + "certificate_id": 63, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 4, + "created_on": "2026-01-16 14:40:55", + "modified_on": "2026-01-16 17:02:19", + "owner_user_id": 1, + "domain_names": [ + "www.sankofa.nexus" + ], + "forward_host": "192.168.11.51", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 64, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 48, + "created_on": "2026-02-13 20:32:39", + "modified_on": "2026-02-13 20:32:39", + "owner_user_id": 1, + "domain_names": [ + "xom.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3004, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + } +] diff --git a/backups/npmplus/backup-20260223_235202/certificates/cert_list.txt b/backups/npmplus/backup-20260223_235202/certificates/cert_list.txt new file mode 100644 index 0000000..e69de29 diff --git a/backups/npmplus/backup-20260223_235202/database/database.sql b/backups/npmplus/backup-20260223_235202/database/database.sql new file mode 100644 index 0000000..77149a3 --- /dev/null +++ b/backups/npmplus/backup-20260223_235202/database/database.sql @@ -0,0 +1 @@ +Database file not found diff --git a/backups/npmplus/backup-20260223_235202/database/database.sqlite b/backups/npmplus/backup-20260223_235202/database/database.sqlite new file mode 100644 index 0000000..e69de29 diff --git a/backups/npmplus/backup-20260223_235202/manifest.json b/backups/npmplus/backup-20260223_235202/manifest.json new file mode 100644 index 0000000..c8ee538 --- /dev/null +++ b/backups/npmplus/backup-20260223_235202/manifest.json @@ -0,0 +1,19 @@ +{ + "timestamp": "20260223_235202", + "backup_date": "2026-02-23T23:52:58-08:00", + "npmplus_vmid": "10233", + "npmplus_host": "192.168.11.11", + "npm_url": "https://192.168.11.167:81", + "backup_contents": { + "database": { + "sql_dump": "present", + "sqlite_file": "missing" + }, + "api_exports": { + "proxy_hosts": "present", + "certificates": "present", + "access_lists": "present" + }, + "certificate_files": "missing" + } +} diff --git a/backups/npmplus/backup-20260223_235202/volumes/volume_list.txt b/backups/npmplus/backup-20260223_235202/volumes/volume_list.txt new file mode 100644 index 0000000..4545150 --- /dev/null +++ b/backups/npmplus/backup-20260223_235202/volumes/volume_list.txt @@ -0,0 +1 @@ +DRIVER VOLUME NAME diff --git a/backups/npmplus/backup-20260224_021431.tar.gz b/backups/npmplus/backup-20260224_021431.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..a7c295b5a6c82e8faa95e8ef8d1a667a51d9a27e GIT binary patch literal 5129 zcmV+k6!z;MiwFP!000001MOXHkJ~o3p3nIe#PmZFp!SHQBzsf@*lwHM4bUb3!9UP+!8T=c(RQt}JOmPm@0ExSWul1VI5mX01iJm>K6oUuRowwU*jguy{_m1#F(X+!IB53%5qNd&p;?yLRER1h1i_?FWtuFm}I3f@8B;~#duxlj`kHzz3m6x87G!LiY zgo>`Zfj^m$EGy>NCk>u_Id_%fF0-xM{PV@1TC80&{#OEQMFDK2|3S#~Ki4w)-%$?P z`(OQ|Uycy1?~v+$JMVwsxVGW{V;oK1zwUQP-#^}Y|CZ~R_kWDz=jHnaY*GPnl7nfo zhy!B*Jd>kl{PRl7-a0_D`F~L8|Ijt_|1l1g_s{;bj|-^T{7>IMy&G)!|0qYz`=_=} zdussA$3J!vGUNXkhv5BlhV6cCAmR9jwnM?O_5KGCBQySwaeR3JR!)<`SAz#DheJvz z`3IvU<{duP09cl1BM;%F1LJa*1azjTYw3E}TD45>W0H;*8U3sHF1Y+WNM?Q*k79pT zxHZ14JtzJo4|{$T<*DBfdgCzbC+X5D^ZT;zG)eFMG^q3^4F;E6t(fzMwi;S1m(IrZ zQr?nP;chAK)pnPsvMd_W>rDvzI8PU3)y1FOhVjja#Qr!cPEP$OTb&(8$>bYzA4N%6 zxOw=KesJf<^n%QjH4SgrbF8IHa-a7$#W!L6Kt&yeF?sU+>vJSc>4|s|MNhp~QIy<| z?#Vc#H$w8!Vt$kQ0ol3}=5Rx!Y%yO-ihI754715CnUR%uZgroVr{=oQXZG_jiL>Pm zt-gdZ%BZqKaVA@gOGISLlP{J}@dT$sMV#8IICb!TIK6!wKWLy7Ij~KX4h%|92&FcZ zp%hWKl1fzom^-B9dn$o}`cSeB|Gx zq=o~I#t;0tJqhB=@7471VSGUq6 z%b2>=56Cp^QIt#~(hn2$sSLI`m0{aVWv4WiT??nO87EmBPN!clfgj!bkJ%4f-Tp!K9lrgiAAf!O;p4l1zI$KW1vPl}w`H#TMMV$Fl(hG}Gz4<@6^P`ubjHv-^Vb`O* z^T&vYIzMebrMJenetI^X-S8)iPghN-;KsBGecLe=YQ;6~v*It>W=4Y0um6^0{KxtV zaYFC$2f$V^dsJ3yp-`;OdVcxxo?L{UD$u~Nm*q*Ct*@~pF#6yblRN39*o(Yeg5Cy-hx-*6fkEhi31QMB#U3>U}+hEFn`TDzNdKdz~|dA z1MJ#iO0spAJOLT|{q(BegZGSs!Ng~mD;S54jnBXS0>(-32#BAB(WB8^#F`6q6scY2 zDq2#z>)G~x)IJY;NQc@Tw@oX&ZC{ZgcSG)m+zq)Om)vbda+j@FEy>-XKl_rq7PULA zQv1+QyPv_5(V*|Y6 z^kk+%0+Qd-&-;I5;Ldq%Y!PFNoRBSIrnP4~t+i)q)y-;pp|qB8Qp1o1$U@A89@d4@ z(&>*yD0;TGowb?N^g@tYp4m<#1nC50JkAj2wg~3DK_^`XECZM<4{Jww+=MyN+0xLq zNmuD6HYS~!`<{_Ww~ld=xfva0H>36nQaG7Rj^JiQjj6)884u)Ugrfa+{Q9K~earRB z>pcR%XW`6VG@6fai#zO`N{k(G%`(;X6l`}?@)c}%QuY?4t@#U5<1sh~j{$p6rLLj3 zf|+)(hG|TeR!kQ0X6%i^F;G@bwB60gERK$#n&8IshEYupq?#y&&03x#)=bKl1J8n< zt!*#wiMKkd+19a|9asgpgE@svaFtO{PFp=O!ByuNTqW9g%zHy+s>RY93O%H)TFmcA ze-=S#=`3Z}`}-}oF}FkKx{BP5N7Q&kpU+lUTeKCHrv}-2;F1~;x1^#&4XKMQsz>UO zLw!C19dd9xHZ=@67;@;G97OwVIC4Nxl^paV;5Ou-wVM*POAeK0p&5JZ4ye<@{YXI$z~)#>d9KaSgPVKfhx0p zS<4~YHEP2afQq$%TIWsI18UpLum-4m0acnnatTyfc)%K{`dPO&K-Ge2t-7TL)8l&K z4NQeFb;Pli2(lF*tdbnAh+?t!$#cqJIt^1&ykebPrwF$TRTmqmo(@!@h*9}~D@y^Y z)Oxi&<$s91lm-6kty#>cZlm*`zh~_;|DGGGO}xT zPUyKqP9qz+foTa-@s_d;Ol7%))-csiCccKLj&m8=wJG!UU}{_;rvy{!TK>|xEZz9O zg6YO{rVCRokk+L|)&%Kk?D{t#EnkPELeAP>Ck;3$Ejq_@_FAgD&ko_OYaVcNWRx0v z&e(Ito-_7b%j7OjJ=EA;hxf?dy(0Jaopl=I-f~JkL+*y$4Y?a~KPtH+kr$+>Sjj9# z$Ac;>?bu^U=!Sccd-qE)(0<-A;#JYx;0s17O4Zga z&k>s$Ty8P_m1oVIVs+zED-(BhZKZ?hTSnzLeU-x`u#zktiM@-Bt9lRjs18`ZM4erc zxW#f6)!F>@NrdZZY&K)Fog0BZdzlrN+H4208lBhO$`9F#}58Hr5{tq?AQdTPAzIo0Am6?cZN46!1>G*t(pLi zI4|Nl;he2lHW7MAd*jG`)<0~{Ih}0OW)JHr=`=$DTKPZ}Sw4VeAd0hx#ag1Z`z=lo zKZoMeCKTo5Ls5`;#i8-wboZ!eP!7)41I2Vk=W{58WJc%dk4|wF%FTup6-5tu&h;ME z*{MZzkPRss!_$5arHIV%Jo(`X#hUHLTPIHZ&8@}g*9yD8zt?fpwYdUgGANrB7~`Ka zD==rh0;3dIYk7`3rR&>6l+sVB_V}?af$Qy%t5VPXU7>MyvGKR@wA6XLX zeg{>^EZ4T#Z#Zx){`d007tn$B0MSq3;DY{vu5$sbHXpR^SY)}M0&o$=c{CBUlbt`) z|sgGh1i34z)xZt?Bhd1*J+IGgO{DhSRf#z_LAiz`H|Mx?JUos4d!_ z#tG2IT?%lk){2t&MDWQ4+V#09>P1rYKOeHqeVtlgHa2rmgpHutGw)IfMu zeWb#xeps>a#6x#^y`g7Ix6T|0c}EkT(?f`b`(SFs+HH6Z)+ahjo%~%zWJ_`KjZ$Pw zxzpjp$L;HL-(Q!Y`Ay?+8}(a~2i%n2no6__t5+3~VHE8SQb<*NAhZ|mPl}Z7m@ygR z>-tGiZ}+gZtVs?PCo5M}U1>!b*yTsjQH2=z^SL@%Y_(RWi6LJx($K^S(ZoI!Ayj3{ z4k^2N_@w%( zlI*tnG?5)rQ^bUBcusasM|#*w4$UQ}DYs1uCW!(oHl3CV?6rrx0v)+)ATv^1B~UmQ z!3vm}x#-;IB4|rWS5s2B_MokhuktY1E|#=XlBxr|qK5*?tpPx+OdCJzDr}M70c|a! zwa17V28zQ#gmOtq;R5BB<2llrPlrZ%Bb%(Qn=;<50k`kSu=+{Cc^_7H#1R)u`zG^Q>sF{+GeJBtKV)b;KJ*9bvtJ|G2u7 zI@WDIXvSduuYz?+)crc(N3vn|U|46#>B`8bCW|FCy;M9NtDqmOranVktN<C6XKo19ZYfbyiCwKG0~1!t)R;y9u>9L|LxPjhuR8M5s~y?NST z3ACn{RDPTjVK*+PT7L3^l7;*vH6e~5zr|QbeouNeksnr*9~1(RW56zz7#4rrRE62; z(}V$46&NA<*1~fY>d7BicnxRYojy&3XDfyvI+7*BmGF=>gqdvD2p!-6_gWoKYWzx7_W#lqRQ`uP3z?Dh=69AlAx?4-C4K<7y?fy6 zM({{_tMla0vlJB@EDoV&8&oKfT=T2U#};TaWx8S5G@A%;kx1%{_Ewx;&SAlbRf^Gf zJ-Z`-HHtUTjWZZ>=_SQFpHfsl{prZZw^Kx3CNN>qd5O%BqMj_T#_SfM9v!)*b}BTh z$xJ62Xh@k%NoK-jeokhvBUe;i$x?~vlq#J{BqvnnuEirn zn$52R8l<&|G+{moPIc?bBz;;VMuxHaf-(|?P0=J3Mow_jl4mv#Y7TRlW9#^TrIRS706+l%5&I!K literal 0 HcmV?d00001 diff --git a/backups/npmplus/backup-20260224_021431/api/access_lists.json b/backups/npmplus/backup-20260224_021431/api/access_lists.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/backups/npmplus/backup-20260224_021431/api/access_lists.json @@ -0,0 +1 @@ +[] diff --git a/backups/npmplus/backup-20260224_021431/api/certificates.json b/backups/npmplus/backup-20260224_021431/api/certificates.json new file mode 100644 index 0000000..7b8d732 --- /dev/null +++ b/backups/npmplus/backup-20260224_021431/api/certificates.json @@ -0,0 +1,685 @@ +[ + { + "id": 146, + "created_on": "2026-02-07 00:46:21", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cacti-alltra.d-bis.org", + "domain_names": [ + "cacti-alltra.d-bis.org" + ], + "expires_on": "2026-05-08 04:47:55", + "meta": {} + }, + { + "id": 147, + "created_on": "2026-02-07 00:46:43", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cacti-hybx.d-bis.org", + "domain_names": [ + "cacti-hybx.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:19", + "meta": {} + }, + { + "id": 155, + "created_on": "2026-02-20 22:27:52", + "modified_on": "2026-02-20 22:27:52", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "codespaces.d-bis.org", + "domain_names": [ + "codespaces.d-bis.org" + ], + "expires_on": "2026-02-20 22:27:52", + "meta": {} + }, + { + "id": 156, + "created_on": "2026-02-20 22:28:48", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "codespaces.d-bis.org", + "domain_names": [ + "codespaces.d-bis.org" + ], + "expires_on": "2026-05-22 02:30:34", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n", + "letsencrypt_agree": true + } + }, + { + "id": 134, + "created_on": "2026-01-29 22:52:44", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cross-all.defi-oracle.io", + "domain_names": [ + "cross-all.defi-oracle.io" + ], + "expires_on": "2026-04-30 02:54:15", + "meta": {} + }, + { + "id": 162, + "created_on": "2026-02-20 22:36:34", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dapp.d-bis.org", + "domain_names": [ + "dapp.d-bis.org" + ], + "expires_on": "2026-05-22 02:38:20", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 46, + "created_on": "2026-01-16 16:54:36", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-admin.d-bis.org", + "domain_names": [ + "dbis-admin.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:11", + "meta": {} + }, + { + "id": 47, + "created_on": "2026-01-16 16:54:47", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-api-2.d-bis.org", + "domain_names": [ + "dbis-api-2.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:22", + "meta": {} + }, + { + "id": 48, + "created_on": "2026-01-16 16:54:58", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-api.d-bis.org", + "domain_names": [ + "dbis-api.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:33", + "meta": {} + }, + { + "id": 157, + "created_on": "2026-02-20 22:29:37", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dev.d-bis.org", + "domain_names": [ + "dev.d-bis.org" + ], + "expires_on": "2026-05-22 02:31:22", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 145, + "created_on": "2026-02-06 19:14:04", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "explorer.d-bis.org", + "domain_names": [ + "explorer.d-bis.org" + ], + "expires_on": "2026-05-07 23:15:36", + "meta": { + "letsencrypt_agree": true, + "dns_challenge": true, + "nginx_online": true, + "nginx_err": null, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0" + } + }, + { + "id": 144, + "created_on": "2026-02-06 19:05:50", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "explorer.defi-oracle.io", + "domain_names": [ + "explorer.defi-oracle.io" + ], + "expires_on": "2026-05-07 23:07:35", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 158, + "created_on": "2026-02-20 22:30:18", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "gitea.d-bis.org", + "domain_names": [ + "gitea.d-bis.org" + ], + "expires_on": "2026-05-22 02:32:04", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 50, + "created_on": "2026-01-16 16:55:25", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "mim4u.org", + "domain_names": [ + "mim4u.org" + ], + "expires_on": "2026-04-16 20:57:01", + "meta": {} + }, + { + "id": 51, + "created_on": "2026-01-16 16:55:37", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "phoenix.sankofa.nexus", + "domain_names": [ + "phoenix.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:57:08", + "meta": {} + }, + { + "id": 159, + "created_on": "2026-02-20 22:31:08", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.ml110.d-bis.org", + "domain_names": [ + "pve.ml110.d-bis.org" + ], + "expires_on": "2026-05-22 02:32:54", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 160, + "created_on": "2026-02-20 22:31:51", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.r630-01.d-bis.org", + "domain_names": [ + "pve.r630-01.d-bis.org" + ], + "expires_on": "2026-05-22 02:33:37", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 161, + "created_on": "2026-02-20 22:32:35", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.r630-02.d-bis.org", + "domain_names": [ + "pve.r630-02.d-bis.org" + ], + "expires_on": "2026-05-22 02:34:21", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 148, + "created_on": "2026-02-07 00:46:56", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-2.d-bis.org", + "domain_names": [ + "rpc-alltra-2.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:31", + "meta": {} + }, + { + "id": 149, + "created_on": "2026-02-07 00:47:10", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-3.d-bis.org", + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:46", + "meta": {} + }, + { + "id": 150, + "created_on": "2026-02-07 08:15:35", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-3.d-bis.org", + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:06", + "meta": {} + }, + { + "id": 151, + "created_on": "2026-02-07 08:15:43", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra.d-bis.org", + "domain_names": [ + "rpc-alltra.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:18", + "meta": {} + }, + { + "id": 163, + "created_on": "2026-02-21 17:45:18", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-fireblocks.d-bis.org", + "domain_names": [ + "rpc-fireblocks.d-bis.org" + ], + "expires_on": "2026-05-22 21:47:15", + "meta": {} + }, + { + "id": 52, + "created_on": "2026-01-16 16:55:45", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-http-prv.d-bis.org", + "domain_names": [ + "rpc-http-prv.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:20", + "meta": {} + }, + { + "id": 53, + "created_on": "2026-01-16 16:55:57", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-http-pub.d-bis.org", + "domain_names": [ + "rpc-http-pub.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:30", + "meta": {} + }, + { + "id": 152, + "created_on": "2026-02-07 08:15:56", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx-2.d-bis.org", + "domain_names": [ + "rpc-hybx-2.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:31", + "meta": {} + }, + { + "id": 153, + "created_on": "2026-02-07 08:16:09", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx-3.d-bis.org", + "domain_names": [ + "rpc-hybx-3.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:45", + "meta": {} + }, + { + "id": 154, + "created_on": "2026-02-07 08:16:22", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx.d-bis.org", + "domain_names": [ + "rpc-hybx.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:58", + "meta": {} + }, + { + "id": 54, + "created_on": "2026-01-16 16:56:06", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-ws-prv.d-bis.org", + "domain_names": [ + "rpc-ws-prv.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:38", + "meta": {} + }, + { + "id": 55, + "created_on": "2026-01-16 16:56:16", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-ws-pub.d-bis.org", + "domain_names": [ + "rpc-ws-pub.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:51", + "meta": {} + }, + { + "id": 141, + "created_on": "2026-01-30 09:33:59", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc.d-bis.org", + "domain_names": [ + "rpc.d-bis.org" + ], + "expires_on": "2026-04-30 13:35:45", + "meta": { + "letsencrypt_agree": true, + "dns_challenge": true, + "nginx_online": false, + "nginx_err": "nginx: [emerg] cannot load certificate \"/data/tls/certbot/live/npm-135/fullchain.pem\": BIO_new_file() failed (SSL: error:80000002:system library::No such file or directory:calling fopen(/data/tls/certbot/live/npm-135/fullchain.pem, r) error:10000080:BIO routines::no such file)\nnginx: configuration file /usr/local/nginx/conf/nginx.conf test failed", + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\ndns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0" + } + }, + { + "id": 56, + "created_on": "2026-01-16 16:56:30", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc.public-0138.defi-oracle.io", + "domain_names": [ + "rpc.public-0138.defi-oracle.io" + ], + "expires_on": "2026-04-16 20:58:05", + "meta": {} + }, + { + "id": 137, + "created_on": "2026-01-29 23:39:01", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc2.d-bis.org", + "domain_names": [ + "rpc2.d-bis.org" + ], + "expires_on": "2026-04-30 03:40:50", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 57, + "created_on": "2026-01-16 16:56:41", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "sankofa.nexus", + "domain_names": [ + "sankofa.nexus" + ], + "expires_on": "2026-04-16 20:58:17", + "meta": {} + }, + { + "id": 58, + "created_on": "2026-01-16 16:56:53", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "secure.d-bis.org", + "domain_names": [ + "secure.d-bis.org" + ], + "expires_on": "2026-04-16 20:58:28", + "meta": {} + }, + { + "id": 59, + "created_on": "2026-01-16 16:57:05", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "secure.mim4u.org", + "domain_names": [ + "secure.mim4u.org" + ], + "expires_on": "2026-04-16 20:58:40", + "meta": {} + }, + { + "id": 60, + "created_on": "2026-01-16 16:57:17", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "the-order.sankofa.nexus", + "domain_names": [ + "the-order.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:58:53", + "meta": {} + }, + { + "id": 61, + "created_on": "2026-01-16 16:57:31", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "training.mim4u.org", + "domain_names": [ + "training.mim4u.org" + ], + "expires_on": "2026-04-16 20:59:06", + "meta": {} + }, + { + "id": 164, + "created_on": "2026-02-21 17:46:22", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc-fireblocks.d-bis.org", + "domain_names": [ + "ws.rpc-fireblocks.d-bis.org" + ], + "expires_on": "2026-05-22 21:48:21", + "meta": {} + }, + { + "id": 138, + "created_on": "2026-01-29 23:41:20", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc.d-bis.org", + "domain_names": [ + "ws.rpc.d-bis.org" + ], + "expires_on": "2026-04-30 03:43:05", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 139, + "created_on": "2026-01-29 23:42:13", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc2.d-bis.org", + "domain_names": [ + "ws.rpc2.d-bis.org" + ], + "expires_on": "2026-04-30 03:43:58", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 140, + "created_on": "2026-01-29 23:43:09", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "wss.defi-oracle.io", + "domain_names": [ + "wss.defi-oracle.io" + ], + "expires_on": "2026-04-30 03:44:57", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 62, + "created_on": "2026-01-16 16:57:41", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.mim4u.org", + "domain_names": [ + "www.mim4u.org" + ], + "expires_on": "2026-04-16 20:59:17", + "meta": {} + }, + { + "id": 63, + "created_on": "2026-01-16 16:57:52", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.phoenix.sankofa.nexus", + "domain_names": [ + "www.phoenix.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:59:28", + "meta": {} + }, + { + "id": 64, + "created_on": "2026-01-16 16:58:06", + "modified_on": "2026-02-23 20:02:18", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.sankofa.nexus", + "domain_names": [ + "www.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:59:41", + "meta": {} + } +] diff --git a/backups/npmplus/backup-20260224_021431/api/proxy_hosts.json b/backups/npmplus/backup-20260224_021431/api/proxy_hosts.json new file mode 100644 index 0000000..c7c8cf4 --- /dev/null +++ b/backups/npmplus/backup-20260224_021431/api/proxy_hosts.json @@ -0,0 +1,1394 @@ +[ + { + "id": 37, + "created_on": "2026-02-07 00:42:23", + "modified_on": "2026-02-07 00:46:30", + "owner_user_id": 1, + "domain_names": [ + "cacti-alltra.d-bis.org" + ], + "forward_host": "192.168.11.177", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 146, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 38, + "created_on": "2026-02-07 00:42:24", + "modified_on": "2026-02-07 00:46:53", + "owner_user_id": 1, + "domain_names": [ + "cacti-hybx.d-bis.org" + ], + "forward_host": "192.168.11.251", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 147, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 41, + "created_on": "2026-02-07 20:41:16", + "modified_on": "2026-02-20 22:29:09", + "owner_user_id": 1, + "domain_names": [ + "codespaces.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 156, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 22, + "created_on": "2026-01-18 22:19:18", + "modified_on": "2026-01-29 22:52:50", + "owner_user_id": 1, + "domain_names": [ + "cross-all.defi-oracle.io" + ], + "forward_host": "192.168.11.211", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 134, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 49, + "created_on": "2026-02-20 22:27:16", + "modified_on": "2026-02-20 22:37:53", + "owner_user_id": 1, + "domain_names": [ + "dapp.d-bis.org" + ], + "forward_host": "192.168.11.58", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 162, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 13, + "created_on": "2026-01-16 14:41:02", + "modified_on": "2026-02-24 03:13:19", + "owner_user_id": 1, + "domain_names": [ + "dbis-admin.d-bis.org" + ], + "forward_host": "192.168.11.130", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 46, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 15, + "created_on": "2026-01-16 14:41:04", + "modified_on": "2026-02-24 03:16:44", + "owner_user_id": 1, + "domain_names": [ + "dbis-api-2.d-bis.org" + ], + "forward_host": "192.168.11.156", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 47, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 14, + "created_on": "2026-01-16 14:41:03", + "modified_on": "2026-02-24 03:15:15", + "owner_user_id": 1, + "domain_names": [ + "dbis-api.d-bis.org" + ], + "forward_host": "192.168.11.155", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 48, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 45, + "created_on": "2026-02-13 20:32:33", + "modified_on": "2026-02-13 20:32:33", + "owner_user_id": 1, + "domain_names": [ + "dbis.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3001, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 39, + "created_on": "2026-02-07 20:41:12", + "modified_on": "2026-02-20 22:29:57", + "owner_user_id": 1, + "domain_names": [ + "dev.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 157, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 8, + "created_on": "2026-01-16 14:40:58", + "modified_on": "2026-02-24 02:50:57", + "owner_user_id": 1, + "domain_names": [ + "explorer.d-bis.org" + ], + "forward_host": "192.168.11.140", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 145, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers (unsafe-eval for ethers.js v5)\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 30, + "created_on": "2026-01-31 00:13:09", + "modified_on": "2026-02-06 19:09:43", + "owner_user_id": 1, + "domain_names": [ + "explorer.defi-oracle.io" + ], + "forward_host": "192.168.11.140", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 144, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 40, + "created_on": "2026-02-07 20:41:14", + "modified_on": "2026-02-20 22:30:39", + "owner_user_id": 1, + "domain_names": [ + "gitea.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 158, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 46, + "created_on": "2026-02-13 20:32:35", + "modified_on": "2026-02-13 20:32:35", + "owner_user_id": 1, + "domain_names": [ + "iccc.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3002, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 17, + "created_on": "2026-01-16 14:41:05", + "modified_on": "2026-02-24 03:19:50", + "owner_user_id": 1, + "domain_names": [ + "mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 50, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 47, + "created_on": "2026-02-13 20:32:37", + "modified_on": "2026-02-13 20:32:37", + "owner_user_id": 1, + "domain_names": [ + "omnl.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3003, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 5, + "created_on": "2026-01-16 14:40:55", + "modified_on": "2026-01-16 17:01:49", + "owner_user_id": 1, + "domain_names": [ + "phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.50", + "forward_port": 4000, + "access_list_id": 0, + "certificate_id": 51, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 42, + "created_on": "2026-02-07 20:41:17", + "modified_on": "2026-02-20 22:31:27", + "owner_user_id": 1, + "domain_names": [ + "pve.ml110.d-bis.org" + ], + "forward_host": "192.168.11.10", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 159, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 43, + "created_on": "2026-02-07 20:41:19", + "modified_on": "2026-02-20 22:32:14", + "owner_user_id": 1, + "domain_names": [ + "pve.r630-01.d-bis.org" + ], + "forward_host": "192.168.11.11", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 160, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 44, + "created_on": "2026-02-07 20:41:21", + "modified_on": "2026-02-20 22:32:57", + "owner_user_id": 1, + "domain_names": [ + "pve.r630-02.d-bis.org" + ], + "forward_host": "192.168.11.12", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 161, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 32, + "created_on": "2026-02-07 00:42:16", + "modified_on": "2026-02-07 00:47:07", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra-2.d-bis.org" + ], + "forward_host": "192.168.11.173", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 148, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 33, + "created_on": "2026-02-07 00:42:17", + "modified_on": "2026-02-07 08:15:41", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "forward_host": "192.168.11.174", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 150, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 31, + "created_on": "2026-02-07 00:42:15", + "modified_on": "2026-02-07 08:15:53", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra.d-bis.org" + ], + "forward_host": "192.168.11.172", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 151, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 50, + "created_on": "2026-02-21 17:37:16", + "modified_on": "2026-02-24 03:09:09", + "owner_user_id": 1, + "domain_names": [ + "rpc-fireblocks.d-bis.org" + ], + "forward_host": "192.168.11.232", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 163, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 11, + "created_on": "2026-01-16 14:41:00", + "modified_on": "2026-02-24 02:54:26", + "owner_user_id": 1, + "domain_names": [ + "rpc-http-prv.d-bis.org" + ], + "forward_host": "192.168.11.211", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 52, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 9, + "created_on": "2026-01-16 14:40:59", + "modified_on": "2026-02-24 02:51:49", + "owner_user_id": 1, + "domain_names": [ + "rpc-http-pub.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 53, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 35, + "created_on": "2026-02-07 00:42:20", + "modified_on": "2026-02-07 08:16:06", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx-2.d-bis.org" + ], + "forward_host": "192.168.11.247", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 152, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 36, + "created_on": "2026-02-07 00:42:22", + "modified_on": "2026-02-07 08:16:19", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx-3.d-bis.org" + ], + "forward_host": "192.168.11.248", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 153, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 34, + "created_on": "2026-02-07 00:42:19", + "modified_on": "2026-02-07 08:16:32", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx.d-bis.org" + ], + "forward_host": "192.168.11.246", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 154, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 12, + "created_on": "2026-01-16 14:41:01", + "modified_on": "2026-02-24 02:55:51", + "owner_user_id": 1, + "domain_names": [ + "rpc-ws-prv.d-bis.org" + ], + "forward_host": "192.168.11.211", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 54, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 10, + "created_on": "2026-01-16 14:40:59", + "modified_on": "2026-02-24 02:53:15", + "owner_user_id": 1, + "domain_names": [ + "rpc-ws-pub.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 55, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 26, + "created_on": "2026-01-29 16:35:10", + "modified_on": "2026-02-24 03:00:18", + "owner_user_id": 1, + "domain_names": [ + "rpc.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 141, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\ndns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 24, + "created_on": "2026-01-29 15:38:44", + "modified_on": "2026-02-24 02:58:41", + "owner_user_id": 1, + "domain_names": [ + "rpc.defi-oracle.io" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 56, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 21, + "created_on": "2026-01-16 14:41:09", + "modified_on": "2026-02-24 02:57:31", + "owner_user_id": 1, + "domain_names": [ + "rpc.public-0138.defi-oracle.io" + ], + "forward_host": "192.168.11.240", + "forward_port": 443, + "access_list_id": 0, + "certificate_id": 56, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "https", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 27, + "created_on": "2026-01-29 16:35:11", + "modified_on": "2026-02-24 03:03:19", + "owner_user_id": 1, + "domain_names": [ + "rpc2.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 137, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 3, + "created_on": "2026-01-16 14:40:54", + "modified_on": "2026-01-16 17:01:32", + "owner_user_id": 1, + "domain_names": [ + "sankofa.nexus" + ], + "forward_host": "192.168.11.51", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 57, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "add_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 16, + "created_on": "2026-01-16 14:41:04", + "modified_on": "2026-02-24 03:18:33", + "owner_user_id": 1, + "domain_names": [ + "secure.d-bis.org" + ], + "forward_host": "192.168.11.130", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 58, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 19, + "created_on": "2026-01-16 14:41:07", + "modified_on": "2026-02-24 03:21:33", + "owner_user_id": 1, + "domain_names": [ + "secure.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 59, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 7, + "created_on": "2026-01-16 14:40:57", + "modified_on": "2026-01-16 17:02:09", + "owner_user_id": 1, + "domain_names": [ + "the-order.sankofa.nexus" + ], + "forward_host": "192.168.11.36", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 60, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 20, + "created_on": "2026-01-16 14:41:08", + "modified_on": "2026-02-24 03:22:49", + "owner_user_id": 1, + "domain_names": [ + "training.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 61, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 51, + "created_on": "2026-02-21 17:37:45", + "modified_on": "2026-02-24 03:11:25", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc-fireblocks.d-bis.org" + ], + "forward_host": "192.168.11.232", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 164, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 28, + "created_on": "2026-01-29 16:35:12", + "modified_on": "2026-02-24 03:05:09", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 138, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 29, + "created_on": "2026-01-29 16:35:12", + "modified_on": "2026-02-24 03:06:57", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc2.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 139, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 25, + "created_on": "2026-01-29 15:38:45", + "modified_on": "2026-02-24 02:59:35", + "owner_user_id": 1, + "domain_names": [ + "wss.defi-oracle.io" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 140, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 18, + "created_on": "2026-01-16 14:41:06", + "modified_on": "2026-01-16 17:02:14", + "owner_user_id": 1, + "domain_names": [ + "www.mim4u.org" + ], + "forward_host": "192.168.11.36", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 62, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 6, + "created_on": "2026-01-16 14:40:56", + "modified_on": "2026-01-16 17:02:17", + "owner_user_id": 1, + "domain_names": [ + "www.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.50", + "forward_port": 4000, + "access_list_id": 0, + "certificate_id": 63, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 4, + "created_on": "2026-01-16 14:40:55", + "modified_on": "2026-01-16 17:02:19", + "owner_user_id": 1, + "domain_names": [ + "www.sankofa.nexus" + ], + "forward_host": "192.168.11.51", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 64, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 48, + "created_on": "2026-02-13 20:32:39", + "modified_on": "2026-02-13 20:32:39", + "owner_user_id": 1, + "domain_names": [ + "xom.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3004, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + } +] diff --git a/backups/npmplus/backup-20260224_021431/certificates/cert_list.txt b/backups/npmplus/backup-20260224_021431/certificates/cert_list.txt new file mode 100644 index 0000000..e69de29 diff --git a/backups/npmplus/backup-20260224_021431/database/database.sql b/backups/npmplus/backup-20260224_021431/database/database.sql new file mode 100644 index 0000000..77149a3 --- /dev/null +++ b/backups/npmplus/backup-20260224_021431/database/database.sql @@ -0,0 +1 @@ +Database file not found diff --git a/backups/npmplus/backup-20260224_021431/database/database.sqlite b/backups/npmplus/backup-20260224_021431/database/database.sqlite new file mode 100644 index 0000000..e69de29 diff --git a/backups/npmplus/backup-20260224_021431/manifest.json b/backups/npmplus/backup-20260224_021431/manifest.json new file mode 100644 index 0000000..5d302ea --- /dev/null +++ b/backups/npmplus/backup-20260224_021431/manifest.json @@ -0,0 +1,19 @@ +{ + "timestamp": "20260224_021431", + "backup_date": "2026-02-24T02:14:45-08:00", + "npmplus_vmid": "10233", + "npmplus_host": "192.168.11.11", + "npm_url": "https://192.168.11.167:81", + "backup_contents": { + "database": { + "sql_dump": "present", + "sqlite_file": "missing" + }, + "api_exports": { + "proxy_hosts": "present", + "certificates": "present", + "access_lists": "present" + }, + "certificate_files": "missing" + } +} diff --git a/backups/npmplus/backup-20260224_021431/volumes/volume_list.txt b/backups/npmplus/backup-20260224_021431/volumes/volume_list.txt new file mode 100644 index 0000000..4545150 --- /dev/null +++ b/backups/npmplus/backup-20260224_021431/volumes/volume_list.txt @@ -0,0 +1 @@ +DRIVER VOLUME NAME diff --git a/backups/npmplus/backup-20260224_030001.tar.gz b/backups/npmplus/backup-20260224_030001.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..78b4e8aa28f8b6dd55668a565b1695204c7d59e6 GIT binary patch literal 5136 zcmV+r6z}UFiwFP!000001MOXHkJ~o3p3nIe#PmZFp!SfWBzsf@*lwHM4bUb3!9UP+!8T=c(RQhwvu5=qgrWp^k{I}?kPrK5)r&pA9iXY2>x=Chs!Ef-pr zJ%SiQh^{W$Jm?kSVBoOdXy8Ep_v*Mn4zdRrS{R}Wi0B`K3*fYR7d6K`FZ>LEizq4L zK+sNh{!EW?_4~g|#kbqgEf!{Qdv@@!h}QegyRR_lIBp=hwI3{g1!CebMz@nd4YT&G?`C zNi-pJ(EpLA$-dtq8~+1jZ;gM)!Djp)<@moB09+Ok<@&;(&MrN0xdnyG?^%llOh%z! zkX4%=w0f5P8DbAY4-I;7NdH*0PG-|tJkLjW(8aZ^FUnKbRv)>;K0@?o z-DEV+Vs`enC}z2Lb;Y-G2j1}MT?J`Ukfg|I5B50p1iepx?B`_t3H>bpZ#)X;i)Wl= zB&R*ftE^5&1sP4ExO~28l;=@$b6KALbJ6P3pG70`FiSJ;n*h63`tVpjPhNTHfMi89 zi2^FR>IQxgkUTHv*e4C1d^vZO@-FkO+x+vzpIWS4GyYcsY()WVr2jFVK(-5w{&$o^ z_WoCY^cN#U>pP_S-_H9VI4(5&e~hEa``7&r>HEh!?;pCzy#HeyKQG@eV3P_+(gIA< zc@i26;F%mX5j5lf7>D5fbB67HZXn_KN45hgHa73yV)`FK12g`QaeR3JR!)=BSAz#D zheJjv`G=!4;T=A303h^i%d_y(fpIxaLpoE`wRAlUS1r@~gk+<6PXAYa7g~NErc*yk zMu|Ty-5Ouko)bSPqMjeeMdtUz-Z;wpX|{CA{J!ivNwa%D3oHFegTduiE9ShRt%h*r z(%HCP7PkZ|+%1cHwcX{ZJda28dI4b{7ulSwy7<9ul-!I+;*aC<bHKt#Sg`C|DLPjEU^#Hp={QwQ&d)7!`Kg9b`12epaPfkEjB zq0~k)lv)&f$V09Kr4|Gh1@pBBueDK{h9sZ)6iON>bzu!inYz#%rcNc9@~`+fI1Q70 z6x>qKk>q9vsO%)wf$pM^Fsxn%aXJqtv7eF4$~GhVl0%Xd5xp1I{yXr~x(E32w|AgO zzmeo?_BHvg{NDA+5nEX(Prh-Ta5#YjG9Kdzv>kgA1~wTw_Sp49AK}T^hZ9&{0(|(m zeSPlxS(B|VAruzzo0*@4Y35J;gbvQX-LTL4K{~By&u;1)c~rlpjZ|V%Q+A_lc+~g62zn*rRq}|YI7>XwwcOKX)3!GPG!ppYM?rm;lUmXSLn}X8k3ka zY!RNWbrSHbqFU}!6?5Fvvj>1T53jQ!VuZy+>{8vDX=>1t!P^E9dx-vMYic0{cFzx| zQKDn@;yP7L1LbWSy>q;Ok|Q=1DY}e7yvIeD6QzKWugT2i14@_Md+I_3ej`@BaDjeQlTjeEQV;ElUd$ zuuilO`T@`vPTrJ{RMYJvnb5&PvfgiL90iZGS6*aMP|&F~qC=^7e@l|yVwPQeQgfZv zW3HsJxgMRE{drvU@+<%^a}rNp{s8hIi)Q>s;N?8Y{R!zs<*45Lo80;FOR$Kk0c>H{ zqrHpAn20(*Z9bv5#C(BP)O{n0;viP_ zZ=)QrYeyN$*IkMf59G;6kJyJl=xGu(0ZQk$k+g{ zI6awZkbo4o^z;57IkqnqCM}%QM?)gdm+@jK>+m+!n!{H|V6xfQtYo=wa;$kDI6DDn$GB=~6>}J%q>7pPAj^Jjr8dHUFGakszh(!DC`1MN}`j+dL z*LwtjPot?lZ!{m_7I)Y=l^8qXnq{WzDcJ6)98m2K>S}|F~o3S?v$3R&%(O!c}r%8MS)dV-5H;ig>Ak{=EY!-TsSTk9)9C#3U zwzj>zC*JC;W?RQ z`qLO8sI!z^@9&3hV{S*zbrrcAkErp8KA)|ywrDFXPYts5z$G(k8HDoS^RFBjl zhx&X3I^^JXY-$*CFyzoVIf(Y#aO7YiRdUb|i`|fe)^19xU2>>23k^9Ka(F)EfTc#o zA}OCVN6fP2z=PW4kj;W+>PWr4)&pEe56(K^wMi&Z%RBN;C!3J~sV8gwVyTL|1ggyX zWi5v+j@w2p02ONiwa%Na2h_HgVGU6C0;)8DWE`2EyPxUuu5{cGKvN6ljoGdbP{Exe8oDsPA%LnR9$SKdOA==B1Yu{uAl-` z9S;pX?Ct|qCX3!I)7juD$hWBjROh%E4b8%)S=clSo2R_6d5-ih+O^LItw`4{RvUC} z?O^T=yU)iu>~6Ko?#I`g>WfTyU%EqF5ALVDKaL-?+{>0- zyK_R%9da7k$PG*vFcohp+rU(oJ7^74{bb^6nCdu}ExR^lz8*}CE98`5DqYK8I+vvz z|5q^Gc+PZTss+-zw8)wuJ&j%e2BeGEA*qnF_SZ=RPD+c;f?VlB9gyDVhw#=l4>&n8 zN{u~d>^Wo48GEi}au=r_YV59aJ!da_j*)x&&N>ZpZ#ku&A$LRWhTILgAC=rKkr$+_ zSjj9#%Gzox?Uut8anK<5?w4SY{k&tutD?8T8_+m@oAxmg+y|;hD=w$P#;oJvAy)xQ zJZ9}Z5*(LfRY4Pb@lYG_wTVw{ zyLnEPYQP)&!`L6j{xJ4OL;EA|%m5MRR@@jMic1IdXCLp9R-8b~76^V0MO=)Xaq=3N zQnhvHIbt(|%PpqA@~oLttZrOtW#X=`t#mMb%cvZuuX30KR+6P7v3Id?Rqx>*)d3eT zQD;{qZn0cNbvA!}65)Cpo6Xp4=SHB<-ex;bT36b@gSf;XLRz=b{>k!+&4C6quYPiUql$F-sB&1Z`0^ps}N z#uxz4bb>Gjz!@35oov70S(q6ct6U z+>nCzm^$-=Y)H`&u2Y0@S$bdBgoVzbmh;YD{f5X z{Xg`V zNPdx+TY6n}OQL|33TC;8%xsWQ4+V#09=A2rSF9=*y4>W9_zVMR;jQ@|jN+ zqXxpO>LV3i^}~vVCmy=X>kU0yx^?D2$UB&MPy5P z@{Lkt%VMX)hmYIW=f1x#LGzo&;Wp~GBoDY*cxx)rF05WvMut(eJC;JK;sc?*bbnH$ zY{!hr5MS3%ih8?;Aw#{xXI&OkhAXPBw4w~`@}uaeLJa-cOr0#YTC3BZ8C6^kFR)v%x1j6)}TQi{)fzOY`s? zQg*ZGN%d7F*=_Y{B0Eb>5fi%MIoUZK>0v85G?$#F+%_qgBnqt9bXqE~*BjqH~{%kS!@)O-bR}L$*S`%EMs0T++%&rVj9m9ttRj17Kl~ZQ5|_ zP%e$W7b04FjF@4dI1EH6my{GPQ4Sr?k=A@VG|C&81&5>trTl1Xoktv6Br=yj12HMQUkaAWtr0;f8$2#U&(O~^AgLO%Mt_9XD-YDt_ z>ka(J)t%I_Zu3Di2J3$ntV^Qq*8xA04YLQsI!jKshjI#^qGYPhL>6l%J#~#1Z5-AM42PNv|gI!)o$FLI83M*rgJ~ z;*XoEFgtykFrcaeBSha?c&%{B3I2a7?z zW{y3lJGN^iwPxa?kB2bJ2fWK~t82CzzfzU`f8h#R{DVFVnUd`0ca}OKNed9Ceh9d| zd*JKk70V}aRm6F@r*E7VS8;Slu9Dfbhp=-sna44`oha$g$n-0{^55Tm7$xL>G>KyJ z>NULu`a1-#K7IPd1N6Jo%o{HD?pa>`m=|OU;%J=t*`w#ZPeDEpZUO5G(hP)Dgh7$g zQvrS6D7gWXbVia_O>XIXkiA}hFDk!w2t9g>AWP>36;keb3HPn9za~q;EOz0~vvSY- z;*PH7d3MFN!N*r+qbt^C@n@g?2?~-I%LlG@leOzgJ9>)K@^-5^Q7Ky5F*69Fz0NuAN&iqp$E zEEus$G5W4&cLcCT@dmna2172rq*&)uipr-y9r^fnipa|ZCM-HHk(s5aC(ElbyJe_H zM{cQ|3e9RV(}@NeQYKT9nQ)n(lNsvB6;)TVR3bX1N~aPDI%@ksgp0?V1aU{aR#6sE zCOkPoCz_k)OfTgvE7|JMiI?_pY>k%ozOwUlj6`oInvvxvM#5&0mXSlNkii*lQ zQlN=z@d%M-^Xq^HX)Pj6m`{RJ-MTVKpVo+xVXVHOj6`8mG)aY#6P&c<*^Uk;Ev?N1 yigg<#QdBfjg<9`gio?zp!gh03!9UP+z{4*K5@Dc?A@L{hXY*&V8vNk*hDuO2>pZ+toNgKvwuVVRa|T9!RF zT??Vn)kT|!Nsgi8(4TPVnC#E>aRD7@4-vAUYhRcUnJ&BlPODE*b1d@0&j7fHk|GW` z?L_C#^q5qC|GP9^%y8Zg4w`*`i+q3EarF1^Zlq2Ge3!@ zm<;+q@-#X09-{F-g!az(cN|xb|4xqodjY^@5fQF0{Mr1{1D88cxcr{BSi)o+`UPIM zF-*&_?9Zm_S;(_ThB@*~bJ;qX&*t$WAK%TQkT!=Vxzf{9w`pFKr>?C5bVmaS$-kQ> z<3$$Jv$sVt&%LWFwv{{dM)1i~1!+>?q{vAR`a0wUc}{=g=XmoQ^1J-M@i<&8-*KMd zob)KKvOXCVcsz~b^8IE}o=3^eWqJC~Wvfen9*yzCJk6Lp0eY?U;jw(5yzWnV`2Eq|_a`%k{{CGYKd-(oppyzn(gIA= zMG|TY;F%mX8MTott0+i}=mlPr@|wXMREk=ihGV?*>6St7uOj>KlHPf26HcVqD}n39`p|G4^jV zT*CpK@dJDAK!W)4do?{gx&0nLlxM35!m>C70S!2!!yaCHaKt4DXjs>@r9=KzSGTe> z&#AgK2=O#B2ugw&5293lDuZoKWysc3*(ptB*W9UWH9-w!r!q7=K;a7g`CMTVb4D$~ z)3r_lo>f%KT&iM@dwTW=@Mht4Hbe{&pNL(eTT@NVv_$Z>fq6|+BDMpeF}w+|4L_Vk ziHg;W>Qpral(%j4GCeCW{vG&)gGCk>WU%1O_$`g2;F0voi!2HXGL=STC>i&+I5C#9?D97?*IB>j zS{mEyk%`$~#D$S(0eG3?c>3}OkOx^bXMY7=E|T1zVk0U?_4e=h&W~S$WljyCfnAUE zE*@jd>-@C&lsp>S`svwdcEg@5f4go%1UDf~$k$GYP%Ex+pO^n5ZDu%({QA43lRq|B zNK*2QKL8rRG>EJ=LLpe48UFI)J-G-uRic4nFE7$8-&|uwVC2PfDtByT_`eI%CTG7A zRlMIOIXMl8+CL{B>*o(Yeg5Cy-hx-r6i{a>PC^i-I8R;{U}YJAsCZ2~z9)F{z~|d2 z2lU!ehVxCAA_Y19`ShyagZGq!LEzKNm5f8i#^+yu0h2U*1lZ4`_)%*ve9Z+qlGHA8 z6>X^9f`?K2JTfd5YIoc=t?;&eMVj0-xodLQVAj@LG41zy(C#@aAFhaaxpSQ}(Ya#Ts797#lLRk1eg7Gnf(Gf($qY=Bpco=i1J zfQwu5`@tVMxN}}>TSVI;CuEE0Y3&N zwMnPvzGr08ZE~DMZbnDi&8TeCML`gB;AXTMQ-yXj9?8uJdF$=i_@xMa+vF5wH{&dt z*^5T=5o&RTol}Xi4r7*?s;6MLqm-{;x0AHDAZyKEkZF&>Id}}{cUtNiY7xw=hZv?d zSz0k!_=~Z(3dc}dHBp`%(peIBpqik@^M+PUj-;AMrOle2!`DofEr*^7JzLpcJ`itp zREtS{o}9LNqLZu6F}aGj@R;?6id2i0HxwRVch2wdU=~AYs)VxZ z{r#rfnA@RqT}AHNBdR^3&u1yD&07k~QiCWSxS|G&38|=1L*^or=#eVqP+yNgg&f?T zO$|*BnjCs32i|%ch8(s_Bt_()o))_$2c^}NR=ea-X%=d7(B$xZ$N>qBie*tgVU3to z%b{l~lS4KSR;44=)>;oy9X&Xkgx4miL@lq#JDqAq9HgGC^^1fm?h2?P>zB41dC(zK zUJF1)NOnvi7LZ&4Rg@mE0jhe{tu0WMU|Oqgsll{cFT92+7p4wB zx6*<%0)%9W!);dKE0-~(Fr7vjE<;0V1lsQUB2wO0?hw~Am8&$D^!_+`P;xI@cJ0auHFwBq zR3q0gUBZ;Vq-+aQQSG1&Ordh>>;|SP&SlH4Et#(dQ|$^lC723h`77tLaN++Nrd!XM zDom9?T2~fX5u~TF>R*F&`8fnTBj=zOzn&+*>ZGr^#KDyC!!{?wyjm#q)xcJ62MQ(P2_OMC9%q z;sxnH1Ox5oog-eAy$#-g#`)W%kIvve(tfo3?NsQPbv!g;a$baE_7H_kc_-SIW2Yyw zUG)i8RXI4G_uD0b+K4R-k#MJb{)i5cC{2anW|h$!lOzyRDm^!#6XS+G6UFXT_Rg zb>mX05_k39N=MVTw90Y%Du*s$B?ukyy^AWldMlUhUVcQCRgtL0?JBCP`Kyx%(^K1Q z+Gaa90)6&2+j-Ku)B+yJ6b2E|I#OPqxuW%+%i>p7BhE6J|7&n=A243YQ2W_lysUA2d!)(il`pIHW5X64eJuE{V#EX=s9dYty57>J{85{ zM;ufJr?NX~IXGKS6jK?U&tW4ZJvvW+bn6BU#wb<|LK@*0j|j(}-<_K?OM&Rs?8)A-;P71onc>=90=aV$tbm!Gi_U#6g0^7m zYC;Ov9<(LuRUQZ1Wk@T-nLNNNdPtz$90I!9)?sH|i6zo|pshu;@)*&>Kyn!HP%hX~ zxJ0?>FuTI^h4Mx=SzR}2yqiN0?U`hn)lUM>hp@WC&$w9G&nAQ7Zt;E-6}W+$e7Cv0 z)?%>}m&W&B1mBLh7!$E%9Hw-3xA5LB_YwfRW?dN9ZW*$Biu3FiZZQ%@N`09v)#+CP ziAm&aiKI7@k{)z;3-C7_DpT?6NaDN0gINrrDbJ%-U7B#Iqq+1i$EDEaktu_7r>Dp| z1#RXclWka(J)t%(AZnH@<8tZ=*tP8U4 zHwiz21+z!PIxSAO%zSDREUD=wmmKLpI$J@EDNiq@03D&o9c(>FIave&Eo z!t%Bw(<6@vvUE`pA?2QzFn4|ZHCYK}xe9-gm22LYPjt1&vn#p`KE5g&UC}nnKMv?0 zL4osP^}^L|vUXi*otHQ*AGewlrLv`6R-^2ESQB!KqkudP8a2$|5%iYl$&qJDDmI9p zLQNN_5F)u|qs(0kw3#y9Fm0Mn1gI<|bw+C|POs)LXT(b7=)0cX6Tlkf8>r?PjF|G0 ze4S4!E8k`6gLf>g-A&|00^@EvFOZofsV9qfV|L3_kDlC8dpk7C$xJ01XhfJyN@mH9Zyg{S<(UFwUcqpq=de znI6OP?|+v>vkA$X!9l(6Z_)2>JGf`Qe;bG7`_F$4qA<(5`9rRE5B7mw*RKBlmb*3n zd#;Ty0BrVE%a14i{eS%U?$@^;0X=^G@YBD4ehc1z|MS~t$9^hvv~^UB|A`-mV?qc0 z?^zP>dk@+8?;(3@{5$k-X8gBt{O=h6mw8CJKKCcnOAlObLE-W{)?yBmLEz_P*`@=n zj^%uY*n`kRxC8t2FZ0&%bTW-*+2C#x2CO-P7RH;WZj&r8PF-7F7mvER1h1i_?G3TV49oa6lfWNy^;`uxlj`kH!0BrI#L&G!Mt&h>EVf zfj=6NEGy>NjRqSx=dMybWw!O0e?I$Di?u7p|5AXBD1f!}KNmCo&qc`Se{CGH@4x&@ zcRoV2?jhCxcD{elab3gzZ5(yJzwSMx-yiRMf9Uqi_iy9)aq)ctn^ZuYLx{{svC9~u8&D~HPWXaCs81ypPP@1YAwpN38ehW}eQD!xCpb()I- z)F1!YMYb9LZ5)E{&l$G+xq*b^AK4D``D}jw9-a;p_{-q2QkxOC~PT`%)T zf+g;j`Lo*Y;#8JJ1A4s?VZYAP8CiDmN4H^oGa#`)jEa+EKgyP8hfy;6#@t6y5*BVA z{-ht=`7ym9^JI;~8}=S6>5|;%y-o2=7(Y-^M`27h?!P)m(v+TvXHm52y^5mbesE8Q z8GR6v4`$Pw)DOtklQ4&yHOOYug`~LmTgosS-I57edgqqUxqfS|3w>ul50f}sJkatc zlu-ty9f~vAY&b_mwmA80@fI66?JMHcR>i4<_rvM!UDw{_TeSt~*L5CGFWmeIt+RkF=IbMDmQpqx5l_5B!^yRB%9R z{J@{vlOVqQR!$Eax8LE1;%pf~SeAewPzUwdut(P(>I(@1b*yXF(xLz9t6OQ3WlY`b z24oy|C`v{V>4u5=REC>w|Vve@aExlHbjiDn224fTQf}!S~7Us0A5q`m>USS;Z1?v@qsY$T9dDBKO*RurU&%q}$nx$d>2>wMVmeTBN><9EMi+_Osbbgp8dUQTNPD$s(w15Km zdKo8K9FE6dFM%K3`;Xb{t#1FI`VQaz)Av8W{qXVKKi|Et?DC&apE|#!Nlr$r6YYau z1NyIBE~T-) z9-Wx|S(JCObOc^xBpSbX4YE-hPWfMf7qd9?$D|V$qk8>sa_2`cz&xi0u)wZId*_c4 z5p~{dKBkYxx86J(PHy;<#c!8QsNjaQ3H{nJ6>7;f?z7?#+Gaw6(67ErGW>mYg*c(l z_!_VXW{1jZB@~L)Nyndmyp4;{Qw16r_Od)lv(+^g1V&#xV{#{*l>9NHZ8H8VF~$3B zoYB*Os{K>?v3~sU!{`70@)o=d$ACFgNgRM6AzAz)2Mfypg!wDh@jbvwL+vUt^6Z}0C*?poCDG)nD#L+ysz z4YeC;KVxdQMS8o{L6`;4u;pPHwU@Niq4w@WGU){5t~8jQws*9%h-k z7t*d~dQ_X~VHwf47f3sqxJ)(nG#!Fi?C)NOZlw;vW$4!FX`_#V?)Wj=QghM7Y|l1k zYvQ%_SwWO_w6Zp!=ZM3#D{F&JNscZl6eEdhtvc3*-C&FWt>)+7D0;TG zowc6S^iq%-p4m<#1?dEHJkAj2wg~3DK_?9Z&J&oRhqZHYZ^E4DENN)kq$_n38DO0n^D`Q3rC|-3vNcMHdPomUs*cJ1Y4KwmT_%3)05?1*!2EoP)=JeW$sup%=kSj}XH&CQBnG zi+C~iTH)v^t0vl$Lo$h@7E}{ld)_dr$$?Z8rLRG%P`g~z-%RHj-iyrF0hyK{O+x|0YYs1wSr_V+`# zHn$_^x{Tb7N7Q&kpUzTPTeK9Grv_O(a6t_g7gEuohSbH7>XAC+P+gBehaB7^n;M23 z3^^Q~97OAFIC5Aok(7~xep>9B9JE$bTFsI}saa^q!H~n#AqOlqD&|G`q%~p|Eqfl+ zCWmx7T9l5|TWj6JRrKJj5?<@15;eRc?{ume36OfS)-RT-xC@}ltY6l$?;(dyc?|#+ zYXP;&o301cro*rXsCxlbT0n9ER9Sk!3aI*3x7I+_f@!6?r3ce?z3>L6LYO+@+)4|v z2oP2&4!2r`uU*EF!E_v^r1-=-wN5SEEL2@=pn5t`MIuJ!6Rw~dR4vce_HHq#GFfz{ zsm=mVLA^~KpgQeVG&F%t6WBC?%~K9+o+G`BR_*giE7I7-YJu)v9*8-+&xSheZZ*s9 z?P?*0-3_}Nb~o(auscLt5@@~ai%fZ6xI2i{pygh+?8=oBdhU?Zs77vJ zI)|xvN!c2vvf4o_m?G`e*%eH6oXeJ7Su$S_rp6U=N-&ki@)yo!>B9ddOxK<>U6^Wt zw5lw!CP+_X)xQDh{BuZl$XWU8qzNZ0f8AbF{(W``Z(aR_la^6x>^Wo48GFvya}ATb zxb%>QyUyM#Zpg^Jd1svlxi?%=&yc$zcSG)m+*>7gOXLM9cC2I;qr;_o$jIH<#|v`& z5Dc=Pc8+*i_BMC}YUgj$J|=_vK>N{(w^Lzb*70zk%XyKG*?kl;?VV^Fj-8&!cGV|X zRpmTUu9^d;ZgyyI8pKdeZ4Rnu(p%%cHsUJ_pW1f)nkwahH};3IKaBlh?2nrEM|Ly= zL|j{OZGb3-4luX-vj)v;aAV2d;Sr1Rz>0lx2q_x=C4m8Tu)=O8Jq3g z2=vL@Z0AYqN(*=pR~SS_>sWhv=7QFbTo%8yB4LZHZpz{tem_ZmH)Zk9XO?KREWXl~ zDUd5HCw3lKT%4!w6p`N&N+6UcG)t4?%GCAxGevoMN)xm(2EY@YAdCTUh6aG8loCu0 z0L3k~sR5uJo6l4FYs#2MHUY{@iy9Nam;g_m;f)D!KJ!GQCV(TZi?}K{XDe@;h_nNU z_gVL_HRp7yQJXcar=-*L1!(0HQDpT1)`=+EYgp%KJ^m6WgrCCZ(j;ceVlDI>bxPMRq0A`# zl=l8^c`FA)@P^YBg{gBt7Bd{8Jimt$C zzdgG!$GIPjm1olq8~D(&oB?F&6T0%J;T1QgvhMF$66@ZBUJ<&k&3>Yu1None179Eq z**(X>u!k<_S>(bC0GoW#s$-VrehR=v80XPQ&`x&#Oph;S6hG-hF#frz^N{1;c6*M^ zjel5-|DJ8ee;db_?SP)Gw0Di`Sqepys16AcSHz`Chvb9ATa~wI)2LV_5)F^A&Q-|M&44tWF%Mbn^3(%$DNh8>P&a`AUZmAGfd1-M^|p^PAe~ zHtLTgPq>+TYf8~B+`X#E3}eY&mQtzWgP^@|e^R7u=Zwh^U)4{Fdb@)mL%m~rNO7`q zMY}64DFeIwD3S?LT1Baj5CeZYRVRzB*6K9T=XZ=WG;u;Su@6NERoQv?%4LHEi!&Jx z2W|?~jvq|IxCX?_`Y131eOZg;Z1BZSMa&@7VmaB_3Uzo6C%b95vHPl$?6&&Uk)5Tc zhzZ^Boa`KRJ?tQ|t1mfCxnZm}8#!XrX`#Sgb9=J4EI4vkLuRCMmq6iMgi2s$=Av_- zi;ykZx|)*0wTEn_dXX)zm-J9TIqU(p+ScJ`U4}TkqBe~pe!kpA_ zlW#Xy*IF!o;xhRDi{RUl7h|H9jKh`AZdV~+FZYrFyJB6K&~EARdy0$f7GW_GPD;lz zTgua~Bob4|*^)`GuOvO>h!)_lI8?3T*FnU0N4k>;A*jxyWnJoUsbjeGFUO_G6_F{2 zb4NY0-Z;)v7emTf^^m^XNgeB$XGMeczYNwT^||I)w|JxINLa7oKQ8a2j&++)nlV`a zt6*J{b-zmZkt~=!m<`B^)6FxV>I6$FdZ~CkmPtQYO?^hTSOHuJu&1<9_<;q8wFHPY z1!(WMNGmjGv1Y*p*e_hJ>TG-N0z_=tIbU`}EI{#ewG!a5a`x7u&=H@e@Q|YY=887+ zTh`*VojN|SM(6s<;+zTslo$1^obfGGaF$vkjw8y$;amtRWv&h-L$osxUi!>M)?H z0wYA*@`KMjwEEb6rQC}fAf&St1miD!8vO4u260(%5!C< z*A7Z~_gVc3W2a9ox>J;$xT@qzcIb#~$K+6Vve@ZUM|O^?xh4*GupH!T=Gb$N$9A=( zR!>~?^$=$DfOq+AdCf-iSIVmY&s{8!1Z1<(EnrsIE!MoxpXh3qrB`ej zd~{Vbx?*kSf90JZ?EBDrHN%yhhpju%_e|g(LbnxL-4a zN77rJC;J{$RBW&~g_WtP_oL?2!qF*1o4r0tz=t3neZeV z2@2(QtsKU1#jccvC%%>|rBRoFXs0ZR1eG`068hu&B@y@v_n@X-Pk zB|Ga#fhOLIM~F0=j{_Q{HHb7}Jqb>AJC;ehxkro)W7QkVNE9|jlT?^F!AVPA?dWjQ z(po&AxNn0*ii$?6Q0rYuv0o<;*0>aFOHW^FcDaUY%C(xq9Ol?M{tt86AD{q00RZPE BDuDn1 literal 0 HcmV?d00001 diff --git a/backups/npmplus/backup-20260225_030001/api/access_lists.json b/backups/npmplus/backup-20260225_030001/api/access_lists.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/backups/npmplus/backup-20260225_030001/api/access_lists.json @@ -0,0 +1 @@ +[] diff --git a/backups/npmplus/backup-20260225_030001/api/certificates.json b/backups/npmplus/backup-20260225_030001/api/certificates.json new file mode 100644 index 0000000..5ebb0b6 --- /dev/null +++ b/backups/npmplus/backup-20260225_030001/api/certificates.json @@ -0,0 +1,685 @@ +[ + { + "id": 146, + "created_on": "2026-02-07 00:46:21", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cacti-alltra.d-bis.org", + "domain_names": [ + "cacti-alltra.d-bis.org" + ], + "expires_on": "2026-05-08 04:47:55", + "meta": {} + }, + { + "id": 147, + "created_on": "2026-02-07 00:46:43", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cacti-hybx.d-bis.org", + "domain_names": [ + "cacti-hybx.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:19", + "meta": {} + }, + { + "id": 155, + "created_on": "2026-02-20 22:27:52", + "modified_on": "2026-02-20 22:27:52", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "codespaces.d-bis.org", + "domain_names": [ + "codespaces.d-bis.org" + ], + "expires_on": "2026-02-20 22:27:52", + "meta": {} + }, + { + "id": 156, + "created_on": "2026-02-20 22:28:48", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "codespaces.d-bis.org", + "domain_names": [ + "codespaces.d-bis.org" + ], + "expires_on": "2026-05-22 02:30:34", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n", + "letsencrypt_agree": true + } + }, + { + "id": 134, + "created_on": "2026-01-29 22:52:44", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cross-all.defi-oracle.io", + "domain_names": [ + "cross-all.defi-oracle.io" + ], + "expires_on": "2026-04-30 02:54:15", + "meta": {} + }, + { + "id": 162, + "created_on": "2026-02-20 22:36:34", + "modified_on": "2026-02-24 20:01:55", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dapp.d-bis.org", + "domain_names": [ + "dapp.d-bis.org" + ], + "expires_on": "2026-05-22 02:38:20", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 46, + "created_on": "2026-01-16 16:54:36", + "modified_on": "2026-02-24 20:01:55", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-admin.d-bis.org", + "domain_names": [ + "dbis-admin.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:11", + "meta": {} + }, + { + "id": 47, + "created_on": "2026-01-16 16:54:47", + "modified_on": "2026-02-24 20:01:55", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-api-2.d-bis.org", + "domain_names": [ + "dbis-api-2.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:22", + "meta": {} + }, + { + "id": 48, + "created_on": "2026-01-16 16:54:58", + "modified_on": "2026-02-24 20:01:55", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-api.d-bis.org", + "domain_names": [ + "dbis-api.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:33", + "meta": {} + }, + { + "id": 157, + "created_on": "2026-02-20 22:29:37", + "modified_on": "2026-02-24 20:01:55", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dev.d-bis.org", + "domain_names": [ + "dev.d-bis.org" + ], + "expires_on": "2026-05-22 02:31:22", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 145, + "created_on": "2026-02-06 19:14:04", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "explorer.d-bis.org", + "domain_names": [ + "explorer.d-bis.org" + ], + "expires_on": "2026-05-07 23:15:36", + "meta": { + "letsencrypt_agree": true, + "dns_challenge": true, + "nginx_online": true, + "nginx_err": null, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0" + } + }, + { + "id": 144, + "created_on": "2026-02-06 19:05:50", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "explorer.defi-oracle.io", + "domain_names": [ + "explorer.defi-oracle.io" + ], + "expires_on": "2026-05-07 23:07:35", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 158, + "created_on": "2026-02-20 22:30:18", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "gitea.d-bis.org", + "domain_names": [ + "gitea.d-bis.org" + ], + "expires_on": "2026-05-22 02:32:04", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 50, + "created_on": "2026-01-16 16:55:25", + "modified_on": "2026-02-24 20:01:55", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "mim4u.org", + "domain_names": [ + "mim4u.org" + ], + "expires_on": "2026-04-16 20:57:01", + "meta": {} + }, + { + "id": 51, + "created_on": "2026-01-16 16:55:37", + "modified_on": "2026-02-24 20:01:55", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "phoenix.sankofa.nexus", + "domain_names": [ + "phoenix.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:57:08", + "meta": {} + }, + { + "id": 159, + "created_on": "2026-02-20 22:31:08", + "modified_on": "2026-02-24 20:01:55", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.ml110.d-bis.org", + "domain_names": [ + "pve.ml110.d-bis.org" + ], + "expires_on": "2026-05-22 02:32:54", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 160, + "created_on": "2026-02-20 22:31:51", + "modified_on": "2026-02-24 20:01:55", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.r630-01.d-bis.org", + "domain_names": [ + "pve.r630-01.d-bis.org" + ], + "expires_on": "2026-05-22 02:33:37", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 161, + "created_on": "2026-02-20 22:32:35", + "modified_on": "2026-02-24 20:01:55", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.r630-02.d-bis.org", + "domain_names": [ + "pve.r630-02.d-bis.org" + ], + "expires_on": "2026-05-22 02:34:21", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 148, + "created_on": "2026-02-07 00:46:56", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-2.d-bis.org", + "domain_names": [ + "rpc-alltra-2.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:31", + "meta": {} + }, + { + "id": 149, + "created_on": "2026-02-07 00:47:10", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-3.d-bis.org", + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:46", + "meta": {} + }, + { + "id": 150, + "created_on": "2026-02-07 08:15:35", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-3.d-bis.org", + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:06", + "meta": {} + }, + { + "id": 151, + "created_on": "2026-02-07 08:15:43", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra.d-bis.org", + "domain_names": [ + "rpc-alltra.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:18", + "meta": {} + }, + { + "id": 163, + "created_on": "2026-02-21 17:45:18", + "modified_on": "2026-02-24 20:01:55", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-fireblocks.d-bis.org", + "domain_names": [ + "rpc-fireblocks.d-bis.org" + ], + "expires_on": "2026-05-22 21:47:15", + "meta": {} + }, + { + "id": 52, + "created_on": "2026-01-16 16:55:45", + "modified_on": "2026-02-24 20:01:55", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-http-prv.d-bis.org", + "domain_names": [ + "rpc-http-prv.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:20", + "meta": {} + }, + { + "id": 53, + "created_on": "2026-01-16 16:55:57", + "modified_on": "2026-02-24 20:01:55", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-http-pub.d-bis.org", + "domain_names": [ + "rpc-http-pub.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:30", + "meta": {} + }, + { + "id": 152, + "created_on": "2026-02-07 08:15:56", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx-2.d-bis.org", + "domain_names": [ + "rpc-hybx-2.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:31", + "meta": {} + }, + { + "id": 153, + "created_on": "2026-02-07 08:16:09", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx-3.d-bis.org", + "domain_names": [ + "rpc-hybx-3.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:45", + "meta": {} + }, + { + "id": 154, + "created_on": "2026-02-07 08:16:22", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx.d-bis.org", + "domain_names": [ + "rpc-hybx.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:58", + "meta": {} + }, + { + "id": 54, + "created_on": "2026-01-16 16:56:06", + "modified_on": "2026-02-24 20:01:55", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-ws-prv.d-bis.org", + "domain_names": [ + "rpc-ws-prv.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:38", + "meta": {} + }, + { + "id": 55, + "created_on": "2026-01-16 16:56:16", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-ws-pub.d-bis.org", + "domain_names": [ + "rpc-ws-pub.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:51", + "meta": {} + }, + { + "id": 141, + "created_on": "2026-01-30 09:33:59", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc.d-bis.org", + "domain_names": [ + "rpc.d-bis.org" + ], + "expires_on": "2026-04-30 13:35:45", + "meta": { + "letsencrypt_agree": true, + "dns_challenge": true, + "nginx_online": false, + "nginx_err": "nginx: [emerg] cannot load certificate \"/data/tls/certbot/live/npm-135/fullchain.pem\": BIO_new_file() failed (SSL: error:80000002:system library::No such file or directory:calling fopen(/data/tls/certbot/live/npm-135/fullchain.pem, r) error:10000080:BIO routines::no such file)\nnginx: configuration file /usr/local/nginx/conf/nginx.conf test failed", + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\ndns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0" + } + }, + { + "id": 56, + "created_on": "2026-01-16 16:56:30", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc.public-0138.defi-oracle.io", + "domain_names": [ + "rpc.public-0138.defi-oracle.io" + ], + "expires_on": "2026-04-16 20:58:05", + "meta": {} + }, + { + "id": 137, + "created_on": "2026-01-29 23:39:01", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc2.d-bis.org", + "domain_names": [ + "rpc2.d-bis.org" + ], + "expires_on": "2026-04-30 03:40:50", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 57, + "created_on": "2026-01-16 16:56:41", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "sankofa.nexus", + "domain_names": [ + "sankofa.nexus" + ], + "expires_on": "2026-04-16 20:58:17", + "meta": {} + }, + { + "id": 58, + "created_on": "2026-01-16 16:56:53", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "secure.d-bis.org", + "domain_names": [ + "secure.d-bis.org" + ], + "expires_on": "2026-04-16 20:58:28", + "meta": {} + }, + { + "id": 59, + "created_on": "2026-01-16 16:57:05", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "secure.mim4u.org", + "domain_names": [ + "secure.mim4u.org" + ], + "expires_on": "2026-04-16 20:58:40", + "meta": {} + }, + { + "id": 60, + "created_on": "2026-01-16 16:57:17", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "the-order.sankofa.nexus", + "domain_names": [ + "the-order.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:58:53", + "meta": {} + }, + { + "id": 61, + "created_on": "2026-01-16 16:57:31", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "training.mim4u.org", + "domain_names": [ + "training.mim4u.org" + ], + "expires_on": "2026-04-16 20:59:06", + "meta": {} + }, + { + "id": 164, + "created_on": "2026-02-21 17:46:22", + "modified_on": "2026-02-24 20:01:55", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc-fireblocks.d-bis.org", + "domain_names": [ + "ws.rpc-fireblocks.d-bis.org" + ], + "expires_on": "2026-05-22 21:48:21", + "meta": {} + }, + { + "id": 138, + "created_on": "2026-01-29 23:41:20", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc.d-bis.org", + "domain_names": [ + "ws.rpc.d-bis.org" + ], + "expires_on": "2026-04-30 03:43:05", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 139, + "created_on": "2026-01-29 23:42:13", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc2.d-bis.org", + "domain_names": [ + "ws.rpc2.d-bis.org" + ], + "expires_on": "2026-04-30 03:43:58", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 140, + "created_on": "2026-01-29 23:43:09", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "wss.defi-oracle.io", + "domain_names": [ + "wss.defi-oracle.io" + ], + "expires_on": "2026-04-30 03:44:57", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 62, + "created_on": "2026-01-16 16:57:41", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.mim4u.org", + "domain_names": [ + "www.mim4u.org" + ], + "expires_on": "2026-04-16 20:59:17", + "meta": {} + }, + { + "id": 63, + "created_on": "2026-01-16 16:57:52", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.phoenix.sankofa.nexus", + "domain_names": [ + "www.phoenix.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:59:28", + "meta": {} + }, + { + "id": 64, + "created_on": "2026-01-16 16:58:06", + "modified_on": "2026-02-24 20:01:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.sankofa.nexus", + "domain_names": [ + "www.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:59:41", + "meta": {} + } +] diff --git a/backups/npmplus/backup-20260225_030001/api/proxy_hosts.json b/backups/npmplus/backup-20260225_030001/api/proxy_hosts.json new file mode 100644 index 0000000..c3a761e --- /dev/null +++ b/backups/npmplus/backup-20260225_030001/api/proxy_hosts.json @@ -0,0 +1,1394 @@ +[ + { + "id": 37, + "created_on": "2026-02-07 00:42:23", + "modified_on": "2026-02-07 00:46:30", + "owner_user_id": 1, + "domain_names": [ + "cacti-alltra.d-bis.org" + ], + "forward_host": "192.168.11.177", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 146, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 38, + "created_on": "2026-02-07 00:42:24", + "modified_on": "2026-02-07 00:46:53", + "owner_user_id": 1, + "domain_names": [ + "cacti-hybx.d-bis.org" + ], + "forward_host": "192.168.11.251", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 147, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 41, + "created_on": "2026-02-07 20:41:16", + "modified_on": "2026-02-20 22:29:09", + "owner_user_id": 1, + "domain_names": [ + "codespaces.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 156, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 22, + "created_on": "2026-01-18 22:19:18", + "modified_on": "2026-01-29 22:52:50", + "owner_user_id": 1, + "domain_names": [ + "cross-all.defi-oracle.io" + ], + "forward_host": "192.168.11.211", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 134, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 49, + "created_on": "2026-02-20 22:27:16", + "modified_on": "2026-02-20 22:37:53", + "owner_user_id": 1, + "domain_names": [ + "dapp.d-bis.org" + ], + "forward_host": "192.168.11.58", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 162, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 13, + "created_on": "2026-01-16 14:41:02", + "modified_on": "2026-02-24 09:23:16", + "owner_user_id": 1, + "domain_names": [ + "dbis-admin.d-bis.org" + ], + "forward_host": "192.168.11.130", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 46, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 15, + "created_on": "2026-01-16 14:41:04", + "modified_on": "2026-02-24 09:23:21", + "owner_user_id": 1, + "domain_names": [ + "dbis-api-2.d-bis.org" + ], + "forward_host": "192.168.11.156", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 47, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 14, + "created_on": "2026-01-16 14:41:03", + "modified_on": "2026-02-24 09:23:18", + "owner_user_id": 1, + "domain_names": [ + "dbis-api.d-bis.org" + ], + "forward_host": "192.168.11.155", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 48, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 45, + "created_on": "2026-02-13 20:32:33", + "modified_on": "2026-02-13 20:32:33", + "owner_user_id": 1, + "domain_names": [ + "dbis.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3001, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 39, + "created_on": "2026-02-07 20:41:12", + "modified_on": "2026-02-20 22:29:57", + "owner_user_id": 1, + "domain_names": [ + "dev.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 157, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 8, + "created_on": "2026-01-16 14:40:58", + "modified_on": "2026-02-24 09:22:35", + "owner_user_id": 1, + "domain_names": [ + "explorer.d-bis.org" + ], + "forward_host": "192.168.11.140", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 145, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers (unsafe-eval for ethers.js v5)\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 30, + "created_on": "2026-01-31 00:13:09", + "modified_on": "2026-02-06 19:09:43", + "owner_user_id": 1, + "domain_names": [ + "explorer.defi-oracle.io" + ], + "forward_host": "192.168.11.140", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 144, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 40, + "created_on": "2026-02-07 20:41:14", + "modified_on": "2026-02-20 22:30:39", + "owner_user_id": 1, + "domain_names": [ + "gitea.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 158, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 46, + "created_on": "2026-02-13 20:32:35", + "modified_on": "2026-02-13 20:32:35", + "owner_user_id": 1, + "domain_names": [ + "iccc.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3002, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 17, + "created_on": "2026-01-16 14:41:05", + "modified_on": "2026-02-24 09:23:27", + "owner_user_id": 1, + "domain_names": [ + "mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 50, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 47, + "created_on": "2026-02-13 20:32:37", + "modified_on": "2026-02-13 20:32:37", + "owner_user_id": 1, + "domain_names": [ + "omnl.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3003, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 5, + "created_on": "2026-01-16 14:40:55", + "modified_on": "2026-01-16 17:01:49", + "owner_user_id": 1, + "domain_names": [ + "phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.50", + "forward_port": 4000, + "access_list_id": 0, + "certificate_id": 51, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 42, + "created_on": "2026-02-07 20:41:17", + "modified_on": "2026-02-20 22:31:27", + "owner_user_id": 1, + "domain_names": [ + "pve.ml110.d-bis.org" + ], + "forward_host": "192.168.11.10", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 159, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 43, + "created_on": "2026-02-07 20:41:19", + "modified_on": "2026-02-20 22:32:14", + "owner_user_id": 1, + "domain_names": [ + "pve.r630-01.d-bis.org" + ], + "forward_host": "192.168.11.11", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 160, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 44, + "created_on": "2026-02-07 20:41:21", + "modified_on": "2026-02-20 22:32:57", + "owner_user_id": 1, + "domain_names": [ + "pve.r630-02.d-bis.org" + ], + "forward_host": "192.168.11.12", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 161, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 32, + "created_on": "2026-02-07 00:42:16", + "modified_on": "2026-02-07 00:47:07", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra-2.d-bis.org" + ], + "forward_host": "192.168.11.173", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 148, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 33, + "created_on": "2026-02-07 00:42:17", + "modified_on": "2026-02-07 08:15:41", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "forward_host": "192.168.11.174", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 150, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 31, + "created_on": "2026-02-07 00:42:15", + "modified_on": "2026-02-07 08:15:53", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra.d-bis.org" + ], + "forward_host": "192.168.11.172", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 151, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 50, + "created_on": "2026-02-21 17:37:16", + "modified_on": "2026-02-24 09:23:10", + "owner_user_id": 1, + "domain_names": [ + "rpc-fireblocks.d-bis.org" + ], + "forward_host": "192.168.11.232", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 163, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 11, + "created_on": "2026-01-16 14:41:00", + "modified_on": "2026-02-24 09:22:44", + "owner_user_id": 1, + "domain_names": [ + "rpc-http-prv.d-bis.org" + ], + "forward_host": "192.168.11.211", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 52, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 9, + "created_on": "2026-01-16 14:40:59", + "modified_on": "2026-02-24 09:22:37", + "owner_user_id": 1, + "domain_names": [ + "rpc-http-pub.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 53, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 35, + "created_on": "2026-02-07 00:42:20", + "modified_on": "2026-02-07 08:16:06", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx-2.d-bis.org" + ], + "forward_host": "192.168.11.247", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 152, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 36, + "created_on": "2026-02-07 00:42:22", + "modified_on": "2026-02-07 08:16:19", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx-3.d-bis.org" + ], + "forward_host": "192.168.11.248", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 153, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 34, + "created_on": "2026-02-07 00:42:19", + "modified_on": "2026-02-07 08:16:32", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx.d-bis.org" + ], + "forward_host": "192.168.11.246", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 154, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 12, + "created_on": "2026-01-16 14:41:01", + "modified_on": "2026-02-24 09:22:46", + "owner_user_id": 1, + "domain_names": [ + "rpc-ws-prv.d-bis.org" + ], + "forward_host": "192.168.11.211", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 54, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 10, + "created_on": "2026-01-16 14:40:59", + "modified_on": "2026-02-24 09:22:40", + "owner_user_id": 1, + "domain_names": [ + "rpc-ws-pub.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 55, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 26, + "created_on": "2026-01-29 16:35:10", + "modified_on": "2026-02-24 09:22:59", + "owner_user_id": 1, + "domain_names": [ + "rpc.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 141, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\ndns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 24, + "created_on": "2026-01-29 15:38:44", + "modified_on": "2026-02-24 09:22:50", + "owner_user_id": 1, + "domain_names": [ + "rpc.defi-oracle.io" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 56, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 21, + "created_on": "2026-01-16 14:41:09", + "modified_on": "2026-02-24 09:22:48", + "owner_user_id": 1, + "domain_names": [ + "rpc.public-0138.defi-oracle.io" + ], + "forward_host": "192.168.11.240", + "forward_port": 443, + "access_list_id": 0, + "certificate_id": 56, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "https", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 27, + "created_on": "2026-01-29 16:35:11", + "modified_on": "2026-02-24 09:23:02", + "owner_user_id": 1, + "domain_names": [ + "rpc2.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 137, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 3, + "created_on": "2026-01-16 14:40:54", + "modified_on": "2026-01-16 17:01:32", + "owner_user_id": 1, + "domain_names": [ + "sankofa.nexus" + ], + "forward_host": "192.168.11.51", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 57, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "add_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 16, + "created_on": "2026-01-16 14:41:04", + "modified_on": "2026-02-24 09:23:25", + "owner_user_id": 1, + "domain_names": [ + "secure.d-bis.org" + ], + "forward_host": "192.168.11.130", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 58, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 19, + "created_on": "2026-01-16 14:41:07", + "modified_on": "2026-02-24 09:23:34", + "owner_user_id": 1, + "domain_names": [ + "secure.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 59, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 7, + "created_on": "2026-01-16 14:40:57", + "modified_on": "2026-01-16 17:02:09", + "owner_user_id": 1, + "domain_names": [ + "the-order.sankofa.nexus" + ], + "forward_host": "192.168.11.36", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 60, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 20, + "created_on": "2026-01-16 14:41:08", + "modified_on": "2026-02-24 09:23:38", + "owner_user_id": 1, + "domain_names": [ + "training.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 61, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 51, + "created_on": "2026-02-21 17:37:45", + "modified_on": "2026-02-24 09:23:12", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc-fireblocks.d-bis.org" + ], + "forward_host": "192.168.11.232", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 164, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 28, + "created_on": "2026-01-29 16:35:12", + "modified_on": "2026-02-24 09:23:06", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 138, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 29, + "created_on": "2026-01-29 16:35:12", + "modified_on": "2026-02-24 09:23:09", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc2.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 139, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 25, + "created_on": "2026-01-29 15:38:45", + "modified_on": "2026-02-24 09:22:53", + "owner_user_id": 1, + "domain_names": [ + "wss.defi-oracle.io" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 140, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 18, + "created_on": "2026-01-16 14:41:06", + "modified_on": "2026-01-16 17:02:14", + "owner_user_id": 1, + "domain_names": [ + "www.mim4u.org" + ], + "forward_host": "192.168.11.36", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 62, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 6, + "created_on": "2026-01-16 14:40:56", + "modified_on": "2026-01-16 17:02:17", + "owner_user_id": 1, + "domain_names": [ + "www.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.50", + "forward_port": 4000, + "access_list_id": 0, + "certificate_id": 63, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 4, + "created_on": "2026-01-16 14:40:55", + "modified_on": "2026-01-16 17:02:19", + "owner_user_id": 1, + "domain_names": [ + "www.sankofa.nexus" + ], + "forward_host": "192.168.11.51", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 64, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 48, + "created_on": "2026-02-13 20:32:39", + "modified_on": "2026-02-13 20:32:39", + "owner_user_id": 1, + "domain_names": [ + "xom.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3004, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + } +] diff --git a/backups/npmplus/backup-20260225_030001/certificates/cert_list.txt b/backups/npmplus/backup-20260225_030001/certificates/cert_list.txt new file mode 100644 index 0000000..e69de29 diff --git a/backups/npmplus/backup-20260225_030001/database/database.sql b/backups/npmplus/backup-20260225_030001/database/database.sql new file mode 100644 index 0000000..77149a3 --- /dev/null +++ b/backups/npmplus/backup-20260225_030001/database/database.sql @@ -0,0 +1 @@ +Database file not found diff --git a/backups/npmplus/backup-20260225_030001/database/database.sqlite b/backups/npmplus/backup-20260225_030001/database/database.sqlite new file mode 100644 index 0000000..e69de29 diff --git a/backups/npmplus/backup-20260225_030001/manifest.json b/backups/npmplus/backup-20260225_030001/manifest.json new file mode 100644 index 0000000..42efbea --- /dev/null +++ b/backups/npmplus/backup-20260225_030001/manifest.json @@ -0,0 +1,19 @@ +{ + "timestamp": "20260225_030001", + "backup_date": "2026-02-25T03:00:13-08:00", + "npmplus_vmid": "10233", + "npmplus_host": "192.168.11.11", + "npm_url": "https://192.168.11.167:81", + "backup_contents": { + "database": { + "sql_dump": "present", + "sqlite_file": "missing" + }, + "api_exports": { + "proxy_hosts": "present", + "certificates": "present", + "access_lists": "present" + }, + "certificate_files": "missing" + } +} diff --git a/backups/npmplus/backup-20260225_030001/volumes/volume_list.txt b/backups/npmplus/backup-20260225_030001/volumes/volume_list.txt new file mode 100644 index 0000000..4545150 --- /dev/null +++ b/backups/npmplus/backup-20260225_030001/volumes/volume_list.txt @@ -0,0 +1 @@ +DRIVER VOLUME NAME diff --git a/backups/npmplus/backup-20260226_030001.tar.gz b/backups/npmplus/backup-20260226_030001.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..84dad87258a46e52577bcdea188b7e985e6bd8bc GIT binary patch literal 5290 zcmV;b6jkdViwFP!000001MOXFkJ~o7p3nIe!t_HDp!SfWD0@@{*lwHM4bUb3!9UP+z{4*K5@DcLgZkw}W>cLE%m4iP)_MQquWw&G^;6m7P)E!7pNB~_ zBXrRJk*CSN_mGYM0rYmpKgOON{|7n#?}g)>7ZK(9BAhSI1Lu4P3g_Rm78OiJ)36}x zHa+0>T>mpb0RRE?dSFQZQngMN^F_SOM>q3m%9=y^VbS)f>ohOQQ~&Er^5EivZ{-hy;r3Ha(xf0sk<%XRb?6EDoZ&dkN&Or8yZpcLXu7Q4agmXn z_9(BiJ{c8cG>hW${pL}gN6FQBdHT<))p@vxM&xdhX55_|cCGa8zI>m&@zN8L711o3 zP|-Cv2qzPg=j9x`)nM!9+*Qh_%y%C1&li7cv3AS&UklKP0@z9a^AXek=)+k3?+}OV z`>+4fuSSU0J*4{IgYQ4UcwqVe5J#8quX_*a_eT%DKk$M5{)aezUVUGOO)5^37S1eP zCR1wxJd>kk{PRl7-a0@x|BqYh{{Y$f{}6}D_hI{y)Ug^8Kl; zV=e~JZTv&#|M!7!$NwP?!T0A3+x^@?!toD13@A3XzyAP2-;V!79A92IYo|%+t3iXc z!yzM-{HLQd;T=9;-~bSKZs4Mo1LJ(2PU%e1*3u6UShq}X6OxUVIsK!&7hL^*n$E*0 z871MobZdO6JtyI$h=U@;n~V>rDvzb&)N}x=T2@j*_bpNy2elo}7hozCJsS)5$mH zK8n+*bo1~h!|6?!&#a6d~_zO0J^hj*2>t60&vw`W(qJdLmiI@wWFW zj?>%GEg9$ZK}a!LF0Qh0N_L)vIo#Y)zFe#%#l7EJhWX^0%*on2w|>seTXS9LJBLM- zCi&`t);FPyGHUElp2?Tv3K9A03{9eRU{QKR zDD|KWr7p!D44^MTsS6yJg84E4m)a;zrzBs56iON>^+5|rnYz#&rnr$z`A>WpoKBN` zG`XgrBgxeRpt6%x2fB%-gkkl35~s`QEDker-q>bDKk}3$MMR&4wg1lfsqW$Y_}e?D zNWYQfYxXtyuDox3a>ODF<;gcbo(^YVK*nP<10MEf(}_oh*cWT!Qsg9=WcQ0= z6kcVdg#!-85B#}33F6D|&GfK!`v?3`o^2us*A);1?7<-$_V6-*Lm@%Ho_on!V)~!H zx|OAQ&eW~`l+2r z@X#PUefKEf*+jM6r5fhA?X!;nZysJJL&Ok?iP)#QHPh69D}%S^fJyeY7I z;dCA)I#w@gQ`Iz3ZrbSOdNyGEJLeObEVHP%cm72vma_b75>Dw`mj7`6)BCAP^yq!Q zUy$C1MF|Dx>v@vqNi>^%J$J(RHoVV&*y;8Us_*daKmGXY+YcY#{qx=X)-M0~^r`n- zmKJ2fI?+Dx2Zw%e@}_*HmTn)(j1Cr(^?pm^XmU?`(PlhT*gH&&nC{xoW!%2KREd$ix&K^oR`Za4`-wom7{v|Z*mjHFP$o< z#$kcofc7r#VhuHkx1YC(GZin^3`xX%qUj6Drh(Yux7LAGFP!Orx;< zF6sD>`U*)(pYaEWMKF6*R<%$lR_DF2`gmIxp{GhTFzn?;n&tI1Rs=?0JZEwzy^Q>K zN!#T7S7M6y+a#x_9jf*(=*Rl`!%v_8_qVsst7zshXDUgi&NL-?^0IJNmVpx$uUW_U z6i8HbLI&%gfSjMM48L&7|Y@2%z{ z)?6S~q;{FBsHS!o?nmv5sORcXJN8Xl;ii2>mfS75TXMJLepqt%6v_80LiGmp`{MB_wUkqZ%S_Zi|dpm(Oo|e zlW*xP>?h=InX7vty>_ODotYjq5&hu;X-5;6X~&+XLlBAm-J8&@)FHSI-Qs~Z`Y7n0 zK4#l!F4~yw$;NDLytX?lh_a4qYXbyW9Imac4LT)ZT~a7V64hFDtPRg#i~!d2^b;8y z&MQt&W*VeJifj7&{vWw>gI`-)#M&Z9WQ*8o?b%Li<}9tYSxqmM76>Ob1X+SCL|p1& zTPiJ`{#b@$;Az`gn@LSC15 z!L&)&=q9!%ot^uhkx5tQILX|MSlP{}ZPP`Q$>acTMz=FnSU2M%xf!8oy&WIFl%a2v zoTBY!oJVtS*=asP23OeOMvNUWW|`@F3U)gx`3iPBDSHbtWB!87dJIm%W5B*srEBO# zFtaC!VOo>Lh{+;ejJ;7f2Fj|5_T-SxllTCt3Ff_R1>ANSrA~cW>U2r1ONt} zw!OS3-rB5YPseJ;unBOF<`lBYRaQMYZuP__SDj*Vm1yBH?+uly7AtQk+{5l%+>rh} zh7jn4vfKUr!0*iM5MMTtyY+}#kLdGR3hRlM!t&H0iwCZ#!R10KI@FN)2v9vzhaB4L z5$KSE|HP(-B?n6mPfiY^^)?(iY?esM$U#3Xc0&$Yt0`Tx0C1eGbVEIkmq|ns8G4>-L)RZ}Z3S)^$%fIWS7CJ!kDX zYtLDG&M>))OAl$d>%6_g}V7rPX+K)=b}DSl;s6b~oEPbs-A5tQ-ig+5 z?DR;st3JZ2DyNBZ)f_N&vqO8+Ack^kb5K2#-Wm6^RUPSJ7O}U!O#{ zp4MiwHruHY=(D%kPLtM^7Vto>Fo=xSk@oV;6|FyUS^UO|ga>4GTNdB)`%&_{EsK9T zvxL#I_)1%*0Isl{*m>Y`ah|SIL~%_hfl!{%EKQDDQ`fuC6wT!+ZP3OV0MB%Sum->h z8UU_RN-#A56t~!>27q>KzR2jWDPumd3D8_x)S3X+1bFTYZ%u&HnJ0{z09afXu`W30 zDQ}wywF8K^dH->1&goR6wrg0ANv9bK(8?#G$m#)X5>d3*uvTb&`Xx>fJ%`PwZ7Ryq zr=qyxh=b1H)OIITgVT7Tn9k^Y4jUoa(Ruu%Q@ji1W|V|aSc zVJjj#Jdb{OLa}DM@z#k8e{-=I{k_6&Z*O%RbtWS)wt}*az*zsBjli6A1V$;b76e$G z(zQz{GfF?Ey}u8Y6mP?8@wS>AX+>?@h_gzAAj%2A7oSz0OSk#E#SbkY~^l z*bY5KSKy1^U!2+F)DOnW%SDe3eBiqN2r%^tUWAM2f*VtL|BpOPbnij02z=jTKj8oa z{^#mIXAnaSfQ$Trdq&Sf?4CKmv;`p)~(DRh`uJHp`S~LkeZ2LTqE8^0oL-IjlF7&$YmP8X$ zDwt&unb|rI_o0?(qbzlDrYcv!r_mkXFkT>3Gj$yg6t8WCPPCHW$xictsQHT97S zulZ%g!V?eO)%Av4u}T^8HiP`Mgok^s>j3%+fLs2*kJq3+@kFJQziY^BDNnvp%514t zI(+!JdwuTyZ3UX&bWXQXe$b#6A=uRAsC1mCptX5@#}S;FbrvI)R%4wHHq3QPKh8O??!YfxfKEayIy4ry^z$ zYO$Q`JZT-Cni!1g5|tbl(bn#(O0wJO(?xc!nj$82!*jC3ih3AU*!V(6cHJeXDK~`F zW+N;%omL9$CATNLOo4^cbyA%KM{YXEjI{0&D4dI61I+APbn0^v^dwtXQ&PALpr=r; zvUUp?C51Aim61#x;0-+#P!0wTTWyQ^Syy3+^aIegB3gTl*kPbJ3`8iGY$;r#9AM6+ zC7b%pstp^=cCyLZx+&uw4CuR9RzFHO@5Aa?oN=+TpFseXU2gLAFJ16{6&0j|n|!yq zy4K?I6PLyJUj*M+UW|!aGMFo!EwyB%MYg-Zd$Zh20_>J`VM4oQ!0#z8vRj13NH{5} znk`sijcOMuHK$)mB&LwFC6nGzNqP{A7U0($s#5W*=1`+CpT!O7&tnLII*&GW>B6Ph za_L`=OQA0!Qx4}?IkIln*Umtj`3O+X>W1`(oz$_8cviGn|I1)qQlG2By2~3yPlWXj z{^RCO>R9LF=@#pM8LUgP?(2jf$%0u9>z>g-G%HS5Wj=KYmbCOz@p!D0evq2_3_Y;| zxDwz%VWaR`fJUthP83K>fJjq--UAnDiv}&$ESLa?rOQ>BZ9StJ^b-gWvSsId*%7e- z#nV+SK=qtGWHj)!5rvNUG=&Eh?KfYvncun=r-zk&V1D2ljcl|Q=Ts1&yr^gEjPJsd zv(yrCuqY3Qb0NsfT-7cFqe-Jo7HoM@Z;^EffwuIL%8zp*Jj}~!mY;k>$x?ojJs~*x zdBz8DC5h!&M}Awqy2uZy$qxzv$T6V05`)YG@P2&PRfT!brwaqBDlkIy)xz@?_LHv@ zZ;fk!r64-az7P6z5uT@*f`}y{!?o~SY07skJfk6$wII5SPE&ALZQd2it)@I*R(g%6 zJmYe^&AU$+5BhYXJ4M-vt4h|ggX*#~t}rt>be$|7^ywlytZJ@_!yPOK`I0&Iup--G zE_7%}c%7uyO6q{e!*>nUn15cUC$fNed@V!>Plq-E+R4 zU$A--7e$4%aS=y1ZF-7r6QaZDLplz z?;9mo&MaM!vd{Hq~GI?5|Ei@?!PE&2BQYuC#-fI4vKynG=<=rF~wblyRbI4X{ti zEsiGianP`129Kn-I!_J*ps3g&aSAnCphAh{l8-XW7O0r!$!^MY$FylS5umb=)CsMv zIKG<0f)T5fqwfcvGQf~gv!heKfo`6`kXyDT*7=mO@_jD%LMknz!|}l;@-l%5H=UQr z%vIEr<-0NaWvYj=TM8LX=X|h3vzp9wvVn%&bS9LUFwD=%3@W>#%(_F{wk(y1PHCr8 zi3G9QIuK#-n3Et<<~7%7@VH@HK$-9)8wm>KcBvf3@Wrl_l_y@^mBOzUGa)$9PFWHO zDsQqS^v4eyBJeHBn{>-2s=RrS_fN}|H={Xy54LeqlAo3WhZ;0qtH2pa9YE5(hZxFS z4m(nmJ;H$PU?oU4Fp}Wxq36@$%uI@kSSMNG3@HaFZ~%;23Jp8!NP#Bai${nwkB}()*dY*Rw(QZv8s`eq)0djptl`>nt@f~oJ$8=&2Vi-@LI6Mk01>&Y{r~^~ literal 0 HcmV?d00001 diff --git a/backups/npmplus/backup-20260226_030001/api/access_lists.json b/backups/npmplus/backup-20260226_030001/api/access_lists.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/backups/npmplus/backup-20260226_030001/api/access_lists.json @@ -0,0 +1 @@ +[] diff --git a/backups/npmplus/backup-20260226_030001/api/certificates.json b/backups/npmplus/backup-20260226_030001/api/certificates.json new file mode 100644 index 0000000..82dba79 --- /dev/null +++ b/backups/npmplus/backup-20260226_030001/api/certificates.json @@ -0,0 +1,685 @@ +[ + { + "id": 146, + "created_on": "2026-02-07 00:46:21", + "modified_on": "2026-02-25 22:34:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cacti-alltra.d-bis.org", + "domain_names": [ + "cacti-alltra.d-bis.org" + ], + "expires_on": "2026-05-08 04:47:55", + "meta": {} + }, + { + "id": 147, + "created_on": "2026-02-07 00:46:43", + "modified_on": "2026-02-25 22:34:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cacti-hybx.d-bis.org", + "domain_names": [ + "cacti-hybx.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:19", + "meta": {} + }, + { + "id": 155, + "created_on": "2026-02-20 22:27:52", + "modified_on": "2026-02-20 22:27:52", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "codespaces.d-bis.org", + "domain_names": [ + "codespaces.d-bis.org" + ], + "expires_on": "2026-02-20 22:27:52", + "meta": {} + }, + { + "id": 156, + "created_on": "2026-02-20 22:28:48", + "modified_on": "2026-02-25 22:34:21", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "codespaces.d-bis.org", + "domain_names": [ + "codespaces.d-bis.org" + ], + "expires_on": "2026-05-22 02:30:34", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n", + "letsencrypt_agree": true + } + }, + { + "id": 134, + "created_on": "2026-01-29 22:52:44", + "modified_on": "2026-02-25 22:35:17", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cross-all.defi-oracle.io", + "domain_names": [ + "cross-all.defi-oracle.io" + ], + "expires_on": "2026-04-30 02:54:15", + "meta": {} + }, + { + "id": 162, + "created_on": "2026-02-20 22:36:34", + "modified_on": "2026-02-25 22:36:08", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dapp.d-bis.org", + "domain_names": [ + "dapp.d-bis.org" + ], + "expires_on": "2026-05-22 02:38:20", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 46, + "created_on": "2026-01-16 16:54:36", + "modified_on": "2026-02-25 22:36:19", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-admin.d-bis.org", + "domain_names": [ + "dbis-admin.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:11", + "meta": {} + }, + { + "id": 47, + "created_on": "2026-01-16 16:54:47", + "modified_on": "2026-02-25 22:36:01", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-api-2.d-bis.org", + "domain_names": [ + "dbis-api-2.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:22", + "meta": {} + }, + { + "id": 48, + "created_on": "2026-01-16 16:54:58", + "modified_on": "2026-02-25 22:35:59", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-api.d-bis.org", + "domain_names": [ + "dbis-api.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:33", + "meta": {} + }, + { + "id": 157, + "created_on": "2026-02-20 22:29:37", + "modified_on": "2026-02-25 22:34:16", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dev.d-bis.org", + "domain_names": [ + "dev.d-bis.org" + ], + "expires_on": "2026-05-22 02:31:22", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 145, + "created_on": "2026-02-06 19:14:04", + "modified_on": "2026-02-25 22:34:59", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "explorer.d-bis.org", + "domain_names": [ + "explorer.d-bis.org" + ], + "expires_on": "2026-05-07 23:15:36", + "meta": { + "letsencrypt_agree": true, + "dns_challenge": true, + "nginx_online": true, + "nginx_err": null, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0" + } + }, + { + "id": 144, + "created_on": "2026-02-06 19:05:50", + "modified_on": "2026-02-25 22:35:01", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "explorer.defi-oracle.io", + "domain_names": [ + "explorer.defi-oracle.io" + ], + "expires_on": "2026-05-07 23:07:35", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 158, + "created_on": "2026-02-20 22:30:18", + "modified_on": "2026-02-25 22:34:14", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "gitea.d-bis.org", + "domain_names": [ + "gitea.d-bis.org" + ], + "expires_on": "2026-05-22 02:32:04", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 50, + "created_on": "2026-01-16 16:55:25", + "modified_on": "2026-02-25 22:35:55", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "mim4u.org", + "domain_names": [ + "mim4u.org" + ], + "expires_on": "2026-04-16 20:57:01", + "meta": {} + }, + { + "id": 51, + "created_on": "2026-01-16 16:55:37", + "modified_on": "2026-02-25 22:35:53", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "phoenix.sankofa.nexus", + "domain_names": [ + "phoenix.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:57:08", + "meta": {} + }, + { + "id": 159, + "created_on": "2026-02-20 22:31:08", + "modified_on": "2026-02-25 22:34:12", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.ml110.d-bis.org", + "domain_names": [ + "pve.ml110.d-bis.org" + ], + "expires_on": "2026-05-22 02:32:54", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 160, + "created_on": "2026-02-20 22:31:51", + "modified_on": "2026-02-25 22:34:08", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.r630-01.d-bis.org", + "domain_names": [ + "pve.r630-01.d-bis.org" + ], + "expires_on": "2026-05-22 02:33:37", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 161, + "created_on": "2026-02-20 22:32:35", + "modified_on": "2026-02-25 22:34:08", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.r630-02.d-bis.org", + "domain_names": [ + "pve.r630-02.d-bis.org" + ], + "expires_on": "2026-05-22 02:34:21", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 148, + "created_on": "2026-02-07 00:46:56", + "modified_on": "2026-02-25 22:34:47", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-2.d-bis.org", + "domain_names": [ + "rpc-alltra-2.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:31", + "meta": {} + }, + { + "id": 149, + "created_on": "2026-02-07 00:47:10", + "modified_on": "2026-02-25 22:34:45", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-3.d-bis.org", + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:46", + "meta": {} + }, + { + "id": 150, + "created_on": "2026-02-07 08:15:35", + "modified_on": "2026-02-25 22:34:42", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-3.d-bis.org", + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:06", + "meta": {} + }, + { + "id": 151, + "created_on": "2026-02-07 08:15:43", + "modified_on": "2026-02-25 22:34:36", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra.d-bis.org", + "domain_names": [ + "rpc-alltra.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:18", + "meta": {} + }, + { + "id": 163, + "created_on": "2026-02-21 17:45:18", + "modified_on": "2026-02-25 22:36:29", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-fireblocks.d-bis.org", + "domain_names": [ + "rpc-fireblocks.d-bis.org" + ], + "expires_on": "2026-05-22 21:47:15", + "meta": {} + }, + { + "id": 52, + "created_on": "2026-01-16 16:55:45", + "modified_on": "2026-02-25 22:35:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-http-prv.d-bis.org", + "domain_names": [ + "rpc-http-prv.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:20", + "meta": {} + }, + { + "id": 53, + "created_on": "2026-01-16 16:55:57", + "modified_on": "2026-02-25 22:35:46", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-http-pub.d-bis.org", + "domain_names": [ + "rpc-http-pub.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:30", + "meta": {} + }, + { + "id": 152, + "created_on": "2026-02-07 08:15:56", + "modified_on": "2026-02-25 22:34:30", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx-2.d-bis.org", + "domain_names": [ + "rpc-hybx-2.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:31", + "meta": {} + }, + { + "id": 153, + "created_on": "2026-02-07 08:16:09", + "modified_on": "2026-02-25 22:34:27", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx-3.d-bis.org", + "domain_names": [ + "rpc-hybx-3.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:45", + "meta": {} + }, + { + "id": 154, + "created_on": "2026-02-07 08:16:22", + "modified_on": "2026-02-25 22:34:24", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx.d-bis.org", + "domain_names": [ + "rpc-hybx.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:58", + "meta": {} + }, + { + "id": 54, + "created_on": "2026-01-16 16:56:06", + "modified_on": "2026-02-25 22:35:44", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-ws-prv.d-bis.org", + "domain_names": [ + "rpc-ws-prv.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:38", + "meta": {} + }, + { + "id": 55, + "created_on": "2026-01-16 16:56:16", + "modified_on": "2026-02-25 22:35:42", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-ws-pub.d-bis.org", + "domain_names": [ + "rpc-ws-pub.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:51", + "meta": {} + }, + { + "id": 141, + "created_on": "2026-01-30 09:33:59", + "modified_on": "2026-02-25 22:35:04", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc.d-bis.org", + "domain_names": [ + "rpc.d-bis.org" + ], + "expires_on": "2026-04-30 13:35:45", + "meta": { + "letsencrypt_agree": true, + "dns_challenge": true, + "nginx_online": false, + "nginx_err": "nginx: [emerg] cannot load certificate \"/data/tls/certbot/live/npm-135/fullchain.pem\": BIO_new_file() failed (SSL: error:80000002:system library::No such file or directory:calling fopen(/data/tls/certbot/live/npm-135/fullchain.pem, r) error:10000080:BIO routines::no such file)\nnginx: configuration file /usr/local/nginx/conf/nginx.conf test failed", + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\ndns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0" + } + }, + { + "id": 56, + "created_on": "2026-01-16 16:56:30", + "modified_on": "2026-02-25 22:35:40", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc.public-0138.defi-oracle.io", + "domain_names": [ + "rpc.public-0138.defi-oracle.io" + ], + "expires_on": "2026-04-16 20:58:05", + "meta": {} + }, + { + "id": 137, + "created_on": "2026-01-29 23:39:01", + "modified_on": "2026-02-25 22:35:14", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc2.d-bis.org", + "domain_names": [ + "rpc2.d-bis.org" + ], + "expires_on": "2026-04-30 03:40:50", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 57, + "created_on": "2026-01-16 16:56:41", + "modified_on": "2026-02-25 22:35:37", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "sankofa.nexus", + "domain_names": [ + "sankofa.nexus" + ], + "expires_on": "2026-04-16 20:58:17", + "meta": {} + }, + { + "id": 58, + "created_on": "2026-01-16 16:56:53", + "modified_on": "2026-02-25 22:35:34", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "secure.d-bis.org", + "domain_names": [ + "secure.d-bis.org" + ], + "expires_on": "2026-04-16 20:58:28", + "meta": {} + }, + { + "id": 59, + "created_on": "2026-01-16 16:57:05", + "modified_on": "2026-02-25 22:35:31", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "secure.mim4u.org", + "domain_names": [ + "secure.mim4u.org" + ], + "expires_on": "2026-04-16 20:58:40", + "meta": {} + }, + { + "id": 60, + "created_on": "2026-01-16 16:57:17", + "modified_on": "2026-02-25 22:35:29", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "the-order.sankofa.nexus", + "domain_names": [ + "the-order.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:58:53", + "meta": {} + }, + { + "id": 61, + "created_on": "2026-01-16 16:57:31", + "modified_on": "2026-02-25 22:35:28", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "training.mim4u.org", + "domain_names": [ + "training.mim4u.org" + ], + "expires_on": "2026-04-16 20:59:06", + "meta": {} + }, + { + "id": 164, + "created_on": "2026-02-21 17:46:22", + "modified_on": "2026-02-25 22:36:11", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc-fireblocks.d-bis.org", + "domain_names": [ + "ws.rpc-fireblocks.d-bis.org" + ], + "expires_on": "2026-05-22 21:48:21", + "meta": {} + }, + { + "id": 138, + "created_on": "2026-01-29 23:41:20", + "modified_on": "2026-02-25 22:35:13", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc.d-bis.org", + "domain_names": [ + "ws.rpc.d-bis.org" + ], + "expires_on": "2026-04-30 03:43:05", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 139, + "created_on": "2026-01-29 23:42:13", + "modified_on": "2026-02-25 22:35:11", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc2.d-bis.org", + "domain_names": [ + "ws.rpc2.d-bis.org" + ], + "expires_on": "2026-04-30 03:43:58", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 140, + "created_on": "2026-01-29 23:43:09", + "modified_on": "2026-02-25 22:35:07", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "wss.defi-oracle.io", + "domain_names": [ + "wss.defi-oracle.io" + ], + "expires_on": "2026-04-30 03:44:57", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 62, + "created_on": "2026-01-16 16:57:41", + "modified_on": "2026-02-25 22:35:27", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.mim4u.org", + "domain_names": [ + "www.mim4u.org" + ], + "expires_on": "2026-04-16 20:59:17", + "meta": {} + }, + { + "id": 63, + "created_on": "2026-01-16 16:57:52", + "modified_on": "2026-02-25 22:35:24", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.phoenix.sankofa.nexus", + "domain_names": [ + "www.phoenix.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:59:28", + "meta": {} + }, + { + "id": 64, + "created_on": "2026-01-16 16:58:06", + "modified_on": "2026-02-25 22:35:21", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.sankofa.nexus", + "domain_names": [ + "www.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:59:41", + "meta": {} + } +] diff --git a/backups/npmplus/backup-20260226_030001/api/proxy_hosts.json b/backups/npmplus/backup-20260226_030001/api/proxy_hosts.json new file mode 100644 index 0000000..c3a761e --- /dev/null +++ b/backups/npmplus/backup-20260226_030001/api/proxy_hosts.json @@ -0,0 +1,1394 @@ +[ + { + "id": 37, + "created_on": "2026-02-07 00:42:23", + "modified_on": "2026-02-07 00:46:30", + "owner_user_id": 1, + "domain_names": [ + "cacti-alltra.d-bis.org" + ], + "forward_host": "192.168.11.177", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 146, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 38, + "created_on": "2026-02-07 00:42:24", + "modified_on": "2026-02-07 00:46:53", + "owner_user_id": 1, + "domain_names": [ + "cacti-hybx.d-bis.org" + ], + "forward_host": "192.168.11.251", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 147, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 41, + "created_on": "2026-02-07 20:41:16", + "modified_on": "2026-02-20 22:29:09", + "owner_user_id": 1, + "domain_names": [ + "codespaces.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 156, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 22, + "created_on": "2026-01-18 22:19:18", + "modified_on": "2026-01-29 22:52:50", + "owner_user_id": 1, + "domain_names": [ + "cross-all.defi-oracle.io" + ], + "forward_host": "192.168.11.211", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 134, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 49, + "created_on": "2026-02-20 22:27:16", + "modified_on": "2026-02-20 22:37:53", + "owner_user_id": 1, + "domain_names": [ + "dapp.d-bis.org" + ], + "forward_host": "192.168.11.58", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 162, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 13, + "created_on": "2026-01-16 14:41:02", + "modified_on": "2026-02-24 09:23:16", + "owner_user_id": 1, + "domain_names": [ + "dbis-admin.d-bis.org" + ], + "forward_host": "192.168.11.130", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 46, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 15, + "created_on": "2026-01-16 14:41:04", + "modified_on": "2026-02-24 09:23:21", + "owner_user_id": 1, + "domain_names": [ + "dbis-api-2.d-bis.org" + ], + "forward_host": "192.168.11.156", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 47, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 14, + "created_on": "2026-01-16 14:41:03", + "modified_on": "2026-02-24 09:23:18", + "owner_user_id": 1, + "domain_names": [ + "dbis-api.d-bis.org" + ], + "forward_host": "192.168.11.155", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 48, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 45, + "created_on": "2026-02-13 20:32:33", + "modified_on": "2026-02-13 20:32:33", + "owner_user_id": 1, + "domain_names": [ + "dbis.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3001, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 39, + "created_on": "2026-02-07 20:41:12", + "modified_on": "2026-02-20 22:29:57", + "owner_user_id": 1, + "domain_names": [ + "dev.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 157, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 8, + "created_on": "2026-01-16 14:40:58", + "modified_on": "2026-02-24 09:22:35", + "owner_user_id": 1, + "domain_names": [ + "explorer.d-bis.org" + ], + "forward_host": "192.168.11.140", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 145, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers (unsafe-eval for ethers.js v5)\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 30, + "created_on": "2026-01-31 00:13:09", + "modified_on": "2026-02-06 19:09:43", + "owner_user_id": 1, + "domain_names": [ + "explorer.defi-oracle.io" + ], + "forward_host": "192.168.11.140", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 144, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 40, + "created_on": "2026-02-07 20:41:14", + "modified_on": "2026-02-20 22:30:39", + "owner_user_id": 1, + "domain_names": [ + "gitea.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 158, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 46, + "created_on": "2026-02-13 20:32:35", + "modified_on": "2026-02-13 20:32:35", + "owner_user_id": 1, + "domain_names": [ + "iccc.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3002, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 17, + "created_on": "2026-01-16 14:41:05", + "modified_on": "2026-02-24 09:23:27", + "owner_user_id": 1, + "domain_names": [ + "mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 50, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 47, + "created_on": "2026-02-13 20:32:37", + "modified_on": "2026-02-13 20:32:37", + "owner_user_id": 1, + "domain_names": [ + "omnl.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3003, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 5, + "created_on": "2026-01-16 14:40:55", + "modified_on": "2026-01-16 17:01:49", + "owner_user_id": 1, + "domain_names": [ + "phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.50", + "forward_port": 4000, + "access_list_id": 0, + "certificate_id": 51, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 42, + "created_on": "2026-02-07 20:41:17", + "modified_on": "2026-02-20 22:31:27", + "owner_user_id": 1, + "domain_names": [ + "pve.ml110.d-bis.org" + ], + "forward_host": "192.168.11.10", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 159, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 43, + "created_on": "2026-02-07 20:41:19", + "modified_on": "2026-02-20 22:32:14", + "owner_user_id": 1, + "domain_names": [ + "pve.r630-01.d-bis.org" + ], + "forward_host": "192.168.11.11", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 160, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 44, + "created_on": "2026-02-07 20:41:21", + "modified_on": "2026-02-20 22:32:57", + "owner_user_id": 1, + "domain_names": [ + "pve.r630-02.d-bis.org" + ], + "forward_host": "192.168.11.12", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 161, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 32, + "created_on": "2026-02-07 00:42:16", + "modified_on": "2026-02-07 00:47:07", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra-2.d-bis.org" + ], + "forward_host": "192.168.11.173", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 148, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 33, + "created_on": "2026-02-07 00:42:17", + "modified_on": "2026-02-07 08:15:41", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "forward_host": "192.168.11.174", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 150, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 31, + "created_on": "2026-02-07 00:42:15", + "modified_on": "2026-02-07 08:15:53", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra.d-bis.org" + ], + "forward_host": "192.168.11.172", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 151, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 50, + "created_on": "2026-02-21 17:37:16", + "modified_on": "2026-02-24 09:23:10", + "owner_user_id": 1, + "domain_names": [ + "rpc-fireblocks.d-bis.org" + ], + "forward_host": "192.168.11.232", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 163, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 11, + "created_on": "2026-01-16 14:41:00", + "modified_on": "2026-02-24 09:22:44", + "owner_user_id": 1, + "domain_names": [ + "rpc-http-prv.d-bis.org" + ], + "forward_host": "192.168.11.211", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 52, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 9, + "created_on": "2026-01-16 14:40:59", + "modified_on": "2026-02-24 09:22:37", + "owner_user_id": 1, + "domain_names": [ + "rpc-http-pub.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 53, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 35, + "created_on": "2026-02-07 00:42:20", + "modified_on": "2026-02-07 08:16:06", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx-2.d-bis.org" + ], + "forward_host": "192.168.11.247", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 152, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 36, + "created_on": "2026-02-07 00:42:22", + "modified_on": "2026-02-07 08:16:19", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx-3.d-bis.org" + ], + "forward_host": "192.168.11.248", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 153, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 34, + "created_on": "2026-02-07 00:42:19", + "modified_on": "2026-02-07 08:16:32", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx.d-bis.org" + ], + "forward_host": "192.168.11.246", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 154, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 12, + "created_on": "2026-01-16 14:41:01", + "modified_on": "2026-02-24 09:22:46", + "owner_user_id": 1, + "domain_names": [ + "rpc-ws-prv.d-bis.org" + ], + "forward_host": "192.168.11.211", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 54, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 10, + "created_on": "2026-01-16 14:40:59", + "modified_on": "2026-02-24 09:22:40", + "owner_user_id": 1, + "domain_names": [ + "rpc-ws-pub.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 55, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 26, + "created_on": "2026-01-29 16:35:10", + "modified_on": "2026-02-24 09:22:59", + "owner_user_id": 1, + "domain_names": [ + "rpc.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 141, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\ndns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 24, + "created_on": "2026-01-29 15:38:44", + "modified_on": "2026-02-24 09:22:50", + "owner_user_id": 1, + "domain_names": [ + "rpc.defi-oracle.io" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 56, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 21, + "created_on": "2026-01-16 14:41:09", + "modified_on": "2026-02-24 09:22:48", + "owner_user_id": 1, + "domain_names": [ + "rpc.public-0138.defi-oracle.io" + ], + "forward_host": "192.168.11.240", + "forward_port": 443, + "access_list_id": 0, + "certificate_id": 56, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "https", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 27, + "created_on": "2026-01-29 16:35:11", + "modified_on": "2026-02-24 09:23:02", + "owner_user_id": 1, + "domain_names": [ + "rpc2.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 137, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 3, + "created_on": "2026-01-16 14:40:54", + "modified_on": "2026-01-16 17:01:32", + "owner_user_id": 1, + "domain_names": [ + "sankofa.nexus" + ], + "forward_host": "192.168.11.51", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 57, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "add_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 16, + "created_on": "2026-01-16 14:41:04", + "modified_on": "2026-02-24 09:23:25", + "owner_user_id": 1, + "domain_names": [ + "secure.d-bis.org" + ], + "forward_host": "192.168.11.130", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 58, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 19, + "created_on": "2026-01-16 14:41:07", + "modified_on": "2026-02-24 09:23:34", + "owner_user_id": 1, + "domain_names": [ + "secure.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 59, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 7, + "created_on": "2026-01-16 14:40:57", + "modified_on": "2026-01-16 17:02:09", + "owner_user_id": 1, + "domain_names": [ + "the-order.sankofa.nexus" + ], + "forward_host": "192.168.11.36", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 60, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 20, + "created_on": "2026-01-16 14:41:08", + "modified_on": "2026-02-24 09:23:38", + "owner_user_id": 1, + "domain_names": [ + "training.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 61, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 51, + "created_on": "2026-02-21 17:37:45", + "modified_on": "2026-02-24 09:23:12", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc-fireblocks.d-bis.org" + ], + "forward_host": "192.168.11.232", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 164, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 28, + "created_on": "2026-01-29 16:35:12", + "modified_on": "2026-02-24 09:23:06", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 138, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 29, + "created_on": "2026-01-29 16:35:12", + "modified_on": "2026-02-24 09:23:09", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc2.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 139, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 25, + "created_on": "2026-01-29 15:38:45", + "modified_on": "2026-02-24 09:22:53", + "owner_user_id": 1, + "domain_names": [ + "wss.defi-oracle.io" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 140, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 18, + "created_on": "2026-01-16 14:41:06", + "modified_on": "2026-01-16 17:02:14", + "owner_user_id": 1, + "domain_names": [ + "www.mim4u.org" + ], + "forward_host": "192.168.11.36", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 62, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 6, + "created_on": "2026-01-16 14:40:56", + "modified_on": "2026-01-16 17:02:17", + "owner_user_id": 1, + "domain_names": [ + "www.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.50", + "forward_port": 4000, + "access_list_id": 0, + "certificate_id": 63, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 4, + "created_on": "2026-01-16 14:40:55", + "modified_on": "2026-01-16 17:02:19", + "owner_user_id": 1, + "domain_names": [ + "www.sankofa.nexus" + ], + "forward_host": "192.168.11.51", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 64, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 48, + "created_on": "2026-02-13 20:32:39", + "modified_on": "2026-02-13 20:32:39", + "owner_user_id": 1, + "domain_names": [ + "xom.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3004, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + } +] diff --git a/backups/npmplus/backup-20260226_030001/certificates/cert_list.txt b/backups/npmplus/backup-20260226_030001/certificates/cert_list.txt new file mode 100644 index 0000000..e69de29 diff --git a/backups/npmplus/backup-20260226_030001/database/database.sql b/backups/npmplus/backup-20260226_030001/database/database.sql new file mode 100644 index 0000000..77149a3 --- /dev/null +++ b/backups/npmplus/backup-20260226_030001/database/database.sql @@ -0,0 +1 @@ +Database file not found diff --git a/backups/npmplus/backup-20260226_030001/database/database.sqlite b/backups/npmplus/backup-20260226_030001/database/database.sqlite new file mode 100644 index 0000000..e69de29 diff --git a/backups/npmplus/backup-20260226_030001/manifest.json b/backups/npmplus/backup-20260226_030001/manifest.json new file mode 100644 index 0000000..43581c6 --- /dev/null +++ b/backups/npmplus/backup-20260226_030001/manifest.json @@ -0,0 +1,19 @@ +{ + "timestamp": "20260226_030001", + "backup_date": "2026-02-26T03:00:14-08:00", + "npmplus_vmid": "10233", + "npmplus_host": "192.168.11.11", + "npm_url": "https://192.168.11.167:81", + "backup_contents": { + "database": { + "sql_dump": "present", + "sqlite_file": "missing" + }, + "api_exports": { + "proxy_hosts": "present", + "certificates": "present", + "access_lists": "present" + }, + "certificate_files": "missing" + } +} diff --git a/backups/npmplus/backup-20260226_030001/volumes/volume_list.txt b/backups/npmplus/backup-20260226_030001/volumes/volume_list.txt new file mode 100644 index 0000000..4545150 --- /dev/null +++ b/backups/npmplus/backup-20260226_030001/volumes/volume_list.txt @@ -0,0 +1 @@ +DRIVER VOLUME NAME diff --git a/backups/npmplus/backup-20260227_030002.tar.gz b/backups/npmplus/backup-20260227_030002.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..94e91ec3077a775dca53060d0f77495cf84ab678 GIT binary patch literal 5288 zcmV;Z6j$pXiwFP!000001MOXFkJ~o7p3nIe!t_HDp!SHOD0x%_*lwHM4bUb3!9UP+z{4*K5@DcLeTmPm@`cCG@7X!z3Jlk>n zu?=n8b}r6z9^{I)?<4vX_{e5|u8%W-0J0t5b$$2D2GAy_Eu{4+I*w&ghPh>(#c7#L zIqgK}PxP3yfB%~-Sl4{`{;fBkcu#6>wQ?@G0M&=2f+Zuj?h zJm&iooB-c*-80M9`>O57GyncSe|-1vw;wHX{QJW%|MTlx>-~?vzJ2l3Pi2ln9UbF; z9;WdOlR^JSk)`|ILp1(<;651t2q8264|4q93(Gn$W5V@iIA5Fx*7*Y{oPSSS)G!%G zVTspm2DUSB{LeNFY&!sOV2{XO>elIEzDSnE_+}nQv^lUH2)9pNXGK|^x^#xX8w~*< z|20j<%RHfHugh{#1Q!=EJzRfI^+a-&TtYIxcLqFUGd*!94+g2 zT;#YQJ*um$PsSx4&*G$dzj<5~ae8%Lo&K|KbsjF_F}_=5IddnAUMsu1uimF|Ih=-jQ>L%obS&Vw)?q(xZ@wV$R^m>{{B92kQx7nIKI5F)=rbkR|EaE z!y(6n{G)M}vJM~Hw`@Cboxp)B2gdn4i^xpT)zS-~y>6M^rZ^uj3-U*GFR=Q3l+D99 z9jD>Ea%+5PJSX9_j0a(olzBLe29vlLX8Fn~^ZTmrEX!}hJZkkP`TqHXR@8YzT8-?r zOK0PHsUOL1aktdZ>UyhFMUjlj^`@Bqy3Ch&-6fn}$LZA=r{N^2PR_!lSf8CF+4LKA zA0=5_xp~-=VRRFwo}0@Pj9z4mW39EEg+DG4HpQVKKeNbG-J>t)FxA)=U@j&S4p6 zX|Z~s^-Tz)j9WWYXNu*dMnthX`C|1JTR0s_;?$MJDT4dq^!k2sr+`ui0i7uI4N8v) zr7jSm)FIdd0q_JUb!^KaV7?6OOJ$U15iS-Xfsz7BJ-Y*>R9)x~Q`AbP>?b}9PNTFK zPp=8+aC)@^RCb}j%F^w!#C*OD|8qI7UPbP3?yU3kIQx}hrJMqFO1aLM9?U`L&!us&> z;q{sO(O`2K_x0t|(kA6eck= z(g;t_ISP2TQ7v<+mN{?6RNh1batF@Ss`_K0pxHMLbj1P9)(WnU8Wm>CGY;Z1-& z2%~wNs#v|SOI1@qxo)GE>Dhwu@2pRFy3FJ9-uf3NSjvm9X&8~Wto~vBXYf;<=rQ3!Kbe{$Lf;JYKNBvR*FJBAnqtT#f3@zwu3&ytL|^ z8jA*Y1Jb*^PcX0ZcJmo|G`98j*?4}%o~(YmZbAe%Ax+5FPKi)ku5nvbe~>nF9K~Vx zU9!m^%@xv&JmU`*jbILltQw&Ztj-5v{qeRgLQYj^px7(QEH9dCtO$&}ctPck2RZ)l zlC&wt1Sy>^`AqUlm*RzZJmU-f(IJ>_6)8q&*Ej6=r8=U;!ZCRucE;joC4d!xDV zH5Y&+sa@nMYN*`-`%(KM9ylu0jy#=KxNcvOA$LRWhTILgAC}x*Npcs(t2TQ3XkT(y zqIRT}+DC@k4YeC;H`IQ@)b8^1c4q(}4W25bz8e-{ z`YoGK1-`>R#Qu*wYifT1Xi`cpGiIJ zN~I;!AI(q2y;A65auoq=Bz;{3~#qf`=WYd<73XNqY-&ZT^DXcnnU#V?e)Ct!t=7 zF!LvfVH%S~i^;-YjJ;7fd}-B0d2-0+X>tJ71ooacjB4^os)UBG0~-Xc zvc0?~-ny)2SH)^Zpbc=3<`go?RYpBIZuP_@SDj*V6>s4&>kSpD7AtQk*u(Bz+~DCn z0l-!XWq14gZLc@C19aI&?#3f(JfhEMDXhy|3d>T1C?2??28Ri$s8B=hL7V82D&){z zk3fYSyeBp_3^^Ebcye;!t+!#wVY5V1L=Ng{u^VzwT21NbC5KkC(2#>6hv!2MP-s-t zMfrp^Vpc8vz*Z)Qd@)^>j#OJ~?ZYm5KuyAHpHw2vEAoz~nh^)7M{E5;p^Cc#s>u4K zEk^-BWXjV3RHy{hE^oRTP<4l44N&(2s<43M3aFy=fCi}QRkt=kRf1`!x}^rw!+PNj zOt~;c{MrU`7Cz~(UrHcye>d8_u>q!nT8qFJE3mj|L| z_vJ)|-5tH`epoHUu)AS*!|sONHM>LjC4n}(zKE3fl{>@>Y~?D=6}{h2?v&iij@!9% zLd_j=9M#ATOlz3(my~T_DykjSz!WH_&NeVraV|SO5eF~L+A%U?N{g$w`J zFx`00RAH(F(yp?|iXc6XRsRO0_2&@mkkk0pzq3w(+%=cfGvsc_-H^K>_k)tV!}EevJ62MQ5izMA zB63IjctM^%1OwdXog?0sy=}d*dgpJGJ|=_vk@lnIZ>K`XEDGR=$$1fu*?kl;<(+6X z$4-xAyXqsXs&bkrm(2l_H#?L!4WcL~HV4r&$*ti?8S$NkPhGcvO_g@Q8~el9AIAPL z_D4_qqj)j{gkM{6V}MA84j{ApvjWX4vwZ+sU z&x$q0y2hnaCGPgUl^#vsGAhUMs~o0)l^}G)_b#gJ>aAS1yZ(qOt0JMs?JC-<`Kyx% z)6>{&#%4P;0)6&2+iB9e)B+yB6b2E|I#gbsxuW$aE{oqdMYyz~G7Bwb-F#(=C!y6Oebmj@ICII5sMQjSr zxzgJv0_6bWZ83b@nsX}EsLdMIW726x9JI2DD581*n?w}lHLNvSpMHrGfX`v`X_Ja_ z^r4H(W5L#Q5c@? zbJ&W=49}wyzIDA9(heW$S#=u47r0VQyJxaatx*PCL>06Ft6|QT(hA&iH4h z&c_`8uID3nXZ-ufjQ>L%UmgbZT&cZlyuc9_O+pskKF?)}xOC}|Y>=1PQH=KY^hf| zeE9hA`po^i3N*jzoo*xlNaBQ>+FR3#cJA&~Rc07X_Hraj71wA-5^>62Xs_I#1St=5 z#zctk>L*0KJAgJtJ#qseIaztU-Idmq0X=pUafRqH>+*C6F$xz8d9rxWTAn6G?2eI! zCXR?E_Mr%_DqDxIJUUn)Ka+t0w>Z$%3)}>#gD{%MX%C3E^^sr(^0E%i*`ruV$iBf)N)wFTf47H$?id)KC*M<6fv$Fo{=4r)WeX(#uqBG>n}M)xj`s5 z8zH{wv{GO%nLXJ>3M>$=lj~U}ol`Q=f}~E7-c4kiumET#0&> zjaxt~DO4e?9Ov=?Z|Na{a@)7)YFot4x)MvIcR<^TXyq|thJoZT;GtZwrErCE8!;{| z(bT6`ZP;M8mrd5yO&agEPu|6_`ccApA67^FjEj~1YzIKvUkd-|0?ViGx9BI%8!qz4dh0e-`wG8MlX4%Hg-S=`{^JORL#=h3zT}gtcUYt7iLl50q1%fy-9_ zR|51UHVSV9sMX3~L;;lq2o(kB?zl)hG-$qNK?OLfT&~h=>uS}YpFn_sE<0z-j_?J@ zpRO7K%IEAst%0YFC{)C!C_Er(zj?gP{MNNNT_o)T^8!a}WTUeeo#$##ed z9cmI@FRAqt7kNDZt1sRe&)1s2(pLSyb_Lb{An$_bIKTRxmQF~s(n_*0vY54d*4Oh3 zT2JDlOp0nv-y|z9lK2K+q>K3gKy)!%CJA|*I2|tV{42Tg-`{;0r}%a}ixd3nHF*T` zGqPTN`t(a+k$Y!(Fsj$?IYDt>lz46>@gxuP`yhCqS;caCZPBh)mRk`K;k3-isVRBi zIK8rF*#f7p`aIJ2R{nZ*Ur^n4WC!FCtvp+nL`X#tq|9Ake@$0{saN4I^J>j|{X`eb zBEO)^;FF80(FJW&|8+?JYL&PsS1;V|Ce!OmJ9vrH>T%mSQ7T*7V>L<}G~TBN*b&FS0O#z{(kN(vlo(RhslrzLd&3ilqOD03L> z2vPP31Ga~iAlSf2fU{lCr@@(?6cxTsvcegZ4p5-L)@muV?5raM8hEHRW2(VGeUVIQ}2k4j<3}Kmh3!9UP+z{4*K5@DcLf|mPm@`c+j%ZoFUhf9wE#_T5;V3+^7KF$CJ*!3^~0G+u2x!6B*u+gVzIhJ`5W{z_fB}F_D zw3D4b(PP~F{cqBEIVZUp9CZ8sfPQ}ud-nSugOnq@}ghd6?*qzAK3T2_U{k< zt?@tbF*tKvv#;8GJoE4W^T&7pe*4j($G<=P@;|@6b>9E@>)RJk{Z#fi)X_5j=V21f z2p#l)i`1>sGCk#e5Mj^U=*bnzH7=g$O-7b)Du#dFm4Ofj{g6K>w?o zjFwr<&R!SAA`dPu_*VWP7=i~+HA$0#Bt=epu-Bm{=yQhSFemkI=E-?1KgmZq8k$e9C<5G5>t=rxt6sjQ_O&jVOSf^gox4f6s@&>VJng zWZ!@Nmwq)uwC*9*|8~Cr01tf2|A#obe1F}0NWVYY`Tp);V88z%j-OZG*I|>2lca?+ zOP9&iS^&@FXc_;!(z3S>&~5%7l=?rk{-1*!D&L>|V;>h#xA~ubfBG~Yw)}sHqviWk zTgO}sp!@hoK7w}qAL0;vf6lPo&kZCT|G>lUfb;*jKGXkz=i2dqh~vu(XYDj8eKlyX zb~t2&lK*s+CcMMP9XPHVcrbuy<-j!o@mx53>~J*(%hPUU$#qSu=c_Uj^Bl69AGavddCBa(#UxI8%v<9vN~9H*0S z%zYH6QR(L4PlnT*FrgP@o~&7P#onWqE-6CZ+mu{I$sHAS93|wz{p)ii%jk(@8OIO3 zS8<%)j&8{~rw>Ak(Qg;TQiB+TIkNBMHGk`(uTYZ>N~YceNm@7(%1H*d{#q3;|P zQJUnd2U_2RGRmm2LwP1&jw?jutCKHQZ}9-9Lq(i=syM}HKb&6QkMA^43NbK=(t$P)@kb?O#SUKc%P?}Cjz6dFlG*IfhEg(g73hxe6+(@SUCq4{L zr%67VTvO1I?GBJZlWn+SUsP_>2f-Y!;G9awi(fnJS9mH(Pv@pzjJ=7dpJM- z_RcBNZzTDeeNDbA?^~Z7vB*Ms@{NzD!P2m;ng+^E8@*i528@5_d?J%&78Uo-zX-)rmVZscDSgZGAI^VzKUIky zz0dax()+L|q2PQyPtrVzX0xy7P8i>Y_xTT7-Tp!K9lrgiAAf!O;p4l1zI)%=Q$f8L>r_zWHrQYo|NqW^R zTm7cxI_uY5OJj3AIx&aKxaj5C#Ce&Mc=qxKC!b`|g8!BCa+&1ejP#;%RB!%GZo>Gb zQ{~h+EU+8U-o<@PM4cZtpV3F-TR%J-&9C^A7sZZu9aF+Gb9s zQP_T$bo@tsg(RiV_=CeDm^~`1S|}8&^IlkeyayMdr%E(1?Bzw8<@GgI1V&#xXL2XK zjQn>=+vNOLVv6_MB&Vkxs`fAF$NKrhPoMwyx3|u#Xy!0yDoLi!G$ncRvT#)#MKM z)Y})47PVue)IPM-ZmHc;yQTIMrgl%Hx5FMlEO>@sfMnF(&{Bum`*-QQHzhay#dS)O z=&qlK$+vVC_7ifq%+s$*?<24e)E zo~NJ4*l=EPdNR`>9a3D=-}nE>og4hx+9K8#IU-xcPHWG0S~F*9wasdJskE+eQbT|x z$O6Qr9=4^@(&>+7CvA9w!KMPXu$`pp%9Hs{|%DK-#&u zS5ZN9mNb|)=^EX{)}*s@-!n4l>KrGTn-MF!8L=)eM3c$n0B%OunJTQC@sZq&K(yYD zk6+5rw~Ak4u4PyB&7--u>@*)CgDdQCBgPIGv&?io1=}5!df_R1>ANSvSC9 z&7^8M2wV_&+V=9Ecx$toJsqnVgC@W|np4OoS6TJsxYZMzTy=`cRicH*yf;*)TCBXG z)b!L=EfzPVKaT-$bwb(g{(jf*%6^H~b(iI&3h)F6uouBZX-u@sh3 zL*^rw>XAC+&|Z%~haCJTHZ?3cSaNuBauBVz;m833RdUczi`|fe)@n*j7$`2V5t-c1a~Nydv*-su>B8dbHLr zlB&2XpvtUY)^ZpCOs6~pKt)P$Cx2XeEeAtSHHn3>}n>Mg{%z@2Qq<7J(eLiVL8oOAt zJJ3$2-LU&|ti$fmEW0083$g5O+1;|cWp~5w5OGPM&8{yp<$dK2@dMZ2i{9_YcUtac z=(Vn#&~t|zM>TQ_(+Z~IC1o3!%4!GIFa_GFvo%b0oXgN_Et#(eQ|k&jCYVZN`77tL zbm9LRruv1E*D%!rXT^hT$f^Bx(u9-BqN7}@y+aNI>23ZP-n#Ay zCkIBUwdbroXYDy_&lx6nap@rqcb$Iq?lrlach+f;yWx_0mfS75TXMJLeo%6UA}>g} zVR=k}G8?!9oCGgbt z%3}G3`((#x??h`jc6ub+RUcthmD5DIY7Us9*)in2PdX^4HV4%+>8;UF8}Y4$Pd%@D zO_gTATl>S>AJ+b`_D4tiBY!djL|j{OV}PiI4yXZw_eloR$`debfuQHGiHo%}j$Q*( z+HKtpu-MGtYK!Sdo;7QVwT(-yO5DwRD?OUNWmS&jS2=6}D@o``>|NB@)!Wm~3#dM# z&Z&go zKvuV9@h!g}CBNIU_@^^V7%hvhv}KCR6_yh_4C|P%9u}V0yLKvwI+Zy0iHX9DOPZ6h|C%2IrnriSa}+ozeLmHbSza^Y}-nco)jef)qtX4+c=% z9Y8IjM_G`fF+9EJuoaOVo<~1CfmpNMca9nB(8`2iV&l{}4bs{tt0{*$(J=N_*G%0hAU^!VaVwq{kI;X;UKk zATbwuU3W{O2`M$qGKkEKo!xz?CF*EPuLn9P)#{j~^58Xa&mB6h7kC5SAF@{F8Y7~f zXn7hZKo2PkP+FLxy8yTLT2T_8Xnz)=@P_;rGD6{D@djVeWg>wCF8{Gjc)Kl)2rr$I zd=XN`sDtpD`bdS>{IX)&xG5cKJi4Q zlfP@oY$;E^QOazoRyut6xP5)@{%r-C-*is5QGX+saXU{sf=?N)?h+`Ri$DX+>|Au} za}n?)TUS$3xD0@&P_MFf3m7GZGNzT0Oda42Jrq#x4jhQs#vt6RtFT0R2ehq-)*d5v z7$^<{5y~Z73YRE%G3U~fO?_t7h7D#r*<@|ql=1Ek=(|`}KT0_7!|GU^anR@4pDXvAh@)wPbJrrK>M%OGdhbMi+Q*mU~Hn-LfuB zXtxabJ;gE$6k9I+%W*02MP$n194klG&HCCIXfq$Vl(V`aeYcZ3))CK&7VCc* ztV`;1Ral3-QS?Mu@8Caf?xc=&KAvu|{+GeJB<;RV_>rub<*@D<4MelzbXDe4mtaXt zFBOl+I_U?gsn5U@D}XBj4iq*DuLWq-%HTwSv;>GW1?cU#NLw^$v1Y*pI4oVR%53Wy z)u5k1fPk$#=gW?W1t^}bY5}U}>>;Cpr;R9d#HT4dplHAOqRsr)wKzSj>;v-yXf(3X zTAWisfbycAtusCZC1Qj;GL0+3@sbtMLw2jKnquB!^O)29mq zswyx-^wq-i750;_6K{=cfTbWh&b~W+x(LrxOhLqwkl|W*P@3{x3(sf>Wi5#AqSF){ zR-1Q)a;quNS17$!Q=W0T-R9jVjGaE6=uS~~;;NFh?0~xLj4RAc4qYdUojzS;hgHor zakzu!AYU@a9#&*K%!LjO39pmXx`~Uv9zf+6Z;j_0&0lG%{$II*s(;XTA#;*l{myD9 zBx&KqX*hMbwR_Ij^9xo`;-ZN2a!ubjEiU5dhFm0zc@H3bFCrNnUk%r0<>V_3FN$yzS5p=p#B=x-6)W@*qgKyT1OK ztOQdn!(V3QqW9{FE|z(A!PddY7iFUh)~5PvpZ(P-NM5X7xY>o?rwlM;)a>Y#Z=joJFyxkPiFH1utbCu#y^u=F z=y2TGL|!H^;imHvnL$N8S-u;yU#5B}yQPrPbk3a}n$={clMOWFrZb_;gkgS8WbAbV@s&N+gKY)`19v$D9O_GOt0S!Q+N)0cFCIY$Pa@+of_C!xy_!R-Slu zR|>yc%!J@XJ7q~EsJzLR&>uf+h`_ffZ_+KBsPg6k-ajo<-i+q-?QG+uBtI<$4mD`J zR)I5;I)J2m4>6QM4m(nmJ;H$PU?oU4Fp}VG*Yjy{W+p{Ntdp#8hLi&oSYf-wZaCZ7 zSw{*q@m@Saqo83}fvZ%19J8MUzyRIl)OwUhSxs zmQj7b;6o(xGVP?x7?G`y#ke3!9UP+z{4*K5@DcLf|mPm@`c1MKoY*T)&a0K3@3khKHIrKcTi^eI}7WnP4t1d|Np1!Q-M&Af-`~TY{r(3zB;UXKIf|pa=ofc|-aXg{_I=DtjF2Xc_(yQLZn-`Qkiq&bOd&{yl3^!DKWI3$kw0 zb72n-Kf5S!-2kATJEVW9S|^M7B3|aBn|U;4&4CLMdU)zO&5QEXCF}!#*av|AS2r0g zvzVQ|E{a7STwL(2{6R2$_*9cLDM(V}vaxw zbj=OI$%N#2ImbR|@Zjd$Rm!K#w;uD)7k_H8cFXu*3($xH*h&BMOa0FW!0La8IAq^{ z{g-|1{%?(K4rhl=lLw-%rzd7$u`5 zoR@BmFSX|+oD@+njN>8;`_tYy%KK@ya?1R^>N`ub+c29p`jZBO^Q~6Qc|%(b-L*?+ z<9ewc$!&1ARL|=9t5bO%kLdL#g#Eh6mSo)}oLooA)rchFI4)1l!Z=@_9mnb98*?AU zX;iv-_>&?&dpnMUFbW9MU*D_ z>Veibp^P$W>`4V3zB3rLx|&>g0@kxcndd>EWglYBI} zrl2Fq)ecbENvZ?gL{q}BdOnHM<#ZN@898rkGol}PN|GX?&%)Y&=loRnaDM#lol~UW zNb)uNntWH@w>~*yk%jW)8y`=HGj~A7V>EL;?9HYVj|{Ol_QPoi&}%0&+SPNUw&_IAPCR{LpJQeWdMdkf&e{u$y#FipT4@4 zrFqWOt^SnEq8>%bBqseRRiDa$$*Bx^b}Bojsq9iXm8~YIf$CI-274%6({QoSn8fhV zAUu6|6!2`KTJBN}bKJwTj{t8TUMEAu0Evm%r@A%M)LbZo_n;gIFmQ+3@TS1-h0}SI z=vcj|O;yuCxoM-9>)C+u@0?F$vdp65-uV}ySjzIRNjRl%S^mTMPw%HH(WCeIenEO4 z79|v%ujfgcC(&&7_1p>L+weaBVXNCesJ_Fu|McUpZ$Er|_s@6lTf6+{)2H5VSz3?@ z>qPs29~}C@$(!<(TDpBCGdfsE*844uqscw(l^0nwDd4a2Xf9JexQ#a}v*9{@~=3EL!lta$YWzJe-kURF3M+zsXG)zjUgc8ixgT z1KPW|kBO-B!{#&kXngC3XQTNQf3p1Tx(OBBm^PtbJE1~txW;W>{z2Q!$utVv?~;!H zsIQQu^cjC}SOl|2WmOA>Vs+jNtB?2KBJ@;=28O-7NVB}Y#)`n`i|0)4q?eKZE@_*b z|4K~pew*a%1=B(J*^sgtvx53l;Y^PX|AGYQ${O2(mMPrsSr-xK2qD-SzV@ z`IgSYenRe+xw;q9YiD}Und#joqCZ?9?P%gM?by?F2qLk+dlR~qIt16DTRhN49|hgh z$7~zTMH{m{*_f@3*LG(GQPxpyZMd9+NMLP%0AKDgC6yzIYOOlfhG#HF0P1=AiHr^B z6{jaN4bmaSHT`}6kKDPzudOX&ZIL6gMeMZpY^ODImR8%Wrk6_V3MVxLoN|FbmwMQi zN=v6dmZ2DU1|~JV6ePnl+i|2I9bt~g3BueH!JIefq+!4+fyoV!b}sH!R1lpd4W>=H zMmMoF>FnJ1j7+*Z$4Ta9#L8|)tji10WHLE`n-O-V3hQQkBsU`vt+(UjmooG*j{?=v zXiHxgee-DUEj!Ie$lwY)+=#IQ#w;^kPr-IaC11gICuMIzX3SrZS&zXfcnsKgs&oy# z2xj&KF-&W+7%^GIi?KHf$3R&%(T+i-^CUiiYJxh?8&)-WB-KPIZPpF2STm_w4wz=* zY1_+t;;qeU_H?Xf44MGa@8p&SBVxL^WIRIYO(T$f&gl(7K_rq!-mfbD8TXwhXZrB|nE(x^R^+l$-iWWF9utt;f1U@DE}ubj)$h5u`q zBJJ9lYnW<*w5=?%CP?nOo-ackWpV}N$&!o3TLv6&j7C!a7?lo1K z0dMUOYkye#!`dGm?T`G)3=nZ`#f<@?7&?Iad6%^E1Pogs=s9fSV(pBh*T9r^TX(tf zCaW!`A9>cSDb_YFwJLEp@2&J``j%BWj$h@l1*{~YBe8d}+pgY-t>e)z+g*J`omG*@ z;C2J6<>*sUpg7{7F*t#CAh{Zx#uLSKM(1|V|aScVJjj#Jdb{O0;9-3EUK@ zy>L2@k`54W>Z8C6^kpGS+Te?wikLyD#d5Oqq;+^|Vlb*pRB~8E4|ZQwlHFFHF0zAa zikQ$3&&due>S37M|H!25x=T(|Zkv5OBnqt9bXqB}mjO})ou{z-KqtYGn+`G~t-AyY z=OWMmGdmZZ`dkD&$=21B6fOhcDb%a1-2z5Qp^Rx|BvS`?Lk|U%yJey`TeRV~p0D=S6|kajC5^u7kF=$ zdr5%ZvMx+$w+#3_#YJ|Duowv^B~`P9N=aI?wu_XS^RFZlQ%Ks9NpGkmJ%B|E@M{iL zsrXfMsL`0u;)e9+F#xVQk2ZDb!ll@9>0gdZfiEIc4(C`ovToMb&On>_$fcas4e7g` z)Ul3uRy!g>e)adRhitn=}7i}k+@)+K58b;6Hi#Vm()&uAc; z6{o8*pSlD~T6(E?Jl07+NKJhPo>&1~32>mWQFtvtqgDnd3Zx}Kq$xme$3@zrL5npD zCct6oa#dzq&!`6d1OfzX-8o-&L@Yq@bX5ybJ!cOY4Lof`p(8#`;Q>Ya%@=Lvx30zM zVPzkfA3&p#jn?9v3IdcD^=zH-At*UZEfEKc@^Cm8g1pRC?Lsh`G|FVb))(~_S%(m4 zOE0PXI48nxUQV<8C;7co?;3jmV^w~!h_P3?^<|9 zLnv!ObQhhb;IP`fE0kMJdA>sFwVLvb%k4JrK4I+i=|p#mvJ+R8tYrt(WoKMrW^(8{ zS?u)bB0H>Vu8G4PEC>0LIrgw3+hHzrXh?XSq}EMb^z{HLzj$jr-)R0yQ}zGK6;%C$ zz6+U??CN(`J0VF6Cr-nu!>!$OzMfyOf)W=+oR@3*#%Xa8M>pgmS zNq<4+U+I~q_;Xx4g*(Fu|eV#YPLXy63HbW zWtJ^aG0l_Rl3 zDP`sRT<(QbT1JQC&L;9QfeAOAm&gn%>dErmnEf)=~N;?thNqB7(C`Ah?IE^8Vw#dYzrt8o@66Iq1-N& z!x+BUm9p~0tGiP8)nXD$@H zNlAWM3LI+Cc&!3wBy|8u_a0&>gB*6GD0_qf+rdhZY+xk8*{=8nidZLE;S4DU zD6ql?blq^av$KvAXyUzigh=!FIG{zEL8J-mNpPy0x=Cs_683P97#YUeHFnS zFmr;Fmb}_gEiI!aY5V>Q3Xqsd>#BuC3Q< S4|~{S>-c}$>ojHnKmh=TSbcr~ literal 0 HcmV?d00001 diff --git a/backups/npmplus/backup-20260228_030001/api/access_lists.json b/backups/npmplus/backup-20260228_030001/api/access_lists.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/backups/npmplus/backup-20260228_030001/api/access_lists.json @@ -0,0 +1 @@ +[] diff --git a/backups/npmplus/backup-20260228_030001/api/certificates.json b/backups/npmplus/backup-20260228_030001/api/certificates.json new file mode 100644 index 0000000..82dba79 --- /dev/null +++ b/backups/npmplus/backup-20260228_030001/api/certificates.json @@ -0,0 +1,685 @@ +[ + { + "id": 146, + "created_on": "2026-02-07 00:46:21", + "modified_on": "2026-02-25 22:34:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cacti-alltra.d-bis.org", + "domain_names": [ + "cacti-alltra.d-bis.org" + ], + "expires_on": "2026-05-08 04:47:55", + "meta": {} + }, + { + "id": 147, + "created_on": "2026-02-07 00:46:43", + "modified_on": "2026-02-25 22:34:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cacti-hybx.d-bis.org", + "domain_names": [ + "cacti-hybx.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:19", + "meta": {} + }, + { + "id": 155, + "created_on": "2026-02-20 22:27:52", + "modified_on": "2026-02-20 22:27:52", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "codespaces.d-bis.org", + "domain_names": [ + "codespaces.d-bis.org" + ], + "expires_on": "2026-02-20 22:27:52", + "meta": {} + }, + { + "id": 156, + "created_on": "2026-02-20 22:28:48", + "modified_on": "2026-02-25 22:34:21", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "codespaces.d-bis.org", + "domain_names": [ + "codespaces.d-bis.org" + ], + "expires_on": "2026-05-22 02:30:34", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n", + "letsencrypt_agree": true + } + }, + { + "id": 134, + "created_on": "2026-01-29 22:52:44", + "modified_on": "2026-02-25 22:35:17", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cross-all.defi-oracle.io", + "domain_names": [ + "cross-all.defi-oracle.io" + ], + "expires_on": "2026-04-30 02:54:15", + "meta": {} + }, + { + "id": 162, + "created_on": "2026-02-20 22:36:34", + "modified_on": "2026-02-25 22:36:08", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dapp.d-bis.org", + "domain_names": [ + "dapp.d-bis.org" + ], + "expires_on": "2026-05-22 02:38:20", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 46, + "created_on": "2026-01-16 16:54:36", + "modified_on": "2026-02-25 22:36:19", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-admin.d-bis.org", + "domain_names": [ + "dbis-admin.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:11", + "meta": {} + }, + { + "id": 47, + "created_on": "2026-01-16 16:54:47", + "modified_on": "2026-02-25 22:36:01", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-api-2.d-bis.org", + "domain_names": [ + "dbis-api-2.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:22", + "meta": {} + }, + { + "id": 48, + "created_on": "2026-01-16 16:54:58", + "modified_on": "2026-02-25 22:35:59", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-api.d-bis.org", + "domain_names": [ + "dbis-api.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:33", + "meta": {} + }, + { + "id": 157, + "created_on": "2026-02-20 22:29:37", + "modified_on": "2026-02-25 22:34:16", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dev.d-bis.org", + "domain_names": [ + "dev.d-bis.org" + ], + "expires_on": "2026-05-22 02:31:22", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 145, + "created_on": "2026-02-06 19:14:04", + "modified_on": "2026-02-25 22:34:59", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "explorer.d-bis.org", + "domain_names": [ + "explorer.d-bis.org" + ], + "expires_on": "2026-05-07 23:15:36", + "meta": { + "letsencrypt_agree": true, + "dns_challenge": true, + "nginx_online": true, + "nginx_err": null, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0" + } + }, + { + "id": 144, + "created_on": "2026-02-06 19:05:50", + "modified_on": "2026-02-25 22:35:01", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "explorer.defi-oracle.io", + "domain_names": [ + "explorer.defi-oracle.io" + ], + "expires_on": "2026-05-07 23:07:35", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 158, + "created_on": "2026-02-20 22:30:18", + "modified_on": "2026-02-25 22:34:14", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "gitea.d-bis.org", + "domain_names": [ + "gitea.d-bis.org" + ], + "expires_on": "2026-05-22 02:32:04", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 50, + "created_on": "2026-01-16 16:55:25", + "modified_on": "2026-02-25 22:35:55", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "mim4u.org", + "domain_names": [ + "mim4u.org" + ], + "expires_on": "2026-04-16 20:57:01", + "meta": {} + }, + { + "id": 51, + "created_on": "2026-01-16 16:55:37", + "modified_on": "2026-02-25 22:35:53", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "phoenix.sankofa.nexus", + "domain_names": [ + "phoenix.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:57:08", + "meta": {} + }, + { + "id": 159, + "created_on": "2026-02-20 22:31:08", + "modified_on": "2026-02-25 22:34:12", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.ml110.d-bis.org", + "domain_names": [ + "pve.ml110.d-bis.org" + ], + "expires_on": "2026-05-22 02:32:54", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 160, + "created_on": "2026-02-20 22:31:51", + "modified_on": "2026-02-25 22:34:08", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.r630-01.d-bis.org", + "domain_names": [ + "pve.r630-01.d-bis.org" + ], + "expires_on": "2026-05-22 02:33:37", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 161, + "created_on": "2026-02-20 22:32:35", + "modified_on": "2026-02-25 22:34:08", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.r630-02.d-bis.org", + "domain_names": [ + "pve.r630-02.d-bis.org" + ], + "expires_on": "2026-05-22 02:34:21", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 148, + "created_on": "2026-02-07 00:46:56", + "modified_on": "2026-02-25 22:34:47", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-2.d-bis.org", + "domain_names": [ + "rpc-alltra-2.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:31", + "meta": {} + }, + { + "id": 149, + "created_on": "2026-02-07 00:47:10", + "modified_on": "2026-02-25 22:34:45", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-3.d-bis.org", + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:46", + "meta": {} + }, + { + "id": 150, + "created_on": "2026-02-07 08:15:35", + "modified_on": "2026-02-25 22:34:42", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-3.d-bis.org", + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:06", + "meta": {} + }, + { + "id": 151, + "created_on": "2026-02-07 08:15:43", + "modified_on": "2026-02-25 22:34:36", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra.d-bis.org", + "domain_names": [ + "rpc-alltra.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:18", + "meta": {} + }, + { + "id": 163, + "created_on": "2026-02-21 17:45:18", + "modified_on": "2026-02-25 22:36:29", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-fireblocks.d-bis.org", + "domain_names": [ + "rpc-fireblocks.d-bis.org" + ], + "expires_on": "2026-05-22 21:47:15", + "meta": {} + }, + { + "id": 52, + "created_on": "2026-01-16 16:55:45", + "modified_on": "2026-02-25 22:35:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-http-prv.d-bis.org", + "domain_names": [ + "rpc-http-prv.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:20", + "meta": {} + }, + { + "id": 53, + "created_on": "2026-01-16 16:55:57", + "modified_on": "2026-02-25 22:35:46", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-http-pub.d-bis.org", + "domain_names": [ + "rpc-http-pub.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:30", + "meta": {} + }, + { + "id": 152, + "created_on": "2026-02-07 08:15:56", + "modified_on": "2026-02-25 22:34:30", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx-2.d-bis.org", + "domain_names": [ + "rpc-hybx-2.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:31", + "meta": {} + }, + { + "id": 153, + "created_on": "2026-02-07 08:16:09", + "modified_on": "2026-02-25 22:34:27", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx-3.d-bis.org", + "domain_names": [ + "rpc-hybx-3.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:45", + "meta": {} + }, + { + "id": 154, + "created_on": "2026-02-07 08:16:22", + "modified_on": "2026-02-25 22:34:24", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx.d-bis.org", + "domain_names": [ + "rpc-hybx.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:58", + "meta": {} + }, + { + "id": 54, + "created_on": "2026-01-16 16:56:06", + "modified_on": "2026-02-25 22:35:44", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-ws-prv.d-bis.org", + "domain_names": [ + "rpc-ws-prv.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:38", + "meta": {} + }, + { + "id": 55, + "created_on": "2026-01-16 16:56:16", + "modified_on": "2026-02-25 22:35:42", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-ws-pub.d-bis.org", + "domain_names": [ + "rpc-ws-pub.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:51", + "meta": {} + }, + { + "id": 141, + "created_on": "2026-01-30 09:33:59", + "modified_on": "2026-02-25 22:35:04", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc.d-bis.org", + "domain_names": [ + "rpc.d-bis.org" + ], + "expires_on": "2026-04-30 13:35:45", + "meta": { + "letsencrypt_agree": true, + "dns_challenge": true, + "nginx_online": false, + "nginx_err": "nginx: [emerg] cannot load certificate \"/data/tls/certbot/live/npm-135/fullchain.pem\": BIO_new_file() failed (SSL: error:80000002:system library::No such file or directory:calling fopen(/data/tls/certbot/live/npm-135/fullchain.pem, r) error:10000080:BIO routines::no such file)\nnginx: configuration file /usr/local/nginx/conf/nginx.conf test failed", + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\ndns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0" + } + }, + { + "id": 56, + "created_on": "2026-01-16 16:56:30", + "modified_on": "2026-02-25 22:35:40", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc.public-0138.defi-oracle.io", + "domain_names": [ + "rpc.public-0138.defi-oracle.io" + ], + "expires_on": "2026-04-16 20:58:05", + "meta": {} + }, + { + "id": 137, + "created_on": "2026-01-29 23:39:01", + "modified_on": "2026-02-25 22:35:14", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc2.d-bis.org", + "domain_names": [ + "rpc2.d-bis.org" + ], + "expires_on": "2026-04-30 03:40:50", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 57, + "created_on": "2026-01-16 16:56:41", + "modified_on": "2026-02-25 22:35:37", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "sankofa.nexus", + "domain_names": [ + "sankofa.nexus" + ], + "expires_on": "2026-04-16 20:58:17", + "meta": {} + }, + { + "id": 58, + "created_on": "2026-01-16 16:56:53", + "modified_on": "2026-02-25 22:35:34", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "secure.d-bis.org", + "domain_names": [ + "secure.d-bis.org" + ], + "expires_on": "2026-04-16 20:58:28", + "meta": {} + }, + { + "id": 59, + "created_on": "2026-01-16 16:57:05", + "modified_on": "2026-02-25 22:35:31", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "secure.mim4u.org", + "domain_names": [ + "secure.mim4u.org" + ], + "expires_on": "2026-04-16 20:58:40", + "meta": {} + }, + { + "id": 60, + "created_on": "2026-01-16 16:57:17", + "modified_on": "2026-02-25 22:35:29", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "the-order.sankofa.nexus", + "domain_names": [ + "the-order.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:58:53", + "meta": {} + }, + { + "id": 61, + "created_on": "2026-01-16 16:57:31", + "modified_on": "2026-02-25 22:35:28", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "training.mim4u.org", + "domain_names": [ + "training.mim4u.org" + ], + "expires_on": "2026-04-16 20:59:06", + "meta": {} + }, + { + "id": 164, + "created_on": "2026-02-21 17:46:22", + "modified_on": "2026-02-25 22:36:11", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc-fireblocks.d-bis.org", + "domain_names": [ + "ws.rpc-fireblocks.d-bis.org" + ], + "expires_on": "2026-05-22 21:48:21", + "meta": {} + }, + { + "id": 138, + "created_on": "2026-01-29 23:41:20", + "modified_on": "2026-02-25 22:35:13", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc.d-bis.org", + "domain_names": [ + "ws.rpc.d-bis.org" + ], + "expires_on": "2026-04-30 03:43:05", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 139, + "created_on": "2026-01-29 23:42:13", + "modified_on": "2026-02-25 22:35:11", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc2.d-bis.org", + "domain_names": [ + "ws.rpc2.d-bis.org" + ], + "expires_on": "2026-04-30 03:43:58", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 140, + "created_on": "2026-01-29 23:43:09", + "modified_on": "2026-02-25 22:35:07", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "wss.defi-oracle.io", + "domain_names": [ + "wss.defi-oracle.io" + ], + "expires_on": "2026-04-30 03:44:57", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 62, + "created_on": "2026-01-16 16:57:41", + "modified_on": "2026-02-25 22:35:27", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.mim4u.org", + "domain_names": [ + "www.mim4u.org" + ], + "expires_on": "2026-04-16 20:59:17", + "meta": {} + }, + { + "id": 63, + "created_on": "2026-01-16 16:57:52", + "modified_on": "2026-02-25 22:35:24", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.phoenix.sankofa.nexus", + "domain_names": [ + "www.phoenix.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:59:28", + "meta": {} + }, + { + "id": 64, + "created_on": "2026-01-16 16:58:06", + "modified_on": "2026-02-25 22:35:21", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.sankofa.nexus", + "domain_names": [ + "www.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:59:41", + "meta": {} + } +] diff --git a/backups/npmplus/backup-20260228_030001/api/proxy_hosts.json b/backups/npmplus/backup-20260228_030001/api/proxy_hosts.json new file mode 100644 index 0000000..2d9eea3 --- /dev/null +++ b/backups/npmplus/backup-20260228_030001/api/proxy_hosts.json @@ -0,0 +1,1394 @@ +[ + { + "id": 37, + "created_on": "2026-02-07 00:42:23", + "modified_on": "2026-02-07 00:46:30", + "owner_user_id": 1, + "domain_names": [ + "cacti-alltra.d-bis.org" + ], + "forward_host": "192.168.11.177", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 146, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 38, + "created_on": "2026-02-07 00:42:24", + "modified_on": "2026-02-07 00:46:53", + "owner_user_id": 1, + "domain_names": [ + "cacti-hybx.d-bis.org" + ], + "forward_host": "192.168.11.251", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 147, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 41, + "created_on": "2026-02-07 20:41:16", + "modified_on": "2026-02-20 22:29:09", + "owner_user_id": 1, + "domain_names": [ + "codespaces.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 156, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 22, + "created_on": "2026-01-18 22:19:18", + "modified_on": "2026-01-29 22:52:50", + "owner_user_id": 1, + "domain_names": [ + "cross-all.defi-oracle.io" + ], + "forward_host": "192.168.11.211", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 134, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 49, + "created_on": "2026-02-20 22:27:16", + "modified_on": "2026-02-20 22:37:53", + "owner_user_id": 1, + "domain_names": [ + "dapp.d-bis.org" + ], + "forward_host": "192.168.11.58", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 162, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 13, + "created_on": "2026-01-16 14:41:02", + "modified_on": "2026-02-27 22:22:08", + "owner_user_id": 1, + "domain_names": [ + "dbis-admin.d-bis.org" + ], + "forward_host": "192.168.11.130", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 46, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 15, + "created_on": "2026-01-16 14:41:04", + "modified_on": "2026-02-27 22:38:58", + "owner_user_id": 1, + "domain_names": [ + "dbis-api-2.d-bis.org" + ], + "forward_host": "192.168.11.156", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 47, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 14, + "created_on": "2026-01-16 14:41:03", + "modified_on": "2026-02-27 22:31:12", + "owner_user_id": 1, + "domain_names": [ + "dbis-api.d-bis.org" + ], + "forward_host": "192.168.11.155", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 48, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 45, + "created_on": "2026-02-13 20:32:33", + "modified_on": "2026-02-13 20:32:33", + "owner_user_id": 1, + "domain_names": [ + "dbis.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3001, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 39, + "created_on": "2026-02-07 20:41:12", + "modified_on": "2026-02-20 22:29:57", + "owner_user_id": 1, + "domain_names": [ + "dev.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 157, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 8, + "created_on": "2026-01-16 14:40:58", + "modified_on": "2026-02-27 21:59:33", + "owner_user_id": 1, + "domain_names": [ + "explorer.d-bis.org" + ], + "forward_host": "192.168.11.140", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 145, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers (unsafe-eval for ethers.js v5)\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 30, + "created_on": "2026-01-31 00:13:09", + "modified_on": "2026-02-06 19:09:43", + "owner_user_id": 1, + "domain_names": [ + "explorer.defi-oracle.io" + ], + "forward_host": "192.168.11.140", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 144, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 40, + "created_on": "2026-02-07 20:41:14", + "modified_on": "2026-02-20 22:30:39", + "owner_user_id": 1, + "domain_names": [ + "gitea.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 158, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 46, + "created_on": "2026-02-13 20:32:35", + "modified_on": "2026-02-13 20:32:35", + "owner_user_id": 1, + "domain_names": [ + "iccc.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3002, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 17, + "created_on": "2026-01-16 14:41:05", + "modified_on": "2026-02-27 23:01:06", + "owner_user_id": 1, + "domain_names": [ + "mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 50, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 47, + "created_on": "2026-02-13 20:32:37", + "modified_on": "2026-02-13 20:32:37", + "owner_user_id": 1, + "domain_names": [ + "omnl.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3003, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 5, + "created_on": "2026-01-16 14:40:55", + "modified_on": "2026-01-16 17:01:49", + "owner_user_id": 1, + "domain_names": [ + "phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.50", + "forward_port": 4000, + "access_list_id": 0, + "certificate_id": 51, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 42, + "created_on": "2026-02-07 20:41:17", + "modified_on": "2026-02-20 22:31:27", + "owner_user_id": 1, + "domain_names": [ + "pve.ml110.d-bis.org" + ], + "forward_host": "192.168.11.10", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 159, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 43, + "created_on": "2026-02-07 20:41:19", + "modified_on": "2026-02-20 22:32:14", + "owner_user_id": 1, + "domain_names": [ + "pve.r630-01.d-bis.org" + ], + "forward_host": "192.168.11.11", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 160, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 44, + "created_on": "2026-02-07 20:41:21", + "modified_on": "2026-02-20 22:32:57", + "owner_user_id": 1, + "domain_names": [ + "pve.r630-02.d-bis.org" + ], + "forward_host": "192.168.11.12", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 161, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 32, + "created_on": "2026-02-07 00:42:16", + "modified_on": "2026-02-07 00:47:07", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra-2.d-bis.org" + ], + "forward_host": "192.168.11.173", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 148, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 33, + "created_on": "2026-02-07 00:42:17", + "modified_on": "2026-02-07 08:15:41", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "forward_host": "192.168.11.174", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 150, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 31, + "created_on": "2026-02-07 00:42:15", + "modified_on": "2026-02-07 08:15:53", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra.d-bis.org" + ], + "forward_host": "192.168.11.172", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 151, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 50, + "created_on": "2026-02-21 17:37:16", + "modified_on": "2026-02-27 22:06:10", + "owner_user_id": 1, + "domain_names": [ + "rpc-fireblocks.d-bis.org" + ], + "forward_host": "192.168.11.232", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 163, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 11, + "created_on": "2026-01-16 14:41:00", + "modified_on": "2026-02-27 22:00:20", + "owner_user_id": 1, + "domain_names": [ + "rpc-http-prv.d-bis.org" + ], + "forward_host": "192.168.11.211", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 52, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 9, + "created_on": "2026-01-16 14:40:59", + "modified_on": "2026-02-27 21:59:45", + "owner_user_id": 1, + "domain_names": [ + "rpc-http-pub.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 53, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 35, + "created_on": "2026-02-07 00:42:20", + "modified_on": "2026-02-07 08:16:06", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx-2.d-bis.org" + ], + "forward_host": "192.168.11.247", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 152, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 36, + "created_on": "2026-02-07 00:42:22", + "modified_on": "2026-02-07 08:16:19", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx-3.d-bis.org" + ], + "forward_host": "192.168.11.248", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 153, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 34, + "created_on": "2026-02-07 00:42:19", + "modified_on": "2026-02-07 08:16:32", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx.d-bis.org" + ], + "forward_host": "192.168.11.246", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 154, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 12, + "created_on": "2026-01-16 14:41:01", + "modified_on": "2026-02-27 22:01:09", + "owner_user_id": 1, + "domain_names": [ + "rpc-ws-prv.d-bis.org" + ], + "forward_host": "192.168.11.211", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 54, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 10, + "created_on": "2026-01-16 14:40:59", + "modified_on": "2026-02-27 21:59:54", + "owner_user_id": 1, + "domain_names": [ + "rpc-ws-pub.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 55, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 26, + "created_on": "2026-01-29 16:35:10", + "modified_on": "2026-02-27 22:02:33", + "owner_user_id": 1, + "domain_names": [ + "rpc.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 141, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\ndns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 24, + "created_on": "2026-01-29 15:38:44", + "modified_on": "2026-02-27 22:02:16", + "owner_user_id": 1, + "domain_names": [ + "rpc.defi-oracle.io" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 56, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 21, + "created_on": "2026-01-16 14:41:09", + "modified_on": "2026-02-27 22:01:44", + "owner_user_id": 1, + "domain_names": [ + "rpc.public-0138.defi-oracle.io" + ], + "forward_host": "192.168.11.240", + "forward_port": 443, + "access_list_id": 0, + "certificate_id": 56, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "https", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 27, + "created_on": "2026-01-29 16:35:11", + "modified_on": "2026-02-27 22:02:54", + "owner_user_id": 1, + "domain_names": [ + "rpc2.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 137, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 3, + "created_on": "2026-01-16 14:40:54", + "modified_on": "2026-01-16 17:01:32", + "owner_user_id": 1, + "domain_names": [ + "sankofa.nexus" + ], + "forward_host": "192.168.11.51", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 57, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "add_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 16, + "created_on": "2026-01-16 14:41:04", + "modified_on": "2026-02-27 23:00:35", + "owner_user_id": 1, + "domain_names": [ + "secure.d-bis.org" + ], + "forward_host": "192.168.11.130", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 58, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 19, + "created_on": "2026-01-16 14:41:07", + "modified_on": "2026-02-27 23:21:23", + "owner_user_id": 1, + "domain_names": [ + "secure.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 59, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 7, + "created_on": "2026-01-16 14:40:57", + "modified_on": "2026-01-16 17:02:09", + "owner_user_id": 1, + "domain_names": [ + "the-order.sankofa.nexus" + ], + "forward_host": "192.168.11.36", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 60, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 20, + "created_on": "2026-01-16 14:41:08", + "modified_on": "2026-02-27 23:45:49", + "owner_user_id": 1, + "domain_names": [ + "training.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 61, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 51, + "created_on": "2026-02-21 17:37:45", + "modified_on": "2026-02-27 22:15:51", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc-fireblocks.d-bis.org" + ], + "forward_host": "192.168.11.232", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 164, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 28, + "created_on": "2026-01-29 16:35:12", + "modified_on": "2026-02-27 22:03:07", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 138, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 29, + "created_on": "2026-01-29 16:35:12", + "modified_on": "2026-02-27 22:03:15", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc2.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 139, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 25, + "created_on": "2026-01-29 15:38:45", + "modified_on": "2026-02-27 22:02:24", + "owner_user_id": 1, + "domain_names": [ + "wss.defi-oracle.io" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 140, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 18, + "created_on": "2026-01-16 14:41:06", + "modified_on": "2026-02-27 23:06:52", + "owner_user_id": 1, + "domain_names": [ + "www.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 62, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 6, + "created_on": "2026-01-16 14:40:56", + "modified_on": "2026-01-16 17:02:17", + "owner_user_id": 1, + "domain_names": [ + "www.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.50", + "forward_port": 4000, + "access_list_id": 0, + "certificate_id": 63, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 4, + "created_on": "2026-01-16 14:40:55", + "modified_on": "2026-01-16 17:02:19", + "owner_user_id": 1, + "domain_names": [ + "www.sankofa.nexus" + ], + "forward_host": "192.168.11.51", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 64, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 48, + "created_on": "2026-02-13 20:32:39", + "modified_on": "2026-02-13 20:32:39", + "owner_user_id": 1, + "domain_names": [ + "xom.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3004, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + } +] diff --git a/backups/npmplus/backup-20260228_030001/certificates/cert_list.txt b/backups/npmplus/backup-20260228_030001/certificates/cert_list.txt new file mode 100644 index 0000000..e69de29 diff --git a/backups/npmplus/backup-20260228_030001/database/database.sql b/backups/npmplus/backup-20260228_030001/database/database.sql new file mode 100644 index 0000000..77149a3 --- /dev/null +++ b/backups/npmplus/backup-20260228_030001/database/database.sql @@ -0,0 +1 @@ +Database file not found diff --git a/backups/npmplus/backup-20260228_030001/database/database.sqlite b/backups/npmplus/backup-20260228_030001/database/database.sqlite new file mode 100644 index 0000000..e69de29 diff --git a/backups/npmplus/backup-20260228_030001/manifest.json b/backups/npmplus/backup-20260228_030001/manifest.json new file mode 100644 index 0000000..cbea02c --- /dev/null +++ b/backups/npmplus/backup-20260228_030001/manifest.json @@ -0,0 +1,19 @@ +{ + "timestamp": "20260228_030001", + "backup_date": "2026-02-28T03:00:13-08:00", + "npmplus_vmid": "10233", + "npmplus_host": "192.168.11.11", + "npm_url": "https://192.168.11.167:81", + "backup_contents": { + "database": { + "sql_dump": "present", + "sqlite_file": "missing" + }, + "api_exports": { + "proxy_hosts": "present", + "certificates": "present", + "access_lists": "present" + }, + "certificate_files": "missing" + } +} diff --git a/backups/npmplus/backup-20260228_030001/volumes/volume_list.txt b/backups/npmplus/backup-20260228_030001/volumes/volume_list.txt new file mode 100644 index 0000000..4545150 --- /dev/null +++ b/backups/npmplus/backup-20260228_030001/volumes/volume_list.txt @@ -0,0 +1 @@ +DRIVER VOLUME NAME diff --git a/backups/npmplus/backup-20260301_030001.tar.gz b/backups/npmplus/backup-20260301_030001.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..999801cc28e154500cafd7c0ccaae829b23cb6d8 GIT binary patch literal 5313 zcmV;y6h7-8iwFP!000001MOXFkJ~o7p3nIe!t_HDpz@HSBzsf@*lwHM4bUb3!9UP+z{4*K5@DcLeTmPm@`cx2MEA1 z`5yrA;!Nj3t_X%hkN$*153oPi#~Jj3g_R`7Bx)9 zQCQ-28yg@Sz|Q~$00hvr!HE2!Zk;aXi)2}hZ{~4Cn?v9rw0-J2E6VEBr89v3XaFJk zw`nq7<_SG}U6zX?xVT_j`NLqe{Z!K|Epb{Fqz8Q+a)LZ(I0*~f{D%Cl_-`_fmi0R> za$Jxe)m7Ff;}VZ&aZ|5>*>4;S$m-z~D7xsye&mEGM}?^Cp1dW!Qh zp2brly7mU)bc&0jnq#*bY~7r>O7)b*gU9^y#h*&7-7)^x0@R`a_R|0STK^jw{r@0` z==-n#FsMg}(mjOw-_G|RdaiHy{}4x?@2`3f;rB;7-ygU`^ZgHT{Ji?U7M)bAG%KxH zwoD^q0X&nVWBjv9%icObKmQM;`oC-D|HB+I-=F?v9~V%s`JaA&@-z?_{y)Ug@%@Rd zqb~-~fBYklG&ke_00-y$GluPcZXoXXC$=6Kvi=`H^*;!V|MwurmlxLBX;S%W&~WW= z$T1=RXq=@RhmT`}p#?zTI)Q^$4vh187Ll2vtEC?xux^>%rZ^uj3-Z6}UU2pMD4U0I zI!?oR<<|JpcuvA;8QWo!lzBLa>`7bJi6 zOK0PHsUHcnxLfLHb^X<;qDaQ%dQ(h)UFJ)??h;O~^!k2sr+`w&gE~<?b}9PNTFK zPp=8+aC)@^RCb}j%F^w!#C*Sy9G@5}So=ngTxSl(UrY;_N?!*tH5Te;61T#=w!us&> z;q{sO(=WIZYHGj{!FyN@1SbF^Wq1={+hH`1 zQx&Thb*X9!DA#TDGCf-`{+;y+PnUUI-dq2|1WS4GH4P*3mepUZ|JXm(i5~Xn`vtZ? zEGj5iU(eI5NaNY;>$w#sx8Z&9!-H=BAo>p5{?m`YzWwm=-9O*G@9grQPoM1H@~p&D z+KKdmKUn00<2ThSb#(iPXJoM8-2N>~;^{rye2$TqdPmORLVQv1nj7 zAic}`1oJv?H=mJ5V_R>ZjptYF$?CW3CPZ)((u92NlnAxu8n;FDKhkE7qd4roOE&qV zxk8$eXZ*pU5loxNsu2po>f8?NkGFLZa;icD#a>ZndC^>BMPTH`3o3VP=lH)%(xza) z5>>q4rUf}|5w(9oKGx44e){~szrD3y#WRaKQ*jzuQHG23WofM}11m0H(~j>6o&xLh zbzE5V+HsDHrc0Sw1^u~w)$gtMl!L8lNH1404jCJtfBnUpWYN8a!y-=ZjpoAFT%adO z?IKrEP3>qDczaU&BDNhBYWIAdR=93oks)_O?uOhAxgVC?T}g5m#j9524g=`yOYTb4 z?rEj=k)d`&?S|S7wVyDxyF9(!u_2eeOb>fAJ!m8P!v)fgCN9&BJw=Bg;`_Tdpk!hRWz8pnLk5 zZL7IxVzwt6vo-PB{;a^uI%=#9z&MCF)&>l`%RQ!~Y9tY@RmIwHHO2^FGfzK}v0=Sp z^kk|*TDZI>zaRWjSU28lV~ZGD9g$Gxt3sldj2e61f>YX*Z*%$_w#yIz51!(dkVU#?AOhZbrykZ^yaJ1rIw)`3fF(lJ*wl+WZB%@fe(f$AEsPTGvpE zVCGK{!!#y~7L$d)7<;2|45d{Qo2b%_(G(tBiVb-0F!*t~$l!D&E3l)*C8PEmq!87&ywR#o`7J z<_UyAC6wLm?+1QwZin7w8@U^gsPTwCpQW%aZz(KG4WfA9iW(dyq@qF%xsL$RBUQ+u zyB>iGIrvX(Y8Y}b6r zmZJcAWXjV3RHOvdE^oRTP<4l44N&(2s<43M3aFy=fCi}QRkt=kRf1`!x}^rw!+PNj zOt~=i__>u1q!Az_Qyi{Zg%A8-`u7Dg= zLE!8KRVoX6k*h55jSTE3Zm6N$Q z?7p0+u)Cv|-4CmU72|jr{rFC+|HE~ zYVMHZs77vJTEmpTq-+CIQSG1xrcgO`wt=aNbJ=k_OXjP=)VM;938unW{>r&5T=>6+ zDN?STxrV6{NW01+D}wYmR{a~0)}KSLLr&wb6DFM0{yMnF7Frafx5Z<4>-s0092lj> zo-_8GvFD6ErZvUDp z?SMD-hp|75{bB5np7uxaWCjSow&KPBkqjL;`+1j?@&q(nAm}-4;$rNKqu0Qsc3TI` zcoWqYQ;$3=))ea+mr9km+xJ#_G=0mc9LKM6m;zRU&=KFe*l$;FMAz}Cm+h`UqROgB zq;b27_G

B*OGGHk+~8PK`jHz0G!-v@W%P2Qr00xU}xTz)=nwt!Vv;%i_0IBs?Ii zo3i+Z-;a{tO_|5}okBs2*8WRE`JfT>c9CfCy_n#@+%Tt=5 zjWGb8=>%a6fD<$T9I2FGVgSf&v5f-P+hf~_GAF+#jQPYSKznIXV*(fx;JGurF#%3z zp3rInc>KDEO~E-=X4^!ks*9*x!1J~kJZ{Z7m1@*x4eK%KG$RgL*+djkJ%Cjr3fiMC za*fufU*ZJObJ%>^q@o;sDvHC8I4BHGs2oVH2dDN#F_qEz95zBSqx1MjCw~{p&4Ls; zMGrWEqnyJ@ETTtQkfJa=-RH0skr|#xKRh8{v)y>>WD0*HTKL;jPUO73y?ts&o#rZR zCIia^U{2XRX96%M7=V$=s|A6_XLKgI4%K}Xgwc;_>+b{a;W;e^6RpE^IpT0RnIgsQv^m z!bN<+460)AN0Ftf_aIjUzVFhXaOeT{=juRb&?El<=z}3VBWIxt&MctwMZ1n=QHHr? zoyBRHOgZgD=TG$bVutavJ~-o_nL8hI{JZ|pb9ctS=b7<;h~vw{fSxP0ca0x7!lFqY z4Y(s$qG%EuBxXXd>uza0#g&Fx1(B(-v%3$qKppMqwWWg+t&UnMTd(2SU}OO|aEGiv zWUb7#MnqlS@-#+(E|M0YaD&C75=jxZ_uIEClgj$_e+(Zq^% zb+`?h6Hin+`MZ|Pmg?jismzvorNf7h53kSMzpFs=o8IX*@{c4=xT)PWt!U@&UR7m= z5e$2dM5*E$?Vd!SvKQJb|0hAp!<;b@;=B3@QSaIaSXGrmCIyvG89r}!r8Q+BpB+V9 zA^Oa^JRL%e!o@1}W2B*pBch3YD1xiX*6}N!4i+R#PFsUp9O>!>ZUR(0 zjOKCL1LAFcB$$D`tV5GF*kY$VX5ebEjO<)t9iE05wCWPI92W7`?yFL=d(fwk>>N2o zjO&MIWamlhVIH&pkxtq5mz<*9Hv4u66j;9Lv{GO%10)GLS7P^pUV_6nJ!FPEcM0Uq zMX&{CW-dDQxd^&~t*Z$sTn5mUs8`vz1+lmT2nJt2S&f+sh{F>L!hMFl5Th8dg6lIPb&i9zW$` zWj})eO1s>kR&V)LT;d*X@`ugkwHAk+xD3AkBKY>i#h8dC;{}dz^<`tp2-imUf%j&) zmjKuu>%zEp%aGkuoM*Rii;*x=k~Le1l!P^F`$(xh|4JY+iKH!&^hQ$BgC1`Ie#4ufyTVEr$HbwS#Flkg*0G0R}x)f$MV z#p&wIr#``wj$Sezk9E=yl2f0d%U1wb0vt+g6y69>tChis0x1a)DGJctaglat(0t8; z3UE}pT&3C8)v7^1fdC<0cg~g_;R}#IT{Qxf&)Gv-15X=KsEAKdcu>-Q^Ld;3t!r_* zp0p3l4;-zLjn3kn5&{$#_3WJS9awReTq2Ig%fn$@2;wqVjSE3*(kPV$U0-A`@*W}3 zj$T6fF;0ZtyqtFVi8qw2zSWZ;rx7DkU{E(ddAQylP1IjBgNIwAY zCwF~Sn4La-7*JM$;i9h*o-eVVe3N*qT?4EH(R23Q>C;Deu4D?LCkPp?h35!Uz8m3b z4WXH%?k#{j$CJA|* zI2|nT{42Tg-`{;0r}%a}ixd3nHF*T`GqPTN`t(a+k$Y!(Fsj$?IYDt>lz46>@gxuP z`yhCqS;caCZPBh)mRk`K;k3-isVRBiIK8rF*#f7p`aIJ2R{nZ*Us&CC1OoDiR-P?O zBBUY+Qs%C&zosj})XVUfd9~=hexi$Ikzdet@X1Bh=z_MX|2Uw3v`So*s~2u}lj(J( z9lXS8^||JSC5VMm;ll1ij^Xaufhb#RlJ^SP1A`0Rh6VpXl=#u)g0!GSg9O+KX9c1hP0X;z48rI^9)AJvMs*O zCzX}&Gr1Q+X=xpfJDbRh1jgNTULZ3^Qco7|#_U(A9@1_pq&1y$XNP7vnWH7GpOG1qc17uRhjwjQDiEF2PNxD1dUESPxWQvaf=HUz9Ie6QmTdt=!V_#H$d%ir zbQr_uyHZx3czIU}yIM?#;CMS_2_z`J$rjfiKWd4tf`sJuT|jUtYov0u-bRX}9)U2uWsi1?oJ&YgU21N-hHL7z Tn!_CCcyRnbhJ>Y+06+l%B5;CE literal 0 HcmV?d00001 diff --git a/backups/npmplus/backup-20260301_030001/api/access_lists.json b/backups/npmplus/backup-20260301_030001/api/access_lists.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/backups/npmplus/backup-20260301_030001/api/access_lists.json @@ -0,0 +1 @@ +[] diff --git a/backups/npmplus/backup-20260301_030001/api/certificates.json b/backups/npmplus/backup-20260301_030001/api/certificates.json new file mode 100644 index 0000000..82dba79 --- /dev/null +++ b/backups/npmplus/backup-20260301_030001/api/certificates.json @@ -0,0 +1,685 @@ +[ + { + "id": 146, + "created_on": "2026-02-07 00:46:21", + "modified_on": "2026-02-25 22:34:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cacti-alltra.d-bis.org", + "domain_names": [ + "cacti-alltra.d-bis.org" + ], + "expires_on": "2026-05-08 04:47:55", + "meta": {} + }, + { + "id": 147, + "created_on": "2026-02-07 00:46:43", + "modified_on": "2026-02-25 22:34:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cacti-hybx.d-bis.org", + "domain_names": [ + "cacti-hybx.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:19", + "meta": {} + }, + { + "id": 155, + "created_on": "2026-02-20 22:27:52", + "modified_on": "2026-02-20 22:27:52", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "codespaces.d-bis.org", + "domain_names": [ + "codespaces.d-bis.org" + ], + "expires_on": "2026-02-20 22:27:52", + "meta": {} + }, + { + "id": 156, + "created_on": "2026-02-20 22:28:48", + "modified_on": "2026-02-25 22:34:21", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "codespaces.d-bis.org", + "domain_names": [ + "codespaces.d-bis.org" + ], + "expires_on": "2026-05-22 02:30:34", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n", + "letsencrypt_agree": true + } + }, + { + "id": 134, + "created_on": "2026-01-29 22:52:44", + "modified_on": "2026-02-25 22:35:17", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cross-all.defi-oracle.io", + "domain_names": [ + "cross-all.defi-oracle.io" + ], + "expires_on": "2026-04-30 02:54:15", + "meta": {} + }, + { + "id": 162, + "created_on": "2026-02-20 22:36:34", + "modified_on": "2026-02-25 22:36:08", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dapp.d-bis.org", + "domain_names": [ + "dapp.d-bis.org" + ], + "expires_on": "2026-05-22 02:38:20", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 46, + "created_on": "2026-01-16 16:54:36", + "modified_on": "2026-02-25 22:36:19", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-admin.d-bis.org", + "domain_names": [ + "dbis-admin.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:11", + "meta": {} + }, + { + "id": 47, + "created_on": "2026-01-16 16:54:47", + "modified_on": "2026-02-25 22:36:01", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-api-2.d-bis.org", + "domain_names": [ + "dbis-api-2.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:22", + "meta": {} + }, + { + "id": 48, + "created_on": "2026-01-16 16:54:58", + "modified_on": "2026-02-25 22:35:59", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-api.d-bis.org", + "domain_names": [ + "dbis-api.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:33", + "meta": {} + }, + { + "id": 157, + "created_on": "2026-02-20 22:29:37", + "modified_on": "2026-02-25 22:34:16", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dev.d-bis.org", + "domain_names": [ + "dev.d-bis.org" + ], + "expires_on": "2026-05-22 02:31:22", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 145, + "created_on": "2026-02-06 19:14:04", + "modified_on": "2026-02-25 22:34:59", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "explorer.d-bis.org", + "domain_names": [ + "explorer.d-bis.org" + ], + "expires_on": "2026-05-07 23:15:36", + "meta": { + "letsencrypt_agree": true, + "dns_challenge": true, + "nginx_online": true, + "nginx_err": null, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0" + } + }, + { + "id": 144, + "created_on": "2026-02-06 19:05:50", + "modified_on": "2026-02-25 22:35:01", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "explorer.defi-oracle.io", + "domain_names": [ + "explorer.defi-oracle.io" + ], + "expires_on": "2026-05-07 23:07:35", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 158, + "created_on": "2026-02-20 22:30:18", + "modified_on": "2026-02-25 22:34:14", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "gitea.d-bis.org", + "domain_names": [ + "gitea.d-bis.org" + ], + "expires_on": "2026-05-22 02:32:04", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 50, + "created_on": "2026-01-16 16:55:25", + "modified_on": "2026-02-25 22:35:55", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "mim4u.org", + "domain_names": [ + "mim4u.org" + ], + "expires_on": "2026-04-16 20:57:01", + "meta": {} + }, + { + "id": 51, + "created_on": "2026-01-16 16:55:37", + "modified_on": "2026-02-25 22:35:53", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "phoenix.sankofa.nexus", + "domain_names": [ + "phoenix.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:57:08", + "meta": {} + }, + { + "id": 159, + "created_on": "2026-02-20 22:31:08", + "modified_on": "2026-02-25 22:34:12", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.ml110.d-bis.org", + "domain_names": [ + "pve.ml110.d-bis.org" + ], + "expires_on": "2026-05-22 02:32:54", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 160, + "created_on": "2026-02-20 22:31:51", + "modified_on": "2026-02-25 22:34:08", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.r630-01.d-bis.org", + "domain_names": [ + "pve.r630-01.d-bis.org" + ], + "expires_on": "2026-05-22 02:33:37", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 161, + "created_on": "2026-02-20 22:32:35", + "modified_on": "2026-02-25 22:34:08", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.r630-02.d-bis.org", + "domain_names": [ + "pve.r630-02.d-bis.org" + ], + "expires_on": "2026-05-22 02:34:21", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 148, + "created_on": "2026-02-07 00:46:56", + "modified_on": "2026-02-25 22:34:47", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-2.d-bis.org", + "domain_names": [ + "rpc-alltra-2.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:31", + "meta": {} + }, + { + "id": 149, + "created_on": "2026-02-07 00:47:10", + "modified_on": "2026-02-25 22:34:45", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-3.d-bis.org", + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:46", + "meta": {} + }, + { + "id": 150, + "created_on": "2026-02-07 08:15:35", + "modified_on": "2026-02-25 22:34:42", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-3.d-bis.org", + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:06", + "meta": {} + }, + { + "id": 151, + "created_on": "2026-02-07 08:15:43", + "modified_on": "2026-02-25 22:34:36", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra.d-bis.org", + "domain_names": [ + "rpc-alltra.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:18", + "meta": {} + }, + { + "id": 163, + "created_on": "2026-02-21 17:45:18", + "modified_on": "2026-02-25 22:36:29", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-fireblocks.d-bis.org", + "domain_names": [ + "rpc-fireblocks.d-bis.org" + ], + "expires_on": "2026-05-22 21:47:15", + "meta": {} + }, + { + "id": 52, + "created_on": "2026-01-16 16:55:45", + "modified_on": "2026-02-25 22:35:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-http-prv.d-bis.org", + "domain_names": [ + "rpc-http-prv.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:20", + "meta": {} + }, + { + "id": 53, + "created_on": "2026-01-16 16:55:57", + "modified_on": "2026-02-25 22:35:46", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-http-pub.d-bis.org", + "domain_names": [ + "rpc-http-pub.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:30", + "meta": {} + }, + { + "id": 152, + "created_on": "2026-02-07 08:15:56", + "modified_on": "2026-02-25 22:34:30", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx-2.d-bis.org", + "domain_names": [ + "rpc-hybx-2.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:31", + "meta": {} + }, + { + "id": 153, + "created_on": "2026-02-07 08:16:09", + "modified_on": "2026-02-25 22:34:27", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx-3.d-bis.org", + "domain_names": [ + "rpc-hybx-3.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:45", + "meta": {} + }, + { + "id": 154, + "created_on": "2026-02-07 08:16:22", + "modified_on": "2026-02-25 22:34:24", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx.d-bis.org", + "domain_names": [ + "rpc-hybx.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:58", + "meta": {} + }, + { + "id": 54, + "created_on": "2026-01-16 16:56:06", + "modified_on": "2026-02-25 22:35:44", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-ws-prv.d-bis.org", + "domain_names": [ + "rpc-ws-prv.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:38", + "meta": {} + }, + { + "id": 55, + "created_on": "2026-01-16 16:56:16", + "modified_on": "2026-02-25 22:35:42", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-ws-pub.d-bis.org", + "domain_names": [ + "rpc-ws-pub.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:51", + "meta": {} + }, + { + "id": 141, + "created_on": "2026-01-30 09:33:59", + "modified_on": "2026-02-25 22:35:04", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc.d-bis.org", + "domain_names": [ + "rpc.d-bis.org" + ], + "expires_on": "2026-04-30 13:35:45", + "meta": { + "letsencrypt_agree": true, + "dns_challenge": true, + "nginx_online": false, + "nginx_err": "nginx: [emerg] cannot load certificate \"/data/tls/certbot/live/npm-135/fullchain.pem\": BIO_new_file() failed (SSL: error:80000002:system library::No such file or directory:calling fopen(/data/tls/certbot/live/npm-135/fullchain.pem, r) error:10000080:BIO routines::no such file)\nnginx: configuration file /usr/local/nginx/conf/nginx.conf test failed", + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\ndns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0" + } + }, + { + "id": 56, + "created_on": "2026-01-16 16:56:30", + "modified_on": "2026-02-25 22:35:40", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc.public-0138.defi-oracle.io", + "domain_names": [ + "rpc.public-0138.defi-oracle.io" + ], + "expires_on": "2026-04-16 20:58:05", + "meta": {} + }, + { + "id": 137, + "created_on": "2026-01-29 23:39:01", + "modified_on": "2026-02-25 22:35:14", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc2.d-bis.org", + "domain_names": [ + "rpc2.d-bis.org" + ], + "expires_on": "2026-04-30 03:40:50", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 57, + "created_on": "2026-01-16 16:56:41", + "modified_on": "2026-02-25 22:35:37", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "sankofa.nexus", + "domain_names": [ + "sankofa.nexus" + ], + "expires_on": "2026-04-16 20:58:17", + "meta": {} + }, + { + "id": 58, + "created_on": "2026-01-16 16:56:53", + "modified_on": "2026-02-25 22:35:34", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "secure.d-bis.org", + "domain_names": [ + "secure.d-bis.org" + ], + "expires_on": "2026-04-16 20:58:28", + "meta": {} + }, + { + "id": 59, + "created_on": "2026-01-16 16:57:05", + "modified_on": "2026-02-25 22:35:31", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "secure.mim4u.org", + "domain_names": [ + "secure.mim4u.org" + ], + "expires_on": "2026-04-16 20:58:40", + "meta": {} + }, + { + "id": 60, + "created_on": "2026-01-16 16:57:17", + "modified_on": "2026-02-25 22:35:29", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "the-order.sankofa.nexus", + "domain_names": [ + "the-order.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:58:53", + "meta": {} + }, + { + "id": 61, + "created_on": "2026-01-16 16:57:31", + "modified_on": "2026-02-25 22:35:28", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "training.mim4u.org", + "domain_names": [ + "training.mim4u.org" + ], + "expires_on": "2026-04-16 20:59:06", + "meta": {} + }, + { + "id": 164, + "created_on": "2026-02-21 17:46:22", + "modified_on": "2026-02-25 22:36:11", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc-fireblocks.d-bis.org", + "domain_names": [ + "ws.rpc-fireblocks.d-bis.org" + ], + "expires_on": "2026-05-22 21:48:21", + "meta": {} + }, + { + "id": 138, + "created_on": "2026-01-29 23:41:20", + "modified_on": "2026-02-25 22:35:13", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc.d-bis.org", + "domain_names": [ + "ws.rpc.d-bis.org" + ], + "expires_on": "2026-04-30 03:43:05", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 139, + "created_on": "2026-01-29 23:42:13", + "modified_on": "2026-02-25 22:35:11", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc2.d-bis.org", + "domain_names": [ + "ws.rpc2.d-bis.org" + ], + "expires_on": "2026-04-30 03:43:58", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 140, + "created_on": "2026-01-29 23:43:09", + "modified_on": "2026-02-25 22:35:07", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "wss.defi-oracle.io", + "domain_names": [ + "wss.defi-oracle.io" + ], + "expires_on": "2026-04-30 03:44:57", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 62, + "created_on": "2026-01-16 16:57:41", + "modified_on": "2026-02-25 22:35:27", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.mim4u.org", + "domain_names": [ + "www.mim4u.org" + ], + "expires_on": "2026-04-16 20:59:17", + "meta": {} + }, + { + "id": 63, + "created_on": "2026-01-16 16:57:52", + "modified_on": "2026-02-25 22:35:24", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.phoenix.sankofa.nexus", + "domain_names": [ + "www.phoenix.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:59:28", + "meta": {} + }, + { + "id": 64, + "created_on": "2026-01-16 16:58:06", + "modified_on": "2026-02-25 22:35:21", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.sankofa.nexus", + "domain_names": [ + "www.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:59:41", + "meta": {} + } +] diff --git a/backups/npmplus/backup-20260301_030001/api/proxy_hosts.json b/backups/npmplus/backup-20260301_030001/api/proxy_hosts.json new file mode 100644 index 0000000..2d9eea3 --- /dev/null +++ b/backups/npmplus/backup-20260301_030001/api/proxy_hosts.json @@ -0,0 +1,1394 @@ +[ + { + "id": 37, + "created_on": "2026-02-07 00:42:23", + "modified_on": "2026-02-07 00:46:30", + "owner_user_id": 1, + "domain_names": [ + "cacti-alltra.d-bis.org" + ], + "forward_host": "192.168.11.177", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 146, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 38, + "created_on": "2026-02-07 00:42:24", + "modified_on": "2026-02-07 00:46:53", + "owner_user_id": 1, + "domain_names": [ + "cacti-hybx.d-bis.org" + ], + "forward_host": "192.168.11.251", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 147, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 41, + "created_on": "2026-02-07 20:41:16", + "modified_on": "2026-02-20 22:29:09", + "owner_user_id": 1, + "domain_names": [ + "codespaces.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 156, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 22, + "created_on": "2026-01-18 22:19:18", + "modified_on": "2026-01-29 22:52:50", + "owner_user_id": 1, + "domain_names": [ + "cross-all.defi-oracle.io" + ], + "forward_host": "192.168.11.211", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 134, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 49, + "created_on": "2026-02-20 22:27:16", + "modified_on": "2026-02-20 22:37:53", + "owner_user_id": 1, + "domain_names": [ + "dapp.d-bis.org" + ], + "forward_host": "192.168.11.58", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 162, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 13, + "created_on": "2026-01-16 14:41:02", + "modified_on": "2026-02-27 22:22:08", + "owner_user_id": 1, + "domain_names": [ + "dbis-admin.d-bis.org" + ], + "forward_host": "192.168.11.130", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 46, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 15, + "created_on": "2026-01-16 14:41:04", + "modified_on": "2026-02-27 22:38:58", + "owner_user_id": 1, + "domain_names": [ + "dbis-api-2.d-bis.org" + ], + "forward_host": "192.168.11.156", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 47, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 14, + "created_on": "2026-01-16 14:41:03", + "modified_on": "2026-02-27 22:31:12", + "owner_user_id": 1, + "domain_names": [ + "dbis-api.d-bis.org" + ], + "forward_host": "192.168.11.155", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 48, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 45, + "created_on": "2026-02-13 20:32:33", + "modified_on": "2026-02-13 20:32:33", + "owner_user_id": 1, + "domain_names": [ + "dbis.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3001, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 39, + "created_on": "2026-02-07 20:41:12", + "modified_on": "2026-02-20 22:29:57", + "owner_user_id": 1, + "domain_names": [ + "dev.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 157, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 8, + "created_on": "2026-01-16 14:40:58", + "modified_on": "2026-02-27 21:59:33", + "owner_user_id": 1, + "domain_names": [ + "explorer.d-bis.org" + ], + "forward_host": "192.168.11.140", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 145, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers (unsafe-eval for ethers.js v5)\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 30, + "created_on": "2026-01-31 00:13:09", + "modified_on": "2026-02-06 19:09:43", + "owner_user_id": 1, + "domain_names": [ + "explorer.defi-oracle.io" + ], + "forward_host": "192.168.11.140", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 144, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 40, + "created_on": "2026-02-07 20:41:14", + "modified_on": "2026-02-20 22:30:39", + "owner_user_id": 1, + "domain_names": [ + "gitea.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 158, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 46, + "created_on": "2026-02-13 20:32:35", + "modified_on": "2026-02-13 20:32:35", + "owner_user_id": 1, + "domain_names": [ + "iccc.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3002, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 17, + "created_on": "2026-01-16 14:41:05", + "modified_on": "2026-02-27 23:01:06", + "owner_user_id": 1, + "domain_names": [ + "mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 50, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 47, + "created_on": "2026-02-13 20:32:37", + "modified_on": "2026-02-13 20:32:37", + "owner_user_id": 1, + "domain_names": [ + "omnl.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3003, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 5, + "created_on": "2026-01-16 14:40:55", + "modified_on": "2026-01-16 17:01:49", + "owner_user_id": 1, + "domain_names": [ + "phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.50", + "forward_port": 4000, + "access_list_id": 0, + "certificate_id": 51, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 42, + "created_on": "2026-02-07 20:41:17", + "modified_on": "2026-02-20 22:31:27", + "owner_user_id": 1, + "domain_names": [ + "pve.ml110.d-bis.org" + ], + "forward_host": "192.168.11.10", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 159, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 43, + "created_on": "2026-02-07 20:41:19", + "modified_on": "2026-02-20 22:32:14", + "owner_user_id": 1, + "domain_names": [ + "pve.r630-01.d-bis.org" + ], + "forward_host": "192.168.11.11", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 160, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 44, + "created_on": "2026-02-07 20:41:21", + "modified_on": "2026-02-20 22:32:57", + "owner_user_id": 1, + "domain_names": [ + "pve.r630-02.d-bis.org" + ], + "forward_host": "192.168.11.12", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 161, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 32, + "created_on": "2026-02-07 00:42:16", + "modified_on": "2026-02-07 00:47:07", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra-2.d-bis.org" + ], + "forward_host": "192.168.11.173", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 148, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 33, + "created_on": "2026-02-07 00:42:17", + "modified_on": "2026-02-07 08:15:41", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "forward_host": "192.168.11.174", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 150, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 31, + "created_on": "2026-02-07 00:42:15", + "modified_on": "2026-02-07 08:15:53", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra.d-bis.org" + ], + "forward_host": "192.168.11.172", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 151, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 50, + "created_on": "2026-02-21 17:37:16", + "modified_on": "2026-02-27 22:06:10", + "owner_user_id": 1, + "domain_names": [ + "rpc-fireblocks.d-bis.org" + ], + "forward_host": "192.168.11.232", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 163, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 11, + "created_on": "2026-01-16 14:41:00", + "modified_on": "2026-02-27 22:00:20", + "owner_user_id": 1, + "domain_names": [ + "rpc-http-prv.d-bis.org" + ], + "forward_host": "192.168.11.211", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 52, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 9, + "created_on": "2026-01-16 14:40:59", + "modified_on": "2026-02-27 21:59:45", + "owner_user_id": 1, + "domain_names": [ + "rpc-http-pub.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 53, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 35, + "created_on": "2026-02-07 00:42:20", + "modified_on": "2026-02-07 08:16:06", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx-2.d-bis.org" + ], + "forward_host": "192.168.11.247", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 152, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 36, + "created_on": "2026-02-07 00:42:22", + "modified_on": "2026-02-07 08:16:19", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx-3.d-bis.org" + ], + "forward_host": "192.168.11.248", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 153, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 34, + "created_on": "2026-02-07 00:42:19", + "modified_on": "2026-02-07 08:16:32", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx.d-bis.org" + ], + "forward_host": "192.168.11.246", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 154, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 12, + "created_on": "2026-01-16 14:41:01", + "modified_on": "2026-02-27 22:01:09", + "owner_user_id": 1, + "domain_names": [ + "rpc-ws-prv.d-bis.org" + ], + "forward_host": "192.168.11.211", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 54, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 10, + "created_on": "2026-01-16 14:40:59", + "modified_on": "2026-02-27 21:59:54", + "owner_user_id": 1, + "domain_names": [ + "rpc-ws-pub.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 55, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 26, + "created_on": "2026-01-29 16:35:10", + "modified_on": "2026-02-27 22:02:33", + "owner_user_id": 1, + "domain_names": [ + "rpc.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 141, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\ndns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 24, + "created_on": "2026-01-29 15:38:44", + "modified_on": "2026-02-27 22:02:16", + "owner_user_id": 1, + "domain_names": [ + "rpc.defi-oracle.io" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 56, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 21, + "created_on": "2026-01-16 14:41:09", + "modified_on": "2026-02-27 22:01:44", + "owner_user_id": 1, + "domain_names": [ + "rpc.public-0138.defi-oracle.io" + ], + "forward_host": "192.168.11.240", + "forward_port": 443, + "access_list_id": 0, + "certificate_id": 56, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "https", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 27, + "created_on": "2026-01-29 16:35:11", + "modified_on": "2026-02-27 22:02:54", + "owner_user_id": 1, + "domain_names": [ + "rpc2.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 137, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 3, + "created_on": "2026-01-16 14:40:54", + "modified_on": "2026-01-16 17:01:32", + "owner_user_id": 1, + "domain_names": [ + "sankofa.nexus" + ], + "forward_host": "192.168.11.51", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 57, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "add_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 16, + "created_on": "2026-01-16 14:41:04", + "modified_on": "2026-02-27 23:00:35", + "owner_user_id": 1, + "domain_names": [ + "secure.d-bis.org" + ], + "forward_host": "192.168.11.130", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 58, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 19, + "created_on": "2026-01-16 14:41:07", + "modified_on": "2026-02-27 23:21:23", + "owner_user_id": 1, + "domain_names": [ + "secure.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 59, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 7, + "created_on": "2026-01-16 14:40:57", + "modified_on": "2026-01-16 17:02:09", + "owner_user_id": 1, + "domain_names": [ + "the-order.sankofa.nexus" + ], + "forward_host": "192.168.11.36", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 60, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 20, + "created_on": "2026-01-16 14:41:08", + "modified_on": "2026-02-27 23:45:49", + "owner_user_id": 1, + "domain_names": [ + "training.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 61, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 51, + "created_on": "2026-02-21 17:37:45", + "modified_on": "2026-02-27 22:15:51", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc-fireblocks.d-bis.org" + ], + "forward_host": "192.168.11.232", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 164, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 28, + "created_on": "2026-01-29 16:35:12", + "modified_on": "2026-02-27 22:03:07", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 138, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 29, + "created_on": "2026-01-29 16:35:12", + "modified_on": "2026-02-27 22:03:15", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc2.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 139, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 25, + "created_on": "2026-01-29 15:38:45", + "modified_on": "2026-02-27 22:02:24", + "owner_user_id": 1, + "domain_names": [ + "wss.defi-oracle.io" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 140, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 18, + "created_on": "2026-01-16 14:41:06", + "modified_on": "2026-02-27 23:06:52", + "owner_user_id": 1, + "domain_names": [ + "www.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 62, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 6, + "created_on": "2026-01-16 14:40:56", + "modified_on": "2026-01-16 17:02:17", + "owner_user_id": 1, + "domain_names": [ + "www.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.50", + "forward_port": 4000, + "access_list_id": 0, + "certificate_id": 63, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 4, + "created_on": "2026-01-16 14:40:55", + "modified_on": "2026-01-16 17:02:19", + "owner_user_id": 1, + "domain_names": [ + "www.sankofa.nexus" + ], + "forward_host": "192.168.11.51", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 64, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 48, + "created_on": "2026-02-13 20:32:39", + "modified_on": "2026-02-13 20:32:39", + "owner_user_id": 1, + "domain_names": [ + "xom.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3004, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + } +] diff --git a/backups/npmplus/backup-20260301_030001/certificates/cert_list.txt b/backups/npmplus/backup-20260301_030001/certificates/cert_list.txt new file mode 100644 index 0000000..e69de29 diff --git a/backups/npmplus/backup-20260301_030001/database/database.sql b/backups/npmplus/backup-20260301_030001/database/database.sql new file mode 100644 index 0000000..77149a3 --- /dev/null +++ b/backups/npmplus/backup-20260301_030001/database/database.sql @@ -0,0 +1 @@ +Database file not found diff --git a/backups/npmplus/backup-20260301_030001/database/database.sqlite b/backups/npmplus/backup-20260301_030001/database/database.sqlite new file mode 100644 index 0000000..e69de29 diff --git a/backups/npmplus/backup-20260301_030001/manifest.json b/backups/npmplus/backup-20260301_030001/manifest.json new file mode 100644 index 0000000..c0b9966 --- /dev/null +++ b/backups/npmplus/backup-20260301_030001/manifest.json @@ -0,0 +1,19 @@ +{ + "timestamp": "20260301_030001", + "backup_date": "2026-03-01T03:00:14-08:00", + "npmplus_vmid": "10233", + "npmplus_host": "192.168.11.11", + "npm_url": "https://192.168.11.167:81", + "backup_contents": { + "database": { + "sql_dump": "present", + "sqlite_file": "missing" + }, + "api_exports": { + "proxy_hosts": "present", + "certificates": "present", + "access_lists": "present" + }, + "certificate_files": "missing" + } +} diff --git a/backups/npmplus/backup-20260301_030001/volumes/volume_list.txt b/backups/npmplus/backup-20260301_030001/volumes/volume_list.txt new file mode 100644 index 0000000..4545150 --- /dev/null +++ b/backups/npmplus/backup-20260301_030001/volumes/volume_list.txt @@ -0,0 +1 @@ +DRIVER VOLUME NAME diff --git a/backups/npmplus/backup-20260302_030001.tar.gz b/backups/npmplus/backup-20260302_030001.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..d15fa4f5b9302fc3cfbfc622e902443b2e2f31a3 GIT binary patch literal 5438 zcmajgWmgmow+3LOK~j(o5u_P9rF%fSTLh$Q$f2brr6mTChLI3(=mufv?(U&u0O{BD zoF8!Z^<}U7>t1`^^s(3|{|(x)nPcJ-EGu{H_H{Q>?p6MEbODpUF8aJnb{%!TS`3rF z8yV1YKuDrcF+G3@3@}7?aI-D&Nu(>s?D`%J51BJler;~``+L@Qz9W(oU;^+cIqFrOv z7l8whu_IF}+t1R#W+6%5+o5Uk>Yg2Gf~IO@O8E|VSUgnrEplxIb4fGeeq?z}JVyrw zT8BOPL^Iz%9ZDgg#06f2leG;5<0H>uDvxWJ&ucPSgEzLp3;h_=_D{BJd6MyH55eDN zFCNP)tpJ$gfe%*nmK4uXcA=+Zl(74zFX3Bxi+%ua`hb52=zRA0cD)nv+dC_@ol4yB zJq@2MJXlO6CBCO0v4A!NLz}~)X$5`E8Jl8*uq}=v(VVKsKDd%3$ES-vT7bFh?;Zsp zQCfT|-C)G*Uu}Q&ZXoehw+NuNM(Q}eur=>9N9k}Lw7pKC1;5U|P|BW1B-oA2V|BbP z@_Mnj&b>`H(OS6Cq{7zgaps43q7u@Nq&vvWTDA7%m3md-wu5}K8%+k5tz}MiV#1c^ zMSN4@rU3hj_(PYQ9|FufdM>LQ~J1#vI%9)dlrO{2}GRkTJ&`;i6b>->_0IBU-A45!}_I4|q07yvB zTa}c6E9t{*O+`vUZ`Q=^A@_*r0I##Y11^}Gm~L-5G)9N;G-~Sb{v3j-LQ9w_k3iA% zlV|lx!Yd}|qr?5iEmLk~LV$5;^U=bgPymt~K&;JbpFiDTB0V@Aal&&&1y6nMjp{-O zz?D)QamA8Nk5STSi^Rs&1m596_fka6)NS3rCtd#WP((6n0JY_jM)S8)h8@!qKl7e_ zZC@jVlLJQDnWa*1DhU$|t$&FB{c}^&lPU3Li#KxZK@+78(LDf&n)aAWJ13*6b z33(rD>!9*WESfm_zgGUQdNZW55tfJ7?;kYjoZn*i6BD5y{9vHI-sh8+W01+u^?;8e z_dD(m^wW1mbsFw;_+tG?-=%y<7U~AF%Q2Vo9d+w^f6!Sdc4IeD(?pvo$0NMfY%JOM z^n>>+ST5`g2`LP*C7A(bIDFrNB}$^Uf_)))#EhKGpYjf7Kj_raQnq64NV}o>m*KnO z9+`_kl)fg+#4hOy;-_W{`8DO@Q#^Ow$ukdevY%8wGn1+sJqhBJBDsb-44)4kwcq(6 zCD*u>PkRc&L$9vHftO5KBkj2+mI2hOdr}hn*Mt?PXM4eSw>J&+lI{1^KBp!v4~J8w ztMo?3-*67)@ALCG@4DdG7iq@LflT~jhRU<|jPZqViQ_bKBLTL3U8;#6(=Bbx!0Id; z=vuw0?PHdsy;GGE%dQ(Gd7F5)A-Bh?G4m(uofJ;vvyNJGK#F)ylDTfe!N?k1jiRHz zB8Ms#!y9d}r7`hq+2u8Y|IY4VVM(d*_H}U0!|@#{dn2zzM9^_K?(Yq%2Jo$v-)PQ< z!kR|_;&1gGE>I=!oF!I)$6r_fwR3|jiJ+>H6ygH1skbFL+cday-82&V>oBW~DUgcuj##u$P_CQo@`s9|m(rv2!?Hix}-1H>3K$TBweP?2pwL)?N z;byUm5{1)}=nh!_k+O8~QSfV-lKYM^#Ybyu3rqiW zg^+8D*Jlp*(-4||X}NkbfuU8a?OZgUV*&hFl;7F1z1vzeF3U*d%(|zy=gL4mA+GfLV0`?c=qtc?2$Et{ID3U(4IR z3%5_HnrOjerX3C(8z_S66k4wWHM(Eo+j{Rr*zsl3biPM;mf+sof8DgJnLDwbRx=>w zn%e5g4h%==98i}FMI+v@yqr$i(${#ya)>@KT4&Lcd9UlM>@c`A@N0e7W2k5V zMFn#BnTgI7N(bNM{3+3BL1%gM(C#5J`s&?Qr`ou5b6!hlt&@IAo@WGC?Q z3rz@3E}`hhaxJZyi{;eqme5`1;8VOM_+ayr!Rr7>?9ovk=lBO>CB5}k8)Dx81W zTsEy5Tj_hCne_acVqDm{!-iJmFc0c^bm|T#OqOn+Sa~DMM`W%(_&JJCD+V}j=*%6P z>l9O-eGCqHd~uC6PfvTC_yETva(C{Fe^Edo=5~Dvu;0Od(cfli|2=?A;p<8%ccX_tG2vL& zUaYZ%4?(F91UBayw&^^^WNReF=yNUM_b+77x$s0U*Bd zdm%-25<~<_ctw)D|Hui7#M=rS#EtINSdqt#ZqY+FkF|w4N~cLBmT+i}t*so0B?brC z;x`ayoKwKOInAHSQXWn8U`efqzQs*BbI3 zI2d%k7h7jLPT|Z&E+NF{NLHX8+>J0-UwK8fHFm9hmVbk2ba&Tty`* zNB7u&9vB=ly05i;Yn$$Tp|G^b$K5?#J6cc_%@TTP-LFv}2&UtSnw>=7%F8yP^LS`M zCa#YDy|H|tFA4-xoPpAW7%tG1j2{QBUf3V8>vn90m6_UsR=B=07fp8#zTx1<^cE(~ zD0Ad$gLw*6T=A#{9SXMQO4K_EyJ59`|AA>VB(?yC<9hRfv0Js2$s$~r_ux%yiKO<1V8>5G-_0K_ z&8s|a#j2{a10F@do_;p*>OB!M=!06N_*}S=8NF`-)x4B|bx&Deh$aDBuPaF-YO zMW}$Sx4_=MRo4|-3^#Ff8)B4!bgF$>d|7(Qian$@<$D{U=^ol2OX<)GEs99BA$0Zxzkf|<7 z`M&zF3a|0E(2q?|XXE2ikRf2~tg$ z49Z=n-vb0}|9U^t?wA*~N7|htS`)C~*&^R`?A|V$scxxHzw{B7@@r{Ujq>z5grgJh zXOOPjYSfH`dsY7+ucZ#HhLII7Rb*of?j*z0*_o$TW#0x1p!3Ej)K$YABPJ`_d|f#s zaF)5iQ_Gv&*L5}%7_w6PM$L|hps`8Gt^pgG@20ISXi}D1qz7qH1`eT5*WdXf@Y9N- z#3u%yv*h$t;%8_a1ir%>86LrL-zrB7)y$gR%CSuER@~Vx6s!j~OgDu#-CTsCyQH&k z=Sy;C@DVML>0b$8ee|Ef!iE{7n9!P&GsOuK%eFA9_NElE*;{#x&O4tlFJOBx1o+OV zV#snukZQwL@4O=W*0I#f~6MMqo<=CE(NYZBk>Nylu8PA+RpF28!)jBd$BMTXA-9aeh#k{8`>`%JcO6)z34V6?)aFZb@hm73aQx1^a*BVvh!)x+~ zH!z14!9DQ6(RLBse$S&aaBN4`w>{%{hmG8u_Pat%xqeYNg?#R+F(yTz-v*k0YkIA; z#W{QuwjSuPGX($L*KBP6S*;wKML~s7ZU0^oo+hYD&IF#>NeZg3orB&NT)^bs=O^0P zAZqhv2gBZMoZQ_x*1r1i`zbgx4SEb^X*S$lz%U7+w@76%tMRCix?Z5K4BhTKh{#^C z{%mHCRb6Q;>B7&#Ui?G#hIU(Yq8@X;bel|xp9xwXL<8+T0QfveudHu_c7iewejKHDD^7{}T=N*DWU32| zf6E>X=Oc-{70qO@F-SG?v0E}Pe>K78{EIy)zZBM~NFlz<6rBbh;iVFHnNQSY7Kal= z$~Kv?NAU*y;;`BIYT#4+HI5+ytvf+$+HK|0G$@0wRk?^%Fuu)|yQoJ^n=@gWmO zj^z$YL}|^XnQ+dr6M_*V%a`O0!=$Ms0k$%Kw1DLg0(CDPVc>{jH%z!R$?|6)3-#CT z61!wveijjX_>l6=e(88Ir1jX(J%KrfILCb&u literal 0 HcmV?d00001 diff --git a/backups/npmplus/backup-20260302_030001/api/access_lists.json b/backups/npmplus/backup-20260302_030001/api/access_lists.json new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/backups/npmplus/backup-20260302_030001/api/access_lists.json @@ -0,0 +1 @@ +[] diff --git a/backups/npmplus/backup-20260302_030001/api/certificates.json b/backups/npmplus/backup-20260302_030001/api/certificates.json new file mode 100644 index 0000000..b5a02e3 --- /dev/null +++ b/backups/npmplus/backup-20260302_030001/api/certificates.json @@ -0,0 +1,698 @@ +[ + { + "id": 146, + "created_on": "2026-02-07 00:46:21", + "modified_on": "2026-02-25 22:34:54", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cacti-alltra.d-bis.org", + "domain_names": [ + "cacti-alltra.d-bis.org" + ], + "expires_on": "2026-05-08 04:47:55", + "meta": {} + }, + { + "id": 147, + "created_on": "2026-02-07 00:46:43", + "modified_on": "2026-02-25 22:34:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cacti-hybx.d-bis.org", + "domain_names": [ + "cacti-hybx.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:19", + "meta": {} + }, + { + "id": 155, + "created_on": "2026-02-20 22:27:52", + "modified_on": "2026-02-20 22:27:52", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "codespaces.d-bis.org", + "domain_names": [ + "codespaces.d-bis.org" + ], + "expires_on": "2026-02-20 22:27:52", + "meta": {} + }, + { + "id": 156, + "created_on": "2026-02-20 22:28:48", + "modified_on": "2026-02-25 22:34:21", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "codespaces.d-bis.org", + "domain_names": [ + "codespaces.d-bis.org" + ], + "expires_on": "2026-05-22 02:30:34", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n", + "letsencrypt_agree": true + } + }, + { + "id": 134, + "created_on": "2026-01-29 22:52:44", + "modified_on": "2026-02-25 22:35:17", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "cross-all.defi-oracle.io", + "domain_names": [ + "cross-all.defi-oracle.io" + ], + "expires_on": "2026-04-30 02:54:15", + "meta": {} + }, + { + "id": 162, + "created_on": "2026-02-20 22:36:34", + "modified_on": "2026-02-25 22:36:08", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dapp.d-bis.org", + "domain_names": [ + "dapp.d-bis.org" + ], + "expires_on": "2026-05-22 02:38:20", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 46, + "created_on": "2026-01-16 16:54:36", + "modified_on": "2026-02-25 22:36:19", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-admin.d-bis.org", + "domain_names": [ + "dbis-admin.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:11", + "meta": {} + }, + { + "id": 47, + "created_on": "2026-01-16 16:54:47", + "modified_on": "2026-02-25 22:36:01", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-api-2.d-bis.org", + "domain_names": [ + "dbis-api-2.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:22", + "meta": {} + }, + { + "id": 48, + "created_on": "2026-01-16 16:54:58", + "modified_on": "2026-02-25 22:35:59", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis-api.d-bis.org", + "domain_names": [ + "dbis-api.d-bis.org" + ], + "expires_on": "2026-04-16 20:56:33", + "meta": {} + }, + { + "id": 165, + "created_on": "2026-03-01 15:17:51", + "modified_on": "2026-03-01 15:18:11", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dbis.xom-dev.phoenix.sankofa.nexus", + "domain_names": [ + "dbis.xom-dev.phoenix.sankofa.nexus" + ], + "expires_on": "2026-05-30 19:19:36", + "meta": {} + }, + { + "id": 157, + "created_on": "2026-02-20 22:29:37", + "modified_on": "2026-02-25 22:34:16", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "dev.d-bis.org", + "domain_names": [ + "dev.d-bis.org" + ], + "expires_on": "2026-05-22 02:31:22", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 145, + "created_on": "2026-02-06 19:14:04", + "modified_on": "2026-02-25 22:34:59", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "explorer.d-bis.org", + "domain_names": [ + "explorer.d-bis.org" + ], + "expires_on": "2026-05-07 23:15:36", + "meta": { + "letsencrypt_agree": true, + "dns_challenge": true, + "nginx_online": true, + "nginx_err": null, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0" + } + }, + { + "id": 144, + "created_on": "2026-02-06 19:05:50", + "modified_on": "2026-02-25 22:35:01", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "explorer.defi-oracle.io", + "domain_names": [ + "explorer.defi-oracle.io" + ], + "expires_on": "2026-05-07 23:07:35", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 158, + "created_on": "2026-02-20 22:30:18", + "modified_on": "2026-02-25 22:34:14", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "gitea.d-bis.org", + "domain_names": [ + "gitea.d-bis.org" + ], + "expires_on": "2026-05-22 02:32:04", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 50, + "created_on": "2026-01-16 16:55:25", + "modified_on": "2026-02-25 22:35:55", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "mim4u.org", + "domain_names": [ + "mim4u.org" + ], + "expires_on": "2026-04-16 20:57:01", + "meta": {} + }, + { + "id": 51, + "created_on": "2026-01-16 16:55:37", + "modified_on": "2026-02-25 22:35:53", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "phoenix.sankofa.nexus", + "domain_names": [ + "phoenix.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:57:08", + "meta": {} + }, + { + "id": 159, + "created_on": "2026-02-20 22:31:08", + "modified_on": "2026-02-25 22:34:12", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.ml110.d-bis.org", + "domain_names": [ + "pve.ml110.d-bis.org" + ], + "expires_on": "2026-05-22 02:32:54", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 160, + "created_on": "2026-02-20 22:31:51", + "modified_on": "2026-02-25 22:34:08", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.r630-01.d-bis.org", + "domain_names": [ + "pve.r630-01.d-bis.org" + ], + "expires_on": "2026-05-22 02:33:37", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 161, + "created_on": "2026-02-20 22:32:35", + "modified_on": "2026-02-25 22:34:08", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "pve.r630-02.d-bis.org", + "domain_names": [ + "pve.r630-02.d-bis.org" + ], + "expires_on": "2026-05-22 02:34:21", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 148, + "created_on": "2026-02-07 00:46:56", + "modified_on": "2026-02-25 22:34:47", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-2.d-bis.org", + "domain_names": [ + "rpc-alltra-2.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:31", + "meta": {} + }, + { + "id": 149, + "created_on": "2026-02-07 00:47:10", + "modified_on": "2026-02-25 22:34:45", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-3.d-bis.org", + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "expires_on": "2026-05-08 04:48:46", + "meta": {} + }, + { + "id": 150, + "created_on": "2026-02-07 08:15:35", + "modified_on": "2026-02-25 22:34:42", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra-3.d-bis.org", + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:06", + "meta": {} + }, + { + "id": 151, + "created_on": "2026-02-07 08:15:43", + "modified_on": "2026-02-25 22:34:36", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-alltra.d-bis.org", + "domain_names": [ + "rpc-alltra.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:18", + "meta": {} + }, + { + "id": 163, + "created_on": "2026-02-21 17:45:18", + "modified_on": "2026-02-25 22:36:29", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-fireblocks.d-bis.org", + "domain_names": [ + "rpc-fireblocks.d-bis.org" + ], + "expires_on": "2026-05-22 21:47:15", + "meta": {} + }, + { + "id": 52, + "created_on": "2026-01-16 16:55:45", + "modified_on": "2026-02-25 22:35:50", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-http-prv.d-bis.org", + "domain_names": [ + "rpc-http-prv.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:20", + "meta": {} + }, + { + "id": 53, + "created_on": "2026-01-16 16:55:57", + "modified_on": "2026-02-25 22:35:46", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-http-pub.d-bis.org", + "domain_names": [ + "rpc-http-pub.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:30", + "meta": {} + }, + { + "id": 152, + "created_on": "2026-02-07 08:15:56", + "modified_on": "2026-02-25 22:34:30", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx-2.d-bis.org", + "domain_names": [ + "rpc-hybx-2.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:31", + "meta": {} + }, + { + "id": 153, + "created_on": "2026-02-07 08:16:09", + "modified_on": "2026-02-25 22:34:27", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx-3.d-bis.org", + "domain_names": [ + "rpc-hybx-3.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:45", + "meta": {} + }, + { + "id": 154, + "created_on": "2026-02-07 08:16:22", + "modified_on": "2026-02-25 22:34:24", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-hybx.d-bis.org", + "domain_names": [ + "rpc-hybx.d-bis.org" + ], + "expires_on": "2026-05-08 12:17:58", + "meta": {} + }, + { + "id": 54, + "created_on": "2026-01-16 16:56:06", + "modified_on": "2026-02-25 22:35:44", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-ws-prv.d-bis.org", + "domain_names": [ + "rpc-ws-prv.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:38", + "meta": {} + }, + { + "id": 55, + "created_on": "2026-01-16 16:56:16", + "modified_on": "2026-02-25 22:35:42", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc-ws-pub.d-bis.org", + "domain_names": [ + "rpc-ws-pub.d-bis.org" + ], + "expires_on": "2026-04-16 20:57:51", + "meta": {} + }, + { + "id": 141, + "created_on": "2026-01-30 09:33:59", + "modified_on": "2026-02-25 22:35:04", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc.d-bis.org", + "domain_names": [ + "rpc.d-bis.org" + ], + "expires_on": "2026-04-30 13:35:45", + "meta": { + "letsencrypt_agree": true, + "dns_challenge": true, + "nginx_online": false, + "nginx_err": "nginx: [emerg] cannot load certificate \"/data/tls/certbot/live/npm-135/fullchain.pem\": BIO_new_file() failed (SSL: error:80000002:system library::No such file or directory:calling fopen(/data/tls/certbot/live/npm-135/fullchain.pem, r) error:10000080:BIO routines::no such file)\nnginx: configuration file /usr/local/nginx/conf/nginx.conf test failed", + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\ndns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0" + } + }, + { + "id": 56, + "created_on": "2026-01-16 16:56:30", + "modified_on": "2026-02-25 22:35:40", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc.public-0138.defi-oracle.io", + "domain_names": [ + "rpc.public-0138.defi-oracle.io" + ], + "expires_on": "2026-04-16 20:58:05", + "meta": {} + }, + { + "id": 137, + "created_on": "2026-01-29 23:39:01", + "modified_on": "2026-02-25 22:35:14", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "rpc2.d-bis.org", + "domain_names": [ + "rpc2.d-bis.org" + ], + "expires_on": "2026-04-30 03:40:50", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 57, + "created_on": "2026-01-16 16:56:41", + "modified_on": "2026-02-25 22:35:37", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "sankofa.nexus", + "domain_names": [ + "sankofa.nexus" + ], + "expires_on": "2026-04-16 20:58:17", + "meta": {} + }, + { + "id": 58, + "created_on": "2026-01-16 16:56:53", + "modified_on": "2026-02-25 22:35:34", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "secure.d-bis.org", + "domain_names": [ + "secure.d-bis.org" + ], + "expires_on": "2026-04-16 20:58:28", + "meta": {} + }, + { + "id": 59, + "created_on": "2026-01-16 16:57:05", + "modified_on": "2026-02-25 22:35:31", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "secure.mim4u.org", + "domain_names": [ + "secure.mim4u.org" + ], + "expires_on": "2026-04-16 20:58:40", + "meta": {} + }, + { + "id": 60, + "created_on": "2026-01-16 16:57:17", + "modified_on": "2026-02-25 22:35:29", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "the-order.sankofa.nexus", + "domain_names": [ + "the-order.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:58:53", + "meta": {} + }, + { + "id": 61, + "created_on": "2026-01-16 16:57:31", + "modified_on": "2026-02-25 22:35:28", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "training.mim4u.org", + "domain_names": [ + "training.mim4u.org" + ], + "expires_on": "2026-04-16 20:59:06", + "meta": {} + }, + { + "id": 164, + "created_on": "2026-02-21 17:46:22", + "modified_on": "2026-02-25 22:36:11", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc-fireblocks.d-bis.org", + "domain_names": [ + "ws.rpc-fireblocks.d-bis.org" + ], + "expires_on": "2026-05-22 21:48:21", + "meta": {} + }, + { + "id": 138, + "created_on": "2026-01-29 23:41:20", + "modified_on": "2026-02-25 22:35:13", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc.d-bis.org", + "domain_names": [ + "ws.rpc.d-bis.org" + ], + "expires_on": "2026-04-30 03:43:05", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 139, + "created_on": "2026-01-29 23:42:13", + "modified_on": "2026-02-25 22:35:11", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "ws.rpc2.d-bis.org", + "domain_names": [ + "ws.rpc2.d-bis.org" + ], + "expires_on": "2026-04-30 03:43:58", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 140, + "created_on": "2026-01-29 23:43:09", + "modified_on": "2026-02-25 22:35:07", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "wss.defi-oracle.io", + "domain_names": [ + "wss.defi-oracle.io" + ], + "expires_on": "2026-04-30 03:44:57", + "meta": { + "nginx_online": true, + "nginx_err": null, + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true + } + }, + { + "id": 62, + "created_on": "2026-01-16 16:57:41", + "modified_on": "2026-02-25 22:35:27", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.mim4u.org", + "domain_names": [ + "www.mim4u.org" + ], + "expires_on": "2026-04-16 20:59:17", + "meta": {} + }, + { + "id": 63, + "created_on": "2026-01-16 16:57:52", + "modified_on": "2026-02-25 22:35:24", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.phoenix.sankofa.nexus", + "domain_names": [ + "www.phoenix.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:59:28", + "meta": {} + }, + { + "id": 64, + "created_on": "2026-01-16 16:58:06", + "modified_on": "2026-02-25 22:35:21", + "owner_user_id": 1, + "provider": "letsencrypt", + "nice_name": "www.sankofa.nexus", + "domain_names": [ + "www.sankofa.nexus" + ], + "expires_on": "2026-04-16 20:59:41", + "meta": {} + } +] diff --git a/backups/npmplus/backup-20260302_030001/api/proxy_hosts.json b/backups/npmplus/backup-20260302_030001/api/proxy_hosts.json new file mode 100644 index 0000000..96de0fa --- /dev/null +++ b/backups/npmplus/backup-20260302_030001/api/proxy_hosts.json @@ -0,0 +1,1425 @@ +[ + { + "id": 37, + "created_on": "2026-02-07 00:42:23", + "modified_on": "2026-02-07 00:46:30", + "owner_user_id": 1, + "domain_names": [ + "cacti-alltra.d-bis.org" + ], + "forward_host": "192.168.11.177", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 146, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 38, + "created_on": "2026-02-07 00:42:24", + "modified_on": "2026-02-07 00:46:53", + "owner_user_id": 1, + "domain_names": [ + "cacti-hybx.d-bis.org" + ], + "forward_host": "192.168.11.251", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 147, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 41, + "created_on": "2026-02-07 20:41:16", + "modified_on": "2026-02-20 22:29:09", + "owner_user_id": 1, + "domain_names": [ + "codespaces.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 156, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 22, + "created_on": "2026-01-18 22:19:18", + "modified_on": "2026-01-29 22:52:50", + "owner_user_id": 1, + "domain_names": [ + "cross-all.defi-oracle.io" + ], + "forward_host": "192.168.11.211", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 134, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 49, + "created_on": "2026-02-20 22:27:16", + "modified_on": "2026-02-20 22:37:53", + "owner_user_id": 1, + "domain_names": [ + "dapp.d-bis.org" + ], + "forward_host": "192.168.11.58", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 162, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 13, + "created_on": "2026-01-16 14:41:02", + "modified_on": "2026-02-27 22:22:08", + "owner_user_id": 1, + "domain_names": [ + "dbis-admin.d-bis.org" + ], + "forward_host": "192.168.11.130", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 46, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 15, + "created_on": "2026-01-16 14:41:04", + "modified_on": "2026-02-27 22:38:58", + "owner_user_id": 1, + "domain_names": [ + "dbis-api-2.d-bis.org" + ], + "forward_host": "192.168.11.156", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 47, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 14, + "created_on": "2026-01-16 14:41:03", + "modified_on": "2026-02-27 22:31:12", + "owner_user_id": 1, + "domain_names": [ + "dbis-api.d-bis.org" + ], + "forward_host": "192.168.11.155", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 48, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 45, + "created_on": "2026-02-13 20:32:33", + "modified_on": "2026-03-01 15:18:46", + "owner_user_id": 1, + "domain_names": [ + "dbis.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3001, + "access_list_id": 0, + "certificate_id": 165, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 39, + "created_on": "2026-02-07 20:41:12", + "modified_on": "2026-02-20 22:29:57", + "owner_user_id": 1, + "domain_names": [ + "dev.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 157, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 8, + "created_on": "2026-01-16 14:40:58", + "modified_on": "2026-02-27 21:59:33", + "owner_user_id": 1, + "domain_names": [ + "explorer.d-bis.org" + ], + "forward_host": "192.168.11.140", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 145, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers (unsafe-eval for ethers.js v5)\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 30, + "created_on": "2026-01-31 00:13:09", + "modified_on": "2026-02-06 19:09:43", + "owner_user_id": 1, + "domain_names": [ + "explorer.defi-oracle.io" + ], + "forward_host": "192.168.11.140", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 144, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 40, + "created_on": "2026-02-07 20:41:14", + "modified_on": "2026-02-20 22:30:39", + "owner_user_id": 1, + "domain_names": [ + "gitea.d-bis.org" + ], + "forward_host": "192.168.11.60", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 158, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 46, + "created_on": "2026-02-13 20:32:35", + "modified_on": "2026-02-13 20:32:35", + "owner_user_id": 1, + "domain_names": [ + "iccc.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3002, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 17, + "created_on": "2026-01-16 14:41:05", + "modified_on": "2026-02-27 23:01:06", + "owner_user_id": 1, + "domain_names": [ + "mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 50, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 47, + "created_on": "2026-02-13 20:32:37", + "modified_on": "2026-02-13 20:32:37", + "owner_user_id": 1, + "domain_names": [ + "omnl.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3003, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 5, + "created_on": "2026-01-16 14:40:55", + "modified_on": "2026-01-16 17:01:49", + "owner_user_id": 1, + "domain_names": [ + "phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.50", + "forward_port": 4000, + "access_list_id": 0, + "certificate_id": 51, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 42, + "created_on": "2026-02-07 20:41:17", + "modified_on": "2026-02-20 22:31:27", + "owner_user_id": 1, + "domain_names": [ + "pve.ml110.d-bis.org" + ], + "forward_host": "192.168.11.10", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 159, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 43, + "created_on": "2026-02-07 20:41:19", + "modified_on": "2026-02-20 22:32:14", + "owner_user_id": 1, + "domain_names": [ + "pve.r630-01.d-bis.org" + ], + "forward_host": "192.168.11.11", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 160, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 44, + "created_on": "2026-02-07 20:41:21", + "modified_on": "2026-02-20 22:32:57", + "owner_user_id": 1, + "domain_names": [ + "pve.r630-02.d-bis.org" + ], + "forward_host": "192.168.11.12", + "forward_port": 8006, + "access_list_id": 0, + "certificate_id": 161, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\n#dns_cloudflare_api_token=65d8f07ebb3f0454fdc4e854b6ada13fba0f0\r\n# OR Cloudflare API credentials\r\ndns_cloudflare_email=pandoramannli@gmail.com\r\ndns_cloudflare_api_key=65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 32, + "created_on": "2026-02-07 00:42:16", + "modified_on": "2026-02-07 00:47:07", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra-2.d-bis.org" + ], + "forward_host": "192.168.11.173", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 148, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 33, + "created_on": "2026-02-07 00:42:17", + "modified_on": "2026-02-07 08:15:41", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra-3.d-bis.org" + ], + "forward_host": "192.168.11.174", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 150, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 31, + "created_on": "2026-02-07 00:42:15", + "modified_on": "2026-02-07 08:15:53", + "owner_user_id": 1, + "domain_names": [ + "rpc-alltra.d-bis.org" + ], + "forward_host": "192.168.11.172", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 151, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 50, + "created_on": "2026-02-21 17:37:16", + "modified_on": "2026-02-27 22:06:10", + "owner_user_id": 1, + "domain_names": [ + "rpc-fireblocks.d-bis.org" + ], + "forward_host": "192.168.11.232", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 163, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 11, + "created_on": "2026-01-16 14:41:00", + "modified_on": "2026-02-27 22:00:20", + "owner_user_id": 1, + "domain_names": [ + "rpc-http-prv.d-bis.org" + ], + "forward_host": "192.168.11.211", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 52, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 9, + "created_on": "2026-01-16 14:40:59", + "modified_on": "2026-02-27 21:59:45", + "owner_user_id": 1, + "domain_names": [ + "rpc-http-pub.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 53, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 35, + "created_on": "2026-02-07 00:42:20", + "modified_on": "2026-02-07 08:16:06", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx-2.d-bis.org" + ], + "forward_host": "192.168.11.247", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 152, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 36, + "created_on": "2026-02-07 00:42:22", + "modified_on": "2026-02-07 08:16:19", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx-3.d-bis.org" + ], + "forward_host": "192.168.11.248", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 153, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 34, + "created_on": "2026-02-07 00:42:19", + "modified_on": "2026-02-07 08:16:32", + "owner_user_id": 1, + "domain_names": [ + "rpc-hybx.d-bis.org" + ], + "forward_host": "192.168.11.246", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 154, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 12, + "created_on": "2026-01-16 14:41:01", + "modified_on": "2026-02-27 22:01:09", + "owner_user_id": 1, + "domain_names": [ + "rpc-ws-prv.d-bis.org" + ], + "forward_host": "192.168.11.211", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 54, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 10, + "created_on": "2026-01-16 14:40:59", + "modified_on": "2026-02-27 21:59:54", + "owner_user_id": 1, + "domain_names": [ + "rpc-ws-pub.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 55, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 26, + "created_on": "2026-01-29 16:35:10", + "modified_on": "2026-02-27 22:02:33", + "owner_user_id": 1, + "domain_names": [ + "rpc.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 141, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "# Cloudflare API token\r\ndns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 24, + "created_on": "2026-01-29 15:38:44", + "modified_on": "2026-02-27 22:02:16", + "owner_user_id": 1, + "domain_names": [ + "rpc.defi-oracle.io" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 56, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 21, + "created_on": "2026-01-16 14:41:09", + "modified_on": "2026-02-27 22:01:44", + "owner_user_id": 1, + "domain_names": [ + "rpc.public-0138.defi-oracle.io" + ], + "forward_host": "192.168.11.240", + "forward_port": 443, + "access_list_id": 0, + "certificate_id": 56, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "https", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 27, + "created_on": "2026-01-29 16:35:11", + "modified_on": "2026-02-27 22:02:54", + "owner_user_id": 1, + "domain_names": [ + "rpc2.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8545, + "access_list_id": 0, + "certificate_id": 137, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 3, + "created_on": "2026-01-16 14:40:54", + "modified_on": "2026-01-16 17:01:32", + "owner_user_id": 1, + "domain_names": [ + "sankofa.nexus" + ], + "forward_host": "192.168.11.51", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 57, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "add_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 16, + "created_on": "2026-01-16 14:41:04", + "modified_on": "2026-02-27 23:00:35", + "owner_user_id": 1, + "domain_names": [ + "secure.d-bis.org" + ], + "forward_host": "192.168.11.130", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 58, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 19, + "created_on": "2026-01-16 14:41:07", + "modified_on": "2026-02-27 23:21:23", + "owner_user_id": 1, + "domain_names": [ + "secure.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 59, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 52, + "created_on": "2026-03-01 15:16:30", + "modified_on": "2026-03-01 15:16:39", + "owner_user_id": 1, + "domain_names": [ + "studio.sankofa.nexus" + ], + "forward_host": "192.168.11.72", + "forward_port": 8000, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 7, + "created_on": "2026-01-16 14:40:57", + "modified_on": "2026-01-16 17:02:09", + "owner_user_id": 1, + "domain_names": [ + "the-order.sankofa.nexus" + ], + "forward_host": "192.168.11.36", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 60, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 20, + "created_on": "2026-01-16 14:41:08", + "modified_on": "2026-02-27 23:45:49", + "owner_user_id": 1, + "domain_names": [ + "training.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 61, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\r\nadd_header X-Content-Type-Options \"nosniff\" always;\r\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\r\nadd_header X-XSS-Protection \"1; mode=block\" always;\r\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\r\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\r\n\r\n# Ensure proper DOCTYPE (if backend doesn't provide it)\r\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "letsencrypt_agree": false, + "dns_challenge": false, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 51, + "created_on": "2026-02-21 17:37:45", + "modified_on": "2026-02-27 22:15:51", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc-fireblocks.d-bis.org" + ], + "forward_host": "192.168.11.232", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 164, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 28, + "created_on": "2026-01-29 16:35:12", + "modified_on": "2026-02-27 22:03:07", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 138, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 29, + "created_on": "2026-01-29 16:35:12", + "modified_on": "2026-02-27 22:03:15", + "owner_user_id": 1, + "domain_names": [ + "ws.rpc2.d-bis.org" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 139, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 25, + "created_on": "2026-01-29 15:38:45", + "modified_on": "2026-02-27 22:02:24", + "owner_user_id": 1, + "domain_names": [ + "wss.defi-oracle.io" + ], + "forward_host": "192.168.11.221", + "forward_port": 8546, + "access_list_id": 0, + "certificate_id": 140, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": { + "dns_challenge": true, + "dns_provider": "cloudflare", + "dns_provider_credentials": "dns_cloudflare_email = pandoramannli@gmail.com\r\ndns_cloudflare_api_key = 65d8f07ebb3f0454fdc4e854b6ada13fba0f0", + "letsencrypt_agree": true, + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": true, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": [], + "hsts_enabled": false, + "hsts_subdomains": false + }, + { + "id": 18, + "created_on": "2026-01-16 14:41:06", + "modified_on": "2026-02-27 23:06:52", + "owner_user_id": 1, + "domain_names": [ + "www.mim4u.org" + ], + "forward_host": "192.168.11.37", + "forward_port": 80, + "access_list_id": 0, + "certificate_id": 62, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": true, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 6, + "created_on": "2026-01-16 14:40:56", + "modified_on": "2026-01-16 17:02:17", + "owner_user_id": 1, + "domain_names": [ + "www.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.50", + "forward_port": 4000, + "access_list_id": 0, + "certificate_id": 63, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 4, + "created_on": "2026-01-16 14:40:55", + "modified_on": "2026-01-16 17:02:19", + "owner_user_id": 1, + "domain_names": [ + "www.sankofa.nexus" + ], + "forward_host": "192.168.11.51", + "forward_port": 3000, + "access_list_id": 0, + "certificate_id": 64, + "ssl_forced": true, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "# Security Headers\nadd_header X-Content-Type-Options \"nosniff\" always;\nadd_header X-Frame-Options \"SAMEORIGIN\" always;\nadd_header X-XSS-Protection \"1; mode=block\" always;\nadd_header Referrer-Policy \"strict-origin-when-cross-origin\" always;\nadd_header Content-Security-Policy \"default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https: data:; style-src 'self' 'unsafe-inline' https: data:; font-src 'self' https: data:; img-src 'self' data: https: blob:; connect-src 'self' https: wss: ws:; media-src 'self' https: data:; object-src 'none'; base-uri 'self'; form-action 'self' https:; frame-ancestors 'none'; upgrade-insecure-requests\" always;\n\n# Ensure proper DOCTYPE (if backend doesn't provide it)\n# Note: This requires backend to send proper DOCTYPE, Nginx can't modify HTML body easily", + "meta": { + "nginx_online": true, + "nginx_err": null + }, + "allow_websocket_upgrade": false, + "http2_support": true, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": true, + "hsts_subdomains": true + }, + { + "id": 48, + "created_on": "2026-02-13 20:32:39", + "modified_on": "2026-02-13 20:32:39", + "owner_user_id": 1, + "domain_names": [ + "xom.xom-dev.phoenix.sankofa.nexus" + ], + "forward_host": "192.168.11.54", + "forward_port": 3004, + "access_list_id": 0, + "certificate_id": 0, + "ssl_forced": false, + "caching_enabled": false, + "block_exploits": false, + "advanced_config": "", + "meta": {}, + "allow_websocket_upgrade": false, + "http2_support": false, + "forward_scheme": "http", + "enabled": true, + "locations": null, + "hsts_enabled": false, + "hsts_subdomains": false + } +] diff --git a/backups/npmplus/backup-20260302_030001/certificates/cert_list.txt b/backups/npmplus/backup-20260302_030001/certificates/cert_list.txt new file mode 100644 index 0000000..e69de29 diff --git a/backups/npmplus/backup-20260302_030001/database/database.sql b/backups/npmplus/backup-20260302_030001/database/database.sql new file mode 100644 index 0000000..77149a3 --- /dev/null +++ b/backups/npmplus/backup-20260302_030001/database/database.sql @@ -0,0 +1 @@ +Database file not found diff --git a/backups/npmplus/backup-20260302_030001/database/database.sqlite b/backups/npmplus/backup-20260302_030001/database/database.sqlite new file mode 100644 index 0000000..e69de29 diff --git a/backups/npmplus/backup-20260302_030001/manifest.json b/backups/npmplus/backup-20260302_030001/manifest.json new file mode 100644 index 0000000..843b67b --- /dev/null +++ b/backups/npmplus/backup-20260302_030001/manifest.json @@ -0,0 +1,19 @@ +{ + "timestamp": "20260302_030001", + "backup_date": "2026-03-02T03:00:15-08:00", + "npmplus_vmid": "10233", + "npmplus_host": "192.168.11.11", + "npm_url": "https://192.168.11.167:81", + "backup_contents": { + "database": { + "sql_dump": "present", + "sqlite_file": "missing" + }, + "api_exports": { + "proxy_hosts": "present", + "certificates": "present", + "access_lists": "present" + }, + "certificate_files": "missing" + } +} diff --git a/backups/npmplus/backup-20260302_030001/volumes/volume_list.txt b/backups/npmplus/backup-20260302_030001/volumes/volume_list.txt new file mode 100644 index 0000000..4545150 --- /dev/null +++ b/backups/npmplus/backup-20260302_030001/volumes/volume_list.txt @@ -0,0 +1 @@ +DRIVER VOLUME NAME diff --git a/config/ip-addresses.conf b/config/ip-addresses.conf index aab8f9b..fbe0c9f 100644 --- a/config/ip-addresses.conf +++ b/config/ip-addresses.conf @@ -86,6 +86,8 @@ IP_OMADA="192.168.11.20" IP_MIM_WEB="192.168.11.37" # MIM4U API backend (VMID 7811) — used by nginx on 7810 for /api/ proxy MIM_API_IP="192.168.11.36" +# MIM4U web root (VMID 7810 nginx); optional override, default /var/www/html +MIM_WEB_ROOT="${MIM_WEB_ROOT:-/var/www/html}" DB_HOST="192.168.11.53" IP_NPMPLUS_ETH0="192.168.11.166" # NPMplus Alltra/HYBX (VMID 10235) - see docs/04-configuration/NPMPLUS_ALLTRA_HYBX_MASTER_PLAN.md @@ -155,6 +157,11 @@ IP_DAPP_LXC="192.168.11.58" # Gov Portals dev (VMID 7804) — DBIS, ICCC, OMNL, XOM at *.xom-dev.phoenix.sankofa.nexus IP_GOV_PORTALS_DEV="192.168.11.54" +# Sankofa Studio (VMID 7805) — FusionAI Creator / Phoenix Marketplace SaaS at studio.sankofa.nexus +# Note: 192.168.11.55 is used by VMID 10230 (order-vault); .72 chosen to avoid conflict. +IP_SANKOFA_STUDIO="192.168.11.72" +SANKOFA_STUDIO_VMID="${SANKOFA_STUDIO_VMID:-7805}" + # Fourth NPMplus (dev/Codespaces) — tunnel + Proxmox admin. Public 76.53.10.40. See docs/04-configuration/DEV_CODESPACES_76_53_10_40.md IP_NPMPLUS_FOURTH="192.168.11.170" PUBLIC_IP_NPMPLUS_FOURTH="76.53.10.40" diff --git a/config/smart-contracts-master.json b/config/smart-contracts-master.json deleted file mode 100644 index ab259b8..0000000 --- a/config/smart-contracts-master.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "description": "Master list of smart contract addresses for Chain 138 and related chains. Single source of truth; safe to publish (no secrets). Code and .env can override per-environment.", - "version": "1.0.0", - "updated": "2026-02-16", - "chains": { - "138": { - "name": "SMOM-DBIS-138", - "chainId": 138, - "mapper": "0xe48E3f248698610e18Db865457fcd935Bb3da856", - "contracts": { - "WETH9": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - "WETH10": "0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f", - "Multicall": "0x99b3511a2d315a497c8112c1fdd8d508d4b1e506", - "Oracle_Aggregator": "0x452a4701d01c0Ff3ED0C547a5adF0659eb4a3ef7", - "Oracle_Proxy": "0x404DcD22f82C734361256B441DAAa8DE654CE191", - "CCIP_Router": "0x8078A09637e47Fa5Ed34F626046Ea2094a5CDE5e", - "CCIP_Sender": "0x105F8A15b819948a89153505762444Ee9f324684", - "CCIP_Receiver": "0xC12236C03b28e675d376774FCE2C2C052488430F", - "CCIPWETH9_Bridge": "0x971cD9D156f193df8051E48043C476e53ECd4693", - "CCIPWETH10_Bridge": "0xe0E93247376aa097dB308B92e6Ba36bA015535D0", - "LINK_Token": "0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03", - "CCIP_Fee_Token": "0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03", - "Compliant_USDT": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", - "Compliant_USDC": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", - "Token_Registry": "0x91Efe92229dbf7C5B38D422621300956B55870Fa", - "Token_Factory": "0xb5273722e0a745Ab21c36C6250494DB92a075D44", - "Compliance_Registry": "0xab9EB8f7d6bB9A38468C0980D6C3AD8242b48013", - "Bridge_Vault": "0x389bA4d4175BC9662ED73e6974795b6873874d0D", - "Fee_Collector": "0xF78246eB94c6CB14018E507E60661314E5f4C53f", - "Debt_Registry": "0x9d729C8888fB0c2a4d4245c3C27B5b2Ab014D775", - "Policy_Manager": "0x7CA84B0f4Ea863D6E8D6eE901f08Fd00Aec5Cb3C", - "Token_Implementation": "0x71f7cD8b278A57536723CeddA6A5B77EE477ec2b", - "Merchant_Settlement_Registry": "0x16D9A2cB94A0b92721D93db4A6Cd8023D3338800", - "Settlement_Registry": "0x16D9A2cB94A0b92721D93db4A6Cd8023D3338800", - "Withdrawal_Escrow": "0xe77cb26eA300e2f5304b461b0EC94c8AD6A7E46D", - "Universal_Asset_Registry": "0xAEE4b7fBe82E1F8295951584CBc772b8BBD68575", - "Governance_Controller": "0xA6891D5229f2181a34D4FF1B515c3Aa37dd90E0e", - "Universal_CCIP_Bridge": "0xCd42e8eD79Dc50599535d1de48d3dAFa0BE156F8", - "Bridge_Orchestrator": "0x89aB428c437f23bAB9781ff8Db8D3848e27EeD6c", - "Payment_Channel_Manager": "0x302aF72966aFd21C599051277a48DAa7f01a5f54", - "Generic_State_Channel_Manager": "0xe5e3bB424c8a0259FDE23F0A58F7e36f73B90aBd", - "Address_Mapper": "0xe48E3f248698610e18Db865457fcd935Bb3da856", - "Mirror_Manager": "0x6eD905A30c552a6e003061A38FD52A5A427beE56", - "Lockbox138": "0x9E51fAAE511024161b99838Af0dbA38Ff354F72c", - "Reserve_System": "0x607e97cD626f209facfE48c1464815DDE15B5093", - "Reserve_Token_Integration": "0x34B73e6EDFd9f85a7c25EeD31dcB13aB6E969b96", - "Regulated_Entity_Registry": "0xEA4C892D6c1253797c5D95a05BF3863363080b4B", - "Vault_Factory": "0xB2Ac70f35A81481B005067ed6567a5043BA32336", - "CREATE2_Factory": "0x750E4a8adCe9f0e67A420aBE91342DC64Eb90825", - "Universal_Asset_Registry_Deterministic": "0xC98602aa574F565b5478E8816BCab03C9De0870f", - "Universal_CCIP_Bridge_Deterministic": "0x532DE218b94993446Be30eC894442f911499f6a3", - "Mirror_Registry": "0x6427F9739e6B6c3dDb4E94fEfeBcdF35549549d8", - "Alltra_Adapter": "0x66FEBA2fC9a0B47F26DD4284DAd24F970436B8Dc", - "Transaction_Mirror": "0x4CF42c4F1dBa748601b8938be3E7ABD732E87cE9", - "Tether_USDT_Chain138": "0x15DF1D5BFDD8Aa4b380445D4e3E9B38d34283619", - "Price_Feed_Keeper": "0xD3AD6831aacB5386B8A25BB8D8176a6C8a026f04", - "Multicall_New": "0xF4AA429BE277d1a1a1A744C9e5B3aD821a9b96f7", - "Oracle_Aggregator_New": "0x452a4701d01c0Ff3ED0C547a5adF0659eb4a3ef7", - "Oracle_Proxy_New": "0x404DcD22f82C734361256B441DAAa8DE654CE191", - "Multisig": "0xb9E29cFa1f89d369671E640d0BB3aD94Cab43965", - "Voting": "0x022267b26400114aF01BaCcb92456Fe36cfccD93", - "Deployer_Admin": "0x4A666F96fC8764181194447A7dFdb7d471b301C8" - }, - "envVarMap": { - "CCIP_ROUTER": "CCIP_Router", - "CCIP_FEE_TOKEN": "CCIP_Fee_Token", - "LINK_TOKEN": "LINK_Token", - "LINK_TOKEN_CHAIN138": "LINK_Token", - "CCIPWETH9_BRIDGE_CHAIN138": "CCIPWETH9_Bridge", - "CCIP_ROUTER_ADDRESS": "CCIP_Router", - "COMPLIANCE_REGISTRY_ADDRESS": "Compliance_Registry", - "TOKEN_FACTORY": "Token_Factory", - "BRIDGE_VAULT": "Bridge_Vault", - "DEBT_REGISTRY": "Debt_Registry", - "POLICY_MANAGER": "Policy_Manager", - "TOKEN_IMPLEMENTATION": "Token_Implementation", - "COMPLIANT_USDT_ADDRESS": "Compliant_USDT", - "COMPLIANT_USDC_ADDRESS": "Compliant_USDC", - "TOKEN_REGISTRY_ADDRESS": "Token_Registry", - "FEE_COLLECTOR_ADDRESS": "Fee_Collector", - "UNIVERSAL_ASSET_REGISTRY": "Universal_Asset_Registry", - "GOVERNANCE_CONTROLLER": "Governance_Controller", - "UNIVERSAL_CCIP_BRIDGE": "Universal_CCIP_Bridge", - "BRIDGE_ORCHESTRATOR": "Bridge_Orchestrator", - "PAYMENT_CHANNEL_MANAGER": "Payment_Channel_Manager", - "GENERIC_STATE_CHANNEL_MANAGER": "Generic_State_Channel_Manager", - "ADDRESS_MAPPER": "Address_Mapper", - "MIRROR_MANAGER": "Mirror_Manager", - "VAULT_FACTORY": "Vault_Factory", - "RESERVE_SYSTEM": "Reserve_System", - "RESERVE_TOKEN_INTEGRATION": "Reserve_Token_Integration", - "REGULATED_ENTITY_REGISTRY": "Regulated_Entity_Registry", - "MERCHANT_SETTLEMENT_REGISTRY": "Merchant_Settlement_Registry", - "SETTLEMENT_REGISTRY_ADDRESS": "Settlement_Registry", - "WITHDRAWAL_ESCROW_ADDRESS": "Withdrawal_Escrow", - "CREATE2_FACTORY": "CREATE2_Factory", - "UNIVERSAL_ASSET_REGISTRY_DETERMINISTIC": "Universal_Asset_Registry_Deterministic", - "UNIVERSAL_CCIP_BRIDGE_DETERMINISTIC": "Universal_CCIP_Bridge_Deterministic", - "MIRROR_REGISTRY": "Mirror_Registry", - "ALLTRA_ADAPTER": "Alltra_Adapter", - "MIRROR_ADDRESS": "Transaction_Mirror", - "TETHER_ADDRESS": "Tether_USDT_Chain138", - "ORACLE_AGGREGATOR_ADDRESS": "Oracle_Aggregator", - "ORACLE_PROXY_ADDRESS": "Oracle_Proxy", - "RELAYER_ADDRESS": "Deployer_Admin", - "CCIP_ROUTER_CHAIN138": "CCIP_Router", - "CCIP_SENDER_ADDRESS": "CCIP_Sender", - "CUSDC_ADDRESS_138": "Compliant_USDC", - "CUSDT_ADDRESS_138": "Compliant_USDT" - } - }, - "1": { - "name": "Ethereum Mainnet", - "chainId": 1, - "mapper": "0x0ea68F5B5A8427bB58e54ECcee941F543Dc538c5", - "contracts": { - "CCIP_Relay_Router": "0xAd9A228CcEB4cbB612cD165FFB72fE090ff10Afb", - "CCIP_Relay_Bridge": "0xF9A32F37099c582D28b4dE7Fca6eaC1e5259f939", - "WETH9": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - "LINK_Token": "0x514910771AF9Ca656af840dff83E8264EcF986CA", - "MainnetTether": "0x15DF1D5BFDD8Aa4b380445D4e3E9B38d34283619", - "Transaction_Mirror": "0x4CF42c4F1dBa748601b8938be3E7ABD732E87cE9" - }, - "envVarMap": { - "CCIP_RELAY_ROUTER_MAINNET": "CCIP_Relay_Router", - "CCIP_RELAY_BRIDGE_MAINNET": "CCIP_Relay_Bridge", - "RELAY_ROUTER_MAINNET": "CCIP_Relay_Router", - "RELAY_BRIDGE_MAINNET": "CCIP_Relay_Bridge", - "TETHER_ADDRESS": "MainnetTether", - "MIRROR_ADDRESS": "Transaction_Mirror" - } - }, - "651940": { - "name": "ALL Mainnet", - "chainId": 651940, - "mapper": "canonical", - "contracts": { - "WETH": "0x798F6762BB40d6801A593459d08F890603D3979C", - "AUSDC": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", - "AUSDT": "0x015B1897Ed5279930bC2Be46F661894d219292A6" - }, - "envVarMap": {} - }, - "56": { "name": "BSC (BNB Chain)", "chainId": 56, "mapper": "0x6e94e53F73893b2a6784Df663920D31043A6dE07", "contracts": {}, "envVarMap": {} }, - "137": { "name": "Polygon", "chainId": 137, "mapper": "0xb689c1C69DAa08DEb5D8feA2aBF0F64bFD409727", "contracts": {}, "envVarMap": {} }, - "100": { "name": "Gnosis Chain", "chainId": 100, "mapper": "0x99B3511A2d315A497C8112C1fdd8D508d4B1E506", "contracts": {}, "envVarMap": {} }, - "43114": { "name": "Avalanche C-Chain", "chainId": 43114, "mapper": "0x73376eB92c16977B126dB9112936A20Fa0De3442", "contracts": {}, "envVarMap": {} }, - "8453": { "name": "Base", "chainId": 8453, "mapper": "0x6e94e53F73893b2a6784Df663920D31043A6dE07", "contracts": {}, "envVarMap": {} }, - "42161": { "name": "Arbitrum One", "chainId": 42161, "mapper": "0xB142e7f4D3Cc0dd231BB1867E815342932431Bb5", "contracts": {}, "envVarMap": {} }, - "10": { "name": "Optimism", "chainId": 10, "mapper": "0xDAB0591e5e89295fFaD75A71Dcfc30c5625C4fA2", "contracts": {}, "envVarMap": {} }, - "25": { "name": "Cronos", "chainId": 25, "mapper": "0x6F521cd9FCF7884cD4E9486c7790e818638e09Dd", "contracts": { "Address_Mapper": "0x6F521cd9FCF7884cD4E9486c7790e818638e09Dd" }, "envVarMap": {} }, - "42220": { "name": "Celo", "chainId": 42220, "mapper": "canonical", "contracts": {}, "envVarMap": {} }, - "1111": { "name": "Wemix", "chainId": 1111, "mapper": "canonical", "contracts": {}, "envVarMap": {} } - } -} diff --git a/config/token-mapping-multichain.json b/config/token-mapping-multichain.json index 353bfb1..b16a0a6 100644 --- a/config/token-mapping-multichain.json +++ b/config/token-mapping-multichain.json @@ -1,8 +1,22 @@ { "$schema": "https://json-schema.org/draft/2020-12/schema", "description": "Multi-chain token mapping: Chain 138↔651940 (ALL Mainnet) and 651940↔1,56,137,100,43114,8453,42161,10,25,42220,1111. Single source of truth for bridge/LP tooling. Verify canonical addresses per chain: see docs/07-ccip/EXPLORER_TOKENS_CANONICAL_MAPPING.md.", - "version": "1.0.0", - "updated": "2026-02-16", + "version": "1.1.0", + "updated": "2026-02-27", + "cToCwSymbolMapping": { + "cUSDT": "cWUSDT", + "cUSDC": "cWUSDC", + "cEURC": "cWEURC", + "cEURT": "cWEURT", + "cGBPC": "cWGBPC", + "cGBPT": "cWGBPT", + "cAUDC": "cWAUDC", + "cJPYC": "cWJPYC", + "cCHFC": "cWCHFC", + "cCADC": "cWCADC", + "cXAUC": "cWXAUC", + "cXAUT": "cWXAUT" + }, "chainNames": { "1": "Ethereum Mainnet", "10": "Optimism", @@ -11,18 +25,18 @@ "100": "Gnosis Chain", "137": "Polygon", "138": "SMOM-DBIS-138 (DeFi Oracle Meta)", + "1111": "Wemix", + "8453": "Base", "42161": "Arbitrum One", "42220": "Celo", "43114": "Avalanche C-Chain", - "651940": "ALL Mainnet (Alltra)", - "8453": "Base", - "1111": "Wemix" + "651940": "ALL Mainnet (Alltra)" }, "pairs": [ { "fromChainId": 138, "toChainId": 651940, - "notes": "AlltraAdapter bridge; Chain 138 ↔ ALL Mainnet", + "notes": "AlltraAdapter bridge; Chain 138 ↔ ALL Mainnet; c*_cW = c* on 138 → cW* on destination (set addressTo when cW* deployed)", "tokens": [ { "key": "WETH9", @@ -38,12 +52,96 @@ "addressTo": "0x015B1897Ed5279930bC2Be46F661894d219292A6", "notes": "138 cUSDT → ALL Mainnet AUSDT (primary)" }, + { + "key": "Compliant_USDT_cW", + "name": "cUSDT→cWUSDT", + "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", + "addressTo": "0x0000000000000000000000000000000000000000", + "notes": "138 cUSDT → 651940 cWUSDT; set addressTo when deployed" + }, { "key": "Compliant_USDC", "name": "Compliant USDC (cUSDC)", "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", "addressTo": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", "notes": "138 cUSDC → ALL Mainnet AUSDC" + }, + { + "key": "Compliant_USDC_cW", + "name": "cUSDC→cWUSDC", + "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", + "addressTo": "0x0000000000000000000000000000000000000000", + "notes": "138 cUSDC → 651940 cWUSDC; set addressTo when deployed" + }, + { + "key": "Compliant_EURC_cW", + "name": "cEURC→cWEURC", + "addressFrom": "0x8085961F9cF02b4d800A3c6d386D31da4B34266a", + "addressTo": "0x0000000000000000000000000000000000000000", + "notes": "138 cEURC → 651940 cWEURC; set addressTo when deployed" + }, + { + "key": "Compliant_EURT_cW", + "name": "cEURT→cWEURT", + "addressFrom": "0xdf4b71c61E5912712C1Bdd451416B9aC26949d72", + "addressTo": "0x0000000000000000000000000000000000000000", + "notes": "138 cEURT → cWEURT" + }, + { + "key": "Compliant_GBPC_cW", + "name": "cGBPC→cWGBPC", + "addressFrom": "0x003960f16D9d34F2e98d62723B6721Fb92074aD2", + "addressTo": "0x0000000000000000000000000000000000000000", + "notes": "138 cGBPC → cWGBPC" + }, + { + "key": "Compliant_GBPT_cW", + "name": "cGBPT→cWGBPT", + "addressFrom": "0x350f54e4D23795f86A9c03988c7135357CCaD97c", + "addressTo": "0x0000000000000000000000000000000000000000", + "notes": "138 cGBPT → cWGBPT" + }, + { + "key": "Compliant_AUDC_cW", + "name": "cAUDC→cWAUDC", + "addressFrom": "0xD51482e567c03899eecE3CAe8a058161FD56069D", + "addressTo": "0x0000000000000000000000000000000000000000", + "notes": "138 cAUDC → cWAUDC" + }, + { + "key": "Compliant_JPYC_cW", + "name": "cJPYC→cWJPYC", + "addressFrom": "0xEe269e1226a334182aace90056EE4ee5Cc8A6770", + "addressTo": "0x0000000000000000000000000000000000000000", + "notes": "138 cJPYC → cWJPYC" + }, + { + "key": "Compliant_CHFC_cW", + "name": "cCHFC→cWCHFC", + "addressFrom": "0x873990849DDa5117d7C644f0aF24370797C03885", + "addressTo": "0x0000000000000000000000000000000000000000", + "notes": "138 cCHFC → cWCHFC" + }, + { + "key": "Compliant_CADC_cW", + "name": "cCADC→cWCADC", + "addressFrom": "0x54dBd40cF05e15906A2C21f600937e96787f5679", + "addressTo": "0x0000000000000000000000000000000000000000", + "notes": "138 cCADC → cWCADC" + }, + { + "key": "Compliant_XAUC_cW", + "name": "cXAUC→cWXAUC", + "addressFrom": "0x290E52a8819A4fbD0714E517225429aA2B70EC6b", + "addressTo": "0x0000000000000000000000000000000000000000", + "notes": "138 cXAUC → cWXAUC" + }, + { + "key": "Compliant_XAUT_cW", + "name": "cXAUT→cWXAUT", + "addressFrom": "0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E", + "addressTo": "0x0000000000000000000000000000000000000000", + "notes": "138 cXAUT → cWXAUT" } ] }, @@ -78,81 +176,897 @@ { "fromChainId": 138, "toChainId": 56, - "notes": "Chain 138 ↔ BSC (CCIP); direct mapping", + "notes": "Chain 138 ↔ BSC (CCIP); direct mapping; c*_cW = c* on 138 → cW* on destination (set addressTo when cW* deployed)", "tokens": [ - { "key": "WETH9", "name": "Wrapped Ether", "addressFrom": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "addressTo": "0x2170Ed0880ac9A755fd29B2688956BD959F933F8", "notes": "138 WETH9 → BSC WETH" }, - { "key": "Compliant_USDT", "name": "cUSDT", "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", "addressTo": "0x55d398326f99059fF775485246999027B3197955", "notes": "138 cUSDT → BSC USDT" }, - { "key": "Compliant_USDC", "name": "cUSDC", "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", "addressTo": "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", "notes": "138 cUSDC → BSC USDC" } + { + "key": "WETH9", + "name": "Wrapped Ether", + "addressFrom": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "addressTo": "0x2170Ed0880ac9A755fd29B2688956BD959F933F8", + "notes": "138 WETH9 → BSC WETH" + }, + { + "key": "Compliant_USDT", + "name": "cUSDT", + "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", + "addressTo": "0x55d398326f99059fF775485246999027B3197955", + "notes": "138 cUSDT → BSC USDT (native)" + }, + { + "key": "Compliant_USDT_cW", + "name": "cUSDT→cWUSDT", + "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", + "addressTo": "0x9a1D0dBEE997929ED02fD19E0E199704d20914dB", + "notes": "138 cUSDT → BSC cWUSDT; set addressTo when deployed" + }, + { + "key": "Compliant_USDC", + "name": "cUSDC", + "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", + "addressTo": "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", + "notes": "138 cUSDC → BSC USDC (native)" + }, + { + "key": "Compliant_USDC_cW", + "name": "cUSDC→cWUSDC", + "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", + "addressTo": "0x5355148C4740fcc3D7a96F05EdD89AB14851206b", + "notes": "138 cUSDC → BSC cWUSDC; set addressTo when deployed" + }, + { + "key": "Compliant_EURC_cW", + "name": "cEURC→cWEURC", + "addressFrom": "0x8085961F9cF02b4d800A3c6d386D31da4B34266a", + "addressTo": "0x50b073d0D1D2f002745cb9FC28a057d5be84911c", + "notes": "138 cEURC → BSC cWEURC; set addressTo when deployed" + }, + { + "key": "Compliant_EURT_cW", + "name": "cEURT→cWEURT", + "addressFrom": "0xdf4b71c61E5912712C1Bdd451416B9aC26949d72", + "addressTo": "0x1ED9E491A5eCd53BeF21962A5FCE24880264F63f", + "notes": "138 cEURT → cWEURT" + }, + { + "key": "Compliant_GBPC_cW", + "name": "cGBPC→cWGBPC", + "addressFrom": "0x003960f16D9d34F2e98d62723B6721Fb92074aD2", + "addressTo": "0x8b6EE72001cAFcb21D56a6c4686D6Db951d499A6", + "notes": "138 cGBPC → cWGBPC" + }, + { + "key": "Compliant_GBPT_cW", + "name": "cGBPT→cWGBPT", + "addressFrom": "0x350f54e4D23795f86A9c03988c7135357CCaD97c", + "addressTo": "0xA6eFb8783C8ad2740ec880e46D4f7E608E893B1B", + "notes": "138 cGBPT → cWGBPT" + }, + { + "key": "Compliant_AUDC_cW", + "name": "cAUDC→cWAUDC", + "addressFrom": "0xD51482e567c03899eecE3CAe8a058161FD56069D", + "addressTo": "0x7062f35567BBAb4d98dc33af03B0d14Df42294D5", + "notes": "138 cAUDC → cWAUDC" + }, + { + "key": "Compliant_JPYC_cW", + "name": "cJPYC→cWJPYC", + "addressFrom": "0xEe269e1226a334182aace90056EE4ee5Cc8A6770", + "addressTo": "0x5fbCE65524211BC1bFb0309fd9EE09E786c6D097", + "notes": "138 cJPYC → cWJPYC" + }, + { + "key": "Compliant_CHFC_cW", + "name": "cCHFC→cWCHFC", + "addressFrom": "0x873990849DDa5117d7C644f0aF24370797C03885", + "addressTo": "0xD9f8710caeeBA3b3D423D7D14a918701426B5ef3", + "notes": "138 cCHFC → cWCHFC" + }, + { + "key": "Compliant_CADC_cW", + "name": "cCADC→cWCADC", + "addressFrom": "0x54dBd40cF05e15906A2C21f600937e96787f5679", + "addressTo": "0x9AE7a6B311584D60Fa93f973950d609061875775", + "notes": "138 cCADC → cWCADC" + }, + { + "key": "Compliant_XAUC_cW", + "name": "cXAUC→cWXAUC", + "addressFrom": "0x290E52a8819A4fbD0714E517225429aA2B70EC6b", + "addressTo": "0xCB145bA9A370681e3545F60e55621eBf218B1031", + "notes": "138 cXAUC → cWXAUC" + }, + { + "key": "Compliant_XAUT_cW", + "name": "cXAUT→cWXAUT", + "addressFrom": "0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E", + "addressTo": "0x73E0CF8BF861D376B3a4C87c136F975027f045ff", + "notes": "138 cXAUT → cWXAUT" + } ] }, { "fromChainId": 138, "toChainId": 137, - "notes": "Chain 138 ↔ Polygon (CCIP); direct mapping", + "notes": "Chain 138 ↔ Polygon (CCIP); direct mapping; c*_cW = c* → cW* on destination", "tokens": [ - { "key": "WETH9", "name": "Wrapped Ether", "addressFrom": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "addressTo": "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619", "notes": "138 WETH9 → Polygon WETH" }, - { "key": "Compliant_USDT", "name": "cUSDT", "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", "addressTo": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", "notes": "138 cUSDT → Polygon USDT" }, - { "key": "Compliant_USDC", "name": "cUSDC", "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", "addressTo": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c1369", "notes": "138 cUSDC → Polygon USDC" } + { + "key": "WETH9", + "name": "Wrapped Ether", + "addressFrom": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "addressTo": "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619", + "notes": "138 WETH9 → Polygon WETH" + }, + { + "key": "Compliant_USDT", + "name": "cUSDT", + "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", + "addressTo": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", + "notes": "138 cUSDT → Polygon USDT (native)" + }, + { + "key": "Compliant_USDT_cW", + "name": "cUSDT→cWUSDT", + "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", + "addressTo": "0x0cb0192C056aa425C557BdeAD8E56C7eEabf7acF", + "notes": "138 cUSDT → Polygon cWUSDT; set when deployed" + }, + { + "key": "Compliant_USDC", + "name": "cUSDC", + "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", + "addressTo": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c1369", + "notes": "138 cUSDC → Polygon USDC (native)" + }, + { + "key": "Compliant_USDC_cW", + "name": "cUSDC→cWUSDC", + "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", + "addressTo": "0xd6969bC19b53f866C64f2148aE271B2Dae0C58E4", + "notes": "138 cUSDC → Polygon cWUSDC; set when deployed" + }, + { + "key": "Compliant_EURC_cW", + "name": "cEURC→cWEURC", + "addressFrom": "0x8085961F9cF02b4d800A3c6d386D31da4B34266a", + "addressTo": "0x3CD9ee18db7ad13616FCC1c83bC6098e03968E66", + "notes": "138 cEURC → Polygon cWEURC; set when deployed" + }, + { + "key": "Compliant_EURT_cW", + "name": "cEURT→cWEURT", + "addressFrom": "0xdf4b71c61E5912712C1Bdd451416B9aC26949d72", + "addressTo": "0xBeF5A0Bcc0E77740c910f197138cdD90F98d2427", + "notes": "138 cEURT → cWEURT" + }, + { + "key": "Compliant_GBPC_cW", + "name": "cGBPC→cWGBPC", + "addressFrom": "0x003960f16D9d34F2e98d62723B6721Fb92074aD2", + "addressTo": "0x948690147D2e50ffe50C5d38C14125aD6a9FA036", + "notes": "138 cGBPC → cWGBPC" + }, + { + "key": "Compliant_GBPT_cW", + "name": "cGBPT→cWGBPT", + "addressFrom": "0x350f54e4D23795f86A9c03988c7135357CCaD97c", + "addressTo": "0x58a8D8F78F1B65c06dAd7542eC46b299629A60dd", + "notes": "138 cGBPT → cWGBPT" + }, + { + "key": "Compliant_AUDC_cW", + "name": "cAUDC→cWAUDC", + "addressFrom": "0xD51482e567c03899eecE3CAe8a058161FD56069D", + "addressTo": "0xFb4B6Cc81211F7d886950158294A44C312abCA29", + "notes": "138 cAUDC → cWAUDC" + }, + { + "key": "Compliant_JPYC_cW", + "name": "cJPYC→cWJPYC", + "addressFrom": "0xEe269e1226a334182aace90056EE4ee5Cc8A6770", + "addressTo": "0xf9f5D0ACD71C76F9476F10B3F3d3E201F0883C68", + "notes": "138 cJPYC → cWJPYC" + }, + { + "key": "Compliant_CHFC_cW", + "name": "cCHFC→cWCHFC", + "addressFrom": "0x873990849DDa5117d7C644f0aF24370797C03885", + "addressTo": "0xeE17bB0322383fecCA2784fbE2d4CD7d02b1905B", + "notes": "138 cCHFC → cWCHFC" + }, + { + "key": "Compliant_CADC_cW", + "name": "cCADC→cWCADC", + "addressFrom": "0x54dBd40cF05e15906A2C21f600937e96787f5679", + "addressTo": "0xc9750828124D4c10e7a6f4B655cA8487bD3842EB", + "notes": "138 cCADC → cWCADC" + }, + { + "key": "Compliant_XAUC_cW", + "name": "cXAUC→cWXAUC", + "addressFrom": "0x290E52a8819A4fbD0714E517225429aA2B70EC6b", + "addressTo": "0x328Cd365Bb35524297E68ED28c6fF2C9557d1363", + "notes": "138 cXAUC → cWXAUC" + }, + { + "key": "Compliant_XAUT_cW", + "name": "cXAUT→cWXAUT", + "addressFrom": "0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E", + "addressTo": "0x9e6044d730d4183bF7a666293d257d035Fba6d44", + "notes": "138 cXAUT → cWXAUT" + } ] }, { "fromChainId": 138, "toChainId": 100, - "notes": "Chain 138 ↔ Gnosis (CCIP); direct mapping", + "notes": "Chain 138 ↔ Gnosis (CCIP); direct mapping; c*_cW = c* → cW* on destination", "tokens": [ - { "key": "WETH9", "name": "Wrapped Ether", "addressFrom": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "addressTo": "0x6A023CCd1ff6F2045C3309768eAd9E68F978f6e1", "notes": "138 WETH9 → Gnosis WETH" }, - { "key": "Compliant_USDT", "name": "cUSDT", "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", "addressTo": "0x4ECaBa5870353805a9F068101A40E0f32ed605C6", "notes": "138 cUSDT → Gnosis USDT" }, - { "key": "Compliant_USDC", "name": "cUSDC", "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", "addressTo": "0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83", "notes": "138 cUSDC → Gnosis USDC" } + { + "key": "WETH9", + "name": "Wrapped Ether", + "addressFrom": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "addressTo": "0x6A023CCd1ff6F2045C3309768eAd9E68F978f6e1", + "notes": "138 WETH9 → Gnosis WETH" + }, + { + "key": "Compliant_USDT", + "name": "cUSDT", + "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", + "addressTo": "0x4ECaBa5870353805a9F068101A40E0f32ed605C6", + "notes": "138 cUSDT → Gnosis USDT (native)" + }, + { + "key": "Compliant_USDT_cW", + "name": "cUSDT→cWUSDT", + "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", + "addressTo": "0x0cb0192C056aa425C557BdeAD8E56C7eEabf7acF", + "notes": "138 cUSDT → Gnosis cWUSDT; set when deployed" + }, + { + "key": "Compliant_USDC", + "name": "cUSDC", + "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", + "addressTo": "0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83", + "notes": "138 cUSDC → Gnosis USDC (native)" + }, + { + "key": "Compliant_USDC_cW", + "name": "cUSDC→cWUSDC", + "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", + "addressTo": "0xd6969bC19b53f866C64f2148aE271B2Dae0C58E4", + "notes": "138 cUSDC → Gnosis cWUSDC; set when deployed" + }, + { + "key": "Compliant_EURC_cW", + "name": "cEURC→cWEURC", + "addressFrom": "0x8085961F9cF02b4d800A3c6d386D31da4B34266a", + "addressTo": "0x3CD9ee18db7ad13616FCC1c83bC6098e03968E66", + "notes": "138 cEURC → Gnosis cWEURC; set when deployed" + }, + { + "key": "Compliant_EURT_cW", + "name": "cEURT→cWEURT", + "addressFrom": "0xdf4b71c61E5912712C1Bdd451416B9aC26949d72", + "addressTo": "0xBeF5A0Bcc0E77740c910f197138cdD90F98d2427", + "notes": "138 cEURT → cWEURT" + }, + { + "key": "Compliant_GBPC_cW", + "name": "cGBPC→cWGBPC", + "addressFrom": "0x003960f16D9d34F2e98d62723B6721Fb92074aD2", + "addressTo": "0x948690147D2e50ffe50C5d38C14125aD6a9FA036", + "notes": "138 cGBPC → cWGBPC" + }, + { + "key": "Compliant_GBPT_cW", + "name": "cGBPT→cWGBPT", + "addressFrom": "0x350f54e4D23795f86A9c03988c7135357CCaD97c", + "addressTo": "0x58a8D8F78F1B65c06dAd7542eC46b299629A60dd", + "notes": "138 cGBPT → cWGBPT" + }, + { + "key": "Compliant_AUDC_cW", + "name": "cAUDC→cWAUDC", + "addressFrom": "0xD51482e567c03899eecE3CAe8a058161FD56069D", + "addressTo": "0xFb4B6Cc81211F7d886950158294A44C312abCA29", + "notes": "138 cAUDC → cWAUDC" + }, + { + "key": "Compliant_JPYC_cW", + "name": "cJPYC→cWJPYC", + "addressFrom": "0xEe269e1226a334182aace90056EE4ee5Cc8A6770", + "addressTo": "0xf9f5D0ACD71C76F9476F10B3F3d3E201F0883C68", + "notes": "138 cJPYC → cWJPYC" + }, + { + "key": "Compliant_CHFC_cW", + "name": "cCHFC→cWCHFC", + "addressFrom": "0x873990849DDa5117d7C644f0aF24370797C03885", + "addressTo": "0xeE17bB0322383fecCA2784fbE2d4CD7d02b1905B", + "notes": "138 cCHFC → cWCHFC" + }, + { + "key": "Compliant_CADC_cW", + "name": "cCADC→cWCADC", + "addressFrom": "0x54dBd40cF05e15906A2C21f600937e96787f5679", + "addressTo": "0xc9750828124D4c10e7a6f4B655cA8487bD3842EB", + "notes": "138 cCADC → cWCADC" + }, + { + "key": "Compliant_XAUC_cW", + "name": "cXAUC→cWXAUC", + "addressFrom": "0x290E52a8819A4fbD0714E517225429aA2B70EC6b", + "addressTo": "0x328Cd365Bb35524297E68ED28c6fF2C9557d1363", + "notes": "138 cXAUC → cWXAUC" + }, + { + "key": "Compliant_XAUT_cW", + "name": "cXAUT→cWXAUT", + "addressFrom": "0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E", + "addressTo": "0x9e6044d730d4183bF7a666293d257d035Fba6d44", + "notes": "138 cXAUT → cWXAUT" + } ] }, { "fromChainId": 138, "toChainId": 43114, - "notes": "Chain 138 ↔ Avalanche (CCIP); direct mapping", + "notes": "Chain 138 ↔ Avalanche (CCIP); direct mapping; c*_cW = c* → cW* on destination", "tokens": [ - { "key": "WETH9", "name": "Wrapped Ether", "addressFrom": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "addressTo": "0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB", "notes": "138 WETH9 → Avalanche WETH" }, - { "key": "Compliant_USDT", "name": "cUSDT", "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", "addressTo": "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7", "notes": "138 cUSDT → Avalanche USDT" }, - { "key": "Compliant_USDC", "name": "cUSDC", "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", "addressTo": "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E", "notes": "138 cUSDC → Avalanche USDC" } + { + "key": "WETH9", + "name": "Wrapped Ether", + "addressFrom": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "addressTo": "0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB", + "notes": "138 WETH9 → Avalanche WETH" + }, + { + "key": "Compliant_USDT", + "name": "cUSDT", + "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", + "addressTo": "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7", + "notes": "138 cUSDT → Avalanche USDT (native)" + }, + { + "key": "Compliant_USDT_cW", + "name": "cUSDT→cWUSDT", + "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", + "addressTo": "0x8142BA530B08f3950128601F00DaaA678213DFdf", + "notes": "138 cUSDT → Avalanche cWUSDT; set when deployed" + }, + { + "key": "Compliant_USDC", + "name": "cUSDC", + "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", + "addressTo": "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E", + "notes": "138 cUSDC → Avalanche USDC (native)" + }, + { + "key": "Compliant_USDC_cW", + "name": "cUSDC→cWUSDC", + "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", + "addressTo": "0x0C242b513008Cd49C89078F5aFb237A3112251EB", + "notes": "138 cUSDC → Avalanche cWUSDC; set when deployed" + }, + { + "key": "Compliant_EURC_cW", + "name": "cEURC→cWEURC", + "addressFrom": "0x8085961F9cF02b4d800A3c6d386D31da4B34266a", + "addressTo": "0x61D642979eD75c1325f35b9275C5A7FE97F22451", + "notes": "138 cEURC → Avalanche cWEURC; set when deployed" + }, + { + "key": "Compliant_EURT_cW", + "name": "cEURT→cWEURT", + "addressFrom": "0xdf4b71c61E5912712C1Bdd451416B9aC26949d72", + "addressTo": "0x30751782486eed825187C1EAe5DE4b4baD428AaE", + "notes": "138 cEURT → cWEURT" + }, + { + "key": "Compliant_GBPC_cW", + "name": "cGBPC→cWGBPC", + "addressFrom": "0x003960f16D9d34F2e98d62723B6721Fb92074aD2", + "addressTo": "0xb0FA7ec4123C7c275B3a89d9239569707Ea3C66A", + "notes": "138 cGBPC → cWGBPC" + }, + { + "key": "Compliant_GBPT_cW", + "name": "cGBPT→cWGBPT", + "addressFrom": "0x350f54e4D23795f86A9c03988c7135357CCaD97c", + "addressTo": "0x6389a643e71F000FC4ce5a0d58fDC4a40AD68EBE", + "notes": "138 cGBPT → cWGBPT" + }, + { + "key": "Compliant_AUDC_cW", + "name": "cAUDC→cWAUDC", + "addressFrom": "0xD51482e567c03899eecE3CAe8a058161FD56069D", + "addressTo": "0x528376e3a4bAAE78F7F4D0E9aDB75eFA9942373E", + "notes": "138 cAUDC → cWAUDC" + }, + { + "key": "Compliant_JPYC_cW", + "name": "cJPYC→cWJPYC", + "addressFrom": "0xEe269e1226a334182aace90056EE4ee5Cc8A6770", + "addressTo": "0xCF9D867DA220c6B4756BeDC6888dDac3a0463AEa", + "notes": "138 cJPYC → cWJPYC" + }, + { + "key": "Compliant_CHFC_cW", + "name": "cCHFC→cWCHFC", + "addressFrom": "0x873990849DDa5117d7C644f0aF24370797C03885", + "addressTo": "0x4f6167e9aE79878f6Cd71330eAD7f68a45Ed29DC", + "notes": "138 cCHFC → cWCHFC" + }, + { + "key": "Compliant_CADC_cW", + "name": "cCADC→cWCADC", + "addressFrom": "0x54dBd40cF05e15906A2C21f600937e96787f5679", + "addressTo": "0x1B051588A33A7d56ed46f7C5C78870175b44F9FA", + "notes": "138 cCADC → cWCADC" + }, + { + "key": "Compliant_XAUC_cW", + "name": "cXAUC→cWXAUC", + "addressFrom": "0x290E52a8819A4fbD0714E517225429aA2B70EC6b", + "addressTo": "0x826d5F3e5713C76a1D13e41A76843A361090c896", + "notes": "138 cXAUC → cWXAUC" + }, + { + "key": "Compliant_XAUT_cW", + "name": "cXAUT→cWXAUT", + "addressFrom": "0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E", + "addressTo": "0xC15ACdBAC59B3C7Cb4Ea4B3D58334A4b143B4b44", + "notes": "138 cXAUT → cWXAUT" + } ] }, { "fromChainId": 138, "toChainId": 8453, - "notes": "Chain 138 ↔ Base (CCIP); direct mapping", + "notes": "Chain 138 ↔ Base (CCIP); direct mapping; c*_cW = c* → cW* on destination", "tokens": [ - { "key": "WETH9", "name": "Wrapped Ether", "addressFrom": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "addressTo": "0x4200000000000000000000000000000000000006", "notes": "138 WETH9 → Base WETH" }, - { "key": "Compliant_USDT", "name": "cUSDT", "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", "addressTo": "0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2", "notes": "138 cUSDT → Base USDT" }, - { "key": "Compliant_USDC", "name": "cUSDC", "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", "addressTo": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "notes": "138 cUSDC → Base USDC" } + { + "key": "WETH9", + "name": "Wrapped Ether", + "addressFrom": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "addressTo": "0x4200000000000000000000000000000000000006", + "notes": "138 WETH9 → Base WETH" + }, + { + "key": "Compliant_USDT", + "name": "cUSDT", + "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", + "addressTo": "0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2", + "notes": "138 cUSDT → Base USDT (native)" + }, + { + "key": "Compliant_USDT_cW", + "name": "cUSDT→cWUSDT", + "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", + "addressTo": "0x04B2AE3c3bb3d70Df506FAd8717b0FBFC78ED7E6", + "notes": "138 cUSDT → Base cWUSDT; set when deployed" + }, + { + "key": "Compliant_USDC", + "name": "cUSDC", + "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", + "addressTo": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", + "notes": "138 cUSDC → Base USDC (native)" + }, + { + "key": "Compliant_USDC_cW", + "name": "cUSDC→cWUSDC", + "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", + "addressTo": "0x377a5FaA3162b3Fc6f4e267301A3c817bAd18105", + "notes": "138 cUSDC → Base cWUSDC; set when deployed" + }, + { + "key": "Compliant_EURC_cW", + "name": "cEURC→cWEURC", + "addressFrom": "0x8085961F9cF02b4d800A3c6d386D31da4B34266a", + "addressTo": "0x0cb0192C056aa425C557BdeAD8E56C7eEabf7acF", + "notes": "138 cEURC → Base cWEURC; set when deployed" + }, + { + "key": "Compliant_EURT_cW", + "name": "cEURT→cWEURT", + "addressFrom": "0xdf4b71c61E5912712C1Bdd451416B9aC26949d72", + "addressTo": "0xd6969bC19b53f866C64f2148aE271B2Dae0C58E4", + "notes": "138 cEURT → cWEURT" + }, + { + "key": "Compliant_GBPC_cW", + "name": "cGBPC→cWGBPC", + "addressFrom": "0x003960f16D9d34F2e98d62723B6721Fb92074aD2", + "addressTo": "0x3CD9ee18db7ad13616FCC1c83bC6098e03968E66", + "notes": "138 cGBPC → cWGBPC" + }, + { + "key": "Compliant_GBPT_cW", + "name": "cGBPT→cWGBPT", + "addressFrom": "0x350f54e4D23795f86A9c03988c7135357CCaD97c", + "addressTo": "0xBeF5A0Bcc0E77740c910f197138cdD90F98d2427", + "notes": "138 cGBPT → cWGBPT" + }, + { + "key": "Compliant_AUDC_cW", + "name": "cAUDC→cWAUDC", + "addressFrom": "0xD51482e567c03899eecE3CAe8a058161FD56069D", + "addressTo": "0x948690147D2e50ffe50C5d38C14125aD6a9FA036", + "notes": "138 cAUDC → cWAUDC" + }, + { + "key": "Compliant_JPYC_cW", + "name": "cJPYC→cWJPYC", + "addressFrom": "0xEe269e1226a334182aace90056EE4ee5Cc8A6770", + "addressTo": "0x58a8D8F78F1B65c06dAd7542eC46b299629A60dd", + "notes": "138 cJPYC → cWJPYC" + }, + { + "key": "Compliant_CHFC_cW", + "name": "cCHFC→cWCHFC", + "addressFrom": "0x873990849DDa5117d7C644f0aF24370797C03885", + "addressTo": "0xFb4B6Cc81211F7d886950158294A44C312abCA29", + "notes": "138 cCHFC → cWCHFC" + }, + { + "key": "Compliant_CADC_cW", + "name": "cCADC→cWCADC", + "addressFrom": "0x54dBd40cF05e15906A2C21f600937e96787f5679", + "addressTo": "0xf9f5D0ACD71C76F9476F10B3F3d3E201F0883C68", + "notes": "138 cCADC → cWCADC" + }, + { + "key": "Compliant_XAUC_cW", + "name": "cXAUC→cWXAUC", + "addressFrom": "0x290E52a8819A4fbD0714E517225429aA2B70EC6b", + "addressTo": "0xeE17bB0322383fecCA2784fbE2d4CD7d02b1905B", + "notes": "138 cXAUC → cWXAUC" + }, + { + "key": "Compliant_XAUT_cW", + "name": "cXAUT→cWXAUT", + "addressFrom": "0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E", + "addressTo": "0xc9750828124D4c10e7a6f4B655cA8487bD3842EB", + "notes": "138 cXAUT → cWXAUT" + } ] }, { "fromChainId": 138, "toChainId": 42161, - "notes": "Chain 138 ↔ Arbitrum (CCIP); direct mapping", + "notes": "Chain 138 ↔ Arbitrum (CCIP); direct mapping; c*_cW = c* → cW* on destination", "tokens": [ - { "key": "WETH9", "name": "Wrapped Ether", "addressFrom": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "addressTo": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", "notes": "138 WETH9 → Arbitrum WETH" }, - { "key": "Compliant_USDT", "name": "cUSDT", "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", "addressTo": "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9", "notes": "138 cUSDT → Arbitrum USDT" }, - { "key": "Compliant_USDC", "name": "cUSDC", "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", "addressTo": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", "notes": "138 cUSDC → Arbitrum USDC" } + { + "key": "WETH9", + "name": "Wrapped Ether", + "addressFrom": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "addressTo": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "notes": "138 WETH9 → Arbitrum WETH" + }, + { + "key": "Compliant_USDT", + "name": "cUSDT", + "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", + "addressTo": "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9", + "notes": "138 cUSDT → Arbitrum USDT (native)" + }, + { + "key": "Compliant_USDT_cW", + "name": "cUSDT→cWUSDT", + "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", + "addressTo": "0x73ADaF7dBa95221c080db5631466d2bC54f6a76B", + "notes": "138 cUSDT → Arbitrum cWUSDT; set when deployed" + }, + { + "key": "Compliant_USDC", + "name": "cUSDC", + "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", + "addressTo": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "notes": "138 cUSDC → Arbitrum USDC (native)" + }, + { + "key": "Compliant_USDC_cW", + "name": "cUSDC→cWUSDC", + "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", + "addressTo": "0x0cb0192C056aa425C557BdeAD8E56C7eEabf7acF", + "notes": "138 cUSDC → Arbitrum cWUSDC; set when deployed" + }, + { + "key": "Compliant_EURC_cW", + "name": "cEURC→cWEURC", + "addressFrom": "0x8085961F9cF02b4d800A3c6d386D31da4B34266a", + "addressTo": "0xd6969bC19b53f866C64f2148aE271B2Dae0C58E4", + "notes": "138 cEURC → Arbitrum cWEURC; set when deployed" + }, + { + "key": "Compliant_EURT_cW", + "name": "cEURT→cWEURT", + "addressFrom": "0xdf4b71c61E5912712C1Bdd451416B9aC26949d72", + "addressTo": "0x3CD9ee18db7ad13616FCC1c83bC6098e03968E66", + "notes": "138 cEURT → cWEURT" + }, + { + "key": "Compliant_GBPC_cW", + "name": "cGBPC→cWGBPC", + "addressFrom": "0x003960f16D9d34F2e98d62723B6721Fb92074aD2", + "addressTo": "0xBeF5A0Bcc0E77740c910f197138cdD90F98d2427", + "notes": "138 cGBPC → cWGBPC" + }, + { + "key": "Compliant_GBPT_cW", + "name": "cGBPT→cWGBPT", + "addressFrom": "0x350f54e4D23795f86A9c03988c7135357CCaD97c", + "addressTo": "0x948690147D2e50ffe50C5d38C14125aD6a9FA036", + "notes": "138 cGBPT → cWGBPT" + }, + { + "key": "Compliant_AUDC_cW", + "name": "cAUDC→cWAUDC", + "addressFrom": "0xD51482e567c03899eecE3CAe8a058161FD56069D", + "addressTo": "0x58a8D8F78F1B65c06dAd7542eC46b299629A60dd", + "notes": "138 cAUDC → cWAUDC" + }, + { + "key": "Compliant_JPYC_cW", + "name": "cJPYC→cWJPYC", + "addressFrom": "0xEe269e1226a334182aace90056EE4ee5Cc8A6770", + "addressTo": "0xFb4B6Cc81211F7d886950158294A44C312abCA29", + "notes": "138 cJPYC → cWJPYC" + }, + { + "key": "Compliant_CHFC_cW", + "name": "cCHFC→cWCHFC", + "addressFrom": "0x873990849DDa5117d7C644f0aF24370797C03885", + "addressTo": "0xf9f5D0ACD71C76F9476F10B3F3d3E201F0883C68", + "notes": "138 cCHFC → cWCHFC" + }, + { + "key": "Compliant_CADC_cW", + "name": "cCADC→cWCADC", + "addressFrom": "0x54dBd40cF05e15906A2C21f600937e96787f5679", + "addressTo": "0xeE17bB0322383fecCA2784fbE2d4CD7d02b1905B", + "notes": "138 cCADC → cWCADC" + }, + { + "key": "Compliant_XAUC_cW", + "name": "cXAUC→cWXAUC", + "addressFrom": "0x290E52a8819A4fbD0714E517225429aA2B70EC6b", + "addressTo": "0xc9750828124D4c10e7a6f4B655cA8487bD3842EB", + "notes": "138 cXAUC → cWXAUC" + }, + { + "key": "Compliant_XAUT_cW", + "name": "cXAUT→cWXAUT", + "addressFrom": "0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E", + "addressTo": "0x328Cd365Bb35524297E68ED28c6fF2C9557d1363", + "notes": "138 cXAUT → cWXAUT" + } ] }, { "fromChainId": 138, "toChainId": 10, - "notes": "Chain 138 ↔ Optimism (CCIP); direct mapping", + "notes": "Chain 138 ↔ Optimism (CCIP); direct mapping; c*_cW = c* → cW* on destination", "tokens": [ - { "key": "WETH9", "name": "Wrapped Ether", "addressFrom": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "addressTo": "0x4200000000000000000000000000000000000006", "notes": "138 WETH9 → Optimism WETH" }, - { "key": "Compliant_USDT", "name": "cUSDT", "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", "addressTo": "0x94b008aA00579c1307B0EF2c499aD98a8ce58e58", "notes": "138 cUSDT → Optimism USDT" }, - { "key": "Compliant_USDC", "name": "cUSDC", "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", "addressTo": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", "notes": "138 cUSDC → Optimism USDC" } + { + "key": "WETH9", + "name": "Wrapped Ether", + "addressFrom": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "addressTo": "0x4200000000000000000000000000000000000006", + "notes": "138 WETH9 → Optimism WETH" + }, + { + "key": "Compliant_USDT", + "name": "cUSDT", + "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", + "addressTo": "0x94b008aA00579c1307B0EF2c499aD98a8ce58e58", + "notes": "138 cUSDT → Optimism USDT (native)" + }, + { + "key": "Compliant_USDT_cW", + "name": "cUSDT→cWUSDT", + "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", + "addressTo": "0x04B2AE3c3bb3d70Df506FAd8717b0FBFC78ED7E6", + "notes": "138 cUSDT → Optimism cWUSDT; set when deployed" + }, + { + "key": "Compliant_USDC", + "name": "cUSDC", + "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", + "addressTo": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", + "notes": "138 cUSDC → Optimism USDC (native)" + }, + { + "key": "Compliant_USDC_cW", + "name": "cUSDC→cWUSDC", + "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", + "addressTo": "0x377a5FaA3162b3Fc6f4e267301A3c817bAd18105", + "notes": "138 cUSDC → Optimism cWUSDC; set when deployed" + }, + { + "key": "Compliant_EURC_cW", + "name": "cEURC→cWEURC", + "addressFrom": "0x8085961F9cF02b4d800A3c6d386D31da4B34266a", + "addressTo": "0x2627177f33968128C7fb916F5B9E1f14cc550A80", + "notes": "138 cEURC → Optimism cWEURC; set when deployed" + }, + { + "key": "Compliant_EURT_cW", + "name": "cEURT→cWEURT", + "addressFrom": "0xdf4b71c61E5912712C1Bdd451416B9aC26949d72", + "addressTo": "0x07dE1f489E1bfCE2c326066a9DFc10e731CBA0CB", + "notes": "138 cEURT → cWEURT" + }, + { + "key": "Compliant_GBPC_cW", + "name": "cGBPC→cWGBPC", + "addressFrom": "0x003960f16D9d34F2e98d62723B6721Fb92074aD2", + "addressTo": "0x9a1D0dBEE997929ED02fD19E0E199704d20914dB", + "notes": "138 cGBPC → cWGBPC" + }, + { + "key": "Compliant_GBPT_cW", + "name": "cGBPT→cWGBPT", + "addressFrom": "0x350f54e4D23795f86A9c03988c7135357CCaD97c", + "addressTo": "0x5355148C4740fcc3D7a96F05EdD89AB14851206b", + "notes": "138 cGBPT → cWGBPT" + }, + { + "key": "Compliant_AUDC_cW", + "name": "cAUDC→cWAUDC", + "addressFrom": "0xD51482e567c03899eecE3CAe8a058161FD56069D", + "addressTo": "0x50b073d0D1D2f002745cb9FC28a057d5be84911c", + "notes": "138 cAUDC → cWAUDC" + }, + { + "key": "Compliant_JPYC_cW", + "name": "cJPYC→cWJPYC", + "addressFrom": "0xEe269e1226a334182aace90056EE4ee5Cc8A6770", + "addressTo": "0x1ED9E491A5eCd53BeF21962A5FCE24880264F63f", + "notes": "138 cJPYC → cWJPYC" + }, + { + "key": "Compliant_CHFC_cW", + "name": "cCHFC→cWCHFC", + "addressFrom": "0x873990849DDa5117d7C644f0aF24370797C03885", + "addressTo": "0x8b6EE72001cAFcb21D56a6c4686D6Db951d499A6", + "notes": "138 cCHFC → cWCHFC" + }, + { + "key": "Compliant_CADC_cW", + "name": "cCADC→cWCADC", + "addressFrom": "0x54dBd40cF05e15906A2C21f600937e96787f5679", + "addressTo": "0xA6eFb8783C8ad2740ec880e46D4f7E608E893B1B", + "notes": "138 cCADC → cWCADC" + }, + { + "key": "Compliant_XAUC_cW", + "name": "cXAUC→cWXAUC", + "addressFrom": "0x290E52a8819A4fbD0714E517225429aA2B70EC6b", + "addressTo": "0x7062f35567BBAb4d98dc33af03B0d14Df42294D5", + "notes": "138 cXAUC → cWXAUC" + }, + { + "key": "Compliant_XAUT_cW", + "name": "cXAUT→cWXAUT", + "addressFrom": "0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E", + "addressTo": "0x5fbCE65524211BC1bFb0309fd9EE09E786c6D097", + "notes": "138 cXAUT → cWXAUT" + } ] }, { "fromChainId": 138, "toChainId": 25, - "notes": "Chain 138 ↔ Cronos (CCIP); direct mapping", + "notes": "Chain 138 ↔ Cronos (CCIP); direct mapping; c*_cW = c* → cW* on destination", "tokens": [ - { "key": "WETH9", "name": "Wrapped Ether", "addressFrom": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "addressTo": "0xe44Fd7fCb2b1581822D0c862B68222998a0c299a", "notes": "138 WETH9 → Cronos WETH" }, - { "key": "Compliant_USDT", "name": "cUSDT", "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", "addressTo": "0x66e4286603D22FF153A6547700f37C7Eae42F8E2", "notes": "138 cUSDT → Cronos USDT" }, - { "key": "Compliant_USDC", "name": "cUSDC", "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", "addressTo": "0xc21223249CA28397B4B6541dfFaEcC539BfF0c59", "notes": "138 cUSDC → Cronos USDC" } + { + "key": "WETH9", + "name": "Wrapped Ether", + "addressFrom": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "addressTo": "0xe44Fd7fCb2b1581822D0c862B68222998a0c299a", + "notes": "138 WETH9 → Cronos WETH" + }, + { + "key": "Compliant_USDT", + "name": "cUSDT", + "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", + "addressTo": "0x66e4286603D22FF153A6547700f37C7Eae42F8E2", + "notes": "138 cUSDT → Cronos USDT (native)" + }, + { + "key": "Compliant_USDT_cW", + "name": "cUSDT→cWUSDT", + "addressFrom": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", + "addressTo": "0x72948a7a813B60b37Cd0c920C4657DbFF54312b8", + "notes": "138 cUSDT → Cronos cWUSDT; set when deployed" + }, + { + "key": "Compliant_USDC", + "name": "cUSDC", + "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", + "addressTo": "0xc21223249CA28397B4B6541dfFaEcC539BfF0c59", + "notes": "138 cUSDC → Cronos USDC (native)" + }, + { + "key": "Compliant_USDC_cW", + "name": "cUSDC→cWUSDC", + "addressFrom": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", + "addressTo": "0x932566E5bB6BEBF6B035B94f3DE1f75f126304Ec", + "notes": "138 cUSDC → Cronos cWUSDC; set when deployed" + }, + { + "key": "Compliant_EURC_cW", + "name": "cEURC→cWEURC", + "addressFrom": "0x8085961F9cF02b4d800A3c6d386D31da4B34266a", + "addressTo": "0x0000000000000000000000000000000000000000", + "notes": "138 cEURC → Cronos cWEURC; set when deployed" + }, + { + "key": "Compliant_EURT_cW", + "name": "cEURT→cWEURT", + "addressFrom": "0xdf4b71c61E5912712C1Bdd451416B9aC26949d72", + "addressTo": "0x0000000000000000000000000000000000000000", + "notes": "138 cEURT → cWEURT" + }, + { + "key": "Compliant_GBPC_cW", + "name": "cGBPC→cWGBPC", + "addressFrom": "0x003960f16D9d34F2e98d62723B6721Fb92074aD2", + "addressTo": "0x0000000000000000000000000000000000000000", + "notes": "138 cGBPC → cWGBPC" + }, + { + "key": "Compliant_GBPT_cW", + "name": "cGBPT→cWGBPT", + "addressFrom": "0x350f54e4D23795f86A9c03988c7135357CCaD97c", + "addressTo": "0x0000000000000000000000000000000000000000", + "notes": "138 cGBPT → cWGBPT" + }, + { + "key": "Compliant_AUDC_cW", + "name": "cAUDC→cWAUDC", + "addressFrom": "0xD51482e567c03899eecE3CAe8a058161FD56069D", + "addressTo": "0x0000000000000000000000000000000000000000", + "notes": "138 cAUDC → cWAUDC" + }, + { + "key": "Compliant_JPYC_cW", + "name": "cJPYC→cWJPYC", + "addressFrom": "0xEe269e1226a334182aace90056EE4ee5Cc8A6770", + "addressTo": "0x0000000000000000000000000000000000000000", + "notes": "138 cJPYC → cWJPYC" + }, + { + "key": "Compliant_CHFC_cW", + "name": "cCHFC→cWCHFC", + "addressFrom": "0x873990849DDa5117d7C644f0aF24370797C03885", + "addressTo": "0x0000000000000000000000000000000000000000", + "notes": "138 cCHFC → cWCHFC" + }, + { + "key": "Compliant_CADC_cW", + "name": "cCADC→cWCADC", + "addressFrom": "0x54dBd40cF05e15906A2C21f600937e96787f5679", + "addressTo": "0x0000000000000000000000000000000000000000", + "notes": "138 cCADC → cWCADC" + }, + { + "key": "Compliant_XAUC_cW", + "name": "cXAUC→cWXAUC", + "addressFrom": "0x290E52a8819A4fbD0714E517225429aA2B70EC6b", + "addressTo": "0x0000000000000000000000000000000000000000", + "notes": "138 cXAUC → cWXAUC" + }, + { + "key": "Compliant_XAUT_cW", + "name": "cXAUT→cWXAUT", + "addressFrom": "0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E", + "addressTo": "0x0000000000000000000000000000000000000000", + "notes": "138 cXAUT → cWXAUT" + } ] }, { @@ -160,9 +1074,27 @@ "toChainId": 1, "notes": "ALL Mainnet ↔ Ethereum Mainnet (canonical)", "tokens": [ - { "key": "WETH", "name": "Wrapped Ether", "addressFrom": "0x798F6762BB40d6801A593459d08F890603D3979C", "addressTo": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", "notes": "Canonical WETH9" }, - { "key": "AUSDT", "name": "USDT", "addressFrom": "0x015B1897Ed5279930bC2Be46F661894d219292A6", "addressTo": "0xdAC17F958D2ee523a2206206994597C13D831ec7", "notes": "Canonical USDT" }, - { "key": "AUSDC", "name": "USDC", "addressFrom": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", "addressTo": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "notes": "Canonical USDC" } + { + "key": "WETH", + "name": "Wrapped Ether", + "addressFrom": "0x798F6762BB40d6801A593459d08F890603D3979C", + "addressTo": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + "notes": "Canonical WETH9" + }, + { + "key": "AUSDT", + "name": "USDT", + "addressFrom": "0x015B1897Ed5279930bC2Be46F661894d219292A6", + "addressTo": "0xdAC17F958D2ee523a2206206994597C13D831ec7", + "notes": "Canonical USDT" + }, + { + "key": "AUSDC", + "name": "USDC", + "addressFrom": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", + "addressTo": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "notes": "Canonical USDC" + } ] }, { @@ -170,9 +1102,27 @@ "toChainId": 56, "notes": "ALL Mainnet ↔ BSC; canonical BEP-20", "tokens": [ - { "key": "WETH", "name": "Wrapped Ether", "addressFrom": "0x798F6762BB40d6801A593459d08F890603D3979C", "addressTo": "0x2170Ed0880ac9A755fd29B2688956BD959F933F8", "notes": "BSC WETH" }, - { "key": "AUSDT", "name": "USDT", "addressFrom": "0x015B1897Ed5279930bC2Be46F661894d219292A6", "addressTo": "0x55d398326f99059fF775485246999027B3197955", "notes": "BSC USDT (BEP-20)" }, - { "key": "AUSDC", "name": "USDC", "addressFrom": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", "addressTo": "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", "notes": "BSC USDC (BEP-20)" } + { + "key": "WETH", + "name": "Wrapped Ether", + "addressFrom": "0x798F6762BB40d6801A593459d08F890603D3979C", + "addressTo": "0x2170Ed0880ac9A755fd29B2688956BD959F933F8", + "notes": "BSC WETH" + }, + { + "key": "AUSDT", + "name": "USDT", + "addressFrom": "0x015B1897Ed5279930bC2Be46F661894d219292A6", + "addressTo": "0x55d398326f99059fF775485246999027B3197955", + "notes": "BSC USDT (BEP-20)" + }, + { + "key": "AUSDC", + "name": "USDC", + "addressFrom": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", + "addressTo": "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", + "notes": "BSC USDC (BEP-20)" + } ] }, { @@ -180,9 +1130,27 @@ "toChainId": 137, "notes": "ALL Mainnet ↔ Polygon", "tokens": [ - { "key": "WETH", "name": "Wrapped Ether", "addressFrom": "0x798F6762BB40d6801A593459d08F890603D3979C", "addressTo": "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619", "notes": "Polygon WETH" }, - { "key": "AUSDT", "name": "USDT", "addressFrom": "0x015B1897Ed5279930bC2Be46F661894d219292A6", "addressTo": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", "notes": "Polygon USDT" }, - { "key": "AUSDC", "name": "USDC", "addressFrom": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", "addressTo": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c1369", "notes": "Polygon USDC" } + { + "key": "WETH", + "name": "Wrapped Ether", + "addressFrom": "0x798F6762BB40d6801A593459d08F890603D3979C", + "addressTo": "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619", + "notes": "Polygon WETH" + }, + { + "key": "AUSDT", + "name": "USDT", + "addressFrom": "0x015B1897Ed5279930bC2Be46F661894d219292A6", + "addressTo": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", + "notes": "Polygon USDT" + }, + { + "key": "AUSDC", + "name": "USDC", + "addressFrom": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", + "addressTo": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c1369", + "notes": "Polygon USDC" + } ] }, { @@ -190,9 +1158,27 @@ "toChainId": 100, "notes": "ALL Mainnet ↔ Gnosis Chain", "tokens": [ - { "key": "WETH", "name": "Wrapped Ether", "addressFrom": "0x798F6762BB40d6801A593459d08F890603D3979C", "addressTo": "0x6A023CCd1ff6F2045C3309768eAd9E68F978f6e1", "notes": "Gnosis WETH" }, - { "key": "AUSDT", "name": "USDT", "addressFrom": "0x015B1897Ed5279930bC2Be46F661894d219292A6", "addressTo": "0x4ECaBa5870353805a9F068101A40E0f32ed605C6", "notes": "Gnosis USDT" }, - { "key": "AUSDC", "name": "USDC", "addressFrom": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", "addressTo": "0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83", "notes": "Gnosis USDC" } + { + "key": "WETH", + "name": "Wrapped Ether", + "addressFrom": "0x798F6762BB40d6801A593459d08F890603D3979C", + "addressTo": "0x6A023CCd1ff6F2045C3309768eAd9E68F978f6e1", + "notes": "Gnosis WETH" + }, + { + "key": "AUSDT", + "name": "USDT", + "addressFrom": "0x015B1897Ed5279930bC2Be46F661894d219292A6", + "addressTo": "0x4ECaBa5870353805a9F068101A40E0f32ed605C6", + "notes": "Gnosis USDT" + }, + { + "key": "AUSDC", + "name": "USDC", + "addressFrom": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", + "addressTo": "0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83", + "notes": "Gnosis USDC" + } ] }, { @@ -200,9 +1186,27 @@ "toChainId": 43114, "notes": "ALL Mainnet ↔ Avalanche C-Chain", "tokens": [ - { "key": "WETH", "name": "Wrapped Ether", "addressFrom": "0x798F6762BB40d6801A593459d08F890603D3979C", "addressTo": "0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB", "notes": "Avalanche WETH.e" }, - { "key": "AUSDT", "name": "USDT", "addressFrom": "0x015B1897Ed5279930bC2Be46F661894d219292A6", "addressTo": "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7", "notes": "Avalanche USDT" }, - { "key": "AUSDC", "name": "USDC", "addressFrom": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", "addressTo": "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E", "notes": "Avalanche USDC" } + { + "key": "WETH", + "name": "Wrapped Ether", + "addressFrom": "0x798F6762BB40d6801A593459d08F890603D3979C", + "addressTo": "0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB", + "notes": "Avalanche WETH.e" + }, + { + "key": "AUSDT", + "name": "USDT", + "addressFrom": "0x015B1897Ed5279930bC2Be46F661894d219292A6", + "addressTo": "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7", + "notes": "Avalanche USDT" + }, + { + "key": "AUSDC", + "name": "USDC", + "addressFrom": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", + "addressTo": "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E", + "notes": "Avalanche USDC" + } ] }, { @@ -210,9 +1214,27 @@ "toChainId": 8453, "notes": "ALL Mainnet ↔ Base", "tokens": [ - { "key": "WETH", "name": "Wrapped Ether", "addressFrom": "0x798F6762BB40d6801A593459d08F890603D3979C", "addressTo": "0x4200000000000000000000000000000000000006", "notes": "Base WETH" }, - { "key": "AUSDT", "name": "USDT", "addressFrom": "0x015B1897Ed5279930bC2Be46F661894d219292A6", "addressTo": "0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2", "notes": "Base USDT" }, - { "key": "AUSDC", "name": "USDC", "addressFrom": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", "addressTo": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", "notes": "Base USDC" } + { + "key": "WETH", + "name": "Wrapped Ether", + "addressFrom": "0x798F6762BB40d6801A593459d08F890603D3979C", + "addressTo": "0x4200000000000000000000000000000000000006", + "notes": "Base WETH" + }, + { + "key": "AUSDT", + "name": "USDT", + "addressFrom": "0x015B1897Ed5279930bC2Be46F661894d219292A6", + "addressTo": "0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2", + "notes": "Base USDT" + }, + { + "key": "AUSDC", + "name": "USDC", + "addressFrom": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", + "addressTo": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", + "notes": "Base USDC" + } ] }, { @@ -220,9 +1242,27 @@ "toChainId": 42161, "notes": "ALL Mainnet ↔ Arbitrum One", "tokens": [ - { "key": "WETH", "name": "Wrapped Ether", "addressFrom": "0x798F6762BB40d6801A593459d08F890603D3979C", "addressTo": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", "notes": "Arbitrum WETH" }, - { "key": "AUSDT", "name": "USDT", "addressFrom": "0x015B1897Ed5279930bC2Be46F661894d219292A6", "addressTo": "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9", "notes": "Arbitrum USDT" }, - { "key": "AUSDC", "name": "USDC", "addressFrom": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", "addressTo": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", "notes": "Arbitrum USDC" } + { + "key": "WETH", + "name": "Wrapped Ether", + "addressFrom": "0x798F6762BB40d6801A593459d08F890603D3979C", + "addressTo": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", + "notes": "Arbitrum WETH" + }, + { + "key": "AUSDT", + "name": "USDT", + "addressFrom": "0x015B1897Ed5279930bC2Be46F661894d219292A6", + "addressTo": "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9", + "notes": "Arbitrum USDT" + }, + { + "key": "AUSDC", + "name": "USDC", + "addressFrom": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", + "addressTo": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + "notes": "Arbitrum USDC" + } ] }, { @@ -230,9 +1270,27 @@ "toChainId": 10, "notes": "ALL Mainnet ↔ Optimism", "tokens": [ - { "key": "WETH", "name": "Wrapped Ether", "addressFrom": "0x798F6762BB40d6801A593459d08F890603D3979C", "addressTo": "0x4200000000000000000000000000000000000006", "notes": "Optimism WETH" }, - { "key": "AUSDT", "name": "USDT", "addressFrom": "0x015B1897Ed5279930bC2Be46F661894d219292A6", "addressTo": "0x94b008aA00579c1307B0EF2c499aD98a8ce58e58", "notes": "Optimism USDT" }, - { "key": "AUSDC", "name": "USDC", "addressFrom": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", "addressTo": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", "notes": "Optimism USDC" } + { + "key": "WETH", + "name": "Wrapped Ether", + "addressFrom": "0x798F6762BB40d6801A593459d08F890603D3979C", + "addressTo": "0x4200000000000000000000000000000000000006", + "notes": "Optimism WETH" + }, + { + "key": "AUSDT", + "name": "USDT", + "addressFrom": "0x015B1897Ed5279930bC2Be46F661894d219292A6", + "addressTo": "0x94b008aA00579c1307B0EF2c499aD98a8ce58e58", + "notes": "Optimism USDT" + }, + { + "key": "AUSDC", + "name": "USDC", + "addressFrom": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", + "addressTo": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", + "notes": "Optimism USDC" + } ] }, { @@ -240,9 +1298,27 @@ "toChainId": 25, "notes": "ALL Mainnet ↔ Cronos", "tokens": [ - { "key": "WETH", "name": "Wrapped Ether", "addressFrom": "0x798F6762BB40d6801A593459d08F890603D3979C", "addressTo": "0xe44Fd7fCb2b1581822D0c862B68222998a0c299a", "notes": "Cronos WETH" }, - { "key": "AUSDT", "name": "USDT", "addressFrom": "0x015B1897Ed5279930bC2Be46F661894d219292A6", "addressTo": "0x66e4286603D22FF153A6547700f37C7Eae42F8E2", "notes": "Cronos USDT" }, - { "key": "AUSDC", "name": "USDC", "addressFrom": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", "addressTo": "0xc21223249CA28397B4B6541dfFaEcC539BfF0c59", "notes": "Cronos USDC" } + { + "key": "WETH", + "name": "Wrapped Ether", + "addressFrom": "0x798F6762BB40d6801A593459d08F890603D3979C", + "addressTo": "0xe44Fd7fCb2b1581822D0c862B68222998a0c299a", + "notes": "Cronos WETH" + }, + { + "key": "AUSDT", + "name": "USDT", + "addressFrom": "0x015B1897Ed5279930bC2Be46F661894d219292A6", + "addressTo": "0x66e4286603D22FF153A6547700f37C7Eae42F8E2", + "notes": "Cronos USDT" + }, + { + "key": "AUSDC", + "name": "USDC", + "addressFrom": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", + "addressTo": "0xc21223249CA28397B4B6541dfFaEcC539BfF0c59", + "notes": "Cronos USDC" + } ] }, { @@ -250,9 +1326,27 @@ "toChainId": 42220, "notes": "ALL Mainnet ↔ Celo", "tokens": [ - { "key": "WETH", "name": "Wrapped Ether", "addressFrom": "0x798F6762BB40d6801A593459d08F890603D3979C", "addressTo": "0xD221812de1BD094f35587EE8E174B07B6167D9Af", "notes": "Celo WETH" }, - { "key": "AUSDT", "name": "USDT", "addressFrom": "0x015B1897Ed5279930bC2Be46F661894d219292A6", "addressTo": "0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e", "notes": "Celo USDT" }, - { "key": "AUSDC", "name": "USDC", "addressFrom": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", "addressTo": "0xcebA9300f2b948710d2653dD7B07f33A8B32118C", "notes": "Celo USDC" } + { + "key": "WETH", + "name": "Wrapped Ether", + "addressFrom": "0x798F6762BB40d6801A593459d08F890603D3979C", + "addressTo": "0xD221812de1BD094f35587EE8E174B07B6167D9Af", + "notes": "Celo WETH" + }, + { + "key": "AUSDT", + "name": "USDT", + "addressFrom": "0x015B1897Ed5279930bC2Be46F661894d219292A6", + "addressTo": "0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e", + "notes": "Celo USDT" + }, + { + "key": "AUSDC", + "name": "USDC", + "addressFrom": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", + "addressTo": "0xcebA9300f2b948710d2653dD7B07f33A8B32118C", + "notes": "Celo USDC" + } ] }, { @@ -260,9 +1354,27 @@ "toChainId": 1111, "notes": "ALL Mainnet ↔ Wemix. Addresses from scan.wemix.com (2026-02-16). Operator: verify on scan.wemix.com before production – see docs/07-ccip/WEMIX_TOKEN_VERIFICATION.md.", "tokens": [ - { "key": "WETH", "name": "Wrapped Ether", "addressFrom": "0x798F6762BB40d6801A593459d08F890603D3979C", "addressTo": "0x5adcb99e7ccd357aceaade7abc5dfbd6f2fce1ae", "notes": "Wemix WETH – https://scan.wemix.com/token/0x5adcb99e7ccd357aceaade7abc5dfbd6f2fce1ae" }, - { "key": "AUSDT", "name": "USDT", "addressFrom": "0x015B1897Ed5279930bC2Be46F661894d219292A6", "addressTo": "0xA649325Aa7C5093d12D6F98EB4378deAe68CE23F", "notes": "Wemix USDT – https://scan.wemix.com/address/0xA649325Aa7C5093d12D6F98EB4378deAe68CE23F (verify official Tether deployment)" }, - { "key": "AUSDC", "name": "USDC", "addressFrom": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", "addressTo": "0xE3F5a90F9cb311505cd691a46596599aA1A0AD7D", "notes": "Wemix USDC – https://scan.wemix.com/address/0xE3F5a90F9cb311505cd691a46596599aA1A0AD7D (scan shows USD Coin; verify official Circle/bridged)" } + { + "key": "WETH", + "name": "Wrapped Ether", + "addressFrom": "0x798F6762BB40d6801A593459d08F890603D3979C", + "addressTo": "0x5adcb99e7ccd357aceaade7abc5dfbd6f2fce1ae", + "notes": "Wemix WETH – https://scan.wemix.com/token/0x5adcb99e7ccd357aceaade7abc5dfbd6f2fce1ae" + }, + { + "key": "AUSDT", + "name": "USDT", + "addressFrom": "0x015B1897Ed5279930bC2Be46F661894d219292A6", + "addressTo": "0xA649325Aa7C5093d12D6F98EB4378deAe68CE23F", + "notes": "Wemix USDT – https://scan.wemix.com/address/0xA649325Aa7C5093d12D6F98EB4378deAe68CE23F (verify official Tether deployment)" + }, + { + "key": "AUSDC", + "name": "USDC", + "addressFrom": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", + "addressTo": "0xE3F5a90F9cb311505cd691a46596599aA1A0AD7D", + "notes": "Wemix USDC – https://scan.wemix.com/address/0xE3F5a90F9cb311505cd691a46596599aA1A0AD7D (scan shows USD Coin; verify official Circle/bridged)" + } ] } ] diff --git a/config/token-mapping.json b/config/token-mapping.json deleted file mode 100644 index 0239249..0000000 --- a/config/token-mapping.json +++ /dev/null @@ -1,64 +0,0 @@ -{ - "$schema": "https://json-schema.org/draft/2020-12/schema", - "description": "Cross-chain token mapping: Chain 138 ↔ Ethereum Mainnet. Single source of truth for relay tokenMapping and docs. No secrets.", - "version": "1.0.0", - "updated": "2026-02-16", - "relayBridgeMainnet": "0xF9A32F37099c582D28b4dE7Fca6eaC1e5259f939", - "relayBridgeNote": "CCIPRelayBridge on Mainnet is WETH9-only; it has no token registry. Only tokens listed with relaySupported true can be delivered 138→Mainnet via the current relay.", - "tokens": [ - { - "key": "WETH9", - "name": "Wrapped Ether (WETH9)", - "chain138Address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - "mainnetAddress": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - "relaySupported": true, - "notes": "Canonical WETH9; same address on both chains. Only token the Mainnet CCIPRelayBridge accepts." - }, - { - "key": "LINK_Token", - "name": "Chainlink (LINK)", - "chain138Address": "0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03", - "mainnetAddress": "0x514910771AF9Ca656af840dff83E8264EcF986CA", - "relaySupported": false, - "notes": "Canonical Mainnet LINK. Relay bridge does not accept LINK; add LINK support to bridge or a separate receiver to enable." - }, - { - "key": "WETH10", - "name": "Wrapped Ether v10 (WETH10)", - "chain138Address": "0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f", - "mainnetAddress": null, - "relaySupported": false, - "notes": "Chain 138 only. No Mainnet wrapped/mirrored contract; bridge has no mapping for this token." - }, - { - "key": "Compliant_USDT", - "name": "Compliant USDT (cUSDT)", - "chain138Address": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", - "mainnetAddress": null, - "relaySupported": false, - "notes": "Chain 138 compliant stablecoin. Mainnet canonical USDT is different (Tether); no bridge-wrapped address in current design." - }, - { - "key": "Compliant_USDC", - "name": "Compliant USDC (cUSDC)", - "chain138Address": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", - "mainnetAddress": null, - "relaySupported": false, - "notes": "Chain 138 compliant stablecoin. Mainnet canonical USDC is different (Circle); no bridge-wrapped address in current design." - }, - { - "key": "Tether_USDT_Chain138", - "name": "Tether USDT (Chain 138)", - "chain138Address": "0x15DF1D5BFDD8Aa4b380445D4e3E9B38d34283619", - "mainnetAddress": null, - "relaySupported": false, - "notes": "Chain 138 Tether deployment. Mainnet canonical USDT: 0xdAC17F958D2ee523a2206206994597C13D831ec7; no bridge-wrapped address in current design." - } - ], - "mainnetCanonicalReference": { - "USDT": "0xdAC17F958D2ee523a2206206994597C13D831ec7", - "USDC": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - "WETH9": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - "LINK": "0x514910771AF9Ca656af840dff83E8264EcF986CA" - } -} diff --git a/docs/00-meta/ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md b/docs/00-meta/ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md new file mode 100644 index 0000000..679d286 --- /dev/null +++ b/docs/00-meta/ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md @@ -0,0 +1,373 @@ +# All Recommendations and Suggestions for Improvements + +**Purpose:** Single consolidated list of all recommendations and improvement suggestions referenced across the repository. +**Last Updated:** 2026-02-22 +**Source docs:** See links at the end of each section. + +**Full plan (required / optional / recommended, execution order):** [COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md](COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md). + +--- + +## 1. Proxmox / Validated Set (High priority) + +| # | Recommendation | Notes | +|---|----------------|------| +| 1 | Secure .env file permissions | `chmod 600 ~/.env` | +| 2 | Secure validator key permissions | chmod 600, chown besu | +| 3 | SSH key-based authentication (disable password) | | +| 4 | Firewall rules for Proxmox API (port 8006) | Restrict to specific IPs | +| 5 | Network segmentation (VLANs) | VLAN enablement phase | +| 6 | Basic metrics collection (Prometheus, Besu 9545) | | +| 7 | Health check monitoring + alerting | | +| 8 | Automated backup script + encrypted validator keys | | +| 9 | Backup configuration files + version control | | +| 10 | Integration tests for deployment scripts | | +| 11 | Runbooks (add/remove validator, upgrade Besu, key rotation, recovery, consensus) | | + +**Source:** [10-best-practices/RECOMMENDATIONS_AND_SUGGESTIONS.md](../10-best-practices/RECOMMENDATIONS_AND_SUGGESTIONS.md), [ALL_IMPROVEMENTS_AND_GAPS_INDEX.md](../ALL_IMPROVEMENTS_AND_GAPS_INDEX.md) + +--- + +## 2. Proxmox / Validated Set (Medium priority) + +| # | Recommendation | Notes | +|---|----------------|------| +| 12 | Enhanced error handling (retry, timeout, circuit breaker, rollback) | retry_with_backoff.sh exists | +| 13 | Structured logging (levels, JSON, IDs, rotation) | | +| 14 | Centralized log collection (Loki/ELK) | | +| 15 | Resource optimization (right-size, CPU pinning, quotas) | | +| 16 | Network optimization (P2P, buffers, jumbo frames, static-nodes) | | +| 17 | Database optimization (size, cache, backups, pruning) | | +| 18 | Java/Besu tuning (heap, GC, flight recorder) | | +| 19 | CI/CD pipeline (testing, blue-green, rollback, canary) | | +| 20 | CLI tool for operations | | + +--- + +## 3. Proxmox / Validated Set (Low priority & quick wins) + +| # | Recommendation | Notes | +|---|----------------|------| +| 21–30 | Auto-scaling, dynamic validator set, load balancing, multi-region, HA validators, network upgrades, Web UI, HSM, audit logging, security scanning | Future | +| 31 | Add progress indicators to scripts | | +| 32 | Integrate --dry-run into deployment/change scripts | dry-run-example.sh exists | +| 33 | Integrate config validation into CI/pre-deploy | validate-config-files.sh exists | +| 34 | Create troubleshooting FAQ | | +| 35 | Add inline comments to complex scripts | | + +--- + +## 4. Code quality & scripts + +| # | Recommendation | Priority | +|---|----------------|----------| +| 36 | Script shebang: standardize on `#!/usr/bin/env bash` | Medium | +| 37 | Error handling: standardize on `set -euo pipefail` + traps | High | +| 38 | Script header template (metadata, usage, exit codes) | Medium | +| 39 | Code formatting & linting (shellcheck, shfmt, pre-commit, yamllint) | Medium | +| 40 | Script consolidation (140 deployment scripts, reduce overlap) | Medium | +| 41 | Expand shared function library (scripts/lib/) | Medium | +| 42 | Script performance (profile, parallelize, cache) | Low | +| 43 | Auto-generate script documentation | Low | + +**Source:** [smom-dbis-138/docs/ADDITIONAL_OPTIMIZATION_RECOMMENDATIONS.md](../../smom-dbis-138/docs/ADDITIONAL_OPTIMIZATION_RECOMMENDATIONS.md) + +--- + +## 5. Documentation enhancements + +| # | Recommendation | Priority | +|---|----------------|----------| +| 44 | Documentation consolidation (archive old status reports) | Medium | +| 45 | Documentation accuracy review (quarterly, links, obsolete removal) | Medium | +| 46 | Inline code documentation | Low | +| 47 | API documentation (RPC, contracts, examples) | Medium | +| 68 | Quick reference cards (network, VMID, commands, troubleshooting) | High | +| 69 | Decision trees (troubleshooting, configuration, deployment) | Medium | +| 70 | Configuration templates (ER605, Proxmox, Cloudflare, Besu) | High | +| 71 | Examples and use cases (deployment, troubleshooting, migration) | Medium | +| 72 | Glossary and terminology | Medium | +| 73 | Visual elements (diagrams, tables, flowcharts) | Various | +| 74 | Organization (TOC, cross-links, maintenance schedule) | Various | + +**Source:** [00-meta/DOCUMENTATION_ENHANCEMENTS_RECOMMENDATIONS.md](DOCUMENTATION_ENHANCEMENTS_RECOMMENDATIONS.md) + +--- + +## 6. Security + +| # | Recommendation | Priority | +|---|----------------|----------| +| 48 | Secret management audit (no hardcoded secrets, rotation, CI scanning) | High | +| 49 | Input validation in all scripts | High | +| 50 | Security scanning automation (CI, container image scanning) | High | +| 51 | Access control review (RBAC, least privilege) | Medium | +| 52 | Configuration validation (JSON/YAML schema, pre-deploy) | High | + +**Source:** [GAPS_AND_RECOMMENDATIONS_CONSOLIDATED.md](../GAPS_AND_RECOMMENDATIONS_CONSOLIDATED.md), [04-configuration/MASTER_SECRETS.md](../04-configuration/MASTER_SECRETS.md) + +--- + +## 7. Configuration, testing, monitoring & DX + +| # | Recommendation | Priority | +|---|----------------|----------| +| 53 | Configuration templates / .example expansion | Medium | +| 54 | Environment management standardization | Medium | +| 55 | Test coverage (unit, integration, E2E, performance) | Medium | +| 56 | Automate all tests in CI | Medium | +| 57 | Test data management (fixtures, generators) | Low | +| 58 | Logging standardization (structured, levels, rotation) | Medium | +| 59 | Metrics collection for script execution | Low | +| 60 | Health check enhancement (dependencies, dashboard) | Medium | +| 61 | Dev environment setup (script, DevContainer, quick start) | Medium | +| 62 | IDE configuration (VS Code, editorconfig) | Low | +| 63 | Developer documentation (guide, standards, architecture) | Medium | +| 64 | Dependency updates (dependabot/renovate, process doc) | Medium | +| 65 | Formalize code review process | Medium | +| 66 | Change management (changelog, versioning) | Low | +| 67 | Backup & recovery review and testing | High | + +--- + +## 8. Infrastructure & deployment + +| # | Recommendation | Notes | +|---|----------------|------| +| 75 | VLAN enablement (UDM Pro, Proxmox bridge, service migration) | Phase 1 optional | +| 76 | Observability (Prometheus, Grafana, Loki, Alertmanager, Cloudflare Access) | Phase 2 | +| 77 | CCIP fleet (VMID 5400–5476) | Phase 3 | +| 78 | Sovereign tenants (VLANs, isolation, access control) | Phase 4 | +| 79 | Besu RPC — missing containers (canonical list) | High | +| 80 | Hyperledger (Firefly, Cacti, Fabric, Indy) containers | High/Medium | +| 81 | Blockscout (5000) container | High | + +--- + +## 9. Codebase & placeholders + +| # | Recommendation | Priority | +|---|----------------|----------| +| 82 | Security audits (VLT-024, ISO-024) | Critical | +| 83 | Bridge integrations (BRG-VLT, BRG-ISO) | High | +| 84 | CCIP AMB full implementation | High | +| 85 | dbis_core TypeScript/Prisma fixes (~1186 errors) | High | +| 86 | IRU remaining tasks | High | +| 87 | Canonical addresses env-only (token-aggregation) | Medium | +| 88 | AlltraAdapter fee (TODO: actual fee) | Medium | +| 89 | Smart accounts kit placeholders | Medium | +| 90 | Quote service Fabric chainId 999 | Low | +| 91 | .bak script/test restoration or deprecation | Low | + +--- + +## 10. MetaMask & explorer + +| # | Recommendation | Effort | +|---|----------------|--------| +| 92 | Token-aggregation production deployment | 2–3 h | +| 93 | Token-aggregation: external API keys (CoinGecko, CMC, DexScreener) | 30 min | +| 94 | Chain 138 Snap: market data UI | 4–6 h | +| 95 | Chain 138 Snap: swap quotes | 8–12 h | +| 96 | Chain 138 Snap: bridge routes | 8–12 h | +| 97 | Chain 138 Snap: testing & distribution | 2–4 h | +| 98 | CoinGecko submission (Chain 138) | 1–2 h | +| 99 | Consensys outreach (Swaps/Bridge support) | 1 h | +| 100 | Paymaster deployment (gas abstraction) | 2–3 h | +| 101 | Explorer: add "Wallet" link to navbar | 15 min | +| 102 | Explorer: sync status indicator | 1 h | +| 103 | Explorer: network selector | 2–3 h | +| 104 | Explorer: dark mode toggle | 2–3 h | +| 105 | Token-aggregation: monitoring, auth for admin endpoints | 1–3 h | + +--- + +## 11. Tezos / Etherlink / CCIP + +| # | Recommendation | Category | +|---|----------------|----------| +| 106 | Verify Etherlink in CCIP supported networks | External verification | +| 107 | Verify Jumper API support (138, 651940, 42793, Tezos) | External verification | +| 108 | Verify LiFi for Etherlink (chain 42793) | External verification | +| 109–121 | InitializeRegistry, DeployAllAdapters, Etherlink receiver, token list governance, finality, Tezos L1 relay, Etherlink relay, rate limits, Jumper integration, DON registration, metrics, production enablement, tests | Contracts / Off-chain / Routing / Testing | + +**Source:** [07-ccip/TEZOS_CCIP_REMAINING_ITEMS.md](../07-ccip/TEZOS_CCIP_REMAINING_ITEMS.md) + +--- + +## 12. Besu / blockchain + +| # | Recommendation | Notes | +|---|----------------|------| +| 122 | RPC config file location (for tx pool) | Needs investigation | +| 123 | Transaction pool clearing / gas price verification | Pending | +| 124 | Layered tx-pool tuning, gas price, network connectivity | Phase 2 | +| 125 | Automated monitoring setup (cron/systemd) for health script | Phase 3 | +| 126 | Logging configuration for monitoring | Phase 3 | + +**Source:** [06-besu/COMPLETE_RECOMMENDATIONS_SUMMARY.md](../06-besu/COMPLETE_RECOMMENDATIONS_SUMMARY.md) + +--- + +## 13. RPC translator + +| # | Recommendation | Priority | +|---|----------------|----------| +| 128 | Client-side retry logic (exponential backoff, 502) | High | +| 129 | Set up monitoring/alerting | High | +| 130 | Short/medium/long-term improvements (see ALL_RECOMMENDATIONS.md) | Various | + +**Source:** [rpc-translator-138/ALL_RECOMMENDATIONS.md](../../rpc-translator-138/ALL_RECOMMENDATIONS.md) + +--- + +## 14. Orchestration portal + +| # | Recommendation | Priority | +|---|----------------|----------| +| 131 | P0: Auth, state, real-time, error handling, security headers, validation, testing, CI/CD | Must have | +| 132 | P1: Advanced components, PostgreSQL migration, Redis caching, background jobs, performance, monitoring | Should have | +| 133 | P2: GraphQL, i18n, PWA, multi-tenancy, microservices | Nice to have | +| 134 | Quick wins (see QUICK_WINS.md in portal) | — | + +**Source:** [smom-dbis-138/orchestration/portal/RECOMMENDATIONS_SUMMARY.md](../../smom-dbis-138/orchestration/portal/RECOMMENDATIONS_SUMMARY.md) + +--- + +## 15. Maintenance (ongoing) + +| # | Task | Frequency | +|---|------|-----------| +| 135 | Monitor explorer sync status | Daily | +| 136 | Monitor RPC node health (e.g. VMID 2201) | Daily | +| 137 | Check config API uptime | Weekly | +| 138 | Review explorer logs | Weekly | +| 139 | Update token list | As needed | + +--- + +## 16. Operator checklist (R1–R24) + +| # | Action | When | +|---|--------|------| +| R1 | Verify every deployed contract on Blockscout | After each deployment | +| R2 | Keep CONTRACT_ADDRESSES_REFERENCE and ADDRESS_MATRIX_AND_STATUS updated | When new contracts deployed/deprecated | +| R3 | Run check-contracts-on-chain-138.sh; fix any MISSING/EMPTY | Periodically or after deploy | +| R4 | Do not use deprecated CCIPWETH9Bridge; use 0x971c... and set env | Always | +| R5 | Never commit .env or private keys; rotate exposed keys | Always | +| R6 | API keys in .env.example placeholders | — | +| R7 | Restrict deployer key and RPC admin access | Access review | +| R8 | Set RPC_URL_138; run from LAN/VPN if needed | Before deploy | +| R9 | Use GAS_PRICE=1000000000 (or current min) on Chain 138 | Every forge script on 138 | +| R10 | Phased core deploy order: 01_DeployCore, set env, 02_DeployBridges | Deploy order | +| R11 | If tx stuck, manage nonce; see DEPLOYMENT_STRATEGY_EVALUATION | Troubleshooting | +| R12 | Keep CONTRACT_DEPLOYMENT_RUNBOOK, BLOCKSCOUT_VERIFICATION_GUIDE in sync | After script/URL changes | +| R13 | Document addresses in CONTRACT_ADDRESSES_REFERENCE per chain | Per-chain deploy | +| R14 | Run run-contract-verification-with-proxy.sh after deployments in CI | CI after deploy | +| R15 | Consider single script: check env → deploy → verify → update config | Automation | +| R16 | Use .env.development / .env.staging / .env.production or JSON per chain | Config hygiene | +| R17 | Monitor critical bridge/oracle events | Ongoing | +| R18 | Ensure Blockscout (VMID 5000) is up and /api reachable | Health checks | +| R19 | Run forge test before deploying; integration tests where available | Pre-deploy | +| R20 | NatSpec on public contract functions | Code quality | +| R21 | When The Order deployed: NPMplus proxy host; document in RPC_ENDPOINTS_MASTER | Sankofa/The Order go-live | +| R22 | Document or configure blocks #2–#6 in NETWORK_ARCHITECTURE | When decided | +| R23 | Scripts: progress indicators; --dry-run; config validation | Script updates | +| R24 | Keep config/token-mapping.json as single source of truth for 138↔Mainnet | Adding tokens | + +**Source:** [RECOMMENDATIONS_OPERATOR_CHECKLIST.md](RECOMMENDATIONS_OPERATOR_CHECKLIST.md) + +--- + +## 17. Chain 138 Snap (pre-publish) + +| Recommendation | Notes | +|----------------|-------| +| Run Snapper / MetaMask security scanner locally before publish | If available | +| Test with real wallet on Chain 138 (small balance) | In-wallet balance, Send page | +| Test from deployed companion site and different origin | CORS, Connected sites | +| Confirm token-aggregation (or API) up; /api/v1/networks, token-list, bridge/routes, quote, tokens | Before release | +| Keep changelog; bump version deliberately; note breaking changes for integrators | | +| When adding tokens: always set logoURI so MetaMask never shows token without logo | | +| When adding/changing chains: set iconUrls; ensure URLs stable and reachable | | + +**Source:** [metamask-integration/chain138-snap/docs/PRE_PUBLISH_TESTING.md](../../metamask-integration/chain138-snap/docs/PRE_PUBLISH_TESTING.md) §9 + +--- + +## 18. Configuration & DNS (gaps) + +| Item | Recommendation | +|------|----------------| +| the-order.sankofa.nexus | When The Order portal deployed: add NPMplus proxy host; document in RPC_ENDPOINTS_MASTER, ALL_VMIDS_ENDPOINTS | +| Sankofa cutover plan | Replace <TARGET_IP>, <TARGET_PORT>, TBDs with actual IPs/ports when deployed | +| sankofa.nexus / phoenix routing | Ensure NPMplus proxy targets 192.168.11.51:3000 and 192.168.11.50:4000 per master docs; only explorer.d-bis.org → 192.168.11.140 | +| Public blocks #2–#6 | Document in NETWORK_ARCHITECTURE / NETWORK_CONFIGURATION_MASTER when assigned or mark reserved | + +**Source:** [GAPS_AND_RECOMMENDATIONS_CONSOLIDATED.md](../GAPS_AND_RECOMMENDATIONS_CONSOLIDATED.md) + +--- + +## 19. dbis_core + +| Recommendation | Priority | +|----------------|----------| +| HSM Integration | Critical | +| Zero-Trust Authentication | Critical | +| Database Backups | Critical | +| Post-Quantum Cryptography Migration | Critical | +| Data Retention Policies | Critical | +| Database Connection Pooling, Caching, API Rate Limiting, Horizontal Scaling, Logging, Metrics | High | +| Query Optimization, Distributed Tracing, Test Coverage, Documentation | Medium | +| Microservices, Sharding, Refactoring | Low | + +**Source:** [dbis_core/docs/RECOMMENDATIONS.md](../../dbis_core/docs/RECOMMENDATIONS.md) + +--- + +## 20. Verification / optional tooling + +| Recommendation | Notes | +|----------------|-------| +| Optional tools for automation | sshpass, rsync, dig, ss, sqlite3, **wscat**, websocat, screen, tmux, htop, shellcheck, parallel | +| Run shellcheck | `bash scripts/verify/run-shellcheck.sh --optional` or install shellcheck and fix issues | +| E2E strict mode | Set `E2E_OPTIONAL_WHEN_FAIL=` (empty) for strict domain/RPC pass | +| Public RPC stability | `bash scripts/verify/check-public-rpc-stability-e2e.sh` | + +**Source:** [04-configuration/verification-evidence/NEXT_STEPS_RUN_*.md](../04-configuration/verification-evidence/), [09-troubleshooting/README.md](../09-troubleshooting/README.md) + +--- + +## Summary + +| Category | Approx. count | Master index | +|----------|---------------|--------------| +| Proxmox / validated set | 35 | ALL_IMPROVEMENTS_AND_GAPS_INDEX §1 | +| Code quality & scripts | 32 | §2 | +| Documentation | 7 + enhancements | §3, DOCUMENTATION_ENHANCEMENTS | +| Security, config, testing, DX | 25 | §4–7 | +| Infrastructure & deployment | 17 | §8 | +| Codebase & placeholders | 10 | §9 | +| MetaMask & explorer | 14 | §10 | +| Tezos / Etherlink / CCIP | 16 | §11 | +| Besu / blockchain | 5 | §12 | +| RPC translator | 4 | §13 | +| Orchestration portal | 4 | §14 | +| Maintenance | 5 | §15 | +| Operator checklist | 24 | RECOMMENDATIONS_OPERATOR_CHECKLIST | +| Snap pre-publish | 7 | PRE_PUBLISH_TESTING §9 | +| **Total distinct items** | **~139+** | | + +--- + +## Where to read more + +- **Derived views:** [ALL_RECOMMENDATIONS_HIGH_PRIORITY.md](ALL_RECOMMENDATIONS_HIGH_PRIORITY.md) (high-priority only) | [ALL_RECOMMENDATIONS_OPERATOR_ONLY.md](ALL_RECOMMENDATIONS_OPERATOR_ONLY.md) (operator/LAN checklist) +- **Legacy index (same 139 items):** [ALL_IMPROVEMENTS_AND_GAPS_INDEX.md](../ALL_IMPROVEMENTS_AND_GAPS_INDEX.md) — superseded by this doc +- **Gaps and placeholders:** [GAPS_AND_RECOMMENDATIONS_CONSOLIDATED.md](../GAPS_AND_RECOMMENDATIONS_CONSOLIDATED.md) +- **Operator checklist:** [RECOMMENDATIONS_OPERATOR_CHECKLIST.md](RECOMMENDATIONS_OPERATOR_CHECKLIST.md) +- **Operator/external-only (what to run from LAN):** [OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md](OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md) +- **Script header template:** [10-best-practices/SCRIPT_HEADER_TEMPLATE.md](../10-best-practices/SCRIPT_HEADER_TEMPLATE.md) +- **Best practices:** [10-best-practices/RECOMMENDATIONS_AND_SUGGESTIONS.md](../10-best-practices/RECOMMENDATIONS_AND_SUGGESTIONS.md), [10-best-practices/IMPLEMENTATION_CHECKLIST.md](../10-best-practices/IMPLEMENTATION_CHECKLIST.md) +- **Next steps / runbooks:** [NEXT_STEPS_AND_REMAINING_TODOS.md](NEXT_STEPS_AND_REMAINING_TODOS.md) +- **Optional index:** [OPTIONAL_RECOMMENDATIONS_INDEX.md](../OPTIONAL_RECOMMENDATIONS_INDEX.md) diff --git a/docs/00-meta/ALL_RECOMMENDATIONS_HIGH_PRIORITY.md b/docs/00-meta/ALL_RECOMMENDATIONS_HIGH_PRIORITY.md new file mode 100644 index 0000000..a0a3d87 --- /dev/null +++ b/docs/00-meta/ALL_RECOMMENDATIONS_HIGH_PRIORITY.md @@ -0,0 +1,136 @@ +# All Recommendations — High-Priority Only + +**Purpose:** Filtered view of high-priority and critical items from the canonical list. +**Canonical source:** [ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md](ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md) (~139 items, 20 sections). + +--- + +## 1. Proxmox / Validated Set (High) — Items 1–11 + +| # | Recommendation | Notes | +|---|----------------|------| +| 1 | Secure .env file permissions | `chmod 600 ~/.env` | +| 2 | Secure validator key permissions | chmod 600, chown besu | +| 3 | SSH key-based authentication (disable password) | | +| 4 | Firewall rules for Proxmox API (port 8006) | Restrict to specific IPs | +| 5 | Network segmentation (VLANs) | VLAN enablement phase | +| 6 | Basic metrics collection (Prometheus, Besu 9545) | | +| 7 | Health check monitoring + alerting | | +| 8 | Automated backup script + encrypted validator keys | | +| 9 | Backup configuration files + version control | | +| 10 | Integration tests for deployment scripts | | +| 11 | Runbooks (add/remove validator, upgrade Besu, key rotation, recovery, consensus) | | + +--- + +## 2. Code quality & scripts (High) — Items 36–37 + +| # | Recommendation | Priority | +|---|----------------|----------| +| 36 | Script shebang: standardize on `#!/usr/bin/env bash` | Medium | +| 37 | Error handling: standardize on `set -euo pipefail` + traps | **High** | + +--- + +## 3. Documentation (High) — Items 68, 70 + +| # | Recommendation | Priority | +|---|----------------|----------| +| 68 | Quick reference cards (network, VMID, commands, troubleshooting) | High | +| 70 | Configuration templates (ER605, Proxmox, Cloudflare, Besu) | High | + +--- + +## 4. Security — Items 48–52 + +| # | Recommendation | Priority | +|---|----------------|----------| +| 48 | Secret management audit (no hardcoded secrets, rotation, CI scanning) | High | +| 49 | Input validation in all scripts | High | +| 50 | Security scanning automation (CI, container image scanning) | High | +| 51 | Access control review (RBAC, least privilege) | Medium | +| 52 | Configuration validation (JSON/YAML schema, pre-deploy) | High | + +--- + +## 5. Configuration, testing & DX (High) — Item 67 + +| # | Recommendation | Priority | +|---|----------------|----------| +| 67 | Backup & recovery review and testing | High | + +--- + +## 6. Infrastructure & deployment (High) — Items 79–81 + +| # | Recommendation | Notes | +|---|----------------|------| +| 79 | Besu RPC — 2506–2508 destroyed 2026-02-08; replaced by new VMID structure; RPC 2500–2505 only. See MISSING_CONTAINERS_LIST.md | Done (doc) | +| 80 | Hyperledger (Firefly, Cacti, Fabric, Indy) containers | High/Medium | +| 81 | Blockscout (5000) container | High | + +--- + +## 7. Codebase & placeholders (Critical/High) — Items 82–86 + +| # | Recommendation | Priority | +|---|----------------|----------| +| 82 | Security audits (VLT-024, ISO-024) | **Critical** | +| 83 | Bridge integrations (BRG-VLT, BRG-ISO) | High | +| 84 | CCIP AMB full implementation | High | +| 85 | dbis_core TypeScript/Prisma fixes (~1186 errors) | High | +| 86 | IRU remaining tasks | High | + +--- + +## 8. RPC translator — Items 128–129 + +| # | Recommendation | Priority | +|---|----------------|----------| +| 128 | Client-side retry logic (exponential backoff, 502) | High | +| 129 | Set up monitoring/alerting | High | + +--- + +## 9. Orchestration portal (P0) — Item 131 + +| # | Recommendation | Priority | +|---|----------------|----------| +| 131 | P0: Auth, state, real-time, error handling, security headers, validation, testing, CI/CD | Must have | + +--- + +## 10. dbis_core (Critical) + +| Recommendation | Priority | +|----------------|----------| +| HSM Integration | Critical | +| Zero-Trust Authentication | Critical | +| Database Backups | Critical | +| Post-Quantum Cryptography Migration | Critical | +| Data Retention Policies | Critical | + +**Source:** [dbis_core/docs/RECOMMENDATIONS.md](../../dbis_core/docs/RECOMMENDATIONS.md) + +--- + +## 11. Operator checklist (R1–R24) + +Full operator actions: **[RECOMMENDATIONS_OPERATOR_CHECKLIST.md](RECOMMENDATIONS_OPERATOR_CHECKLIST.md)** and **[OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md](OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md)**. + +| # | Action | +|---|--------| +| R1–R3 | Verify contracts on Blockscout; keep CONTRACT_ADDRESSES_REFERENCE and ADDRESS_MATRIX_AND_STATUS updated; run check-contracts-on-chain-138.sh | +| R4–R7 | Use 0x971c... CCIPWETH9Bridge only; no .env/keys in repo; restrict deployer/RPC access | +| R8–R11 | RPC_URL_138; GAS_PRICE on 138; phased deploy; nonce/tx stuck runbooks | +| R12–R16 | Keep runbooks in sync; document addresses per chain; run verification after deploy; env per env | +| R17–R20 | Monitor bridges; Blockscout up; forge test pre-deploy; NatSpec | +| R21–R24 | The Order NPMplus; blocks #2–#6; script progress/dry-run/validation; token-mapping.json source of truth | + +--- + +## Where to read more + +- **Full list (all priorities):** [ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md](ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md) +- **Operator-only checklist:** [ALL_RECOMMENDATIONS_OPERATOR_ONLY.md](ALL_RECOMMENDATIONS_OPERATOR_ONLY.md) +- **Implementation checkboxes:** [10-best-practices/IMPLEMENTATION_CHECKLIST.md](../10-best-practices/IMPLEMENTATION_CHECKLIST.md) diff --git a/docs/00-meta/ALL_RECOMMENDATIONS_OPERATOR_ONLY.md b/docs/00-meta/ALL_RECOMMENDATIONS_OPERATOR_ONLY.md new file mode 100644 index 0000000..ca33ebf --- /dev/null +++ b/docs/00-meta/ALL_RECOMMENDATIONS_OPERATOR_ONLY.md @@ -0,0 +1,140 @@ +# All Recommendations — Operator-Only Checklist + +**Purpose:** Single checklist for all recommendations that require **LAN/Proxmox access**, **operator credentials**, **external services**, or **ongoing maintenance**. Use when you have operator or LAN access. + +**Sources:** [ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md](ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md) (items 1–11, 75–81, 98–99, 106–121, 135–139, R1–R24), [OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md](OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md), [RECOMMENDATIONS_OPERATOR_CHECKLIST.md](RECOMMENDATIONS_OPERATOR_CHECKLIST.md). + +--- + +## 1. Proxmox / security (LAN or host access) + +| # | Action | Command or notes | +|---|--------|------------------| +| 1 | Secure .env permissions | `chmod 600 .env` (and subproject .env files) | +| 2 | Secure validator key permissions | On host: `chmod 600` keys, `chown -R besu:besu` validator dirs | +| 3 | SSH key-only auth | On Proxmox/containers: `PasswordAuthentication no`, `PubkeyAuthentication yes` in sshd_config | +| 4 | Firewall for Proxmox API (8006) | Restrict to specific IPs (iptables or UDM Pro rules) | +| 5 | Network segmentation (VLANs) | Per NETWORK_ARCHITECTURE; switches, Proxmox bridges, ER605 | +| 6 | Metrics (Prometheus, Besu 9545) | Deploy Prometheus scrape; enable Besu metrics port | +| 7 | Health check + alerting | Configure Alertmanager / PagerDuty / Slack per MASTER_SECRETS | +| 8 | Automated backup + encrypted validator keys | Run backup script; store encrypted copies off-host | +| 9 | Backup configs + version control | Commit configs to repo or backup store from LAN | + +--- + +## 2. Deployment and runbooks (operator) + +| # | Action | When | +|---|--------|------| +| **Priority** | **Mainnet liquidity + ramps** | [MAINNET_LIQUIDITY_AND_RAMPS_PRIORITY.md](MAINNET_LIQUIDITY_AND_RAMPS_PRIORITY.md), [MAINNET_RAMP_USER_FLOWS.md](../04-configuration/MAINNET_RAMP_USER_FLOWS.md) | +| 10 | Integration tests for deployment scripts | Run from LAN against staging/dev | +| 11 | Runbooks: add/remove validator, upgrade Besu, key rotation, recovery, consensus | Document and run from LAN when needed | +| 12–20 | Error handling, logging, Loki, resource/network/DB tuning, CI/CD, CLI tool | Implement on infra from operator environment | + +--- + +## 3. Contracts and verification (R1–R3, R8–R9, R14) + +| # | Action | Command | +|---|--------|--------| +| R1 | Verify every deployed contract on Blockscout | After each deploy when Blockscout reachable | +| R2 | Keep CONTRACT_ADDRESSES_REFERENCE and ADDRESS_MATRIX_AND_STATUS updated | When new contracts deployed or deprecated | +| R3 | Run on-chain check | `./scripts/verify/check-contracts-on-chain-138.sh` (set RPC_URL_138 from LAN) | +| R8 | Set RPC_URL_138; run from LAN if 192.168.11.x not reachable | Before any deploy | +| R9 | Use GAS_PRICE=1000000000 (or current min) on Chain 138 | Every forge script on 138 | +| R14 | Run verification after deploy in CI | When Blockscout reachable from runner | + +--- + +## 4. Security and secrets (R4–R7, 48–52) + +| # | Action | Notes | +|---|--------|-------| +| R4 | Do not use deprecated CCIPWETH9Bridge; use 0x971c... and set env | Always | +| R5 | Never commit .env or private keys; rotate exposed keys | Always | +| R6 | API keys in .env.example placeholders | — | +| R7 | Restrict deployer key and RPC admin access | Access review | +| 48–52 | Secret audit, input validation, security scanning, RBAC, config validation | git-secrets, gitleaks, bandit, trivy as applicable | + +--- + +## 5. Documentation and runbooks (R12–R13, R15–R16) + +| # | Action | When | +|---|--------|------| +| R12 | Keep CONTRACT_DEPLOYMENT_RUNBOOK, BLOCKSCOUT_VERIFICATION_GUIDE in sync | After script/URL changes | +| R13 | Document addresses in CONTRACT_ADDRESSES_REFERENCE per chain | Per-chain deploy | +| R15 | Consider single script: check env → deploy → verify → update config | Automation | +| R16 | Use .env.development / .env.staging / .env.production or JSON per chain | Config hygiene | + +--- + +## 6. Monitoring and operations (R17–R18, 135–139) + +| # | Task | Frequency | +|---|------|-----------| +| R17 | Monitor critical bridge/oracle events | Ongoing | +| R18 | Ensure Blockscout (VMID 5000) up and /api reachable | Health checks | +| 135 | Monitor explorer sync status | Daily | +| 136 | Monitor RPC node health (e.g. VMID 2201) | Daily | +| 137 | Check config API uptime | Weekly | +| 138 | Review explorer logs | Weekly | +| 139 | Update token list | As needed | + +--- + +## 7. Testing and quality (R19–R20) + +| # | Action | When | +|---|--------|------| +| R19 | Run forge test before deploying; integration tests where available | Pre-deploy | +| R20 | NatSpec on public contract functions | Code quality | + +--- + +## 8. Configuration and DNS (R21–R22, infrastructure 75–81) + +| # | Action | When | +|---|--------|------| +| R21 | The Order / Sankofa NPMplus proxy host | When The Order portal deployed: add proxy; document in RPC_ENDPOINTS_MASTER, ALL_VMIDS_ENDPOINTS | +| R22 | Document or configure blocks #2–#6 in NETWORK_ARCHITECTURE | When decided | +| Sankofa cutover | Replace <TARGET_IP>, <TARGET_PORT>, TBDs in SANKOFA_CUTOVER_PLAN | When deployed | +| 75–81 | VLAN enablement, observability stack, CCIP fleet, sovereign tenants, missing containers | Per NEXT_STEPS_MASTER and deployment phases | + +--- + +## 9. Quick wins and token mapping (R23–R24) + +| # | Action | When | +|---|--------|------| +| R23 | Scripts: progress indicators; --dry-run; config validation | Script updates | +| R24 | Keep config/token-mapping.json as single source of truth for 138↔Mainnet | Adding tokens | + +--- + +## 10. External services and submissions + +| # | Action | Where | +|---|--------|-------| +| 98 | CoinGecko submission (Chain 138) | [CoinGecko](https://www.coingecko.com/) | +| 99 | Consensys outreach (Swaps/Bridge support) | MetaMask/Consensys channels | +| 106–108 | Verify Etherlink/Jumper/LiFi for chains 138, 651940, 42793 | External APIs / docs | +| 109–121 | Tezos/Etherlink contracts and relay services | Deploy and run from operator env | + +--- + +## 11. Optional tools (install for full automation) + +- **shellcheck** — `apt install shellcheck` or `brew install shellcheck` +- **wscat** — `npm i -g wscat` or `npx -y wscat` for WebSocket RPC tests +- **sqlite3, websocat, sshpass, dig, parallel** — per verification evidence NEXT_STEPS_RUN_*.md + +--- + +## Where to read more + +- **Full recommendations list:** [ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md](ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md) +- **High-priority only:** [ALL_RECOMMENDATIONS_HIGH_PRIORITY.md](ALL_RECOMMENDATIONS_HIGH_PRIORITY.md) +- **Operator runbook (copy-paste):** [NEXT_STEPS_OPERATOR.md](NEXT_STEPS_OPERATOR.md) +- **Operator ready checklist:** [OPERATOR_READY_CHECKLIST.md](../04-configuration/OPERATOR_READY_CHECKLIST.md) +- **Detailed operator/external:** [OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md](OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md) diff --git a/docs/00-meta/ARCHIVE_CANDIDATES.md b/docs/00-meta/ARCHIVE_CANDIDATES.md index 8539915..6f4232d 100644 --- a/docs/00-meta/ARCHIVE_CANDIDATES.md +++ b/docs/00-meta/ARCHIVE_CANDIDATES.md @@ -1,7 +1,7 @@ # Documentation Archive Candidates -**Last Updated:** 2026-02-08 -**Last reviewed:** 2026-02-20 +**Last Updated:** 2026-03-02 +**Last reviewed:** 2026-03-02 **Purpose:** List of docs/folders that may be archived to reduce clutter. Review before moving. **Use:** Run in full parallel with other Wave 1 doc tasks. See [FULL_PARALLEL_EXECUTION_ORDER.md](FULL_PARALLEL_EXECUTION_ORDER.md). @@ -44,3 +44,7 @@ **2026-02-16:** **Batch 3:** 3 Blitzkrieg dated exports (Blitzkrieg_Super_Pro_Max_Plan_2026-02-13.md, .txt, .json) → `archive/00-meta-pruned/`. Canonical plan remains `00-meta/BLITZKRIEG_SUPER_PRO_MAX_MASTER_PLAN.md`. **Note:** `DOCUMENTATION_FIXES_COMPLETE.md` does not exist; completed fixes are in [DOCUMENTATION_FIX_TASK_LIST.md](DOCUMENTATION_FIX_TASK_LIST.md). **2026-02-20:** **Batch 4:** 12 one-off/dated docs from 00-meta → `archive/00-meta-pruned/`: COMPLETION_STATUS_20260215, MASTER_DOCUMENTATION_REVIEW_20260205, DOCUMENTATION_REVIEW_20260216, DOCUMENTATION_REVIEW_CONTINUED_20260216, COMPREHENSIVE_DOCUMENTATION_REVIEW_2026-01-31, DOCUMENTATION_UPGRADE_SUMMARY, DOCUMENTATION_REVIEW, DOCUMENTATION_METRICS, DOCUMENTATION_RELATIONSHIP_MAP (duplicate of DOCUMENT_RELATIONSHIP_MAP), JNA_WHY_NOT_WORKING_REVIEW, VMID_2101_CHANGES_AND_FAILURES, COMPREHENSIVE_PROJECT_REVIEW. **Batch 5:** CONTINUE_AND_COMPLETE, FULL_PARALLEL_RUN_LOG → 00-meta-pruned. **Root cleanup:** ALL_TASKS_COMPLETE → archive/root-status-reports; 40+ root status/temp files + screenshots → [archive/root-cleanup-20260220/](../archive/root-cleanup-20260220/README.md). fix-wsl-ip.sh → scripts/. **Added:** DOCUMENTATION_CONSOLIDATION_PLAN, NEXT_STEPS_INDEX. See archive/00-meta-pruned/README.md Batches 4–5. + +**2026-03-02:** Review only. docs/MASTER_INDEX.md and docs/README.md created; RUNBOOKS_MASTER_INDEX.md added (redirect). Deprecated list in MASTER_INDEX. ALL_IMPROVEMENTS_AND_GAPS_INDEX remains as redirect; canonical = ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST. + +**2026-03-02:** **Review only.** No new files archived. docs/MASTER_INDEX.md and docs/README.md created; docs/RUNBOOKS_MASTER_INDEX.md added (redirect to OPERATIONAL_RUNBOOKS). Deprecated/superseded list documented in MASTER_INDEX § Deprecated. ALL_IMPROVEMENTS_AND_GAPS_INDEX remains in place as redirect stub; canonical list is 00-meta/ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md. diff --git a/docs/00-meta/BLITZKRIEG_SOURCE_DOCUMENT_INDEX.md b/docs/00-meta/BLITZKRIEG_SOURCE_DOCUMENT_INDEX.md deleted file mode 100644 index bb4ad68..0000000 --- a/docs/00-meta/BLITZKRIEG_SOURCE_DOCUMENT_INDEX.md +++ /dev/null @@ -1,53 +0,0 @@ -# Blitzkrieg — Source Document Index (Where to Update When Completed) - -**Purpose:** When you complete a task or close a gap from the [BLITZKRIEG_SUPER_PRO_MAX_MASTER_PLAN](BLITZKRIEG_SUPER_PRO_MAX_MASTER_PLAN.md) or the Blitzkrieg Execution Plan, update the corresponding source doc below so the repo stays in sync. This file is the single checklist for "where to update when completed." - -**Related:** [REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS](REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS.md) | [PLACEHOLDERS_AND_COMPLETION_MASTER_LIST](PLACEHOLDERS_AND_COMPLETION_MASTER_LIST.md) | [MASTER_PLAN](MASTER_PLAN.md) §8 - ---- - -## Index: Document → Path → When to update - -| Document | Path | When to update | -|----------|------|-----------------| -| REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS | [docs/00-meta/REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS.md](REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS.md) | Mark tasks/recommendations done; Part 1–4 | -| NOT_CHANGED_BY_DESIGN_ACTIONABLE_STEPS | [docs/00-meta/NOT_CHANGED_BY_DESIGN_ACTIONABLE_STEPS.md](NOT_CHANGED_BY_DESIGN_ACTIONABLE_STEPS.md) | Mark section steps done | -| GAPS_AND_RECOMMENDATIONS_CONSOLIDATED | [docs/GAPS_AND_RECOMMENDATIONS_CONSOLIDATED.md](../GAPS_AND_RECOMMENDATIONS_CONSOLIDATED.md) | Close security/config/code gaps | -| PLACEHOLDERS_AND_COMPLETION_MASTER_LIST | [docs/00-meta/PLACEHOLDERS_AND_COMPLETION_MASTER_LIST.md](PLACEHOLDERS_AND_COMPLETION_MASTER_LIST.md) | Mark placeholder completed; §13 "Where to update" | -| CONTRACT_NEXT_STEPS_AND_RECOMMENDATIONS_COMPLETE | [docs/11-references/CONTRACT_NEXT_STEPS_AND_RECOMMENDATIONS_COMPLETE.md](../11-references/CONTRACT_NEXT_STEPS_AND_RECOMMENDATIONS_COMPLETE.md) | Operator/pending status | -| TEZOS_CCIP_REMAINING_ITEMS | [docs/07-ccip/TEZOS_CCIP_REMAINING_ITEMS.md](../07-ccip/TEZOS_CCIP_REMAINING_ITEMS.md) | External/contracts/off-chain/routing/DON/monitoring/testing | -| REQUIRED_FIXES_UPDATES_GAPS | [docs/REQUIRED_FIXES_UPDATES_GAPS.md](../REQUIRED_FIXES_UPDATES_GAPS.md) | Build/canonical/placeholders/docs/tests | -| ALL_REQUIREMENTS | [docs/00-meta/ALL_REQUIREMENTS.md](ALL_REQUIREMENTS.md) | Foundation, security, deployment blocks | -| CONTRACT_ADDRESSES_REFERENCE | [docs/11-references/CONTRACT_ADDRESSES_REFERENCE.md](../11-references/CONTRACT_ADDRESSES_REFERENCE.md) | New/deprecated addresses; canonical source | -| CONTRACT_INVENTORY_AND_VERIFICATION | [docs/11-references/CONTRACT_INVENTORY_AND_VERIFICATION.md](../11-references/CONTRACT_INVENTORY_AND_VERIFICATION.md) | Deployed/verified status | -| BLITZKRIEG_SUPER_PRO_MAX_MASTER_PLAN | [docs/00-meta/BLITZKRIEG_SUPER_PRO_MAX_MASTER_PLAN.md](BLITZKRIEG_SUPER_PRO_MAX_MASTER_PLAN.md) | §2 three-column table; §3 numbered trail; §5 phase/category | -| MASTER_PLAN / MASTER_INDEX | [docs/00-meta/MASTER_PLAN.md](MASTER_PLAN.md), [docs/MASTER_INDEX.md](../MASTER_INDEX.md) | Link to Blitzkrieg; §8 file summary | -| STEPS_FROM_PROXMOX_OR_LAN_WITH_SECRETS | [docs/00-meta/STEPS_FROM_PROXMOX_OR_LAN_WITH_SECRETS.md](STEPS_FROM_PROXMOX_OR_LAN_WITH_SECRETS.md) | When LAN/Proxmox steps change | -| OPERATOR_OPTIONAL_CHECKLIST | [docs/11-references/OPERATOR_OPTIONAL_CHECKLIST.md](../11-references/OPERATOR_OPTIONAL_CHECKLIST.md) | Blockscout, trustless, mainnet, CREATE2, Vault, Dodo, etc. | -| PLACEHOLDERS_AND_TBD | [docs/00-meta/PLACEHOLDERS_AND_TBD.md](../PLACEHOLDERS_AND_TBD.md) | AlltraAdapter fee; other TBDs | -| TOKEN_MAPPING_AND_MAINNET_ADDRESSES | [docs/07-ccip/TOKEN_MAPPING_AND_MAINNET_ADDRESSES.md](../07-ccip/TOKEN_MAPPING_AND_MAINNET_ADDRESSES.md) | Token mapping (138↔Mainnet); relay-supported tokens; when adding tokens update this and config/token-mapping.json | -| REMAINING_WORK_BREAKDOWN_AND_ANSWERS | [docs/00-meta/REMAINING_WORK_BREAKDOWN_AND_ANSWERS.md](REMAINING_WORK_BREAKDOWN_AND_ANSWERS.md) | Per-item breakdown: prerequisites, owner, steps to complete, where to update; add "Done [date]" when item completed | -| token-mapping.json | [config/token-mapping.json](../../config/token-mapping.json) | Single source of truth for Chain 138↔Mainnet token addresses; add/update entries when adding tokens or enabling relay for LINK | - ---- - -## Key operator commands (Blitzkrieg steps) - -| Step | Action | Command | -|------|--------|---------| -| 0 | Config validation | `./scripts/validation/validate-config-files.sh` | -| 0 / 16 | Completable from anywhere (all 4 steps) | `./scripts/run-completable-tasks-from-anywhere.sh` [`--dry-run`] | -| 11 | On-chain check (Chain 138, 36 addresses) | `./scripts/verify/check-contracts-on-chain-138.sh` (uses `RPC_URL_138`; optional arg overrides) | -| 11 | Blockscout source verification | `source smom-dbis-138/.env 2>/dev/null; ./scripts/verify/run-contract-verification-with-proxy.sh` | - -Full command list: [REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS](REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS.md) Part 3. - ---- - -## Quick reference - -- **Tasks 1–30 / R1–R24:** Update [REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS](REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS.md). -- **Code placeholders (AlltraAdapter, Smart accounts, TezosRelay, etc.):** Update [NOT_CHANGED_BY_DESIGN_ACTIONABLE_STEPS](NOT_CHANGED_BY_DESIGN_ACTIONABLE_STEPS.md) and [PLACEHOLDERS_AND_COMPLETION_MASTER_LIST](PLACEHOLDERS_AND_COMPLETION_MASTER_LIST.md). -- **New contract / address:** Update [CONTRACT_ADDRESSES_REFERENCE](../11-references/CONTRACT_ADDRESSES_REFERENCE.md) and [CONTRACT_INVENTORY_AND_VERIFICATION](../11-references/CONTRACT_INVENTORY_AND_VERIFICATION.md). -- **New token or bridge in the march:** Update [BLITZKRIEG_SUPER_PRO_MAX_MASTER_PLAN](BLITZKRIEG_SUPER_PRO_MAX_MASTER_PLAN.md) §2 (three-column table) and §3 (numbered trail). -- **New token (Chain 138 or bridged):** Update [config/token-mapping.json](../../config/token-mapping.json) and optionally [TOKEN_MAPPING_AND_MAINNET_ADDRESSES](../07-ccip/TOKEN_MAPPING_AND_MAINNET_ADDRESSES.md), [CHAIN138_TOKEN_ADDRESSES](../11-references/CHAIN138_TOKEN_ADDRESSES.md). diff --git a/docs/00-meta/COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md b/docs/00-meta/COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md new file mode 100644 index 0000000..b67c802 --- /dev/null +++ b/docs/00-meta/COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md @@ -0,0 +1,72 @@ +# Complete Required, Optional, and Recommended — Index + +**Purpose:** Single entry point for the full execution plan (required, optional, and recommended work). Execution order: Wave 0 → Wave 1 → Wave 2 → Wave 3 → Ongoing. + +**Sources:** [PHASES_AND_TASKS_MASTER.md](PHASES_AND_TASKS_MASTER.md), [TODO_TASK_LIST_MASTER.md](TODO_TASK_LIST_MASTER.md), [ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md](ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md), [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md), [FULL_PARALLEL_EXECUTION_ORDER.md](FULL_PARALLEL_EXECUTION_ORDER.md). + +--- + +## Wave 0 — Gates (do first when creds allow) + +| Task | Blocker | Command / doc | +|------|---------|----------------| +| W0-1 NPMplus RPC fix (405) | Host on LAN (192.168.11.x) | [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md) § W0-1. `bash scripts/run-wave0-from-lan.sh` or `bash scripts/nginx-proxy-manager/update-npmplus-proxy-hosts-api.sh`. | +| W0-2 sendCrossChain (real) | PRIVATE_KEY, LINK approved | [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md) § W0-2. `bash scripts/bridge/run-send-cross-chain.sh [recipient]`. Bridge: `0x971cD9D156f193df8051E48043C476e53ECd4693`. | +| W0-3 NPMplus backup | NPM_PASSWORD in .env | [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md) § W0-3. `bash scripts/verify/backup-npmplus.sh` or `scripts/run-wave0-from-lan.sh`. | + +--- + +## Required work + +- **Deployment phases:** [PHASES_AND_TASKS_MASTER.md](PHASES_AND_TASKS_MASTER.md) — Phase 2 (observability), Phase 3 (CCIP fleet), Phase 4 (sovereign tenants). Runbooks: [OPERATIONAL_RUNBOOKS.md](../03-deployment/OPERATIONAL_RUNBOOKS.md). +- **Codebase:** smom audits (VLT-024, ISO-024), bridge integrations (BRG-VLT, BRG-ISO); dbis_core IRU + [DBIS_CORE_TS_FIXES_DETAILED_LIST.md](DBIS_CORE_TS_FIXES_DETAILED_LIST.md); OMNIS per PHASES_AND_TASKS_MASTER. +- **Security & verification:** [RECOMMENDATIONS_OPERATOR_CHECKLIST.md](RECOMMENDATIONS_OPERATOR_CHECKLIST.md) R1–R24; [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md) § W1-1, W1-2. + +--- + +## Optional work + +- **Infrastructure:** Phase 1 VLAN, NPMplus HA. (2506–2508 destroyed 2026-02-08; RPC 2500–2505 only.) [OPTIONAL_RECOMMENDATIONS_INDEX.md](../OPTIONAL_RECOMMENDATIONS_INDEX.md), [MISSING_CONTAINERS_LIST.md](../03-deployment/MISSING_CONTAINERS_LIST.md), [NPMPLUS_HA_SETUP_GUIDE.md](../04-configuration/NPMPLUS_HA_SETUP_GUIDE.md). +- **Docs/tooling:** Documentation consolidation; Paymaster deploy when ready. +- **MetaMask/explorer:** Token-aggregation, CoinGecko, Snap features, explorer enhancements. [COINGECKO_SUBMISSION.md](../../smom-dbis-138/services/token-aggregation/docs/COINGECKO_SUBMISSION.md). + +--- + +## Recommended work (139+ items) + +- **Full list:** [ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md](ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md) (20 sections). +- **High priority only:** [ALL_RECOMMENDATIONS_HIGH_PRIORITY.md](ALL_RECOMMENDATIONS_HIGH_PRIORITY.md). +- **Operator-only (LAN/creds/external):** [OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md](OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md). +- **Parallel order:** [FULL_PARALLEL_EXECUTION_ORDER.md](FULL_PARALLEL_EXECUTION_ORDER.md). + +--- + +## Execution order summary + +1. **Wave 0:** W0-1, W0-2, W0-3 when LAN/creds available. +2. **Wave 1 (parallel):** [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md) "Can Be Accomplished Now"; validation: `bash scripts/verify/run-all-validation.sh [--skip-genesis]`, `scripts/validation/validate-config-files.sh`. +3. **Wave 2 / Wave 3:** [WAVE2_WAVE3_OPERATOR_CHECKLIST.md](WAVE2_WAVE3_OPERATOR_CHECKLIST.md). +4. **Ongoing:** Maintenance 135–139; `schedule-daily-weekly-cron.sh --install`. + +--- + +## Fixes status (in-repo) + +All required fixes in [REQUIRED_FIXES_UPDATES_GAPS.md](../REQUIRED_FIXES_UPDATES_GAPS.md) §§1–6 are **Done** or **Documented**. Placeholders (canonical addresses, AlltraAdapter, smart accounts, quote FABRIC_CHAIN_ID, .bak) are complete per that doc. Remaining work: operator/LAN tasks, deferred dbis_core TS (~1186), and external (audits, Ledger, CoinGecko). + +**Still not done — execution checklist:** [STILL_NOT_DONE_EXECUTION_CHECKLIST.md](STILL_NOT_DONE_EXECUTION_CHECKLIST.md) — copy-paste commands and links for every operator/LAN, dbis_core TS, security-audit, external, and maintenance item. + +--- + +## Key references + +| Purpose | Document | +|---------|----------| +| Step-by-step for every task | [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md) | +| Copy-paste operator runbook | [NEXT_STEPS_OPERATOR.md](NEXT_STEPS_OPERATOR.md) | +| Master task list | [TODO_TASK_LIST_MASTER.md](TODO_TASK_LIST_MASTER.md) | +| Required fixes (all Done/Documented) | [REQUIRED_FIXES_UPDATES_GAPS.md](../REQUIRED_FIXES_UPDATES_GAPS.md) | +| Still not done (operator/external/TS) | [STILL_NOT_DONE_EXECUTION_CHECKLIST.md](STILL_NOT_DONE_EXECUTION_CHECKLIST.md) | +| Breakdown: missing info per task | [REMAINING_TASKS_BREAKDOWN_MISSING_INFO.md](REMAINING_TASKS_BREAKDOWN_MISSING_INFO.md) | +| dbis_core TS fixes (deferred) | [DBIS_CORE_TS_FIXES_DETAILED_LIST.md](DBIS_CORE_TS_FIXES_DETAILED_LIST.md) | +| DBIS Rail + project completion (status and full task list, required + optional) | [DBIS_RAIL_AND_PROJECT_COMPLETION_MASTER_V1.md](../dbis-rail/DBIS_RAIL_AND_PROJECT_COMPLETION_MASTER_V1.md) | diff --git a/docs/00-meta/CW_BRIDGE_TASK_LIST.md b/docs/00-meta/CW_BRIDGE_TASK_LIST.md new file mode 100644 index 0000000..8ab9dd5 --- /dev/null +++ b/docs/00-meta/CW_BRIDGE_TASK_LIST.md @@ -0,0 +1,118 @@ +# cW* Bridge Support — Detailed Task List + +**Created:** 2026-02-27 +**Updated:** 2026-02-27 — In-repo tasks completed (Phase A, C1, F); operator tasks (D, E, C2–C3) have runbook. +**Context:** After setting `CW_BRIDGE_` from the deployed bridge suite (CCIPRelayBridge on Mainnet, CCIPWETH9_BRIDGE_* on other chains), this document reviews the note that those contracts may need extension for cW* and turns it into a concrete task list. + +**Completion summary (in-repo):** Phase A (approach decided and documented), Phase C1 (CompliantWrappedToken.burnFrom added, tests added), Phase F (docs and runbook). Phase B marked N/A (Option 2 chosen). **Remaining steps script:** [run-cw-remaining-steps.sh](../../scripts/deployment/run-cw-remaining-steps.sh) — `--dry-run` (default), `--deploy`, `--update-mapping`, `--verify`. Phase D/E and C2–C3: run script with `--deploy` when RPC/keys are set; then set CWUSDT_*/CWUSDC_* in .env and run `--update-mapping`; see [CW_DEPLOY_AND_WIRE_RUNBOOK.md](../07-ccip/CW_DEPLOY_AND_WIRE_RUNBOOK.md). + +--- + +## 1. Note reviewed + +**Note (from previous setup):** +*"Mainnet uses CCIPRelayBridge; other chains use CCIPWETH9_BRIDGE_*. Those contracts are currently WETH-oriented; if they do not yet implement cW* mint/burn, they will need to be extended (or replaced with a cW*-capable receiver) before cW* transfers work."* + +**Verification (checks performed):** + +| Check | Result | +|-------|--------| +| **CCIPRelayBridge.sol** (Mainnet) | `ccipReceive` only accepts `message.tokenAmounts[0].token == weth9` and does `IERC20(weth9).transfer(recipient, amount)`. **Does not call any cW*.mint().** | +| **CCIPWETH9Bridge.sol** (all chains) | Same: validates token == weth9, then `transfer(recipient, amount)`. **Does not mint cW*.** | +| **CCIPWETH10Bridge.sol** | Same for WETH10; no cW* logic. | +| **CompliantWrappedToken.sol** | Has `mint`, `burn`, and `burnFrom` (BURNER_ROLE). `burnFrom` added in Phase C1 for TwoWayTokenBridgeL2 outbound. | +| **TwoWayTokenBridgeL2.sol** | `ccipReceive` calls `IMintableERC20(mirroredToken).mint(recipient, amount)` — **would mint cW*** if `mirroredToken` = cWUSDT/cWUSDC. Outbound uses `burnFrom`; CompliantWrappedToken does not implement `burnFrom`. | +| **DeployCWTokens.s.sol** | Grants MINTER_ROLE and BURNER_ROLE to `CW_BRIDGE_ADDRESS` (per-chain in .env). So the *address* we set will have roles, but the *contract code* at that address (CCIPWETH9Bridge/CCIPRelayBridge) never calls `mint`/`burn` on cW*. | + +**Conclusion:** The current bridge suite is **WETH-only**. Granting MINTER/BURNER to it allows deployment of cW* but **does not** enable cross-chain mint/burn of cW* until the receiver logic is extended or a dedicated cW* receiver is deployed. + +--- + +## 2. Checks performed (summary) + +- [x] **Contract audit:** CCIPRelayBridge, CCIPWETH9Bridge, CCIPWETH10Bridge — ccipReceive only transfers the received token (WETH9/WETH10), no mint path. +- [x] **CompliantWrappedToken:** mint/burn roles and interface; no burnFrom. +- [x] **TwoWayTokenBridgeL2:** Mint-on-receive pattern; requires burnFrom for outbound. +- [x] **.env:** CW_BRIDGE_ set from existing deployed addresses (Mainnet, Cronos, BSC, Polygon, Gnosis, Avalanche, Base, Arbitrum, Optimism). +- [x] **Deploy path:** DeployCWTokens grants roles to CW_BRIDGE_*; deploy script uses per-chain bridge from .env. + +--- + +## 3. Detailed task list + +### Phase A: Decide and document approach + +| # | Task | Owner | Notes | Status | +|---|------|--------|-------|--------| +| A1 | **Decide cW* receive strategy:** (1) Extend existing CCIPWETH9Bridge/CCIPRelayBridge to support cW* mint in ccipReceive, or (2) Deploy dedicated cW* receiver per chain (e.g. TwoWayTokenBridgeL2 or new CCIPReceiverCW). | Operator/Dev | Option 2 chosen. | ✅ Done | +| A2 | **Document chosen approach** in `docs/07-ccip/CW_BRIDGE_APPROACH.md` (create): flow 138→chain (lock c* on 138, mint cW* on dest), chain→138 (burn cW*, release c*), and which contract(s) implement receive/send. | Dev | | ✅ Done | + +### Phase B: Contract changes (if extending existing bridge) + +**Not applied** — Option 2 (dedicated receiver) chosen; Phase B is the alternative path if extending existing bridges instead. + +| # | Task | Owner | Notes | Status | +|---|------|--------|-------|--------| +| B1 | **Design bridge extension:** In CCIPWETH9Bridge (and/or CCIPRelayBridge), allow ccipReceive to accept more than WETH9: e.g. token whitelist (cWUSDT, cWUSDC) and on receive either transfer (if token is WETH9) or mint (if token is cW* and bridge has MINTER_ROLE). | Dev | Match data encoding (recipient, amount, sender, nonce) with existing. | N/A (Option 2) | +| B2 | **Implement and test:** Add tests for ccipReceive with token = cWUSDT and assert cWUSDT.mint(recipient, amount) and balance increase. | Dev | | N/A (Option 2) | +| B3 | **Deploy upgraded bridge** (or new implementation + upgrade if proxy) on each chain; update .env and config if address changes. | Operator | If new contract, set CW_BRIDGE_ to new address and re-grant MINTER/BURNER on cW* to new bridge. | N/A (Option 2) | + +### Phase C: Contract changes (if dedicated cW* receiver) + +| # | Task | Owner | Notes | Status | +|---|------|--------|-------|--------| +| C1 | **CompliantWrappedToken:** Add `burnFrom(address from, uint256 amount)` that checks BURNER_ROLE and calls `burn(from, amount)` (or implement ERC20Burnable and grant BURNER to bridge). | Dev | Required if using TwoWayTokenBridgeL2 for outbound. | ✅ Done | +| C2 | **Deploy TwoWayTokenBridgeL2** (or new CCIPReceiverCW) per chain: constructor(router, cWUSDT, feeToken). Configure destination (Chain 138 selector, L1 bridge address). | Operator | TwoWayTokenBridgeL2 is not upgradeable; one deployment per (chain, token) or generic with token in message. See [CW_DEPLOY_AND_WIRE_RUNBOOK.md](CW_DEPLOY_AND_WIRE_RUNBOOK.md). | Pending | +| C3 | **Point CW_BRIDGE_ to new receiver** and re-run DeployCWTokens so MINTER/BURNER are on the new receiver, or grant roles to new receiver after deploy. | Operator | If receiver is separate from CCIPWETH9_BRIDGE, set CW_BRIDGE_ to receiver address. | Pending | +| C4 | **Chain 138 send side:** Ensure a sender/bridge on 138 sends CCIP messages with receiver = new cW* receiver on destination and data encoding (recipient, amount). | Dev/Operator | Documented in [CW_BRIDGE_APPROACH.md](../07-ccip/CW_BRIDGE_APPROACH.md). | ✅ Documented | + +### Phase D: Deploy cW* and wire config + +| # | Task | Owner | Notes | Status | +|---|------|--------|-------|--------| +| D1 | **Run cW* deploy** on each target chain: `./scripts/deployment/deploy-tokens-and-weth-all-chains-skip-canonical.sh --deploy-cw` (with CW_BRIDGE_ already set). | Operator | Records CWUSDT_, CWUSDC_ in script output. Runbook: [CW_DEPLOY_AND_WIRE_RUNBOOK.md](../07-ccip/CW_DEPLOY_AND_WIRE_RUNBOOK.md) § D1. | Operator | +| D2 | **Set CWUSDT_ and CWUSDC_** in smom-dbis-138/.env from deploy output for each chain. | Operator | Runbook § D2. | Operator | +| D3 | **Update token-mapping-multichain.json** for each chain: set `addressTo` for Compliant_USDT_cW, Compliant_USDC_cW (and Compliant_EURC_cW if deployed) from CWUSDT_*/CWUSDC_* addresses. | Operator | Replace 0x0 placeholders. Runbook § D3. | Operator | +| D4 | **Verify on-chain:** On each chain, confirm cWUSDT/cWUSDC exist, and bridge/receiver address has MINTER_ROLE and BURNER_ROLE. | Operator | Runbook § D4. | Operator | + +### Phase E: Relay and send path (138 → other chains) + +| # | Task | Owner | Notes | Status | +|---|------|--------|-------|--------| +| E1 | **Relay service (138→Mainnet):** If using CCIPRelayBridge for cW*, extend relay to support cUSDT/cUSDC: relay must send CCIP with token = cUSDT (or lock-and-mint semantics) and destination = Mainnet bridge; Mainnet bridge must mint cWUSDT. | Operator/Dev | See RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK.md pattern (extend bridge or new receiver). Runbook § E1. | Operator | +| E2 | **Direct CCIP (138→chain):** If Chain 138 uses UniversalCCIPBridge or CCIPWETH9Bridge to send c* to destination, add destination config for c* and ensure receiver on destination mints cW*. | Dev | Documented in approach; runbook § E2. | Documented | +| E3 | **Test E2E:** Lock cUSDT on 138, trigger send, verify cWUSDT minted on destination to recipient. | Operator | Runbook § E3. | Operator | + +### Phase F: Documentation and runbooks + +| # | Task | Owner | Notes | Status | +|---|------|--------|-------|--------| +| F1 | **Update docs/11-references/CW_TOKENS_AND_NETWORKS.md:** Add section "Bridge support status" — which chains have bridge code that mints cW* (none until Phase B or C done). | Dev | | ✅ Done | +| F2 | **Update docs/04-configuration/C_TO_CW_MAPPER_MAPPING.md:** Note that addressTo for _cW is 0x0 until cW* deployed and that bridge must support mint. | Dev | | ✅ Done | +| F3 | **Create runbook** (e.g. docs/07-ccip/CW_DEPLOY_AND_WIRE_RUNBOOK.md): steps to deploy cW* on a new chain, set CW_BRIDGE_, update token-mapping, verify roles. | Dev | | ✅ Done | + +--- + +## 4. Dependency order + +1. **A1 → A2** (decide approach, document). +2. **A1 → B or C** (implementation depends on choice). +3. **B or C → D1** (deploy cW* after bridge/receiver can mint; or deploy cW* and grant roles to existing bridge, then extend bridge later so it actually mints). +4. **D1 → D2, D3, D4** (config and verify). +5. **D + (B or C) → E** (send path and relay). +6. **F** can be done in parallel or after each phase. + +**Minimal path to “cW* deployed and roles set” (no cross-chain mint yet):** D1, D2, D4 — already possible with current .env. To **actually mint cW* on receive**, complete Phase A, then B or C, then E. + +--- + +## 5. References + +- [CW_TOKENS_AND_NETWORKS.md](../11-references/CW_TOKENS_AND_NETWORKS.md) +- [C_TO_CW_MAPPER_MAPPING.md](../04-configuration/C_TO_CW_MAPPER_MAPPING.md) +- [CW_BRIDGE_APPROACH.md](../07-ccip/CW_BRIDGE_APPROACH.md) — Chosen approach (Option 2) and flows. +- [CW_DEPLOY_AND_WIRE_RUNBOOK.md](../07-ccip/CW_DEPLOY_AND_WIRE_RUNBOOK.md) — Operator steps for D1–D4, E1–E3. +- [RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK.md](../07-ccip/RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK.md) (pattern for extending bridge) +- `smom-dbis-138/contracts/relay/CCIPRelayBridge.sol`, `contracts/ccip/CCIPWETH9Bridge.sol` +- `smom-dbis-138/contracts/bridge/TwoWayTokenBridgeL2.sol` +- `smom-dbis-138/contracts/tokens/CompliantWrappedToken.sol` (includes `burnFrom` for TwoWayTokenBridgeL2) diff --git a/docs/00-meta/DBIS_CORE_TS_FIXES_DETAILED_LIST.md b/docs/00-meta/DBIS_CORE_TS_FIXES_DETAILED_LIST.md new file mode 100644 index 0000000..158f161 --- /dev/null +++ b/docs/00-meta/DBIS_CORE_TS_FIXES_DETAILED_LIST.md @@ -0,0 +1,184 @@ +# dbis_core ~1186 TypeScript Errors (Deferred) — Detailed Fix List + +**Status:** Deferred (W1-14) +**References:** [TODO_TASK_LIST_MASTER.md](TODO_TASK_LIST_MASTER.md) §8, [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md) W1-14, [dbis_core/TYPESCRIPT_FIXES_PRIORITIZED_PLAN.md](../../dbis_core/TYPESCRIPT_FIXES_PRIORITIZED_PLAN.md), [dbis_core/PROMPT_TYPESCRIPT_FIXES_PHASES_1_4.md](../../dbis_core/PROMPT_TYPESCRIPT_FIXES_PHASES_1_4.md) + +**Context:** Phases 1–4 were executed (2026-01-31); ~1186 TS errors remain. Remaining errors are in **defi**, **exchange**, **governance/msgf**, **gateway**, and other modules. + +--- + +## 1. Prerequisites (Do First) + +| # | Fix | Action | +|---|-----|--------| +| 1.1 | **Prisma client** | In `dbis_core/`: run `npx prisma generate` (or `pnpm exec prisma generate`) to fix `@prisma/client` types. If you see `MODULE_NOT_FOUND` for prisma, run `pnpm install` from repo root (or `cd dbis_core && pnpm install`) so Prisma is available, then retry. | +| 1.2 | **Verification** | After any batch of fixes, run `pnpm exec tsc --noEmit` (or `npx tsc --noEmit`) in `dbis_core/` to confirm error count. | +| 1.3 | **Sample reference** | A sample fix was applied in `dbis_core/src/core/admin/dbis-admin/dashboards/cbdc-fx.service.ts`; use as pattern for Prisma/Decimal and explicit return types. | + +--- + +## 2. Priority 1 — Quick Wins (Est. ~50–70 errors) + +### 2.1 Missing Imports (~10–15 errors) + +- **Pattern:** Add missing imports. +- **Imports to add where used:** + - `import { v4 as uuidv4 } from 'uuid'` + - `import { Decimal } from '@prisma/client/runtime/library'` (or project’s Decimal source) + - `import { Prisma } from '@prisma/client'` +- **Example files:** + `mrecp-harmonization.service.ts`, `multiverse-fx.service.ts`, `multiverse-ssu.service.ts`, and any file using `uuidv4`/`Decimal`/`Prisma` without import. + +### 2.2 Missing Return Statements in Routes (~30–40 errors) + +- **Pattern:** Add `return` before `res.json()`, `res.status().json()`, and `next(error)` in Express route handlers. +- **Example files:** + `dbis-admin.routes.ts`, `scb-admin.routes.ts`, `beie.routes.ts`, `gase.routes.ts`, `rssck.routes.ts`, and all other `*.routes.ts`. + +### 2.3 Simple Type Assertions (~10–15 errors) + +- **Pattern:** Use `as unknown as TargetType` when TS rejects direct cast (e.g. `request as Record` → `request as unknown as Record`). + +--- + +## 3. Priority 2 — Pattern-Based Fixes (Est. ~200–250 errors) + +### 3.1 JsonValue Type Mismatches (~100–120 errors) + +- **Pattern:** Cast to `Prisma.InputJsonValue` when assigning to Prisma `Json` fields. + - `Record` → `as Prisma.InputJsonValue` + - Nullable: `value ? (value as Prisma.InputJsonValue) : Prisma.JsonNull` + - `JsonValue` → `as Prisma.InputJsonValue` +- **High-impact files:** + `uhem-encoding.service.ts`, `defi-module.service.ts`, `gdsl-clearing.service.ts`, `gsds-contract.service.ts`, `msgf-*.service.ts` (governance/msgf), and ~40–50 other files. + +### 3.2 Property Access on Unknown Types (~80–100 errors) + +- **Pattern:** Add type assertions or type guards: e.g. `(data as Record).property` or specific interfaces. +- **High-impact files:** + `reporting-engine.service.ts`, `sandbox.service.ts`, `supervision-engine.service.ts`, and ~30–40 other files. + +### 3.3 Type Conversion via Unknown (~50–70 errors) + +- **Pattern:** Use `as unknown as TargetType` for conversions TS rejects. +- **Example files:** + `corridor-controls.service.ts`, `gru-controls.service.ts`, `network-controls.service.ts`, `dscn-aml-scanner.service.ts`, `rssck.service.ts`, and ~20–30 other files. + +--- + +## 4. Priority 3 — Type System Fixes (Est. ~150–200 errors) + +### 4.1 Missing Properties on Prisma Types (~60–80 errors) + +- **Pattern:** Use correct Prisma schema field names and/or add `include` for relations; use type assertions only when schema is correct but types are narrow. +- **Common issues:** + - Use `indexValue` not `price` on index history; include relations for `bondName`/`bondCode`; verify `circuitBreakerEnabled` and filterable fields (e.g. `createdAt`). +- **High-impact files:** + `global-overview.service.ts`, `gru-command.service.ts`, `cbdc-fx.service.ts`, `supervisory-ai.service.ts`, and ~25–35 other files. + +### 4.2 Prisma UpdateMany Property Errors (~10–15 errors) + +- **Pattern:** Use correct Prisma update input types; use `update` instead of `updateMany` if the field is not in `*UpdateManyMutationInput`. +- **Known issues:** + - `circuitBreakerEnabled` not in `GruIndexUpdateManyMutationInput`; `issuanceWindowOpen` not in `GruBondUpdateManyMutationInput`. +- **Files:** + `gru-controls.service.ts` and ~3–5 other files. + +### 4.3 Request Type Extensions (~20–30 errors) + +- **Pattern:** Extend Express `Request` (e.g. in `src/types/express.d.ts`) with `sovereignBankId?: string`, or use `(req as { sovereignBankId?: string }).sovereignBankId`. +- **Files:** + `dbis-admin.routes.ts`, `scb-admin.routes.ts`, and ~10–15 other route files. + +### 4.4 Null Safety (~15–20 errors) + +- **Pattern:** Add optional chaining (`?.`), null checks, or non-null assertion (`!`) where “possibly null” is reported. +- **Example files:** + `gru-command.service.ts`, `multiverse-fx.service.ts`, `uhem-analytics.service.ts`, and ~10–15 other files. + +--- + +## 5. Priority 4 — Schema & Property Fixes (Est. ~100–150 errors) + +### 5.1 Prisma Schema Mismatches (~30–40 errors) + +- **Pattern:** Align code with `prisma/schema.prisma` model and field names; do not change schema unless a field is truly missing. +- **Known mappings:** + - `prisma.settlement` → `prisma.gasSettlement` (or correct model per schema); + - `prisma.commodityToken` — verify existence; + - `prisma.aiAutonomousAction` → `prisma.aIAutonomousAction` (or actual schema name); + - Missing fields: e.g. `divergenceAmount`, `realityId` — add to schema only if required. +- **Files:** + `legal-harmonization.service.ts`, `trade-harmonization.service.ts`, `scdc-ai-mandate.service.ts`, `mrecp-convergence.service.ts`, and ~15–20 other files. + +### 5.2 Complex Type Assignments (~40–50 errors) + +- **Pattern:** Fix array/object type mismatches (e.g. missing `id` or required fields), object spread types, and function parameter types. +- **Files:** + `global-overview.service.ts`, `gdsl-contract.service.ts`, `gsds-contract.service.ts`, `multiverse-fx.service.ts`, and ~20–25 other files. + +### 5.3 Decimal Type Operations (~5–10 errors) + +- **Pattern:** Use Decimal API: e.g. `decimal.plus(n)` instead of `decimal + n`, `decimal.toString()` for string conversion. +- **Files:** + `regulatory-equivalence.service.ts`, `zk-balance-proof.service.ts`, and ~3–5 other files. + +--- + +## 6. Implicit `any` and Callbacks (Documented Strategy) + +- **Source:** [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md) W1-14. +- **Action:** Add explicit types for implicit `any` (e.g. callback parameters, event handlers). Tackle by module or file; can be parallelized by file. + +--- + +## 7. Module-Level Focus (Where ~1186 Errors Remain) + +After Phases 1–4, remaining errors are concentrated in: + +| Module / Area | Notes | +|---------------|--------| +| **defi** | e.g. `defi-module.service.ts`, arbitrage, tezos-usdtz, sovereign. | +| **exchange** | Exchange adapters, registry, OTC, price adapters. | +| **governance/msgf** | `msgf-*.service.ts` and related governance services. | +| **gateway** | API gateway, admin-central, middleware. | +| **Other** | Compliance, derivatives (gdsl/gsds), economics (uhem, mrecp), admin dashboards, integration. | + +**Strategy:** Fix by module (or by file within a module); run `tsc --noEmit` periodically. Prefer parallelizing by file when multiple people work on it. + +--- + +## 8. Execution Order (Recommended) + +1. **Prerequisites:** `npx prisma generate` in `dbis_core/`; confirm `tsc --noEmit` baseline. +2. **Priority 1:** Quick wins (imports, route returns, simple assertions). +3. **Priority 2:** Pattern fixes (JsonValue, unknown property access, conversion via `unknown`). +4. **Priority 3:** Type system (Prisma props, Request extension, null safety). +5. **Priority 4:** Schema alignment and complex types (including Decimal). +6. **Sweep:** Implicit `any` and callbacks by module/file. + +--- + +## 9. Risk and Automation + +- **Low risk (safe to automate):** Missing imports, missing returns, simple type assertions, JsonValue casts. +- **Medium risk (review):** Property access on unknown, type conversions, null safety. +- **High risk (manual review):** Prisma schema changes, complex type assignments, Request extensions. + +--- + +## 10. References in This Repo + +- **Fix plan (in dbis_core):** + [dbis_core/TYPESCRIPT_FIXES_PRIORITIZED_PLAN.md](../../dbis_core/TYPESCRIPT_FIXES_PRIORITIZED_PLAN.md) + [dbis_core/PROMPT_TYPESCRIPT_FIXES_PHASES_1_4.md](../../dbis_core/PROMPT_TYPESCRIPT_FIXES_PHASES_1_4.md) +- **Phase status:** + [reports/REMAINING_TASKS_MASTER_20260201.md](../../reports/REMAINING_TASKS_MASTER_20260201.md) (Phases 1–4 review). +- **Task tracking:** + [TODO_TASK_LIST_MASTER.md](TODO_TASK_LIST_MASTER.md), [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md) W1-14, [ALL_TASKS_DETAILED_STEPS.md](ALL_TASKS_DETAILED_STEPS.md). +- **Express types:** + [dbis_core/src/types/express.d.ts](../../dbis_core/src/types/express.d.ts) (for Request extension). + +--- + +*Last updated: 2026-02-23. Error count ~1186 is from post–Phase 1–4 state; re-run `tsc --noEmit` in dbis_core for current count.* diff --git a/docs/00-meta/DOCUMENTATION_CONSOLIDATION_PLAN.md b/docs/00-meta/DOCUMENTATION_CONSOLIDATION_PLAN.md index d5b2b62..eddc9d0 100644 --- a/docs/00-meta/DOCUMENTATION_CONSOLIDATION_PLAN.md +++ b/docs/00-meta/DOCUMENTATION_CONSOLIDATION_PLAN.md @@ -1,6 +1,6 @@ # Documentation Consolidation Plan -**Last Updated:** 2026-02-20 +**Last Updated:** 2026-03-02 **Purpose:** Review, consolidate, and prune markdown docs. Single reference for what to keep, merge, or archive. **Related:** [ARCHIVE_CANDIDATES.md](ARCHIVE_CANDIDATES.md) | [archive/00-meta-pruned/README.md](../archive/00-meta-pruned/README.md). (Dated review docs, e.g. DOCUMENTATION_REVIEW_20260216, are in archive/00-meta-pruned.) @@ -134,13 +134,26 @@ Moved to `docs/archive/00-meta-pruned/` in 2026-02-20 batch: --- -## 5. Next steps for maintainers +## 5. Eliminating deprecated and inconsistent content + +- **Single entry point:** [docs/MASTER_INDEX.md](../MASTER_INDEX.md) — use as the documentation index; it lists canonical sources and a "Deprecated / superseded" table. +- **Recommendations canonical:** [00-meta/ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md](ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md). Do not use [ALL_IMPROVEMENTS_AND_GAPS_INDEX.md](../ALL_IMPROVEMENTS_AND_GAPS_INDEX.md) as primary; it is superseded (stub/redirect only). +- **Contract/address status:** [11-references/ADDRESS_MATRIX_AND_STATUS.md](../11-references/ADDRESS_MATRIX_AND_STATUS.md). CONTRACT_INVENTORY_AND_VERIFICATION and SMART_CONTRACTS_INVENTORY are deleted/superseded. +- **Runbooks:** [03-deployment/OPERATIONAL_RUNBOOKS.md](../03-deployment/OPERATIONAL_RUNBOOKS.md) is the single runbook index. [RUNBOOKS_MASTER_INDEX.md](../RUNBOOKS_MASTER_INDEX.md) is a redirect stub for backward compatibility. +- When adding or updating docs, link to MASTER_INDEX and the canonical doc for that topic; avoid creating new "master" or "index" docs that duplicate existing ones. + +--- + +## 6. Next steps for maintainers 1. Run link check quarterly (MASTER_INDEX, docs/README). 2. Each quarter: move clearly one-off/dated 00-meta docs to archive/00-meta-pruned per this plan. 3. Consider merging REMAINING_* and NEXT_STEPS_* into 2–3 canonical files (entry: NEXT_STEPS_INDEX.md). 4. Add "Last reviewed" to ARCHIVE_CANDIDATES after each consolidation run. +5. **Eliminate deprecated content:** Do not reference ALL_IMPROVEMENTS_AND_GAPS_INDEX, CONTRACT_INVENTORY_AND_VERIFICATION, or SMART_CONTRACTS_INVENTORY as primary sources; use MASTER_INDEX and the canonical docs it points to. --- **Consolidation run 2026-02-20:** NEXT_STEPS_INDEX.md added; Batch 4 (12 files) archived to 00-meta-pruned; ARCHIVE_CANDIDATES and MASTER_INDEX updated. **Follow-up:** Batch 5 (CONTINUE_AND_COMPLETE, FULL_PARALLEL_RUN_LOG) → 00-meta-pruned; ALL_TASKS_COMPLETE → root-status-reports; project root cleanup → docs/archive/root-cleanup-20260220; fix-wsl-ip.sh → scripts/. + +**Consolidation run 2026-03-02:** docs/MASTER_INDEX.md and docs/README.md created; docs/RUNBOOKS_MASTER_INDEX.md added (redirect stub); DOCUMENTATION_CONSOLIDATION_PLAN §5 (eliminating deprecated content) and §6 (maintainers) updated; ARCHIVE_CANDIDATES Last reviewed set to 2026-03-02. diff --git a/docs/00-meta/FULL_PARALLEL_EXECUTION_ORDER.md b/docs/00-meta/FULL_PARALLEL_EXECUTION_ORDER.md index 101d14b..f8c444a 100644 --- a/docs/00-meta/FULL_PARALLEL_EXECUTION_ORDER.md +++ b/docs/00-meta/FULL_PARALLEL_EXECUTION_ORDER.md @@ -3,7 +3,7 @@ **Last Updated:** 2026-02-05 **Purpose:** Order all remaining tasks into waves so that **within each wave, every item can run in parallel**. Run in full maximum parallel mode: execute all items in Wave 0 concurrently (where different owners), then all in Wave 1, then Wave 2, then Wave 3. No artificial sequencing within a wave. -**Sources:** [TODO_TASK_LIST_MASTER.md](TODO_TASK_LIST_MASTER.md), [REMAINING_TASKS_NEXT_STEPS_PHASES_REVIEW.md](REMAINING_TASKS_NEXT_STEPS_PHASES_REVIEW.md), [PARALLEL_TASK_STRUCTURE.md](PARALLEL_TASK_STRUCTURE.md), [ALL_IMPROVEMENTS_AND_GAPS_INDEX.md](../ALL_IMPROVEMENTS_AND_GAPS_INDEX.md). +**Sources:** [TODO_TASK_LIST_MASTER.md](TODO_TASK_LIST_MASTER.md), [REMAINING_TASKS_NEXT_STEPS_PHASES_REVIEW.md](REMAINING_TASKS_NEXT_STEPS_PHASES_REVIEW.md), [PARALLEL_TASK_STRUCTURE.md](PARALLEL_TASK_STRUCTURE.md), [ALL_IMPROVEMENTS_AND_GAPS_INDEX.md](../ALL_IMPROVEMENTS_AND_GAPS_INDEX.md). **Single plan (required/optional/recommended):** [COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md](COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md). **Run log:** [FULL_PARALLEL_RUN_LOG.md](../archive/00-meta-pruned/FULL_PARALLEL_RUN_LOG.md) (archived) — record of what was executed by wave (2026-02-05). **Wave 1 status:** [WAVE1_COMPLETION_SUMMARY.md](WAVE1_COMPLETION_SUMMARY.md). **Wave 2/3 checklist:** [WAVE2_WAVE3_OPERATOR_CHECKLIST.md](WAVE2_WAVE3_OPERATOR_CHECKLIST.md). @@ -142,7 +142,7 @@ | W2-3 | VLAN enablement: apply UDM Pro VLAN config; Proxmox bridge; migrate services to VLANs | By VLAN or by host | | W2-4 | Phase 3 CCIP: Ops/Admin (5400-5401); NAT pools; commit/execute/RMN script expansion | Ops first, then NAT, then scripts | | W2-5 | Phase 4: Sovereign tenant VLANs; isolation; access control | By tenant or by VLAN | -| W2-6 | Missing containers: 3 VMIDs only (2506, 2507, 2508) — see MISSING_CONTAINERS_LIST.md | By VMID or by host | +| W2-6 | 2506–2508 destroyed 2026-02-08; RPC 2500–2505 only. See MISSING_CONTAINERS_LIST.md | Done (doc) | | W2-7 | DBIS services start (10100–10151, etc.); additional Hyperledger | By host | | W2-8 | NPMplus HA (Keepalived, secondary 10234) | Optional; single change | diff --git a/docs/00-meta/GAPS_STATUS.md b/docs/00-meta/GAPS_STATUS.md new file mode 100644 index 0000000..b972706 --- /dev/null +++ b/docs/00-meta/GAPS_STATUS.md @@ -0,0 +1,41 @@ +# Gaps Status — Consolidated View + +**Last Updated:** 2026-03-02 +**Purpose:** Single reference for all gap sources and current status. Use this to see what is fixed in-repo vs what remains operator/external. + +--- + +## Gap sources (canonical) + +| Document | Scope | Status | +|----------|--------|--------| +| [REQUIRED_FIXES_UPDATES_GAPS.md](../REQUIRED_FIXES_UPDATES_GAPS.md) | Build, contracts, canonical list, placeholders, docs, tests | All §§1–6 **Done** or Documented. §9 optional/informational. | +| [04-configuration/DETAILED_GAPS_AND_ISSUES_LIST.md](../04-configuration/DETAILED_GAPS_AND_ISSUES_LIST.md) | Explorer API, token-aggregation, nginx order, tests, CI | §1–2, 5–8 **Fixed**. §3–4 **Addressed** (nginx order documented; Explorer/Wallet timeouts 25s). §9 optional. §12 operator. | +| [04-configuration/VERIFICATION_GAPS_AND_TODOS.md](../04-configuration/VERIFICATION_GAPS_AND_TODOS.md) | Missing scripts, placeholders, runbook .env | backup-npmplus.sh **Created**. Runbook production note **Added** (INGRESS_VERIFICATION_RUNBOOK; VERIFICATION_GAPS doc). Sankofa/TBD remain until services deployed. | +| [00-meta/CW_BRIDGE_TASK_LIST.md](CW_BRIDGE_TASK_LIST.md) | cW* bridge mint/receive | Phases A, C1, F **Done** (in-repo). C2–C3, D, E **Operator** (deploy receiver, wire, test E2E). | +| [00-meta/ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md](ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md) | 139+ recommendations (Proxmox, code, docs, security, infra) | Many done or ongoing. Track per section; high-priority security/config items in §1–2, 6. | + +--- + +## Fixes applied in this pass (2026-03-02) + +| Gap | Fix | +|-----|-----| +| Explorer homepage / Wallet page tests intermittent | `scripts/verify-all-systems.sh`: timeout for Explorer homepage and Wallet page increased 15s → 25s. | +| Nginx proxy order (§3 DETAILED_GAPS) | Confirmed `fix-nginx-conflicts-vmid5000.sh` has `location /api/v1/` before `location /api/`; status set to Addressed; operator should use this script. | +| Runbook placeholders / .env in production | INGRESS_VERIFICATION_RUNBOOK.md: production note added in Prerequisites. VERIFICATION_GAPS_AND_TODOS: documentation note added. | + +--- + +## Remaining (operator / external) + +- **Operator (LAN/Proxmox):** Apply nginx config on VMID 5000; create token_aggregation DB and run migrations; restart token-aggregation; run run-all-operator-tasks-from-lan.sh; deploy TwoWayTokenBridgeL2 (or cW* receiver) per chain; wire CW_BRIDGE_* and test E2E. See [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md), [CW_BRIDGE_TASK_LIST.md](CW_BRIDGE_TASK_LIST.md), [DETAILED_GAPS_AND_ISSUES_LIST.md](../04-configuration/DETAILED_GAPS_AND_ISSUES_LIST.md) §12. +- **External / TBD:** Sankofa cutover placeholders until services deployed; CMC/CoinGecko submission; ramp provider outreach for Chain 138. See [REPOSITORIES_AND_PRS_CHAIN138.md](REPOSITORIES_AND_PRS_CHAIN138.md). + +--- + +## Quick reference + +- **In-repo actionable gaps:** Addressed or documented; see REQUIRED_FIXES_UPDATES_GAPS §§1–6 and this doc. +- **Operator copy-paste:** [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md). +- **Remaining tasks (one page):** [REMAINING_TASKS.md](REMAINING_TASKS.md). diff --git a/docs/00-meta/MAINNET_LIQUIDITY_AND_RAMPS_PRIORITY.md b/docs/00-meta/MAINNET_LIQUIDITY_AND_RAMPS_PRIORITY.md new file mode 100644 index 0000000..4f8b217 --- /dev/null +++ b/docs/00-meta/MAINNET_LIQUIDITY_AND_RAMPS_PRIORITY.md @@ -0,0 +1,112 @@ +# Priority: Obtain Liquid on Mainnet & Wire Off-Ramps / On-Ramps + +**Purpose:** Single priority plan: (1) get liquidity on Ethereum Mainnet so 138→mainnet flows complete, then (2) wire fiat off-ramps and on-ramps so users can move value in and out. + +**Status:** Operator-focused. Repo has scripts and contracts; execution depends on deployer mainnet balance and ramp API keys/partnerships. + +--- + +## Priority 1 — Obtain liquid on Mainnet + +Without mainnet liquidity, users cannot receive value when bridging from Chain 138 to Mainnet. Two destinations need funding. + +### 1.1 Trustless LiquidityPoolETH (Mainnet) + +**What it does:** Pays out ETH/WETH to users who lock on 138 and claim on Mainnet (trustless bridge). + +**Prerequisite:** Deployer must have **ETH (and optionally WETH)** on Ethereum Mainnet. + +| Step | Action | +|------|--------| +| 1 | Fund deployer on mainnet (exchange withdrawal, bridge from L2, or another wallet). See [FUNDING_AND_DEPLOYMENT_CHECKLIST](../03-deployment/FUNDING_AND_DEPLOYMENT_CHECKLIST.md) § Ethereum Mainnet. | +| 2 | Set in `.env`: `LIQUIDITY_POOL_ETH_MAINNET` (or `LIQUIDITY_POOL`), `ETHEREUM_MAINNET_RPC`, `PRIVATE_KEY`. | +| 3 | Run: `cd smom-dbis-138 && ./scripts/deployment/fund-mainnet-lp.sh --eth 1 --weth 0.5` (or interactive; use `--dry-run` first). | +| 4 | Verify: `cast call $LIQUIDITY_POOL_ETH_MAINNET "totalLiquidity()" --rpc-url $ETHEREUM_MAINNET_RPC` (or use [live-test-trustless-bridge.sh](../../smom-dbis-138/scripts/deployment/live-test-trustless-bridge.sh) with `--check`). | + +**Scripts:** [fund-mainnet-lp.sh](../../smom-dbis-138/scripts/deployment/fund-mainnet-lp.sh), [FundMainnetLP.s.sol](../../smom-dbis-138/script/bridge/trustless/FundMainnetLP.s.sol). + +**Refs:** [LIQUIDITY_POOL_CONTROLS_RUNBOOK](../03-deployment/LIQUIDITY_POOL_CONTROLS_RUNBOOK.md), [trustless DEPLOYMENT_GUIDE](../../smom-dbis-138/docs/bridge/trustless/DEPLOYMENT_GUIDE.md). + +### 1.2 Mainnet Relay Bridge (WETH9) — CCIP payouts + +**What it does:** Holds WETH9 on Mainnet so CCIP relay can complete 138→mainnet WETH transfers. + +**Prerequisite:** Deployer must have **WETH9** on Ethereum Mainnet. + +| Step | Action | +|------|--------| +| 1 | Ensure deployer has WETH on mainnet (swap ETH→WETH or receive WETH). | +| 2 | Run: `./scripts/bridge/fund-mainnet-relay-bridge.sh [amount_wei]` (omit for full balance). Env: `PRIVATE_KEY`, `ETHEREUM_MAINNET_RPC` (or `RPC_URL_MAINNET`). | +| 3 | Verify bridge balance: `cast call 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 "balanceOf(address)(uint256)" 0xF9A32F37099c582D28b4dE7Fca6eaC1e5259f939 --rpc-url $ETHEREUM_MAINNET_RPC`. | + +**Refs:** [CCIP_BRIDGE_MAINNET_CONNECTION](../07-ccip/CCIP_BRIDGE_MAINNET_CONNECTION.md), [REMAINING_WORK_BREAKDOWN_AND_ANSWERS](REMAINING_WORK_BREAKDOWN_AND_ANSWERS.md) § 2.6. + +### 1.3 One-line summary (Priority 1) + +1. Fund deployer with ETH (and WETH) on mainnet. +2. Set `LIQUIDITY_POOL_ETH_MAINNET`, `ETHEREUM_MAINNET_RPC` in .env. +3. Run `fund-mainnet-lp.sh --eth 1 --weth 0.5`. +4. Run `fund-mainnet-relay-bridge.sh` if using CCIP relay. + +--- + +## Priority 2 — Wire off-ramps and on-ramps + +Once mainnet has liquidity, 138→mainnet flows can complete. Next: connect fiat entry/exit (on-ramp = fiat→crypto, off-ramp = crypto→fiat). + +### 2.1 Current wiring + +| Component | Location | Role | +|-----------|----------|------| +| **Ramp API** | `metamask-integration/src/ramps/` | `POST /ramps/on-ramp/session`, `POST /ramps/off-ramp/session`, `GET /ramps/quote`, `GET /ramps/providers`. | +| **Providers** | MoonPay, Ramp Network, Onramper, Transak, Banxa, Coinbase, Stripe, Cybrid, Sardine, HoneyCoin | Require API keys; most support mainnet, not Chain 138. | +| **Chain support** | MetaMask ramp partners | Typically Ethereum, BNB, Polygon, etc. **Chain 138 not natively supported** by most ramp partners. | + +**Refs:** [INTEGRATIONS_QUICK_REFERENCE](../../INTEGRATIONS_QUICK_REFERENCE.md), [MASTER_INDEX](../MASTER_INDEX.md) § Fiat On/Off Ramps, [METAMASK_BRIDGE_SWAP](../../smom-dbis-138/docs/operations/integrations/METAMASK_BRIDGE_SWAP.md). + +### 2.2 On-ramp wiring (fiat → crypto) + +| Step | Action | +|------|--------| +| 1 | **Mainnet path (works today):** User buys ETH/tokens on a supported chain (e.g. mainnet) via ramp → then bridges to Chain 138. Document this path in companion/dApp and [METAMASK_BRIDGE_SWAP](../../smom-dbis-138/docs/operations/integrations/METAMASK_BRIDGE_SWAP.md). | +| 2 | **Ramp API:** Ensure `metamask-integration` ramp server runs (`pnpm ramps:dev` or as part of app). Set API keys in .env: `MOONPAY_API_KEY`, `RAMP_NETWORK_API_KEY`, `ONRAMPER_API_KEY`, etc. See [MASTER_SECRETS_INVENTORY](../04-configuration/MASTER_SECRETS_INVENTORY.md), [API_KEYS_REQUIRED](../../reports/API_KEYS_REQUIRED.md). | +| 3 | **Companion/dApp:** Call `POST /ramps/on-ramp/session` with `chainId: 1` (or supported chain); show widget; instruct user to bridge to 138 if target is 138. | +| 4 | **Chain 138 native (future):** Partner with one or more ramp providers to add Chain 138. See [CONSENSYS_OUTREACH_PACKAGE](../../metamask-integration/docs/CONSENSYS_OUTREACH_PACKAGE.md), [ON_RAMP_INTEGRATION_GUIDE](../../metamask-integration/docs/ON_RAMP_INTEGRATION_GUIDE.md). | + +### 2.3 Off-ramp wiring (crypto → fiat) + +| Step | Action | +|------|--------| +| 1 | **Mainnet path (works once liquid):** User bridges 138→mainnet (trustless or CCIP), then sells on mainnet via off-ramp. Ensure mainnet liquidity (Priority 1) so bridge payouts succeed. | +| 2 | **Ramp API:** `POST /ramps/off-ramp/session` with `chainId: 1` (mainnet) and user’s mainnet address (or wallet that received bridged funds). | +| 3 | **Companion/dApp:** After bridge, show “Sell” / off-ramp option targeting mainnet; link to ramp provider or use embedded widget. | +| 4 | **Chain 138 native (future):** Same as on-ramp — partner with providers to support 138 for direct off-ramp from 138. | + +### 2.4 Checklist — ramps + +- [ ] Deployer/mainnet funded → Priority 1 done. +- [ ] Ramp API keys set in `metamask-integration/.env` (MoonPay, Ramp, etc.). +- [ ] Ramp server reachable from companion/dApp (`/ramps/on-ramp/session`, `/ramps/off-ramp/session`). +- [ ] Companion/dApp: on-ramp flow (buy on mainnet → bridge to 138) documented and linked → **[MAINNET_RAMP_USER_FLOWS.md](../04-configuration/MAINNET_RAMP_USER_FLOWS.md)**. +- [ ] Companion/dApp: off-ramp flow (138 → mainnet bridge → sell on mainnet) documented and linked → **[MAINNET_RAMP_USER_FLOWS.md](../04-configuration/MAINNET_RAMP_USER_FLOWS.md)**. +- [ ] (Optional) Outreach to ramp partners for Chain 138 support. + +--- + +## Order of operations + +1. **Obtain liquid on mainnet** — fund LiquidityPoolETH and (if used) Relay Bridge so 138→mainnet completes. +2. **Wire ramps to mainnet** — enable buy on mainnet (on-ramp) and sell on mainnet after bridge (off-ramp). +3. **Document user flows** — “Buy ETH on mainnet → bridge to 138” and “Bridge 138→mainnet → sell”. +4. **Later:** Ramp partner outreach for native Chain 138 on/off-ramp. + +--- + +## Related + +- [MAINNET_RAMP_USER_FLOWS](../04-configuration/MAINNET_RAMP_USER_FLOWS.md) — on-ramp and off-ramp user flows (buy on mainnet → bridge to 138; 138→mainnet → sell). +- [ALL_NEXT_STEPS_CURRENT](../../smom-dbis-138/docs/deployment/ALL_NEXT_STEPS_CURRENT.md) — runbook order (G4 fund mainnet LP is step 2). +- [FUNDING_AND_DEPLOYMENT_CHECKLIST](../03-deployment/FUNDING_AND_DEPLOYMENT_CHECKLIST.md) — where to get ETH/WETH per network. +- [LIQUIDITY_POOL_CONTROLS_RUNBOOK](../03-deployment/LIQUIDITY_POOL_CONTROLS_RUNBOOK.md) — LP controls and funding. +- [CHAIN138_ONLY_TO_CANONICAL_OTHER_NETWORKS](../../smom-dbis-138/docs/bridge/CHAIN138_ONLY_TO_CANONICAL_OTHER_NETWORKS.md) — who prefunds (operator). +- [OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST](OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md). diff --git a/docs/00-meta/MASTER_DOCUMENTATION_INDEX.md b/docs/00-meta/MASTER_DOCUMENTATION_INDEX.md deleted file mode 100644 index 9ab204e..0000000 --- a/docs/00-meta/MASTER_DOCUMENTATION_INDEX.md +++ /dev/null @@ -1,41 +0,0 @@ -# Master Documentation Index — Source of Truth - -**Last Updated:** 2026-02-12 -**Purpose:** Treat these documents as the **Bible** for URL, VMID, and port mappings. When fixing placeholders or cleaning up projects, use them as the verifiably correct source. - ---- - -## Domain → VMID:port and infrastructure - -| Document | Scope | Use when | -|----------|--------|----------| -| **[ALL_VMIDS_ENDPOINTS.md](../04-configuration/ALL_VMIDS_ENDPOINTS.md)** | Complete VMID, IP, hostname, port, and public domain mapping | Resolving which VMID:port a domain or service must use; checking that **only** explorer points to Blockscout. | -| **[RPC_ENDPOINTS_MASTER.md](../04-configuration/RPC_ENDPOINTS_MASTER.md)** | RPC URLs, public domain → NPMplus backend, canonical .env values | Setting RPC_* in .env, configuring NPMplus proxy hosts, Chain 138 / ThirdWeb / DBIS / Sankofa / MIM4U. | -| **[DNS_NPMPLUS_VM_COMPREHENSIVE_ARCHITECTURE.md](../04-configuration/DNS_NPMPLUS_VM_COMPREHENSIVE_ARCHITECTURE.md)** | DNS → NPMplus → VM table | Aligning NPMplus backend targets with VMIDs; must match ALL_VMIDS and RPC_ENDPOINTS_MASTER. | - ---- - -## Critical rule: Explorer vs other services - -**Only** the **Explorer** (Blockscout) should be pointed at **192.168.11.140** (VMID 5000): - -- `explorer.d-bis.org` → 192.168.11.140:80 (web), :4000 (API) ✅ - -**All other domains** must point to their **correct VMID and port** (see the master docs above). Examples of **incorrect** routing (do not use): - -- `sankofa.nexus`, `phoenix.sankofa.nexus` → ~~192.168.11.140~~ ❌ -- Correct: `sankofa.nexus` → 192.168.11.51:3000 (VMID 7801), `phoenix.sankofa.nexus` → 192.168.11.50:4000 (VMID 7800). - -When reviewing or fixing documentation and NPMplus config: - -1. Resolve every domain from **ALL_VMIDS_ENDPOINTS** or **RPC_ENDPOINTS_MASTER**. -2. Update any doc or script that points a non-explorer domain to 192.168.11.140. -3. Ensure placeholder lists (e.g. [PLACEHOLDERS_AND_COMPLETION_MASTER_LIST.md](PLACEHOLDERS_AND_COMPLETION_MASTER_LIST.md), [GAPS_AND_RECOMMENDATIONS_CONSOLIDATED.md](../GAPS_AND_RECOMMENDATIONS_CONSOLIDATED.md)) reference these master docs and the correct targets. - ---- - -## Related - -- [PLACEHOLDERS_AND_COMPLETION_MASTER_LIST.md](PLACEHOLDERS_AND_COMPLETION_MASTER_LIST.md) — What to complete for each placeholder -- [REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS.md](REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS.md) — Remaining tasks and recommendations -- [NETWORK_CONFIGURATION_MASTER.md](../11-references/NETWORK_CONFIGURATION_MASTER.md) — Network and IP reference diff --git a/docs/00-meta/MASTER_PLAN.md b/docs/00-meta/MASTER_PLAN.md index c293654..c244698 100644 --- a/docs/00-meta/MASTER_PLAN.md +++ b/docs/00-meta/MASTER_PLAN.md @@ -1,6 +1,6 @@ # Master Plan — Gaps, Protection Layer, and Granular Admin Control -**Last Updated:** 2026-02-05 +**Last Updated:** 2026-02-28 **Status:** Active **Purpose:** Single source of truth for what to do: consolidates gaps, placeholders, and recommendations; defines the full protection layer and granular admin control panels at all levels; provides phased execution with references to detailed indexes. @@ -15,7 +15,7 @@ This document does not duplicate the full 139-item tables or every recommendatio | Index / list | Document | Item range or scope | |--------------|----------|---------------------| | **All requirements (master)** | [ALL_REQUIREMENTS.md](ALL_REQUIREMENTS.md) | Foundation, security, deployment (phases, CCIP, missing containers), backup, config, codebase, protection layer, waves, validation, optional | -| All improvements and gaps | [ALL_IMPROVEMENTS_AND_GAPS_INDEX.md](../ALL_IMPROVEMENTS_AND_GAPS_INDEX.md) | 139 items (1–11 Proxmox high, 12–20 medium, 21–30 low, 31–35 quick wins, 36–67 code/scripts, 68–74 docs, 75–91 infra, 92–105 MetaMask/explorer, 106–121 Tezos/CCIP, 122–126 Besu, 127–130 RPC translator, 131–134 orchestration portal, 135–139 maintenance) | +| All improvements and gaps (canonical) | [ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md](ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md) | 139 items, 20 sections (do not use ALL_IMPROVEMENTS_AND_GAPS_INDEX—deprecated) | | Gaps and recommendations | [GAPS_AND_RECOMMENDATIONS_CONSOLIDATED.md](../GAPS_AND_RECOMMENDATIONS_CONSOLIDATED.md) | Security, config/DNS, code TODOs, docs, token aggregation, Tezos, operational | | Next steps | [NEXT_STEPS_MASTER.md](NEXT_STEPS_MASTER.md) | Immediate, deployment phases, missing containers, codebase, optional, maintenance | | TODO task list | [TODO_TASK_LIST_MASTER.md](TODO_TASK_LIST_MASTER.md) | Critical fixes, gas, verification, improvements 1–139, security, monitoring, phases, codebase, docs | @@ -185,7 +185,7 @@ All recommendations from [ALL_IMPROVEMENTS_AND_GAPS_INDEX.md](../ALL_IMPROVEMENT | Step | Action | Doc reference | |------|--------|----------------| | 3.1 | CCIP fleet: CCIP Ops/Admin (5400–5401), commit/execute/RMN nodes, NAT pools. | NEXT_STEPS_MASTER Phase 3; [CCIP_DEPLOYMENT_SPEC.md](../07-ccip/CCIP_DEPLOYMENT_SPEC.md) | -| 3.2 | Missing containers: 3 only (2506, 2507, 2508). Canonical list: [MISSING_CONTAINERS_LIST.md](../03-deployment/MISSING_CONTAINERS_LIST.md) | [MISSING_CONTAINERS_LIST.md](../03-deployment/MISSING_CONTAINERS_LIST.md) | +| 3.2 | 2506–2508 destroyed 2026-02-08; RPC 2500–2505 only. See [MISSING_CONTAINERS_LIST.md](../03-deployment/MISSING_CONTAINERS_LIST.md) | Done (doc) | ### Phase 4 — Granular admin panels and infra protection diff --git a/docs/00-meta/NEXT_STEPS_2101_AND_STORAGE.md b/docs/00-meta/NEXT_STEPS_2101_AND_STORAGE.md new file mode 100644 index 0000000..5b3e850 --- /dev/null +++ b/docs/00-meta/NEXT_STEPS_2101_AND_STORAGE.md @@ -0,0 +1,80 @@ +# Concrete Next Steps: RPC 2101 and Storage (thin5 / data) + +**Last updated:** 2026-02-28 + +--- + +## 1. VMID 2101 (Core RPC) — RPC not responding + +**Symptom:** Container running, `besu-rpc` active, but RPC (e.g. `eth_blockNumber`) returns no response from 192.168.11.211:8545. + +### Run order (from project root, on LAN with SSH to r630-01) + +| Step | Action | Command | +|------|--------|---------| +| 1 | **Diagnose** | `bash scripts/maintenance/health-check-rpc-2101.sh` | +| 2a | If **read-only / database not writable** | `bash scripts/maintenance/make-rpc-vmids-writable-via-ssh.sh` (then re-run step 1) | +| 2b | If **JNA / NoClassDefFoundError** in logs | `bash scripts/maintenance/fix-rpc-2101-jna-reinstall.sh` (then step 3) | +| 3 | **Fix** (start CT if needed, restart Besu, verify) | `bash scripts/maintenance/fix-core-rpc-2101.sh` | +| 4 | **Verify** | `bash scripts/health/check-rpc-vms-health.sh` — 2101 should show block number | + +**Optional:** `fix-core-rpc-2101.sh --restart-only` if the container is already running and you only want to restart the Besu service. + +**Docs:** `docs/09-troubleshooting/RPC_NODES_BLOCK_PRODUCTION_FIX.md`, `docs/03-deployment/RPC_2101_READONLY_FIX.md` (if present). + +--- + +## 2. r630-02 thin5 — 84.6% used (monitor / reduce) + +**Risk:** thin5 is approaching the 85% WARN threshold; LVM thin pools can become slow or fail above ~90%. + +### Immediate + +| Step | Action | Command / notes | +|------|--------|------------------| +| 1 | **See which containers use thin5** | On r630-02: `ssh root@192.168.11.12 'pct list; for v in $(pct list 2>/dev/null | awk "NR>1{print \$1}"); do grep -l thin5 /etc/pve/lxc/$v.conf 2>/dev/null && echo "VMID $v uses thin5"; done'` | +| 2 | **Check disk usage inside those CTs** | `bash scripts/maintenance/check-disk-all-vmids.sh` — find VMIDs on r630-02 with high % | +| 3 | **Free space inside CTs** (Besu/DB, logs) | Per VMID: `pct exec -- du -sh /data /var/log 2>/dev/null`; prune logs, old snapshots, or Besu temp if safe | +| 4 | **Optional: migrate one CT to another thin** | If thin5 stays high: backup CT, restore to thin2/thin3/thin4/thin6 (e.g. `pct restore /path/to/dump --storage thin2`) | + +### Ongoing + +| Step | Action | Command / notes | +|------|--------|------------------| +| 5 | **Track growth** | `bash scripts/monitoring/collect-storage-growth-data.sh --append` (or install cron: `bash scripts/maintenance/schedule-storage-growth-cron.sh --install`) | +| 6 | **Prune old snapshots** (on host) | `bash scripts/monitoring/prune-storage-snapshots.sh` (weekly; keeps last 30 days) | + +--- + +## 3. r630-01 data / local-lvm — 71.9% used (monitor) + +**Risk:** Still healthy; monitor so it does not reach 85%+. + +### Immediate + +| Step | Action | Command / notes | +|------|--------|------------------| +| 1 | **Snapshot + growth check** | `bash scripts/monitoring/collect-storage-growth-data.sh` — review `logs/storage-growth/` | +| 2 | **Identify large CTs on r630-01** | `bash scripts/maintenance/check-disk-all-vmids.sh` — ml110 + r630-01; VMIDs 2101, 2500–2505 are on r630-01 | + +### Ongoing + +| Step | Action | Command / notes | +|------|--------|------------------| +| 3 | **Same as thin5** | Use `schedule-storage-growth-cron.sh --install` for weekly collection + prune | +| 4 | **Before new deployments** | Re-run `bash scripts/audit-proxmox-rpc-storage.sh` and check data% / local-lvm% | + +--- + +## Quick reference + +| Item | Script | Purpose | +|------|--------|---------| +| 2101 health | `scripts/maintenance/health-check-rpc-2101.sh` | Diagnose Core RPC | +| 2101 fix | `scripts/maintenance/fix-core-rpc-2101.sh` | Restart Besu, verify RPC | +| 2101 read-only | `scripts/maintenance/make-rpc-vmids-writable-via-ssh.sh` | e2fsck RPC VMIDs on r630-01 | +| 2101 JNA | `scripts/maintenance/fix-rpc-2101-jna-reinstall.sh` | Reinstall Besu in 2101 | +| Storage audit | `scripts/audit-proxmox-rpc-storage.sh` | All hosts + RPC rootfs mapping | +| Disk in CTs | `scripts/maintenance/check-disk-all-vmids.sh` | Root / usage per running CT | +| Storage growth | `scripts/monitoring/collect-storage-growth-data.sh` | Snapshot pvesm/lvs/df | +| Growth cron | `scripts/maintenance/schedule-storage-growth-cron.sh --install` | Weekly collect + prune | diff --git a/docs/00-meta/NEXT_STEPS_ALL.md b/docs/00-meta/NEXT_STEPS_ALL.md index efeb4ad..e4ef07e 100644 --- a/docs/00-meta/NEXT_STEPS_ALL.md +++ b/docs/00-meta/NEXT_STEPS_ALL.md @@ -81,9 +81,9 @@ Org **d-bis** and 18 repos created. **Pushed** to Gitea: proxmox (master), dbis_ --- -## 9. General — 2506–2508 JWT / identity +## 9. General — 2506–2508 (destroyed 2026-02-08) -Containers 2506, 2507, 2508 exist. Remaining: JWT auth in front of Besu RPC per [CHAIN138_JWT_AUTH_REQUIREMENTS.md](../04-configuration/CHAIN138_JWT_AUTH_REQUIREMENTS.md); permissioned identity (2506→Luis, 2507/2508→Putu). Use `scripts/generate-jwt-token-for-container.sh`; JWT secrets on containers, not in repo .env. See [MISSING_CONTAINERS_LIST.md](../03-deployment/MISSING_CONTAINERS_LIST.md). +Containers 2506, 2507, 2508 were **destroyed 2026-02-08** on all Proxmox hosts. Besu RPC range is **2500–2505** only. No JWT/identity action for 2506–2508. See [MISSING_CONTAINERS_LIST.md](../03-deployment/MISSING_CONTAINERS_LIST.md). --- @@ -101,7 +101,7 @@ If verification reports "cert files missing": NPMplus at https://192.168.11.167: ## 12. General — Wave 2 & 3 -Per [WAVE2_WAVE3_OPERATOR_CHECKLIST.md](WAVE2_WAVE3_OPERATOR_CHECKLIST.md): monitoring stack, Grafana + Cloudflare Access, VLAN enablement, CCIP Ops/Admin (5400–5401), 2506–2508 JWT/identity, DBIS services, NPMplus HA (optional), CCIP Fleet, Phase 4 tenant isolation. +Per [WAVE2_WAVE3_OPERATOR_CHECKLIST.md](WAVE2_WAVE3_OPERATOR_CHECKLIST.md): monitoring stack, Grafana + Cloudflare Access, VLAN enablement, CCIP Ops/Admin (5400–5401), DBIS services, NPMplus HA (optional), CCIP Fleet, Phase 4 tenant isolation. (2506–2508 destroyed 2026-02-08.) --- diff --git a/docs/00-meta/NEXT_STEPS_AND_REMAINING_TODOS.md b/docs/00-meta/NEXT_STEPS_AND_REMAINING_TODOS.md index 7692ef3..6992891 100644 --- a/docs/00-meta/NEXT_STEPS_AND_REMAINING_TODOS.md +++ b/docs/00-meta/NEXT_STEPS_AND_REMAINING_TODOS.md @@ -1,16 +1,111 @@ # Next Steps and Remaining TODOs — Consolidated List -**Last Updated:** 2026-02-20 +**Last Updated:** 2026-03-02 **Purpose:** Single checklist of all next steps and remaining tasks. **Single-file task list:** [TODOS_CONSOLIDATED.md](TODOS_CONSOLIDATED.md). Items marked **Operator/LAN** require Proxmox access, deploy keys, or external parties; others can be done in-repo (code, config, docs). -**👉 Single list (runbooks not yet run + remaining deployments + recommendations):** [TASKS_RUNBOOKS_REMAINING_AND_RECOMMENDATIONS.md](TASKS_RUNBOOKS_REMAINING_AND_RECOMMENDATIONS.md). +**👉 Single list (runbooks not yet run + remaining deployments + recommendations):** this document ([NEXT_STEPS_AND_REMAINING_TODOS.md](NEXT_STEPS_AND_REMAINING_TODOS.md)). -**See also:** [RECOMMENDED_COMPLETION_CHECKLIST.md](../07-ccip/RECOMMENDED_COMPLETION_CHECKLIST.md) (CCIP/mapper), [NEXT_STEPS_FOR_YOU.md](NEXT_STEPS_FOR_YOU.md), [NEXT_STEPS_OPERATOR.md](NEXT_STEPS_OPERATOR.md), [TODO_TASK_LIST_MASTER.md](TODO_TASK_LIST_MASTER.md), [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md). +**See also:** [DEPLOYMENT_ORDER_OF_OPERATIONS.md](../03-deployment/DEPLOYMENT_ORDER_OF_OPERATIONS.md) (full deployment order Phase 0–6 + preflight), [COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md](COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md), [RECOMMENDED_COMPLETION_CHECKLIST.md](../07-ccip/RECOMMENDED_COMPLETION_CHECKLIST.md), [NEXT_STEPS_FOR_YOU.md](NEXT_STEPS_FOR_YOU.md), [NEXT_STEPS_OPERATOR.md](NEXT_STEPS_OPERATOR.md), [TODO_TASK_LIST_MASTER.md](TODO_TASK_LIST_MASTER.md), [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md). **Single ordered list (runnable):** [OPTIONAL_DEPLOYMENTS_START_HERE §5](../07-ccip/OPTIONAL_DEPLOYMENTS_START_HERE.md#5-next-steps--complete-in-order) — from-anywhere commands (1–4) then operator/LAN (5–10). **Operator copy-paste:** [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md). --- +## Remaining tasks (summary) + +Steps 1–2 and the Chain 138 “all in one” run (step 3) are **done** (2026-03-02). **Task check (2026-03-02):** Each remaining task was verified; see [TASK_CHECK_REPORT.md](TASK_CHECK_REPORT.md) for per-task status and what can be completed only by Operator/LAN or externally. What remains: + +| # | Task | Who | Command / doc | +|---|------|-----|----------------| +| 4 | **Full deployment order (Phase 0–6)** | Operator | [DEPLOYMENT_ORDER_OF_OPERATIONS.md](../03-deployment/DEPLOYMENT_ORDER_OF_OPERATIONS.md) — prereqs → core → PMM pools → provider → optional → cW* → verify | +| 5 | **Chain 138 PMM:** add liquidity, ensure DODOPMMProvider registered | Operator/LAN | [PRE_DEPLOYMENT_CHECKLIST.md](../03-deployment/PRE_DEPLOYMENT_CHECKLIST.md); add liquidity per [LIQUIDITY_POOLS_MASTER_MAP](../11-references/LIQUIDITY_POOLS_MASTER_MAP.md) | +| 6 | **Operator tasks:** Blockscout verify, 502 fix, NPMplus backup, optional deploy | Operator/LAN | `./scripts/run-all-operator-tasks-from-lan.sh [--deploy]`; [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md) | +| 7 | **Gnosis, Celo, Wemix CCIP bridges** | Operator/LAN | [CONFIG_READY_CHAINS_COMPLETION_RUNBOOK](../07-ccip/CONFIG_READY_CHAINS_COMPLETION_RUNBOOK.md); DeployWETHBridges + destinations + fund LINK | +| 8 | **LINK support on Mainnet relay** | Operator/LAN | [RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK](../07-ccip/RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK.md) | +| 9 | **Repos & PRs:** Ledger, Trust Wallet, Chainlist, on-ramps | External | [REPOSITORIES_AND_PRS_CHAIN138.md](REPOSITORIES_AND_PRS_CHAIN138.md) | +| 10 | **PR-ready files:** Chainlist, Trust Wallet forms | Anyone | [04-configuration/pr-ready/README.md](../04-configuration/pr-ready/README.md) | +| 11 | **E2E flow waves E1–E7** (add liquidity, CCIP fund, token-aggregation, Blockscout, L2 PMM, bridge UI, docs) | Operator/Dev | `./scripts/run-e2e-flow-tasks-full-parallel.sh`; [TASKS_TO_INCREASE_ALL_E2E_FLOWS.md](TASKS_TO_INCREASE_ALL_E2E_FLOWS.md) | + +**Optional / lower priority:** Wemix token verification; mint tokens to deployer for LPs/bridges ([TOKENS_AND_NETWORKS_MINTABLE_TO_DEPLOYER](../11-references/TOKENS_AND_NETWORKS_MINTABLE_TO_DEPLOYER.md)); AddressMapper on other chains; Mainnet trustless stack; cW* on public chains. See [TODOS_CONSOLIDATED.md](TODOS_CONSOLIDATED.md). + +--- + +## Next steps (ordered) + +| # | Step | Who | Command / doc | +|---|------|-----|----------------| +| 1 | **From anywhere (no LAN):** config + on-chain + validation | Anyone | `./scripts/run-completable-tasks-from-anywhere.sh` | +| 2 | **Before any Chain 138 deploy:** preflight (RPC, dotenv, nonce, optional cost) | Anyone with .env | `./scripts/deployment/preflight-chain138-deploy.sh [--cost]` | +| 3 | **Full deployment order** | Operator | [DEPLOYMENT_ORDER_OF_OPERATIONS.md](../03-deployment/DEPLOYMENT_ORDER_OF_OPERATIONS.md) Phase 0–6: prereqs → core → PMM pools → provider → optional → cW* → verify | +| 4 | **Chain 138 PMM:** create pools, deploy DODOPMMProvider | Operator/LAN | [PRE_DEPLOYMENT_CHECKLIST.md](../03-deployment/PRE_DEPLOYMENT_CHECKLIST.md); `create-all-pmm-pools-chain138.sh`, then DeployDODOPMMProvider | +| 5 | **Operator tasks (Blockscout, 502, backup, deploy)** | Operator/LAN | `./scripts/run-all-operator-tasks-from-lan.sh [--deploy] [--create-vms]`; [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md) | + +--- + +## Completed in this pass (2026-03-02) — Documentation and completable run + +| # | Item | +|---|------| +| — | **Documentation consolidation:** [MASTER_INDEX.md](../MASTER_INDEX.md) and [README.md](../README.md) created; [RUNBOOKS_MASTER_INDEX.md](../RUNBOOKS_MASTER_INDEX.md) added (redirect); [ALL_IMPROVEMENTS_AND_GAPS_INDEX.md](../ALL_IMPROVEMENTS_AND_GAPS_INDEX.md) deprecated (redirect stub). DOCUMENTATION_CONSOLIDATION_PLAN §5 (eliminating deprecated content) and ARCHIVE_CANDIDATES updated. | +| — | **Completable-from-anywhere run:** `./scripts/run-completable-tasks-from-anywhere.sh` — config validation OK; on-chain 38/38 (Chain 138); run-all-validation --skip-genesis OK; reconcile-env --print. E2E flow tasks dry-run: `./scripts/run-e2e-flow-tasks-full-parallel.sh --dry-run` (waves E0–E7 listed). | +| — | **Preflight:** `./scripts/deployment/preflight-chain138-deploy.sh` — passed (dotenv, RPC Core, nonce consistent). | +| — | **Chain 138 next steps (full run):** `./scripts/deployment/run-all-next-steps-chain138.sh` — Step 1 preflight OK; Step 2 TransactionMirror already deployed, cUSDT/cUSDC pool already exists (continued); Step 3 Register c* as GRU: all 12 c* already registered (skip); Step 4 on-chain verification 38/38. Exit 0. | + +--- + +## Completed in this pass (2026-02-27) + +| # | Item | +|---|------| +| — | **Deployment order of operations:** [DEPLOYMENT_ORDER_OF_OPERATIONS.md](../03-deployment/DEPLOYMENT_ORDER_OF_OPERATIONS.md) — full Phase 0–6 sequence (prereqs → core → PMM/pools → provider → optional → cW* → verification) and remaining recommendations (R1–R24, ~139 items). | +| — | **Deployment safety (four rules):** Correct RPC (Core only), correct dotenv (`smom-dbis-138/.env` only), Gas API/cost estimate before deploy, do not deploy when transactions stuck. Documented in DEPLOYMENT_ORDER_OF_OPERATIONS, PRE_DEPLOYMENT_CHECKLIST, CONTRACT_DEPLOYMENT_RUNBOOK. | +| — | **Preflight script:** `./scripts/deployment/preflight-chain138-deploy.sh [--cost]` — checks dotenv, env keys, RPC (Core, chainId 138), deployer nonce (fails if stuck); optional `--cost` runs cost estimate. Linked from runbook and Phase 0. | +| — | **Todo/docs sync:** NEXT_STEPS_AND_REMAINING_TODOS, TODOS_CONSOLIDATED, TODO_TASK_LIST_MASTER updated with 2026-02-27 completion and deployment order/preflight refs. | +| — | **Completable run (2026-02-27):** `run-completable-tasks-from-anywhere.sh` — config validation OK; on-chain 38/38 (Chain 138); run-all-validation --skip-genesis OK; reconcile-env --print. | + +--- + +## Completed in this pass (2026-02-28) — “What’s left” execution + +| # | Item | +|---|------| +| — | **Preflight:** Passed (RPC Core, dotenv, nonce). | +| — | **PMM pools:** All three created (cUSDT/cUSDC `0x9fcB…`, cUSDT/USDT `0xa3Ee…`, cUSDC/USDC `0x90bd…`). | +| — | **DODOPMMProvider:** Deployed at `0x8EF6657D2a86c569F6ffc337EE6b4260Bd2e59d0`; all three pools registered via `RegisterDODOPools.s.sol`. | +| — | **Operator script:** NPMplus RPC fix + backup + Blockscout verify run. | +| — | **Wemix:** Re-fetched scan.wemix.com/tokens; WEMIX_TOKEN_VERIFICATION.md updated. | +| — | **Docs:** PRE_DEPLOYMENT_CHECKLIST, LIQUIDITY_POOLS_MASTER_MAP updated. **Remaining (operator/external):** [WHATS_LEFT_OPERATOR_AND_EXTERNAL.md](WHATS_LEFT_OPERATOR_AND_EXTERNAL.md). | + +--- + +## Completed in this pass (2026-02-24) + +| # | Item | +|---|------| +| — | **Required next steps (complete):** Re-ran `run-completable-tasks-from-anywhere.sh` — config validation OK, on-chain 36/36 (Chain 138), run-all-validation --skip-genesis OK, reconcile-env --print. All in-repo required checks pass. | +| — | **Completable tasks:** `run-completable-tasks-from-anywhere.sh` — config OK, on-chain 36/36, run-all-validation --skip-genesis OK, reconcile-env. | +| — | **Forge tests:** smom-dbis-138 434 tests passed; alltra-lifi-settlement 8 tests passed. | +| — | **Bridge dry-run:** `run-send-cross-chain.sh 0.01 --dry-run` run (simulation; real send needs PRIVATE_KEY + LINK from LAN). | +| — | **CCIP checklist:** `ccip-deploy-checklist.sh` run — deployment order and VMID ranges confirmed; mainnet CCIP env (CCIP_ETH_ROUTER, CCIP_ETH_LINK_TOKEN, ETH_MAINNET_SELECTOR) noted for operator. | +| — | **Evidence:** [COMPLETION_RUN_20260224_TASKS_AND_TODOS.md](../04-configuration/verification-evidence/COMPLETION_RUN_20260224_TASKS_AND_TODOS.md). | +| — | **Full plan implementation:** [COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md](COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md) added; cross-links from phases, TODO, operator checklist, runbooks, recommendations. Re-ran run-completable-tasks-from-anywhere.sh (config OK, on-chain 36/36); phase4-sovereign-tenants.sh --show-steps and schedule-daily-weekly-cron.sh --show. | +| — | **Placeholders:** Canonical addresses (env-only) and AlltraAdapter fee (setBridgeFee) marked Done in [PLACEHOLDERS_AND_REQUIRED_ADDITIONS_LIST.md](PLACEHOLDERS_AND_REQUIRED_ADDITIONS_LIST.md). [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md) updated with Wave 0 (sendCrossChain, NPMplus backup, RPC fix) and plan index link. dbis_core TS doc: prisma generate note added for MODULE_NOT_FOUND (run pnpm install first). | +| — | **All fixes (in-repo):** [REQUIRED_FIXES_UPDATES_GAPS.md](../REQUIRED_FIXES_UPDATES_GAPS.md) §§1–6 already Done/Documented. TODOS_CONSOLIDATED, NEXT_STEPS_AND_REMAINING_TODOS, NEXT_STEPS_FOR_YOU synced to §4 (smart accounts kit, quote FABRIC_CHAIN_ID, .bak). No remaining in-repo fixes; operator/LAN and deferred (dbis_core TS, audits) unchanged. | + +## Completed in this pass (2026-02-23) + +| # | Item | +|---|------| +| — | **smom-dbis-138 deployment (all steps including optional):** Chain 138 verification (14 ok, 2 warnings); fund CCIP and fund mainnet LP dry-runs; optional G1 PMM on Polygon and run-all-four-gaps G1; optional G2 Trustless on Polygon; run-all-four-gaps and CCIPLogger documented. Report: [COMPLETION_RUN_20260223_ALL_STEPS.md](../../smom-dbis-138/docs/deployment/COMPLETION_RUN_20260223_ALL_STEPS.md). Runbook: [ALL_NEXT_STEPS_CURRENT.md](../../smom-dbis-138/docs/deployment/ALL_NEXT_STEPS_CURRENT.md). | +| — | **Optional and next steps:** Completable run (config OK, on-chain 36/36, run-all-validation --skip-genesis, reconcile-env). Shellcheck with `--optional` made non-fatal so CI and validate pass. Validate via Proxmox SSH: full shellcheck + genesis validation; jq/shellcheck installed on host when missing; genesis passed. TODOS_CONSOLIDATED, OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST, NEXT_STEPS_FOR_YOU, NEXT_STEPS_INDEX, verification evidence updated. | + +## Completed in this pass (2026-02-22) + +| # | Item | +|---|------| +| — | **DApp production UX:** Single “Connect Wallet” button with modal; nav Bridge \| Swap \| History \| Explorer (Admin/Reserve removed from main nav); text-only tabs; typography and form controls; “Start Bridge Transfer” CTA; trust footer in Layout; mobile layout. | +| — | **DApp console errors (MetaMask):** ObjectMultiplex/StreamMiddleware/“Lost connection” messages are from the MetaMask extension, not the DApp. Added disconnect handling: when the wallet disconnects unexpectedly, the DApp shows a toast (“Wallet disconnected. Please reconnect or reload the page.”). Doc: [DAPP_CONSOLE_ERRORS_METAMASK.md](../09-troubleshooting/DAPP_CONSOLE_ERRORS_METAMASK.md). | + ## Completed in this pass (2026-02-20) | # | Item | @@ -50,7 +145,7 @@ | 3 | **Bridge UIs / Snap use token-mapping** | ✅ Done | Token-aggregation returns `tokenMappingApi`; Snap has `get_token_mapping`; see REST_API_REFERENCE. | | 4 | **LINK support on Mainnet relay:** Choose Option A (extend CCIPRelayBridge) or B (separate LINK receiver); implement, deploy, fund LINK; set `relaySupported: true` for LINK in token-mapping.json; update docs. | **Operator/LAN** | [RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK](../07-ccip/RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK.md) | | 5 | **Run "from anywhere" checks:** Run `./scripts/run-completable-tasks-from-anywhere.sh` periodically (config, on-chain, validation, reconcile-env). | Anyone | NEXT_STEPS_FOR_YOU §2 | -| 6 | **Placeholders (code):** Canonical addresses in token-aggregation (env); AlltraAdapter fee (set via setBridgeFee); smart accounts kit; quote service Fabric chainId; .bak (see BAK_FILES_DEPRECATION). | Dev | REQUIRED_FIXES_UPDATES_GAPS | +| 6 | **Placeholders (code):** All done or documented per [REQUIRED_FIXES_UPDATES_GAPS.md](../REQUIRED_FIXES_UPDATES_GAPS.md) §4: canonical addresses (env), AlltraAdapter setBridgeFee, smart accounts kit (env + runbook), quote service FABRIC_CHAIN_ID (default 999), .bak (BAK_FILES_DEPRECATION). | Dev | REQUIRED_FIXES_UPDATES_GAPS | | 7 | **API keys:** Sign up per [reports/API_KEYS_REQUIRED.md](../../reports/API_KEYS_REQUIRED.md); add to `.env`. | Anyone | NEXT_STEPS_FOR_YOU §2 | --- @@ -110,7 +205,7 @@ | # | Task | Owner | Ref | |---|------|--------|-----| -| 24 | Work through [ALL_IMPROVEMENTS_AND_GAPS_INDEX.md](../ALL_IMPROVEMENTS_AND_GAPS_INDEX.md) as needed; run `bash scripts/verify/run-all-validation.sh [--skip-genesis]`. | Dev/Ops | TODO_TASK_LIST_MASTER | +| 24 | Work through [ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md](ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md) (canonical) or [ALL_RECOMMENDATIONS_HIGH_PRIORITY.md](ALL_RECOMMENDATIONS_HIGH_PRIORITY.md) (high-priority only); run `bash scripts/verify/run-all-validation.sh [--skip-genesis]`. | Dev/Ops | TODO_TASK_LIST_MASTER | | 25 | **Security:** smom audits VLT-024, ISO-024; bridge integrations BRG-VLT, BRG-ISO. | Security | TODO_TASK_LIST_MASTER §5 | | 26 | **Paymaster (optional):** Deploy per SMART_ACCOUNTS_DEPLOYMENT_NOTE when sources ready. | Optional | TODO_TASK_LIST_MASTER §2 | | 27 | **dbis_core:** ~1186 TS errors (deferred). | Dev | TODO_TASK_LIST_MASTER §8 | diff --git a/docs/00-meta/NEXT_STEPS_FOR_YOU.md b/docs/00-meta/NEXT_STEPS_FOR_YOU.md index 6a47c58..490725c 100644 --- a/docs/00-meta/NEXT_STEPS_FOR_YOU.md +++ b/docs/00-meta/NEXT_STEPS_FOR_YOU.md @@ -1,8 +1,16 @@ # Your next steps — one place -**Last Updated:** 2026-02-20 +**Last Updated:** 2026-03-02 **Purpose:** Single list of what **you** need to do next (no infra/automation). Everything else the repo can do has been completed or documented. +**Completed 2026-03-02:** Documentation consolidation: [MASTER_INDEX.md](../MASTER_INDEX.md), [README.md](../README.md), [RUNBOOKS_MASTER_INDEX.md](../RUNBOOKS_MASTER_INDEX.md) created; deprecated content (ALL_IMPROVEMENTS_AND_GAPS_INDEX) marked redirect-only. `run-completable-tasks-from-anywhere.sh` run: config OK, on-chain 38/38, validation OK, reconcile-env. **Preflight** and **run-all-next-steps-chain138.sh** run: preflight passed; mirror/pool already deployed; all 12 c* already registered as GRU; verification 38/38. Next steps index and TODOS_CONSOLIDATED updated. + +**Completed 2026-02-27:** Chain 138 "run all next steps" script added: `./scripts/deployment/run-all-next-steps-chain138.sh` (preflight → mirror+pool → register c* as GRU → verify). Docs updated: NEXT_STEPS_INDEX, DEPLOYMENT_ORDER_OF_OPERATIONS, TODOS_CONSOLIDATED, CONTRACT_NEXT_STEPS_LIST. + +**Completed 2026-03-01:** Recommended next steps: `run-completable-tasks-from-anywhere.sh` (config OK, on-chain 38/38, validation OK, reconcile-env). Progress indicators added (Step 1/4–4/4). E2E flow tasks script: `./scripts/run-e2e-flow-tasks-full-parallel.sh [--dry-run] [--wave E1]`. CONTRACT_ADDRESSES_REFERENCE and RECOMMENDATIONS_OPERATOR_CHECKLIST updated to use ADDRESS_MATRIX_AND_STATUS for correlated address matrix. + +**Completed 2026-02-23:** Optional and next steps: `run-completable-tasks-from-anywhere.sh` run (config OK, on-chain 36/36, run-all-validation --skip-genesis OK, reconcile-env). Shellcheck with `--optional` now non-fatal (CI and validate pass). Validate via Proxmox SSH: `bash scripts/run-via-proxmox-ssh.sh validate [--host IP]` runs full shellcheck + genesis validation; jq/shellcheck installed on host when missing. TODOS_CONSOLIDATED and OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST updated. + **Completed 2026-02-20:** Documentation consolidation and root cleanup (NEXT_STEPS_INDEX, DOCUMENTATION_CONSOLIDATION_PLAN; 00-meta Batch 4+5 archived; root status/temp files → docs/archive/root-cleanup-20260220; fix-wsl-ip.sh → scripts/). `run-completable-tasks-from-anywhere.sh` run: config validation OK, on-chain 45/45, run-all-validation --skip-genesis OK, reconcile-env --print. **Completed 2026-02-12:** `run-completable-tasks-from-anywhere.sh` run successfully (config validation, on-chain check 36/36, validation, reconcile-env). app-ethereum README updated with BOLOS_SDK note. See [REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS.md](REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS.md) § Completed in this pass. @@ -28,14 +36,17 @@ These can be run from your current machine (dev, WSL, CI) without Proxmox or Led | Step | Command / action | |------|------------------| | **Run all “from anywhere” checks** | `./scripts/run-completable-tasks-from-anywhere.sh` — config validation, on-chain check (SKIP_EXIT=1 if RPC unreachable), run-all-validation --skip-genesis, reconcile-env --print | -| **On-chain address list (no RPC)** | `./scripts/verify/check-contracts-on-chain-138.sh --dry-run` — lists 36 addresses only | +| **Chain 138 next steps (all in one)** | `./scripts/deployment/run-all-next-steps-chain138.sh` — preflight → mirror+pool (or `--skip-mirror`) → register c* as GRU → verify. Use `--dry-run`; set `TRANSACTION_MIRROR_ADDRESS` if mirror exists. See [TRANSACTION_MIRROR_CHAIN138_COLLISION_FIX](../03-deployment/TRANSACTION_MIRROR_CHAIN138_COLLISION_FIX.md) if CreateCollision. | +| **E2E flows (full parallel)** | `./scripts/run-e2e-flow-tasks-full-parallel.sh [--dry-run] [--wave E1]` — run E2E flow tasks by wave; see [TASKS_TO_INCREASE_ALL_E2E_FLOWS](TASKS_TO_INCREASE_ALL_E2E_FLOWS.md). | +| **On-chain address list (no RPC)** | `./scripts/verify/check-contracts-on-chain-138.sh --dry-run` — lists addresses only (no RPC) | | **Config validation** | `./scripts/validation/validate-config-files.sh` or `... --dry-run` (print only) | | **Bridge deploy dry-run** | `./scripts/deploy-and-configure-weth9-bridge-chain138.sh --dry-run` (no keys/network) | -| **Shellcheck (optional)** | `bash scripts/verify/run-shellcheck.sh --optional` — lint scripts; use without `--optional` to fix issues if shellcheck installed | +| **Shellcheck (optional)** | `bash scripts/verify/run-shellcheck.sh --optional` — lint scripts (reports findings, does not fail); use without `--optional` to fail on any finding | +| **Validate via Proxmox SSH** | `bash scripts/run-via-proxmox-ssh.sh validate [--host 192.168.11.10]` — full shellcheck + genesis validation on host; installs jq/shellcheck if missing | | **CCIP checklist (dry)** | `bash scripts/ccip/ccip-deploy-checklist.sh` — validates env and prints deploy order (no deploy) | | **Tests** | `cd smom-dbis-138 && forge test` (e2e/integration subset if full suite slow); `cd alltra-lifi-settlement && forge test && npm run test:e2e -- --forceExit` | | **Quick wins (code)** | Add progress indicators to scripts; add `--dry-run` to scripts that lack it; extend config validation (see [IMPLEMENTATION_CHECKLIST](../10-best-practices/IMPLEMENTATION_CHECKLIST.md)) | -| **Placeholders (code)** | canonical addresses in token-aggregation; AlltraAdapter fee (AlltraAdapter.sol); smart accounts kit placeholders; quote service Fabric chainId 999; .bak deprecation — see [REQUIRED_FIXES_UPDATES_GAPS](../REQUIRED_FIXES_UPDATES_GAPS.md) | +| **Placeholders (code)** | All done or documented — see [REQUIRED_FIXES_UPDATES_GAPS](../REQUIRED_FIXES_UPDATES_GAPS.md) §4 (canonical addresses, AlltraAdapter setBridgeFee, smart accounts env, quote FABRIC_CHAIN_ID, .bak BAK_FILES_DEPRECATION). | | **API keys** | Sign up at URLs in [reports/API_KEYS_REQUIRED.md](../../reports/API_KEYS_REQUIRED.md); add any new keys to `.env` | **Reference:** [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md) § “Can Be Accomplished Now”. diff --git a/docs/00-meta/NEXT_STEPS_INDEX.md b/docs/00-meta/NEXT_STEPS_INDEX.md index f1e8bb9..c41d684 100644 --- a/docs/00-meta/NEXT_STEPS_INDEX.md +++ b/docs/00-meta/NEXT_STEPS_INDEX.md @@ -1,8 +1,36 @@ # Next Steps — Index -**Last Updated:** 2026-02-20 (completable run + doc updates completed) +**Last Updated:** 2026-03-02 **Purpose:** Single entry point for "what to do next." Pick by audience and granularity. +**Documentation index:** [../MASTER_INDEX.md](../MASTER_INDEX.md) — canonical docs, deprecated list, and navigation. + +--- + +## Next steps (ordered) + +| # | Action | Command / doc | Status | +|---|--------|----------------|--------| +| 1 | From anywhere: config + on-chain + validation | `./scripts/run-completable-tasks-from-anywhere.sh` | Done 2026-03-02 | +| 2 | Before Chain 138 deploy: preflight (RPC, dotenv, nonce, cost) | `./scripts/deployment/preflight-chain138-deploy.sh [--cost]` | Done 2026-03-02 | +| 3 | **Chain 138 next steps (all in one):** preflight → mirror+pool → register c* as GRU → verify | `./scripts/deployment/run-all-next-steps-chain138.sh [--dry-run] [--skip-mirror] [--skip-register-gru] [--skip-verify]` | Done 2026-03-02 | +| 4 | Full deployment order (Phase 0–6) | [DEPLOYMENT_ORDER_OF_OPERATIONS.md](../03-deployment/DEPLOYMENT_ORDER_OF_OPERATIONS.md) | Remaining (Operator) | +| 5 | Operator: Blockscout, 502 fix, backup, deploy | [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md) | Remaining (Operator/LAN) | +| 6 | Repos & PRs (Ledger, Trust, Chainlist, on-ramps; forms pending) | [REPOSITORIES_AND_PRS_CHAIN138.md](REPOSITORIES_AND_PRS_CHAIN138.md) | Remaining (External) | +| 7 | PR-ready files (Chainlist, Trust Wallet) | [04-configuration/pr-ready/README.md](../04-configuration/pr-ready/README.md) | Remaining | + +**Remaining tasks (full list):** [NEXT_STEPS_AND_REMAINING_TODOS.md](NEXT_STEPS_AND_REMAINING_TODOS.md) § Remaining tasks. + +**Full list:** [NEXT_STEPS_AND_REMAINING_TODOS.md](NEXT_STEPS_AND_REMAINING_TODOS.md) § Next steps (ordered). **E2E flows (swap, bridge, swap-bridge-swap):** [TASKS_TO_INCREASE_ALL_E2E_FLOWS.md](TASKS_TO_INCREASE_ALL_E2E_FLOWS.md). Run E2E tasks in full parallel: `./scripts/run-e2e-flow-tasks-full-parallel.sh [--dry-run] [--wave E1]`. **Task list review (deprecated/duplicates):** [TASK_LIST_REVIEW_2026_03_01.md](TASK_LIST_REVIEW_2026_03_01.md). + +--- + +## Priority: Mainnet liquidity & ramps + +| Document | Description | +|----------|-------------| +| **[MAINNET_LIQUIDITY_AND_RAMPS_PRIORITY.md](MAINNET_LIQUIDITY_AND_RAMPS_PRIORITY.md)** | Obtain liquid on Mainnet (fund LP + relay bridge), then wire off-ramps and on-ramps. Operator steps, scripts, and ramp API wiring. | + --- ## By audience @@ -16,6 +44,14 @@ --- +## Execution plan (required / optional / recommended) + +| Document | Description | +|----------|-------------| +| **[COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md](COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md)** | Single index: Wave 0 gates, required (phases, codebase, security), optional (VLAN, HA, MetaMask/explorer), recommended (139+ items). Execution order and key refs. | + +--- + ## By granularity | Document | Granularity | Description | @@ -40,6 +76,10 @@ ## Related +- **Full deployment order of operations:** [DEPLOYMENT_ORDER_OF_OPERATIONS.md](../03-deployment/DEPLOYMENT_ORDER_OF_OPERATIONS.md) — Phase 0–6 (prerequisites → core → PMM/pools → provider → optional → cW* → verification) and remaining recommendations (R1–R24, ~139 items). +- **PMM full parity and deploy all pools:** [NEXT_STEPS_PMM_FULL_PARITY_AND_ALL_POOLS.md](../03-deployment/NEXT_STEPS_PMM_FULL_PARITY_AND_ALL_POOLS.md) — Chain 138 (verify/create pools, add liquidity, register) → multichain (deploy integration + pools on L2s) → XAU/cEURT and cW* mesh. +- **Deployment (Chain 138 / smom-dbis-138):** [PRE_DEPLOYMENT_CHECKLIST (DODO PMM, pools, provider)](../03-deployment/PRE_DEPLOYMENT_CHECKLIST.md) | [All Next Steps (Current)](../../smom-dbis-138/docs/deployment/ALL_NEXT_STEPS_CURRENT.md) | [Completion run 2026-02-23 (all steps + optional)](../../smom-dbis-138/docs/deployment/COMPLETION_RUN_20260223_ALL_STEPS.md) - **Dev/Codespaces (76.53.10.40):** [../04-configuration/DEV_CODESPACES_NEXT_STEPS_CHECKLIST.md](../04-configuration/DEV_CODESPACES_NEXT_STEPS_CHECKLIST.md) - **Deployment status:** [../03-deployment/DEPLOYMENT_STATUS_CONSOLIDATED.md](../03-deployment/DEPLOYMENT_STATUS_CONSOLIDATED.md) | [../03-deployment/DEPLOYMENT_STATUS_MASTER.md](../03-deployment/DEPLOYMENT_STATUS_MASTER.md) +- **cW* bridge (note review + task list):** [CW_BRIDGE_TASK_LIST.md](CW_BRIDGE_TASK_LIST.md) — Checks performed, bridge extension vs dedicated receiver, deploy/wire/E2E phases. **Run remaining steps:** `./scripts/deployment/run-cw-remaining-steps.sh [--dry-run|--deploy|--update-mapping|--verify]`. - **Blitzkrieg / execution spine:** [BLITZKRIEG_SUPER_PRO_MAX_MASTER_PLAN.md](BLITZKRIEG_SUPER_PRO_MAX_MASTER_PLAN.md) | [BLITZKRIEG_SOURCE_DOCUMENT_INDEX.md](BLITZKRIEG_SOURCE_DOCUMENT_INDEX.md) diff --git a/docs/00-meta/NEXT_STEPS_MASTER.md b/docs/00-meta/NEXT_STEPS_MASTER.md index e0efa03..a90734b 100644 --- a/docs/00-meta/NEXT_STEPS_MASTER.md +++ b/docs/00-meta/NEXT_STEPS_MASTER.md @@ -97,7 +97,7 @@ AddressMapper and MirrorManager deployed. TransactionMirror: deploy when needed; | Category | Missing | Total | Priority | |----------|---------|-------|----------| -| Besu RPC (only) | 3 (2506, 2507, 2508) | 19 | High | +| Besu RPC (2506–2508) | 0 (destroyed 2026-02-08) | 16 | Done — RPC 2500–2505 only | | Hyperledger / Blockscout | 0 | 6 | — (deployed) | **Reference:** MISSING_CONTAINERS_LIST.md for the full list and deployment checklist. @@ -229,5 +229,6 @@ AddressMapper and MirrorManager deployed. TransactionMirror: deploy when needed; --- -**Last Updated:** 2026-02-16 -**Maintained By:** Infrastructure Team +**Last Updated:** 2026-03-02 +**Maintained By:** Infrastructure Team +**Entry point:** Use [NEXT_STEPS_INDEX.md](NEXT_STEPS_INDEX.md) as the single entry for "what to do next"; this document is the expanded master list. diff --git a/docs/00-meta/OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md b/docs/00-meta/OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md new file mode 100644 index 0000000..bd4236f --- /dev/null +++ b/docs/00-meta/OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md @@ -0,0 +1,122 @@ +# Operator and External Completion Checklist + +**Purpose:** Items from [ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md](ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md) that **cannot** be completed from repo-only (e.g. from this workspace). They require **LAN/Proxmox access**, **operator credentials**, **external services**, or **ongoing maintenance**. + +Use this checklist when you have operator or LAN access to complete the remaining recommendations. + +**Full plan (Wave 0–3, required/optional/recommended):** [COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md](COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md). + +--- + +## 1. Proxmox / security (LAN or host access) + +| # | Action | Command or notes | +|---|--------|------------------| +| 1 | Secure .env permissions | `chmod 600 .env` (and subproject .env files); run from project root or use `scripts/security/secure-env-permissions.sh` if present | +| 2 | Secure validator key permissions | On host: `chmod 600` keys, `chown -R besu:besu` validator dirs | +| 3 | SSH key-only auth | On Proxmox/containers: set `PasswordAuthentication no`, `PubkeyAuthentication yes` in sshd_config | +| 4 | Firewall for Proxmox API (8006) | Restrict to specific IPs (e.g. iptables or UDM Pro rules) | +| 5 | Network segmentation (VLANs) | Per NETWORK_ARCHITECTURE; configure switches, Proxmox bridges, ER605 | +| 6 | Metrics (Prometheus, Besu 9545) | Deploy/configure Prometheus scrape; enable Besu metrics port | +| 7 | Health check + alerting | Configure Alertmanager / PagerDuty / Slack per MASTER_SECRETS | +| 8 | Automated backup + encrypted validator keys | Run backup script; store encrypted copies off-host | +| 9 | Backup configs + version control | Commit configs to repo or backup store from LAN | + +--- + +## 2. Deployment and runbooks (operator) + +| # | Action | When | +|---|--------|------| +| **Priority** | **Mainnet liquidity + ramps** | Fund mainnet LP and relay bridge; wire ramp API; document user flows. See [MAINNET_LIQUIDITY_AND_RAMPS_PRIORITY.md](MAINNET_LIQUIDITY_AND_RAMPS_PRIORITY.md) and [MAINNET_RAMP_USER_FLOWS.md](../04-configuration/MAINNET_RAMP_USER_FLOWS.md). | +| 10 | Integration tests for deployment scripts | Run from LAN against staging/dev | +| 11 | Runbooks: add/remove validator, upgrade Besu, key rotation, recovery, consensus | Document and run from LAN when needed | +| 12–20 | Error handling, logging, Loki, resource/network/DB tuning, CI/CD, CLI tool | Implement on infra from operator environment | + +--- + +## 3. Infrastructure and DNS (operator / when services go live) + +| # | Action | Notes | +|---|--------|-------| +| R21 | The Order / Sankofa NPMplus proxy host | When The Order portal deployed: add proxy in NPMplus; document in RPC_ENDPOINTS_MASTER, ALL_VMIDS_ENDPOINTS | +| Sankofa cutover | Replace <TARGET_IP>, <TARGET_PORT>, TBDs in SANKOFA_CUTOVER_PLAN with actual values | +| Blocks #2–#6 | Document in NETWORK_ARCHITECTURE / NETWORK_CONFIGURATION_MASTER when assigned or mark reserved | +| 75–81 | VLAN enablement, observability stack, CCIP fleet, sovereign tenants, missing containers | Per NEXT_STEPS_MASTER and deployment phases | + +--- + +## 4. Contracts and verification (operator / after deploy) + +| # | Action | Command | +|---|--------|--------| +| R1 | Verify every deployed contract on Blockscout | After each deploy when Blockscout reachable | +| R2 | Keep CONTRACT_ADDRESSES_REFERENCE and [ADDRESS_MATRIX_AND_STATUS](../11-references/ADDRESS_MATRIX_AND_STATUS.md) updated | When new contracts deployed or deprecated | +| R3 | Run on-chain check | `./scripts/verify/check-contracts-on-chain-138.sh` (set RPC_URL_138 from LAN) | +| R8 | Set RPC_URL_138; run from LAN if 192.168.11.x not reachable | Before any deploy | +| R9 | Use GAS_PRICE=1000000000 (or current min) on Chain 138 | Every forge script on 138 | +| R14 | Run verification after deploy in CI | When Blockscout reachable from runner | + +--- + +## 5. Secrets and access (operator / security) + +| # | Action | Notes | +|---|--------|-------| +| R4 | Do not use deprecated CCIPWETH9Bridge; use 0x971c... and set env | Always | +| R5 | Never commit .env or private keys; rotate exposed keys | Always | +| R7 | Restrict deployer key and RPC admin access | Access review | +| 48–52 | Secret audit, input validation, security scanning, RBAC, config validation | Run from secure env; use git-secrets, gitleaks, bandit, trivy as applicable | + +--- + +## 6. External services and submissions + +| # | Action | Where | +|---|--------|-------| +| 98 | CoinGecko submission (Chain 138) | [CoinGecko](https://www.coingecko.com/) | +| 99 | Consensys outreach (Swaps/Bridge support) | MetaMask/Consensys channels | +| 106–108 | Verify Etherlink/Jumper/LiFi for chains 138, 651940, 42793 | External APIs / docs | +| 109–121 | Tezos/Etherlink contracts and relay services | Deploy and run from operator env | + +--- + +## 7. Maintenance (ongoing) + +| # | Task | Frequency | +|---|------|-----------| +| 135 | Monitor explorer sync status | Daily | +| 136 | Monitor RPC node health (e.g. VMID 2201) | Daily | +| 137 | Check config API uptime | Weekly | +| 138 | Review explorer logs | Weekly | +| 139 | Update token list | As needed | +| R17 | Monitor critical bridge/oracle events | Ongoing | +| R18 | Ensure Blockscout (VMID 5000) up and /api reachable | Health checks | + +--- + +## 8. Optional tools (install for full automation) + +Install for scripts that recommend them: + +- **shellcheck** — `apt install shellcheck` or `brew install shellcheck`. With `--optional`, run reports findings but does not fail (CI and validate pass). +- **jq** — Required on Proxmox host for genesis validation; `run-via-proxmox-ssh.sh validate` installs it when missing. +- **wscat** — `npm i -g wscat` or use `npx -y wscat` for WebSocket RPC tests +- **sqlite3, websocat, sshpass, dig, parallel** — per verification evidence NEXT_STEPS_RUN_*.md + +--- + +## What was completed in-repo (no operator needed) + +- **Validate via Proxmox SSH (2026-02-23):** `run-via-proxmox-ssh.sh validate` runs full shellcheck on `scripts/verify/*.sh` and genesis validation (smom-dbis-138); installs shellcheck and jq on the host when missing. Shellcheck with `--optional` is non-fatal so CI and validate complete successfully. +- **Mainnet liquidity & ramps priority:** [MAINNET_LIQUIDITY_AND_RAMPS_PRIORITY.md](MAINNET_LIQUIDITY_AND_RAMPS_PRIORITY.md) and [MAINNET_RAMP_USER_FLOWS.md](../04-configuration/MAINNET_RAMP_USER_FLOWS.md) — priority plan (fund LP + relay bridge, wire ramps) and user flows for on-ramp/off-ramp; linked from ALL_NEXT_STEPS_CURRENT, NEXT_STEPS_INDEX, METAMASK_BRIDGE_SWAP, and this checklist. +- **smom-dbis-138 deployment (2026-02-23):** Chain 138 verification, fund CCIP/mainnet LP dry-runs, optional G1 PMM and G2 Trustless on L2s, run-all-four-gaps and CCIPLogger documented. See [COMPLETION_RUN_20260223_ALL_STEPS.md](../../smom-dbis-138/docs/deployment/COMPLETION_RUN_20260223_ALL_STEPS.md) and [ALL_NEXT_STEPS_CURRENT.md](../../smom-dbis-138/docs/deployment/ALL_NEXT_STEPS_CURRENT.md). +- **Shebang:** Active (non-archive) scripts under `scripts/` updated from `#!/bin/bash` to `#!/usr/bin/env bash`. +- **Script header template:** [10-best-practices/SCRIPT_HEADER_TEMPLATE.md](../10-best-practices/SCRIPT_HEADER_TEMPLATE.md) added. +- **Config validation in CI:** `.github/workflows/validate-config.yml` already runs config validation and completable-tasks dry-run; **shellcheck** added as optional step. +- **Documentation:** Quick reference cards, troubleshooting FAQ, and decision tree already exist and are linked from ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md. +- **Operator checklist:** This file; R1–R24 and remaining items are in [RECOMMENDATIONS_OPERATOR_CHECKLIST.md](RECOMMENDATIONS_OPERATOR_CHECKLIST.md) and [ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md](ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md). + +--- + +**Related:** [NEXT_STEPS_OPERATOR.md](NEXT_STEPS_OPERATOR.md), [NEXT_STEPS_AND_REMAINING_TODOS.md](NEXT_STEPS_AND_REMAINING_TODOS.md), [OPERATOR_READY_CHECKLIST.md](../04-configuration/OPERATOR_READY_CHECKLIST.md). diff --git a/docs/00-meta/OPERATOR_CONTEXT_VERIFIED.md b/docs/00-meta/OPERATOR_CONTEXT_VERIFIED.md new file mode 100644 index 0000000..699c97e --- /dev/null +++ b/docs/00-meta/OPERATOR_CONTEXT_VERIFIED.md @@ -0,0 +1,19 @@ +# Operator context — verified (remember) + +**Last verified:** 2026-03-01 +**Purpose:** Record that **this machine** has LAN and Proxmox host access so operator scripts can be run from here. + +## LAN access — OK + +- **Proxmox hosts (SSH 22):** 192.168.11.10, 192.168.11.11, 192.168.11.12 — reachable +- **Proxmox API (8006):** All three hosts — reachable +- **Chain 138 RPC (Core):** 192.168.11.211:8545 — reachable, `eth_chainId` = 0x8a (138) +- **NPMplus:** 192.168.11.167:80 — reachable +- **Blockscout API:** 192.168.11.140:4000 — reachable + +## Proxmox host access — OK + +- **SSH:** Login to `root@192.168.11.10` (ml110) succeeded (key-based). +- Operator scripts that require LAN + Proxmox (e.g. `run-all-operator-tasks-from-lan.sh`, contract verification, backup) can be run from this machine when `.env` has the required secrets (e.g. `NPM_PASSWORD`, `PRIVATE_KEY`). + +**Re-verify anytime:** From repo root, run TCP checks to the above IPs/ports or use `./scripts/verify/check-contracts-on-chain-138.sh` (uses RPC 192.168.11.211:8545). diff --git a/docs/00-meta/OPERATOR_READY_CHECKLIST.md b/docs/00-meta/OPERATOR_READY_CHECKLIST.md index ed054ba..c1c1eb9 100644 --- a/docs/00-meta/OPERATOR_READY_CHECKLIST.md +++ b/docs/00-meta/OPERATOR_READY_CHECKLIST.md @@ -1,6 +1,6 @@ # Operator Ready Checklist — Copy-Paste Commands -**Last Updated:** 2026-02-20 +**Last Updated:** 2026-03-02 **Purpose:** Single page with exact commands to complete every pending todo. Run from **repo root** on a host with **LAN** access (and `smom-dbis-138/.env` with `PRIVATE_KEY`, `NPM_PASSWORD` where noted). **From anywhere (no LAN):** `./scripts/run-completable-tasks-from-anywhere.sh` @@ -81,6 +81,20 @@ Single contract retry: `./scripts/verify/run-contract-verification-with-proxy.sh --- +## 5b. LAN: Chain 138 next steps (Phase 2: preflight → mirror+pool → register c* as GRU → verify) + +**Ref:** [DEPLOYMENT_ORDER_OF_OPERATIONS](../03-deployment/DEPLOYMENT_ORDER_OF_OPERATIONS.md) Phase 2. Use when mirror/pool/GRU registration or verify are pending. + +```bash +./scripts/deployment/run-all-next-steps-chain138.sh --dry-run # print steps only +./scripts/deployment/run-all-next-steps-chain138.sh # run all (preflight, deploy mirror+pool, register c*, verify) +./scripts/deployment/run-all-next-steps-chain138.sh --skip-mirror # pool + register + verify only (set TRANSACTION_MIRROR_ADDRESS in smom-dbis-138/.env first) +``` + +If TransactionMirror deploy fails with **CreateCollision:** set `TRANSACTION_MIRROR_ADDRESS=0xC7f2Cf4845C6db0e1a1e91ED41Bcd0FcC1b0E141` in `smom-dbis-138/.env` and re-run with `--skip-mirror`. See [TRANSACTION_MIRROR_CHAIN138_COLLISION_FIX](../03-deployment/TRANSACTION_MIRROR_CHAIN138_COLLISION_FIX.md). + +--- + ## 6. Low: DODO PMM on Chain 138 **Ref:** [OPTIONAL_DEPLOYMENTS_START_HERE](../07-ccip/OPTIONAL_DEPLOYMENTS_START_HERE.md) §2B @@ -110,7 +124,27 @@ forge script script/bridge/trustless/DeployTrustlessBridge.s.sol:DeployTrustless --- -## 8. Wemix token verification (High) +## 8. Wave 0: sendCrossChain (real) and NPMplus backup + +**sendCrossChain (real):** Requires `PRIVATE_KEY` and LINK approved in `.env`. Bridge: `0x971cD9D156f193df8051E48043C476e53ECd4693`. + +```bash +bash scripts/bridge/run-send-cross-chain.sh 0.01 [recipient_address] +# Omit --dry-run to execute. Example: bash scripts/bridge/run-send-cross-chain.sh 0.01 0x... +``` + +**NPMplus backup:** Requires `NPM_PASSWORD` in `.env` and host on LAN. + +```bash +bash scripts/verify/backup-npmplus.sh +# Or combined Wave 0: bash scripts/run-wave0-from-lan.sh +``` + +**NPMplus RPC fix (405):** From LAN: `bash scripts/nginx-proxy-manager/update-npmplus-proxy-hosts-api.sh`. Verify: `bash scripts/verify/verify-end-to-end-routing.sh`. + +--- + +## 9. Wemix token verification (High) Open [scan.wemix.com/tokens](https://scan.wemix.com/tokens); confirm WETH, USDT, USDC addresses. If different, update `config/token-mapping-multichain.json` and [WEMIX_TOKEN_VERIFICATION.md](../07-ccip/WEMIX_TOKEN_VERIFICATION.md). Then: @@ -122,6 +156,7 @@ Open [scan.wemix.com/tokens](https://scan.wemix.com/tokens); confirm WETH, USDT, ## References +- [COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md](COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md) — full plan (required, optional, recommended) - [TODOS_CONSOLIDATED.md](TODOS_CONSOLIDATED.md) — full task list - [NEXT_STEPS_AND_REMAINING_TODOS.md](NEXT_STEPS_AND_REMAINING_TODOS.md) — detail and completed items - [STEPS_FROM_PROXMOX_OR_LAN_WITH_SECRETS.md](STEPS_FROM_PROXMOX_OR_LAN_WITH_SECRETS.md) — full LAN steps diff --git a/docs/00-meta/PHASES_AND_TASKS_MASTER.md b/docs/00-meta/PHASES_AND_TASKS_MASTER.md index aa2f62a..c31de14 100644 --- a/docs/00-meta/PHASES_AND_TASKS_MASTER.md +++ b/docs/00-meta/PHASES_AND_TASKS_MASTER.md @@ -6,6 +6,8 @@ **For parallel execution:** See [PARALLEL_TASK_STRUCTURE.md](PARALLEL_TASK_STRUCTURE.md) — tasks are grouped by cohort; order of operations does not block parallel completion. Split large tasks into smaller units to maximize automation. +**Full plan (required / optional / recommended):** [COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md](COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md) — Wave 0 gates, phases, codebase, operator checklist. + --- ## Deployment Phases @@ -44,7 +46,7 @@ | 16 execute nodes (5440-5455) | Required | ⏳ Pending | | | 7 RMN nodes (5470-5476) | Required | ⏳ Pending | | | NAT pools configured | Required | ⏳ Pending | | -| Missing containers (3 only: 2506, 2507, 2508) | Optional | ⏳ Pending | [MISSING_CONTAINERS_LIST.md](../03-deployment/MISSING_CONTAINERS_LIST.md) | +| 2506–2508 (destroyed 2026-02-08) | — | Done | [MISSING_CONTAINERS_LIST.md](../03-deployment/MISSING_CONTAINERS_LIST.md) | ### Phase 4 — Sovereign Tenants ⏳ diff --git a/docs/00-meta/PLACEHOLDERS_AND_REQUIRED_ADDITIONS_LIST.md b/docs/00-meta/PLACEHOLDERS_AND_REQUIRED_ADDITIONS_LIST.md index 24324a2..a2c5348 100644 --- a/docs/00-meta/PLACEHOLDERS_AND_REQUIRED_ADDITIONS_LIST.md +++ b/docs/00-meta/PLACEHOLDERS_AND_REQUIRED_ADDITIONS_LIST.md @@ -12,8 +12,8 @@ | Item | Location | Description | Priority | |------|----------|-------------|----------| -| **Canonical addresses env-only** | `services/token-aggregation/src/config/canonical-tokens.ts` | All token addresses from env (e.g. `CUSDC_ADDRESS_138`, `WETH_ADDRESS_138`). Unset → filtered out. **Required env:** see `services/token-aggregation/README.md` and root/smom `.env.example`; document any new tokens in env or add fallback (config/DB). | Medium | -| **AlltraAdapter fee** | `contracts/bridge/adapters/evm/AlltraAdapter.sol` | `getBridgeFee()` / `setBridgeFee()` — update with actual ALL Mainnet fee after verification. Default 0.001 ALL. | Medium | +| **Canonical addresses env-only** | `services/token-aggregation/src/config/canonical-tokens.ts` | **Implemented:** Addresses from env via `SYMBOL_ADDRESS_CHAINID` (e.g. `CUSDC_ADDRESS_138`); unset → filtered out. Fallbacks in FALLBACK_ADDRESSES for 138/651940/25. See `services/token-aggregation/README.md` and `.env.example`. | Done | +| **AlltraAdapter fee** | `contracts/bridge/adapters/evm/AlltraAdapter.sol` | **Implemented:** `getBridgeFee()` / `setBridgeFee()` (admin); default 0.001 ALL. Operator: call `setBridgeFee(actualFee)` after verifying ALL Mainnet fee structure. | Done | | **Smart accounts kit** | `script/smart-accounts/DeploySmartAccountsKit.s.sol` | EntryPoint, AccountFactory, Paymaster from env; deploy and set in .env if not already. | Medium | | **Quote service Fabric chainId** | `orchestration/bridge/quote-service.ts` | Uses `FABRIC_CHAIN_ID` or fallback 999 until Fabric integrated. | Low | | **EnhancedSwapRouter / DODOPMMProvider** | `contracts/bridge/trustless/EnhancedSwapRouter.sol`, `DODOPMMProvider.sol` | Some fee/size logic returns 0 or “placeholder”; optimize when oracle/pool config ready. | Low | diff --git a/docs/00-meta/RECOMMENDATIONS_OPERATOR_CHECKLIST.md b/docs/00-meta/RECOMMENDATIONS_OPERATOR_CHECKLIST.md index 24f10de..804030d 100644 --- a/docs/00-meta/RECOMMENDATIONS_OPERATOR_CHECKLIST.md +++ b/docs/00-meta/RECOMMENDATIONS_OPERATOR_CHECKLIST.md @@ -2,7 +2,7 @@ **Purpose:** Single checklist for all recommendations from [REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS](REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS.md) Part 2. Use when deploying, verifying, or operating. -**Related:** [CONTRACT_DEPLOYMENT_RUNBOOK](../03-deployment/CONTRACT_DEPLOYMENT_RUNBOOK.md) | [BLOCKSCOUT_VERIFICATION_GUIDE](../08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md) | [MASTER_SECRETS_INVENTORY](../04-configuration/MASTER_SECRETS_INVENTORY.md) +**Related:** [CONTRACT_DEPLOYMENT_RUNBOOK](../03-deployment/CONTRACT_DEPLOYMENT_RUNBOOK.md) | [BLOCKSCOUT_VERIFICATION_GUIDE](../08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md) | [MASTER_SECRETS_INVENTORY](../04-configuration/MASTER_SECRETS_INVENTORY.md) | [COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md](COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md) (full plan: required / optional / recommended). --- @@ -11,7 +11,7 @@ | # | Action | When | |---|--------|------| | R1 | Verify every deployed contract on Blockscout (Forge Verification Proxy or BLOCKSCOUT_VERIFICATION_GUIDE) | After each deployment when Blockscout is reachable | -| R2 | Keep CONTRACT_ADDRESSES_REFERENCE and SMART_CONTRACTS_INVENTORY_ALL_CHAINS updated; reconcile duplicate .env entries | When new contracts are deployed or deprecated | +| R2 | Keep [CONTRACT_ADDRESSES_REFERENCE](../11-references/CONTRACT_ADDRESSES_REFERENCE.md) and [ADDRESS_MATRIX_AND_STATUS](../11-references/ADDRESS_MATRIX_AND_STATUS.md) updated; reconcile duplicate .env entries | When new contracts are deployed or deprecated | | R3 | Run `./scripts/verify/check-contracts-on-chain-138.sh [RPC]`; fix any MISSING/EMPTY | Periodically or after deploy | ## Security and secrets (R4–R7) @@ -37,7 +37,7 @@ | # | Action | When | |---|--------|------| | R12 | Keep CONTRACT_DEPLOYMENT_RUNBOOK, BLOCKSCOUT_VERIFICATION_GUIDE, BLOCKSCOUT_FIX_RUNBOOK in sync with scripts and Blockscout URL | After script or URL changes | -| R13 | When deploying to mainnet or other chains, document addresses in CONTRACT_ADDRESSES_REFERENCE or chain-specific doc; link from SMART_CONTRACTS_INVENTORY_ALL_CHAINS | Per-chain deploy | +| R13 | When deploying to mainnet or other chains, document addresses in CONTRACT_ADDRESSES_REFERENCE or chain-specific doc; update [ADDRESS_MATRIX_AND_STATUS](../11-references/ADDRESS_MATRIX_AND_STATUS.md) | Per-chain deploy | ## Automation and CI/CD (R14–R16) @@ -72,7 +72,7 @@ | # | Action | When | |---|--------|------| -| R23 | Scripts: add progress indicators; add --dry-run where missing; extend config validation (IMPLEMENTATION_CHECKLIST) | Script updates | +| R23 | Scripts: add progress indicators; add --dry-run where missing; extend config validation (IMPLEMENTATION_CHECKLIST). **Done:** `run-completable-tasks-from-anywhere.sh` has Step 1/4–4/4; `validate-config-files.sh`, `run-e2e-flow-tasks-full-parallel.sh`, `run-all-operator-tasks-from-lan.sh` support `--dry-run`. | Script updates | ## Token mapping (R24) diff --git a/docs/00-meta/REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS.md b/docs/00-meta/REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS.md index dfae3e0..ec874a2 100644 --- a/docs/00-meta/REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS.md +++ b/docs/00-meta/REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS.md @@ -112,7 +112,7 @@ See **Part 2** and [GAPS_AND_RECOMMENDATIONS_CONSOLIDATED](../GAPS_AND_RECOMMEND | # | Recommendation | Action | |---|----------------|--------| | R1 | **Verify every deployed contract on Blockscout** | Use [BLOCKSCOUT_VERIFICATION_GUIDE](../08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md) and Forge Verification Proxy so source is public and matches bytecode. | -| R2 | **Single source of truth** | Keep [CONTRACT_ADDRESSES_REFERENCE](../11-references/CONTRACT_ADDRESSES_REFERENCE.md) and [SMART_CONTRACTS_INVENTORY_ALL_CHAINS](../11-references/SMART_CONTRACTS_INVENTORY_ALL_CHAINS.md) updated when new contracts are deployed or deprecated; reconcile duplicate .env entries. | +| R2 | **Single source of truth** | Keep [CONTRACT_ADDRESSES_REFERENCE](../11-references/CONTRACT_ADDRESSES_REFERENCE.md) and [ADDRESS_MATRIX_AND_STATUS](../11-references/ADDRESS_MATRIX_AND_STATUS.md) updated when new contracts are deployed or deprecated; reconcile duplicate .env entries. | | R3 | **On-chain confirmation** | Periodically run on-chain checklist or `check-contracts-on-chain-138.sh`; fix any MISSING/EMPTY. | ### 2.2 Security and secrets @@ -138,7 +138,7 @@ See **Part 2** and [GAPS_AND_RECOMMENDATIONS_CONSOLIDATED](../GAPS_AND_RECOMMEND | # | Recommendation | Action | |---|----------------|--------| | R12 | **Runbooks in sync** | Keep [CONTRACT_DEPLOYMENT_RUNBOOK](../03-deployment/CONTRACT_DEPLOYMENT_RUNBOOK.md), [BLOCKSCOUT_VERIFICATION_GUIDE](../08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md), [BLOCKSCOUT_FIX_RUNBOOK](../03-deployment/BLOCKSCOUT_FIX_RUNBOOK.md) in sync with scripts and Blockscout URL. | -| R13 | **Per-chain addresses** | When deploying to mainnet or other chains, document addresses in CONTRACT_ADDRESSES_REFERENCE or chain-specific doc and link from SMART_CONTRACTS_INVENTORY_ALL_CHAINS. | +| R13 | **Per-chain addresses** | When deploying to mainnet or other chains, document addresses in CONTRACT_ADDRESSES_REFERENCE or chain-specific doc and update ADDRESS_MATRIX_AND_STATUS. | ### 2.5 Automation and CI/CD diff --git a/docs/00-meta/REMAINING_ITEMS_FULL_PARALLEL_LIST.md b/docs/00-meta/REMAINING_ITEMS_FULL_PARALLEL_LIST.md index 77e8ba4..e0c0a36 100644 --- a/docs/00-meta/REMAINING_ITEMS_FULL_PARALLEL_LIST.md +++ b/docs/00-meta/REMAINING_ITEMS_FULL_PARALLEL_LIST.md @@ -121,7 +121,7 @@ | W2-3 | VLAN enablement: UDM Pro VLAN; Proxmox bridge; migrate services to VLANs | By VLAN/host | | W2-4 | Phase 3 CCIP: Ops/Admin (5400-5401); NAT pools; commit/execute/RMN scripts | Ops → NAT → scripts | | W2-5 | Phase 4: Sovereign tenant VLANs; isolation; access control | By tenant/VLAN | -| W2-6 | **Missing containers: 3 only (2506, 2507, 2508)** — [MISSING_CONTAINERS_LIST.md](../03-deployment/MISSING_CONTAINERS_LIST.md) | By VMID/host | +| W2-6 | ~~2506–2508~~ Destroyed 2026-02-08; RPC 2500–2505 only. [MISSING_CONTAINERS_LIST.md](../03-deployment/MISSING_CONTAINERS_LIST.md) | Done (doc) | | W2-7 | DBIS services start (10100–10151); Hyperledger | By host | | W2-8 | NPMplus HA (Keepalived, 10234) | Optional | diff --git a/docs/00-meta/REMAINING_TASKS.md b/docs/00-meta/REMAINING_TASKS.md new file mode 100644 index 0000000..572f941 --- /dev/null +++ b/docs/00-meta/REMAINING_TASKS.md @@ -0,0 +1,31 @@ +# Remaining Tasks + +**Last Updated:** 2026-03-02 +**Purpose:** Single-page list of what is left to do. Completed: preflight, run-all-next-steps-chain138 (38/38 on-chain, 12 c* GRU-registered). +**Detail:** [NEXT_STEPS_AND_REMAINING_TODOS.md](NEXT_STEPS_AND_REMAINING_TODOS.md) § Remaining tasks · **Operator commands:** [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md). + +**Task check (2026-03-02):** Each task below was verified before completion. See **[TASK_CHECK_REPORT.md](TASK_CHECK_REPORT.md)** for per-task status, what is already done (e.g. Phase 0–3, DODOPMMProvider, pools), and what still requires Operator/LAN or external submission. Completable + preflight both passed. + +--- + +## Remaining (ordered) + +| # | Task | Who | Command / doc | +|---|------|-----|----------------| +| 1 | **Full deployment order (Phase 0–6)** | Operator | [DEPLOYMENT_ORDER_OF_OPERATIONS.md](../03-deployment/DEPLOYMENT_ORDER_OF_OPERATIONS.md) | +| 2 | **Chain 138 PMM:** add liquidity, DODOPMMProvider | Operator/LAN | [PRE_DEPLOYMENT_CHECKLIST.md](../03-deployment/PRE_DEPLOYMENT_CHECKLIST.md), [LIQUIDITY_POOLS_MASTER_MAP](../11-references/LIQUIDITY_POOLS_MASTER_MAP.md) | +| 3 | **Operator tasks:** Blockscout verify, 502 fix, NPMplus backup, deploy | Operator/LAN | `./scripts/run-all-operator-tasks-from-lan.sh [--deploy]` · [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md) | +| 4 | **Gnosis, Celo, Wemix CCIP bridges** | Operator/LAN | [CONFIG_READY_CHAINS_COMPLETION_RUNBOOK](../07-ccip/CONFIG_READY_CHAINS_COMPLETION_RUNBOOK.md) | +| 5 | **LINK support on Mainnet relay** | Operator/LAN | [RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK](../07-ccip/RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK.md) | +| 6 | **Repos & PRs:** Ledger, Trust Wallet, Chainlist, on-ramps | External | [REPOSITORIES_AND_PRS_CHAIN138.md](REPOSITORIES_AND_PRS_CHAIN138.md) | +| 7 | **PR-ready files:** Chainlist, Trust Wallet | Anyone | [04-configuration/pr-ready/README.md](../04-configuration/pr-ready/README.md) | +| 8 | **E2E flow waves E1–E7** | Operator/Dev | `./scripts/run-e2e-flow-tasks-full-parallel.sh` · [TASKS_TO_INCREASE_ALL_E2E_FLOWS.md](TASKS_TO_INCREASE_ALL_E2E_FLOWS.md) | + +--- + +## Optional / lower priority + +- Wemix token verification (scan.wemix.com/tokens) +- Mint tokens to deployer for LPs/bridges: [TOKENS_AND_NETWORKS_MINTABLE_TO_DEPLOYER](../11-references/TOKENS_AND_NETWORKS_MINTABLE_TO_DEPLOYER.md) +- AddressMapper on other chains; Mainnet trustless stack; cW* on public chains +See [TODOS_CONSOLIDATED.md](TODOS_CONSOLIDATED.md) for the full task list. diff --git a/docs/00-meta/REMAINING_TASKS_BREAKDOWN_MISSING_INFO.md b/docs/00-meta/REMAINING_TASKS_BREAKDOWN_MISSING_INFO.md new file mode 100644 index 0000000..a5c36f2 --- /dev/null +++ b/docs/00-meta/REMAINING_TASKS_BREAKDOWN_MISSING_INFO.md @@ -0,0 +1,248 @@ +# Remaining Tasks — Breakdown and Missing Information + +**Purpose:** For each remaining task, this doc states **what is needed**, **what is missing**, and **where to get it or what to create** so you can start completing everything. + +**Source:** [STILL_NOT_DONE_EXECUTION_CHECKLIST.md](STILL_NOT_DONE_EXECUTION_CHECKLIST.md), [OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md](OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md), [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md), [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md). + +--- + +## How to use this doc + +- **Needed** = inputs/access required to run the task. +- **Missing** = what you don’t have yet (or is TBD). +- **Where to get / What to do** = concrete action to obtain the missing piece or create it. + +--- + +## 1. Operator / LAN — Wave 0 and runbooks + +### W0-1: NPMplus RPC fix (405) + +| | Detail | +|---|--------| +| **Needed** | Host on LAN (192.168.11.x); script exists: `scripts/nginx-proxy-manager/update-npmplus-proxy-hosts-api.sh`. | +| **Missing** | 1) Physical/VPN access to 192.168.11.x. 2) `NPM_PASSWORD` (and optionally `NPM_URL`, `NPM_EMAIL`) in root `.env` so the script can call NPMplus API. | +| **Where to get** | **LAN:** Use a machine on the same network as NPMplus (e.g. office, VPN, or jump host). **NPM_PASSWORD:** From whoever manages NPMplus (default admin password or reset via container). If you have it but it’s hardcoded in a script, move it to `.env` only; see [MASTER_SECRETS_INVENTORY.md](../04-configuration/MASTER_SECRETS_INVENTORY.md). | +| **Doc** | [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md) § W0-1. | + +### W0-2: sendCrossChain (real) + +| | Detail | +|---|--------| +| **Needed** | `PRIVATE_KEY` in `.env` (wallet with gas + LINK for fees); bridge `0x971cD9D156f193df8051E48043C476e53ECd4693`; recipient address. | +| **Missing** | 1) A wallet private key you control. 2) LINK approved for the bridge fee (if the bridge charges LINK). 3) Optional: recipient address (script may have default). | +| **Where to get** | **PRIVATE_KEY:** Create or use an existing funded wallet; set in root or `smom-dbis-138/.env`. **LINK:** On Chain 138, approve LINK for the bridge contract (amount depends on fee). **Recipient:** Any valid address on the destination chain. | +| **Doc** | [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md) § W0-2; [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md) §8. | + +### W0-3: NPMplus backup + +| | Detail | +|---|--------| +| **Needed** | `NPM_PASSWORD` in `.env`; host that can reach NPMplus API (LAN). | +| **Missing** | Same as W0-1: LAN access and NPM_PASSWORD. | +| **Where to get** | Same as W0-1. Script: `scripts/verify/backup-npmplus.sh` or `scripts/run-wave0-from-lan.sh` (no `--skip-backup`). | + +### Blockscout verification + +| | Detail | +|---|--------| +| **Needed** | Blockscout reachable (e.g. from LAN or via proxy); `smom-dbis-138/.env` with keys if verification uses Etherscan/Blockscout API. | +| **Missing** | 1) Network path to Blockscout (or proxy). 2) Any API key/token if Blockscout requires it for verification. | +| **Where to get** | Run from LAN: `source smom-dbis-138/.env 2>/dev/null; ./scripts/verify/run-contract-verification-with-proxy.sh`. Retry one contract: `--only ContractName`. If Blockscout is only on 192.168.11.x, run from a host that can reach that IP. | + +### Fix E2E 502s + +| | Detail | +|---|--------| +| **Needed** | SSH from your machine to Proxmox hosts (r630-01, r630-02, ml110); optional: `NPM_PASSWORD` for NPMplus proxy update step. | +| **Missing** | 1) SSH access (key or password) to root@192.168.11.11, .12, and ml110. 2) Which backends are actually down (can discover by running the script with --dry-run or diagnose-only). | +| **Where to get** | **SSH:** Use same credentials as for Proxmox management. **Discovery:** Run `./scripts/maintenance/address-all-remaining-502s.sh --run-besu-fix --e2e` (or first `diagnose-and-fix-502s-via-ssh.sh --diagnose-only`). Runbook: [502_DEEP_DIVE_ROOT_CAUSES_AND_FIXES.md](502_DEEP_DIVE_ROOT_CAUSES_AND_FIXES.md). | + +### Run all operator tasks + +| | Detail | +|---|--------| +| **Needed** | LAN; `.env` with NPM_PASSWORD and optionally PRIVATE_KEY; SSH to Proxmox. | +| **Missing** | Same as above: LAN, NPM_PASSWORD, SSH, and (for deploy) PRIVATE_KEY. | +| **Where to get** | `./scripts/run-all-operator-tasks-from-lan.sh --dry-run` to print steps; then run without `--dry-run`, optionally `--deploy` or `--create-vms`. | + +### Gnosis, Celo, Wemix CCIP bridges + +| | Detail | +|---|--------| +| **Needed** | Per chain: RPC URL, CCIP Router address, LINK token address, WETH9/WETH10 addresses, deployer private key with **native gas** (xDAI, CELO, WEMIX). | +| **Missing** | 1) **CCIP Router + LINK + WETH9/WETH10** for each chain — from [Chainlink CCIP supported networks](https://docs.chain.link/ccip/supported-networks). 2) **Deployer wallets** funded with native gas on Gnosis, Celo, Wemix. 3) After deploy: bridge addresses for Step 2/3 (add destinations, fund LINK). | +| **Where to get** | **Addresses:** CCIP directory + chain docs (e.g. Gnosis/Celo/Wemix WETH contracts). **Gas:** Send xDAI/CELO/WEMIX to deployer. **Steps:** [CONFIG_READY_CHAINS_COMPLETION_RUNBOOK.md](../07-ccip/CONFIG_READY_CHAINS_COMPLETION_RUNBOOK.md) Step 1–4. | + +### LINK support on Mainnet relay + +| | Detail | +|---|--------| +| **Needed** | Code/contract change (extend CCIPRelayBridge for LINK or deploy LINK receiver); deploy; set `relaySupported: true` for LINK in `config/token-mapping.json`; restart relay on r630-01. | +| **Missing** | 1) Decision: Option A (extend bridge) vs Option B (separate LINK receiver). 2) Mainnet deployer key and gas. 3) Access to relay host (r630-01) to restart service. | +| **Where to get** | **Spec:** [RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK.md](../07-ccip/RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK.md). **Contract:** `smom-dbis-138/contracts/relay/CCIPRelayBridge.sol`. **Relay path:** `/opt/smom-dbis-138/services/relay` (restart from LAN/SSH). | + +### Wemix token verification + +| | Detail | +|---|--------| +| **Needed** | Correct WETH, USDT, USDC contract addresses on Wemix; update `config/token-mapping-multichain.json` and [WEMIX_TOKEN_VERIFICATION.md](../07-ccip/WEMIX_TOKEN_VERIFICATION.md) if different. | +| **Missing** | Confirmation that addresses in config match [scan.wemix.com/tokens](https://scan.wemix.com/tokens). | +| **Where to get** | Open scan.wemix.com/tokens; look up WETH, USDT, USDC; compare to repo config; edit JSON + doc; run `./scripts/validation/validate-config-files.sh`. | + +### Phase 2–4 deployment + +| | Detail | +|---|--------| +| **Needed** | Prometheus/Grafana/Loki/Alertmanager configs; VLAN design (UDM Pro + Proxmox); Phase 4 tenant list; SSH to Proxmox; optional CCIP NAT pools (ER605 Blocks #2–4). | +| **Missing** | 1) **Phase 2:** Which host(s) run monitoring stack; Alertmanager routes (email/Slack/PagerDuty). 2) **Phase 3:** NAT pool IPs/ranges for ER605 if not already set. 3) **Phase 4:** UDM Pro VLAN IDs (200–203 doc’d); which containers map to which tenant. | +| **Where to get** | **Configs:** `smom-dbis-138/monitoring/`, `scripts/monitoring/`; [OPERATIONAL_RUNBOOKS.md](../03-deployment/OPERATIONAL_RUNBOOKS.md); [WAVE2_WAVE3_OPERATOR_CHECKLIST.md](WAVE2_WAVE3_OPERATOR_CHECKLIST.md). **Phase 4 steps:** `bash scripts/deployment/phase4-sovereign-tenants.sh --show-steps`. **VLANs:** [NETWORK_ARCHITECTURE.md](../02-architecture/NETWORK_ARCHITECTURE.md) §3–5; [UDM_PRO_FIREWALL_MANUAL_CONFIGURATION.md](../04-configuration/UDM_PRO_FIREWALL_MANUAL_CONFIGURATION.md). | + +### Proxmox/security (1–9) + +| | Detail | +|---|--------| +| **Needed** | Root/SSH to Proxmox hosts; list of allowed IPs/CIDRs for API 8006; validator VMIDs and paths; backup destination. | +| **Missing** | 1) **CIDR for 8006:** Which IPs may access Proxmox API (e.g. 192.168.11.0/24 or admin VPN). 2) **Validator key paths** on each host (e.g. /var/lib/besu on VMIDs 1000–1004). 3) **Backup store** for configs and encrypted validator keys. | +| **Where to get** | **Checklist:** [OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md](OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md) §1. **Scripts:** `scripts/security/secure-env-permissions.sh`, `scripts/security/setup-ssh-key-auth.sh`, `scripts/security/firewall-proxmox-8006.sh`, `scripts/secure-validator-keys.sh`. **Backup:** `scripts/backup/automated-backup.sh`; decide where to store outputs (off-host, encrypted). | + +--- + +## 2. Sankofa cutover (missing TBDs) + +| | Detail | +|---|--------| +| **Needed** | For each Sankofa domain: target VMID, target IP, target port, service type. | +| **Missing** | **the-order.sankofa.nexus:** VMID, IP, port, service type still **TBD** in [SANKOFA_CUTOVER_PLAN.md](../04-configuration/SANKOFA_CUTOVER_PLAN.md). Other four domains have values (e.g. 7801/192.168.11.51/3000 for sankofa.nexus). | +| **Where to get** | Deploy The Order portal; assign VMID and IP; document in SANKOFA_CUTOVER_PLAN.md table; then run cutover steps (replace proxy backends in NPMplus). | + +--- + +## 3. dbis_core TypeScript (~1186 errors) + +| | Detail | +|---|--------| +| **Needed** | `npx prisma generate` succeeding in `dbis_core/`; then systematic edits per [DBIS_CORE_TS_FIXES_DETAILED_LIST.md](DBIS_CORE_TS_FIXES_DETAILED_LIST.md). | +| **Missing** | 1) **Prisma generate:** Currently fails with “path argument must be of type string. Received undefined” (possible Prisma + large schema). Fix: try Prisma 5.22+ or ensure `DATABASE_URL` in `dbis_core/.env`; or run from a clean `cd dbis_core && npm install` and retry. 2) **Bulk fixes:** Prioritized list exists; need to apply Priority 1–4 by module (imports, return statements, JsonValue, Prisma types, etc.). | +| **Where to get** | **Prisma:** Set `DATABASE_URL` in `dbis_core/.env` (e.g. postgresql://user:pass@host:5432/dbis_core); try `npx prisma generate` again; if still failing, try upgrading Prisma. **Fixes:** [DBIS_CORE_TS_FIXES_DETAILED_LIST.md](DBIS_CORE_TS_FIXES_DETAILED_LIST.md); sample return fixes already applied in market-admin, peg-admin, bridge-admin routes. **Verify:** `pnpm exec tsc --noEmit` in dbis_core. | + +--- + +## 4. Security audits and bridge integrations + +| | Detail | +|---|--------| +| **Needed** | Assignee/owner for smom audits (VLT-024, ISO-024) and bridge items (BRG-VLT, BRG-ISO); no repo automation. | +| **Missing** | Decision on who runs or commissions the audits; backlog/roadmap slot. | +| **Where to get** | Track in smom backlog; see [TODO_TASK_LIST_MASTER.md](TODO_TASK_LIST_MASTER.md) §5. | + +--- + +## 5. External / third-party + +### Ledger + +| | Detail | +|---|--------| +| **Needed** | Tally form submitted; Ledger’s response and agreement/integration steps. | +| **Missing** | Ledger’s reply and next steps (form already submitted per [ADD_CHAIN138_TO_LEDGER_LIVE.md](../04-configuration/ADD_CHAIN138_TO_LEDGER_LIVE.md)). | +| **Where to get** | Wait for Ledger; follow any link/instructions they send. | + +### Trust Wallet + +| | Detail | +|---|--------| +| **Needed** | PR to [trustwallet/wallet-core](https://github.com/trustwallet/wallet-core) with Chain 138 registry entry (CoinID 10000138, etc.). | +| **Missing** | PR not yet opened; repo fork and branch; chain 138 JSON/config per Trust’s “new EVM chain” docs. | +| **Where to get** | [ADD_CHAIN138_TO_TRUST_WALLET.md](../04-configuration/ADD_CHAIN138_TO_TRUST_WALLET.md) (steps + CoinID 10000138); clone wallet-core, add chain 138, open PR. | + +### Consensys (MetaMask Swaps/Bridge) + +| | Detail | +|---|--------| +| **Needed** | Outreach to Consensys/MetaMask for native Swaps/Bridge support for Chain 138. | +| **Missing** | Contact channel (form, email, or partner program) and a short pitch (chain live, RPC, explorer, use case). | +| **Where to get** | [metamask-integration/docs/CONSENSYS_OUTREACH_PACKAGE.md](../../metamask-integration/docs/CONSENSYS_OUTREACH_PACKAGE.md); MetaMask/Consensys partner or developer pages. | + +### CoinGecko / CMC + +| | Detail | +|---|--------| +| **Needed** | Token Aggregation report API reachable; chain + token data; 512×512 logos; CoinGecko/CMC submission forms. | +| **Missing** | 1) **Report API:** Service running and URL (e.g. for `/api/v1/report/coingecko?chainId=138`). 2) **Platform support:** CoinGecko/CMC may not list Chain 138/651940 until they add the chain. 3) **Logos:** Per-token and chain logos in required format. | +| **Where to get** | **Runbook:** [docs/04-configuration/coingecko/CMC_COINGECKO_SUBMISSION_RUNBOOK.md](../04-configuration/coingecko/CMC_COINGECKO_SUBMISSION_RUNBOOK.md); [smom-dbis-138/services/token-aggregation/docs/COINGECKO_SUBMISSION.md](../../smom-dbis-138/services/token-aggregation/docs/COINGECKO_SUBMISSION.md). **Export:** `curl "https:///api/v1/report/coingecko?chainId=138"`. If platforms don’t support 138 yet, keep runbook and submit when they do. | + +--- + +## 6. API keys (for scripts and services) + +| | Detail | +|---|--------| +| **Needed** | Keys for Li.Fi, Jumper, 1inch, MoonPay, Ramp, DocuSign, Slack, PagerDuty, Etherscan, CoinGecko, CMC, etc., in root and subproject `.env`. | +| **Missing** | Actual key values; sign-up and approval for each service. | +| **Where to get** | [reports/API_KEYS_REQUIRED.md](../../reports/API_KEYS_REQUIRED.md) (sign-up URLs and env var names); [docs/00-meta/API_KEYS_DOTENV_STATUS.md](API_KEYS_DOTENV_STATUS.md). Copy into `.env` (never commit); restart services that use them. | + +--- + +## 7. Maintenance (cron and ongoing) + +| | Detail | +|---|--------| +| **Needed** | Host where crontab can be installed (e.g. jump host or Proxmox node); scripts exist. | +| **Missing** | Decision on which host runs daily/weekly cron; one-time install. | +| **Where to get** | **Cron install (once, from LAN):** `bash scripts/maintenance/schedule-daily-weekly-cron.sh --show` then `--install`. **NPMplus backup cron:** `scripts/maintenance/schedule-npmplus-backup-cron.sh --install`. **Checks:** `scripts/maintenance/daily-weekly-checks.sh daily` / `weekly`. | + +--- + +## 8. Quick reference: scripts that exist + +| Script | Purpose | +|--------|--------| +| `scripts/run-wave0-from-lan.sh` | W0-1 + W0-3 (RPC fix + backup); run from LAN. | +| `scripts/nginx-proxy-manager/update-npmplus-proxy-hosts-api.sh` | NPMplus RPC fix only; needs NPM_PASSWORD. | +| `scripts/verify/backup-npmplus.sh` | NPMplus backup only. | +| `scripts/bridge/run-send-cross-chain.sh` | sendCrossChain; omit --dry-run to execute. | +| `scripts/verify/run-contract-verification-with-proxy.sh` | Blockscout verification. | +| `scripts/maintenance/address-all-remaining-502s.sh` | Fix 502s (+ optional --run-besu-fix --e2e). | +| `scripts/maintenance/run-all-maintenance-via-proxmox-ssh.sh --e2e` | Full maintenance + E2E. | +| `scripts/run-all-operator-tasks-from-lan.sh` | Backup + verify ± deploy ± create-vms. | +| `scripts/security/setup-ssh-key-auth.sh` | SSH key-only auth (--dry-run then --apply). | +| `scripts/security/firewall-proxmox-8006.sh` | Restrict Proxmox API to CIDR. | +| `scripts/secure-validator-keys.sh` | chmod 600 + chown besu for validator keys. | +| `scripts/maintenance/schedule-daily-weekly-cron.sh` | Daily/weekly checks cron. | + +--- + +## 9. One-page “start here” order + +1. **Get unblocked on LAN and secrets** + - Arrange VPN or machine on 192.168.11.x. + - Get NPM_PASSWORD (and optionally PRIVATE_KEY) into `.env` (never commit). + +2. **Wave 0** + - Run `scripts/run-wave0-from-lan.sh` (or RPC fix + backup separately). + - Run sendCrossChain once if you have PRIVATE_KEY and LINK. + +3. **502s and verification** + - Run `address-all-remaining-502s.sh --run-besu-fix --e2e` from LAN. + - Run Blockscout verification script. + +4. **Fill TBDs** + - Sankofa: set the-order.sankofa.nexus target (VMID, IP, port) in SANKOFA_CUTOVER_PLAN.md. + - CCIP: collect per-chain addresses (CCIP directory) and fund deployer wallets for Gnosis/Celo/Wemix. + +5. **dbis_core** + - Fix Prisma generate (DATABASE_URL, Prisma version); then apply TS fixes by priority. + +6. **External** + - Trust Wallet: open wallet-core PR. + - CoinGecko/CMC: get report API URL and logos; submit when platform supports 138. + - Consensys: send outreach using CONSENSYS_OUTREACH_PACKAGE. + - Ledger: follow up when they respond. + +7. **Maintenance** + - Install cron for daily/weekly checks and NPMplus backup on chosen host. + +--- + +**Related:** [STILL_NOT_DONE_EXECUTION_CHECKLIST.md](STILL_NOT_DONE_EXECUTION_CHECKLIST.md) | [COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md](COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md) | [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md) diff --git a/docs/00-meta/REMAINING_WORK_BREAKDOWN_AND_ANSWERS.md b/docs/00-meta/REMAINING_WORK_BREAKDOWN_AND_ANSWERS.md index fdb9fd9..5092440 100644 --- a/docs/00-meta/REMAINING_WORK_BREAKDOWN_AND_ANSWERS.md +++ b/docs/00-meta/REMAINING_WORK_BREAKDOWN_AND_ANSWERS.md @@ -96,7 +96,7 @@ | **Prerequisites** | Host that can reach Blockscout (explorer.d-bis.org or LAN); `smom-dbis-138/.env` loaded. | | **Who** | Ops or dev from LAN. | | **Steps to complete** | From repo root: `source smom-dbis-138/.env 2>/dev/null; ./scripts/verify/run-contract-verification-with-proxy.sh`. If one fails: `.../run-contract-verification-with-proxy.sh --only ContractName`. See [BLOCKSCOUT_VERIFICATION_GUIDE](../08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md) and [CONTRACT_DEPLOYMENT_RUNBOOK](../03-deployment/CONTRACT_DEPLOYMENT_RUNBOOK.md). | -| **Where to update when done** | [CONTRACT_INVENTORY_AND_VERIFICATION](../11-references/CONTRACT_INVENTORY_AND_VERIFICATION.md) — set “Verified” for each; [CONTRACT_NEXT_STEPS_LIST](../11-references/CONTRACT_NEXT_STEPS_LIST.md) — check “Blockscout verification”. | +| **Where to update when done** | [ADDRESS_MATRIX_AND_STATUS](../11-references/ADDRESS_MATRIX_AND_STATUS.md) — set “Verified” for each; [CONTRACT_NEXT_STEPS_LIST](../11-references/CONTRACT_NEXT_STEPS_LIST.md) — check “Blockscout verification”. | **Ref:** [STEPS_FROM_PROXMOX_OR_LAN_WITH_SECRETS](STEPS_FROM_PROXMOX_OR_LAN_WITH_SECRETS.md) §2. @@ -110,7 +110,7 @@ | **Prerequisites** | Access to explorer (e.g. https://explorer.d-bis.org/address/0x99b3511a2d315a497c8112c1fdd8d508d4b1e506). | | **Who** | Operator or dev. | | **Steps to complete** | 1. Open the explorer link; check contract name/source. 2. Document in [CONTRACT_ADDRESSES_REFERENCE](../11-references/CONTRACT_ADDRESSES_REFERENCE.md) (and CONTRACT_INVENTORY if needed): “At 0x99b35... the contract is [Multicall | Oracle Aggregator].” Remove or qualify the other. | -| **Where to update when done** | CONTRACT_ADDRESSES_REFERENCE § Pre-Deployed / Newly Deployed; CONTRACT_INVENTORY_AND_VERIFICATION; [REMAINING](REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS.md) task 19. | +| **Where to update when done** | CONTRACT_ADDRESSES_REFERENCE § Pre-Deployed / Newly Deployed; ADDRESS_MATRIX_AND_STATUS; [REMAINING](REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS.md) task 19. | --- @@ -279,7 +279,7 @@ ## 5. Optional / when needed - **Trustless bridge:** Deploy from `script/bridge/trustless/` when you adopt that stack; document addresses. Ref: CONTRACT_NEXT_STEPS § Pending, [OPERATOR_OPTIONAL_CHECKLIST](../11-references/OPERATOR_OPTIONAL_CHECKLIST.md) §2. -- **Mainnet/multichain deploys:** Deploy to other chains with chain-specific scripts; document in CONTRACT_ADDRESSES_REFERENCE and SMART_CONTRACTS_INVENTORY_ALL_CHAINS. Ref: R13, CONTRACT_NEXT_STEPS. +- **Mainnet/multichain deploys:** Deploy to other chains with chain-specific scripts; document in CONTRACT_ADDRESSES_REFERENCE and ADDRESS_MATRIX_AND_STATUS. Ref: R13, CONTRACT_NEXT_STEPS. - **PaymentChannelManager / GenericStateChannelManager:** Deploy when channel features are needed; use `--with-gas-price 1000000000` on 138. Ref: CONTRACT_NEXT_STEPS_LIST. - **LINK on mainnet relay bridge:** Follow [RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK](../07-ccip/RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK.md); then set `relaySupported: true` for LINK in config/token-mapping.json. - **Chain 138 Snap E2E:** Run full E2E (Playwright + MetaMask Flask) when needed; unit tests already pass. Ref: [chain138-snap/TESTING_INSTRUCTIONS](../../metamask-integration/chain138-snap/TESTING_INSTRUCTIONS.md). diff --git a/docs/00-meta/REMAINING_WORK_DETAILED_STEPS.md b/docs/00-meta/REMAINING_WORK_DETAILED_STEPS.md index 8fa15b2..58cb91d 100644 --- a/docs/00-meta/REMAINING_WORK_DETAILED_STEPS.md +++ b/docs/00-meta/REMAINING_WORK_DETAILED_STEPS.md @@ -1,11 +1,13 @@ # Remaining Work — Detailed Steps for Each Task -**Last Updated:** 2026-02-20 +**Last Updated:** 2026-02-28 **Purpose:** Single list of all remaining work with step-by-step instructions. **Sources:** [E2E_COMPLETION_TASKS_DETAILED_LIST.md](E2E_COMPLETION_TASKS_DETAILED_LIST.md), [WAVE2_WAVE3_OPERATOR_CHECKLIST.md](WAVE2_WAVE3_OPERATOR_CHECKLIST.md), [TODO_TASK_LIST_MASTER.md](TODO_TASK_LIST_MASTER.md). **Copy-paste runbook:** For a single page of ready-to-run commands, see **[NEXT_STEPS_OPERATOR.md](NEXT_STEPS_OPERATOR.md)**. +**Full plan (required / optional / recommended):** [COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md](COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md) — Wave 0 gates, required phases/codebase/security, optional, recommended (139+ items). + **Execution order:** Wave 0 → Wave 1 → Wave 2 → Wave 3 → Ongoing. Within each wave, run tasks in parallel where possible. **Infra deployment readiness:** For a single checklist of what is already in place (templates on all hosts, deps, scripts) vs what unblocks completion (LAN, SSH, creds), see **[03-deployment/INFRA_DEPLOYMENT_LOCKED_AND_LOADED.md](../03-deployment/INFRA_DEPLOYMENT_LOCKED_AND_LOADED.md)**. @@ -40,6 +42,8 @@ These can be done from your current environment (e.g. dev machine, WSL, CI) with **Completed (2026-02-20):** Doc consolidation continued — NEXT_STEPS_INDEX, DOCUMENTATION_CONSOLIDATION_PLAN; Batch 4+5 → 00-meta-pruned; ALL_TASKS_COMPLETE → root-status-reports; project root cleanup → archive/root-cleanup-20260220; fix-wsl-ip.sh → scripts/. Completable-from-anywhere run: config validation OK, on-chain check 45/45, run-all-validation --skip-genesis OK, reconcile-env --print. ARCHIVE_CANDIDATES "Last reviewed" set. +**Completed (plan implementation):** [COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md](COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md) added; cross-links from PHASES_AND_TASKS_MASTER, TODO_TASK_LIST_MASTER, RECOMMENDATIONS_OPERATOR_CHECKLIST, REMAINING_WORK_DETAILED_STEPS, OPTIONAL_RECOMMENDATIONS_INDEX, RUNBOOKS_MASTER_INDEX, ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST, OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST, FULL_PARALLEL_EXECUTION_ORDER, NEXT_STEPS_INDEX, MASTER_INDEX. Validation: run-all-validation --skip-genesis OK; run-completable-tasks-from-anywhere.sh OK (config, on-chain 36/36, reconcile-env); phase4-sovereign-tenants.sh --show-steps and schedule-daily-weekly-cron.sh --show run. + --- ## Wave 0 — Gates (Do First When Credentials Allow) diff --git a/docs/00-meta/REMAINING_WORK_DETAILED_TASKS.md b/docs/00-meta/REMAINING_WORK_DETAILED_TASKS.md index 43e7f28..a677c1e 100644 --- a/docs/00-meta/REMAINING_WORK_DETAILED_TASKS.md +++ b/docs/00-meta/REMAINING_WORK_DETAILED_TASKS.md @@ -167,7 +167,7 @@ Containers **2506, 2507, 2508** were **removed and destroyed** on all Proxmox ho | **W2-3** | VLAN enablement | Apply UDM Pro VLAN config; Proxmox VLAN-aware bridge; migrate services to VLANs (by VLAN/host). See NETWORK_ARCHITECTURE.md §3–5. | | **W2-4** | Phase 3 CCIP | 1) Deploy Ops/Admin (5400, 5401). 2) NAT pools. 3) Expand commit/execute/RMN scripts. Order: Ops first, then NAT, then scripts. See [CCIP_DEPLOYMENT_SPEC.md](../07-ccip/CCIP_DEPLOYMENT_SPEC.md). | | **W2-5** | Phase 4 sovereign tenants | Sovereign tenant VLANs; isolation; access control (by tenant/VLAN). After W2-3. | -| **W2-6** | Missing containers 2506–2508 | ✅ Created on r630-01 with .202/.203/.204. Remaining: post-create steps above (Besu config, JWT, discovery off, identity). | +| **W2-6** | 2506–2508 | 🗑️ Destroyed 2026-02-08; RPC 2500–2505 only. No action. See MISSING_CONTAINERS_LIST.md. | | **W2-7** | DBIS services / Hyperledger | Start DBIS services (10100–10151, etc.); additional Hyperledger per deployment runbooks (by host). | | **W2-8** | NPMplus HA | Optional: Keepalived, secondary 10234. See NPMPLUS_HA_SETUP_GUIDE.md. | @@ -207,7 +207,7 @@ Containers **2506, 2507, 2508** were **removed and destroyed** on all Proxmox ho All tasks that can run without LAN, SSH to Proxmox, or live credentials have been executed (config cleanup, validation, cron install, dry-runs, checklists). **What remains** requires you or a host with access: - **Wave 0:** W0-2 sendCrossChain real (`run-send-cross-chain.sh` without `--dry-run`), W0-3 run backup when NPMplus is up. -- **Post-create 2506–2508:** **Done 2026-02-06.** Besu configure run on r630-01 and ml110: `PROXMOX_HOST=192.168.11.11 bash scripts/run-configure-besu-on-host.sh` and `PROXMOX_HOST=192.168.11.10 bash scripts/run-configure-besu-on-host.sh`. Static-nodes.json and permissioned-nodes.json deployed to all running Besu nodes; discovery disabled for 2500, 2503–2508. RPC enodes (2500–2508) are not in the enode list (extraction skipped); validators + sentries only. Remaining: JWT/nginx for 2506–2508 if required; verify discovery and identity per container. +- **2506–2508:** Containers were **destroyed 2026-02-08** on all hosts. RPC range is 2500–2505 only. No post-create steps. See [MISSING_CONTAINERS_LIST.md](../03-deployment/MISSING_CONTAINERS_LIST.md). - **Wave 1 apply:** W1-1 `setup-ssh-key-auth.sh --apply`, W1-2 `firewall-proxmox-8006.sh --apply` (per host). - **Wave 2 & 3:** Deploy monitoring, VLAN, CCIP, Phase 4, DBIS, NPMplus HA; then CCIP Fleet and Phase 4 isolation. diff --git a/docs/00-meta/REPOSITORIES_AND_PRS_CHAIN138.md b/docs/00-meta/REPOSITORIES_AND_PRS_CHAIN138.md new file mode 100644 index 0000000..036eb6a --- /dev/null +++ b/docs/00-meta/REPOSITORIES_AND_PRS_CHAIN138.md @@ -0,0 +1,148 @@ +# Repositories and Pull Requests — Chain 138 (Forms Submitted, Awaiting Feedback) + +**Last Updated:** 2026-02-28 +**Purpose:** Single reference for all repositories you can add, connect, or submit PRs to for Chain 138 support — including wallets, explorers, on-ramps/off-ramps. **Forms have been submitted where applicable; we are awaiting feedback.** Use this doc to open or connect PRs when partners respond or when you are ready to contribute. + +--- + +## Status: Forms submitted, awaiting feedback + +| Integration | Form / submission | Status | +|-------------|-------------------|--------| +| **Ledger Live** | [Tally form](https://tally.so/r/mORpv8) — submitted 2026-02-13 | Awaiting Ledger response; do not start code without signed agreement | +| **Trust Wallet** | PR to wallet-core (materials ready) | Can open PR anytime; [ADD_CHAIN138_TO_TRUST_WALLET](../04-configuration/ADD_CHAIN138_TO_TRUST_WALLET.md) | +| **Consensys / MetaMask** | Outreach (contact form, business@consensys.io) | Awaiting response; no public “add chain” PR repo for Swaps/Bridge | +| **CoinGecko / CMC** | Submission via platform forms (chain/token listing) | Manual submit when ready; [CMC_COINGECKO_SUBMISSION_RUNBOOK](../04-configuration/coingecko/CMC_COINGECKO_SUBMISSION_RUNBOOK.md) | + +--- + +## 1. Ledger (form submitted — await response) + +**Form:** https://tally.so/r/mORpv8 (submitted 2026-02-13) + +**Repositories (for after Ledger confirms):** + +| Repo | Purpose | PR / connect | +|------|--------|--------------| +| **LedgerHQ/ledger-live** | Ledger Live desktop/mobile; chain list, RPC, explorer | Add Chain 138 entry per their contribution guide after agreement | +| **LedgerHQ/app-ethereum** | Device app (chain IDs, signing) | Add chain 138 to `network.c` / chain list if they request | +| **LedgerHQ/wallet-api** | Wallet API (Ethereum family, chainId) | Extend for chainId 138 when Ledger specifies | +| **bis-innovations/LedgerLive** | Your public repo for Ledger team review | Push Chain 138 materials (cryptoassets, config, patches); share with Ledger when they ask for code | + +**Docs:** [ADD_CHAIN138_TO_LEDGER_LIVE.md](../04-configuration/ADD_CHAIN138_TO_LEDGER_LIVE.md), [LEDGER_BLOCKCHAIN_INTEGRATION_COMPLETE.md](../11-references/LEDGER_BLOCKCHAIN_INTEGRATION_COMPLETE.md) + +**Do not** open PRs to LedgerHQ repos until Ledger has accepted the request and signed agreement. + +--- + +## 2. Trust Wallet (PR when ready) + +**Repository:** https://github.com/trustwallet/wallet-core + +| Action | Details | +|--------|---------| +| **Add chain** | Add Chain 138 to `registry.json` (or current registry path); use `id`, `chainId`, `explorer`, `info.rpc` etc. | +| **Codegen** | `./tools/new-evmchain dfiometa` (use registry id; requires Rust) | +| **Tests** | Extend derivation tests for Chain 138 | +| **PR** | Open PR with registry change + generated files + test updates | + +**Sample PRs:** [wallet-core #2307](https://github.com/trustwallet/wallet-core/pull/2307), [wallet-core #2157](https://github.com/trustwallet/wallet-core/pull/2157) + +**Optional — token/chain logos:** https://github.com/trustwallet/assets — submit via [assets.trustwallet.com](https://assets.trustwallet.com) for Chain 138 native tokens. + +**PR-ready file:** [docs/04-configuration/pr-ready/trust-wallet-registry-chain138.json](../04-configuration/pr-ready/trust-wallet-registry-chain138.json) — add to registry in wallet-core. See [pr-ready/README.md](../04-configuration/pr-ready/README.md). + +**Doc:** [ADD_CHAIN138_TO_TRUST_WALLET.md](../04-configuration/ADD_CHAIN138_TO_TRUST_WALLET.md) + +--- + +## 3. Chainlist / Ethereum Lists (chain metadata) + +**Repository:** https://github.com/ethereum-lists/chains +**PR-ready file:** [docs/04-configuration/pr-ready/eip155-138.json](../04-configuration/pr-ready/eip155-138.json) — copy to `_data/chains/eip155-138.json` in your fork. See [pr-ready/README.md](../04-configuration/pr-ready/README.md). + +Chain 138 may already be listed (see chainlist.org/chain/138). If you need to add or update: + +| Action | Details | +|--------|--------| +| **Add/update chain** | Add or edit `_data/chains/eip155-138.json` with name, chainId, rpc, explorers, nativeCurrency, etc. | +| **PR** | Fork ethereum-lists/chains, add/update file, open PR; follow their CONTRIBUTING.md | + +**Local spec:** `pr-workspace/chains/_data/chains/eip155-138.json` in this repo (use as source for PR content). + +--- + +## 4. Consensys / MetaMask (outreach — no public “add chain” PR) + +**Contact:** https://consensys.io/contact/ , business@consensys.io; MetaMask: https://support.metamask.io , https://developers.metamask.io + +**Repositories (reference only; Swaps/Bridge/on-ramp are Consensys-controlled):** + +| Repo | Purpose | +|------|--------| +| **MetaMask Snaps** | Your Snap can already support Chain 138; no PR to “add chain” to native Swaps/Bridge | +| **Consensys** | Native Swaps, Bridge, Buy/Sell for Chain 138 require partnership/outreach; no public PR repo for “add network” to those products | + +**Outreach package:** [metamask-integration/docs/CONSENSYS_OUTREACH_PACKAGE.md](../../metamask-integration/docs/CONSENSYS_OUTREACH_PACKAGE.md) — use for email/contact form. Await response before expecting technical PR steps. + +--- + +## 5. Price Feed — MetaMask and All Wallets + +**Master doc:** [PRICE_FEED_CHAIN138_METAMASK_AND_WALLETS.md](../04-configuration/PRICE_FEED_CHAIN138_METAMASK_AND_WALLETS.md) — single reference for adding Chain 138 USD prices to MetaMask and wallets. + +--- + +## 6. CoinGecko / CoinMarketCap (submission, not PR) + +**Submission (not GitHub PR):** + +| Platform | URL / process | +|----------|----------------| +| **CoinGecko** | https://www.coingecko.com/en/coins/new — chain and token listing request | +| **CoinMarketCap** | Use CMC listing/submission process (DEX or token form) | + +**Runbook:** [CMC_COINGECKO_SUBMISSION_RUNBOOK.md](../04-configuration/coingecko/CMC_COINGECKO_SUBMISSION_RUNBOOK.md) — export from report API (`/api/v1/report/coingecko`, `/api/v1/report/cmc`), then submit via platform forms. Chains 138 and 651940 may need to be supported by the platform first. + +--- + +## 7. On-ramps and off-ramps (connect / add network) + +Most on-ramp/off-ramp providers do not accept public PRs to “add a chain”; they use partner/API or internal chain lists. Use this list to **request** or **connect** Chain 138. + +| Provider | How to add / connect Chain 138 | Repo / link (if any) | +|----------|--------------------------------|----------------------| +| **MoonPay** | Partner/API; request network support | https://www.moonpay.com/contact — no public chain-list PR repo | +| **Ramp Network** | Partner integration; request network | https://ramp.network/ — developer/partner contact | +| **Transak** | Partner; add network via dashboard or partner API | https://transak.com/ — partner/listing request | +| **Onramper** | API; check if they support custom RPC/chainId | https://onramper.com/ | +| **Banxa** | Partner integration | https://banxa.com/ | +| **Coinbase Pay / Onramp** | Partner; add supported networks via Coinbase | https://docs.cdp.coinbase.com/ | +| **MetaMask Buy (Consensys)** | Covered by Consensys outreach above | Same as §4 | + +**Current path (no native 138):** Users buy on a supported chain (e.g. mainnet) via ramp → then bridge to Chain 138. Off-ramp: bridge 138→mainnet → sell on mainnet. See [MAINNET_LIQUIDITY_AND_RAMPS_PRIORITY.md](MAINNET_LIQUIDITY_AND_RAMPS_PRIORITY.md), [MAINNET_RAMP_USER_FLOWS.md](../04-configuration/MAINNET_RAMP_USER_FLOWS.md). + +**Ramp API in repo:** `metamask-integration/src/ramps/` — `POST /ramps/on-ramp/session`, `POST /ramps/off-ramp/session`; set API keys (MOONPAY_API_KEY, RAMP_NETWORK_API_KEY, etc.) in .env. + +--- + +## 8. Summary — what you can do now + +| Item | Action | +|------|--------| +| **Ledger** | Wait for response; then use LedgerHQ repos + bis-innovations/LedgerLive as instructed | +| **Trust Wallet** | Open PR to [trustwallet/wallet-core](https://github.com/trustwallet/wallet-core) with registry + codegen + tests | +| **Chainlist** | If 138 missing or outdated, open PR to [ethereum-lists/chains](https://github.com/ethereum-lists/chains) with `eip155-138.json` | +| **Consensys** | Use [CONSENSYS_OUTREACH_PACKAGE](../../metamask-integration/docs/CONSENSYS_OUTREACH_PACKAGE.md); await response | +| **Price Feed (MetaMask/wallets)** | See [PRICE_FEED_CHAIN138_METAMASK_AND_WALLETS.md](../04-configuration/PRICE_FEED_CHAIN138_METAMASK_AND_WALLETS.md); CoinGecko, CMC, Consensys | +| **CoinGecko/CMC** | Export from report API; submit via platform forms per runbook | +| **On-ramps/off-ramps** | Contact each provider (MoonPay, Ramp, Transak, etc.) to request Chain 138; no public PR repos | + +--- + +## See also + +- [ADD_CHAIN138_TO_LEDGER_LIVE.md](../04-configuration/ADD_CHAIN138_TO_LEDGER_LIVE.md) +- [ADD_CHAIN138_TO_TRUST_WALLET.md](../04-configuration/ADD_CHAIN138_TO_TRUST_WALLET.md) +- [WHATS_LEFT_OPERATOR_AND_EXTERNAL.md](WHATS_LEFT_OPERATOR_AND_EXTERNAL.md) +- [MAINNET_LIQUIDITY_AND_RAMPS_PRIORITY.md](MAINNET_LIQUIDITY_AND_RAMPS_PRIORITY.md) diff --git a/docs/00-meta/STILL_NOT_DONE_EXECUTION_CHECKLIST.md b/docs/00-meta/STILL_NOT_DONE_EXECUTION_CHECKLIST.md new file mode 100644 index 0000000..ad2d026 --- /dev/null +++ b/docs/00-meta/STILL_NOT_DONE_EXECUTION_CHECKLIST.md @@ -0,0 +1,84 @@ +# Still Not Done — Execution Checklist + +**Purpose:** Single checklist of every remaining item that could not be completed from repo-only (no LAN, no secrets, no external access). Use this when you have **LAN**, **credentials**, or **external accounts** to complete them. + +**Source:** [COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md](COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md), [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md), [OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md](OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md). + +--- + +## 1. Operator / LAN (Wave 0 and runbooks) + +**Blocker:** Host on LAN (192.168.11.x) and/or `NPM_PASSWORD`, `PRIVATE_KEY` in `.env`. + +| # | Task | Command / doc | +|---|------|----------------| +| 1 | **W0-1 NPMplus RPC fix (405)** | From LAN: `bash scripts/run-wave0-from-lan.sh` or `bash scripts/nginx-proxy-manager/update-npmplus-proxy-hosts-api.sh`. Verify: `bash scripts/verify/verify-end-to-end-routing.sh`. | +| 2 | **W0-2 sendCrossChain (real)** | `bash scripts/bridge/run-send-cross-chain.sh [recipient]` (omit `--dry-run`). Requires PRIVATE_KEY and LINK approved. Bridge: `0x971cD9D156f193df8051E48043C476e53ECd4693`. | +| 3 | **W0-3 NPMplus backup** | `bash scripts/verify/backup-npmplus.sh` or `bash scripts/run-wave0-from-lan.sh` (no `--skip-backup`). Requires NPM_PASSWORD. | +| 4 | **Blockscout verification** | `source smom-dbis-138/.env 2>/dev/null; ./scripts/verify/run-contract-verification-with-proxy.sh`. Retry one: `--only ContractName`. | +| 5 | **Fix E2E 502s** | `./scripts/maintenance/run-all-maintenance-via-proxmox-ssh.sh --e2e` or `./scripts/maintenance/address-all-remaining-502s.sh --run-besu-fix --e2e`. Runbook: [502_DEEP_DIVE_ROOT_CAUSES_AND_FIXES.md](502_DEEP_DIVE_ROOT_CAUSES_AND_FIXES.md). | +| 6 | **Run all operator tasks** | `./scripts/run-all-operator-tasks-from-lan.sh [--deploy] [--create-vms]`. Use `--dry-run` to print steps. | +| 7 | **Gnosis, Celo, Wemix CCIP bridges** | Per chain: set RPC, CCIP Router, LINK, WETH9/WETH10; run DeployWETHBridges; add destinations; fund LINK. Runbook: [CONFIG_READY_CHAINS_COMPLETION_RUNBOOK](../07-ccip/CONFIG_READY_CHAINS_COMPLETION_RUNBOOK.md). | +| 8 | **LINK support on Mainnet relay** | Implement per [RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK](../07-ccip/RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK.md); set `relaySupported: true` for LINK in token-mapping.json; restart relay on r630-01. | +| 9 | **Wemix token verification** | Confirm WETH, USDT, USDC on [scan.wemix.com/tokens](https://scan.wemix.com/tokens); update `config/token-mapping-multichain.json` and WEMIX_TOKEN_VERIFICATION.md if needed; run `./scripts/validation/validate-config-files.sh`. | +| 10 | **Phase 2–4 deployment** | Phase 2 observability, Phase 3 CCIP fleet, Phase 4 sovereign tenants. Runbooks: [OPERATIONAL_RUNBOOKS.md](../03-deployment/OPERATIONAL_RUNBOOKS.md), [WAVE2_WAVE3_OPERATOR_CHECKLIST.md](WAVE2_WAVE3_OPERATOR_CHECKLIST.md). | +| 11 | **Proxmox/security (1–9)** | .env chmod 600, validator keys, SSH key-only auth, firewall 8006, VLANs, metrics, backup. See [OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md](OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md) §1. | + +--- + +## 2. dbis_core TypeScript (~1186 errors, deferred) + +**Blocker:** Fixes are in-repo but deferred; require `npx prisma generate` (and possibly `npm install` in dbis_core first) then systematic edits per plan. **Done in-repo:** Priority 1 “missing return” applied in `market-admin.routes.ts`, `peg-admin.routes.ts`, `bridge-admin.routes.ts`. + +| # | Task | Command / doc | +|---|------|----------------| +| 1 | **Prisma generate** | In `dbis_core/`: run `npm install` then `npx prisma generate`. If you see "path argument must be of type string. Received undefined", it may be a Prisma bug with the large schema; try Prisma 5.22+ or set `DATABASE_URL` in `.env` and retry. | +| 2 | **Fix by priority** | Follow [DBIS_CORE_TS_FIXES_DETAILED_LIST.md](DBIS_CORE_TS_FIXES_DETAILED_LIST.md): Priority 1 (imports, route returns, assertions) → 2 (JsonValue, unknown) → 3 (Prisma, Request, null) → 4 (schema, Decimal). Verify: `pnpm exec tsc --noEmit` in dbis_core. | +| 3 | **Reference plan** | [dbis_core/TYPESCRIPT_FIXES_PRIORITIZED_PLAN.md](../../dbis_core/TYPESCRIPT_FIXES_PRIORITIZED_PLAN.md), [dbis_core/PROMPT_TYPESCRIPT_FIXES_PHASES_1_4.md](../../dbis_core/PROMPT_TYPESCRIPT_FIXES_PHASES_1_4.md). | + +--- + +## 3. Security audits and bridge integrations + +**Blocker:** smom backlog / external audits; not automatable from repo. + +| # | Task | Owner / doc | +|---|------|-------------| +| 1 | **smom Security audits** | VLT-024, ISO-024. Assign to security/audit owner; see [TODO_TASK_LIST_MASTER.md](TODO_TASK_LIST_MASTER.md) §5. | +| 2 | **Bridge integrations** | BRG-VLT, BRG-ISO. Per smom backlog; see same §5. | + +--- + +## 4. External / third-party (you) + +**Blocker:** Your signup, form submission, or PR to external services. + +| # | Task | Where / doc | +|---|------|-------------| +| 1 | **Ledger** | Await response to Tally form; sign agreement and follow Ledger integration steps. [ADD_CHAIN138_TO_LEDGER_LIVE.md](../04-configuration/ADD_CHAIN138_TO_LEDGER_LIVE.md). | +| 2 | **Trust Wallet** | Open PR to [trustwallet/wallet-core](https://github.com/trustwallet/wallet-core) with Chain 138 registry entry. [ADD_CHAIN138_TO_TRUST_WALLET](../04-configuration/ADD_CHAIN138_TO_TRUST_WALLET.md) (if present). | +| 3 | **Consensys** | Outreach for native Swaps/Bridge for Chain 138. [CONSENSYS_OUTREACH_PACKAGE](../04-configuration/CONSENSYS_OUTREACH_PACKAGE.md) or MetaMask/Consensys channels. | +| 4 | **CoinGecko/CMC** | Submit Chain 138 and tokens for MetaMask USD. [COINGECKO_SUBMISSION.md](../../smom-dbis-138/services/token-aggregation/docs/COINGECKO_SUBMISSION.md), [CMC_COINGECKO_SUBMISSION_RUNBOOK](../04-configuration/coingecko/CMC_COINGECKO_SUBMISSION_RUNBOOK.md). | + +--- + +## 5. Maintenance (ongoing) + +| # | Task | Frequency | Command / note | +|---|------|-----------|----------------| +| 1 | Monitor explorer sync | Daily | `scripts/maintenance/daily-weekly-checks.sh daily` | +| 2 | Monitor RPC (e.g. VMID 2201) | Daily | Same script | +| 3 | Config API uptime | Weekly | `daily-weekly-checks.sh weekly` | +| 4 | Review explorer logs | Weekly | Runbook: OPERATIONAL_RUNBOOKS § Maintenance | +| 5 | Update token list | As needed | token-lists; runbook [139] | +| 6 | **Cron install** | Once from LAN | `bash scripts/maintenance/schedule-daily-weekly-cron.sh --install` | + +--- + +## Quick links + +- **Breakdown — where the missing info is:** [REMAINING_TASKS_BREAKDOWN_MISSING_INFO.md](REMAINING_TASKS_BREAKDOWN_MISSING_INFO.md) — for each task: what’s needed, what’s missing, where to get it. +- **Copy-paste commands:** [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md) +- **Operator/external list:** [OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md](OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST.md) +- **Full plan:** [COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md](COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md) +- **Step-by-step:** [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md) diff --git a/docs/00-meta/TASKS_RUNBOOKS_REMAINING_AND_RECOMMENDATIONS.md b/docs/00-meta/TASKS_RUNBOOKS_REMAINING_AND_RECOMMENDATIONS.md deleted file mode 100644 index 07e094f..0000000 --- a/docs/00-meta/TASKS_RUNBOOKS_REMAINING_AND_RECOMMENDATIONS.md +++ /dev/null @@ -1,142 +0,0 @@ -# Tasks, Runbooks, Remaining Deployments, and Recommendations - -**Purpose:** Single list of (1) runbooks/tasks not yet run, (2) completed items, (3) remaining deployments, and (4) recommendations and suggestions. -**Last updated:** 2026-02-20 - -**Related:** [NEXT_STEPS_AND_REMAINING_TODOS.md](NEXT_STEPS_AND_REMAINING_TODOS.md) | [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md) | [TODO_TASK_LIST_MASTER.md](TODO_TASK_LIST_MASTER.md) | [RECOMMENDATIONS_OPERATOR_CHECKLIST.md](RECOMMENDATIONS_OPERATOR_CHECKLIST.md) | [RUNBOOKS_MASTER_INDEX.md](../RUNBOOKS_MASTER_INDEX.md) - ---- - -## 1. Runbooks / tasks not yet run (operator or when-ready) - -These have runbooks or scripts ready; execution is operator/LAN or when blockers clear. - -| # | Task | Runbook / command | Owner / blocker | -|---|------|-------------------|-----------------| -| 1 | **Wemix token verification** | Open [scan.wemix.com/tokens](https://scan.wemix.com/tokens); update `config/token-mapping-multichain.json` and [WEMIX_TOKEN_VERIFICATION.md](../07-ccip/WEMIX_TOKEN_VERIFICATION.md) if needed; run `./scripts/validation/validate-config-files.sh` | Operator | -| 2 | **Gnosis, Celo, Wemix CCIP bridges** | [CONFIG_READY_CHAINS_COMPLETION_RUNBOOK.md](../07-ccip/CONFIG_READY_CHAINS_COMPLETION_RUNBOOK.md) — deploy WETH bridges, add destinations, fund LINK | Operator/LAN | -| 3 | **LINK support on Mainnet relay** | [RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK.md](../07-ccip/RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK.md) — Option A or B, implement, deploy, set `relaySupported: true` for LINK | Operator/LAN | -| 4 | **Blockscout verification** | `source smom-dbis-138/.env 2>/dev/null; ./scripts/verify/run-contract-verification-with-proxy.sh` | Operator/LAN | -| 5 | **Fix E2E 502s** | `./scripts/maintenance/run-all-maintenance-via-proxmox-ssh.sh --e2e` or `./scripts/maintenance/address-all-remaining-502s.sh`; runbook: [502_DEEP_DIVE_ROOT_CAUSES_AND_FIXES.md](502_DEEP_DIVE_ROOT_CAUSES_AND_FIXES.md) | Operator/LAN | -| 6 | **Run all operator tasks** | `./scripts/run-all-operator-tasks-from-lan.sh [--deploy] [--create-vms]` — backup, verify, optional deploy/VMs; [STEPS_FROM_PROXMOX_OR_LAN_WITH_SECRETS.md](STEPS_FROM_PROXMOX_OR_LAN_WITH_SECRETS.md) | Operator/LAN | -| 7 | **DODO PMM on Chain 138** (create pools if not done) | Set `DODO_VENDING_MACHINE_ADDRESS`, `COMPLIANT_*` in smom-dbis-138/.env; `./scripts/deployment/run-pmm-and-pools.sh` or `scripts/setup-dodo-pools.sh`; [CUSDT_CUSDC_MULTICHAIN_LIQUIDITY_RUNBOOK](../../smom-dbis-138/docs/deployment/CUSDT_CUSDC_MULTICHAIN_LIQUIDITY_RUNBOOK.md) | Operator | -| 8 | **PMM / DODO on L2s (G1)** | Set per-chain RPC + DVM + USDT/USDC; `./smom-dbis-138/scripts/deployment/deploy-pmm-all-l2s.sh`; [OPERATOR_NEXT_STEPS_RUNBOOK](../../smom-dbis-138/docs/deployment/OPERATOR_NEXT_STEPS_RUNBOOK.md) G1 | Operator | -| 9 | **Trustless Inbox + LP on L2s (G2)** | `./smom-dbis-138/scripts/deployment/deploy-trustless-l2s.sh` | Operator | -| 10 | **Lockbox on L2s (G3)** | `TRUSTLESS_DEPLOY_LOCKBOX=1 ./smom-dbis-138/scripts/deployment/deploy-trustless-l2s.sh` | Operator | -| 11 | **Fund mainnet Liquidity Pool (G4)** | `./smom-dbis-138/scripts/deployment/fund-mainnet-lp.sh`; [LIQUIDITY_POOL_CONTROLS_RUNBOOK](../03-deployment/LIQUIDITY_POOL_CONTROLS_RUNBOOK.md) | Operator | -| 12 | **Mainnet trustless stack** | Deploy Lockbox138 (138) + InboxETH, BondManager, LiquidityPoolETH (Mainnet); [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md) §7 | Operator | -| 13 | **cUSDT/cUSDC to other chains + Uniswap/Balancer/Curve** | [CUSDT_CUSDC_MULTICHAIN_LIQUIDITY_RUNBOOK](../../smom-dbis-138/docs/deployment/CUSDT_CUSDC_MULTICHAIN_LIQUIDITY_RUNBOOK.md); scripts: `deploy-cusdt-cusdc-all-chains.sh`, `create-uniswap-v3-pool-cusdt-cusdc.sh` | Operator | -| 14 | **CCIPLogger on Mainnet, BSC, Polygon, Gnosis** | `forge script script/DeployCCIPLogger.s.sol --rpc-url --broadcast` per chain | Operator | -| 15 | **AddressMapper on other chains** (optional) | DeployAddressMapperOtherChain.s.sol per chain; update `config/smart-contracts-master.json` | Optional | -| 16 | **Paymaster (optional)** | `forge script script/smart-accounts/DeployPaymaster.s.sol --rpc-url $RPC_URL_138 --broadcast` when sources ready | Optional | - ---- - -## 2. Blocked or when-stuck-tx-cleared - -| # | Task | Blocker | When unblocked | -|---|------|---------|-----------------| -| 17 | **Chain 138 deployments (Phase 6/8, trustless, vault, etc.)** | Stuck tx / "Replacement transaction underpriced" | Flush mempool from RPC host or use fresh wallet; then `./smom-dbis-138/scripts/deployment/run-all-deployments-parallel.sh chain138` | -| 18 | **eMoney TokenFactory138, bridge, vault, reserve** | Same stuck tx on 138 | [cancel-pending-transactions.sh](../../scripts/cancel-pending-transactions.sh) or resolve from RPC node; [TODO_TASKS_STATUS](../../smom-dbis-138/docs/deployment/TODO_TASKS_STATUS.md) | -| 19 | **Cronos: ISO-4217W, Compliant Fiat, CCIPLogger** | Nonce / insufficient CRO | `./smom-dbis-138/scripts/deployment/fix-nonce-and-retry.sh cronos "script/...";` fund CRO | - ---- - -## 3. Completed (summary) - -- **From-anywhere:** `run-completable-tasks-from-anywhere.sh` (config validation, on-chain check, validation, reconcile-env). -- **Token-mapping API:** Bridge UIs/Snap use token-mapping; token-aggregation exposes API; doc hygiene (MAPPER_GAPS, Wemix scan). -- **AddressMapper on Cronos:** Deployed; config updated. -- **Runbooks and indexes:** OPERATIONAL_RUNBOOKS, RUNBOOKS_MASTER_INDEX, CUSDT multichain runbook, LIQUIDITY_POOL_CONTROLS, operator checklist. -- **Chain 138:** Core contracts, CCIP, Oracle, Mock DVM + DODOPMMIntegration (pools can be created); CCIPTxReporter deployed. -- **Canonical tokens (L2):** cUSDT/cUSDC supported in token-aggregation for chains 1, 56, 137, 10, 42161, 8453, 43114, 25, 100 when env set. - ---- - -## 4. Remaining deployments (by area) - -| Area | What remains | Runbook / ref | -|------|-------------------------------|----------------| -| **CCIP** | Gnosis, Celo, Wemix WETH9/WETH10 bridges; add destinations; fund LINK | CONFIG_READY_CHAINS_COMPLETION_RUNBOOK | -| **Relay** | LINK support on Mainnet (extend or new receiver); fund; token-mapping `relaySupported: true` | RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK | -| **Trustless** | Mainnet: InboxETH, BondManager, LiquidityPoolETH; optional Lockbox/Inbox on L2s | OPERATOR_READY_CHECKLIST §7; deploy-trustless-l2s.sh | -| **PMM** | Chain 138: create cUSDT/cUSDC pools if not done; L2s: deploy DODOPMMIntegration per chain | CUSDT_CUSDC_MULTICHAIN_LIQUIDITY_RUNBOOK; deploy-pmm-all-l2s.sh | -| **Liquidity** | Fund mainnet LiquidityPoolETH (ETH/WETH) | fund-mainnet-lp.sh | -| **cUSDT/cUSDC multichain** | Deploy tokens to BSC, Polygon, Base, etc.; create Uniswap/Balancer/Curve pools | CUSDT_CUSDC_MULTICHAIN_LIQUIDITY_RUNBOOK; deploy-cusdt-cusdc-all-chains.sh | -| **Optional** | AddressMapper other chains; CCIPLogger other chains; Paymaster; vault/reserve/Keeper per chain | OPERATOR_OPTIONAL_CHECKLIST; OPTIONAL_DEPLOYMENTS_START_HERE | - ---- - -## 5. External / third-party (not runnable in-repo) - -| # | Task | Action | Ref | -|---|------|--------|-----| -| 20 | **Ledger** | Await response to Tally form; sign and follow integration steps | ADD_CHAIN138_TO_LEDGER_LIVE | -| 21 | **Trust Wallet** | Open PR to trustwallet/wallet-core with Chain 138 registry entry | ADD_CHAIN138_TO_TRUST_WALLET | -| 22 | **Consensys** | Outreach for native Swaps/Bridge for Chain 138 | CONSENSYS_OUTREACH_PACKAGE | -| 23 | **CoinGecko/CMC** | Submit Chain 138 and tokens for MetaMask USD | COINGECKO_SUBMISSION_GUIDE; CMC_COINGECKO_SUBMISSION_RUNBOOK | - ---- - -## 6. Tezos / Etherlink (when scoped) - -| # | Task | Ref | -|---|------|-----| -| 24 | Verify Etherlink (42793) on CCIP; record selector/Router or "custom relay only" | TEZOS_CCIP_REMAINING_ITEMS | -| 25 | Verify Jumper and LiFi for 138, 651940, 42793; update config/matrix | TEZOS_CCIP_REMAINING_ITEMS | -| 26 | InitializeRegistry, DeployAllAdapters, Etherlink receiver, relay services | TEZOS_CCIP_RUNBOOKS_INDEX | - ---- - -## 7. Recommendations and suggestions (R1–R24 and more) - -**Source:** [RECOMMENDATIONS_OPERATOR_CHECKLIST.md](RECOMMENDATIONS_OPERATOR_CHECKLIST.md) (R1–R24) and [REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS.md](REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS.md). - -| # | Recommendation | When | -|---|-----------------|------| -| R1 | Verify every deployed contract on Blockscout (proxy or BLOCKSCOUT_VERIFICATION_GUIDE) | After each deployment when Blockscout reachable | -| R2 | Keep CONTRACT_ADDRESSES_REFERENCE and SMART_CONTRACTS_INVENTORY updated; reconcile .env | When new contracts deployed or deprecated | -| R3 | Run `./scripts/verify/check-contracts-on-chain-138.sh [RPC]`; fix any MISSING/EMPTY | Periodically or after deploy | -| R4 | Do not use deprecated CCIPWETH9Bridge; use only current and set CCIPWETH9_BRIDGE_CHAIN138 | Always | -| R5 | Never commit .env or private keys; use MASTER_SECRETS_INVENTORY; rotate if exposed | Always | -| R8 | Set RPC_URL_138 (Core); run from LAN/VPN if 192.168.11.x not reachable | Before deploy | -| R9 | Use GAS_PRICE=1000000000 (or current min) on Chain 138 | Every forge script on 138 | -| R10 | Deploy order: 01_DeployCore first, set env, then 02_DeployBridges; alltra: MerchantSettlementRegistry before WithdrawalEscrow | Deploy order | -| R12 | Keep CONTRACT_DEPLOYMENT_RUNBOOK, BLOCKSCOUT_VERIFICATION_GUIDE, BLOCKSCOUT_FIX_RUNBOOK in sync with scripts/URL | After script or URL changes | -| R14 | Run run-contract-verification-with-proxy.sh after deployments when Blockscout reachable | CI after deploy | -| R17 | Monitor bridge/oracle events (TransferInitiated, TransferCompleted, price updates) | Ongoing | -| R18 | Ensure Blockscout (VMID 5000) up and /api reachable | Health checks | -| R19 | Run `forge test` in smom-dbis-138 and alltra-lifi-settlement before deploying | Pre-deploy | -| R21 | When The Order deployed: NPMplus proxy host; document in RPC_ENDPOINTS_MASTER, ALL_VMIDS_ENDPOINTS; replace SANKOFA_CUTOVER_PLAN TBDs | Sankofa/The Order go-live | -| R24 | Keep config/token-mapping.json single source of truth for 138↔Mainnet; update when adding tokens | Adding tokens | - -**Additional suggestions:** - -- Run `./scripts/run-completable-tasks-from-anywhere.sh` periodically (no LAN). -- Work through [ALL_IMPROVEMENTS_AND_GAPS_INDEX.md](../ALL_IMPROVEMENTS_AND_GAPS_INDEX.md) as needed; run `bash scripts/verify/run-all-validation.sh [--skip-genesis]`. -- Security: smom audits VLT-024, ISO-024; bridge integrations BRG-VLT, BRG-ISO (TODO_TASK_LIST_MASTER §5). -- dbis_core: ~1186 TS errors (deferred). -- Scripts: add progress indicators; add `--dry-run` where missing (R23). - ---- - -## 8. Quick command reference - -| Goal | Command | -|------|---------| -| From anywhere (no LAN) | `./scripts/run-completable-tasks-from-anywhere.sh` | -| Operator backup + verify | `./scripts/run-all-operator-tasks-from-lan.sh` | -| Operator + deploy | `./scripts/run-all-operator-tasks-from-lan.sh --deploy` | -| Blockscout verify | `source smom-dbis-138/.env 2>/dev/null; ./scripts/verify/run-contract-verification-with-proxy.sh` | -| E2E 502 fix | `./scripts/maintenance/run-all-maintenance-via-proxmox-ssh.sh --e2e` | -| Config validation | `./scripts/validation/validate-config-files.sh` | -| On-chain check 138 | `./scripts/verify/check-contracts-on-chain-138.sh` | -| Full validation | `bash scripts/verify/run-all-validation.sh [--skip-genesis]` | -| Deploy cUSDT/cUSDC all chains | `./smom-dbis-138/scripts/deployment/deploy-cusdt-cusdc-all-chains.sh` | -| PMM on L2s | `./smom-dbis-138/scripts/deployment/deploy-pmm-all-l2s.sh` | -| Fund mainnet LP | `./smom-dbis-138/scripts/deployment/fund-mainnet-lp.sh` | - ---- - -**Single-page operator copy-paste:** [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md). -**All runbooks:** [RUNBOOKS_MASTER_INDEX.md](../RUNBOOKS_MASTER_INDEX.md). diff --git a/docs/00-meta/TASKS_TO_INCREASE_ALL_E2E_FLOWS.md b/docs/00-meta/TASKS_TO_INCREASE_ALL_E2E_FLOWS.md new file mode 100644 index 0000000..69f55ff --- /dev/null +++ b/docs/00-meta/TASKS_TO_INCREASE_ALL_E2E_FLOWS.md @@ -0,0 +1,160 @@ +# Tasks Required to Increase All End-to-End Flows + +**Last Updated:** 2026-02-28 +**Purpose:** Single list of all tasks needed to complete and improve every E2E flow (same-chain swap, bridge-only, swap–bridge–swap). +**Flows:** [DEX_AND_AGGREGATORS_CHAIN138_EXPLAINER.md](../04-configuration/DEX_AND_AGGREGATORS_CHAIN138_EXPLAINER.md) §6 — Flow A (swap on 138), Flow B (bridge from 138), Flow C (swap → bridge → swap). + +--- + +## Legend + +| Type | Meaning | +|------|---------| +| **Op** | Operator (LAN/Proxmox, credentials) | +| **Auto** | Script exists; run or schedule | +| **Code** | Code or config change | +| **Doc** | Documentation / design | +| **Def** | Blocked or deferred | + +--- + +## Flow A: Swap on Chain 138 only (same chain) + +**Goal:** User can resolve tokens → get quote → execute swap on 138 (cUSDT↔cUSDC, cUSDT↔USDT, cUSDC↔USDC). + +| # | Task | Type | Notes | +|---|------|------|-------| +| A1 | Ensure Core RPC (138) writable and reachable | Op | [REQUIRED_FIXES_AND_DEPLOYMENTS_STATUS](../03-deployment/REQUIRED_FIXES_AND_DEPLOYMENTS_STATUS.md). `make-rpc-vmids-writable-via-ssh.sh`, `health-check-rpc-2101.sh`. | +| A2 | Verify or create three PMM pools on 138 | Op/Auto | cUSDT/cUSDC, cUSDT/USDT, cUSDC/USDC. `CreateCUSDTCUSDCPool.s.sol`, `CreateCUSDTUSDTPool.s.sol`, `CreateCUSDCUSDCPool.s.sol` or `setup-dodo-pools.sh`. [NEXT_STEPS_PMM_FULL_PARITY](../03-deployment/NEXT_STEPS_PMM_FULL_PARITY_AND_ALL_POOLS.md). | +| A3 | Register pools with DODOPMMProvider | Op | Set `POOL_CUSDTCUSDC`, `POOL_CUSDTUSDT`, `POOL_CUSDCUSDC` in .env; run `RegisterDODOPools.s.sol`. | +| A4 | Add liquidity to all three PMM pools | Op | `AddLiquidityPMMPoolsChain138.s.sol` with `ADD_LIQUIDITY_BASE_AMOUNT`, `ADD_LIQUIDITY_QUOTE_AMOUNT`; or `run-pmm-full-parity-all-phases.sh` with amounts set. | +| A5 | Ensure token-aggregation indexes DODO on 138 | Op/Code | Set `CHAIN_138_DODO_PMM_INTEGRATION` in env; run indexer so `GET /api/v1/quote` returns DODO quotes. | +| A6 | Expose token-aggregation API for dApps/Snap | Op | Proxy `/api/v1/*` (e.g. from explorer.d-bis.org) to token-aggregation service; or set `GATSBY_SNAP_API_BASE_URL`. | +| A7 | (Optional) Deploy EnhancedSwapRouter on 138 | Op/Def | Only after Uniswap/Balancer pools exist on 138; configure quoter and pool IDs. | +| A8 | (Optional) Add N-hop quote/pathfinding | Code | Token-aggregation today is single-hop only; add graph-based A→B→C pathfinding if needed. | + +--- + +## Flow B: Bridge from Chain 138 (no destination swap) + +**Goal:** User can get bridge routes → (optional) resolve token mapping → send bridge tx 138 → destination. + +| # | Task | Type | Notes | +|---|------|------|-------| +| B1 | Ensure CCIP bridges on 138 configured and funded | Op | CCIPWETH9Bridge, CCIPWETH10Bridge; destinations set; bridges funded with LINK. [CONFIG_READY_CHAINS_COMPLETION_RUNBOOK](../07-ccip/CONFIG_READY_CHAINS_COMPLETION_RUNBOOK.md). | +| B2 | Run bridge destination config (138 ↔ Gnosis/Cronos/Celo/Wemix etc.) | Op | `complete-config-ready-chains.sh`; fund remote bridges with LINK (`fund-ccip-bridges-with-link.sh`, `check-link-balance-config-ready-chains.sh`). | +| B3 | Ensure relay (138→Mainnet) operational if using relay path | Op | Relay service running; Mainnet CCIPRelayBridge funded with WETH. | +| B4 | Token-aggregation: `GET /api/v1/bridge/routes` returns correct Chain 138 bridges | Code/Op | Set `BRIDGE_LIST_JSON_URL` or built-in routes; verify response has `chain138Bridges`. | +| B5 | Token mapping API for 138↔destination | Code/Op | `GET /api/v1/token-mapping`, `token-mapping/resolve`; ensure `token-mapping-multichain.json` or loader includes 138 and target chains. | +| B6 | Frontend/dApp: wire Bridge UI to routes + token mapping | Code | Use `/api/v1/bridge/routes` and `/api/v1/token-mapping/resolve`; show supported tokens and destination addresses. | +| B7 | Test 138→destination and destination→138 with small amounts | Op | Run [T1_2_BRIDGE_RESOLUTION_TASKS](../06-besu/T1_2_BRIDGE_RESOLUTION_TASKS_DETAILED.md) § Task 3.5; document tx hashes. | + +--- + +## Flow C: Swap on 138 → bridge → swap on destination + +**Goal:** User gets full quote (source swap + bridge + destination swap), then executes (or coordinator does in one tx). + +| # | Task | Type | Notes | +|---|------|------|-------| +| C1 | Complete Flow A (liquidity and quote on 138) | — | Prerequisite: swap on 138 must work. | +| C2 | Complete Flow B (bridge configured and funded) | — | Prerequisite: bridge must work. | +| C3 | Orchestration: `POST /api/bridge/quote` returns sourceSwapQuote and destinationSwapQuote | Code/Op | Set `BRIDGE_REGISTRY_ADDRESS`; optional `ENHANCED_SWAP_ROUTER_ADDRESS` (source), `DESTINATION_RPC_URL`, `DESTINATION_SWAP_ROUTER_ADDRESS`. QuoteService already supports optional swap quotes. | +| C4 | (Optional) Deploy SwapBridgeSwapCoordinator on-chain | Op | One tx: swap (source) → bridge → swap (destination). [DODO_PMM_NEXT_STEPS](../../smom-dbis-138/docs/bridge/DODO_PMM_NEXT_STEPS.md); deploy when full E2E on-chain flow is required. | +| C5 | Destination-chain DEX/aggregator for destinationSwapQuote | Code/Op | Ensure destination chain has DEX or aggregator API; wire QuoteService to it for `destinationSwapQuote`. | +| C6 | Frontend: “Get full path quote” and execute (or submit coordinator tx) | Code | Call `POST /api/bridge/quote`; display minReceived, sourceSwapQuote, destinationSwapQuote; button to execute steps or coordinator. | +| C7 | E2E test: swap on 138 → bridge → swap on destination | Op/Auto | Automated or manual test; document success and tx hashes. | + +--- + +## Cross-cutting (all flows) + +### Infrastructure and verification + +| # | Task | Type | Notes | +|---|------|------|-------| +| X1 | RPC 2101 (Core) writable and healthy | Op | [RPC_2101_READONLY_FIX](../03-deployment/RPC_2101_READONLY_FIX.md); health-check-rpc-2101.sh. | +| X2 | On-chain contract verification (Blockscout) | Op | `run-contract-verification-with-proxy.sh` from LAN; [DEPLOY_CONFIRM_AND_FULL_E2E_RUNBOOK](DEPLOY_CONFIRM_AND_FULL_E2E_RUNBOOK.md) §2. | +| X3 | E2E routing (DNS + HTTPS + RPC) | Auto | `verify-end-to-end-routing.sh`; fix 502s from LAN if needed. [TASKS_TO_COMPLETE_AND_FIX](TASKS_TO_COMPLETE_AND_FIX.md). | +| X4 | Explorer E2E (homepage, API, SPA) | Auto | `explorer-monorepo/scripts/e2e-test-explorer.sh`; [DEPLOY_CONFIRM_AND_FULL_E2E_RUNBOOK](DEPLOY_CONFIRM_AND_FULL_E2E_RUNBOOK.md) §5. | +| X5 | Token-aggregation health and DB | Op | PostgreSQL/TimescaleDB; indexer running; `GET /health` and `/api/v1/chains` succeed. | +| X6 | TransactionMirror (if used) deployed and address in .env | Op | Deploy via `deploy-transaction-mirror-and-pmm-pool-after-txpool-clear.sh`; set `TRANSACTION_MIRROR_ADDRESS`. | +| X7 | Deployer/admin funded on 138 and on destination chains (for deploy/tests) | Op | Gas tokens; LINK where needed for bridge fees. | + +### Token list and discovery + +| # | Task | Type | Notes | +|---|------|------|-------| +| X8 | Public token list URL for Chain 138 (MetaMask, dApps) | Op/Code | `GET /api/v1/report/token-list?chainId=138` or static list; point MetaMask/dApp to this URL. [TOKEN_LIST_AUTHORING_GUIDE](../11-references/TOKEN_LIST_AUTHORING_GUIDE.md). | +| X9 | Canonical token addresses in config and .env | Op | [ADDRESS_MATRIX_AND_STATUS](../11-references/ADDRESS_MATRIX_AND_STATUS.md); reconcile config/smart-contracts-master.json and .env. | + +### Multichain (extend flows to L2s) + +| # | Task | Type | Notes | +|---|------|------|-------| +| X10 | Deploy cUSDT/cUSDC on each target L2 | Op | [NEXT_STEPS_PMM_FULL_PARITY](../03-deployment/NEXT_STEPS_PMM_FULL_PARITY_AND_ALL_POOLS.md) Phase 2; `deploy-cusdt-cusdc-all-chains.sh`. | +| X11 | Deploy DODOPMMIntegration + pools + provider + liquidity on each L2 | Op | `deploy-pmm-all-l2s.sh`; create pools; deploy provider; register; add liquidity. Enables Flow A and C on L2s. | +| X12 | Token-aggregation and bridge quote support for new chains | Code/Op | Add chain IDs and RPCs; token mapping for 138↔L2; bridge routes for new chains. | + +### Documentation and runbooks + +| # | Task | Type | Notes | +|---|------|------|-------| +| X13 | Update PMM_DEX_ROUTING_STATUS when pools + liquidity are live | Doc | Set “pools created” and “liquidity added”; update CONTRACT_ADDRESSES / ADDRESS_MATRIX if new addresses. | +| X14 | Runbooks for operator: swap, bridge, swap-bridge-swap | Doc | Point operators to [DEX_AND_AGGREGATORS_CHAIN138_EXPLAINER](../04-configuration/DEX_AND_AGGREGATORS_CHAIN138_EXPLAINER.md), [CONFIG_READY_CHAINS_COMPLETION_RUNBOOK](../07-ccip/CONFIG_READY_CHAINS_COMPLETION_RUNBOOK.md), [NEXT_STEPS_PMM_FULL_PARITY](../03-deployment/NEXT_STEPS_PMM_FULL_PARITY_AND_ALL_POOLS.md). | + +--- + +## Summary by flow + +| Flow | Description | Key tasks | +|------|-------------|-----------| +| **A** | Swap on Chain 138 only | A1–A6 (RPC, pools, liquidity, token-aggregation, API exposure); A7–A8 optional. | +| **B** | Bridge from 138 | B1–B7 (CCIP config, funding, relay, routes API, token mapping, UI, test). | +| **C** | Swap → bridge → swap | C1–C7 (depends on A+B; quote API with swap quotes; optional coordinator; destination DEX; E2E test). | +| **Cross-cutting** | Infra, tokens, multichain, docs | X1–X14. | + +--- + +## Execution order (suggested) + +1. **Gates:** X1 (RPC), X6 (TransactionMirror if needed), X7 (fund deployer). +2. **Flow A:** A1 → A2 → A3 → A4 → A5 → A6; then A7–A8 if desired. +3. **Flow B:** B1 → B2 → B3 → B4 → B5; B6 (frontend); B7 (test). +4. **Flow C:** C1, C2 → C3 → C5, C6 → C4 (optional) → C7. +5. **Cross-cutting:** X2–X5, X8–X9 (any time); X10–X12 (multichain when ready); X13–X14 (docs). + +**Parallel:** A2–A4 can use `run-pmm-full-parity-all-phases.sh` (Phase 1). B1–B2 and bridge funding can run per chain in parallel where scripts support it. + +--- + +## Full Parallel execution (waves) + +Run **all items in a wave in parallel**; then run the next wave. Script: `./scripts/run-e2e-flow-tasks-full-parallel.sh` (from repo root). + +| Wave | Tasks (run in parallel) | Notes | +|------|-------------------------|--------| +| **E0 — Gates** | X1, X6, X7; A1 | RPC writable, TransactionMirror, deployer funded; Core RPC reachable. Operator. | +| **E1 — Flow A (Chain 138 DEX)** | A2, A3, A4 | Create pools, register, add liquidity: `run-pmm-full-parity-all-phases.sh` Phase 1 (internal parallel: pool create, then register, then add). | +| **E2 — Flow B (bridge)** | B1, B2 | CCIP config + destinations; fund bridges: `complete-config-ready-chains.sh`, `fund-ccip-bridges-with-link.sh`. Per-chain parallel where supported. | +| **E3 — Code/config (no LAN)** | A5, B4, B5, C3, X8 | Token-aggregation env (`CHAIN_138_DODO_PMM_INTEGRATION`); bridge routes API; token mapping; quote API; token list URL; reconcile .env. | +| **E4 — Infra/verify** | X2, X3, X4, X5 | Blockscout verify; E2E routing; explorer E2E; token-aggregation health. Operator/LAN. | +| **E5 — Multichain** | X10, X11, X12 | Deploy cUSDT/cUSDC + PMM on L2s; token-aggregation + bridge for new chains. `run-pmm-full-parity-all-phases.sh` Phase 2 (parallel per chain). | +| **E6 — Frontend + test** | B6, B7, C5, C6, C7 | Wire Bridge UI; test 138↔dest; destination DEX; full path quote UI; E2E test. | +| **E7 — Docs** | X13, X14 | Update PMM_DEX_ROUTING_STATUS; runbooks. | + +**Automated (script):** E1 (Phase 1), E2 (per-chain scripts), E3 (env/config edits), E5 (Phase 2). E0, E4, E6 require operator/LAN where indicated. + +--- + +## References + +| Doc | Content | +|-----|---------| +| [DEX_AND_AGGREGATORS_CHAIN138_EXPLAINER](../04-configuration/DEX_AND_AGGREGATORS_CHAIN138_EXPLAINER.md) | Flows A, B, C and routing | +| [NEXT_STEPS_PMM_FULL_PARITY_AND_ALL_POOLS](../03-deployment/NEXT_STEPS_PMM_FULL_PARITY_AND_ALL_POOLS.md) | PMM pools and liquidity | +| [CONFIG_READY_CHAINS_COMPLETION_RUNBOOK](../07-ccip/CONFIG_READY_CHAINS_COMPLETION_RUNBOOK.md) | CCIP bridge config and LINK | +| [DEPLOY_CONFIRM_AND_FULL_E2E_RUNBOOK](DEPLOY_CONFIRM_AND_FULL_E2E_RUNBOOK.md) | Deploy, verify, E2E tests | +| [E2E_COMPLETION_TASKS_DETAILED_LIST](E2E_COMPLETION_TASKS_DETAILED_LIST.md) | Full E2E task breakdown (waves) | +| [PMM_DEX_ROUTING_STATUS](../11-references/PMM_DEX_ROUTING_STATUS.md) | DEX/PMM status | +| `scripts/run-e2e-flow-tasks-full-parallel.sh` | Run E2E flow tasks by wave (full parallel); `--dry-run`, `--wave E1` | diff --git a/docs/00-meta/TASK_CHECK_REPORT.md b/docs/00-meta/TASK_CHECK_REPORT.md new file mode 100644 index 0000000..6800a35 --- /dev/null +++ b/docs/00-meta/TASK_CHECK_REPORT.md @@ -0,0 +1,130 @@ +# Task Check Report — Remaining Tasks Verified Before Completion + +**Date:** 2026-03-02 +**Purpose:** For each remaining task, verify current state before marking complete or executing. Use this report to decide what still needs to be run by Operator/LAN vs what is already satisfied. + +--- + +## Checks run (2026-03-02) + +| Check | Result | +|-------|--------| +| **run-completable-tasks-from-anywhere.sh** | Passed — config OK, 38/38 on-chain (Chain 138), validation OK, reconcile-env printed | +| **preflight-chain138-deploy.sh** | Passed — dotenv exists, RPC Core (chainId 138), nonce consistent, no stuck txs | + +--- + +## Per-task status (after check) + +### 1. Full deployment order (Phase 0–6) + +| Item | Status | Notes | +|------|--------|-------| +| Phase 0 (prereqs) | Satisfied | Preflight passed; .env and RPC OK | +| Phase 1 (Chain 138 core) | Done | 38/38 contracts present | +| Phase 2 (TransactionMirror + PMM pools) | Done | Mirror deployed; all three pools created (cUSDT/cUSDC, cUSDT/USDT, cUSDC/USDC) | +| Phase 3 (Liquidity + DODOPMMProvider) | Partially done | DODOPMMProvider deployed at `0x8EF6657D2a86c569F6ffc337EE6b4260Bd2e59d0`; pools registered. **Remaining:** add liquidity (optional per doc) via `AddLiquidityPMMPoolsChain138.s.sol` or cast | +| Phase 4–6 | Not run | Optional / other chains; Operator | + +**Conclusion:** Phases 0–3 (required) are done except adding liquidity. Full “completion” of Phase 0–6 requires Operator for Phase 4–6 and, if desired, adding liquidity in Phase 3. + +--- + +### 2. Chain 138 PMM: add liquidity, DODOPMMProvider + +| Item | Status | Notes | +|------|--------|-------| +| DODOPMMProvider deployed | Done | `0x8EF6657D2a86c569F6ffc337EE6b4260Bd2e59d0`; pools registered (2026-02-28) | +| Pools created | Done | 0x9fcB… (cUSDT/cUSDC), 0xa3Ee… (cUSDT/USDT), 0x90bd… (cUSDC/USDC) | +| Add liquidity | Not run | Script: `smom-dbis-138/script/dex/AddLiquidityPMMPoolsChain138.s.sol`; runbook: [ADD_LIQUIDITY_PMM_CHAIN138_RUNBOOK.md](../03-deployment/ADD_LIQUIDITY_PMM_CHAIN138_RUNBOOK.md). Requires `ADD_LIQUIDITY_BASE_AMOUNT`, `ADD_LIQUIDITY_QUOTE_AMOUNT` in .env and deployer holding base/quote tokens | + +**Conclusion:** Provider and pools are in place. Only “add liquidity” remains; Operator/LAN with token balance and .env amounts. + +--- + +### 3. Operator tasks: Blockscout verify, 502 fix, NPMplus backup, deploy + +| Item | Status | Notes | +|------|--------|-------| +| Script exists | Yes | `./scripts/run-all-operator-tasks-from-lan.sh` | +| Dry-run | Run | Would run: run-wave0-from-lan.sh (NPMplus RPC fix + backup), then Blockscout verification | +| Requires | LAN, smom-dbis-138/.env (PRIVATE_KEY, NPM_PASSWORD for backup) | Cannot be run from this host without LAN | + +**Conclusion:** Script is present and dry-run succeeds. Execution is Operator/LAN only. + +--- + +### 4. Gnosis, Celo, Wemix CCIP bridges + +| Item | Status | Notes | +|------|--------|-------| +| Runbook | Exists | [CONFIG_READY_CHAINS_COMPLETION_RUNBOOK.md](../07-ccip/CONFIG_READY_CHAINS_COMPLETION_RUNBOOK.md) | +| Scripts | DeployWETHBridges.s.sol; complete-config-ready-chains.sh; fund-ccip-bridges-with-link.sh | Per runbook | +| Requires | Per-chain RPC, CCIP Router, LINK, WETH9/WETH10, deployer gas (xDAI, CELO, WEMIX) | Operator/LAN | + +**Conclusion:** Documented and scripted; not run in this check. Operator/LAN. + +--- + +### 5. LINK support on Mainnet relay + +| Item | Status | Notes | +|------|--------|-------| +| Runbook | Exists | [RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK.md](../07-ccip/RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK.md) | +| Requires | Implement option A or B, deploy, fund LINK, set relaySupported for LINK, restart relay | Operator/LAN | + +**Conclusion:** Not run. Operator/LAN. + +--- + +### 6. Repos & PRs: Ledger, Trust Wallet, Chainlist, on-ramps + +| Item | Status | Notes | +|------|--------|-------| +| Doc | [REPOSITORIES_AND_PRS_CHAIN138.md](REPOSITORIES_AND_PRS_CHAIN138.md) | External submissions; forms/PRs | +| Action | Submit PRs / forms per doc | External / manual | + +**Conclusion:** No automated check; external. + +--- + +### 7. PR-ready files: Chainlist, Trust Wallet + +| Item | Status | Notes | +|------|--------|-------| +| Chainlist | Present | `docs/04-configuration/pr-ready/eip155-138.json` | +| Trust Wallet | Present | `docs/04-configuration/pr-ready/trust-wallet-registry-chain138.json` | +| README | Present | [pr-ready/README.md](../04-configuration/pr-ready/README.md) with submission steps | + +**Conclusion:** Files exist and are PR-ready; submission is external (fork, PR, forms). + +--- + +### 8. E2E flow waves E1–E7 + +| Item | Status | Notes | +|------|--------|-------| +| Script | Exists | `./scripts/run-e2e-flow-tasks-full-parallel.sh` | +| Dry-run | Run | Lists waves E0–E7; E3 reports CHAIN_138_DODO_PMM_INTEGRATION set, suggests BRIDGE_REGISTRY_ADDRESS for Flow C | +| Execution | Operator/LAN for E0, E2, E4, E5, E6 | Waves include RPC, backup, Blockscout, routing, L2 PMM, bridge UI | + +**Conclusion:** Script and dry-run OK; live execution is Operator/LAN for most waves. + +--- + +## Summary + +| Task | Checked | Can complete from here? | Action | +|------|--------|--------------------------|--------| +| 1. Full deployment order Phase 0–6 | Yes | No (Phase 4–6 + liquidity = Operator) | Document: Phases 0–3 done; add liquidity + Phase 4–6 = Operator | +| 2. Chain 138 PMM add liquidity | Yes | No (needs tokens + .env amounts) | Operator runs AddLiquidityPMMPoolsChain138 or cast | +| 3. Operator tasks | Yes | No (LAN required) | Operator runs run-all-operator-tasks-from-lan.sh | +| 4. Gnosis/Celo/Wemix CCIP | Yes | No | Operator per runbook | +| 5. LINK Mainnet relay | Yes | No | Operator per runbook | +| 6. Repos & PRs | Yes | No (external) | Submit per REPOSITORIES_AND_PRS_CHAIN138 | +| 7. PR-ready files | Yes | N/A (files exist) | Submit PRs using pr-ready/ files | +| 8. E2E waves E1–E7 | Yes | No (Operator for most) | Operator runs run-e2e-flow-tasks-full-parallel.sh | + +**Completed in this environment:** Preflight and run-completable-tasks-from-anywhere passed; no remaining tasks can be fully “completed” from this host without LAN/Operator or external submission. + +**Next step for operator:** Run `./scripts/run-all-operator-tasks-from-lan.sh` (and optionally `--deploy`) from a host on LAN; add liquidity when base/quote amounts and tokens are ready; run E2E waves as needed. diff --git a/docs/00-meta/TASK_LIST_REVIEW_2026_03_01.md b/docs/00-meta/TASK_LIST_REVIEW_2026_03_01.md new file mode 100644 index 0000000..1e4bc50 --- /dev/null +++ b/docs/00-meta/TASK_LIST_REVIEW_2026_03_01.md @@ -0,0 +1,63 @@ +# Task List Review — Deprecated and Duplicates Resolved + +**Date:** 2026-03-01 +**Purpose:** Audit of remaining tasks across master documentation; removal of deprecated items and duplicate wording. Single source for “what was fixed.” + +--- + +## 1. Deprecated tasks corrected + +### 2506, 2507, 2508 (Besu RPC containers) + +- **Status:** These containers were **destroyed 2026-02-08** on all Proxmox hosts (script: `destroy-vmids-2506-2508.sh`). RPC range is **2500–2505** only; function replaced by new VMID structure (2101, 2201, 2301, 2303–2308, 2400–2403). +- **Issue:** Multiple docs still listed “Missing containers 2506–2508” or “create 2506–2508” as pending/high. +- **Changes:** All references updated to “destroyed 2026-02-08” or “Done (doc)” and W2-6 / optional infra text adjusted. No create action. + +**Files updated:** +TODOS_CONSOLIDATED, MASTER_PLAN, COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX, FULL_PARALLEL_EXECUTION_ORDER, PHASES_AND_TASKS_MASTER, WAVE2_WAVE3_OPERATOR_CHECKLIST, REMAINING_ITEMS_FULL_PARALLEL_LIST, REMAINING_WORK_DETAILED_TASKS, NEXT_STEPS_ALL, NEXT_STEPS_MASTER, ALL_IMPROVEMENTS_AND_GAPS_INDEX, ALL_RECOMMENDATIONS_HIGH_PRIORITY. + +--- + +## 2. Deleted document references + +### CONTRACT_INVENTORY_AND_VERIFICATION / SMART_CONTRACTS_INVENTORY + +- **Status:** CONTRACT_INVENTORY_AND_VERIFICATION.md was removed. **ADDRESS_MATRIX_AND_STATUS.md** is the correlated address and status source. +- **Issue:** Multiple docs and R2/R13 still pointed to CONTRACT_INVENTORY_AND_VERIFICATION or SMART_CONTRACTS_INVENTORY_ALL_CHAINS. +- **Changes:** Replaced with ADDRESS_MATRIX_AND_STATUS (or “update ADDRESS_MATRIX_AND_STATUS”) in task text and Related sections. + +**Files updated:** +CONTRACT_ADDRESSES_REFERENCE, RECOMMENDATIONS_OPERATOR_CHECKLIST (R13), ALL_RECOMMENDATIONS_HIGH_PRIORITY (R1–R3), OPERATOR_AND_EXTERNAL_COMPLETION_CHECKLIST, ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST, ALL_RECOMMENDATIONS_OPERATOR_ONLY, REMAINING_COMPONENTS_TASKS_AND_RECOMMENDATIONS, BLITZKRIEG_SOURCE_DOCUMENT_INDEX, REMAINING_WORK_BREAKDOWN_AND_ANSWERS, CONTRACT_DEPLOYMENT_RUNBOOK, CHAIN138_TOKEN_ADDRESSES, LIQUIDITY_POOLS_MASTER_MAP, DEX_AND_CROSS_CHAIN_CONTRACTS_NEEDED, MASTER_INDEX, OPERATOR_OPTIONAL_CHECKLIST, QUICK_REFERENCE_CARDS, CCIP_SENDER_CONTRACT_REFERENCE, CCIP_SECURITY_DOCUMENTATION. + +**Not updated (optional / archive):** +CONTRACT_NEXT_STEPS_AND_RECOMMENDATIONS_COMPLETE, SMART_CONTRACTS_INVENTORY_SIMPLE, MASTER_TODO_EXPANDED, BLITZKRIEG_SUPER_PRO_MAX_MASTER_PLAN, and files under `docs/archive/` — can be updated in a later pass if those docs are still in use. + +--- + +## 3. Duplicate / outdated task wording + +### DODO PMM on 138 (TODOS_CONSOLIDATED task 13) + +- **Status:** DODOPMMIntegration and the three PMM pools (cUSDT/cUSDC, cUSDT/USDT, cUSDC/USDC) and DODOPMMProvider were **already deployed 2026-02-28** (see NEXT_STEPS_AND_REMAINING_TODOS completed section). +- **Issue:** Task 13 still said “Deploy DODOPMMIntegration; … create cUSDT/cUSDC pools” as if not done. +- **Change:** Task 13 text updated to “Integration and pools **already deployed**. Remaining: add liquidity (AddLiquidityPMMPoolsChain138 / run-pmm-full-parity); document in LIQUIDITY_POOLS_MASTER_MAP.” Ref set to NEXT_STEPS_PMM_FULL_PARITY_AND_ALL_POOLS. + +--- + +## 4. Canonical task sources (after review) + +- **Single task list:** [TODOS_CONSOLIDATED.md](TODOS_CONSOLIDATED.md) +- **Operator copy-paste:** [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md) +- **Still not done (LAN/external):** [STILL_NOT_DONE_EXECUTION_CHECKLIST.md](STILL_NOT_DONE_EXECUTION_CHECKLIST.md) +- **E2E flows:** [TASKS_TO_INCREASE_ALL_E2E_FLOWS.md](TASKS_TO_INCREASE_ALL_E2E_FLOWS.md) +- **Full plan:** [COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md](COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md) +- **Address/contract status:** [ADDRESS_MATRIX_AND_STATUS.md](../11-references/ADDRESS_MATRIX_AND_STATUS.md) (replaces CONTRACT_INVENTORY_AND_VERIFICATION) +- **Containers 2506–2508:** [MISSING_CONTAINERS_LIST.md](../03-deployment/MISSING_CONTAINERS_LIST.md) — destroyed 2026-02-08; RPC 2500–2505 only. + +--- + +## 5. Optional follow-ups + +- **config/smart-contracts-master.json:** Referenced in several places; if this file is removed or optional, consider adding “(when present)” or “config and .env” in task text so tasks remain valid. +- **CONTRACT_NEXT_STEPS_AND_RECOMMENDATIONS_COMPLETE, SMART_CONTRACTS_INVENTORY_SIMPLE:** Still reference CONTRACT_INVENTORY_AND_VERIFICATION / SMART_CONTRACTS_INVENTORY; update if those docs stay in use. +- **Archive:** Files under `docs/archive/` were not changed; update only if you reuse them. diff --git a/docs/00-meta/TODOS_CONSOLIDATED.md b/docs/00-meta/TODOS_CONSOLIDATED.md index 063ff72..a4d3da2 100644 --- a/docs/00-meta/TODOS_CONSOLIDATED.md +++ b/docs/00-meta/TODOS_CONSOLIDATED.md @@ -1,16 +1,46 @@ # TODOs — Consolidated Task List -**Last Updated:** 2026-02-20 -**Purpose:** Single checklist of all next steps and remaining tasks. Source of truth for the full list: [NEXT_STEPS_AND_REMAINING_TODOS.md](NEXT_STEPS_AND_REMAINING_TODOS.md). +**Last Updated:** 2026-03-02 +**Purpose:** Single checklist of all next steps and remaining tasks. Source of truth for the full list: [NEXT_STEPS_AND_REMAINING_TODOS.md](NEXT_STEPS_AND_REMAINING_TODOS.md). **Token deployments remaining:** [TOKEN_CONTRACT_DEPLOYMENTS_REMAINING.md](../11-references/TOKEN_CONTRACT_DEPLOYMENTS_REMAINING.md). -**Quick run:** From anywhere (no LAN): `./scripts/run-completable-tasks-from-anywhere.sh`. From LAN with secrets: `./scripts/run-all-operator-tasks-from-lan.sh [--deploy] [--create-vms]`. +**Quick run:** From anywhere (no LAN): `./scripts/run-completable-tasks-from-anywhere.sh`. Before Chain 138 deploy: `./scripts/deployment/preflight-chain138-deploy.sh [--cost]`. **Chain 138 next steps (all in one):** `./scripts/deployment/run-all-next-steps-chain138.sh [--dry-run] [--skip-mirror] [--skip-register-gru] [--skip-verify]` — preflight → mirror+pool → register c* as GRU → verify. From LAN with secrets: `./scripts/run-all-operator-tasks-from-lan.sh [--deploy] [--create-vms]`. **E2E flows (full parallel):** `./scripts/run-e2e-flow-tasks-full-parallel.sh [--dry-run]` — [TASKS_TO_INCREASE_ALL_E2E_FLOWS](TASKS_TO_INCREASE_ALL_E2E_FLOWS.md). -**Last completable run (2026-02-20):** Config validation OK; on-chain 45/45; run-all-validation --skip-genesis OK; reconcile-env --print. Doc consolidation and root cleanup completed (see NEXT_STEPS_FOR_YOU, ARCHIVE_CANDIDATES). +**Full deployment order:** [DEPLOYMENT_ORDER_OF_OPERATIONS.md](../03-deployment/DEPLOYMENT_ORDER_OF_OPERATIONS.md) — Phase 0–6 (prereqs → core → PMM pools → provider → optional → cW* → verify). **Full plan (required/optional/recommended):** [COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md](COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md). + +**Last completable run (2026-03-02):** Config validation OK; on-chain 38/38; run-all-validation --skip-genesis OK; reconcile-env. **Preflight** and **run-all-next-steps-chain138.sh** run: preflight passed; mirror/pool present; 12 c* already GRU-registered; verification 38/38. Documentation: MASTER_INDEX, README, RUNBOOKS_MASTER_INDEX created; deprecated list and consolidation plan updated. Progress indicators (Step 1/4–4/4) in run-completable-tasks-from-anywhere.sh. E2E flow tasks script and doc updates (ADDRESS_MATRIX_AND_STATUS, RECOMMENDATIONS R2, NEXT_STEPS_FOR_YOU) completed. **Optional completed (2026-02-27 / 2026-03-01):** DeployCompliantFiatTokens (10 tokens); Blockscout verification; MCP allowlist-138; add-liquidity runbook; token-aggregation fallbacks + ENV_EXAMPLE_CONTENT; E2E routing verification; PMM_DEX_ROUTING_STATUS + REQUIRED_FIXES_AND_DEPLOYMENTS_STATUS updated; cCADT line (commented) in DeployCompliantFiatTokens.s.sol. **Within-scope list (2026-02-27):** CompliantWrappedToken.sol; DeployCompliantFiatTokensForChain.s.sol (c* any chain); DeployCWTokens.s.sol (cWUSDT/cWUSDC); deploy-tokens-and-weth-all-chains-skip-canonical.sh extended with --deploy-c, --deploy-cw, 651940 env validation; TOKENS_DEPLOYER_DEPLOYED_ON_OTHER_CHAINS §6 implemented; ENV_EXAMPLE_CONTENT c*/cW*/651940 vars. **2026-02-27:** Deployment order doc, preflight script, deployment safety added; todos synced. **Operator copy-paste commands:** [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md) — one page with exact commands for every pending todo. --- +## First (before any Chain 138 deploy) + +| # | Task | Owner | Ref | +|---|------|--------|-----| +| 0a | **Check deployer gas (Chain 138):** Run balance/gas check using **Core RPC only**. | Operator/LAN | `RPC_URL_138=http://192.168.11.211:8545 ./scripts/deployment/check-deployer-balance-chain138-and-funding-plan.sh` or `cd smom-dbis-138 && ./scripts/deployment/check-balances-gas-and-deploy.sh` | +| 0b | **Core Besu RPC (VMID 2101) use IP:port, not FQDN:** Set `RPC_URL_138=http://192.168.11.211:8545` in `smom-dbis-138/.env` for admin/deploy. Do not use `https://rpc-core.d-bis.org` for deployment (DNS/tunnel can fail; IP is direct to node). | Operator | [RPC_ENDPOINTS_MASTER](../04-configuration/RPC_ENDPOINTS_MASTER.md), [VMID_IP_FIXED_REFERENCE](../11-references/VMID_IP_FIXED_REFERENCE.md) | +| 0c | **Test all contracts before deploying:** Run from repo root (see commands below). Full run can take 5–15+ min; use `--no-match` for unit-only. | Anyone | [DEPLOYMENT_ORDER_OF_OPERATIONS](../03-deployment/DEPLOYMENT_ORDER_OF_OPERATIONS.md) § Phase 0.8 | + +**Test-all-contracts commands (from repo root):** + +```bash +# Full build + test (can take 5–15+ minutes) +./scripts/deployment/test-all-contracts-before-deploy.sh + +# Quick check: print commands only +./scripts/deployment/test-all-contracts-before-deploy.sh --dry-run + +# Faster: unit tests only (skip Fork/Mainnet/Integration/e2e) +./scripts/deployment/test-all-contracts-before-deploy.sh --no-match "Fork|Mainnet|Integration|e2e" + +# Include alltra-lifi-settlement +./scripts/deployment/test-all-contracts-before-deploy.sh --alltra +``` + +| 0 | **Before Chain 138 deploy:** Run preflight (RPC, dotenv, nonce, optional cost). Preflight defaults to `http://192.168.11.211:8545` when `RPC_URL_138` unset. | Anyone | `./scripts/deployment/preflight-chain138-deploy.sh [--cost]`; [DEPLOYMENT_ORDER_OF_OPERATIONS](../03-deployment/DEPLOYMENT_ORDER_OF_OPERATIONS.md) § Phase 0 | + +--- + ## High priority | # | Task | Owner | Ref | @@ -26,7 +56,7 @@ |---|------|--------|-----| | 3 | **LINK support on Mainnet relay:** Option A or B per runbook; implement, deploy, fund LINK; set `relaySupported: true` for LINK in token-mapping.json; update docs. | Operator/LAN | RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK | | 4 | **Run "from anywhere" checks periodically:** `./scripts/run-completable-tasks-from-anywhere.sh` | Anyone | NEXT_STEPS_FOR_YOU §2 | -| 5 | **Placeholders (code):** Canonical addresses in token-aggregation (env); AlltraAdapter fee (setBridgeFee); smart accounts kit; quote service Fabric chainId; .bak (BAK_FILES_DEPRECATION). | Dev | REQUIRED_FIXES_UPDATES_GAPS | +| 5 | **Placeholders (code):** All done or documented per [REQUIRED_FIXES_UPDATES_GAPS.md](../REQUIRED_FIXES_UPDATES_GAPS.md) §4: canonical addresses (env), AlltraAdapter setBridgeFee, smart accounts kit (env + runbook), quote service FABRIC_CHAIN_ID (default 999), .bak ([BAK_FILES_DEPRECATION.md](../../smom-dbis-138/docs/BAK_FILES_DEPRECATION.md)). | Dev | REQUIRED_FIXES_UPDATES_GAPS | | 6 | **API keys:** Sign up per reports/API_KEYS_REQUIRED.md; add to `.env`. | Anyone | NEXT_STEPS_FOR_YOU §2 | --- @@ -40,6 +70,42 @@ | 9 | **Operator tasks script:** `./scripts/run-all-operator-tasks-from-lan.sh [--deploy] [--create-vms]` | Operator/LAN | STEPS_FROM_PROXMOX_OR_LAN_WITH_SECRETS | | 10 | **sendCrossChain (real):** `bash scripts/bridge/run-send-cross-chain.sh 0.01` (when PRIVATE_KEY and LINK ready) | Operator/LAN | NEXT_STEPS_OPERATOR W0-2 | | 11 | **NPMplus backup:** `bash scripts/verify/backup-npmplus.sh` | Operator/LAN | NEXT_STEPS_OPERATOR W0-3 | +| 12 | **Mint tokens to deployer for liquidity/bridges:** See [TOKENS_AND_NETWORKS_MINTABLE_TO_DEPLOYER](../11-references/TOKENS_AND_NETWORKS_MINTABLE_TO_DEPLOYER.md) — Chain 138: owner mint (cUSDT, cUSDC, cEURC, …); Cronos: MintController (D-WIN W); other chains: acquire via wrap/bridge/DEX. | Operator/LAN | TOKENS_AND_NETWORKS_MINTABLE_TO_DEPLOYER | + +--- + +## E2E Flows (Full Parallel) + +All tasks from [TASKS_TO_INCREASE_ALL_E2E_FLOWS.md](TASKS_TO_INCREASE_ALL_E2E_FLOWS.md). Run in waves; within each wave run in **full parallel** when possible. Script: `./scripts/run-e2e-flow-tasks-full-parallel.sh [--dry-run]`. + +| Wave | Tasks | Run in parallel | +|------|--------|-----------------| +| E0 | X1, X6, X7, A1 — RPC writable, TransactionMirror, deployer funded, Core RPC | Op | +| E1 | A2, A3, A4 — PMM pools create, register, add liquidity (Chain 138) | run-pmm-full-parity-all-phases.sh Phase 1 | +| E2 | B1, B2 — CCIP config and fund bridges (per chain parallel) | complete-config-ready-chains.sh, fund-ccip-bridges-with-link.sh | +| E3 | A5, B4, B5, C3, X8 — token-aggregation env, bridge routes, token mapping, quote API, token list | Code/Op | +| E4 | X2, X3, X4, X5 — Blockscout verify, E2E routing, explorer E2E, token-aggregation health | Op/LAN | +| E5 | X10, X11, X12 — cUSDT/cUSDC and PMM on L2s; token-aggregation for new chains | run-pmm-full-parity Phase 2 (parallel per chain) | +| E6 | B6, B7, C5, C6, C7 — Bridge UI, test bridge, destination DEX, full path quote UI, E2E test | Code/Op | +| E7 | X13, X14 — Update PMM_DEX_ROUTING_STATUS; runbooks | Doc | + +Flow A (swap 138): A1–A6; A7–A8 optional. Flow B (bridge): B1–B7. Flow C (swap-bridge-swap): C1–C7 (depends on A+B). + +--- + +## Token contract deployments (remaining) + +Full list: [TOKEN_CONTRACT_DEPLOYMENTS_REMAINING.md](../11-references/TOKEN_CONTRACT_DEPLOYMENTS_REMAINING.md). + +| # | Task | Owner | Ref | +|---|------|--------|-----| +| T1 | **DeployCompliantFiatTokens (Chain 138):** cEURC, cEURT, cGBPC, cGBPT, cAUDC, cJPYC, cCHFC, cCADC, cXAUC, cXAUT. Prereq: CREATE2_FACTORY_ADDRESS. Use Core RPC (IP:port). | ✅ Done 2026-02-27 | TOKEN_CONTRACT_DEPLOYMENTS_REMAINING §1 | +| T2 | **Optional cCADT:** Uncomment cCADT line in DeployCompliantFiatTokens.s.sol and re-run script when needed (Tether-style CAD). | Dev/Op | TOKEN_CONTRACT_DEPLOYMENTS_REMAINING §1.2 | +| T3 | **cAUSDT:** Deploy or env when Alltra compliant USD token defined; no script in repo. | TBD | TOKEN_CONTRACT_DEPLOYMENTS_REMAINING §1.3 | +| T4 | **ACADT (ALL Mainnet 651940):** No script in repo; address TBD when Alltra adds CAD token. | TBD | TOKEN_CONTRACT_DEPLOYMENTS_REMAINING §2 | +| T5 | **cW* on public chains:** Deploy/bridge cW* per chain; create PMM edge pools per pool-matrix. | Operator | TOKEN_CONTRACT_DEPLOYMENTS_REMAINING §3 | +| T6 | **D-WIN W on 138/651940 (optional):** Extend DeployISO4217WSystem for Chain 138 or 651940 if desired. | Planned | TOKEN_CONTRACT_DEPLOYMENTS_REMAINING §4 | +| T7 | **Vault ac*/vdc*/sdc* for new base tokens:** After DeployCompliantFiatTokens, extend DeployAcVdcSdcVaults for each new base. | Operator/LAN | TOKEN_CONTRACT_DEPLOYMENTS_REMAINING §5 | --- @@ -48,7 +114,7 @@ | # | Task | Owner | Ref | |---|------|--------|-----| | 12 | **AddressMapper on other chains:** Deploy via DeployAddressMapperOtherChain; set `mapper` in smart-contracts-master.json. (Cronos done.) | Planned | OPTIONAL_DEPLOYMENTS_START_HERE §A | -| 13 | **DODO PMM on 138:** Deploy DODOPMMIntegration; set env; create cUSDT/cUSDC pools; document in LIQUIDITY_POOLS_MASTER_MAP. | Planned | OPTIONAL_DEPLOYMENTS_START_HERE §B | +| 13 | **DODO PMM on 138:** Integration and pools **already deployed** (2026-02-28). Remaining: add liquidity (AddLiquidityPMMPoolsChain138 / run-pmm-full-parity); document in LIQUIDITY_POOLS_MASTER_MAP. | Planned | NEXT_STEPS_PMM_FULL_PARITY_AND_ALL_POOLS | | 14 | **Mainnet trustless stack:** Deploy Lockbox138 (138) + InboxETH, BondManager, LiquidityPoolETH (Mainnet) per runbook; fund liquidity. | Planned | OPTIONAL_DEPLOYMENTS_START_HERE §C | --- @@ -82,7 +148,7 @@ | Phase 2 — Observability | Monitoring stack; Grafana via Cloudflare Access; alerts | ⏳ Pending | | Phase 3 — CCIP fleet | CCIP Ops/Admin; commit/execute/RMN nodes; NAT pools | ⏳ Pending | | Phase 4 — Sovereign tenants | Sovereign VLANs; tenant isolation; access control | ⏳ Pending | -| Missing containers | 2506, 2507, 2508 (Besu RPC) — see MISSING_CONTAINERS_LIST.md | High | +| ~~Missing~~ containers 2506–2508 | **Destroyed 2026-02-08**; replaced by new RPC structure (2101, 2201, 2301, 2303–2308, 2400–2403). RPC range 2500–2505 only. No create action. See [MISSING_CONTAINERS_LIST.md](../03-deployment/MISSING_CONTAINERS_LIST.md). | Done (doc only) | --- @@ -115,15 +181,19 @@ Cron: `schedule-daily-weekly-cron.sh --install`; NPMplus backup: `schedule-npmpl | Check | Command | |-------|---------| | Completable from anywhere | `./scripts/run-completable-tasks-from-anywhere.sh` | +| Validate (Proxmox SSH) | `bash scripts/run-via-proxmox-ssh.sh validate [--host IP]` — shellcheck (full) + genesis validation; installs jq/shellcheck on host if missing | | All validation (CI) | `bash scripts/verify/run-all-validation.sh [--skip-genesis]` | | Config files | `bash scripts/validation/validate-config-files.sh` | | On-chain (Chain 138) | `./scripts/verify/check-contracts-on-chain-138.sh` | | E2E routing | `./scripts/verify/verify-end-to-end-routing.sh` | +| **Test all contracts (before deploy)** | `./scripts/deployment/test-all-contracts-before-deploy.sh` — use `--dry-run` / `--no-match "Fork|Mainnet|Integration|e2e"` / `--alltra` | --- ## References +- [RECOMMENDATIONS_AND_FIXES_BEFORE_DEPLOY.md](../03-deployment/RECOMMENDATIONS_AND_FIXES_BEFORE_DEPLOY.md) — all recommendations and fixes before deploying smart contracts and PMM pools +- [TOKEN_CONTRACT_DEPLOYMENTS_REMAINING.md](../11-references/TOKEN_CONTRACT_DEPLOYMENTS_REMAINING.md) — remaining token deployments by category - [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md) — copy-paste commands for all operator/LAN tasks - [NEXT_STEPS_AND_REMAINING_TODOS.md](NEXT_STEPS_AND_REMAINING_TODOS.md) — full detail and completed items - [NEXT_STEPS_MASTER.md](NEXT_STEPS_MASTER.md) — master list and phases diff --git a/docs/00-meta/TODO_TASK_LIST_MASTER.md b/docs/00-meta/TODO_TASK_LIST_MASTER.md index a021b38..1b4d993 100644 --- a/docs/00-meta/TODO_TASK_LIST_MASTER.md +++ b/docs/00-meta/TODO_TASK_LIST_MASTER.md @@ -1,17 +1,23 @@ # Master TODO Task List -**Last Updated:** 2026-02-13 +**Last Updated:** 2026-03-02 **Purpose:** Consolidated list of all fixes, enhancements, improvements, optimizations, recommendations, and missed steps. -**Full index (1–139):** [ALL_IMPROVEMENTS_AND_GAPS_INDEX.md](../ALL_IMPROVEMENTS_AND_GAPS_INDEX.md) +**Full index (1–139):** [ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md](ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md). **Full deployment order:** [DEPLOYMENT_ORDER_OF_OPERATIONS.md](../03-deployment/DEPLOYMENT_ORDER_OF_OPERATIONS.md) (Phase 0–6); before deploy run `./scripts/deployment/preflight-chain138-deploy.sh [--cost]`. **Fully expanded checklist (everything conceivable):** **[MASTER_TODO_EXPANDED.md](MASTER_TODO_EXPANDED.md)** — Blitzkrieg Steps 0–19, R1–R23, tasks 1–30, Ledger 8–17, DEX/TransactionMirror, Tezos/CCIP, CONTRACT_NEXT_STEPS, GAPS, Supreme Command, Absolute Air Superiority, ALL_REQUIREMENTS, and validation commands. **Execution mode: Full maximum parallel.** Run all remaining items in parallel by wave. See **[FULL_PARALLEL_EXECUTION_ORDER.md](FULL_PARALLEL_EXECUTION_ORDER.md)** for the ordered wave list (Wave 0 → Wave 1 → Wave 2 → Wave 3). Within each wave, execute every item concurrently; no artificial sequencing. Validation commands at bottom. -**Status:** [FULL_PARALLEL_RUN_LOG.md](../archive/00-meta-pruned/FULL_PARALLEL_RUN_LOG.md) (archived) | [WAVE1_COMPLETION_SUMMARY.md](WAVE1_COMPLETION_SUMMARY.md) | [WAVE2_WAVE3_OPERATOR_CHECKLIST.md](WAVE2_WAVE3_OPERATOR_CHECKLIST.md) | [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md) (step-by-step; 2026-02-05 completion) | **[REMAINING_TASKS_AND_API_FEATURES.md](REMAINING_TASKS_AND_API_FEATURES.md)** (2026-02-10: consolidated remaining tasks + API features inventory). +**Status:** [FULL_PARALLEL_RUN_LOG.md](../archive/00-meta-pruned/FULL_PARALLEL_RUN_LOG.md) (archived) | [WAVE1_COMPLETION_SUMMARY.md](WAVE1_COMPLETION_SUMMARY.md) | [WAVE2_WAVE3_OPERATOR_CHECKLIST.md](WAVE2_WAVE3_OPERATOR_CHECKLIST.md) | [REMAINING_WORK_DETAILED_STEPS.md](REMAINING_WORK_DETAILED_STEPS.md) (step-by-step; 2026-02-05 completion) | **[REMAINING_TASKS_AND_API_FEATURES.md](REMAINING_TASKS_AND_API_FEATURES.md)** (2026-02-10: consolidated remaining tasks + API features inventory). **Single plan (required/optional/recommended):** [COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md](COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md). **2026-02-05:** Master documentation updated (MASTER_INDEX v5.8, docs/README, MASTER_PLAN, NEXT_STEPS_MASTER); "Can be accomplished now" list completed; 32 files archived to docs/archive/00-meta-status/. +**2026-02-23:** Placeholders/fixes sync: TODOS_CONSOLIDATED, NEXT_STEPS_AND_REMAINING_TODOS, NEXT_STEPS_FOR_YOU updated to reference REQUIRED_FIXES_UPDATES_GAPS §4 (canonical addresses, AlltraAdapter, smart accounts, quote FABRIC_CHAIN_ID, .bak — all Done or Documented). Remaining in-repo fixes complete; operator/LAN and deferred items unchanged. + +**2026-02-28:** Master documentation refresh — MASTER_INDEX 6.6; REPOSITORIES_AND_PRS_CHAIN138; pr-ready (eip155-138 public RPC only, Trust Wallet); set-missing-dotenv-chain138.sh; deploy-bridges-config-ready-chains.sh; ENV_CONFIG_READY_CHAINS (Gnosis/Celo/Wemix); WHATS_LEFT_OPERATOR_AND_EXTERNAL, NEXT_STEPS_INDEX updated. + +**2026-02-27:** Deployment order of operations ([DEPLOYMENT_ORDER_OF_OPERATIONS.md](../03-deployment/DEPLOYMENT_ORDER_OF_OPERATIONS.md)) and preflight script (`preflight-chain138-deploy.sh`) added. Deployment safety: correct RPC (Core only), correct dotenv (smom-dbis-138/.env), gas/cost estimate before deploy, do not deploy when stuck. NEXT_STEPS_AND_REMAINING_TODOS, TODOS_CONSOLIDATED updated with next-steps table and 2026-02-27 completion. + --- ## 1. Critical Fixes (Do First) @@ -42,6 +48,16 @@ - [x] **Real transfer:** Omit `--dry-run` to execute sendCrossChain; documented in [scripts/README.md](../../scripts/README.md) §8. Ensure LINK approved for fee token if needed. - [ ] **Paymaster (optional):** `forge script script/smart-accounts/DeployPaymaster.s.sol --rpc-url $RPC_URL_138 --broadcast` — requires contract sources; see [SMART_ACCOUNTS_DEPLOYMENT_NOTE.md](../../metamask-integration/docs/SMART_ACCOUNTS_DEPLOYMENT_NOTE.md) +### Undeployed contracts — pre-deployment (test, gas check, gas API, dry-run) + +**Full checklist:** [UNDEPLOYED_CONTRACTS_PRE_DEPLOYMENT_TASKS.md](../03-deployment/UNDEPLOYED_CONTRACTS_PRE_DEPLOYMENT_TASKS.md) + +- [x] **Check deployer wallet for gas** on Chain 138 and all target chains: `cd smom-dbis-138 && ./scripts/deployment/check-balances-gas-and-deploy.sh` +- [x] **Use gas API to estimate** all undeployed contract deployment costs: `./scripts/deployment/get-multichain-gas-prices.sh`; optionally `update-gas-estimates.sh`; estimate per-script gas (forge/cast) for PMM pool creation, TransactionMirror, EnhancedSwapRouter, DODOPMMProvider, and any multichain cW*/PMM. +- [x] **Dry-run Chain 138 deployments:** `deploy-contracts-unified.sh --dry-run` (RPC + init fixes applied); DeployDeterministicCore simulated; PMM pool creation: set `DODO_PMM_INTEGRATION_ADDRESS` then `DRY_RUN=true ./scripts/create-all-dodo-pools-from-token-api.sh`; TransactionMirror script (no --broadcast); `deploy-optional-future-all.sh --dry-run`; `fund-ccip-bridges-with-link.sh --dry-run`. +- [ ] **Dry-run mainnet/multichain** (if applicable): `dry-run-mainnet-deployment.sh` (requires ETHEREUM_MAINNET_RPC, PRIVATE_KEY) or per-script `forge script ... --dry-run` for each target chain. +- [x] **Test not-deployed components:** Run `check-contracts-on-chain-138.sh` after any new deploy (36/36 present). Validate PMM pool creation path when pools created; DODOPMMProvider when implemented; TransactionMirror receive path after deploy; EnhancedSwapRouter when pools exist. + --- ## 3. Verification Fixes (Applied — Verify) @@ -131,7 +147,7 @@ - [ ] **Blitzkrieg trail:** Steps 0–19 (env freeze, canonical registry, token lists, GRU M1, CCIP, W-Tokens, wallet ingestion, Blockscout, bridge hardening, CI/CD, monitoring, security, dry-run done; optional Tezos/DODO) - [ ] **Recommendations R1–R23:** Verification, single source of truth, on-chain check, secrets, RPC/gas/order, runbooks, automation, monitoring, tests, Sankofa/network placeholders -- [ ] **DEX / cross-chain:** TransactionMirror (Mainnet verify, Chain 138 deploy if needed); DODO (DODOPMMIntegration + Provider); EnhancedSwapRouter when pools exist; full trustless stack; Jumper/FABRIC_CHAIN_ID +- [ ] **DEX / cross-chain:** TransactionMirror (Mainnet verify, Chain 138 deploy if needed); DODO (DODOPMMIntegration + Provider); EnhancedSwapRouter when pools exist; full trustless stack; Jumper/FABRIC_CHAIN_ID. **Before any Chain 138 deploy:** run `./scripts/deployment/preflight-chain138-deploy.sh [--cost]`; follow [DEPLOYMENT_ORDER_OF_OPERATIONS.md](../03-deployment/DEPLOYMENT_ORDER_OF_OPERATIONS.md) Phase 0–6. - [ ] **Tezos/CCIP:** External verification (CCIP/Jumper/LiFi); InitializeRegistry/DeployAllAdapters; Etherlink receivers; relay; DON; monitoring; testing - [ ] **Supreme Command:** Deployment matrix, risk scoreboard, RAG dashboard, reconciliation, prod vs testnet, war-room - [ ] **Absolute Air Superiority:** Sentinel, canonical anchoring, circuit breaker, stress test, time-to-containment, formal verification, sovereign continuity diff --git a/docs/00-meta/WAVE2_WAVE3_OPERATOR_CHECKLIST.md b/docs/00-meta/WAVE2_WAVE3_OPERATOR_CHECKLIST.md index 48d7673..f361b07 100644 --- a/docs/00-meta/WAVE2_WAVE3_OPERATOR_CHECKLIST.md +++ b/docs/00-meta/WAVE2_WAVE3_OPERATOR_CHECKLIST.md @@ -30,7 +30,7 @@ | W2-3 | VLAN enablement: UDM Pro VLAN config; Proxmox bridge; migrate services | By VLAN / host | NETWORK_ARCHITECTURE.md §3–5; UDM_PRO_VLAN_* docs | | W2-4 | Phase 3 CCIP: Ops/Admin (5400-5401); NAT pools; commit/execute/RMN scripts | Ops first, then NAT, then scripts | CCIP_DEPLOYMENT_SPEC.md | | W2-5 | Phase 4: Sovereign tenant VLANs; isolation | By tenant/VLAN | After W2-3 | -| W2-6 | Missing containers: 3 VMIDs only (2506, 2507, 2508) — see MISSING_CONTAINERS_LIST.md | By VMID / host | MISSING_CONTAINERS_LIST.md | +| W2-6 | ~~2506–2508~~ Destroyed 2026-02-08; RPC 2500–2505 only. No action. | — | MISSING_CONTAINERS_LIST.md | | W2-7 | DBIS services (10100–10151); Hyperledger | By host | Per deployment runbooks | | W2-8 | NPMplus HA (Keepalived, 10234) | Optional | NPMPLUS_HA_SETUP_GUIDE.md | diff --git a/docs/00-meta/WHATS_LEFT_OPERATOR_AND_EXTERNAL.md b/docs/00-meta/WHATS_LEFT_OPERATOR_AND_EXTERNAL.md new file mode 100644 index 0000000..b8235a3 --- /dev/null +++ b/docs/00-meta/WHATS_LEFT_OPERATOR_AND_EXTERNAL.md @@ -0,0 +1,59 @@ +# What’s Left — Operator and External Only + +**Last Updated:** 2026-02-28 +**Purpose:** After completing in-repo and on-chain tasks (preflight, PMM pools, DODOPMMProvider, operator script NPMplus/backup/verify, Wemix re-check), these items require **operator (LAN/Proxmox/credentials)** or **you (third-party)**. + +--- + +## Completed in this pass (2026-02-28) + +- **Preflight:** Passed (RPC Core, dotenv, nonce consistent). +- **PMM pools:** All three created (cUSDT/cUSDC, cUSDT/USDT, cUSDC/USDC) and addresses documented. +- **DODOPMMProvider:** Deployed at `0x8EF6657D2a86c569F6ffc337EE6b4260Bd2e59d0`; all three pools registered via `RegisterDODOPools.s.sol`. +- **Operator script:** NPMplus RPC fix + backup + Blockscout verify run (see `run-all-operator-tasks-from-lan.sh`). +- **Wemix:** Re-fetched scan.wemix.com/tokens; WWEMIX confirmed; doc updated. +- **Docs:** PRE_DEPLOYMENT_CHECKLIST, LIQUIDITY_POOLS_MASTER_MAP updated with new pool and provider addresses. +- **Dotenv:** `set-missing-dotenv-chain138.sh` run — DODO_PMM_PROVIDER_ADDRESS, POOL_* appended to `smom-dbis-138/.env`. +- **Repositories/PRs:** [REPOSITORIES_AND_PRS_CHAIN138.md](REPOSITORIES_AND_PRS_CHAIN138.md) — Ledger, Trust, Chainlist, Consensys, CoinGecko/CMC, on-ramps/off-ramps (forms submitted; awaiting feedback). +- **Bridges:** ENV_CONFIG_READY_CHAINS.example filled with Gnosis/Celo/Wemix CCIP router, LINK, and WETH9/WETH10 (WXDAI, WCELO, WWEMIX). **Gnosis deployed 2026-02-28:** CCIPWETH9=0xE37c332a88f112F9e039C5d92D821402A89c7052, CCIPWETH10=0x04B2AE3c3bb3d70Df506FAd8717b0FBFC78ED7E6; destinations 138↔Gnosis configured. **Celo/Wemix:** Fund deployer with CELO (~0.1) and WEMIX (~0.4) then run `deploy-bridges-config-ready-chains.sh celo` and `wemix`, then `complete-config-ready-chains.sh`. +- **PR-ready:** [04-configuration/pr-ready/](../04-configuration/pr-ready/) — eip155-138.json (Chainlist) and trust-wallet-registry-chain138.json (Trust Wallet); see README for submission steps. +- **Maintenance:** `run-all-maintenance-via-proxmox-ssh.sh --e2e` was started via SSH; check `/tmp/proxmox-maintenance-out.log` for progress (steps 0–4 run; E2E runs at step 5). + +--- + +## Operator / LAN only + +| # | Task | Command / doc | +|---|------|----------------| +| 1 | **E2E 502 fix** | `./scripts/maintenance/run-all-maintenance-via-proxmox-ssh.sh --e2e` or `./scripts/maintenance/address-all-remaining-502s.sh --run-besu-fix --e2e` (requires SSH to Proxmox). Runbook: [502_DEEP_DIVE_ROOT_CAUSES_AND_FIXES.md](502_DEEP_DIVE_ROOT_CAUSES_AND_FIXES.md). | +| 2 | **Celo, Wemix CCIP bridges** | Gnosis done. Per chain: fund deployer (CELO ~0.1, WEMIX ~0.4), run `deploy-bridges-config-ready-chains.sh [celo|wemix]`, then `complete-config-ready-chains.sh`, fund LINK. [CONFIG_READY_CHAINS_COMPLETION_RUNBOOK.md](../07-ccip/CONFIG_READY_CHAINS_COMPLETION_RUNBOOK.md). | +| 3 | **LINK support on Mainnet relay** | Option A or B per [RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK.md](../07-ccip/RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK.md); implement, deploy, fund; set `relaySupported: true` for LINK; restart relay. | +| 4 | **Set DODO_PMM_PROVIDER_ADDRESS in .env** | Run `./scripts/deployment/set-missing-dotenv-chain138.sh` to append provider and pool addresses (already run 2026-02-28). | + +--- + +## External / third-party (you) + +| # | Task | Doc | +|---|------|-----| +| 5 | **Ledger** | Tally form submitted; await response. Repos: LedgerHQ/ledger-live, app-ethereum, wallet-api; review repo: bis-innovations/LedgerLive. [ADD_CHAIN138_TO_LEDGER_LIVE](../04-configuration/ADD_CHAIN138_TO_LEDGER_LIVE.md). | +| 6 | **Trust Wallet** | Open PR to [trustwallet/wallet-core](https://github.com/trustwallet/wallet-core). [ADD_CHAIN138_TO_TRUST_WALLET](../04-configuration/ADD_CHAIN138_TO_TRUST_WALLET.md). | +| 7 | **Consensys** | Outreach (contact form / business@consensys.io). [CONSENSYS_OUTREACH_PACKAGE](../../metamask-integration/docs/CONSENSYS_OUTREACH_PACKAGE.md). | +| 8 | **CoinGecko/CMC** | Submit via platform forms (not PR). [CMC_COINGECKO_SUBMISSION_RUNBOOK](../04-configuration/coingecko/CMC_COINGECKO_SUBMISSION_RUNBOOK.md). | +| 9 | **On-ramps/off-ramps** | Request Chain 138: MoonPay, Ramp, Transak, etc. (no public PR repos). [REPOSITORIES_AND_PRS_CHAIN138.md](REPOSITORIES_AND_PRS_CHAIN138.md). | + +--- + +## Planned (when scoped) + +- **AddressMapper on other chains** (Cronos done); deploy via DeployAddressMapperOtherChain.s.sol. +- **Mainnet trustless stack:** Lockbox138 + InboxETH, BondManager, LiquidityPoolETH (Mainnet). +- **Tezos/Etherlink:** InitializeRegistry, DeployAllAdapters; Etherlink receiver; relay services. + +--- + +## Quick reference + +- **Operator copy-paste:** [OPERATOR_READY_CHECKLIST.md](OPERATOR_READY_CHECKLIST.md). +- **Full deployment order:** [DEPLOYMENT_ORDER_OF_OPERATIONS.md](../03-deployment/DEPLOYMENT_ORDER_OF_OPERATIONS.md). +- **Full next steps:** [NEXT_STEPS_AND_REMAINING_TODOS.md](NEXT_STEPS_AND_REMAINING_TODOS.md). diff --git a/docs/02-architecture/AI_AGENTS_57XX_DEPLOYMENT_TASKS.md b/docs/02-architecture/AI_AGENTS_57XX_DEPLOYMENT_TASKS.md new file mode 100644 index 0000000..4802a4e --- /dev/null +++ b/docs/02-architecture/AI_AGENTS_57XX_DEPLOYMENT_TASKS.md @@ -0,0 +1,231 @@ +# AI / Agents 57xx — Full Deployment Task List + +**Last Updated:** 2026-02-26 +**Source:** [AI_AGENTS_57XX_DEPLOYMENT_PLAN.md](AI_AGENTS_57XX_DEPLOYMENT_PLAN.md), [VMID_ALLOCATION_FINAL.md](VMID_ALLOCATION_FINAL.md) +**VMID band:** 5700–5999 + +This document is the **single ordered checklist** for deploying the full 57xx stack. Copy-paste commands and paths are ready for operators. Artifacts (compose files, agent script) live in **`scripts/57xx-deploy/`** and can be copied to target VMs. + +--- + +## Prerequisites (all 57xx VMs) + +- [ ] **A.1** Ubuntu/Debian with Docker Engine + Compose plugin. +- [ ] **A.2** Create standard dirs and install Docker (once per host): + +```bash +sudo apt update +sudo apt install -y ca-certificates curl gnupg ufw +curl -fsSL https://get.docker.com | sudo sh +sudo usermod -aG docker $USER +# Log out/in or: newgrp docker +sudo mkdir -p /opt/ai/{mcp,inference,agent,state}/{config,data,logs} +sudo chown -R $USER:$USER /opt/ai +``` + +- [ ] **A.3** Network: ensure 5703 → 5701:3000, 5703 → 5702:8000, and 5701/5703 → 5704:5432,6379 are allowed (replace hostnames with your VM hostnames or IPs if needed). + +--- + +## Task 1 — Repo and submodule (once per environment) + +- [ ] **1.1** Clone proxmox repo with submodules, or from existing repo root init submodules: + +```bash +# Option A: fresh clone +git clone --recurse-submodules /opt/proxmox + +# Option B: from repo root +git submodule update --init --recursive +``` + +- [ ] **1.2** Confirm submodule exists: + +```bash +ls -la /opt/proxmox/ai-mcp-pmm-controller/README.md +# or from your workspace: /ai-mcp-pmm-controller/ +``` + +--- + +## Task 2 — VM 5701 (MCP Hub) — required + +- [ ] **2.1** On the host that will run VMID 5701 (or the machine playing 5701): + +```bash +cd /opt/proxmox/ai-mcp-pmm-controller +# or: cd /ai-mcp-pmm-controller +``` + +- [ ] **2.2** Create logs dir: + +```bash +mkdir -p logs +``` + +- [ ] **2.3** Create local `.env` (gitignored; do not commit secrets): + +```bash +# Minimum: +RPC_URL=https://YOUR_CHAIN_RPC_URL +CHAIN=arbitrum +ALLOW_WRITE=false +EXECUTION_ARMED=false +``` + +- [ ] **2.4** (Optional) Edit `config/allowlist.json`: replace placeholder pool addresses and base/quote tokens before using pool tools. + +- [ ] **2.5** Start the hub: + +```bash +docker compose build --no-cache # first time or after Dockerfile change +docker compose --env-file .env up -d +``` + +- [ ] **2.6** Validate: + +```bash +curl -fsS http://127.0.0.1:3000/health +# Expect: {"ok":true,"chain":"arbitrum"} (or your CHAIN value) +``` + +- [ ] **2.7** (Optional) Interface discovery once you have a pool address: + +```bash +curl -sS http://127.0.0.1:3000/mcp/call \ + -H 'content-type: application/json' \ + -d '{"tool":"dodo.identify_pool_interface","params":{"pool":"0xPOOL"}}' | jq +``` + +Use `functions_found`, `notes`, and `detected_profile` to choose the right ABI/profile. + +--- + +## Task 3 — VM 5704 (Memory/State) — optional + +- [ ] **3.1** On VM 5704 host, create state dirs: + +```bash +sudo mkdir -p /opt/ai/state/data/postgres /opt/ai/state/data/redis +sudo chown -R $USER:$USER /opt/ai/state +``` + +- [ ] **3.2** Copy compose and env from repo (or run `./scripts/57xx-deploy/copy-to-opt-ai.sh` from repo root): + +```bash +# Option A: script (from repo root) +./scripts/57xx-deploy/copy-to-opt-ai.sh + +# Option B: manual +cp /opt/proxmox/scripts/57xx-deploy/5704-state/docker-compose.yml /opt/ai/state/ +cp /opt/proxmox/scripts/57xx-deploy/5704-state/.env.example /opt/ai/state/.env +# Edit .env: set POSTGRES_PASSWORD +``` + +- [ ] **3.3** Start state stack: + +```bash +cd /opt/ai/state +docker compose up -d +docker compose ps +``` + +- [ ] **3.4** Validate: + +```bash +pg_isready -h 127.0.0.1 -U ai -d ai +redis-cli -h 127.0.0.1 ping +``` + +--- + +## Task 4 — VM 5702 (Inference) — optional + +- [ ] **4.1** On VM 5702 host, create model dir: + +```bash +sudo mkdir -p /opt/ai/inference/data/models +sudo chown -R $USER:$USER /opt/ai/inference +``` + +- [ ] **4.2** Place a GGUF model at `/opt/ai/inference/data/models/model.gguf` (or adjust compose `command` for your filename). + +- [ ] **4.3** Copy compose and start: + +```bash +cp /opt/proxmox/scripts/57xx-deploy/5702-inference/docker-compose.yml /opt/ai/inference/ +cd /opt/ai/inference +docker compose up -d +``` + +- [ ] **4.4** (Optional) Validate: `curl -sS http://127.0.0.1:8000/` (llama.cpp may not have `/health`). + +--- + +## Task 5 — VM 5703 (Agent Worker) — optional + +- [ ] **5.1** On VM 5703 host, copy agent config and compose: + +```bash +cp /opt/proxmox/scripts/57xx-deploy/5703-agent/agent.py /opt/ai/agent/config/ +cp /opt/proxmox/scripts/57xx-deploy/5703-agent/docker-compose.yml /opt/ai/agent/ +cp /opt/proxmox/scripts/57xx-deploy/5703-agent/.env.example /opt/ai/agent/.env +``` + +- [ ] **5.2** Edit `/opt/ai/agent/.env`: set `MCP_URL` (e.g. `http://5701:3000/mcp/call`), `INF_URL` (e.g. `http://5702:8000`). If using 5704, set `PG_DSN` and/or `REDIS_URL`. + +- [ ] **5.3** Edit `/opt/ai/agent/config/agent.py`: replace `POOL_ADDRESS_HERE` with a real allowlisted pool address when using `dodo.get_pool_state`. + +- [ ] **5.4** Start agent: + +```bash +cd /opt/ai/agent +docker compose up -d +docker logs -f ai-agent-prod +``` + +--- + +## Task 6 — Post-deploy validation + +- [ ] **6.1** MCP (5701): `curl -fsS http://5701:3000/health` (or from 5701 host: `http://127.0.0.1:3000/health`). +- [ ] **6.2** State (5704): `pg_isready -h 5704 -U ai -d ai` and `redis-cli -h 5704 ping`. +- [ ] **6.3** Inference (5702): `curl -sS http://5702:8000/` if applicable. +- [ ] **6.4** Agent (5703): `docker logs --tail=50 ai-agent-prod` — no repeated errors. + +--- + +## Task 7 — Hardening (before enabling write tools on 5701) + +- [ ] **7.1** Pool allowlist populated and reviewed. +- [ ] **7.2** Max slippage, max notional per tx/day, cooldown, and circuit breaker (see [AI_AGENTS_57XX_DEPLOYMENT_PLAN.md](AI_AGENTS_57XX_DEPLOYMENT_PLAN.md) § Hardening checklist). +- [ ] **7.3** Only then set `ALLOW_WRITE=true` and `EXECUTION_ARMED=true` in 5701 `.env` and restart MCP. + +--- + +## Artifact locations (in repo) + +| VMID | Artifacts | +|------|-----------| +| 5701 | `ai-mcp-pmm-controller/` (submodule): `docker-compose.yml`, `Dockerfile`, `config/`, `.env` (local, gitignored) | +| 5704 | `scripts/57xx-deploy/5704-state/`: `docker-compose.yml`, `.env.example` | +| 5702 | `scripts/57xx-deploy/5702-inference/`: `docker-compose.yml` | +| 5703 | `scripts/57xx-deploy/5703-agent/`: `agent.py`, `docker-compose.yml`, `.env.example` | + +**Copy all optional artifacts in one go:** from repo root run `./scripts/57xx-deploy/copy-to-opt-ai.sh` (creates `/opt/ai/*` dirs and copies 5704/5702/5703 files; does not overwrite existing `.env`). + +--- + +## Quick reference — ports and callers + +| VMID | Service | Port | Allowed callers | +|------|---------|------|-----------------| +| 5701 | MCP Hub | 3000 | 5702, 5703 | +| 5702 | Inference | 8000 | 5703 | +| 5704 | Postgres | 5432 | 5701, 5703 | +| 5704 | Redis | 6379 | 5701, 5703 | + +--- + +**Owner:** Architecture +**See also:** [AI_AGENTS_57XX_DEPLOYMENT_PLAN.md](AI_AGENTS_57XX_DEPLOYMENT_PLAN.md) (Appendices A–F), [ai-mcp-pmm-controller/README.md](../../ai-mcp-pmm-controller/README.md) diff --git a/docs/02-architecture/AI_AGENTS_57XX_MCP_CONTRACTS_AND_CHAINS.md b/docs/02-architecture/AI_AGENTS_57XX_MCP_CONTRACTS_AND_CHAINS.md new file mode 100644 index 0000000..babcef7 --- /dev/null +++ b/docs/02-architecture/AI_AGENTS_57XX_MCP_CONTRACTS_AND_CHAINS.md @@ -0,0 +1,90 @@ +# Smart Contracts and Blockchains for MCP Token/Pool Addresses + +**Purpose:** What smart contracts must exist on which blockchains so the 5701 MCP hub can be given pool and token addresses in its allowlist. + +**MCP behavior:** The MCP does **not** deploy contracts. It reads from existing contracts. You configure `config/allowlist.json` with one `chain` (e.g. `arbitrum`) and a list of pools; each pool has `pool_address`, `base_token`, `quote_token`, and `profile`. The MCP calls RPC on that chain to read pool state (getMidPrice, getOraclePrice, reserves, etc.) and token decimals. So **every address in the allowlist must point to an already-deployed contract** on the chosen chain. + +--- + +## 1. What the MCP needs per pool + +| Field | Meaning | Must exist on chain | +|-------|---------|---------------------| +| **pool_address** | PMM pool contract (DODO-style: getMidPrice, getOraclePrice, getBaseReserve, getQuoteReserve, _K_, _LP_FEE_RATE_, etc.) | Yes — one contract per pool | +| **base_token** | Base asset (e.g. cWUSDT, cUSDT) — ERC-20 | Yes | +| **quote_token** | Quote asset (e.g. USDC, USDT) — ERC-20 | Yes | + +The MCP supports one chain at a time via `CHAIN` and `RPC_URL`. To support multiple chains you run multiple MCP instances (or one allowlist per chain and switch config). + +--- + +## 2. Chain 138 (SMOM-DBIS-138) + +| Item | Status | Notes | +|------|--------|--------| +| **DODOPMMIntegration** | Deployed | `0x79cdbaFBaA0FdF9F55D26F360F54cddE5c743F7D` — creates and owns PMM pools | +| **Pools** | Created via integration | Call `createPool` / `createCUSDTCUSDCPool` etc.; pool addresses from creation or `pools(base, quote)` | +| **Base tokens (cUSDT, cUSDC, …)** | Deployed (core) | e.g. cUSDT `0x93E66202A11B1772E55407B32B44e5Cd8eda7f22`, cUSDC `0xf22258f57794CC8E06237084b353Ab30fFfa640b` (see [CHAIN138_TOKEN_ADDRESSES](../11-references/CHAIN138_TOKEN_ADDRESSES.md)) | +| **Quote tokens (USDT, USDC)** | On-chain | Use addresses from Chain 138 config / token API | + +**Contracts you need to have (so the MCP has addresses):** + +- **Already deployed:** DODOPMMIntegration; core compliant tokens (cUSDT, cUSDC, etc.). +- **You must do:** Create pools via DODOPMMIntegration (`createCUSDTCUSDCPool`, `createPool(cUSDT, USDT, ...)`, etc.). Then put in the MCP allowlist: each pool’s address, and the base/quote token addresses used for that pool. + +No additional smart contracts need to be **deployed** for the MCP beyond what already exists on 138; you only need to **create pools** from the existing integration and then configure the MCP allowlist with those pool and token addresses. + +--- + +## 3. Other blockchains (public chains with cW* design) + +The **cross-chain-pmm-lps** design assumes per-chain **cW*** (bridged) tokens and **hub** stables (USDC/USDT), with **single-sided PMM pools** (cW* / hub) on each chain. `config/pool-matrix.json` and `config/deployment-status.json` list the chains and pairs. Today **deployment-status.json** has **no** addresses filled for these chains (1, 56, 137, 10, 100, 25, 42161, 42220, 1111, 43114, 8453). + +So that the MCP can have token and pool addresses on a given public chain, the following must **exist** (be deployed or already there): + +| What | Who deploys / source | Notes | +|------|----------------------|--------| +| **cW* tokens** (cWUSDT, cWUSDC, …) | Bridge (e.g. CCIP) or custom wrapper | Bridged representation of Chain 138 compliant tokens; address per chain. | +| **Hub stables** (USDC, USDT, …) | Usually already exist | Native Circle/Tether (or chain canonical) deployments; use canonical address per chain. | +| **PMM pool contracts** (one per pair) | You or DODO | DODO-style pool with getMidPrice, getOraclePrice, reserves, k, fee. Either: (a) deploy your own PMM factory + pools (e.g. DODO Vending Machine–compatible or custom), or (b) use existing DODO deployments on that chain if they match the MCP’s `dodo_pmm_v2_like` profile. | + +**Blockchains in the design (pool-matrix / deployment-status):** + +- **1** — Ethereum Mainnet +- **10** — Optimism +- **25** — Cronos +- **56** — BSC (BNB Chain) +- **100** — Gnosis Chain +- **137** — Polygon +- **1111** — Wemix +- **8453** — Base +- **42161** — Arbitrum One +- **42220** — Celo +- **43114** — Avalanche C-Chain + +For **each** chain where you want the MCP to work you need: + +1. **Token contracts:** Addresses for the cW* tokens (and any other base tokens) and for the hub quote tokens (USDC/USDT, etc.) on that chain. +2. **Pool contracts:** At least one PMM pool per pair you want to manage (e.g. cWUSDT/USDC, cWUSDC/USDC). Each pool must expose the view functions expected by the MCP’s pool profile (e.g. `dodo_pmm_v2_like`). + +So: **no** new chain-specific contracts are “for the MCP” itself; the MCP only needs **addresses** of tokens and pools that already exist. On public chains those tokens and pools either must be **deployed** by you (or your bridge/PMM stack) or come from existing protocols (e.g. DODO) that match the MCP’s interface. + +--- + +## 4. Summary table — “What must be deployed so the MCP has addresses” + +| Blockchain | Smart contracts / actions needed so MCP has addresses | +|------------|--------------------------------------------------------| +| **Chain 138** | DODOPMMIntegration already deployed. **Create pools** via it (cUSDT/cUSDC, cUSDT/USDT, cUSDC/USDC, etc.). Use existing cUSDT/cUSDC and chain USDT/USDC addresses. No extra contract deployment required. | +| **Ethereum (1), BSC (56), Polygon (137), Optimism (10), Gnosis (100), Cronos (25), Arbitrum (42161), Base (8453), Celo (42220), Wemix (1111), Avalanche (43114)** | (1) **cW* token** addresses on that chain (via your bridge or wrapper). (2) **Hub stable** addresses (USDC/USDT — usually exist). (3) **PMM pool** contracts per pair (deploy DODO-style or use existing DODO on that chain). Until these exist and are recorded (e.g. in deployment-status or allowlist), the MCP has nothing to point at on that chain. | + +--- + +## 5. References + +- MCP allowlist shape: `ai-mcp-pmm-controller/config/allowlist.json` +- MCP pool profile (view methods): `ai-mcp-pmm-controller/config/pool_profiles.json` +- Chain 138 tokens: `docs/11-references/CHAIN138_TOKEN_ADDRESSES.md` +- Chain 138 DODO: `smom-dbis-138/docs/integration/DODO_PMM_INTEGRATION.md`, `smom-dbis-138/docs/deployment/DEPLOYED_CONTRACTS_OVERVIEW.md` +- Per-chain pool design: `cross-chain-pmm-lps/config/pool-matrix.json`, `cross-chain-pmm-lps/config/deployment-status.json` +- DEX/pool gaps: `docs/11-references/DEX_AND_CROSS_CHAIN_CONTRACTS_NEEDED.md` diff --git a/docs/02-architecture/PROXMOX_HA_CLUSTER_ROADMAP.md b/docs/02-architecture/PROXMOX_HA_CLUSTER_ROADMAP.md index 56227ae..4abd1a7 100644 --- a/docs/02-architecture/PROXMOX_HA_CLUSTER_ROADMAP.md +++ b/docs/02-architecture/PROXMOX_HA_CLUSTER_ROADMAP.md @@ -121,4 +121,4 @@ So **yes — it should be full HA** if you want automatic failover and no single - **Current:** Cluster only; no shared storage; no Proxmox HA; manual migration and manual restart after maintenance. - **Target:** Full HA = shared storage + HA manager + HA resources so that when you power down an R630 (e.g. for DIMM B2 reseat), critical VMs/containers are restarted on another node automatically. -See also: [PROXMOX_CLUSTER_ARCHITECTURE.md](./PROXMOX_CLUSTER_ARCHITECTURE.md) (current cluster and “Future Enhancements”), [NPMPLUS_HA_SETUP_GUIDE.md](../04-configuration/NPMPLUS_HA_SETUP_GUIDE.md) (NPMplus-level HA with Keepalived). +See also: [PROXMOX_CLUSTER_ARCHITECTURE.md](./PROXMOX_CLUSTER_ARCHITECTURE.md) (current cluster and “Future Enhancements”), [NPMPLUS_HA_SETUP_GUIDE.md](../04-configuration/NPMPLUS_HA_SETUP_GUIDE.md) (NPMplus-level HA with Keepalived). For **13× R630 + DoD/MIL-spec** (full HA, Ceph, fencing, RAM/drives, STIG hardening), see **[R630_13_NODE_DOD_HA_MASTER_PLAN.md](./R630_13_NODE_DOD_HA_MASTER_PLAN.md)**. diff --git a/docs/02-architecture/R630_13_NODE_DOD_HA_MASTER_PLAN.md b/docs/02-architecture/R630_13_NODE_DOD_HA_MASTER_PLAN.md new file mode 100644 index 0000000..84dfc3e --- /dev/null +++ b/docs/02-architecture/R630_13_NODE_DOD_HA_MASTER_PLAN.md @@ -0,0 +1,273 @@ +# 13× R630 Proxmox Cluster — DoD/MIL-Spec HA Master Plan + +**Last Updated:** 2026-03-02 +**Document Version:** 1.0 +**Status:** Active — Master plan for 13-node HA, RAM/storage, and DoD/MIL compliance + +--- + +## 1. Executive Summary + +This document defines the target architecture for a **13-node Dell PowerEdge R630** Proxmox cluster with: + +- **Full HA and failover** (shared storage, HA manager, fencing, automatic recovery). +- **DoD/MIL-spec alignment** (STIG-style hardening, audit, encryption, change control, documentation). +- **RAM and drive specifications** for each R630 to support Ceph, VMs/containers, and growth. + +**Scope:** All 13 R630s as Proxmox cluster nodes; optional separate management node (e.g. ml110) or integration of management on a subset of R630s. Design assumes **hyper-converged** (Proxmox + Ceph on same nodes) for shared storage and true HA. + +--- + +## 2. Cluster Design — 13 Nodes + +### 2.1 Node roles and quorum + +| Item | Requirement | +|------|-------------| +| **Total nodes** | 13 × R630 | +| **Quorum** | Majority = 7. With 13 nodes, up to 6 can be down and cluster still has quorum. | +| **Fencing** | Required for HA: failed node must be fenced (power off/reboot) so Ceph and HA manager can safely restart resources elsewhere. | +| **Qdevice** | Optional: add a quorum device (e.g. small VM or appliance) so quorum survives more node failures; not required with 13 nodes but improves resilience. | + +### 2.2 Recommended node layout + +| Role | Node count | Purpose | +|------|------------|---------| +| **Proxmox + Ceph MON/MGR/OSD** | 13 | Every R630 runs Proxmox and participates in Ceph (MON, MGR, OSD) for shared storage. | +| **Ceph OSD** | 13 | Each node contributes disk as Ceph OSD; replication (e.g. size=3, min_size=2) across nodes. | +| **Proxmox HA** | 13 | HA manager can restart VMs/containers on any node; VM disks on Ceph. | +| **Optional dedicated** | 0 | No dedicated “monitor-only” nodes required; MON/MGR run on all or a subset (e.g. 3–5 MONs). | + +### 2.3 Network and addressing + +- **Management:** One subnet (e.g. 192.168.11.0/24) for Proxmox API, SSH, Ceph public/cluster. +- **Ceph:** Separate VLAN or subnet for Ceph cluster network (recommended for DoD: isolate storage traffic). +- **VLANs:** Same VLAN-aware bridge (e.g. vmbr0) on all nodes so VMs/containers keep IPs when failed over. +- **IP plan for 13 R630s:** Reserve 13 consecutive IPs (e.g. 192.168.11.11–192.168.11.23 for r630-01 … r630-13). Document in `config/ip-addresses.conf` and DNS. + +--- + +## 3. RAM Specifications — R630 + +### 3.1 R630 memory capabilities (reference) + +| Spec | Value | +|------|--------| +| **DIMM slots** | 24 (12 per socket in 2-socket) | +| **Max RAM** | Up to 1.5 TB (with compatible LRDIMMs) | +| **Typical configs** | 32 GB, 64 GB, 128 GB, 256 GB, 384 GB, 512 GB (depending on DIMM size and count) | +| **ECC** | Required for DoD/MIL; R630 supports ECC RDIMM/LRDIMM | + +### 3.2 Recommended RAM per node (DoD HA + Ceph) + +| Tier | RAM per node | Use case | +|------|----------------|---------| +| **Minimum** | 128 GB | Ceph OSD + a few VMs; acceptable for lab or light production. | +| **Recommended** | 256 GB | Production: Ceph (OSD + MON/MGR) + many VMs/containers; headroom for failover and recovery. | +| **High** | 384–512 GB | Heavy workloads, large Ceph OSD count per node, or when consolidating from existing 503 GB nodes. | + +**Ceph guidance:** Proxmox/Ceph recommend **≥ 8 GiB per OSD** for OSD memory. With 6–8 OSDs per node (see storage), **48–64 GiB** for Ceph plus Proxmox and guest overhead → **128 GB minimum**, **256 GB recommended**. + +**DoD/MIL note:** Prefer **256 GB per node** for 13-node production so that (1) multiple node failures still leave enough capacity for HA migrations and (2) Ceph recovery and rebalancing do not cause OOM or instability. + +### 3.3 RAM placement (if mixing sizes) + +If not all nodes have the same RAM: + +- Put **largest RAM** in nodes that run the most VMs or Ceph MON/MGR. +- Ensure **at least 128 GB** on every node that runs Ceph OSDs. +- Document exact DIMM layout per node (slot, size, speed) for change control and troubleshooting. + +--- + +## 4. Drive Specifications — R630 + +### 4.1 R630 drive options (reference) + +- **Internal bays:** Typically 8 × 2.5" SATA/SAS (or 10-bay with optional kit); some configs support NVMe (e.g. 4 × NVMe via PCIe). +- **Boot:** 2 drives in mirror (ZFS mirror or hardware RAID1) for Proxmox OS — **redundant, DoD-compliant**. +- **Data:** Remaining drives for Ceph OSD and/or local LVM (if hybrid). + +### 4.2 Recommended drive layout per R630 (full Ceph) + +| Purpose | Drives | Type | Size (example) | Configuration | +|---------|--------|------|----------------|---------------| +| **Boot (OS)** | 2 | SSD | 240–480 GB each | ZFS mirror (preferred) or HW RAID1; Proxmox root only. | +| **Ceph OSD** | 4–6 | SSD (or NVMe) | 480 GB – 1 TB each | One OSD per drive; no RAID (Ceph provides replication). | + +**Example per node:** 2 × 480 GB boot (ZFS mirror) + 6 × 960 GB SSD = 6 Ceph OSDs per node. +**Cluster total:** 13 × 6 = 78 OSDs; with replication 3×, usable capacity ≈ (78 × 0.9 TB) / 3 ≈ **~23 TB** (before bluestore overhead; adjust for actual sizes). + +### 4.3 DoD/MIL storage requirements + +- **Encryption:** At-rest encryption for sensitive data. Options: Ceph encryption (e.g. dm-crypt for OSD), or encrypted VMs (LUKS inside guest). Document which layers are encrypted and key management. +- **Integrity:** ZFS for boot (checksum, scrub). Ceph provides replication and recovery; use **bluestore** with checksums. +- **Sanitization:** Follow DoD 5220.22-M or NIST SP 800-88 for decommissioning/destruction of drives. +- **Spare:** Maintain spare drives and document replacement and wipe procedures. + +### 4.4 Sizing for your workload + +- **Current (from docs):** ~50+ VMIDs, mix of Besu, Blockscout, DBIS, NPMplus, etc.; growth ~20–50 GB/month. +- **Target:** Size Ceph pool so that **used + 2 years growth** stays < 75% of usable. Example: 15–20 TB usable → ~5–7 TB used now + growth headroom. + +--- + +## 5. Full HA and Failover Architecture + +### 5.1 Components + +| Component | Role | +|-----------|------| +| **Proxmox cluster** | 13 nodes; same cluster name; corosync for quorum. | +| **Ceph** | Shared storage: MON (3–5 nodes), MGR (2+), OSD on all 13. Replication size=3, min_size=2. | +| **Proxmox HA** | HA manager enabled; VMs/containers on Ceph added as HA resources; start/stop order and groups as needed. | +| **Fencing (STONITH)** | Mandatory: when a node is declared lost, fence device powers it off (or reboots) so Ceph and HA can safely reassign resources. Use Proxmox’s built-in fence agents (e.g. **fence_pve** with Proxmox API or IPMI/IDRAC). | +| **Network** | Redundant links where possible; same VLAN/bridge config on all nodes so failover does not change VM IPs. | + +### 5.2 Ceph design (summary) + +- **Pools:** At least one pool for VM/container disks (e.g. `ceph-vm`); optionally separate pool for backups or bulk data. +- **Replication:** size=3, min_size=2; tolerate 2 node failures without data loss (with 13 nodes). +- **Network:** Separate cluster network (e.g. 10.x or dedicated VLAN) for Ceph backend traffic; public for client (Proxmox) access. +- **MON/MGR:** 3 or 5 MONs (odd); 2 MGRs minimum. Spread across nodes for availability. + +### 5.3 HA resource and failover behavior + +- **HA resources:** Add each critical VM/CT as HA resource; define groups (e.g. “database first, then app”) and restart order. +- **Failure:** Node down → fencing → Ceph marks OSDs out → HA manager restarts VMs on other nodes using Ceph disks. +- **Maintenance:** Put node in maintenance → migrate VMs off (or let HA relocate) → fence not triggered; perform RAM/drive work. + +### 5.4 What “full HA” gives you (DoD-relevant) + +- **No single point of failure:** Storage replicated; compute can run on any node. +- **Automatic failover:** No manual migration for HA-managed guests. +- **Controlled maintenance:** Node can be taken down without losing services; documented procedures for patching and hardware changes. + +--- + +## 6. DoD/MIL-Spec Compliance Framework + +### 6.1 Alignment with DISA STIG / DoD requirements + +DoD/MIL typically implies (summary; you must map to your exact ATO/contract): + +| Area | Requirement | Implementation | +|------|-------------|----------------| +| **Hardening** | DISA STIG or equivalent for OS and applications | Apply STIG/CIS to Debian (Proxmox host) and guests; document exceptions. | +| **Authentication** | Strong auth, no default passwords, MFA where required | SSH key-only on Proxmox; no password SSH; RBAC in Proxmox; MFA for critical UIs if required. | +| **Access control** | Least privilege, RBAC, audit | Proxmox roles and permissions; separate admin vs operator; audit logs. | +| **Encryption** | TLS in transit; encryption at rest for sensitive data | TLS 1.2+ for API and Ceph; at-rest encryption (Ceph or LUKS) as required. | +| **Audit and logging** | Centralized, tamper-resistant, retention | rsyslog/syslog-ng to central log host; retention per policy; integrity (e.g. signed/hash). | +| **Change control** | Documented changes, rollback capability | Change tickets; config in Git; backups before changes; runbooks. | +| **Backup and recovery** | Regular backups, tested restore | Proxmox backups to separate storage; Ceph snapshots; DR runbook and tests. | +| **Physical and environmental** | Physical security, power, cooling | Out of scope for this doc; document in facility plan. | + +### 6.2 Hardening checklist (Proxmox + Debian) + +Use this as an operational checklist; align with your STIG version. + +**Proxmox hosts (Debian base):** + +- [ ] **SSH:** Key-only auth; PasswordAuthentication no; PermitRootLogin prohibit-password or key-only; strong ciphers/KexAlgorithms. +- [ ] **Firewall:** Restrict Proxmox API (8006) and SSH to management VLAN/CIDR; default deny. +- [ ] **Services:** Disable unnecessary services; only Proxmox, Ceph, corosync, and required dependencies. +- [ ] **Session timeout:** User session timeout (e.g. 900 s) in shell profile and/or Proxmox UI. +- [ ] **TLS:** TLS 1.2+ only; strong ciphers for pveproxy and Ceph. +- [ ] **Updates:** Security updates applied on a defined schedule; test in non-prod first. +- [ ] **FIPS:** If required by contract, use FIPS-validated crypto (kernel/openssl); document and test. +- [ ] **File permissions:** Sensitive files (keys, tokens) mode 600/400; no world-writable. +- [ ] **Audit:** auditd or equivalent for critical files and commands; logs to central host. + +**Ceph:** + +- [ ] **Auth:** Cephx enabled; key management per DoD key management policy. +- [ ] **Network:** Cluster network isolated; no Ceph ports exposed to user VLANs. +- [ ] **Encryption:** At-rest encryption for OSD if required; key escrow and rotation documented. + +**Guests (VMs/containers):** + +- [ ] **Per-guest hardening:** STIG/CIS per OS (e.g. Ubuntu, RHEL); documented baseline. +- [ ] **Secrets:** No secrets in configs in Git; use Vault or Proxmox secrets where applicable. + +**Existing automation (this repo):** Use `scripts/security/run-security-on-proxmox-hosts.sh` (SSH key-only + firewall 8006), `scripts/security/setup-ssh-key-auth.sh`, and `scripts/security/firewall-proxmox-8006.sh`; extend to all 13 hosts and run with `--apply` after validating with `--dry-run`. Extend host list in scripts or via env (e.g. all R630 IPs). + +### 6.3 Audit and documentation + +- **Configuration baseline:** All Proxmox and Ceph configs in version control; changes via PR/ticket. +- **Runbooks:** Install, upgrade, add node, remove node, replace drive, fence test, backup/restore, disaster recovery. +- **Evidence:** Run STIG/CIS scans (e.g. OpenSCAP, Nessus) and retain reports for assessors. +- **Change log:** Document every change (who, when, why, ticket); link to runbook. + +--- + +## 7. Phased Implementation + +### Phase 1 — Prepare (no downtime) + +1. **IP and DNS:** Assign and document 13 IPs for R630s; update `config/ip-addresses.conf` and DNS. +2. **RAM:** Upgrade all 13 R630s to at least 128 GB (256 GB recommended); document DIMM layout. +3. **Drives:** Install boot mirror (2 × SSD) and data drives (4–6 SSD per node) on each R630; configure ZFS mirror for boot. +4. **Proxmox install:** Install Proxmox VE on all 13; same version; join to one cluster; configure VLAN-aware bridge and management IPs. +5. **Hardening:** Apply SSH key-only, firewall, and STIG/CIS checklist to all nodes; document exceptions. + +### Phase 2 — Ceph + +1. **Ceph install:** Install Ceph on all 13 nodes (Proxmox Ceph integration); create MON (3 or 5), MGR (2), OSD (all nodes). +2. **Pools:** Create replication pool (size=3, min_size=2) for VM disks; add as Proxmox storage. +3. **Network:** Configure Ceph public and cluster networks; validate connectivity and latency. +4. **Tests:** Fill and drain; kill OSD/node and verify recovery; document procedures. + +### Phase 3 — HA and fencing + +1. **Fencing:** Configure fence_pve (or IPMI/IDRAC) for each node; test fence from another node. +2. **HA manager:** Enable HA in cluster; add critical VMs/containers as HA resources; set groups and order. +3. **Failover tests:** Power off one node; verify fencing and HA restart on another node; repeat for 2-node failure if desired. +4. **Runbooks:** Document failover test results and operational procedures. + +### Phase 4 — Migrate workload + +1. **Migrate disks:** Move VM/container disks from local storage to Ceph (live migration or backup/restore). +2. **Decommission local-only:** Once all HA resources are on Ceph, remove or repurpose local LVM for non-HA or cache. +3. **Monitoring and alerting:** Integrate with central monitoring; alerts for quorum loss, Ceph health, fence events, HA failures. + +### Phase 5 — DoD/MIL continuous compliance + +1. **Scans:** Schedule STIG/CIS scans; remediate and document exceptions. +2. **Backup and DR:** Automate backups; test restore quarterly; update DR runbook. +3. **Change control:** All changes via ticket + runbook; config in Git; periodic review of permissions and audit logs. + +--- + +## 8. References and Related Docs + +| Document | Purpose | +|----------|---------| +| [PROXMOX_HA_CLUSTER_ROADMAP.md](./PROXMOX_HA_CLUSTER_ROADMAP.md) | Current HA roadmap (3-node); extend to 13-node. | +| [PROXMOX_CLUSTER_ARCHITECTURE.md](./PROXMOX_CLUSTER_ARCHITECTURE.md) | Cluster and storage overview. | +| [PHYSICAL_DRIVES_AND_CONFIG.md](../04-configuration/PHYSICAL_DRIVES_AND_CONFIG.md) | Current drive layout (existing 2 R630s + ml110). | +| Proxmox Ceph documentation | [Ceph in Proxmox](https://pve.proxmox.com/pve-docs/chapter-pveceph.html). | +| Proxmox HA | [High Availability](https://pve.proxmox.com/pve-docs/chapter-ha-manager.html). | +| DISA STIG | [DISA STIGs](https://public.cyber.mil/stigs/); Debian/Ubuntu and application STIGs. | +| CIS Benchmarks | [CIS Benchmarks](https://www.cisecurity.org/cis-benchmarks); Debian, Proxmox if available. | + +--- + +## 9. Summary Table + +| Item | Specification | +|------|----------------| +| **Nodes** | 13 × Dell PowerEdge R630 | +| **Quorum** | Majority 7; up to 6 nodes can fail | +| **RAM per node** | Minimum 128 GB; **recommended 256 GB** (DoD production) | +| **Boot** | 2 × SSD (e.g. 240–480 GB) ZFS mirror per node | +| **Data (Ceph)** | 4–6 × SSD (e.g. 480 GB – 1 TB) per node, one OSD per drive | +| **Shared storage** | Ceph replicated (size=3, min_size=2) | +| **HA** | Proxmox HA manager; fencing (STONITH) required | +| **Hardening** | STIG/CIS alignment; SSH key-only; firewall; TLS; audit; change control | +| **Encryption** | TLS in transit; at-rest per policy (Ceph or LUKS) | + +--- + +**Owner:** Architecture / Infrastructure +**Review:** Quarterly or when adding nodes / changing compliance scope +**Change control:** Update version and “Last Updated” when changing this plan; link change ticket. diff --git a/docs/02-architecture/VMID_ALLOCATION_FINAL.md b/docs/02-architecture/VMID_ALLOCATION_FINAL.md index 139ddb1..3dd1ab7 100644 --- a/docs/02-architecture/VMID_ALLOCATION_FINAL.md +++ b/docs/02-architecture/VMID_ALLOCATION_FINAL.md @@ -2,12 +2,27 @@ **Navigation:** [Home](/docs/01-getting-started/README.md) > [Architecture](/docs/01-getting-started/README.md) > VMID Allocation -**Last Updated:** 2025-01-20 -**Document Version:** 1.0 +**Last Updated:** 2026-02-26 +**Document Version:** 1.1 **Status:** 🟢 Active Documentation --- +## VMID Quick Reference (Operational) + +| Range | Purpose | Notes | +|------:|---------|-------| +| 3000–3003 | Monitor / RPC-adjacent (ml110 / ccip-monitor-1..4) | Within RPC/Gateways (2500–3499). Not CCIP DON. Not AI/Agents. | +| 5400–5599 | CCIP DON (Chainlink CCIP) | 5410–5429 Commit, 5440–5459 Execute, 5470–5476 RMN. | +| 5700–5999 | AI / Agents / Dev | Official band for model serving, MCP, agent runtimes. | + +**Naming/Tags (recommended):** +- AI VMs: `ai--` (e.g. `ai-mcp-prod`, `ai-inf-dev`, `ai-agent-prod`) +- Monitor/RPC-adjacent: `ccip-monitor-` +- Proxmox tags: `AI`, `MCP`, `HF`, `MONITOR`, `PROD`/`DEV` + +--- + ## Complete VMID Allocation Table | VMID Range | Domain | Total VMIDs | Initial Usage | Available | @@ -16,7 +31,7 @@ | 5000–5099 | Blockscout | 100 | 1 | 99 | | 5200–5299 | Cacti | 100 | 1 | 99 | | 5400–5599 | Chainlink CCIP | 200 | 1+ | 199 | -| 5700–5999 | (available / buffer) | 300 | 0 | 300 | +| 5700–5999 | AI / Agents / Dev (model serving, MCP, agent runtimes) | 300 | 1 | 299 | | 6000–6099 | Fabric | 100 | 1 | 99 | | 6200–6299 | FireFly | 100 | 1 | 99 | | 6400–7399 | Indy | 1,000 | 1 | 999 | @@ -41,10 +56,14 @@ - **1500-1503**: Initial sentries (4 nodes) - **1504-2499**: Reserved for sentry expansion (996 VMIDs) -#### RPC / Gateways (2500-3499) - 1,000 VMIDs -- **2500-2502**: Initial RPC nodes (3 nodes) -- **2503-2505**: Besu RPC (HYBX; 3 nodes). **2506-2508 destroyed 2026-02-08** (no longer in use). -- **2509-3499**: Reserved for RPC/Gateway expansion +#### RPC / Gateways (Besu) — 2500–3499 +- **2500–2508:** In-use RPC/Gateway nodes (2500–2502 initial; 2503–2505 HYBX; 2506–2508 destroyed 2026-02-08). +- **2509–2999:** Reserved for RPC/Gateway expansion +- **3000–3003:** **ml110 / monitor-style (RPC-adjacent)** — legacy/current usage + - Suggested naming: **ccip-monitor-1..4** + - **Not** the CCIP DON allocation (CCIP DON = **5400–5599**) + - **Not** the AI/Agents allocation (AI/Agents = **5700–5999**) +- **3004–3499:** Reserved for RPC/Gateway expansion #### Archive / Telemetry (3500-4299) - 800 VMIDs - **3500+**: Archive / Snapshots / Mirrors / Telemetry @@ -78,10 +97,16 @@ --- -### Available / Buffer (5700-5999) - 300 VMIDs +### AI / Agents / Dev — 5700–5999 -- **5700**: Dev VM (shared Cursor dev + private Gitea for four users). See [DEV_VM_GITOPS_PLAN.md](../04-configuration/DEV_VM_GITOPS_PLAN.md). -- **5701-5999**: Reserved for future use / buffer space +This is the **official VMID range** for AI workloads, agent runtimes, MCP servers, and AI/dev experimentation. **Do not** place AI workloads in 3000–3099; that range is within RPC/Gateways expansion and includes legacy monitor/RPC-adjacent nodes (3000–3003). + +- **5700:** Dev VM (existing). See [DEV_VM_GITOPS_PLAN.md](../04-configuration/DEV_VM_GITOPS_PLAN.md). +- **5701–5749:** AI platform services (model serving, MCP hub, auth, observability) +- **5750–5899:** AI applications (per-project agents, DODO PMM tooling, policy guardrails) +- **5900–5999:** Experiments / temporary / buffer + +**Optional suggested layout:** 5701 = MCP Hub; 5702 = Inference (HF model server); 5703 = Agent Worker (orchestration); 5704 = Memory/State (Postgres/Redis/Vector DB). See [AI_AGENTS_57XX_DEPLOYMENT_PLAN.md](AI_AGENTS_57XX_DEPLOYMENT_PLAN.md) for copy/paste deployment steps (QEMU guest agent, 57xx layout, MCP/DODO PMM, read-only vs execution). --- @@ -131,16 +156,18 @@ VMID_VALIDATORS_START=1000 # Besu validators: 1000-1499 VMID_SENTRIES_START=1500 # Besu sentries: 1500-2499 VMID_RPC_START=2500 # Besu RPC: 2500-3499 VMID_ARCHIVE_START=3500 # Besu archive/telemetry: 3500-4299 -VMID_BESU_RESERVED_START=4300 # Besu reserved: 4300-4999 -VMID_EXPLORER_START=5000 # Blockscout: 5000-5099 -VMID_CACTI_START=5200 # Cacti: 5200-5299 -VMID_CCIP_START=5400 # Chainlink CCIP: 5400-5599 -VMID_BUFFER_START=5700 # Buffer: 5700-5999 -VMID_FABRIC_START=6000 # Fabric: 6000-6099 -VMID_FIREFLY_START=6200 # Firefly: 6200-6299 -VMID_INDY_START=6400 # Indy: 6400-7399 -VMID_SANKOFA_START=7800 # Sankofa/Phoenix/PanTel: 7800-8999 -VMID_SOVEREIGN_CLOUD_START=10000 # Sovereign Cloud: 10000-13999 +VMID_BESU_RESERVED_START=4300 # Besu reserved: 4300-4999 +VMID_EXPLORER_START=5000 # Blockscout: 5000-5099 +VMID_CACTI_START=5200 # Cacti: 5200-5299 +VMID_CCIP_START=5400 # Chainlink CCIP: 5400-5599 +VMID_AI_AGENTS_START=5700 # AI / Agents / Dev: 5700-5999 (model serving, MCP, agent runtimes) +# Optional alias for backward compatibility (deprecated): +# VMID_BUFFER_START=5700 # deprecated: use VMID_AI_AGENTS_START +VMID_FABRIC_START=6000 # Fabric: 6000-6099 +VMID_FIREFLY_START=6200 # Firefly: 6200-6299 +VMID_INDY_START=6400 # Indy: 6400-7399 +VMID_SANKOFA_START=7800 # Sankofa/Phoenix/PanTel: 7800-8999 +VMID_SOVEREIGN_CLOUD_START=10000 # Sovereign Cloud: 10000-13999 ``` --- @@ -153,7 +180,7 @@ VMID_SOVEREIGN_CLOUD_START=10000 # Sovereign Cloud: 10000-13999 | Blockscout | 5000 | 5099 | 100 | 1 | 99 | 99.0% | | Cacti | 5200 | 5299 | 100 | 1 | 99 | 99.0% | | Chainlink CCIP | 5400 | 5599 | 200 | 1+ | 199 | 99.5% | -| Buffer | 5700 | 5999 | 300 | 0 | 300 | 100% | +| AI/Agents/Dev | 5700 | 5999 | 300 | 1 | 299 | 99.7% | | Fabric | 6000 | 6099 | 100 | 1 | 99 | 99.0% | | FireFly | 6200 | 6299 | 100 | 1 | 99 | 99.0% | | Indy | 6400 | 7399 | 1,000 | 1 | 999 | 99.9% | @@ -170,11 +197,16 @@ VMID_SOVEREIGN_CLOUD_START=10000 # Sovereign Cloud: 10000-13999 ✅ **Future-proof** - Large buffers and reserved ranges ✅ **Modular design** - Each service has dedicated range ✅ **Sovereign Cloud Band** - 4,000 VMIDs for SMOM/ICCC/DBIS/Absolute Realms +✅ **AI/Agents band (5700–5999)** — Dedicated range for model serving, MCP, agent runtimes; 3000–3003 remain RPC/monitor-adjacent --- ## Migration Notes +**New Additions (v1.1):** +- **AI/Agents/Dev (5700–5999)** defined as the official band for AI inference, MCP, agent runtimes, vector DB, and AI platform services (not 3000–3099). +- **3000–3003** explicitly documented as **RPC/monitor-adjacent** (ml110 / ccip-monitor-1..4), not CCIP DON and not AI/Agents. + **Previous Allocations**: - Validators: 106-110, 1100-1104 → **1000-1004** - Sentries: 111-114, 1110-1113 → **1500-1503** @@ -187,8 +219,13 @@ VMID_SOVEREIGN_CLOUD_START=10000 # Sovereign Cloud: 10000-13999 - Indy: 8000, 263 → **6400** **New Additions**: -- Buffer: 5700-5999 (300 VMIDs) +- AI/Agents/Dev: 5700-5999 (300 VMIDs). **Use this band for AI inference, MCP, agent runtimes, vector DB; not 3000-3099.** Sub-ranges: 5701-5749 platform, 5750-5899 apps, 5900-5999 experiments. 3000-3003 remain RPC/monitor-adjacent (ml110/ccip-monitor-1..4). - Sankofa/Phoenix/PanTel: 7800-8999 (1,200 VMIDs) - Sovereign Cloud Band: 10000-13999 (4,000 VMIDs) - **NPMplus Alltra/HYBX:** VMID 10235 (192.168.11.169). See [04-configuration/NPMPLUS_ALLTRA_HYBX_MASTER_PLAN.md](../04-configuration/NPMPLUS_ALLTRA_HYBX_MASTER_PLAN.md). NPMplus range: 10233 (primary), 10234 (HA secondary), 10235 (Alltra/HYBX). +--- + +**Owner:** Architecture +**Review cadence:** Quarterly or upon new VMID band creation +**Change control:** PR required; update Version + Last Updated diff --git a/docs/03-deployment/ADD_LIQUIDITY_PMM_CHAIN138_RUNBOOK.md b/docs/03-deployment/ADD_LIQUIDITY_PMM_CHAIN138_RUNBOOK.md new file mode 100644 index 0000000..4afd44a --- /dev/null +++ b/docs/03-deployment/ADD_LIQUIDITY_PMM_CHAIN138_RUNBOOK.md @@ -0,0 +1,49 @@ +# Add Liquidity to PMM Pools (Chain 138) — Runbook + +**Purpose:** Add base/quote liquidity to the three DODO PMM pools on Chain 138 (cUSDT/cUSDC, cUSDT/USDT, cUSDC/USDC). + +**Prerequisites:** +- Deployer has **cUSDT** and **cUSDC** (and optional official USDT/USDC) balance on Chain 138. +- `smom-dbis-138/.env` has: `PRIVATE_KEY`, `RPC_URL_138`, `DODO_PMM_INTEGRATION_ADDRESS` (or `DODO_PMM_INTEGRATION`), pool addresses and amounts. + +--- + +## 1. Set pool addresses and amounts in .env + +Add or set in `smom-dbis-138/.env`: + +```bash +# Pool addresses (from PRE_DEPLOYMENT_CHECKLIST / create-all-pmm-pools-chain138.sh) +POOL_CUSDTCUSDC=0x9fcB06Aa1FD5215DC0E91Fd098aeff4B62fEa5C8 +POOL_CUSDTUSDT=0xa3Ee6091696B28e5497b6F491fA1e99047250c59 +POOL_CUSDCUSDC=0x90bd9Bf18Daa26Af3e814ea224032d015db58Ea5 + +# Amounts (6 decimals; e.g. 1000000 = 1 USDT/USDC) +ADD_LIQUIDITY_BASE_AMOUNT=1000000 +ADD_LIQUIDITY_QUOTE_AMOUNT=1000000 +``` + +Optional per-pool overrides: `ADD_LIQUIDITY_CUSDTCUSDC_BASE`, `ADD_LIQUIDITY_CUSDTCUSDC_QUOTE`, etc. + +--- + +## 2. Run the add-liquidity script + +From repo root (or from `smom-dbis-138` with `RPC_URL_138` and `DODO_PMM_INTEGRATION` set): + +```bash +cd smom-dbis-138 +source .env +forge script script/dex/AddLiquidityPMMPoolsChain138.s.sol:AddLiquidityPMMPoolsChain138 \ + --rpc-url "$RPC_URL_138" --broadcast --private-key "$PRIVATE_KEY" --with-gas-price 1000000000 +``` + +Ensure the deployer has approved (or the script will approve) base/quote tokens to `DODOPMMIntegration` and has sufficient balance for the chosen amounts. + +--- + +## 3. References + +- [DODO_PMM_INTEGRATION.md](../../smom-dbis-138/docs/integration/DODO_PMM_INTEGRATION.md) — `addLiquidity(pool, baseAmount, quoteAmount)` +- [PRE_DEPLOYMENT_CHECKLIST](PRE_DEPLOYMENT_CHECKLIST.md) § Step 3 +- [DEPLOYMENT_ORDER_OF_OPERATIONS](DEPLOYMENT_ORDER_OF_OPERATIONS.md) § Phase 3.1 diff --git a/docs/03-deployment/CONTRACT_DEPLOYMENT_RUNBOOK.md b/docs/03-deployment/CONTRACT_DEPLOYMENT_RUNBOOK.md index a5737f7..205e1ad 100644 --- a/docs/03-deployment/CONTRACT_DEPLOYMENT_RUNBOOK.md +++ b/docs/03-deployment/CONTRACT_DEPLOYMENT_RUNBOOK.md @@ -2,10 +2,14 @@ **Last Updated:** 2026-02-12 +**Full deployment order:** For the canonical sequence (prerequisites → core → PMM/pools → provider → optional → cW* → verification) and remaining recommendations, see [DEPLOYMENT_ORDER_OF_OPERATIONS.md](DEPLOYMENT_ORDER_OF_OPERATIONS.md). + +**Deployment safety:** Use **RPC_URL_138** (Core only, from `smom-dbis-138/.env`) for all deployments; never use Public RPC. All secrets from **`smom-dbis-138/.env`** only. Run a gas/cost estimate before deploy (e.g. `cd smom-dbis-138 && ./scripts/deployment/calculate-costs-consolidated.sh`). **Do not deploy when transactions are stuck** — clear tx pool (`./scripts/clear-all-transaction-pools.sh`), wait ~60s, then retry; use scripts that check nonce when available. + ## Chain 138 deployment requirements (learned 2026-02-12) - **Gas price:** Chain 138 enforces a minimum gas price. Always use **`--with-gas-price 1000000000`** (1 gwei) for `forge script` and `forge create` when deploying to Chain 138; otherwise transactions fail with "Gas price below configured minimum gas price". -- **On-chain check:** After deployments, run `./scripts/verify/check-contracts-on-chain-138.sh` (uses `RPC_URL_138`; optional URL arg). Address list comes from `config/smart-contracts-master.json` when available. See [CONTRACT_ADDRESSES_REFERENCE](../11-references/CONTRACT_ADDRESSES_REFERENCE.md), [CONTRACT_INVENTORY_AND_VERIFICATION](../11-references/CONTRACT_INVENTORY_AND_VERIFICATION.md). +- **On-chain check:** After deployments, run `./scripts/verify/check-contracts-on-chain-138.sh` (uses `RPC_URL_138`; optional URL arg). Address list comes from `config/smart-contracts-master.json` when available. See [CONTRACT_ADDRESSES_REFERENCE](../11-references/CONTRACT_ADDRESSES_REFERENCE.md), [ADDRESS_MATRIX_AND_STATUS](../11-references/ADDRESS_MATRIX_AND_STATUS.md). - **TransactionMirror:** The deploy script can hit a Forge broadcast constructor-args decode error. If so, deploy manually: `forge create contracts/mirror/TransactionMirror.sol:TransactionMirror --constructor-args --rpc-url $RPC_URL_138 --private-key $PRIVATE_KEY --gas-price 1000000000`. ## RPC Routing Summary @@ -19,13 +23,16 @@ Chain 138 uses two standard env vars: **RPC_URL_138** (Core, admin/deploy) and * ## Prerequisites -1. **Network access** to Chain 138 RPC (set `RPC_URL_138` in .env, e.g. http://192.168.11.211:8545 for Core) +1. **.env check (keys only, no secrets printed):** From repo root: `./scripts/deployment/preflight-chain138-deploy.sh` (RPC, dotenv, nonce). Or from smom-dbis-138: `./scripts/deployment/check-env-required.sh` — verifies `PRIVATE_KEY`, `RPC_URL`, `RPC_URL_138` and optional PMM/mainnet/CCIP vars. Use **`smom-dbis-138/.env`** only for deploy secrets. +2. **Network access** to Chain 138 RPC (set `RPC_URL_138` in .env, e.g. http://192.168.11.211:8545 for Core) - Run from a host on the same LAN as Proxmox, or via VPN - WSL/remote dev environments may get "No route to host" if not on network -2. **PRIVATE_KEY** in `smom-dbis-138/.env` (deployer wallet with gas; same wallet holds LINK for bridge fees) +3. **PRIVATE_KEY** in `smom-dbis-138/.env` (deployer wallet with gas; same wallet holds LINK for bridge fees) -3. **Foundry** (`forge`) installed +4. **Foundry** (`forge`) installed + +5. **Test all contracts before deploy (Phase 0.8):** Run `./scripts/deployment/test-all-contracts-before-deploy.sh` from repo root. This runs `forge build` and `forge test` in smom-dbis-138. Use `--dry-run` to print commands only; `--alltra` to include alltra-lifi-settlement; `--no-match "Fork|Mainnet|Integration|e2e"` for unit tests only. See [DEPLOYMENT_ORDER_OF_OPERATIONS](DEPLOYMENT_ORDER_OF_OPERATIONS.md) § Phase 0.8. ### Deprecated bridge (R4) @@ -90,7 +97,31 @@ forge script script/smart-accounts/DeploySmartAccountsKit.s.sol --rpc-url $RPC_U ## TransactionMirror (Chain 138) -**Script:** `script/DeployTransactionMirror.s.sol`. If `forge script` fails with "Failed to decode constructor arguments", deploy via `forge create`: +**Script:** `script/DeployTransactionMirror.s.sol`. **Deployed address:** Set in `smom-dbis-138/.env` as `TRANSACTION_MIRROR_ADDRESS` from the script output (e.g. past deploys: `0xE362aa10D3Af1A16880A799b78D18F923403B55a`, `0x4eeF36BBaf706C6da5859cF9B34E9934fEC3E006`). + +**Recommended:** Use the combined script; it **always checks nonce**, **validates RPC is active (chainId 138)**, uses **proper gas** (1 gwei min), and loads the **correct dotenv** (`smom-dbis-138/.env` + `config/ip-addresses.conf` for RPC fallbacks). + +**Required in `smom-dbis-138/.env`:** `PRIVATE_KEY`, `RPC_URL_138` (Core RPC, 192.168.11.211:8545). No Public fallback for deployments. Optional: `GAS_PRICE` or `GAS_PRICE_138` (default 1000000000). Before deploying: if Core was read-only, run `./scripts/maintenance/make-rpc-vmids-writable-via-ssh.sh` then `./scripts/maintenance/health-check-rpc-2101.sh`. See [RPC_2101_READONLY_FIX.md](RPC_2101_READONLY_FIX.md). + +**If you see "Known transaction" or "Replacement transaction underpriced":** Clear the tx pool then retry: `./scripts/clear-all-transaction-pools.sh` (or RPC-only; see script). Run from a host that can reach `RPC_URL_138` (same LAN/VPN): + +```bash +./scripts/deployment/deploy-transaction-mirror-and-pmm-pool-after-txpool-clear.sh +``` + +This deploys TransactionMirror and creates the DODO cUSDT/cUSDC PMM pool, then runs on-chain verification. **Core RPC only** (no Public fallback). If Core is unreachable, fix read-only and health first (see RPC_2101_READONLY_FIX.md). Options: `--dry-run` (env, RPC, nonce only); `--force` (skip RPC check). + +**Skip stuck nonce manually:** Set `NEXT_NONCE` to the next nonce (e.g. `13370`) so the script uses `vm.setNonce` and deploys at a new address; then set `TRANSACTION_MIRROR_ADDRESS` in `.env` to the logged address. The combined script already sets `NEXT_NONCE` from pending nonce. + +Or run the two forge commands manually (ensure RPC is Chain 138 and nonce is correct): +```bash +cd smom-dbis-138 && source .env +# Optional: export NEXT_NONCE= if avoiding a stuck tx +forge script script/DeployTransactionMirror.s.sol:DeployTransactionMirror --rpc-url "$RPC_URL_138" --broadcast --private-key "$PRIVATE_KEY" --with-gas-price 1000000000 +forge script script/dex/CreateCUSDTCUSDCPool.s.sol:CreateCUSDTCUSDCPool --rpc-url "$RPC_URL_138" --broadcast --private-key "$PRIVATE_KEY" --with-gas-price 1000000000 +``` + +If `forge script` fails with "Failed to decode constructor arguments", deploy via `forge create`: ```bash cd smom-dbis-138 @@ -230,9 +261,9 @@ Deploy the [Stabilizer](../../smom-dbis-138/contracts/bridge/trustless/integrati ## Contract Verification (Blockscout) -Use the **Forge Verification Proxy** for `forge verify-contract` (Blockscout expects `module`/`action` in query; Forge sends JSON only). +Use the **Forge Verification Proxy** for `forge verify-contract` (Blockscout expects `module`/`action` in query; Forge sends JSON only). The verification script uses **canonical addresses** from `smom-dbis-138/.env` and `config/ip-addresses.conf` (ORACLE_PROXY, AGGREGATOR_ADDRESS, CCIP_SENDER, CCIPWETH9_BRIDGE_CHAIN138, etc.); run from a host on LAN that can reach Blockscout (192.168.11.140:4000). -**Preferred: orchestrated script (starts proxy if needed, timeout 600s):** +**Preferred: orchestrated script (starts proxy if needed, timeout 900s default):** ```bash source smom-dbis-138/.env 2>/dev/null ./scripts/verify/run-contract-verification-with-proxy.sh diff --git a/docs/03-deployment/DEPLOYMENT_ORDER_OF_OPERATIONS.md b/docs/03-deployment/DEPLOYMENT_ORDER_OF_OPERATIONS.md new file mode 100644 index 0000000..b37f74e --- /dev/null +++ b/docs/03-deployment/DEPLOYMENT_ORDER_OF_OPERATIONS.md @@ -0,0 +1,194 @@ +# Full Deployment Order of Operations + +**Last Updated:** 2026-02-28 +**Purpose:** Single canonical sequence for deploying and completing the system: prerequisites → Chain 138 core → PMM/pools → provider → optional → cW* → verification. Use this as the master order; other runbooks give per-step detail. + +**Related:** [RECOMMENDATIONS_AND_FIXES_BEFORE_DEPLOY.md](RECOMMENDATIONS_AND_FIXES_BEFORE_DEPLOY.md) (all recommendations & fixes before deploy) | [PRE_DEPLOYMENT_CHECKLIST.md](PRE_DEPLOYMENT_CHECKLIST.md) (PMM/pools focus) | [CONTRACT_DEPLOYMENT_RUNBOOK.md](CONTRACT_DEPLOYMENT_RUNBOOK.md) (per-script detail) | [RECOMMENDATIONS_OPERATOR_CHECKLIST.md](../00-meta/RECOMMENDATIONS_OPERATOR_CHECKLIST.md) (R1–R24) + +--- + +## Deployment safety (required practices) + +Before any Chain 138 deployment, follow these four rules: + +| Rule | Requirement | +|------|-------------| +| **Correct RPC** | Use **only** `RPC_URL_138` from `smom-dbis-138/.env` for deployments. It must point to **Core RPC** (VMID 2101, `http://192.168.11.211:8545`). **Never** use `RPC_URL_138_PUBLIC` or Public RPC for deploying — Public is for bridge/monitoring/frontend only. See [RPC_ENDPOINTS_MASTER](../04-configuration/RPC_ENDPOINTS_MASTER.md). | +| **Correct dotenv** | All deployment secrets (`PRIVATE_KEY`, `RPC_URL_138`, `GAS_PRICE_138`, contract addresses) come from **`smom-dbis-138/.env`** only. Do not source a different .env for deploy. Env check: `cd smom-dbis-138 && ./scripts/deployment/check-env-required.sh`. From repo root, pre-flight: `./scripts/deployment/preflight-chain138-deploy.sh`. | +| **Gas API / cost estimate** | Before deploying, run a **gas/cost estimation** for accurate deployment costs. **Chain 138:** minimum gas is 1 gwei; use `cd smom-dbis-138 && ./scripts/deployment/calculate-costs-consolidated.sh` (or see [DEPLOYMENT_GAS_COSTS_REALTIME](../11-references/DEPLOYMENT_GAS_COSTS_REALTIME.md), [GAS_API_INTEGRATION_SUMMARY](../06-besu/GAS_API_INTEGRATION_SUMMARY.md)) to estimate total cost. For **other chains** (e.g. mainnet), use Etherscan/Infura Gas API where available. | +| **Do not deploy when stuck** | Check deployer **nonce** (pending vs latest). If there are pending/stuck transactions, run `./scripts/clear-all-transaction-pools.sh` then wait **~60s** before deploying. Prefer scripts that **check nonce** (e.g. `./scripts/deployment/deploy-transaction-mirror-and-pmm-pool-after-txpool-clear.sh`). If you see "Replacement transaction underpriced" or "Known transaction", do **not** retry until the tx pool is cleared and nonce is consistent. | + +--- + +## Overview + +| Phase | Scope | When | +|-------|--------|------| +| **0** | Prerequisites & gates | Before any deploy | +| **1** | Chain 138 core (if not already deployed) | One-time or refresh | +| **2** | TransactionMirror + PMM pools (Chain 138) | Required for PMM routing | +| **3** | Liquidity + DODOPMMProvider | After pools exist | +| **4** | Optional: EnhancedSwapRouter, trustless, CCIP other chains | When dependencies exist | +| **5** | cW* edge pools (11 public chains) | When cW* tokens and infra exist | +| **6** | Post-deploy verification & recommendations | After each phase and ongoing | + +--- + +## Phase 0 — Prerequisites (do first) + +Execute in any order where no dependency; all must be satisfied before Phase 1–2. + +| # | Item | Action | +|---|------|--------| +| 0.1 | **RPC 2101 (Core) writable** | If read-only: `./scripts/maintenance/make-rpc-vmids-writable-via-ssh.sh` then `./scripts/maintenance/health-check-rpc-2101.sh`. See [RPC_2101_READONLY_FIX.md](RPC_2101_READONLY_FIX.md). | +| 0.2 | **Deployer wallet funded (Chain 138)** | ≥ ~0.006 ETH (recommended 1–2 ETH). Check: `cd smom-dbis-138 && ./scripts/deployment/check-balances-gas-and-deploy.sh`. | +| 0.3 | **Env configured** | `smom-dbis-138/.env` only: `PRIVATE_KEY`, `RPC_URL_138` (Core); for PMM: `DODO_PMM_INTEGRATION_ADDRESS=0x79cdbaFBaA0FdF9F55D26F360F54cddE5c743F7D`. Optional: `GAS_PRICE_138`, `GAS_PRICE`. Run: `cd smom-dbis-138 && ./scripts/deployment/check-env-required.sh`. Or from repo root: `./scripts/deployment/preflight-chain138-deploy.sh`. | +| 0.4 | **Gas / cost estimate** | Run cost estimate before deploy: `cd smom-dbis-138 && ./scripts/deployment/calculate-costs-consolidated.sh` (or see [DEPLOYMENT_GAS_COSTS_REALTIME](../11-references/DEPLOYMENT_GAS_COSTS_REALTIME.md)). Chain 138 uses min 1 gwei; script gives estimated total cost. | +| 0.5 | **POOL_MANAGER_ROLE** | Deployer must have POOL_MANAGER_ROLE on DODOPMMIntegration for pool creation and provider registration. | +| 0.6 | **No stuck transactions** | If nonce has pending txs or "Replacement transaction underpriced": run `./scripts/clear-all-transaction-pools.sh` then wait ~60s. Use Core RPC only (no Public fallback). Prefer deploy scripts that check nonce (e.g. `deploy-transaction-mirror-and-pmm-pool-after-txpool-clear.sh`). | +| 0.7 | **Foundry** | `forge` in PATH; `cd smom-dbis-138 && forge build` succeeds. | +| 0.8 | **Test all contracts** | Run **before** any deploy: `./scripts/deployment/test-all-contracts-before-deploy.sh`. Runs `forge build` and `forge test` in smom-dbis-138 (includes **GRU c* integration tests**: `GRUCompliantTokensRegistryTest`); optionally alltra-lifi-settlement. Use `--dry-run` to print commands only. See [CONTRACT_DEPLOYMENT_RUNBOOK](CONTRACT_DEPLOYMENT_RUNBOOK.md) § Test before deploy. | + +--- + +## Phase 1 — Chain 138 core (if not already deployed) + +If core contracts are already deployed (36/38 present per verification), skip to Phase 2. Otherwise follow this order. + +| # | Item | Script / command | Depends on | +|---|------|------------------|------------| +| 1.1 | **Phased core** | `01_DeployCore.s.sol` → set `UNIVERSAL_ASSET_REGISTRY`, `GOVERNANCE_CONTROLLER` in .env → `02_DeployBridges.s.sol` | Phase 0 | +| 1.2 | **Or: unified deploy** | `./scripts/deployment/deploy-contracts-unified.sh --mode ordered` | Phase 0 | +| 1.3 | **CCIP WETH9 bridge** | `GAS_PRICE=1000000000 ./scripts/deploy-and-configure-weth9-bridge-chain138.sh`; set `CCIPWETH9_BRIDGE_CHAIN138` | Phase 0 | +| 1.4 | **Deterministic (CREATE2) core** | `forge script script/deploy/DeployDeterministicCore.s.sol --rpc-url $RPC_URL_138 --broadcast --private-key $PRIVATE_KEY --with-gas-price 1000000000` | Phase 0 | + +**Gas:** Always use `--with-gas-price 1000000000` (1 gwei) for Chain 138. See [CONTRACT_DEPLOYMENT_RUNBOOK.md](CONTRACT_DEPLOYMENT_RUNBOOK.md). + +--- + +## Phase 2 — TransactionMirror and PMM pools (Chain 138) + +Required for PMM routing. Full steps: [PRE_DEPLOYMENT_CHECKLIST.md](PRE_DEPLOYMENT_CHECKLIST.md) §3. + +**Run Phase 2 (and optional register c* + verify) in one go:** `./scripts/deployment/run-all-next-steps-chain138.sh` — preflight → mirror+pool → register c* as GRU → verify. Use `--skip-mirror` for pool-only (set `TRANSACTION_MIRROR_ADDRESS` in .env first). See [NEXT_STEPS_INDEX](../00-meta/NEXT_STEPS_INDEX.md) §3. + +| # | Item | Command / script | +|---|------|------------------| +| 2.1 | **TransactionMirror** | `./scripts/deployment/deploy-transaction-mirror-and-pmm-pool-after-txpool-clear.sh` (deploys mirror + cUSDT/cUSDC pool), or run `DeployTransactionMirror.s.sol` only. Set `TRANSACTION_MIRROR_ADDRESS` in .env. If deploy fails with CreateCollision, see [TRANSACTION_MIRROR_CHAIN138_COLLISION_FIX.md](TRANSACTION_MIRROR_CHAIN138_COLLISION_FIX.md); use `--skip-mirror` for pool-only. | +| 2.2 | **PMM pools (all three)** | Either: (a) after 2.1 run `CreateCUSDTUSDTPool.s.sol` and `CreateCUSDCUSDCPool.s.sol`, or (b) `./scripts/deployment/create-all-pmm-pools-chain138.sh` (all three). Use Core RPC only. | +| 2.3 | **Record pool addresses** | Note each pool address for Phase 3 (DODOPMMProvider registration). | +| 2.4 | **Register c* as GRU (ERC-2535 integration)** | Set c* and token addresses in .env: `./scripts/deployment/set-dotenv-c-tokens-and-register-gru.sh` (or `--no-register` to only update .env). Then run RegisterGRUCompliantTokens (script runs it unless `--no-register`). **If registration reverts (empty data):** the proxy implementation may be older — upgrade first: `cd smom-dbis-138 && forge script script/deploy/UpgradeUniversalAssetRegistry.s.sol --rpc-url $RPC_URL_138 --broadcast --private-key $PRIVATE_KEY --with-gas-price 1000000000` (requires UPGRADER_ROLE). Then grant REGISTRAR_ROLE if needed (see script comment) and re-run set-dotenv script. See [GRU_M00_DIAMOND_FACET_MAP](../04-configuration/GRU_M00_DIAMOND_FACET_MAP.md); [GRU_M00_DIAMOND_REVIEW_GAPS_AND_RECOMMENDATIONS](../04-configuration/GRU_M00_DIAMOND_REVIEW_GAPS_AND_RECOMMENDATIONS.md). | + +--- + +## Phase 3 — Liquidity and DODOPMMProvider + +| # | Item | Action | +|---|------|--------| +| 3.1 | **Add liquidity (optional)** | Per pool: approve base/quote to DODOPMMIntegration, then `addLiquidity(pool, baseAmount, quoteAmount)`. See [DODO_PMM_INTEGRATION.md](../../smom-dbis-138/docs/integration/DODO_PMM_INTEGRATION.md). | +| 3.2 | **Deploy DODOPMMProvider** | `forge script script/liquidity/DeployDODOPMMProvider.s.sol:DeployDODOPMMProvider --rpc-url $RPC_URL_138 --broadcast --private-key $PRIVATE_KEY --with-gas-price 1000000000`. Set `DODO_PMM_PROVIDER_ADDRESS` in .env. | +| 3.3 | **Register pools** | For each pool (cUSDT/cUSDC, cUSDT/USDT, cUSDC/USDC): call `provider.registerPool(tokenIn, tokenOut, poolAddress)` (via cast or script). | +| 3.4 | **Token-aggregation** | Set `CHAIN_138_DODO_PMM_INTEGRATION` where the token-aggregation service runs; ensure indexer runs so API exposes pools. | +| 3.5 | **MCP allowlist (optional)** | Use `ai-mcp-pmm-controller/config/allowlist-138.json` (Chain 138 pools). Run with `ALLOWLIST_PATH=config/allowlist-138.json CHAIN=138`. See [README-allowlist-138.md](../../ai-mcp-pmm-controller/config/README-allowlist-138.md). | + +--- + +## Phase 4 — Optional: EnhancedSwapRouter, trustless, CCIP other chains + +Only when dependencies exist (Uniswap/Balancer on 138, or mainnet/other-chain RPC and env). + +| # | Item | When / command | +|---|------|----------------| +| 4.1 | **EnhancedSwapRouter (Chain 138)** | When Uniswap V3 / Balancer pools exist on 138: deploy with chain-138–aware script (env quoter/poolId); configure post-deploy. See CONTRACT_DEPLOYMENT_RUNBOOK § EnhancedSwapRouter. | +| 4.2 | **Trustless stack (Lockbox138 + Mainnet)** | When Mainnet RPC and keys available: deploy trustless bridge contracts; set INBOX_ETH, BOND_MANAGER, etc. See [OPTIONAL_DEPLOYMENTS_START_HERE.md](../07-ccip/OPTIONAL_DEPLOYMENTS_START_HERE.md) §2C. | +| 4.3 | **CCIP other chains (Gnosis, Celo, Wemix)** | Deploy WETH bridges per chain; add destinations 138↔chain; fund LINK. See [CONFIG_READY_CHAINS_COMPLETION_RUNBOOK.md](../07-ccip/CONFIG_READY_CHAINS_COMPLETION_RUNBOOK.md). | +| 4.4 | **LINK on Mainnet relay** | [RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK.md](../07-ccip/RELAY_BRIDGE_ADD_LINK_SUPPORT_RUNBOOK.md). | + +--- + +## Phase 5 — cW* edge pools (11 public chains) + +Design and pool matrix: [POOLS_AND_NETWORKS_FULL_DESIGN.md](../11-references/POOLS_AND_NETWORKS_FULL_DESIGN.md). Per chain: deploy cW* tokens (or bridge), then create 6 “poolsFirst” + optional pools per [pool-matrix.json](../../cross-chain-pmm-lps/config/pool-matrix.json) and [06-deployment-recipe.md](../../cross-chain-pmm-lps/docs/06-deployment-recipe.md). + +| # | Item | Action | +|---|------|--------| +| 5.1 | **Per-chain RPC and env** | Set `CHAIN_*_RPC_URL`, `CHAIN_*_DODO_PMM_INTEGRATION` (or pool source) for each of 1, 10, 25, 56, 100, 137, 42161, 42220, 43114, 8453, 1111 if indexing via token-aggregation. | +| 5.2 | **Deploy and fund** | Per chain: deploy or bridge cW* tokens; create and fund PMM pools per pool-matrix; add to MCP allowlist per chain if using MCP. | + +--- + +## Phase 6 — Post-deploy verification and recommendations + +After each deployment phase and periodically. + +| # | Item | Command / doc | +|---|------|----------------| +| 6.1 | **On-chain verification (Chain 138)** | `./scripts/verify/check-contracts-on-chain-138.sh [RPC_URL]`. Target 38/38 when TransactionMirror and all three PMM pools exist. | +| 6.2 | **Blockscout verification** | When Blockscout reachable: `./scripts/verify/run-contract-verification-with-proxy.sh`. See [BLOCKSCOUT_VERIFICATION_GUIDE.md](../08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md). | +| 6.3 | **Update address docs** | Update [CONTRACT_ADDRESSES_REFERENCE.md](../11-references/CONTRACT_ADDRESSES_REFERENCE.md), [LIQUIDITY_POOLS_MASTER_MAP.md](../11-references/LIQUIDITY_POOLS_MASTER_MAP.md) with new pool and provider addresses. | +| 6.4 | **Recommendations (R1–R24)** | Follow [RECOMMENDATIONS_OPERATOR_CHECKLIST.md](../00-meta/RECOMMENDATIONS_OPERATOR_CHECKLIST.md): verify on Blockscout, keep address refs updated, use correct RPC/gas, manage nonce, runbooks in sync, monitoring, testing, token mapping. | +| 6.5 | **Full recommendations list** | Optional and ongoing: [ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md](../00-meta/ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md) (~139 items, 20 sections); [OPERATOR_READY_CHECKLIST.md](../00-meta/OPERATOR_READY_CHECKLIST.md) for copy-paste commands. | + +--- + +## Remaining recommendations and suggestions to complete + +Beyond the deployment order above, these are the main recommendation buckets. Complete as part of operations or when rolling out new features. + +### Operator checklist (R1–R24) + +- **Verification & source of truth (R1–R3):** Verify every contract on Blockscout; keep CONTRACT_ADDRESSES_REFERENCE and inventory updated; run check-contracts-on-chain-138.sh. +- **Security and secrets (R4–R7):** Use only canonical CCIPWETH9Bridge; never commit .env/keys; restrict deployer and RPC access. +- **Deployment (R8–R11):** Set RPC_URL_138 (Core); use gas 1 gwei on 138; phased core order (01 → 02); manage nonce if tx stuck. +- **Docs and runbooks (R12–R13):** Keep runbooks in sync with scripts and Blockscout URL; document addresses per chain. +- **Automation and CI (R14–R16):** Run verification after deploy in CI; consider env/config per environment. +- **Monitoring and ops (R17–R18):** Monitor bridge/oracle events; ensure Blockscout and /api are up. +- **Testing and quality (R19–R20):** Run forge test before deploy; NatSpec on public functions. +- **Config and DNS (R21–R22):** The Order/NPMplus proxy when deployed; document blocks #2–#6 if decided. +- **Quick wins (R23):** Progress indicators, --dry-run, config validation. +- **Token mapping (R24):** Keep config/token-mapping.json as single source of truth. + +**Doc:** [RECOMMENDATIONS_OPERATOR_CHECKLIST.md](../00-meta/RECOMMENDATIONS_OPERATOR_CHECKLIST.md). + +### Full recommendations list (~139 items) + +- **Proxmox / validated set:** Secure .env and validator keys, SSH key auth, firewall, VLANs, metrics, health, backup, runbooks (items 1–11 high; 12–20 medium; 21–35 low/quick wins). +- **Code quality & scripts:** Shebang, set -euo pipefail, script headers, shellcheck, consolidation, lib, perf (36–43). +- **Documentation:** Quick refs, decision trees, config templates, consolidation, API docs (44–47, 68–74). +- **Security & config:** Audit, validation, scanning, RBAC, config validation, templates, tests, CI (48–57). +- **Monitoring & DX:** Logging, metrics, health, DevContainer, backup review (58–67). +- **Placeholders & codebase:** Canonical addresses env-only, AlltraAdapter fee, smart accounts, quote Fabric chainId, .bak deprecation (87–91). +- **Other:** GRU M00 Diamond spine, CMC/CoinGecko submission, optional naming, Vault System Master Plan. + +**Doc:** [ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md](../00-meta/ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md). **Execution plan:** [COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md](../00-meta/COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md). + +### Copy-paste operator commands + +For a single page of exact commands (CCIP bridges, LINK relay, Blockscout verify, 502 fix, DODO PMM, trustless, full operator tasks): [OPERATOR_READY_CHECKLIST.md](../00-meta/OPERATOR_READY_CHECKLIST.md). + +--- + +## Quick reference — deployment order summary + +1. **Prerequisites:** RPC writable (Core only), deployer funded, **smom-dbis-138/.env** (no other dotenv), gas/cost estimate run, POOL_MANAGER_ROLE, **no stuck txs** (clear pool if needed), forge build. +2. **Chain 138 core:** 01_DeployCore → set env → 02_DeployBridges (or unified script); WETH9 bridge; deterministic if needed. +3. **PMM:** TransactionMirror + create all three PMM pools (cUSDT/cUSDC, cUSDT/USDT, cUSDC/USDC). +4. **Provider:** Add liquidity (optional) → deploy DODOPMMProvider → register pools → token-aggregation env → MCP allowlist (optional). +5. **Optional:** EnhancedSwapRouter (when Uniswap/Balancer on 138), trustless stack, CCIP other chains, LINK relay. +6. **cW*:** Per chain: deploy/bridge cW* tokens, create and fund pools per pool-matrix. +7. **Verify & recommendations:** check-contracts-on-chain-138.sh, Blockscout verify, update address docs, R1–R24, full recommendations list. + +--- + +## References + +| Doc | Purpose | +|-----|---------| +| [PRE_DEPLOYMENT_CHECKLIST.md](PRE_DEPLOYMENT_CHECKLIST.md) | PMM/pools/prerequisites and scripts | +| [CONTRACT_DEPLOYMENT_RUNBOOK.md](CONTRACT_DEPLOYMENT_RUNBOOK.md) | Per-script detail, gas, RPC, TransactionMirror | +| [REQUIRED_FIXES_AND_DEPLOYMENTS_STATUS.md](REQUIRED_FIXES_AND_DEPLOYMENTS_STATUS.md) | RPC fix, missing contracts, completion steps | +| [RECOMMENDATIONS_OPERATOR_CHECKLIST.md](../00-meta/RECOMMENDATIONS_OPERATOR_CHECKLIST.md) | R1–R24 | +| [ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md](../00-meta/ALL_RECOMMENDATIONS_AND_IMPROVEMENTS_LIST.md) | ~139 items | +| [OPERATOR_READY_CHECKLIST.md](../00-meta/OPERATOR_READY_CHECKLIST.md) | Copy-paste commands | +| [COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md](../00-meta/COMPLETE_REQUIRED_OPTIONAL_RECOMMENDED_INDEX.md) | Full plan execution order | +| [FULL_PARALLEL_EXECUTION_ORDER.md](../00-meta/FULL_PARALLEL_EXECUTION_ORDER.md) | Waves for parallel execution | diff --git a/docs/03-deployment/NEXT_STEPS_PMM_FULL_PARITY_AND_ALL_POOLS.md b/docs/03-deployment/NEXT_STEPS_PMM_FULL_PARITY_AND_ALL_POOLS.md new file mode 100644 index 0000000..3d0350b --- /dev/null +++ b/docs/03-deployment/NEXT_STEPS_PMM_FULL_PARITY_AND_ALL_POOLS.md @@ -0,0 +1,118 @@ +# Next Steps: Full Parity and Deploy All PMM Pools + +**Last Updated:** 2026-02-28 +**Purpose:** Ordered list of steps to achieve full PMM parity and deploy all DODO PMM pools (Chain 138 first, then multichain). + +--- + +## Current state + +| Scope | DODOPMMIntegration | Pools (cUSDT/cUSDC, cUSDT/USDT, cUSDC/USDC) | DODOPMMProvider | Liquidity | +|-------|--------------------|-----------------------------------------------|-----------------|-----------| +| **Chain 138** | Deployed (`0x79cdbaFBaA0FdF9F55D26F360F54cddE5c743F7D`) | Created (addresses in .env / LIQUIDITY_POOLS_MASTER_MAP) | Deployed (`0x8EF6657D2a86c569F6ffc337EE6b4260Bd2e59d0`) | **Zero** (pools empty) | +| **L2s (BSC, Polygon, Base, etc.)** | Script exists (`deploy-pmm-all-l2s.sh`) | Not created | Not deployed | N/A | +| **cW* mesh (11 chains)** | Design only | 111 pools in design | Not deployed | N/A | + +**Full parallel runner (Phase 1 + Phase 2):** From `smom-dbis-138/` run `./scripts/deployment/run-pmm-full-parity-all-phases.sh`. Phase 1 creates the three PMM pools in parallel, registers them with DODOPMMProvider, then adds liquidity if `ADD_LIQUIDITY_BASE_AMOUNT` and `ADD_LIQUIDITY_QUOTE_AMOUNT` are set. Phase 2 runs each L2 (BSC, Polygon, Base, etc.) in parallel: deploy cUSDT/cUSDC then DODOPMMIntegration per chain. Use `RUN_PHASE1=0` or `RUN_PHASE2=0` to skip a phase; `DRY_RUN=1` to print only. + +**References:** [PMM_DEX_ROUTING_STATUS.md](../11-references/PMM_DEX_ROUTING_STATUS.md), [POOLS_AND_NETWORKS_FULL_DESIGN.md](../11-references/POOLS_AND_NETWORKS_FULL_DESIGN.md), [PRE_DEPLOYMENT_CHECKLIST.md](PRE_DEPLOYMENT_CHECKLIST.md), [LIQUIDITY_POOLS_MASTER_MAP.md](../11-references/LIQUIDITY_POOLS_MASTER_MAP.md). + +--- + +## Phase 1: Chain 138 — Verify, add liquidity, and go live + +1. **Confirm RPC and deployer** + - Use **Core RPC** only: `RPC_URL_138` (e.g. `http://192.168.11.211:8545`). See [REQUIRED_FIXES_AND_DEPLOYMENTS_STATUS.md](REQUIRED_FIXES_AND_DEPLOYMENTS_STATUS.md). + - If Core was read-only: `./scripts/maintenance/make-rpc-vmids-writable-via-ssh.sh` then `./scripts/maintenance/health-check-rpc-2101.sh`. + - Ensure deployer has gas and `POOL_MANAGER_ROLE` on DODOPMMIntegration. + +2. **Verify or create the three PMM pools** + - Pools (from PRE_DEPLOYMENT_CHECKLIST / .env): + - cUSDT/cUSDC: `0x9fcB06Aa1FD5215DC0E91Fd098aeff4B62fEa5C8` + - cUSDT/USDT: `0xa3Ee6091696B28e5497b6F491fA1e99047250c59` + - cUSDC/USDC: `0x90bd9Bf18Daa26Af3e814ea224032d015db58Ea5` + - If any pool is missing on-chain, create it: + - `forge script script/dex/CreateCUSDTCUSDCPool.s.sol:CreateCUSDTCUSDCPool --rpc-url "$RPC_URL_138" --broadcast --private-key "$PRIVATE_KEY"` + - `forge script script/dex/CreateCUSDTUSDTPool.s.sol:CreateCUSDTUSDTPool --rpc-url "$RPC_URL_138" --broadcast --private-key "$PRIVATE_KEY"` + - `forge script script/dex/CreateCUSDCUSDCPool.s.sol:CreateCUSDCUSDCPool --rpc-url "$RPC_URL_138" --broadcast --private-key "$PRIVATE_KEY"` + - Or use `./scripts/setup-dodo-pools.sh` (creates cUSDT/USDT and cUSDC/USDC; ensure OFFICIAL_USDT_ADDRESS and OFFICIAL_USDC_ADDRESS are set in .env for Chain 138). + +3. **Register pools with DODOPMMProvider** (if not already) + - Set in .env: `POOL_CUSDTCUSDC`, `POOL_CUSDTUSDT`, `POOL_CUSDCUSDC`. + - Run: `forge script script/liquidity/RegisterDODOPools.s.sol:RegisterDODOPools --rpc-url "$RPC_URL_138" --broadcast --private-key "$PRIVATE_KEY"`. + +4. **Add liquidity to all three pools** + - Approve base/quote tokens to `DODOPMMIntegration` (`0x79cdbaFBaA0FdF9F55D26F360F54cddE5c743F7D`). + - Call `DODOPMMIntegration.addLiquidity(pool, baseAmount, quoteAmount)` for each pool. See [DODO_PMM_INTEGRATION.md](../../smom-dbis-138/docs/integration/DODO_PMM_INTEGRATION.md). + - **Forge script:** `forge script script/dex/AddLiquidityPMMPoolsChain138.s.sol:AddLiquidityPMMPoolsChain138 --rpc-url "$RPC_URL_138" --broadcast --private-key "$PRIVATE_KEY"` with env `ADD_LIQUIDITY_BASE_AMOUNT` and `ADD_LIQUIDITY_QUOTE_AMOUNT` (e.g. `1000000e6`). Or use **full-parity runner:** `./scripts/deployment/run-pmm-full-parity-all-phases.sh` (Phase 1 creates pools in parallel, registers, then adds liquidity when amounts are set). + +5. **Optional: Deploy EnhancedSwapRouter (Chain 138)** + - Only after Uniswap/Balancer (or other DEX) pools exist on 138; configure quoter and pool IDs. See [PMM_DEX_ROUTING_STATUS.md](../11-references/PMM_DEX_ROUTING_STATUS.md) §5. + +6. **Update docs** + - Set [PMM_DEX_ROUTING_STATUS.md](../11-references/PMM_DEX_ROUTING_STATUS.md) to “pools created” and “liquidity added” when done. + - Re-run `./scripts/verify/check-contracts-on-chain-138.sh` and fix any missing addresses (e.g. TransactionMirror, pool addresses in .env). + +--- + +## Phase 2: Multichain — Deploy DODOPMMIntegration and pools on L2s + +7. **Deploy cUSDT and cUSDC on each target chain** (if not already) + - Chains: BSC (56), Polygon (137), Base (8453), Optimism (10), Arbitrum (42161), Avalanche (43114), Cronos (25), Gnosis (100). See [CUSDT_CUSDC_MULTICHAIN_LIQUIDITY_RUNBOOK.md](../../smom-dbis-138/docs/deployment/CUSDT_CUSDC_MULTICHAIN_LIQUIDITY_RUNBOOK.md). + - From `smom-dbis-138/`: `./scripts/deployment/deploy-cusdt-cusdc-all-chains.sh` or run `DeployCompliantUSDT.s.sol` and `DeployCompliantUSDC.s.sol` per chain with that chain’s RPC and chain ID. + - Record addresses in .env (e.g. `CUSDT_ADDRESS_137`, `CUSDC_ADDRESS_137` for Polygon). + +8. **Deploy DODOPMMIntegration on each L2** + - From `smom-dbis-138/`: `./scripts/deployment/deploy-pmm-all-l2s.sh` (optionally with `--chain bsc polygon base` or set `DEPLOY_PMM_L2S_FILTER` in .env). + - Requires per-chain: `*_DODO_VENDING_MACHINE_ADDRESS` (or `DODO_VENDING_MACHINE_ADDRESS`), `*_OFFICIAL_USDT_ADDRESS`, `*_OFFICIAL_USDC_ADDRESS`; optional per-chain compliant addresses. + - Save each `DODOPMM_INTEGRATION_` (or equivalent) in .env. + +9. **Create the three PMM pool types on each L2** + - For each chain where DODOPMMIntegration is deployed: call `createCUSDTCUSDCPool`, `createCUSDTUSDTPool`, `createCUSDCUSDCPool` (or equivalent) via Forge script parameterized by that chain’s RPC and integration address. + - No single “create-all-pools-all-chains” script today; either add one or loop over chains and run the same Create* pool scripts with chain-specific env. + +10. **Deploy DODOPMMProvider (and register pools) on each L2** + - Deploy provider per chain (e.g. `DeployDODOPMMProvider.s.sol` with that chain’s RPC), then run RegisterDODOPools with that chain’s pool addresses. + +11. **Add liquidity on each L2** + - Same as Step 4, per chain: approve tokens to the integration, then `addLiquidity` for each pool. + +--- + +## Phase 3: Chain 138 — Remaining pools (blocked until tokens exist) + +12. **XAU and cEURT pools (blocked until tokens exist)** + - Deploy or obtain **XAU** and **cEURT** on Chain 138. + - Create public PMM pools: cUSDT/XAU, cUSDC/XAU, cEURT/XAU via `createPool(baseToken, quoteToken, ...)` on DODOPMMIntegration. + - Create private stabilization pools (PrivatePoolRegistry): cUSDT↔XAU, cUSDC↔XAU, cEURT↔XAU. See [POOLS_AND_NETWORKS_FULL_DESIGN.md](../11-references/POOLS_AND_NETWORKS_FULL_DESIGN.md) and [LIQUIDITY_POOLS_MASTER_MAP.md](../11-references/LIQUIDITY_POOLS_MASTER_MAP.md). + +13. **Bridge LP (optional)** + - Deploy full trustless stack including **LiquidityPoolETH** and fund it when swap–bridge–swap is required. See [DEX_AND_CROSS_CHAIN_CONTRACTS_NEEDED.md](../11-references/DEX_AND_CROSS_CHAIN_CONTRACTS_NEEDED.md). + +--- + +## Phase 4: Cross-chain cW* PMM mesh (design / recipe only; not deployed) + +14. **cW* edge pools on 11 public chains** + - 111 pools (66 first + 45 optional) across Ethereum, BSC, Polygon, Base, Optimism, Arbitrum, Avalanche, Cronos, Gnosis, Celo, Wemix. See [POOLS_AND_NETWORKS_FULL_DESIGN.md](../11-references/POOLS_AND_NETWORKS_FULL_DESIGN.md) and [cross-chain-pmm-lps/docs/06-deployment-recipe.md](../../cross-chain-pmm-lps/docs/06-deployment-recipe.md). + - Prerequisites: cW* tokens and infrastructure on each chain; then deploy and fund per deployment recipe. Not in scope for “all PMM pools” parity until cW* is deployed. + +--- + +## Summary checklist (full parity = Phase 1 + Phase 2) + +| # | Step | Script / command | +|---|------|------------------| +| 1 | RPC + deployer ready (138) | `health-check-rpc-2101.sh`, `check-balances-gas-and-deploy.sh` | +| 2 | Verify or create 3 pools (138) | `CreateCUSDTCUSDCPool.s.sol`, `CreateCUSDTUSDTPool.s.sol`, `CreateCUSDCUSDCPool.s.sol` or `setup-dodo-pools.sh` | +| 3 | Register pools with DODOPMMProvider (138) | `RegisterDODOPools.s.sol` | +| 4 | Add liquidity to 3 pools (138) | `addLiquidity(pool, baseAmount, quoteAmount)` via cast or Forge script | +| 5 | Optional: EnhancedSwapRouter (138) | When DEX pools exist on 138 | +| 6 | Update PMM/routing docs | PMM_DEX_ROUTING_STATUS, CONTRACT_ADDRESSES_REFERENCE | +| 7 | Deploy cUSDT/cUSDC on L2s | `deploy-cusdt-cusdc-all-chains.sh` or per-chain Forge scripts | +| 8 | Deploy DODOPMMIntegration on L2s | `deploy-pmm-all-l2s.sh` | +| 9 | Create 3 pool types on each L2 | Per-chain Forge Create* pool scripts | +| 10 | Deploy DODOPMMProvider + register (each L2) | `DeployDODOPMMProvider.s.sol`, `RegisterDODOPools.s.sol` per chain | +| 11 | Add liquidity on each L2 | Same as Step 4, per chain | + +**Full parity** for “all PMM pools” in the current design means: **Chain 138** — three pools created, registered, and **funded**; **each target L2** — integration deployed, three pools created, provider deployed and registered, and pools funded. Phase 3 (XAU/cEURT) and Phase 4 (cW* mesh) extend beyond this baseline. diff --git a/docs/03-deployment/PRE_DEPLOYMENT_CHECKLIST.md b/docs/03-deployment/PRE_DEPLOYMENT_CHECKLIST.md new file mode 100644 index 0000000..11302dd --- /dev/null +++ b/docs/03-deployment/PRE_DEPLOYMENT_CHECKLIST.md @@ -0,0 +1,175 @@ +# Pre-Deployment Checklist — DODO PMM, Pools, Provider, Router & APIs + +**Last Updated:** 2026-02-28 +**Purpose:** Single source of truth for component status and ordered steps required before deployment (Chain 138). + +**See also:** [DEPLOYMENT_ORDER_OF_OPERATIONS.md](DEPLOYMENT_ORDER_OF_OPERATIONS.md) — full deployment order (Phase 0–6) and remaining recommendations. + +### Deployment safety (required) + +- **Correct RPC:** Use only **Core RPC** (`RPC_URL_138` = VMID 2101, e.g. `http://192.168.11.211:8545`). Never use Public RPC for deployments. Set in `smom-dbis-138/.env`. +- **Correct dotenv:** All secrets from **`smom-dbis-138/.env`** only. Check: `cd smom-dbis-138 && ./scripts/deployment/check-env-required.sh`. Pre-flight from repo root: `./scripts/deployment/preflight-chain138-deploy.sh`. +- **Gas / cost estimate:** Run `cd smom-dbis-138 && ./scripts/deployment/calculate-costs-consolidated.sh` (or see [DEPLOYMENT_GAS_COSTS_REALTIME](../11-references/DEPLOYMENT_GAS_COSTS_REALTIME.md)) before deploying for accurate cost estimates. +- **Do not deploy when stuck:** If nonce has pending txs or you see "Replacement transaction underpriced", run `./scripts/clear-all-transaction-pools.sh` then wait ~60s before deploying. Prefer scripts that check nonce (e.g. `deploy-transaction-mirror-and-pmm-pool-after-txpool-clear.sh`). + +--- + +## 1. Component status (current state) + +| Component | Status | Address / Notes | +|-----------|--------|-----------------| +| **DODOPMMIntegration** | ✅ Deployed | Chain 138: `0x79cdbaFBaA0FdF9F55D26F360F54cddE5c743F7D` (Mock DVM). | +| **PMM pools (cUSDT/cUSDC, cUSDT/USDT, cUSDC/USDC)** | ✅ Created | cUSDT/cUSDC: `0x9fcB06Aa1FD5215DC0E91Fd098aeff4B62fEa5C8`; cUSDT/USDT: `0xa3Ee6091696B28e5497b6F491fA1e99047250c59`; cUSDC/USDC: `0x90bd9Bf18Daa26Af3e814ea224032d015db58Ea5`. | +| **DODOPMMProvider** | ✅ Deployed | `0x8EF6657D2a86c569F6ffc337EE6b4260Bd2e59d0`; all three pools registered via `script/liquidity/RegisterDODOPools.s.sol`. | +| **EnhancedSwapRouter** | ❌ Not deployed | Mainnet-only script today; for Chain 138 deploy when Uniswap/Balancer pools exist; set quoter/poolId. | +| **Token-aggregation API** | ✅ Implemented, runnable | Single-hop quotes; can index DODO once pools exist (set `CHAIN_138_DODO_PMM_INTEGRATION`). | +| **Bridge quote (swap+bridge+swap)** | ✅ Implemented | `POST /api/bridge/quote`; on-chain coordinator optional. | +| **Cross-chain cW* mesh** | Design/tooling only | Edge pools and bots not deployed. | + +--- + +## 2. Prerequisites before running deployment + +- [ ] **RPC 2101 (Core) writable** + If Core was read-only: run + `./scripts/maintenance/make-rpc-vmids-writable-via-ssh.sh` then + `./scripts/maintenance/health-check-rpc-2101.sh`. + See [RPC_2101_READONLY_FIX.md](RPC_2101_READONLY_FIX.md). + +- [ ] **Deployer wallet funded (Chain 138)** + At least ~0.006 ETH (5M gas × 1 gwei + buffer). Recommended 1–2 ETH. + Check: `./scripts/deployment/check-balances-gas-and-deploy.sh` (from `smom-dbis-138`). + +- [ ] **Env set in `smom-dbis-138/.env` only** + Required: `PRIVATE_KEY`, `RPC_URL_138` (must be Core RPC, not Public). + For PMM: `DODO_PMM_INTEGRATION_ADDRESS=0x79cdbaFBaA0FdF9F55D26F360F54cddE5c743F7D`. + Optional: `GAS_PRICE_138` or `GAS_PRICE` (default 1 gwei). + After TransactionMirror deploy: set `TRANSACTION_MIRROR_ADDRESS` from script output. + Verify: `cd smom-dbis-138 && ./scripts/deployment/check-env-required.sh`. + +- [ ] **Gas / cost estimate run** + Before deploying: `cd smom-dbis-138 && ./scripts/deployment/calculate-costs-consolidated.sh` for estimated deployment cost (Chain 138 min gas 1 gwei). + +- [ ] **Deployer has POOL_MANAGER_ROLE on DODOPMMIntegration** + Pool creation and (if used) DODOPMMProvider registration require this role. + +- [ ] **No stuck transactions** + Do not deploy if there are pending/stuck txs. If you see "Replacement transaction underpriced" or stuck nonce: run `./scripts/clear-all-transaction-pools.sh` then wait ~60s before re-running deploy. Use scripts that check nonce when available. + +--- + +## 3. Steps to complete before deployment (in order) + +### Step 1: Deploy TransactionMirror (if not already deployed) + +```bash +cd smom-dbis-138 +export RPC_URL_138="${RPC_URL_138:-http://192.168.11.211:8545}" +forge script script/DeployTransactionMirror.s.sol:DeployTransactionMirror \ + --rpc-url "$RPC_URL_138" --broadcast --private-key "$PRIVATE_KEY" --with-gas-price 1000000000 +``` + +- Save the logged TransactionMirror address to `smom-dbis-138/.env` as `TRANSACTION_MIRROR_ADDRESS`. + +### Step 2: Create PMM pools (cUSDT/cUSDC, cUSDT/USDT, cUSDC/USDC) + +Use **Core RPC only** (no Public fallback). Either use the combined script (Step 2a) or run each pool script (Step 2b). + +**2a) Combined (TransactionMirror + cUSDT/cUSDC pool only):** + +```bash +./scripts/deployment/deploy-transaction-mirror-and-pmm-pool-after-txpool-clear.sh +``` + +This deploys TransactionMirror then creates **only** the cUSDT/cUSDC pool. For the other two pools use 2b. + +**2b) Create each pool manually** (e.g. after 2a, or if mirror already deployed): + +```bash +cd smom-dbis-138 +export DODO_PMM_INTEGRATION="${DODO_PMM_INTEGRATION_ADDRESS:-0x79cdbaFBaA0FdF9F55D26F360F54cddE5c743F7D}" +export RPC_URL_138="${RPC_URL_138:-http://192.168.11.211:8545}" +export GAS_PRICE="${GAS_PRICE_138:-${GAS_PRICE:-1000000000}}" + +# cUSDT/cUSDC +forge script script/dex/CreateCUSDTCUSDCPool.s.sol:CreateCUSDTCUSDCPool \ + --rpc-url "$RPC_URL_138" --broadcast --private-key "$PRIVATE_KEY" --with-gas-price "$GAS_PRICE" + +# cUSDT/USDT +forge script script/dex/CreateCUSDTUSDTPool.s.sol:CreateCUSDTUSDTPool \ + --rpc-url "$RPC_URL_138" --broadcast --private-key "$PRIVATE_KEY" --with-gas-price "$GAS_PRICE" + +# cUSDC/USDC +forge script script/dex/CreateCUSDCUSDCPool.s.sol:CreateCUSDCUSDCPool \ + --rpc-url "$RPC_URL_138" --broadcast --private-key "$PRIVATE_KEY" --with-gas-price "$GAS_PRICE" +``` + +If you see “Replacement transaction underpriced”, wait for the pending tx to be mined or clear the tx pool, then retry (optionally with higher gas). After each creation, note the pool address for Step 4. + +### Step 3: Add liquidity to pools (optional but recommended) + +Use `DODOPMMIntegration.addLiquidity(pool, baseAmount, quoteAmount)` for each pool. Approve base/quote tokens to the integration contract first. See [DODO_PMM_INTEGRATION.md](../../smom-dbis-138/docs/integration/DODO_PMM_INTEGRATION.md). + +### Step 4: Deploy DODOPMMProvider and register pools + +```bash +cd smom-dbis-138 +forge script script/liquidity/DeployDODOPMMProvider.s.sol:DeployDODOPMMProvider \ + --rpc-url "$RPC_URL_138" --broadcast --private-key "$PRIVATE_KEY" --with-gas-price "$GAS_PRICE" +``` + +Save the logged address as `DODO_PMM_PROVIDER_ADDRESS` in `.env`. Then, for each pool (cUSDT/cUSDC, cUSDT/USDT, cUSDC/USDC), call: + +```solidity +provider.registerPool(tokenIn, tokenOut, poolAddress); +``` + +(e.g. via `cast send` or a small script) so that `getQuote` / `executeSwap` work for those pairs. + +### Step 5: EnhancedSwapRouter (optional, when Uniswap/Balancer exist on 138) + +Current deploy script is mainnet-only (`block.chainid == 1`). For Chain 138: + +- When Uniswap V3 / Balancer pools exist on 138, add or use a Chain-138–aware deploy script (env-based quoter/poolId). +- Run with `--rpc-url $RPC_URL_138` and configure quoter and Balancer poolId after deploy. + See [CONTRACT_DEPLOYMENT_RUNBOOK.md](CONTRACT_DEPLOYMENT_RUNBOOK.md) § EnhancedSwapRouter. + +### Step 6: Token-aggregation API (DODO indexing) + +- Ensure `CHAIN_138_DODO_PMM_INTEGRATION=0x79cdbaFBaA0FdF9F55D26F360F54cddE5c743F7D` (or equivalent) is set where the token-aggregation service runs. Optional: `CHAIN_138_DODO_POOL_MANAGER`, `CHAIN_138_DODO_VENDING_MACHINE` (see token-aggregation `.env.example` and [dex-factories.ts](../../smom-dbis-138/services/token-aggregation/src/config/dex-factories.ts)). +- Once pools exist, the service can index DODO pools from DODOPMMIntegration and expose single-hop quotes. + +### Step 7: On-chain verification + +After any new deployment: + +```bash +./scripts/verify/check-contracts-on-chain-138.sh [RPC_URL] +``` + +Target: all expected addresses (e.g. 38/38 when TransactionMirror and DODO cUSDT/cUSDC pool are present). Update [REQUIRED_FIXES_AND_DEPLOYMENTS_STATUS.md](REQUIRED_FIXES_AND_DEPLOYMENTS_STATUS.md) and [CONTRACT_ADDRESSES_REFERENCE.md](../11-references/CONTRACT_ADDRESSES_REFERENCE.md) with new pool and provider addresses. + +--- + +## 4. Script reference + +| Script | Purpose | +|--------|---------| +| `scripts/deployment/deploy-transaction-mirror-and-pmm-pool-after-txpool-clear.sh` | Deploy TransactionMirror + create cUSDT/cUSDC pool (Core RPC only). | +| `smom-dbis-138/script/dex/CreateCUSDTCUSDCPool.s.sol` | Create cUSDT/cUSDC pool. | +| `smom-dbis-138/script/dex/CreateCUSDTUSDTPool.s.sol` | Create cUSDT/USDT pool. | +| `smom-dbis-138/script/dex/CreateCUSDCUSDCPool.s.sol` | Create cUSDC/USDC pool. | +| `smom-dbis-138/script/liquidity/DeployDODOPMMProvider.s.sol` | Deploy DODOPMMProvider (then register pools). | +| `smom-dbis-138/script/bridge/trustless/DeployEnhancedSwapRouter.s.sol` | Deploy EnhancedSwapRouter (mainnet-only; Chain 138 needs env/config). | +| `scripts/verify/check-contracts-on-chain-138.sh` | Verify expected contract addresses on Chain 138. | + +--- + +## 5. References + +- [POOLS_AND_NETWORKS_FULL_DESIGN.md](../11-references/POOLS_AND_NETWORKS_FULL_DESIGN.md) — Every pool and network in the full design (61 pools, 6 networks). +- [REQUIRED_FIXES_AND_DEPLOYMENTS_STATUS.md](REQUIRED_FIXES_AND_DEPLOYMENTS_STATUS.md) — RPC fix, missing contracts, completion steps. +- [UNDEPLOYED_CONTRACTS_PRE_DEPLOYMENT_TASKS.md](UNDEPLOYED_CONTRACTS_PRE_DEPLOYMENT_TASKS.md) — Dry-run and validation tasks. +- [PMM_DEX_ROUTING_STATUS.md](../11-references/PMM_DEX_ROUTING_STATUS.md) — Full PMM/DEX routing status. +- [DODO_PMM_INTEGRATION.md](../../smom-dbis-138/docs/integration/DODO_PMM_INTEGRATION.md) — Pool creation, liquidity, swap usage. +- [CONTRACT_DEPLOYMENT_RUNBOOK.md](CONTRACT_DEPLOYMENT_RUNBOOK.md) — EnhancedSwapRouter & DODOPMMProvider config. diff --git a/docs/03-deployment/RECOMMENDATIONS_AND_FIXES_BEFORE_DEPLOY.md b/docs/03-deployment/RECOMMENDATIONS_AND_FIXES_BEFORE_DEPLOY.md new file mode 100644 index 0000000..42ed58a --- /dev/null +++ b/docs/03-deployment/RECOMMENDATIONS_AND_FIXES_BEFORE_DEPLOY.md @@ -0,0 +1,141 @@ +# Recommendations and Fixes Before Deploying Smart Contracts and PMM Pools + +**Last Updated:** 2026-02-27 +**Purpose:** Single checklist of all **recommendations** and **required fixes** to complete before deploying smart contracts and PMM pools on Chain 138 (and related chains). Use this with [DEPLOYMENT_ORDER_OF_OPERATIONS.md](DEPLOYMENT_ORDER_OF_OPERATIONS.md) and [PRE_DEPLOYMENT_CHECKLIST.md](PRE_DEPLOYMENT_CHECKLIST.md). + +**Related:** [TODOS_CONSOLIDATED](../00-meta/TODOS_CONSOLIDATED.md) § First (0a–0c) | [CONTRACT_DEPLOYMENT_RUNBOOK.md](CONTRACT_DEPLOYMENT_RUNBOOK.md) | [RECOMMENDATIONS_OPERATOR_CHECKLIST](../00-meta/RECOMMENDATIONS_OPERATOR_CHECKLIST.md) + +**Run all checkable items:** `./scripts/deployment/run-before-deploy-checks.sh` ([§7](#7-run-all-checkable-items-one-script)). + +--- + +## 1. Mandatory fixes and checks (do first) + +These must be satisfied before **any** Chain 138 deployment. Run preflight once; repeat if RPC, env, or nonce change. + +| # | Item | Action / fix | +|---|------|--------------| +| **1.1** | **Run preflight** | From repo root: `./scripts/deployment/preflight-chain138-deploy.sh [--cost]`. Verifies: dotenv exists, required env keys, RPC returns chainId 0x8a (138), deployer nonce (warns if stuck). Use `--cost` for gas/cost estimate. | +| **1.2** | **Core RPC = IP:port, not FQDN** | In `smom-dbis-138/.env` set `RPC_URL_138=http://192.168.11.211:8545` (Core RPC, VMID 2101). Do **not** use `https://rpc-core.d-bis.org` for deployment (DNS/tunnel can fail). See [RPC_ENDPOINTS_MASTER](../04-configuration/RPC_ENDPOINTS_MASTER.md), [TODOS_CONSOLIDATED](../00-meta/TODOS_CONSOLIDATED.md) § 0b. | +| **1.3** | **Deployer gas (Chain 138)** | Ensure deployer has ≥ ~0.006 ETH (recommended 1–2 ETH). Check: `RPC_URL_138=http://192.168.11.211:8545 ./scripts/deployment/check-deployer-balance-chain138-and-funding-plan.sh` or `cd smom-dbis-138 && ./scripts/deployment/check-balances-gas-and-deploy.sh`. | +| **1.4** | **Env from smom-dbis-138/.env only** | All deploy secrets from **`smom-dbis-138/.env`** only. Required: `PRIVATE_KEY`, `RPC_URL_138`. For PMM: `DODO_PMM_INTEGRATION_ADDRESS=0x79cdbaFBaA0FdF9F55D26F360F54cddE5c743F7D`. Optional: `GAS_PRICE_138`, `GAS_PRICE` (default 1 gwei). Verify: `cd smom-dbis-138 && ./scripts/deployment/check-env-required.sh`. | +| **1.5** | **No stuck transactions** | If nonce has pending txs or you see "Replacement transaction underpriced": run `./scripts/clear-all-transaction-pools.sh` then wait **~60s** before deploying. Prefer scripts that check nonce (e.g. `deploy-transaction-mirror-and-pmm-pool-after-txpool-clear.sh`). | +| **1.6** | **RPC 2101 (Core) writable** | If Core was read-only: `./scripts/maintenance/make-rpc-vmids-writable-via-ssh.sh` then `./scripts/maintenance/health-check-rpc-2101.sh`. See [RPC_2101_READONLY_FIX.md](RPC_2101_READONLY_FIX.md). | +| **1.7** | **Test all contracts** | Run **before** any deploy: `./scripts/deployment/test-all-contracts-before-deploy.sh`. Use `--dry-run` to print commands; `--no-match "Fork|Mainnet|Integration|e2e"` for unit-only; `--alltra` to include alltra-lifi-settlement. See [DEPLOYMENT_ORDER_OF_OPERATIONS](DEPLOYMENT_ORDER_OF_OPERATIONS.md) § Phase 0.8. | +| **1.8** | **Gas / cost estimate** | Before deploying: `cd smom-dbis-138 && ./scripts/deployment/calculate-costs-consolidated.sh` (Chain 138 min gas 1 gwei). See [DEPLOYMENT_GAS_COSTS_REALTIME](../11-references/DEPLOYMENT_GAS_COSTS_REALTIME.md). | +| **1.9** | **POOL_MANAGER_ROLE** | Deployer must have `POOL_MANAGER_ROLE` on DODOPMMIntegration for pool creation and DODOPMMProvider registration. | +| **1.10** | **Foundry** | `forge` in PATH; `cd smom-dbis-138 && forge build` succeeds. | + +--- + +## 2. Deployment safety (four rules) + +| Rule | Requirement | +|------|-------------| +| **Correct RPC** | Use **only** `RPC_URL_138` from `smom-dbis-138/.env` for deployments. Must point to **Core RPC** (VMID 2101, `http://192.168.11.211:8545`). Never use Public RPC for deploying. | +| **Correct dotenv** | All deployment secrets from **`smom-dbis-138/.env`** only. Do not source a different .env for deploy. | +| **Gas / cost** | Run gas/cost estimation before deploying (e.g. `calculate-costs-consolidated.sh`). Chain 138 minimum gas 1 gwei. | +| **Do not deploy when stuck** | Clear tx pool, wait ~60s; use scripts that check nonce when available. | + +--- + +## 3. Identified gaps to fix or confirm before deploy + +| Gap | Location / scope | Fix / action | +|-----|------------------|--------------| +| **Wemix (1111) token addresses** | config/token-mapping-multichain.json | Confirm WETH, USDT, USDC on [scan.wemix.com/tokens](https://scan.wemix.com/tokens); update config and WEMIX_TOKEN_VERIFICATION.md if different; run `validate-config-files.sh`. | +| **Canonical addresses** | token-aggregation, .env | Canonical token addresses (e.g. CUSDC_ADDRESS_138, CUSDT_ADDRESS_138) in env or smart-contracts-master.json; token-aggregation uses env override. See [REQUIRED_FIXES_UPDATES_GAPS](../REQUIRED_FIXES_UPDATES_GAPS.md) §3. | +| **AlltraAdapter setBridgeFee** | AlltraAdapter.sol | Fee configurable via `setBridgeFee(uint256)`; operator calls after deploy. Set `ALLTRA_BRIDGE_FEE`, `ALLTRA_ADAPTER_CHAIN138` in .env. | +| **Smart accounts / Paymaster** | DeploySmartAccountsKit | Script reads `ENTRY_POINT`, `SMART_ACCOUNT_FACTORY`, `PAYMASTER` from env. Deploy ERC-4337 contracts separately and set in .env. | +| **Quote service FABRIC_CHAIN_ID** | bridge/quote-service | Uses `FABRIC_CHAIN_ID` from env (default 999). Set when Fabric is live. | +| **CCIPWETH9Bridge** | Env / runbook | Use only canonical bridge (e.g. `0x971c...`); do **not** use deprecated `0x89dd...`. Set `CCIPWETH9_BRIDGE_CHAIN138` in env. See RECOMMENDATIONS_OPERATOR_CHECKLIST R4. | +| **Token mapping** | config/token-mapping.json | Single source of truth for 138↔Mainnet; when adding tokens update token-mapping.json and optionally CHAIN138_TOKEN_ADDRESSES. R24. | + +--- + +## 4. Token deployments remaining (prerequisites for full token/PMM coverage) + +If you plan to deploy **additional** tokens or vaults after core + PMM, ensure prerequisites and order. Full list: [TOKEN_CONTRACT_DEPLOYMENTS_REMAINING](../11-references/TOKEN_CONTRACT_DEPLOYMENTS_REMAINING.md). + +| Category | Prerequisite | Notes | +|----------|-------------|--------| +| **DeployCompliantFiatTokens (cEURC, cEURT, cGBP*, cAUD*, cJPY*, cCHF*, cCADC, cXAU*)** | `CREATE2_FACTORY_ADDRESS` (e.g. from DeployDeterministicCore) | Use Core RPC (IP:port). After deploy: update CHAIN138_TOKEN_ADDRESSES and env. | +| **Optional cCADT** | Add to DeployCompliantFiatTokens.s.sol if needed | Tether-style CAD. | +| **Vault ac* / vdc* / sdc*** | Base tokens deployed (e.g. cUSDC, cUSDT, then extra compliant) | DeployAcVdcSdcVaults; extend for each new base. | +| **cW* on public chains** | Per-chain RPC, bridge, pool-matrix | Design in POOLS_AND_NETWORKS_FULL_DESIGN; pool-matrix in cross-chain-pmm-lps. | +| **ACADT / ALL Mainnet** | Alltra ecosystem | No script in repo; address TBD when Alltra adds CAD token. | + +--- + +## 5. PMM-specific: before adding liquidity and provider + +| # | Item | Action | +|---|------|--------| +| 5.1 | **DODOPMMIntegration** | Already deployed: `0x79cdbaFBaA0FdF9F55D26F360F54cddE5c743F7D`. Ensure `DODO_PMM_INTEGRATION_ADDRESS` set in .env. | +| 5.2 | **PMM pools (all three)** | cUSDT/cUSDC, cUSDT/USDT, cUSDC/USDC must be **created** (CreateCUSDTCUSDCPool, CreateCUSDTUSDTPool, CreateCUSDCUSDCPool). Use Core RPC only. | +| 5.3 | **DODOPMMProvider** | Deploy via DeployDODOPMMProvider.s.sol; set `DODO_PMM_PROVIDER_ADDRESS` in .env. Register each pool: `provider.registerPool(tokenIn, tokenOut, poolAddress)`. | +| 5.4 | **Liquidity (optional)** | Per pool: approve base/quote to DODOPMMIntegration, then `addLiquidity(pool, baseAmount, quoteAmount)`. See [DODO_PMM_INTEGRATION](../../smom-dbis-138/docs/integration/DODO_PMM_INTEGRATION.md). | +| 5.5 | **Token-aggregation** | Set `CHAIN_138_DODO_PMM_INTEGRATION` where token-aggregation runs so API indexes DODO pools. | + +--- + +## 6. Operator recommendations (R1–R24) — before and after deploy + +**Before deploy:** R8 (RPC Core), R9 (gas 1 gwei), R10 (phased core order), R11 (nonce if stuck), R19 (forge test). + +**After deploy:** R1 (verify on Blockscout), R2 (update CONTRACT_ADDRESSES_REFERENCE, ADDRESS_MATRIX_AND_STATUS), R3 (run check-contracts-on-chain-138.sh), R12–R13 (runbooks and per-chain docs). + +**Security:** R4 (canonical CCIPWETH9Bridge only), R5 (never commit .env/keys), R7 (restrict deployer and RPC access). + +**Ongoing:** R17 (monitor bridge/oracle events), R18 (Blockscout and /api up), R24 (token-mapping.json source of truth). + +Full list: [RECOMMENDATIONS_OPERATOR_CHECKLIST](../00-meta/RECOMMENDATIONS_OPERATOR_CHECKLIST.md). + +--- + +## 7. Run all checkable items (one script) + +From repo root, run every check that can be automated (preflight, env, forge build, contract tests, config validation). Optionally include gas estimate, alltra e2e, and on-chain verification. + +```bash +# All checkable items (unit tests only; ~1–2 min) +./scripts/deployment/run-before-deploy-checks.sh + +# With gas/cost estimate +./scripts/deployment/run-before-deploy-checks.sh --cost + +# With alltra-lifi-settlement tests (longer) +./scripts/deployment/run-before-deploy-checks.sh --alltra + +# With on-chain verification (Chain 138) +./scripts/deployment/run-before-deploy-checks.sh --on-chain +``` + +The script reports **PASS** or **FAIL** per step and exits 0 only if all steps pass. Remaining items (deployer gas, POOL_MANAGER_ROLE, RPC writable if needed) require operator/LAN; see §1 and §2. + +--- + +## 8. Quick command reference + +| Action | Command | +|--------|---------| +| Preflight (RPC, env, nonce, optional cost) | `./scripts/deployment/preflight-chain138-deploy.sh [--cost]` | +| Deployer balance / funding plan (Chain 138) | `RPC_URL_138=http://192.168.11.211:8545 ./scripts/deployment/check-deployer-balance-chain138-and-funding-plan.sh` | +| Env check (smom-dbis-138) | `cd smom-dbis-138 && ./scripts/deployment/check-env-required.sh` | +| Test all contracts | `./scripts/deployment/test-all-contracts-before-deploy.sh` (options: `--dry-run`, `--no-match "Fork|Mainnet|Integration|e2e"`, `--alltra`) | +| Gas/cost estimate | `cd smom-dbis-138 && ./scripts/deployment/calculate-costs-consolidated.sh` | +| Clear stuck tx pool | `./scripts/clear-all-transaction-pools.sh` then wait ~60s | +| On-chain verification (Chain 138) | `./scripts/verify/check-contracts-on-chain-138.sh [RPC_URL]` | +| Config validation | `bash scripts/validation/validate-config-files.sh` | + +--- + +## 9. References + +- [DEPLOYMENT_ORDER_OF_OPERATIONS.md](DEPLOYMENT_ORDER_OF_OPERATIONS.md) — Phase 0–6 full order +- [PRE_DEPLOYMENT_CHECKLIST.md](PRE_DEPLOYMENT_CHECKLIST.md) — PMM/pools steps and script reference +- [CONTRACT_DEPLOYMENT_RUNBOOK.md](CONTRACT_DEPLOYMENT_RUNBOOK.md) — Per-script detail and test-before-deploy +- [TODOS_CONSOLIDATED](../00-meta/TODOS_CONSOLIDATED.md) — First (0a–0c), token deployments (T1–T7), high/medium priority +- [REQUIRED_FIXES_UPDATES_GAPS](../REQUIRED_FIXES_UPDATES_GAPS.md) — Build/code placeholders and gaps (all done or documented) +- [TOKEN_CONTRACT_DEPLOYMENTS_REMAINING](../11-references/TOKEN_CONTRACT_DEPLOYMENTS_REMAINING.md) — Remaining token deployments by category +- [OPERATOR_READY_CHECKLIST](../00-meta/OPERATOR_READY_CHECKLIST.md) — Copy-paste commands for operator/LAN tasks diff --git a/docs/03-deployment/REQUIRED_FIXES_AND_DEPLOYMENTS_STATUS.md b/docs/03-deployment/REQUIRED_FIXES_AND_DEPLOYMENTS_STATUS.md new file mode 100644 index 0000000..072a480 --- /dev/null +++ b/docs/03-deployment/REQUIRED_FIXES_AND_DEPLOYMENTS_STATUS.md @@ -0,0 +1,42 @@ +# Required Fixes and Deployments — Status + +**Last Updated:** 2026-02-28 + +## Required fixes + +### 1. RPC 2101 (Core) — read-only filesystem + +- **Status:** Not fixed (host storage I/O errors). +- **Fix before deploying:** Run `./scripts/maintenance/make-rpc-vmids-writable-via-ssh.sh` then `./scripts/maintenance/health-check-rpc-2101.sh`. No Public RPC fallback for contract deployments. +- **Fix:** See [RPC_2101_READONLY_FIX.md](RPC_2101_READONLY_FIX.md). + +### 2. Stuck transactions + +- **Scripts:** `./scripts/clear-all-transaction-pools.sh` (validators + 2101 + 2201); `./scripts/clear-rpc-2201-txpool.sh`. Deploy script sets `NEXT_NONCE` from pending nonce automatically. + +--- + +## On-chain verification (Chain 138) + +**Last run (2026-03-01):** `./scripts/verify/check-contracts-on-chain-138.sh` (use Core RPC URL or run from LAN). +**Result:** **38 present, 0 missing** (38 addresses). TransactionMirror: `0x7131F887DBEEb2e44c1Ed267D2A68b5b83285afc`. DODO cUSDT/cUSDC pool: `0x9fcB06Aa1FD5215DC0E91Fd098aeff4B62fEa5C8` (created). **DeployCompliantFiatTokens** was run 2026-02-27 (10 tokens: cEURC, cEURT, cGBPC, cGBPT, cAUDC, cJPYC, cCHFC, cCADC, cXAUC, cXAUT); see [CHAIN138_TOKEN_ADDRESSES](../11-references/CHAIN138_TOKEN_ADDRESSES.md). + +--- + +## Deployments (Chain 138) + +| Item | Address | Status | +|------|---------|--------| +| TransactionMirror | `0x7131F887DBEEb2e44c1Ed267D2A68b5b83285afc` | Deployed 2026-02-27. Set `TRANSACTION_MIRROR_ADDRESS` in smom-dbis-138/.env. | +| DODO cUSDT/cUSDC pool | 0x9fcB06Aa1FD5215DC0E91Fd098aeff4B62fEa5C8 | Created (all three PMM pools exist). Add liquidity via [ADD_LIQUIDITY_PMM_CHAIN138_RUNBOOK](ADD_LIQUIDITY_PMM_CHAIN138_RUNBOOK.md). | +| Compliant Fiat (10 tokens) | See CHAIN138_TOKEN_ADDRESSES | Deployed via DeployCompliantFiatTokens 2026-02-27. | + +--- + +## Completion (run from LAN) + +0. **If Core RPC was read-only:** `./scripts/maintenance/make-rpc-vmids-writable-via-ssh.sh` then `./scripts/maintenance/health-check-rpc-2101.sh` (must pass). See [RPC_2101_READONLY_FIX.md](RPC_2101_READONLY_FIX.md). +1. Optional: `./scripts/clear-all-transaction-pools.sh` then wait 60s if nonce stuck. +2. `./scripts/deployment/deploy-transaction-mirror-and-pmm-pool-after-txpool-clear.sh` (Core RPC only; checks nonce, RPC, gas; deploys mirror then pool). +3. Set `TRANSACTION_MIRROR_ADDRESS` in `smom-dbis-138/.env` to the logged address. +4. `./scripts/verify/check-contracts-on-chain-138.sh` (pass Core RPC URL or use RPC_URL_138) — target 38 present when both confirmed. diff --git a/docs/03-deployment/RPC_2101_READONLY_FIX.md b/docs/03-deployment/RPC_2101_READONLY_FIX.md new file mode 100644 index 0000000..297bee7 --- /dev/null +++ b/docs/03-deployment/RPC_2101_READONLY_FIX.md @@ -0,0 +1,57 @@ +# RPC 2101 (Core) — Read-only filesystem fix + +**VMID 2101** (192.168.11.211, Chain 138 Core RPC) can fail with Besu in a crash loop and **port 8545 connection refused**. Root cause observed: **Read-only file system** on `/data/besu/database/`. + +## Cause + +- **Kernel I/O errors** on the host (Proxmox 192.168.11.11): `Buffer I/O error on device dm-*`, `EXT4-fs: failed to convert unwritten extents`, `potential data loss`. +- ext4 remounts the filesystem **read-only** to avoid further corruption. Besu then fails with: + `RocksDBException: While appending to file: /data/besu/database/... : Read-only file system`. +- Besu may also crash at startup with **JNA**: `UnsatisfiedLinkError: Failed to create temporary file for ... libjnidispatch.so: Read-only file system` — JNA needs a writable temp dir (e.g. `/tmp` or `java.io.tmpdir`); if the whole root is ro, startup fails before RPC binds. + +## Before deploying contracts + +Contract deployments use **Core RPC only** (no Public fallback). Fix read-only and verify health first: + +1. **Fix read-only:** `./scripts/maintenance/make-rpc-vmids-writable-via-ssh.sh` +2. **Health check:** `./scripts/maintenance/health-check-rpc-2101.sh` (must pass) +3. **Deploy:** `./scripts/deployment/deploy-transaction-mirror-and-pmm-pool-after-txpool-clear.sh` + +If you get **"Known transaction"** (stuck tx at deployer nonce), clear the Core RPC tx pool: `./scripts/clear-all-transaction-pools.sh` then retry deploy. + +## Fixing 2101 (operator) + +1. **SSH to Proxmox host:** `ssh root@192.168.11.11` +2. **Check kernel logs for I/O errors:** + `dmesg | grep -E "Buffer I/O|EXT4-fs|dm-"` + Identify which dm-* (LV) is affected; `ls -la /dev/mapper/pve-vm--2101--disk--0` shows 2101’s device (e.g. dm-45). +3. **Storage health:** Check LVM and disks (e.g. `lvs`, `pvs`, `smartctl` on underlying disks). Replace or repair failing hardware. +4. **Remount read-write (only if storage is known good):** + - Stop the container: `pct stop 2101` + - From the host, the container root is mounted by Proxmox; after fixing storage you may need to run `fsck` on the LV or reboot the host. If the filesystem was remounted ro due to transient error, sometimes a container stop/start helps (host remounts the LV). + - Start the container: `pct start 2101` + - Inside container verify: `pct exec 2101 -- touch /data/besu/database/.write_test && rm /data/besu/database/.write_test` +5. **Restart Besu RPC:** + `pct exec 2101 -- systemctl restart besu-rpc.service` + Then: `./scripts/check-network-rpc-138.sh 192.168.11.211 8545` + +### If still read-only after make-writable + +If `make-rpc-vmids-writable-via-ssh.sh` completes but inside the container **`/tmp`, `/data/besu/database`, or `/data/besu/tmp`** are still read-only (`touch` fails with "Read-only file system"): + +- **e2fsck** may have reported `Error writing file system info: Input/output error` — the **underlying storage** (LV or disk on the host) may be failing. +- **Thin pool 100% full:** CT 2101 (and other RPC nodes) use the LVM thin pool **pve/data**. If the pool is 100% full (`lvs pve/data` shows Data% 100.00), writes can fail and the kernel may remount the filesystem read-only. **Fix:** On the Proxmox host, extend the pool if the VG has free space: `lvextend -L +80G pve/data` (adjust size). Then re-run make-writable and restart the container. Alternatively migrate the CT to another pool (e.g. thin1) or free space by removing/moving other LVs. +- On the Proxmox host: check `dmesg | grep -E 'I/O error|dm-|ext4'`, and run `smartctl` / LVM checks on the storage backing the CT. If the LV or disk has persistent I/O errors, fix or replace storage, then re-run `make-rpc-vmids-writable-via-ssh.sh`, or migrate the CT to healthy storage. + +## TransactionMirror address + +Set `TRANSACTION_MIRROR_ADDRESS` in `smom-dbis-138/.env` from the deploy script output. A previous deploy used **0xE362aa10D3Af1A16880A799b78D18F923403B55a**; use the script output as source of truth. + +## Scripts + +- **Make Core writable (fix read-only):** `./scripts/maintenance/make-rpc-vmids-writable-via-ssh.sh` — run first when 2101 is read-only. +- **Health check:** `./scripts/maintenance/health-check-rpc-2101.sh` — container, service, port, RPC eth_chainId/eth_blockNumber, and database writability. +- **Fix/restart Besu:** `./scripts/maintenance/fix-core-rpc-2101.sh` [--dry-run] [--restart-only]. +- **Check/start RPC service:** `./scripts/check-and-start-rpc-2101.sh` (cannot fix read-only; only restarts the service). +- **Network check:** `./scripts/check-network-rpc-138.sh [HOST] [PORT]` (default 192.168.11.211 8545). +- **Deploy (Core only):** `./scripts/deployment/deploy-transaction-mirror-and-pmm-pool-after-txpool-clear.sh`. No Public fallback; fix Core first. diff --git a/docs/03-deployment/TRANSACTION_MIRROR_CHAIN138_COLLISION_FIX.md b/docs/03-deployment/TRANSACTION_MIRROR_CHAIN138_COLLISION_FIX.md new file mode 100644 index 0000000..7cb4830 --- /dev/null +++ b/docs/03-deployment/TRANSACTION_MIRROR_CHAIN138_COLLISION_FIX.md @@ -0,0 +1,62 @@ +# TransactionMirror Chain 138 — CreateCollision and skip-mirror steps + +**Purpose:** If `deploy-transaction-mirror-and-pmm-pool-after-txpool-clear.sh` fails with **CreateCollision** (contract already at expected address), use this to fix and proceed to pool creation only. + +--- + +## Address from CreateCollision trace + +When the deploy fails, the trace shows the address that already has code: + +| Address | Role | +|---------|------| +| **0xC7f2Cf4845C6db0e1a1e91ED41Bcd0FcC1b0E141** | Expected TransactionMirror address (deployer + nonce 13410). If CreateCollision occurs, a contract is already deployed here. | + +**Lookup on Chain 138:** +`cast code 0xC7f2Cf4845C6db0e1a1e91ED41Bcd0FcC1b0E141 --rpc-url $RPC_URL_138` + +- If code length > 2 (i.e. not `0x`): contract exists; use it as the mirror and skip deploy. +- If code length = 2: no contract at that address on current RPC state; deploy may have failed for another reason, or state differs (e.g. different node). + +--- + +## Exact env + script steps + +### Option A — Use existing mirror and run pool-only + +1. **Set the mirror address in .env** (if the collision address has code on your RPC): + + ```bash + # In smom-dbis-138/.env + TRANSACTION_MIRROR_ADDRESS=0xC7f2Cf4845C6db0e1a1e91ED41Bcd0FcC1b0E141 + ``` + +2. **Run the script with --skip-mirror** (only creates the cUSDT/cUSDC PMM pool): + + ```bash + ./scripts/deployment/deploy-transaction-mirror-and-pmm-pool-after-txpool-clear.sh --skip-mirror + ``` + +3. **Or run without --skip-mirror:** + If `TRANSACTION_MIRROR_ADDRESS` is set and that address has code on chain, the script **skips** the TransactionMirror deploy and proceeds to pool creation. + +### Option B — Deploy a new TransactionMirror (different address) + +If you need a new mirror (e.g. that address is wrong or empty): + +1. Clear any stuck nonce: `./scripts/clear-all-transaction-pools.sh` then wait ~60s. +2. Do **not** set `TRANSACTION_MIRROR_ADDRESS` (or unset it). +3. Run the full script again (no `--skip-mirror`). The next deploy will use the current nonce and a new address. + +--- + +## Script options (reference) + +| Option | Effect | +|--------|--------| +| (none) | Deploy TransactionMirror (if not skipped), then create PMM pool. | +| `--skip-mirror` | Skip mirror deploy; only create PMM pool. Requires `TRANSACTION_MIRROR_ADDRESS` in .env. | +| `--dry-run` | Print commands only; no deploy. | +| `--force` | Skip RPC reachability check. | + +Skip logic (no flag): if `TRANSACTION_MIRROR_ADDRESS` is set in .env and that address has code on Chain 138, the script skips the mirror deploy and continues to pool creation. diff --git a/docs/03-deployment/UNDEPLOYED_CONTRACTS_PRE_DEPLOYMENT_TASKS.md b/docs/03-deployment/UNDEPLOYED_CONTRACTS_PRE_DEPLOYMENT_TASKS.md new file mode 100644 index 0000000..c809a81 --- /dev/null +++ b/docs/03-deployment/UNDEPLOYED_CONTRACTS_PRE_DEPLOYMENT_TASKS.md @@ -0,0 +1,116 @@ +# Undeployed Contracts — Pre-Deployment Tasks + +**Last Updated:** 2026-02-28 +**Execution summary (2026-02-27):** On-chain verification **36/38**. Two missing: TransactionMirror (set `TRANSACTION_MIRROR_ADDRESS` in .env from script output) and DODO cUSDT/cUSDC pool (0x9fcB...). **Deploy uses Core RPC only.** Before deploy: if Core was read-only, run `./scripts/maintenance/make-rpc-vmids-writable-via-ssh.sh` then `./scripts/maintenance/health-check-rpc-2101.sh`. See [REQUIRED_FIXES_AND_DEPLOYMENTS_STATUS.md](REQUIRED_FIXES_AND_DEPLOYMENTS_STATUS.md), [RPC_2101_READONLY_FIX.md](RPC_2101_READONLY_FIX.md). + +**Execution summary (2026-02-26):** **All runnable tasks executed.** Env check, unified deploy dry-run, PMM pool dry-run, on-chain verification (36/36), deploy-optional-future-all --dry-run, fund-ccip-bridges-with-link --dry-run, check-balances-gas-and-deploy.sh, get-multichain-gas-prices.sh all completed. Mainnet dry-run and TransactionMirror simulate started (mainnet compiles CCIP bridges; run to completion when mainnet RPC is responsive). Previous: 1.x wallet/gas, 2.x gas API and estimates, 3.1 unified deploy dry-run (RPC + init fixes in smom-dbis-138), 3.2 DeployDeterministicCore simulated, 3.3 PMM pool script dry-run, 3.4 TransactionMirror, 3.6 optional-future, 3.7 fund-ccip dry-run, 4.6 on-chain verification (36/36). Optional env vars added to `smom-dbis-138/.env` when missing: `DODO_PMM_INTEGRATION_ADDRESS`, `QUOTE_TOKEN_ADDRESS`, `WETH_ADDRESS_138` (public addresses only). PMM and unified deploy dry-runs now work with .env only (no inline env). Remaining: 3.5 mainnet dry-run (run when mainnet RPC is reachable); 4.1–4.5 post-deploy validation when components are deployed. + +**Source:** [AI_AGENTS_57XX_MCP_CONTRACTS_AND_CHAINS.md](../02-architecture/AI_AGENTS_57XX_MCP_CONTRACTS_AND_CHAINS.md), [DEX_AND_CROSS_CHAIN_CONTRACTS_NEEDED.md](../11-references/DEX_AND_CROSS_CHAIN_CONTRACTS_NEEDED.md), [DEPLOYED_CONTRACTS_OVERVIEW](../../smom-dbis-138/docs/deployment/DEPLOYED_CONTRACTS_OVERVIEW.md), [deployment-status.json](../../cross-chain-pmm-lps/config/deployment-status.json) + +This checklist covers: **testing** anything not yet deployed, **checking deployer wallet gas**, **using the gas API to estimate deployment costs**, and **dry-running deployments** before live execution. + +**Optional env vars (add/set when needed):** In `smom-dbis-138/.env`, if missing, add (public addresses only): `DODO_PMM_INTEGRATION_ADDRESS=0x79cdbaFBaA0FdF9F55D26F360F54cddE5c743F7D`, `QUOTE_TOKEN_ADDRESS=0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2`, `WETH_ADDRESS_138=0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2` so PMM pool script and dry-runs work with .env only. Check: `./scripts/deployment/check-env-required.sh`. + +--- + +## 1. Check deployer wallet for gas + +- [x] **1.1** Resolve deployer address from env: + ```bash + cd smom-dbis-138 && cast wallet address $PRIVATE_KEY + ``` +- [x] **1.2** Run balance check (Chain 138 + all networks the script supports): + ```bash + cd smom-dbis-138 + ./scripts/deployment/check-balances-gas-and-deploy.sh + ``` + Uses Infura/gas API where available; reports native token balance and estimated cost for 5M gas per chain. See [FUNDING_AND_DEPLOYMENT_CHECKLIST](FUNDING_AND_DEPLOYMENT_CHECKLIST.md). +- [x] **1.3** Chain 138: ensure deployer has at least ~0.006 ETH (5M gas × 1 gwei + buffer). Recommended 1–2 ETH. If balance is 0, fund from genesis alloc or validator (see FUNDING_AND_DEPLOYMENT_CHECKLIST §2). +- [x] **1.4** Mainnet / L2: ensure deployer has sufficient native token per chain for any planned deployments (see [DEPLOYMENT_GAS_COSTS_REALTIME](../11-references/DEPLOYMENT_GAS_COSTS_REALTIME.md) for recommended balances). + +--- + +## 2. Use gas API to estimate all deployment costs + +- [x] **2.1** Fetch current gas prices (Etherscan for mainnet, defaults/RPC for others): + ```bash + cd smom-dbis-138 + ./scripts/deployment/get-multichain-gas-prices.sh + ``` + Output can be sourced or used to update cost estimates. +- [x] **2.2** (Optional) Update doc with latest estimates: + ```bash + ./scripts/deployment/update-gas-estimates.sh + ``` + Updates [DEPLOYMENT_GAS_COSTS_REALTIME](../11-references/DEPLOYMENT_GAS_COSTS_REALTIME.md) (or script’s target doc). +- [x] **2.3** Estimate gas for **undeployed** items (by chain): TransactionMirror simulated via `forge script` (no broadcast); DeployDeterministicCore reported ~10.67M gas. For pool creation use `cast estimate` on DODOPMMIntegration with `createCUSDTCUSDCPool`/`createPool` args when ready. EnhancedSwapRouter/DODOPMMProvider: run script dry-run when implemented. +- [x] **2.4** Sum estimated cost per chain and confirm deployer balance ≥ sum + buffer (e.g. 20–30%): Confirmed via check-balances-gas-and-deploy.sh; Chain 138 sufficient; mainnet/L2 need funding for full deploy. + +--- + +## 3. Dry-run deployments + +- [x] **3.1** Chain 138 — unified deploy (no broadcast): Run `./scripts/deployment/deploy-contracts-unified.sh --dry-run --rpc-url $RPC_URL_138`. RPC check uses 10s timeout; init.sh LOG_LEVEL fix applied so script runs with .env loaded. + ```bash + cd smom-dbis-138 + ./scripts/deployment/deploy-contracts-unified.sh --dry-run --rpc-url "http://192.168.11.211:8545" + ``` +- [x] **3.2** Chain 138 — phased core (dry-run if script supports): Simulated `forge script script/deploy/DeployDeterministicCore.s.sol --rpc-url $RPC_URL_138` (no `--broadcast`); script ran successfully with gas estimate. + ```bash + forge script script/deploy/DeployDeterministicCore.s.sol --rpc-url $RPC_URL_138 + ``` +- [x] **3.3** Chain 138 — PMM pool creation (dry-run): Set `DODO_PMM_INTEGRATION_ADDRESS` and `QUOTE_TOKEN_ADDRESS` (e.g. WETH `0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2`), then run `DRY_RUN=true CHAIN_ID=138 ./scripts/create-all-dodo-pools-from-token-api.sh`. Script accepts `DODO_PMM_INTEGRATION` or `DODO_PMM_INTEGRATION_ADDRESS`. With Token API unavailable it reports "Pools created: 0"; with API running it would list tokens and log `[DRY RUN] Would createPool ...`. Document: [DODO_PMM_INTEGRATION](../../smom-dbis-138/docs/integration/DODO_PMM_INTEGRATION.md), [DODO_PMM_NEXT_STEPS](../../smom-dbis-138/docs/bridge/DODO_PMM_NEXT_STEPS.md). +- [x] **3.4** Chain 138 — TransactionMirror (optional): Run without `--broadcast` to simulate: `forge script script/DeployTransactionMirror.s.sol:DeployTransactionMirror --rpc-url $RPC_URL_138`. See [CONTRACT_DEPLOYMENT_RUNBOOK](CONTRACT_DEPLOYMENT_RUNBOOK.md) § TransactionMirror. +- [ ] **3.5** Mainnet — dry-run (if deploying anything new): Requires `PRIVATE_KEY`, `ETHEREUM_MAINNET_RPC` in .env. Run from environment with mainnet RPC access. Script validates tools, env, addresses, and compiles CCIP bridges. + ```bash + ./scripts/deployment/dry-run-mainnet-deployment.sh + ``` + Or per-script: `forge script script/... --rpc-url $MAINNET_RPC --dry-run`. +- [x] **3.6** Optional/future deployments (dry-run only): + ```bash + cd smom-dbis-138 + ./scripts/deployment/deploy-optional-future-all.sh --dry-run + ``` +- [x] **3.7** Bridge/LINK funding (dry-run): + ```bash + ./scripts/deployment/fund-ccip-bridges-with-link.sh --link 10 --dry-run + ``` + +--- + +## 4. Test anything not deployed (validation / unit / script) + +- [ ] **4.1** **PMM pools (Chain 138):** Create cUSDT/cUSDC pool with `forge script script/dex/CreateCUSDTCUSDCPool.s.sol:CreateCUSDTCUSDCPool --rpc-url $RPC_URL_138 --broadcast --private-key $PRIVATE_KEY --with-gas-price 1000000000` (script: `smom-dbis-138/script/dex/CreateCUSDTCUSDCPool.s.sol`). Requires POOL_MANAGER_ROLE on DODOPMMIntegration. If you see "Replacement transaction underpriced", a tx is pending at that nonce; wait for it to be mined or clear mempool, then retry with same or higher gas. After creation, test: `getMidPrice`, `getOraclePrice`, `getBaseReserve`, `getQuoteReserve` on pool address; confirm MCP `dodo.get_pool_state` and `dodo.identify_pool_interface` work with that address in allowlist. +- [ ] **4.2** **DODOPMMProvider:** Not deployed; implementation placeholder. When implemented, add unit tests and a script dry-run for deployment. +- [ ] **4.3** **TransactionMirror (Chain 138):** Deploy with `forge script script/DeployTransactionMirror.s.sol:DeployTransactionMirror --rpc-url $RPC_URL_138 --broadcast --private-key $PRIVATE_KEY --with-gas-price 1000000000`. If you see "Known transaction", the tx may be pending or already mined; check code at the logged address. Then test mirror receive path. +- [ ] **4.4** **EnhancedSwapRouter:** Not deployed. When Uniswap/Balancer pools exist on 138, run deploy script with `--dry-run` and test quote path. +- [ ] **4.5** **cW* tokens and PMM pools on public chains (1, 56, 137, etc.):** No addresses in deployment-status. No deployment from this repo yet. When you have a deployment path (bridge + factory or DODO), run gas estimate and dry-run per chain. +- [x] **4.6** **On-chain verification (38 addresses):** After any new deployment, run: + ```bash + ./scripts/verify/check-contracts-on-chain-138.sh [RPC_URL] + ``` + Includes TransactionMirror and DODO cUSDT/cUSDC pool in the list. Last run: 36 present, 2 missing; see [REQUIRED_FIXES_AND_DEPLOYMENTS_STATUS](REQUIRED_FIXES_AND_DEPLOYMENTS_STATUS.md). + +--- + +## 5. Summary — undeployed items (for cost and dry-run scope) + +| Chain | Item | Action for estimate / dry-run | +|-------|------|-------------------------------| +| **138** | PMM pools (cUSDT/cUSDC, cUSDT/USDT, cUSDC/USDC) | Estimate: `createPool` / `createCUSDTCUSDCPool` gas. Dry-run: pool-creation script or `cast send --dry-run`. | +| **138** | TransactionMirror | `forge script` or `forge create` with `--dry-run` / `cast estimate`. | +| **138** | DODOPMMProvider | When implemented: script dry-run + unit tests. | +| **138** | EnhancedSwapRouter | When pools exist: script dry-run. | +| **1** | (Trustless stack deployed; no new DODO from repo) | Gas estimate only if adding contracts. | +| **56, 137, 10, 100, 25, 42161, 8453, 42220, 1111, 43114** | cW* tokens, PMM pools | When deployment path exists: per-chain gas estimate + deploy script dry-run. | + +--- + +## 6. References + +- [CONTRACT_DEPLOYMENT_RUNBOOK](CONTRACT_DEPLOYMENT_RUNBOOK.md) — Chain 138 gas price, RPC, TransactionMirror. +- [FUNDING_AND_DEPLOYMENT_CHECKLIST](FUNDING_AND_DEPLOYMENT_CHECKLIST.md) — Balance check, funding sources. +- [DEPLOYMENT_GAS_COSTS_REALTIME](../11-references/DEPLOYMENT_GAS_COSTS_REALTIME.md) — Gas API, cost table. +- [check-balances-gas-and-deploy.sh](../../smom-dbis-138/scripts/deployment/check-balances-gas-and-deploy.sh) — Balance + gas report. +- [get-multichain-gas-prices.sh](../../smom-dbis-138/scripts/deployment/get-multichain-gas-prices.sh) — Gas prices for cost estimates. +- [TODO_TASK_LIST_MASTER](../00-meta/TODO_TASK_LIST_MASTER.md) § Undeployed contracts pre-deployment — Master checklist link. diff --git a/docs/03-deployment/sankofa-studio.env.example b/docs/03-deployment/sankofa-studio.env.example new file mode 100644 index 0000000..c7b72ec --- /dev/null +++ b/docs/03-deployment/sankofa-studio.env.example @@ -0,0 +1,44 @@ +# Sankofa Studio (FusionAI Creator) — production .env for VMID 7805 +# Copy to fusionai-production.env and set values. Use with deploy-sankofa-studio-lxc.sh: +# ENV_FILE=/path/to/fusionai-production.env ./scripts/deployment/deploy-sankofa-studio-lxc.sh +# See: docs/03-deployment/SANKOFA_STUDIO_DEPLOYMENT.md + +# Artifact storage (persistent path inside container; ensure volume in compose or host path) +FUSIONAI_ARTIFACT_ROOT=/data/artifacts + +# Redis (docker-compose service name) +FUSIONAI_REDIS_URL=redis://redis:6379/0 + +# API URL (for worker and webhooks; use internal or public) +FUSIONAI_API_URL=http://api:8000 + +# Service URLs (internal; docker-compose service names) +FUSIONAI_AUDIO_SERVICE_URL=http://audio:8001 +FUSIONAI_IMAGE_SERVICE_URL=http://image:8002 +FUSIONAI_VIDEO_ASSEMBLY_SERVICE_URL=http://video:8003 +FUSIONAI_UE5_EXPORT_SERVICE_URL=http://ue5_export:8004 + +# Optional: require API key for POST /jobs, run, approve, cancel +# FUSIONAI_API_KEY=your-secret-key + +# Optional: TTS backend (stub | piper | elevenlabs) +# FUSIONAI_TTS_BACKEND=stub +# FUSIONAI_ELEVENLABS_API_KEY=... +# FUSIONAI_ELEVENLABS_VOICE_ID=... + +# Optional: Image backend (stub | openai | replicate) +# FUSIONAI_IMAGE_BACKEND=stub +# OPENAI_API_KEY=... +# REPLICATE_API_TOKEN=... + +# Optional: completion webhook +# FUSIONAI_COMPLETION_WEBHOOK_URL=https://... +# FUSIONAI_WEBHOOK_RETRIES=2 + +# Optional: rate limit (0 = no limit) +# FUSIONAI_RATE_LIMIT_PER_MINUTE=0 + +# Runner timeouts (seconds) +# FUSIONAI_STAGE_TIMEOUT_SECONDS=300 +# FUSIONAI_JOB_TIMEOUT_SECONDS=3600 +# FUSIONAI_SERVICE_RETRIES=3 diff --git a/docs/04-configuration/22_TOKENS_13_CHAINS_DEPLOYMENT_RUNBOOK.md b/docs/04-configuration/22_TOKENS_13_CHAINS_DEPLOYMENT_RUNBOOK.md new file mode 100644 index 0000000..d986ba5 --- /dev/null +++ b/docs/04-configuration/22_TOKENS_13_CHAINS_DEPLOYMENT_RUNBOOK.md @@ -0,0 +1,131 @@ +# 22 Tokens on All 13 Chains — Deployment Runbook + +**Purpose:** Ensure all 22 token types are represented across all 13 chains in DUAL_CHAIN_TOKEN_LIST and DUAL_CHAIN_NETWORKS. + +**Status:** Token list expanded; on-chain deployment documented +**Last updated:** 2026-02-28 + +--- + +## Overview + +| Item | Count | +|------|-------| +| Chains | 13 (138, 1, 651940, 25, 56, 100, 137, 10, 42161, 8453, 43114, 42220, 1111) | +| Token list entries | 52+ (USDC, USDT, WETH on all; custom tokens on 138, 1, 25, 651940) | +| Unique token symbols | 17 (ETH-USD, WETH, WETH10, LINK, cUSDT, cUSDC, USDT, USDC, DAI, WETH9, USDW, EURW, GBPW, AUDW, JPYW, CHFW, CADW) | + +--- + +## Token List Coverage (DUAL_CHAIN_TOKEN_LIST) + +### Per-chain coverage + +| Chain | Name | USDC | USDT | WETH | Custom (cUSDT, cUSDC, WETH10, ISO-4217 W) | +|-------|------|------|------|------|------------------------------------------| +| 138 | DeFi Oracle Meta | ✓ | ✓ | ✓ | ✓ (cUSDT, cUSDC, WETH10, LINK, ETH-USD) | +| 1 | Ethereum | ✓ | ✓ | ✓ | ✓ (DAI, ETH-USD) | +| 651940 | ALL Mainnet | ✓ | ✓ | — | — | +| 25 | Cronos | ✓ | ✓ | ✓ (WETH9) | ✓ (WETH10, LINK, USDW, EURW, GBPW, AUDW, JPYW, CHFW, CADW) | +| 56 | BSC | ✓ | ✓ | ✓ | — | +| 100 | Gnosis | ✓ | ✓ | ✓ | — | +| 137 | Polygon | ✓ | ✓ | ✓ | — | +| 10 | Optimism | ✓ | ✓ | ✓ | — | +| 42161 | Arbitrum | ✓ | ✓ | ✓ | — | +| 8453 | Base | ✓ | ✓ | ✓ | — | +| 43114 | Avalanche | ✓ | ✓ | ✓ | — | +| 42220 | Celo | ✓ | ✓ | ✓ | — | +| 1111 | Wemix | ✓ | ✓ | — | — | + +**Note:** Wemix uses WEMIX as native; no standard WETH. USDC/USDT use canonical addresses from `canonical-tokens.ts`. + +--- + +## Canonical Addresses (token-aggregation) + +`smom-dbis-138/services/token-aggregation/src/config/canonical-tokens.ts` defines FALLBACK_ADDRESSES for cUSDC and cUSDT on all 13 chains: + +- **Chain 138 / 651940:** Custom cUSDT/cUSDC +- **L2s (1, 56, 100, 137, 10, 42161, 8453, 43114, 25, 42220, 1111):** Native USDC/USDT addresses (no custom deployment required for token list) + +--- + +## On-Chain Deployment (Custom Tokens) + +### When to deploy + +- **cUSDT / cUSDC:** Deploy only if you need *compliant* versions on L2s (e.g. for PMM, CCIP, or regulatory use). Otherwise, use native USDC/USDT. +- **WETH10:** Only on Chain 138 and Cronos (25). +- **ISO-4217 W (USDW, EURW, GBPW, etc.):** Only on Cronos (25) today; expand to other chains if required. + +### Deploy cUSDT/cUSDC to all 13 chains + +1. **Prerequisites** + - `.env` in `smom-dbis-138/` with `PRIVATE_KEY` and per-chain RPC: + - `ETHEREUM_MAINNET_RPC`, `BSC_RPC_URL`, `POLYGON_MAINNET_RPC`, `BASE_MAINNET_RPC`, `OPTIMISM_MAINNET_RPC`, `ARBITRUM_MAINNET_RPC`, `AVALANCHE_RPC_URL`, `CRONOS_RPC_URL`, `GNOSIS_MAINNET_RPC`, `CELO_MAINNET_RPC`, `WEMIX_MAINNET_RPC` + - Deployer funded with native gas on each chain (ETH, BNB, MATIC, CRO, xDAI, AVAX, CELO, WEMIX, etc.) + +2. **Run deploy script** + ```bash + cd smom-dbis-138 + ./scripts/deployment/deploy-cusdt-cusdc-all-chains.sh + ``` + +3. **Record addresses** + - Add `CUSDT_ADDRESS_` and `CUSDC_ADDRESS_` to `.env` for each chain. + - Update `canonical-tokens.ts` FALLBACK_ADDRESSES if you want to override native USDC/USDT with compliant versions. + +4. **Filter by chain (optional)** + ```bash + DEPLOY_CUSDT_CUSDC_FILTER="POLYGON BASE" ./scripts/deployment/deploy-cusdt-cusdc-all-chains.sh + ``` + +5. **Dry run** + ```bash + DEPLOY_CUSDT_CUSDC_DRY_RUN=1 ./scripts/deployment/deploy-cusdt-cusdc-all-chains.sh + ``` + +--- + +## Sync and Deploy Token List + +After updating `DUAL_CHAIN_TOKEN_LIST.tokenlist.json`: + +```bash +# 1. Sync configs to all locations +bash scripts/sync-dual-chain-configs.sh + +# 2. Deploy to VMID 5000 (Proxmox) +# From repo root — via Proxmox host (pct): +PROXMOX_HOST=192.168.11.12 # or PROXMOX_HOST_R630_02 +scp explorer-monorepo/backend/api/rest/config/metamask/DUAL_CHAIN_TOKEN_LIST.tokenlist.json \ + explorer-monorepo/backend/api/rest/config/metamask/DUAL_CHAIN_NETWORKS.json \ + root@${PROXMOX_HOST}:/tmp/ +ssh root@${PROXMOX_HOST} " + pct exec 5000 -- mkdir -p /var/www/html/config + pct push 5000 /tmp/DUAL_CHAIN_TOKEN_LIST.tokenlist.json /var/www/html/config/DUAL_CHAIN_TOKEN_LIST.tokenlist.json + pct push 5000 /tmp/DUAL_CHAIN_NETWORKS.json /var/www/html/config/DUAL_CHAIN_NETWORKS.json +" + +# Or use the deploy script (when on Proxmox host with pct): +# ./explorer-monorepo/scripts/deploy-explorer-config-to-vmid5000.sh +``` + +--- + +## Verification + +| Check | Command / location | +|-------|--------------------| +| Token list JSON | `python3 -c "import json; json.load(open('explorer-monorepo/backend/api/rest/config/metamask/DUAL_CHAIN_TOKEN_LIST.tokenlist.json'))"` | +| Config validation | `./scripts/validation/validate-config-files.sh` | +| Token on chain | `cast call

"totalSupply()(uint256)" --rpc-url $RPC_URL` | +| Explorer config | `GET https:///api/config/DUAL_CHAIN_TOKEN_LIST.tokenlist.json` | + +--- + +## Related Docs + +- [CUSDT_CUSDC_MULTICHAIN_LIQUIDITY_RUNBOOK.md](../../smom-dbis-138/docs/deployment/CUSDT_CUSDC_MULTICHAIN_LIQUIDITY_RUNBOOK.md) — PMM, Uniswap, Balancer, Curve +- [canonical-tokens.ts](../../smom-dbis-138/services/token-aggregation/src/config/canonical-tokens.ts) — Address mapping +- [DEPLOYED_COINS_TOKENS_AND_NETWORKS.md](DEPLOYED_COINS_TOKENS_AND_NETWORKS.md) — Reference addresses diff --git a/docs/04-configuration/ALL_VMIDS_ENDPOINTS.md b/docs/04-configuration/ALL_VMIDS_ENDPOINTS.md index a5860f9..a9e77b6 100644 --- a/docs/04-configuration/ALL_VMIDS_ENDPOINTS.md +++ b/docs/04-configuration/ALL_VMIDS_ENDPOINTS.md @@ -240,6 +240,8 @@ The following VMIDs have been permanently removed: | 7801 | 192.168.11.51 | sankofa-portal-1 | ✅ Running | Web: 3000 | Sankofa Portal (Company Website) | | 7802 | 192.168.11.52 | sankofa-keycloak-1 | ✅ Running | Keycloak: 8080, Admin: /admin | Identity and Access Management | | 7803 | 192.168.11.53 | sankofa-postgres-1 | ✅ Running | PostgreSQL: 5432 | Database Service | +| 7804 | 192.168.11.54 | (Gov Portals dev) | ✅ Running | Web: 80 | Gov Portals — DBIS, ICCC, OMNL, XOM (*.xom-dev.phoenix.sankofa.nexus) | +| 7805 | 192.168.11.72 | sankofa-studio | — | API: 8000 | Sankofa Studio (FusionAI Creator) — studio.sankofa.nexus (IP .72; .55 = VMID 10230 order-vault) | **Public Domains** (NPMplus routing): - `sankofa.nexus` → Routes to `http://192.168.11.51:3000` (Sankofa Portal/VMID 7801) ✅ @@ -247,6 +249,7 @@ The following VMIDs have been permanently removed: - `phoenix.sankofa.nexus` → Routes to `http://192.168.11.50:4000` (Phoenix API/VMID 7800) ✅ - `www.phoenix.sankofa.nexus` → Routes to `http://192.168.11.50:4000` (Phoenix API/VMID 7800) ✅ - `the-order.sankofa.nexus` → ⚠️ **TBD** (not yet configured) +- `studio.sankofa.nexus` → Routes to `http://192.168.11.72:8000` (Sankofa Studio / VMID 7805) **Service Details:** - **Host:** r630-01 (192.168.11.11) @@ -375,6 +378,8 @@ Direct to RPC Nodes: - VMID 7802 (sankofa-keycloak-1): 192.168.11.52 ✅ **UNIQUE** - VMID 10232 (CT10232): Reassigned to 192.168.11.56 ✅ +4. **192.168.11.55**: ✅ **IN USE** — VMID 10230 (order-vault) only. Sankofa Studio (VMID 7805) uses **192.168.11.72** to avoid conflict. + **Resolution:** All IP conflicts resolved using `scripts/resolve-ip-conflicts.sh` **Verification:** ✅ All IPs verified unique, all services operational @@ -477,6 +482,7 @@ This section lists all endpoints that should be configured in NPMplus, extracted | `phoenix.sankofa.nexus` | `192.168.11.50` | `http` | `4000` | ❌ No | Phoenix API - Cloud Platform Portal (VMID 7800) ✅ **Deployed** | | `www.phoenix.sankofa.nexus` | `192.168.11.50` | `http` | `4000` | ❌ No | Phoenix API (VMID 7800) ✅ **Deployed** | | `the-order.sankofa.nexus` | ⚠️ **TBD** | `http` | `TBD` | ❌ No | The Order Portal - ⚠️ **Not yet configured** | +| `studio.sankofa.nexus` | `192.168.11.72` | `http` | `8000` | ❌ No | Sankofa Studio (FusionAI Creator) — VMID 7805 | ### Path-Based Routing Notes @@ -504,6 +510,7 @@ Some domains use path-based routing in NPM configs: | `sankofa.nexus`, `www.sankofa.nexus` | 7801, 192.168.11.51:3000 | 192.168.11.140 (Blockscout) | | `phoenix.sankofa.nexus`, `www.phoenix.sankofa.nexus` | 7800, 192.168.11.50:4000 | 192.168.11.140 (Blockscout) | | `the-order.sankofa.nexus` | TBD (when The Order portal is deployed) | 192.168.11.140 (Blockscout) | +| `studio.sankofa.nexus` | 7805, 192.168.11.72:8000 | — | If NPMplus proxy hosts for sankofa.nexus or phoenix.sankofa.nexus currently point to 192.168.11.140, update them to the correct IP:port above. See [RPC_ENDPOINTS_MASTER.md](RPC_ENDPOINTS_MASTER.md) and table "Sankofa Phoenix Services" in this document. diff --git a/docs/04-configuration/CHAIN138_X402_TOKEN_SUPPORT.md b/docs/04-configuration/CHAIN138_X402_TOKEN_SUPPORT.md new file mode 100644 index 0000000..f0ff1e1 --- /dev/null +++ b/docs/04-configuration/CHAIN138_X402_TOKEN_SUPPORT.md @@ -0,0 +1,44 @@ +# Chain 138 Token Support for x402 Payments + +**Purpose:** Record which Chain 138 tokens support ERC-2612 (permit) or ERC-3009, and thus can be used with thirdweb x402 payments. + +**References:** [thirdweb x402](https://portal.thirdweb.com/x402), [CHAIN138_TOKEN_ADDRESSES.md](../11-references/CHAIN138_TOKEN_ADDRESSES.md), plan: x402 and Permit Support for Chain 138. + +--- + +## On-chain check results + +Run the verification script (from repo root, with Chain 138 RPC reachable): + +```bash +./scripts/verify/check-chain138-token-permit-support.sh [RPC_URL] +# Optional: --dry-run to print RPC and token addresses only +``` + +**Last run:** Script confirms the following for deployed contracts on Chain 138. + +| Token | Address | ERC-2612 (permit) | ERC-3009 (transferWithAuthorization) | x402-compatible | +|-------|---------|-------------------|--------------------------------------|-----------------| +| cUSDT | `0x93E66202A11B1772E55407B32B44e5Cd8eda7f22` | Not supported | Not supported | No | +| cUSDC | `0xf22258f57794CC8E06237084b353Ab30fFfa640b` | Not supported | Not supported | No | + +WETH and WETH10 on Chain 138 (see [CHAIN138_TOKEN_ADDRESSES.md](../11-references/CHAIN138_TOKEN_ADDRESSES.md)) are standard approve/transferFrom implementations and do not expose permit or ERC-3009 in the repo; they are not x402-compatible in their current form. + +--- + +## Implications + +- **thirdweb x402** requires the payment token to support either **ERC-2612 permit** or **ERC-3009** (e.g. sign + `transferWithAuthorization` / `receiveWithAuthorization`). See [Chain and token support](https://portal.thirdweb.com/x402#chain-and-token-support). +- **Current state:** No deployed Chain 138 token in the canonical list (cUSDT, cUSDC, WETH, WETH10, LINK) is x402-compatible until one of them implements permit or ERC-3009. +- **Options:** + 1. **Use another chain for x402 testing:** e.g. Arbitrum Sepolia with USDC (default in thirdweb x402). The x402 API sketch can be built and tested there, then switched to Chain 138 once a token supports permit. + 2. **Add ERC-2612 to compliant tokens:** Implement and deploy new CompliantUSDT/CompliantUSDC contracts that extend OpenZeppelin `ERC20Permit` (see plan: Part 1.2 Option B). This implies new contract addresses and updates to [CHAIN138_TOKEN_ADDRESSES.md](../11-references/CHAIN138_TOKEN_ADDRESSES.md) and env/config. + +--- + +## When a Chain 138 token gains permit + +After a token on Chain 138 supports ERC-2612 or ERC-3009: + +1. Re-run `./scripts/verify/check-chain138-token-permit-support.sh` and update this doc. +2. In the x402 API, use `network: chain138` (custom chain definition) and set `price` to the token object, e.g. `price: { amount: "", asset: { address: "", decimals: 6 } }` for cUSDC/cUSDT. diff --git a/docs/04-configuration/C_TO_CW_MAPPER_MAPPING.md b/docs/04-configuration/C_TO_CW_MAPPER_MAPPING.md new file mode 100644 index 0000000..5b55494 --- /dev/null +++ b/docs/04-configuration/C_TO_CW_MAPPER_MAPPING.md @@ -0,0 +1,51 @@ +# c* → cW* Mapper Mapping (Multi-Chain) + +**Purpose:** Define the mapping of compliant tokens (c*) on Chain 138 to their wrapped representations (cW*) on other chains for bridge/mapper tooling. + +## Source of truth + +- **Config:** [`config/token-mapping-multichain.json`](../../config/token-mapping-multichain.json) + - **`cToCwSymbolMapping`** — Symbol correspondence: each c* symbol maps to its cW* symbol (e.g. `cUSDT` → `cWUSDT`). + - **Per-pair tokens** — For each `fromChainId: 138` → `toChainId: ` pair, tokens with key `Compliant_*_cW` define: **addressFrom** = c* contract on 138, **addressTo** = cW* contract on the destination chain (or `0x0` placeholder until deployed). + +## Symbol mapping (c* → cW*) + +| c* (Chain 138) | cW* (other chains) | +|----------------|--------------------| +| cUSDT | cWUSDT | +| cUSDC | cWUSDC | +| cEURC | cWEURC | +| cEURT | cWEURT | +| cGBPC | cWGBPC | +| cGBPT | cWGBPT | +| cAUDC | cWAUDC | +| cJPYC | cWJPYC | +| cCHFC | cWCHFC | +| cCADC | cWCADC | +| cXAUC | cWXAUC | +| cXAUT | cWXAUT | + +## Per-chain address mapping + +For each destination chain, the mapper (or bridge config) should resolve: + +- **Compliant_USDT_cW**: Chain 138 cUSDT address → cWUSDT address on destination +- **Compliant_USDC_cW**: Chain 138 cUSDC address → cWUSDC address on destination +- **Compliant_EURC_cW**: Chain 138 cEURC address → cWEURC address on destination + +(Additional c* → cW* pairs can be added to `token-mapping-multichain.json` when those c* and cW* are deployed.) + +In `token-mapping-multichain.json`, entries with key suffix `_cW` use `addressTo: "0x0000000000000000000000000000000000000000"` as a placeholder until the cW* contract is deployed on that chain. **Operators:** after deploying cW* (e.g. via `DeployCWTokens.s.sol` or equivalent), update the corresponding `addressTo` in the JSON (or in env-driven config that overrides it). The **receiver/bridge on the destination chain must support minting cW*** (e.g. dedicated cW* receiver such as TwoWayTokenBridgeL2, or an extended bridge that calls `cW*.mint(recipient, amount)` in `ccipReceive`); see [CW_BRIDGE_APPROACH.md](../07-ccip/CW_BRIDGE_APPROACH.md) and [CW_BRIDGE_TASK_LIST.md](../00-meta/CW_BRIDGE_TASK_LIST.md). + +## Consumer behavior + +- **Mapper / bridge:** When resolving "cUSDT on 138 → token on chain 56", use: + - **Native representation:** key `Compliant_USDT` → `addressTo` = that chain’s native USDT (e.g. BSC USDT). + - **Wrapped representation:** key `Compliant_USDT_cW` → `addressTo` = that chain’s cWUSDT. If `addressTo` is zero, treat as "cW* not deployed" and optionally fall back to native or reject. + +- **Loading:** [`config/token-mapping-loader.cjs`](../../config/token-mapping-loader.cjs) builds `addressMapFromTo` / `addressMapToFrom` from `tokens`. Keys `*_cW` are first-class; filter by key suffix or use `cToCwSymbolMapping` for symbol-level logic. + +## Related + +- [EXPLORER_TOKENS_GRU_POLICY.md](EXPLORER_TOKENS_GRU_POLICY.md) — All c* on explorer must be GRU-registered. +- [TOKENS_DEPLOYER_DEPLOYED_ON_OTHER_CHAINS.md](../11-references/TOKENS_DEPLOYER_DEPLOYED_ON_OTHER_CHAINS.md) — Deploying cW* via `DeployCWTokens.s.sol` and `--deploy-cw`. diff --git a/docs/04-configuration/DETAILED_GAPS_AND_ISSUES_LIST.md b/docs/04-configuration/DETAILED_GAPS_AND_ISSUES_LIST.md new file mode 100644 index 0000000..f91705e --- /dev/null +++ b/docs/04-configuration/DETAILED_GAPS_AND_ISSUES_LIST.md @@ -0,0 +1,173 @@ +# Detailed Gaps and Issues List + +**Date:** 2026-03-02 +**Purpose:** Consolidated list of items requiring fixes, deployment, or operator action. + +--- + +## 1. Explorer API (VMID 5000) — ✅ FIXED (2026-02-28) + +| Issue | Status | Fix | +|-------|--------|-----| +| `/api/config/token-list` returns Blockscout error (400) | ✅ Fixed | Nginx patched; config files deployed | +| `/api/config/networks` returns Blockscout error | ✅ Fixed | + +**Applied:** `scripts/patch-nginx-explorer-config.sh` added locations to HTTP and HTTPS blocks. Config deployed via `pct push`. + +**Original cause:** `location = /api/config/token-list` and `location = /api/config/networks` in `fix-nginx-conflicts-vmid5000.sh` are not in the live nginx config. Requests fall through to `location /api/` and get proxied to Blockscout. + +**Steps:** + +1. SSH to Proxmox host or enter VMID 5000. +2. Run inside VMID 5000: + ```bash + # From repo root, copy script into container and run: + pct exec 5000 -- bash -c "cd /tmp && [your-fix-nginx-script-content]" + # Or: scp fix-nginx-conflicts-vmid5000.sh root@:/tmp/ && ssh root@ bash /tmp/fix-nginx-conflicts-vmid5000.sh + ``` +3. Deploy config files: + ```bash + # From repo root (with pct or SSH): + ./explorer-monorepo/scripts/deploy-explorer-config-to-vmid5000.sh + # Or EXEC_MODE=ssh: EXEC_MODE=ssh EXPLORER_IP=192.168.11.140 ./explorer-monorepo/scripts/deploy-explorer-config-to-vmid5000.sh + ``` +4. Verify: + ```bash + curl -s https://explorer.d-bis.org/api/config/token-list | jq '.tokens | length' # → 22 + curl -s https://explorer.d-bis.org/api/config/networks | jq '.chains | length' # → 4 + ``` + +--- + +## 2. Token-Aggregation Service — ✅ FIXED (2026-02-28) + +| Issue | Status | Fix | +|-------|--------|-----| +| `/health` returns `{"status":"unhealthy","error":"database \"token_aggregation\" does not exist"}` | ✅ Fixed | DB created; migrations run; service restarted | + +**Applied:** Created `token_aggregation` DB; ran migrations; restarted service. Health now returns `"status":"healthy"`. + +**Original cause:** The deployed token-aggregation service (port 3001) uses `DATABASE_URL` pointing to a database named `token_aggregation`, but that database does not exist or migrations were not run. + +**Steps:** + +1. On VMID 5000 (or wherever PostgreSQL runs): + ```bash + # Create database if using separate DB: + createdb -U postgres token_aggregation + # Or ensure DATABASE_URL uses explorer_db (migrations create tables there) + ``` +2. Run migrations: + ```bash + cd smom-dbis-138/services/token-aggregation + DATABASE_URL=postgresql://user:pass@host:5432/token_aggregation bash scripts/run-migrations.sh + # Or with explorer_db: DATABASE_URL=postgresql://user:pass@host:5432/explorer_db + ``` +3. Restart token-aggregation: + ```bash + systemctl restart token-aggregation + ``` +4. Verify: + ```bash + curl -s http://192.168.11.140:3001/health | jq . + # Should return "status":"healthy" + ``` + +**Reference:** `docs/04-configuration/TOKEN_AGGREGATION_REPORT_API_RUNBOOK.md`, `smom-dbis-138/services/token-aggregation/scripts/run-migrations.sh` + +--- + +## 3. Nginx Proxy Order — Token-Aggregation vs Blockscout + +| Issue | Status | Fix | +|-------|--------|-----| +| `/api/v1/` may proxy to Blockscout instead of token-aggregation | ✅ Addressed | `fix-nginx-conflicts-vmid5000.sh` defines `location /api/v1/` **before** `location /api/` (lines 132–142 before 159). When applying config on VMID 5000, use this script to preserve order. | + +**Reference:** `explorer-monorepo/scripts/fix-nginx-conflicts-vmid5000.sh` — correct order is in repo; operator should use this script when (re)applying nginx config. + +--- + +## 4. Explorer Homepage / Wallet Page Tests — Intermittent + +| Issue | Status | Fix | +|-------|--------|-----| +| `verify-all-systems.sh` "Explorer homepage" or "Wallet page" may fail | ✅ Improved | Timeout for Explorer homepage and Wallet page increased from 15s to 25s in `scripts/verify-all-systems.sh` to reduce failures on slow networks. | + +**Note:** Homepage uses `SolaceScanScout|Blockscout|blockscout|`, `tokenOut=
`, `amountIn=`. + +**Response:** `{ amountOut, poolAddress?, dexType?, error? }` — constant-product style from the first/best indexed pool for that pair. Use for “swap cUSDT → cUSDC” or “cUSDT → WETH” (if a pool exists and is indexed). + +**Limitation:** Single-hop only. There is no N-hop path (e.g. cUSDT → WETH → cUSDC) in this API; routing is one direct pool per pair. + +### 3.2 Token and pool discovery + +| Endpoint | Purpose | +|----------|---------| +| **GET /api/v1/tokens?chainId=138** | List tokens; optional `includeDodoPool`, market data | +| **GET /api/v1/tokens/:address?chainId=138** | Token detail, market data, pools, DODO pool flag | +| **GET /api/v1/tokens/:address/pools?chainId=138** | All pools containing this token | +| **GET /api/v1/report/token-list?chainId=138** | Uniswap-style token list (for MetaMask / dApp) | + +Use these to resolve symbol→address, get logos, and see which pools exist for cUSDT, cUSDC, WETH on Chain 138. + +### 3.3 Bridge routes and token mapping + +| Endpoint | Purpose | +|----------|---------| +| **GET /api/v1/bridge/routes** | CCIP WETH9/WETH10 bridge routes; Chain 138 bridge addresses | +| **GET /api/v1/token-mapping?fromChain=138&toChain=1** | Token address mapping 138↔other chain (for bridge UIs) | +| **GET /api/v1/token-mapping/resolve?fromChain=&toChain=&address=** | Resolve one token address to the other chain | + +Use for “bridge WETH from 138 to Mainnet” or “what is cUSDT on 138 in Mainnet terms” (if a wrapped/bridged form exists). + +--- + +## 4. Routing for DEXs — how it works + +### 4.1 Single-hop routing (what’s live today) + +- **On-chain:** User (or contract) calls `DODOPMMIntegration` swap functions directly with the correct pool address. No on-chain “router” that picks the pool. +- **Off-chain (API):** Client calls `GET /api/v1/quote` with `chainId=138`, `tokenIn`, `tokenOut`, `amountIn`. The service returns the best direct-pool quote from its index (DODO + any configured Uniswap). Client then executes the swap on the integration contract (or via a front-end that submits the tx). + +So “routing” today = **choose the right pool** (cUSDT/cUSDC, cUSDT/USDT, or cUSDC/USDC) and call the matching swap function with that pool. + +### 4.2 Multi-provider routing (design; not yet deployed) + +**EnhancedSwapRouter** (contract) is designed to route **one leg** (e.g. WETH↔stable) across multiple providers: + +- **By size:** Small (<$10k) → Uniswap V3 / Dodoex; medium ($10k–$100k) → Dodoex → Balancer → Uniswap V3; large (>$100k) → Dodoex → Curve → Balancer. +- **By slippage / liquidity:** Prefer Dodoex for low slippage; Balancer/Curve for deeper liquidity. + +This contract is **not deployed** on Chain 138. When deployed (and when Uniswap/Balancer/Curve pools exist on 138), it would sit in front of multiple DEXs and return `getQuotes(stablecoin, amountIn)` and `swapToStablecoin(...)` so one call gets the best execution. **DODOPMMProvider** would be one of the registered providers. + +### 4.3 Swap–bridge–swap (cross-chain routing) + +For **cross-chain** flows (e.g. swap on 138 → bridge to Mainnet → swap on Mainnet): + +- **Orchestration API:** `POST /api/bridge/quote` — request includes source/destination chain, token, amount, destination address. Response can include: + - **sourceSwapQuote** — optional quote to swap into the bridge asset on source (e.g. 138) when an EnhancedSwapRouter or equivalent is configured. + - **destinationSwapQuote** — optional quote to swap on destination chain after the bridge. +- **On-chain coordinator (optional):** **SwapBridgeSwapCoordinator** can perform “swap (source) → bridge → swap (destination)” in one transaction when deployed and configured. + +So “routing for DEXs” in a cross-chain context = **source DEX (138)** + **bridge** + **destination DEX**, with the quote API and optional coordinator tying them together. + +--- + +## 5. Using aggregators with Chain 138 tokens + +### 5.1 Internal “aggregation” (token-aggregation service) + +The token-aggregation service **aggregates**: + +- **Pools:** From DODO (DODOPMMIntegration) and, if configured, UniswapV2/V3. +- **Quote:** Best **single-hop** quote for a given (tokenIn, tokenOut, amountIn) on one chain. + +So for Chain 138, it acts as a **single-hop quote aggregator** over the indexed DEX (today: DODO PMM). It does **not** split orders across multiple pools or chains; it picks the best direct pool for the pair. + +### 5.2 External DEX aggregators (1inch, 0x, ParaSwap) + +- **1inch, 0x, ParaSwap** and similar aggregators support many chains and DEXs. They do **not** support ChainID 138 unless they add it. +- **To use them with Chain 138:** The aggregator would need to add Chain 138 to their config, index or connect to DODO PMM (and any other DEX on 138), and expose 138 in their API/UI. Today you would **contact** them for integration (see [DEX_INTEGRATION_GUIDE](../../metamask-integration/docs/DEX_INTEGRATION_GUIDE.md)). +- **Until then:** Use the **token-aggregation** API for quotes and the **DODOPMMIntegration** contract for execution on 138. + +### 5.3 Explorer / bridge aggregator (Go backend) + +The **explorer-monorepo** backend has a bridge aggregator that uses Li.Fi, Socket, Squid, Symbiosis, Relay, Stargate. That aggregation is for **bridge routes**, not for on-chain DEX swaps on 138. For **swap + bridge + swap**, the orchestration **POST /api/bridge/quote** and optional SwapBridgeSwapCoordinator are the relevant pieces. + +--- + +## 6. End-to-end flows (summary) + +### Flow A: Swap on Chain 138 only (same chain) + +1. **Resolve tokens:** `GET /api/v1/tokens?chainId=138` or token list; get addresses for cUSDT, cUSDC, WETH. +2. **Get quote:** `GET /api/v1/quote?chainId=138&tokenIn=&tokenOut=&amountIn=...` +3. **Execute:** User signs a tx calling `DODOPMMIntegration.swapCUSDTForUSDC(pool, amountIn, minAmountOut)` (or the matching function for the pair), with approval for the input token. + +### Flow B: Bridge from Chain 138 (no destination swap) + +1. **Bridge routes:** `GET /api/v1/bridge/routes` for WETH9/WETH10 and Chain 138 bridge addresses. +2. **Token mapping:** If needed, `GET /api/v1/token-mapping/resolve` for 138→destination. +3. User sends a bridge tx (e.g. CCIP) from 138 to the destination chain; no DEX swap on 138 unless they first swap into WETH/WETH10. + +### Flow C: Swap on 138 → bridge → swap on destination + +1. **Quote:** `POST /api/bridge/quote` with source chain 138, destination chain, token, amount, destination address. Response may include `sourceSwapQuote` and `destinationSwapQuote`. +2. **Source (138):** If user holds cUSDT/cUSDC, optionally swap to WETH via DODOPMMIntegration (or future router) using Flow A. +3. **Bridge:** User (or coordinator) executes bridge transfer. +4. **Destination:** Optional swap using `destinationSwapQuote` or destination-chain DEX. + +--- + +## 7. Config and env (integrators) + +| Use case | Env / config | +|----------|---------------| +| **Token-aggregation indexing DODO on 138** | `CHAIN_138_DODO_PMM_INTEGRATION=0x79cdbaFBaA0FdF9F55D26F360F54cddE5c743F7D` (and RPC, DB). Optional: `CHAIN_138_DODO_POOL_MANAGER`, `CHAIN_138_DODO_VENDING_MACHINE`. | +| **Uniswap on 138 (if deployed)** | `CHAIN_138_UNISWAP_V2_FACTORY`, `CHAIN_138_UNISWAP_V2_ROUTER`, `CHAIN_138_UNISWAP_V2_START_BLOCK` (and V3 equivalents). | +| **Bridge quote (swap+bridge+swap)** | `RPC_URL`, `BRIDGE_REGISTRY_ADDRESS`; optional `ENHANCED_SWAP_ROUTER_ADDRESS`, `DESTINATION_RPC_URL`, `DESTINATION_SWAP_ROUTER_ADDRESS`. | +| **Token list / MetaMask** | Token-aggregation `GET /api/v1/report/token-list?chainId=138` or static list; point MetaMask/dApp to this URL. | + +--- + +## 8. Reference + +| Document | Content | +|----------|---------| +| [PMM_DEX_ROUTING_STATUS.md](../11-references/PMM_DEX_ROUTING_STATUS.md) | DEX/PMM deployment status, what’s live vs not | +| [TASKS_TO_INCREASE_ALL_E2E_FLOWS.md](../00-meta/TASKS_TO_INCREASE_ALL_E2E_FLOWS.md) | **Tasks** required to complete Flow A, B, C and cross-cutting E2E | +| [STATUS_AND_TOKEN_ROUTING.md](../../smom-dbis-138/docs/STATUS_AND_TOKEN_ROUTING.md) | Token-aggregation API summary, routing layers, multihop | +| [REST_API_REFERENCE.md](../../smom-dbis-138/services/token-aggregation/docs/REST_API_REFERENCE.md) | Full token-aggregation API | +| [DODO_PMM_INTEGRATION.md](../../smom-dbis-138/docs/integration/DODO_PMM_INTEGRATION.md) | Pool creation, swap functions, liquidity | +| [ENHANCED_ROUTING.md](../../smom-dbis-138/docs/bridge/trustless/integration/ENHANCED_ROUTING.md) | Multi-provider routing design (EnhancedSwapRouter) | +| [DEX_INTEGRATION_GUIDE.md](../../metamask-integration/docs/DEX_INTEGRATION_GUIDE.md) | Partner DEX/aggregator options (1inch, 0x, ParaSwap) | +| [ADDRESS_MATRIX_AND_STATUS.md](../11-references/ADDRESS_MATRIX_AND_STATUS.md) | All Chain 138 addresses (tokens, pools, contracts) | + +**Explorer (Chain 138):** https://explorer.d-bis.org +**RPC (public):** https://rpc-core.d-bis.org (deployment should use Core RPC; see runbooks.) diff --git a/docs/04-configuration/EXPLORER_FUNCTIONALITY_REVIEW.md b/docs/04-configuration/EXPLORER_FUNCTIONALITY_REVIEW.md new file mode 100644 index 0000000..38d4407 --- /dev/null +++ b/docs/04-configuration/EXPLORER_FUNCTIONALITY_REVIEW.md @@ -0,0 +1,51 @@ +# Explorer functionality review (routes, API, Snap) + +Reference for what works, what the SPA calls, and fixes applied. + +## 1. Site routes and navigation + +All primary routes return **HTTP 200** and render the same SPA shell (Explore: Home, Blocks, Transactions; Tools: Bridge, WETH, Tokens, Watchlist; MetaMask Snap; language toggle; Connect Wallet): + +- `/`, `/home`, `/blocks`, `/transactions`, `/bridge`, `/weth`, `/tokens`, `/watchlist`, `/analytics`, `/operator` + +Static routing and nginx serving are OK. + +## 2. Exact API URLs the SPA calls + +When the page is at `https://explorer.d-bis.org`, the SPA uses **relative** `/api`. In DevTools → Network, filter by `api` and confirm these: + +| Widget / feature | URL | +|----------------------------|-----| +| Stats (Total Blocks, etc.) | `GET /api/v2/stats` | +| Gas & Network | `GET /api/v2/blocks?page=1&page_size=20`, `GET /api/v2/stats`, `GET /api/v2/transactions?page=1&page_size=100` | +| Latest Blocks | `GET /api/v2/blocks?page=1&page_size=10` | +| Latest Transactions | `GET /api/v2/transactions?page=1&page_size=10` | +| Tokens (list) | `GET /api/v2/tokens?page=1&page_size=100` | +| Bridge Monitoring | **No API call** — content is static HTML. If it stays "Loading bridge data…", a JS error may prevent the bridge view from running. | + +If any of these return non-200 or (failed) CORS, that’s the failing path. If all return 200 but the UI still shows "Loading…", the issue is in the SPA (parsing, DOM update, or an exception after fetch). See [explorer-monorepo/docs/EXPLORER_LOADING_TROUBLESHOOTING.md](../../explorer-monorepo/docs/EXPLORER_LOADING_TROUBLESHOOTING.md). + +## 3. Blockscout stats endpoint + +- `https://explorer.d-bis.org/api/v2/stats` returns **200** with `total_blocks`, `total_transactions`, `gas_prices`, `average_block_time`, etc. So the API is up. + +## 4. MetaMask Snap section + +- **`/snap/`** — Chain 138 Snap page loads; set `GATSBY_SNAP_API_BASE_URL` for market/summary/bridge/swap cards. +- **`/snap/send`** — **Fix applied:** The "Send on Chain 138" link is now built as an **absolute HTTPS** URL when `GATSBY_SNAP_SITE_URL` is set (e.g. `https://explorer.d-bis.org/snap/send`), so the link no longer leads to an HTTP redirect. Rebuild the Snap site with `GATSBY_SNAP_SITE_URL=https://explorer.d-bis.org` (see [chain138-snap/scripts/build-snap-site-for-explorer.sh](../../metamask-integration/chain138-snap/scripts/build-snap-site-for-explorer.sh)) and redeploy to VMID 5000. + +## 5. Contract verification + +- **Blockscout** supports contract verification (Etherscan-compatible and v2 API). From the explorer: open an **address** → **Contract** tab → **Verify & Publish** (if the instance shows it). +- **Forge (CLI):** Use the **forge-verification-proxy** and then run verification scripts so Forge’s payload is translated to Blockscout v2. See [08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md](../08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md) and [forge-verification-proxy/README.md](../../forge-verification-proxy/README.md). Scripts: `scripts/verify/run-contract-verification-with-proxy.sh`, `scripts/verify-contracts-blockscout.sh`. +- **Gaps and more:** [EXPLORER_GAPS_AND_RECOMMENDATIONS.md](EXPLORER_GAPS_AND_RECOMMENDATIONS.md) § Contract verification. + +--- + +## 6. Conclusions from observed behavior + +- **Static routing / nginx:** OK (all pages load). +- **Blockscout stats:** OK (`/api/v2/stats` returns 200). +- **SPA dynamic widgets:** If still "Loading…" after fixes (relative `/api`, no `filter=to`, cache-bust `?v=3`), verify (1) deployed `explorer-spa.js` on VMID 5000 is the latest, (2) hard-refresh (Ctrl+Shift+R), (3) DevTools Console for first error and Network for failing API URL + status. +- **Snap send:** Use absolute HTTPS link (rebuild with `GATSBY_SNAP_SITE_URL`, redeploy Snap site). +- **Full gaps, bridge/lanes, verification, user/API keys:** [EXPLORER_GAPS_AND_RECOMMENDATIONS.md](EXPLORER_GAPS_AND_RECOMMENDATIONS.md). diff --git a/docs/04-configuration/EXPLORER_GAPS_AND_RECOMMENDATIONS.md b/docs/04-configuration/EXPLORER_GAPS_AND_RECOMMENDATIONS.md new file mode 100644 index 0000000..b04b69a --- /dev/null +++ b/docs/04-configuration/EXPLORER_GAPS_AND_RECOMMENDATIONS.md @@ -0,0 +1,125 @@ +# Explorer: Gaps, Recommendations, and Additional Items + +**Purpose:** Single reference for explorer (https://explorer.d-bis.org): loading, bridge/lanes, **contract verification (Verify & Publish + Forge batch)**, user/API keys, and all other recommendations and gaps. + +**Related:** [EXPLORER_FUNCTIONALITY_REVIEW.md](EXPLORER_FUNCTIONALITY_REVIEW.md) | [EXPLORER_METAMASK_TECHNICAL_RESPONSE.md](EXPLORER_METAMASK_TECHNICAL_RESPONSE.md) | [EXPLORER_TROUBLESHOOTING.md](EXPLORER_TROUBLESHOOTING.md) | [BLOCKSCOUT_VERIFICATION_GUIDE.md](../08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md) | [explorer-monorepo/docs/EXPLORER_LOADING_TROUBLESHOOTING.md](../../explorer-monorepo/docs/EXPLORER_LOADING_TROUBLESHOOTING.md) + +--- + +## 1. Loading on all pages + +### 1.1 Intended behavior + +| Page / view | Data loaded | Source | +|-------------|-------------|--------| +| **Home** | Stats, Gas & Network, Latest Blocks, Latest Transactions | `loadStats()`, `loadGasAndNetworkStats()`, `loadLatestBlocks()`, `loadLatestTransactions()` — all use `/api/v2/*` (Blockscout). | +| **Blocks** | Paginated block list | `loadAllBlocks()` → `/api/v2/blocks?page=&page_size=25`. | +| **Transactions** | Paginated transaction list | `loadAllTransactions()` → `/api/v2/transactions?page=&page_size=25`. | +| **Bridge** | Static bridge/lanes content | `refreshBridgeData()` — no API; builds HTML from hardcoded routes. If "Loading bridge data…" persists, a JS error likely prevents this from running. | +| **Tokens** | Token list | `loadTokensList()` → `/api/v2/tokens?page=1&page_size=100`. | +| **WETH** | Static UI + wallet balance (if connected) | No Blockscout list API; wrap/unwrap uses RPC. | +| **Watchlist** | LocalStorage-backed list | `_renderWatchlist()` — no API. | +| **Analytics** | Placeholder (Track 3) | "Coming soon" message; gated by `hasAccess(3)`. | +| **Operator** | Placeholder (Track 4) | "Coming soon" message; gated by `hasAccess(4)`. | + +### 1.2 If widgets stay "Loading…" or "—" + +- Ensure **all** of these return **200** when opened from the explorer origin: `/api/v2/stats`, `/api/v2/blocks?page=1&page_size=10`, `/api/v2/transactions?page=1&page_size=10`, `/api/v2/tokens?page=1&page_size=100`. See [EXPLORER_LOADING_TROUBLESHOOTING](../../explorer-monorepo/docs/EXPLORER_LOADING_TROUBLESHOOTING.md) for exact URLs and do-now checks. +- Redeploy frontend after SPA changes; use cache-bust `explorer-spa.js?v=3` (or higher) and hard-refresh. + +--- + +## 2. Bridges and lanes / routes to all networks + +### 2.1 Current state + +- **Bridge Monitoring** view shows: + - Chain 138 WETH9/WETH10 bridge addresses (correct: `0x971cD9…`, `0xe0E932…`). + - **WETH9 routes:** BSC (56), Polygon (137), Avalanche (43114), Base (8453), Arbitrum (42161), Optimism (10), Ethereum Mainnet (1). + - **WETH10 routes:** Same 7 destinations. + - **Ethereum Mainnet bridges:** WETH9 `0x2A0840…`, WETH10 `0xb7721d…` (correct). +- **Source of truth for lanes:** [07-ccip/CHAIN138_COMPLETE_ROUTING_TABLE.md](../07-ccip/CHAIN138_COMPLETE_ROUTING_TABLE.md), [07-ccip/MAPPER_GAPS_DEPLOYMENTS_AND_IMPROVEMENTS.md](../07-ccip/MAPPER_GAPS_DEPLOYMENTS_AND_IMPROVEMENTS.md). + +### 2.2 Gaps and recommendations + +| Item | Status | Recommendation | +|------|--------|----------------| +| **Destination-chain "Bridge Address" in SPA** | Addresses for BSC/Polygon/etc. in the SPA are hardcoded; some may be placeholders (e.g. CCIP Router 138 reused). | Source remote bridge (or router) addresses from config/API (e.g. token-aggregation or `config/smart-contracts-master.json`) when available; or add a "Reference" link to CHAIN138_COMPLETE_ROUTING_TABLE. | +| **Cronos (25), Gnosis (100), Celo (42220), Wemix (1111)** | Routing table lists Cronos as live; 100/42220/1111 as "Config ready". SPA shows only 7 destinations. | Add Cronos (25) to the Bridge Monitoring table when destination bridge address is confirmed; add a short "More chains (Gnosis, Celo, Wemix) when configured" note and link to routing table. | +| **All lanes load** | Bridge view is static HTML; no runtime fetch of lanes. | Optional: call `GET /api/v1/bridge/routes` (or equivalent) if the explorer backend exposes it, and render lanes from response so new chains appear without SPA redeploy. | + +--- + +## 3. Contract verification + +### 3.1 What exists + +- **Blockscout** on VMID 5000 supports contract verification (Etherscan-compatible + v2 API). +- **Forge verification:** Use the **forge-verification-proxy** so Forge’s payload is translated to Blockscout v2. See [forge-verification-proxy/README.md](../../forge-verification-proxy/README.md) and [08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md](../08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md). +- **Scripts:** `scripts/verify/run-contract-verification-with-proxy.sh`, `scripts/verify-contracts-blockscout.sh` (and smom-dbis-138 equivalents). + +### 3.2 Verify & Publish (Blockscout UI) + +To verify a contract from the explorer when automated verification is unavailable or returns 502: + +1. Open **https://explorer.d-bis.org/address/** +2. Go to the **Contract** tab → **Verify & Publish** +3. Choose method: **Via Standard JSON Input** (recommended), **Via Sourcify**, or **Via Multi-file** +4. Upload source (or paste) and provide constructor arguments if needed; submit. + +See [08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md](../08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md) for Forge/proxy batch verification and troubleshooting (502, HTML response). + +### 3.3 Recommendations + +| Item | Recommendation | +|------|-----------------| +| **Batch verification (Forge + proxy)** | From a host that can reach Blockscout (LAN): `source smom-dbis-138/.env 2>/dev/null; ./scripts/verify/run-contract-verification-with-proxy.sh`. Uses canonical addresses from .env; see [BLOCKSCOUT_VERIFICATION_GUIDE](../08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md). | +| **API key for Blockscout** | Self-hosted Blockscout at explorer.d-bis.org does not require an API key for read API. If rate limits or private endpoints are added later, document API key issuance (see §4). | + +--- + +## 4. User profile and dev API key issuance + +### 4.1 Gap + +- **No user accounts or developer API keys** are implemented in the explorer or Blockscout today. Blockscout (self-hosted) typically does not ship a "developer portal" for API key signup; read API is public or protected at the reverse-proxy/nginx level. + +### 4.2 Recommendations + +| Option | Effort | Notes | +|--------|--------|--------| +| **A. Blockscout API keys (if enabled)** | Low | If your Blockscout version supports API keys for the read API, enable them and document how operators issue keys (e.g. via Blockscout admin or env). | +| **B. Nginx/API gateway rate limit by key** | Medium | Put an API gateway or nginx in front of `/api` that requires a query param or header (e.g. `?apikey=`) and issue keys out-of-band (e.g. from a simple script or internal form). | +| **C. Separate developer portal** | High | Build a small "developer portal" (e.g. in dbis_core or the-order) that allows signup/login and issues API keys for explorer (and other) APIs; store keys and enforce in gateway. | + +**Suggested short-term:** Document that the explorer API is currently public (no key). If you need keys later, start with (A) or (B) and add a one-page "API access" doc with whom to contact for a key and which base URL to use. + +--- + +## 5. Other recommendations and suggestions + +### 5.1 From existing docs + +- **Snap /send HTTPS:** Ensure "Send on Chain 138" link is absolute HTTPS (`GATSBY_SNAP_SITE_URL` in Snap build). Done in repo; rebuild and redeploy Snap site to apply. +- **CoinGecko / API keys:** Token-aggregation and oracle may use CoinGecko (and optional CMC); see [COINGECKO_API_KEY_SETUP.md](COINGECKO_API_KEY_SETUP.md) and [API_KEYS_REQUIRED.md](../../reports/API_KEYS_REQUIRED.md). Not explorer-specific but affects Snap/market data. +- **RPC TRACE:** Already enabled on public RPC (VMID 2201) for Blockscout indexing; see [explorer-monorepo/docs/RPC_FUNCTIONALITY_AND_BLOCKSCOUT_TRACE.md](../../explorer-monorepo/docs/RPC_FUNCTIONALITY_AND_BLOCKSCOUT_TRACE.md). + +### 5.2 Explorer-specific + +| # | Recommendation | Priority | +|---|----------------|----------| +| 1 | Ensure all SPA views that call `/api` handle 4xx/5xx and show a clear "Retry" or error message. | High | +| 2 | Add a "Verify contract" link or short instructions on the address/contract page (link to Blockscout verification or BLOCKSCOUT_VERIFICATION_GUIDE). | Medium | +| 3 | Consider serving bridge routes from a small config or API so new chains don’t require an SPA redeploy. | Low | +| 4 | Analytics (Track 3) / Operator (Track 4): when implemented, document access control and any API keys. | Future | +| 5 | Optional: add Blockscout "API" or "Docs" link in footer (e.g. to Blockscout API docs or internal API overview). | Low | + +--- + +## 6. Quick checklist (operator) + +- [ ] All explorer pages load; no persistent "Loading…" for stats, blocks, transactions, tokens, bridge (see §1). +- [ ] Bridge Monitoring shows Chain 138 + Mainnet bridges and 7 (or more) destination lanes; add Cronos/config-ready chains if desired (§2). +- [ ] Contract verification: proxy + Forge runbook documented; run batch verification for main contracts (§3). +- [ ] User/API key: decision documented; if keys are introduced, add "API access" doc and issuance process (§4). +- [ ] Snap site: rebuilt with `GATSBY_SNAP_SITE_URL`; `/snap/send` link is HTTPS (§5). diff --git a/docs/04-configuration/EXPLORER_METAMASK_TECHNICAL_RESPONSE.md b/docs/04-configuration/EXPLORER_METAMASK_TECHNICAL_RESPONSE.md new file mode 100644 index 0000000..e2694fc --- /dev/null +++ b/docs/04-configuration/EXPLORER_METAMASK_TECHNICAL_RESPONSE.md @@ -0,0 +1,170 @@ +# Explorer + MetaMask Technical Response — 5 Items for Exact Config + +**Purpose:** Reply to the technical review so you get exact “do this / set that” config values for the explorer and MetaMask. + +--- + +## Ready-to-send reply (copy-paste all below) + +**5 items (send as-is)** + +**1) RPC URL used by MetaMask** + +- Public (MetaMask / dApps): `https://rpc-http-pub.d-bis.org` +- WebSocket: `wss://rpc-ws-pub.d-bis.org` +- Internal: `http://192.168.11.221:8545` + +**2) ChainId** + +- Decimal: `138` +- Hex: `0x8a` + +**3) Explorer backend stack** + +- Backend: **Blockscout** (Docker container on VMID 5000, API on port 4000) +- Frontend: **SolaceScanScout** SPA served by nginx on VMID 5000; frontend calls `/api` (nginx proxy to `http://127.0.0.1:4000`) and uses the same RPC for wallet/fallback + +**4) Intended wrapped-native (WETH9) on chain (Chain 138)** + +- WETH9: `0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2` (same as Ethereum mainnet **by design**; canonical bytecode verified on 138) +- WETH10: `0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f` +- Bridges: + - WETH9 Bridge: `0x971cD9D156f193df8051E48043C476e53ECd4693` + - WETH10 Bridge: `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` + +**5) EIP-1559** + +- Yes — blocks include `baseFeePerGas` + +**Summary table (paste-friendly)** + +| # | Item | Value | +| - | ---------------------- | -------------------------------------------------------------------------- | +| 1 | RPC URL (MetaMask) | `https://rpc-http-pub.d-bis.org` (WS: `wss://rpc-ws-pub.d-bis.org`) | +| 2 | ChainId | Decimal: **138** — Hex: **0x8a** | +| 3 | Explorer backend stack | **Blockscout** (VMID 5000:4000) + **SolaceScanScout** (nginx on VMID 5000) | +| 4 | Wrapped-native (WETH9) | **`0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2`** | +| 5 | EIP-1559 | **Yes** — `baseFeePerGas` present | + +**Optional: Backend RPC and API wiring (for "Loading…" fixes)** + +- Blockscout env (VMID 5000): + - `ETHEREUM_JSONRPC_HTTP_URL=http://192.168.11.221:8545` + - `ETHEREUM_JSONRPC_WS_URL=ws://192.168.11.221:8546` + - `ETHEREUM_JSONRPC_VARIANT=besu` + - `CHAIN_ID=138` +- Frontend: calls `/api` (same origin on `https://explorer.d-bis.org`); nginx proxies `/api` → Blockscout `:4000` +- TRACE API: enabled on public RPC node (VMID 2201) so Blockscout can index internals/block rewards + +--- + +## 1. RPC URL used by MetaMask + +- **Public (recommended for MetaMask / dApps):** + - **HTTPS:** `https://rpc-http-pub.d-bis.org` + - **WebSocket:** `wss://rpc-ws-pub.d-bis.org` +- **Internal (same backend, HTTP only):** `http://192.168.11.221:8545` (VMID 2201, besu-rpc-public-1) + +MetaMask and the explorer frontend use the **HTTPS** URL when the site is served over `https://explorer.d-bis.org`; otherwise they fall back to the HTTP URL. The explorer **backend** (Blockscout) uses `http://192.168.11.221:8545` (same node). + +--- + +## 2. ChainId (hex and decimal) + +- **Decimal:** `138` +- **Hex:** `0x8a` (also written `0x8A` in some UIs) + +--- + +## 3. Explorer backend stack + +- **Backend:** **Blockscout** (Docker container on VMID 5000, API on port 4000). +- **Frontend:** Custom SPA **“SolaceScanScout”** (static HTML/JS in `explorer-monorepo/frontend/public/`), served by nginx on VMID 5000. The frontend calls: + - **Blockscout API** at `/api` (proxied by nginx to `http://127.0.0.1:4000`). + - **RPC** (for fallback / wallet) at `https://rpc-http-pub.d-bis.org` or `http://192.168.11.221:8545` as above. + +So: **Blockscout** is the indexer/API; **SolaceScanScout** is the custom frontend branding and UI. + +**Screenshots (live UI):** See [../images/README.md](../images/README.md) for image list. Reference images (replace with live captures from https://explorer.d-bis.org/ if desired): + +| View | Image | +|------|--------| +| Home (stats, Gas & Network, Latest Blocks/Transactions) | ![Explorer home](../images/explorer-home.png) | +| Blocks list | ![Explorer blocks](../images/explorer-blocks.png) | +| Transactions list | ![Explorer transactions](../images/explorer-transactions.png) | + +--- + +## 4. Intended wrapped-native contract addresses (Chain 138) + +Chain 138 intentionally uses the **same addresses as Ethereum mainnet** for WETH9/WETH10 (deployed-at-same-address / CREATE2-style setup). They exist on Chain 138 and are the intended wrapped-native contracts. + +| Token / Bridge | Address (Chain 138) | Notes | +|-----------------------|---------------------|--------| +| **WETH9** (wrapped-native) | `0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2` | Same as mainnet; canonical WETH9 bytecode verified on 138 (see `smom-dbis-138/scripts/verify-weth9-canonical.js`). | +| **WETH10** | `0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f` | Same as mainnet. | +| **WETH9 Bridge** (CCIP) | `0x971cD9D156f193df8051E48043C476e53ECd4693` | In `config/contract-addresses.conf` as `ADDR_CCIPWETH9_BRIDGE`. | +| **WETH10 Bridge** (CCIP) | `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` | In `config/contract-addresses.conf` as `ADDR_CCIPWETH10_BRIDGE`. | + +So the **intended wrapped-native (WETH9-equivalent) address** on Chain 138 is **`0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2`**. The explorer is correct to show it; the chain is not “mainnet” but uses that address by design. + +--- + +## 5. EIP-1559 (baseFeePerGas) + +- **Yes.** The chain uses EIP-1559; blocks include **baseFeePerGas**. +- Deployment and gas scripts (e.g. in `scripts/archive/consolidated/deploy/`) use `eth_getBlockByNumber("latest", false)` and read `baseFeePerGas` for gas pricing. +- Docs state EIP-1559 is supported (e.g. `docs/11-references/DEFI_ORACLE_META_MAINNET_PROJECT_DESCRIPTION.md`, `docs/04-configuration/ADD_CHAIN138_TO_LEDGER_LIVE.md`). + +--- + +## Summary table (paste-friendly) + +| # | Item | Value | +|---|------|--------| +| 1 | **RPC URL (MetaMask)** | `https://rpc-http-pub.d-bis.org` (WS: `wss://rpc-ws-pub.d-bis.org`) | +| 2 | **ChainId** | Decimal: **138** — Hex: **0x8a** | +| 3 | **Explorer backend stack** | **Blockscout** (API on VMID 5000:4000) + custom frontend **SolaceScanScout** (nginx on VMID 5000) | +| 4 | **Wrapped-native (WETH9) on chain** | **`0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2`** (same as mainnet by design) | +| 5 | **EIP-1559** | **Yes** — baseFeePerGas present in blocks | + +--- + +## Optional: Backend RPC and API wiring (for “Loading…” fixes) + +- **Blockscout env (VMID 5000):** + - `ETHEREUM_JSONRPC_HTTP_URL=http://192.168.11.221:8545` + - `ETHEREUM_JSONRPC_WS_URL=ws://192.168.11.221:8546` + - `ETHEREUM_JSONRPC_VARIANT=besu` + - `CHAIN_ID=138` +- **Frontend:** Calls `/api` (same origin when on `https://explorer.d-bis.org`); nginx proxies `/api` to Blockscout on port 4000. +- **TRACE API:** Enabled on the public RPC node (VMID 2201) so Blockscout can index internal transactions and block rewards (see `explorer-monorepo/docs/RPC_FUNCTIONALITY_AND_BLOCKSCOUT_TRACE.md`). + +You can paste the **Summary table** plus the **Optional** paragraph (if they need backend details) into your reply to get the exact explorer env/config, WETH9/WETH10/bridge wiring, and RPC checklist. + +--- + +## Verification: explorer vs this doc + +Verification run: config and live endpoints checked against the values above. + +### Codebase (matches doc) + +| Item | Source | Status | +|------|--------|--------| +| RPC URL (HTTPS/WS) | `explorer-monorepo/frontend/public/explorer-spa.js` | `RPC_FQDN` = `https://rpc-http-pub.d-bis.org`, `RPC_WS_FQDN` = `wss://rpc-ws-pub.d-bis.org`, `RPC_IP` = `http://192.168.11.221:8545` | +| ChainId | same file | `CHAIN_ID = 138`, MetaMask `chainId: '0x8A'` | +| WETH9 / WETH10 | same file | `0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2`, `0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f` | +| WETH9/WETH10 bridges | same file | `0x971cD9D156f193df8051E48043C476e53ECd4693`, `0xe0E93247376aa097dB308B92e6Ba36bA015535D0` | +| Blockscout env | `scripts/run-blockscout-config-direct.sh` | `ETHEREUM_JSONRPC_HTTP_URL=http://192.168.11.221:8545`, `CHAIN_ID=138`, `ETHEREUM_JSONRPC_VARIANT=besu` | +| API proxy | `explorer-monorepo/scripts/fix-nginx-serve-custom-frontend.sh` | `location /api/` → `proxy_pass http://127.0.0.1:4000` | + +### Live endpoints + +| Check | Command / URL | Result | +|-------|----------------|--------| +| Explorer API | `GET https://explorer.d-bis.org/api/v2/stats` | 200; `total_blocks`, `total_transactions`, `gas_prices` present | +| RPC chainId | `POST https://rpc-http-pub.d-bis.org` `eth_chainId` | `"result":"0x8a"` (138) | +| EIP-1559 | `POST https://rpc-http-pub.d-bis.org` `eth_getBlockByNumber("latest", false)` | `baseFeePerGas` present in block (e.g. `"0x7"`) | + +**Conclusion:** Explorer config and live behaviour match this doc. Use the “Ready-to-send reply” section to respond to the technical review. diff --git a/docs/04-configuration/EXPLORER_TOKENS_GRU_POLICY.md b/docs/04-configuration/EXPLORER_TOKENS_GRU_POLICY.md new file mode 100644 index 0000000..b3377ff --- /dev/null +++ b/docs/04-configuration/EXPLORER_TOKENS_GRU_POLICY.md @@ -0,0 +1,42 @@ +# Explorer tokens and GRU policy + +**Purpose:** All compliant (c*) tokens listed on [https://explorer.d-bis.org/tokens](https://explorer.d-bis.org/tokens) must be part of the GRU (Global Reserve Unit) — i.e. registered in `UniversalAssetRegistry` as `AssetType.GRU`. + +## Policy + +1. **Token lists** + The canonical Chain 138 token list (`token-lists/lists/dbis-138.tokenlist.json`) and the explorer/MetaMask list (`explorer-monorepo/backend/config/metamask/DUAL_CHAIN_TOKEN_LIST.tokenlist.json`) include only c* tokens that are **registered as GRU** on Chain 138. + +2. **When adding a new c* token** + - Deploy the token (or confirm address). + - Register it as GRU: set the token address in `smom-dbis-138/.env` (e.g. `CEURT_ADDRESS_138`, `CGBPC_ADDRESS_138`; see `ENV_EXAMPLE_CONTENT.md`), then run: + ```bash + ./scripts/deployment/set-dotenv-c-tokens-and-register-gru.sh + ``` + - Add the token to the token lists (dbis-138 and DUAL_CHAIN for Chain 138) **after** it is registered as GRU. + +3. **All c* registered as GRU** + The script `set-dotenv-c-tokens-and-register-gru.sh` sets and registers the following c* (addresses from DeployCompliantFiatTokens / ENV_EXAMPLE_CONTENT): + - **cUSDT** — `0x93E66202A11B1772E55407B32B44e5Cd8eda7f22` + - **cUSDC** — `0xf22258f57794CC8E06237084b353Ab30fFfa640b` + - **cEURC** — `0x8085961F9cF02b4d800A3c6d386D31da4B34266a` + - **cEURT** — `0xdf4b71c61E5912712C1Bdd451416B9aC26949d72` + - **cGBPC** — `0x003960f16D9d34F2e98d62723B6721Fb92074aD2` + - **cGBPT** — `0x350f54e4D23795f86A9c03988c7135357CCaD97c` + - **cAUDC** — `0xD51482e567c03899eecE3CAe8a058161FD56069D` + - **cJPYC** — `0xEe269e1226a334182aace90056EE4ee5Cc8A6770` + - **cCHFC** — `0x873990849DDa5117d7C644f0aF24370797C03885` + - **cCADC** — `0x54dBd40cF05e15906A2C21f600937e96787f5679` + - **cXAUC** — `0x290E52a8819A4fbD0714E517225429aA2B70EC6b` + - **cXAUT** — `0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E` + Token lists (dbis-138, DUAL_CHAIN for 138) include at least cUSDT, cUSDC, cEURC; add others to lists after they are deployed and verified on explorer. + +4. **Explorer /tokens page** + The explorer loads tokens from the Blockscout API (`/v2/tokens`). Curated lists (e.g. for MetaMask or display) must only include c* that are GRU-registered. When adding new c* to any list that can surface on the explorer, register them as GRU first (see step 2). + +## References + +- [DEPLOYMENT_ORDER_OF_OPERATIONS](../03-deployment/DEPLOYMENT_ORDER_OF_OPERATIONS.md) § Phase 2.4 (Register c* as GRU) +- [set-dotenv-c-tokens-and-register-gru.sh](../../scripts/deployment/set-dotenv-c-tokens-and-register-gru.sh) +- [RegisterGRUCompliantTokens.s.sol](../../smom-dbis-138/script/deploy/RegisterGRUCompliantTokens.s.sol) +- [C_TO_CW_MAPPER_MAPPING.md](C_TO_CW_MAPPER_MAPPING.md) — c* to cW* mapping for mapper on other chains diff --git a/docs/04-configuration/EXPLORER_TROUBLESHOOTING.md b/docs/04-configuration/EXPLORER_TROUBLESHOOTING.md index 480dd2c..7ba9f93 100644 --- a/docs/04-configuration/EXPLORER_TROUBLESHOOTING.md +++ b/docs/04-configuration/EXPLORER_TROUBLESHOOTING.md @@ -8,6 +8,8 @@ **Last updated:** 2026-02-06 +**Reference screenshots:** For expected explorer UI (home, blocks, transactions), see [../images/README.md](../images/README.md) and [EXPLORER_METAMASK_TECHNICAL_RESPONSE.md](EXPLORER_METAMASK_TECHNICAL_RESPONSE.md#3-explorer-backend-stack). + --- ## "Your connection isn't private" / net::ERR_CERT_AUTHORITY_INVALID @@ -116,6 +118,22 @@ When on your LAN, `explorer.d-bis.org` resolves to `76.53.10.36`. If that’s yo - **Blocks not updating:** Check Blockscout logs: `ssh root@192.168.11.12 "pct exec 5000 -- docker logs blockscout --tail 50"` +### "Invalid address" when clicking From/To in transaction list + +**Symptom:** Clicking the **From** or **To** cell in the transactions table (especially when **To** shows "—" for contract-creation txs) shows an "Invalid address" toast or error. + +**Cause:** Those cells were clickable even when the value was empty or "N/A", so the app tried to open an address detail for an invalid value. + +**Fix (applied in explorer SPA):** From/To cells are now only clickable when the value is a valid `0x` address. Clicking "—" or "N/A" no longer triggers the address detail; the row still opens the transaction detail when you click elsewhere on the row. + +### Contract verification fails (502 / Invalid JSON) + +When running `run-contract-verification-with-proxy.sh` or Forge verify, you may see "Blockscout returned HTML" or 502. This usually means Blockscout (VMID 5000) is down or the DB needs migrations. + +- **Fix Blockscout:** [03-deployment/BLOCKSCOUT_FIX_RUNBOOK.md](../03-deployment/BLOCKSCOUT_FIX_RUNBOOK.md) — SSL/migrations, thin pool, start stack. +- **Verify from UI:** When https://explorer.d-bis.org is up, use **Address → Contract → Verify & Publish** (no proxy needed). See [08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md](../08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md). +- **From LAN:** Run verification script from a host that can reach `http://192.168.11.140:4000` so the proxy can forward to Blockscout. + --- ## Verify Explorer diff --git a/docs/04-configuration/FULL_PARITY_TOKEN_COVERAGE_RUNBOOK.md b/docs/04-configuration/FULL_PARITY_TOKEN_COVERAGE_RUNBOOK.md new file mode 100644 index 0000000..5372cc7 --- /dev/null +++ b/docs/04-configuration/FULL_PARITY_TOKEN_COVERAGE_RUNBOOK.md @@ -0,0 +1,146 @@ +# Full Parity Token Coverage — Logos, Pricing, Token Lists, All Networks, All Entry Points + +**Last Updated:** 2026-02-28 +**Purpose:** Achieve complete coverage for token logos, pricing, and token lists across all networks and all aggregator/wallet entry points. + +--- + +## 1. Coverage Matrix + +| Dimension | Target | +|-----------|--------| +| **Networks** | 138, 1, 651940, 56, 137, 100, 10, 42161, 8453, 43114, 25, 42220, 1111 | +| **Token lists** | Uniswap format with logoURI; per-chain and unified | +| **Logos** | 512×512 PNG for CoinGecko/CMC; logoURI for all tokens | +| **Pricing** | CoinGecko, CMC, on-chain oracle; report API | +| **Entry points** | MetaMask, Trust Wallet, Chainlist, CoinGecko, CMC, 1inch, Paraswap, Chain 138 Snap | + +--- + +## 2. Entry Points and Requirements + +| Entry Point | Token List | Logos | Pricing | Notes | +|-------------|------------|-------|---------|-------| +| **MetaMask** | CoinGecko (built-in) or custom URL | logoURI per token | CoinGecko API | Chain 138 not in built-in; use Snap token list | +| **Trust Wallet** | Trust Wallet registry | Trust Wallet assets | CoinGecko/CMC | PR to trustwallet/wallet-core | +| **Chainlist** | eip155-138.json | Chain icon | — | [04-configuration/pr-ready/](../pr-ready/) | +| **CoinGecko** | Submit chain + tokens | 512×512 PNG | CoinGecko API | Primary for MetaMask | +| **CoinMarketCap** | Submit chain + tokens | 512×512 PNG | CMC API | Fallback for some wallets | +| **Chain 138 Snap** | token-aggregation API | logoURI from API | Report API | `GET /api/v1/report/token-list` | +| **1inch / Paraswap** | Token list URL | logoURI | Their APIs | Add token list URL when supported | +| **Explorer** | Blockscout / custom | — | — | Token verification | + +--- + +## 3. Single Source of Truth + +| Asset | Location | Used By | +|-------|----------|---------| +| **Canonical tokens** | `smom-dbis-138/services/token-aggregation/src/config/canonical-tokens.ts` | Report API, token-list, coingecko, cmc | +| **Token mapping (cross-chain)** | `config/token-mapping-multichain.json` | Bridge tooling, relay | +| **Networks (EIP-3085)** | `smom-dbis-138/services/token-aggregation/src/config/networks.ts` | Snap, wallet_addEthereumChain | +| **Chain configs** | `smom-dbis-138/services/token-aggregation/src/config/chains.ts` | Indexer, report API | +| **Logo URLs** | `canonical-tokens.ts` (getLogoUriForSpec), Trust Wallet assets | Token list, CoinGecko | +| **512×512 logos** | `docs/04-configuration/coingecko/logos/` (prepare-token-logos-512x512.sh) | CoinGecko/CMC submission | + +--- + +## 4. Per-Network Token List Coverage + +| Chain ID | Network | Tokens in canonical-tokens | Report API | Token list URL | +|----------|---------|----------------------------|-----------|----------------| +| 138 | Chain 138 | ✅ Full | ✅ | `?chainId=138` | +| 651940 | ALL Mainnet | ✅ cUSDC, cUSDT, WETH | ✅ | `?chainId=651940` | +| 1 | Ethereum | ✅ (L2_CHAIN_IDS) | ✅ | `?chainId=1` | +| 56 | BSC | ✅ | ✅ | `?chainId=56` | +| 137 | Polygon | ✅ | ✅ | `?chainId=137` | +| 100 | Gnosis | ✅ | ✅ | `?chainId=100` | +| 10 | Optimism | ✅ | ✅ | `?chainId=10` | +| 42161 | Arbitrum | Env/fallback | Add to chains.ts | `?chainId=42161` | +| 8453 | Base | Env/fallback | Add to chains.ts | `?chainId=8453` | +| 43114 | Avalanche | Env/fallback | Add to chains.ts | `?chainId=43114` | +| 25 | Cronos | ✅ USDW, etc. | Add to chains.ts | `?chainId=25` | +| 42220 | Celo | Env | Add to chains.ts | `?chainId=42220` | +| 1111 | Wemix | Env | Add to chains.ts | `?chainId=1111` | + +--- + +## 5. Implementation Checklist + +### 5.1 Token-Aggregation (All Networks) + +- [ ] Add chains 42161, 8453, 43114, 25, 42220, 1111 to `chains.ts` +- [ ] Add WETH9/WETH10 + cUSDT/cUSDC addresses per chain from `token-mapping-multichain.json` +- [ ] Add all networks to `networks.ts` with iconUrls (Trust Wallet fallback) +- [ ] Ensure `getSupportedChainIds()` returns all 13 chains +- [ ] Deploy token-aggregation and proxy `/api/v1/*` before Blockscout + +### 5.2 Logos + +- [ ] Run `prepare-token-logos-512x512.sh` (requires ImageMagick) +- [ ] Run `upload-token-logos-to-ipfs.sh` — see [IPFS_TOKEN_LOGOS_RUNBOOK](IPFS_TOKEN_LOGOS_RUNBOOK.md) +- [ ] Verify all 23+ tokens have 512×512 PNG in `docs/04-configuration/coingecko/logos/` +- [ ] Ensure `getLogoUriForSpec()` returns valid Trust Wallet URLs for all tokens +- [ ] Add chain logos (138, 651940) for Chainlist/CoinGecko + +### 5.3 Token Lists (Unified) + +- [ ] Export unified token list: `GET /api/v1/report/token-list` (no chainId = all chains) +- [ ] Publish token list URL for 1inch/Paraswap: `https://explorer.d-bis.org/api/v1/report/token-list` +- [ ] Sync DUAL_CHAIN_TOKEN_LIST, metamask provider tokens.js with canonical-tokens +- [ ] Add Chainlist eip155-138.json to pr-ready (done) + +### 5.4 Pricing + +- [ ] Submit Chain 138 and 651940 to CoinGecko (chain + tokens) +- [ ] Submit to CoinMarketCap +- [ ] Consensys outreach for MetaMask native support +- [ ] Document on-chain oracle addresses per chain for dApp use + +### 5.5 Entry Point Submissions + +| Entry Point | Action | Doc | +|-------------|--------|-----| +| CoinGecko | Submit chain + tokens via form | [CMC_COINGECKO_SUBMISSION_RUNBOOK](coingecko/CMC_COINGECKO_SUBMISSION_RUNBOOK.md) | +| CMC | Submit via listing form | Same | +| Trust Wallet | PR to wallet-core | [ADD_CHAIN138_TO_TRUST_WALLET](ADD_CHAIN138_TO_TRUST_WALLET.md) | +| Chainlist | Submit eip155-138.json | [pr-ready/README](../pr-ready/README.md) | +| 1inch | Token list URL (when chain supported) | — | +| Paraswap | Token list URL (when chain supported) | — | + +--- + +## 6. Commands + +```bash +# Prepare logos (requires ImageMagick) +./docs/04-configuration/coingecko/scripts/prepare-token-logos-512x512.sh + +# Upload logos to IPFS (requires ipfs daemon or PINATA_JWT) +./scripts/upload-token-logos-to-ipfs.sh + +# Export report data for submission +API_BASE="https://explorer.d-bis.org" +for chain in 138 651940 1 56 137 100 10 42161 8453 43114 25 42220 1111; do + curl -s "${API_BASE}/api/v1/report/coingecko?chainId=$chain" -o "report-coingecko-${chain}.json" + curl -s "${API_BASE}/api/v1/report/cmc?chainId=$chain" -o "report-cmc-${chain}.json" +done + +# Verify token list +curl -s "${API_BASE}/api/v1/report/token-list" | jq '.tokens | length' +curl -s "${API_BASE}/api/v1/report/token-list?chainId=138" | jq '.tokens[] | {symbol, logoURI}' + +# Verify Snap API +./metamask-integration/chain138-snap/scripts/verify-snap-api-and-icons.sh "$API_BASE" +``` + +--- + +## 7. References + +- [PUBLICATION_LOCATIONS_MASTER](PUBLICATION_LOCATIONS_MASTER.md) — **All locations to publish token lists, liquidity pools, chain metadata, pricing** +- [PRICE_FEED_CHAIN138_METAMASK_AND_WALLETS](PRICE_FEED_CHAIN138_METAMASK_AND_WALLETS.md) +- [TOKEN_AGGREGATION_REPORT_API_RUNBOOK](TOKEN_AGGREGATION_REPORT_API_RUNBOOK.md) +- [CMC_COINGECKO_SUBMISSION_RUNBOOK](coingecko/CMC_COINGECKO_SUBMISSION_RUNBOOK.md) +- [IPFS_TOKEN_LOGOS_RUNBOOK](IPFS_TOKEN_LOGOS_RUNBOOK.md) — IPFS hosting for all logos (explorers, token lists) +- [REPOSITORIES_AND_PRS_CHAIN138](../../00-meta/REPOSITORIES_AND_PRS_CHAIN138.md) diff --git a/docs/04-configuration/GRU_M00_DIAMOND_DOCS_REVIEW_GAPS_AND_INCONSISTENCIES.md b/docs/04-configuration/GRU_M00_DIAMOND_DOCS_REVIEW_GAPS_AND_INCONSISTENCIES.md new file mode 100644 index 0000000..5690e1c --- /dev/null +++ b/docs/04-configuration/GRU_M00_DIAMOND_DOCS_REVIEW_GAPS_AND_INCONSISTENCIES.md @@ -0,0 +1,114 @@ +# GRU M00 Diamond Docs — Gaps and Inconsistencies Review + +**Purpose:** Single review of all GRU M00 Diamond–related documentation for gaps, broken or ambiguous references, and internal inconsistencies. Covers the Facet Map, the Review (Gaps & Recommendations), index/README links, and related references. + +**Scope:** [GRU_M00_DIAMOND_FACET_MAP.md](GRU_M00_DIAMOND_FACET_MAP.md), [GRU_M00_DIAMOND_REVIEW_GAPS_AND_RECOMMENDATIONS.md](GRU_M00_DIAMOND_REVIEW_GAPS_AND_RECOMMENDATIONS.md), [README](README.md), [MASTER_INDEX](../MASTER_INDEX.md), [SUBMODULE_RELATIONSHIP_MAP](../11-references/SUBMODULE_RELATIONSHIP_MAP.md), and linked targets. + +**Status:** Post–review. All “Still open” items completed: institutional spec created, token model and Pattern A locked, GRU Diamond evolution note added, MASTER_INDEX Review row updated with TOKEN_SCOPE_GRU and VAULT_SYSTEM. + +--- + +## 1. Missing Documents / Broken References + +| Item | Where referenced | Issue | Resolution | +|------|------------------|--------|------------| +| **GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md** | Facet Map “Related documents”; Review §2.1, §5.1, §6 checklist, §7 | **Resolved:** File created with full §1–§8; token model A and Pattern A locked; GRC vs M00 evolution note added. | +| **Institutional whitepaper §1–§8** | Facet Map: “or institutional whitepaper §1–§8” | **Resolved:** GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md is the canonical §1–§8 in repo. | + +--- + +## 2. Link and Path Consistency + +| Link | From | Target | Status | +|------|------|--------|--------| +| GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md | Facet Map, Review | Same directory (04-configuration) | Target missing; path correct. | +| GRU_M00_DIAMOND_REVIEW_GAPS_AND_RECOMMENDATIONS.md | Facet Map | Same directory | OK. | +| gru-docs/contracts/README.md | Facet Map, Review | ../../gru-docs/contracts/README.md | OK (submodule at repo root). | +| SUBMODULE_RELATIONSHIP_MAP.md | Facet Map | ../11-references/SUBMODULE_RELATIONSHIP_MAP.md | OK. | +| TOKEN_SCOPE_GRU.md | Facet Map, Review | ../../smom-dbis-138/docs/tokenization/TOKEN_SCOPE_GRU.md | OK. | +| VAULT_SYSTEM_MASTER_TECHNICAL_PLAN.md | Facet Map, Review | ../VAULT_SYSTEM_MASTER_TECHNICAL_PLAN.md (docs root) | OK. | +| SMART_CONTRACTS_ISO20022_FIN_METHODOLOGY.md | Review §7 | Same directory | OK. | +| REQUIRED_FIXES_UPDATES_GAPS.md | Review §7 | ../REQUIRED_FIXES_UPDATES_GAPS.md | OK. | +| MASTER_INDEX “Related” for Review | MASTER_INDEX | GRU_M00_DIAMOND_FACET_MAP.md, REQUIRED_FIXES_UPDATES_GAPS.md | Paths are doc-relative (no leading docs/); correct from docs/MASTER_INDEX.md. | + +**Recommendation:** Add a one-line “Document status” at the top of the Facet Map: “Institutional spec: see GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md (when present) or external whitepaper.” So the missing file is clearly optional. + +--- + +## 3. Terminology and Naming Consistency + +| Topic | Facet Map | Review | Inconsistency / resolution | +|-------|-----------|--------|----------------------------| +| **Ownership vs Governance** | “OwnershipFacet (or use GovernanceFacet)” | “GovernanceFacet” in checklist | Intentional: both names valid; M00 may use one. No change. | +| **Gate vs GateFacet** | Diagram: “ComplianceGate”; table: “ComplianceGateFacet (stub)” | “ComplianceGate” / “ComplianceGateFacet” | Logical gate vs implementing facet. Consistent. | +| **Minimum ship list – gates** | §2.1 lists ComplianceGateFacet, AccountingGateFacet only (no Messaging/Reserve as stubs) | §2.6 and §2.7 list all four gates; §2.7 minimum list names only Compliance + Accounting stubs | Facet Map diagram shows 4 gates; minimum list names 2 gate stubs. Align by either (1) adding “MessagingGateFacet (stub), ReserveGateFacet (stub)” to Facet Map §2.1 minimum list, or (2) adding a sentence in Facet Map: “Minimum ship: Compliance and Accounting gate stubs; Messaging and Reserve can be added later.” | +| **TokenFactoryFacet vs MarketFactory + AssetRegistry** | “TokenFactoryFacet” in minimum list with “(or consolidated MarketFactoryFacet + AssetRegistryFacet)” | “TokenFactoryFacet (or unify AssetRegistry + MarketFactory)” | Same intent. OK. | +| **a/d vs ac/vdc/sdc** | §5 uses a\, d\; §5.5 now maps a↔ac, d↔vdc/sdc | §4.1 recommends adding this mapping | Fixed in Facet Map §5.5. | + +--- + +## 4. Cross-Doc Content Gaps + +| Gap | Description | Suggested fix | +|-----|-------------|----------------| +| **Token model not locked** | Facet Map said “[ A \| B \| C ]”; no doc locked a choice. | **Fixed:** Institutional spec §8 locks **Token model A**; Facet Map “Token model” line updated to “A (locked)” with link to spec §8. | +| **Pattern A vs B** | Review recommended documenting “Target: Pattern A.” | **Fixed:** Institutional spec §6 locks **Target: Pattern A**; Facet Map “Target pattern” line added with link to spec §6. | +| **GRC-2535 vs M00 relationship** | Two Diamond designs; migration path undefined. | **Fixed:** Institutional spec now has “GRU Diamond evolution (GRC-2535 vs M00)” at top: GRC = current, M00 = extension/replacement; decision = migrate vs new deploy. | +| **Four gates vs two stubs** | See §3 above. | **Fixed:** Facet Map §2.2 now states that the minimum ship list includes Compliance and Accounting gate stubs and that Messaging/Reserve may follow in a later phase. | + +--- + +## 5. Index and README Consistency + +| Location | Content | Issue | +|----------|---------|--------| +| **04-configuration/README.md** | Lists Facet Map and Review under “Smart contracts & ISO-20022.” | No issue. Order: Facet Map then Review. | +| **MASTER_INDEX.md** | “GRU Diamond / Smart contracts” subsection with Facet Map and Review rows. | **Fixed:** Review row “Related Documents” now includes TOKEN_SCOPE_GRU and VAULT_SYSTEM_MASTER_TECHNICAL_PLAN; institutional spec row added. | +| **SUBMODULE_RELATIONSHIP_MAP** | gru-docs row notes same repo as GRU-Official-Docs-Monetary-Policies and standalone path. | Consistent with Facet Map and Review. | + +--- + +## 6. Internal Consistency Within Each Doc + +### 6.1 Facet Map + +- Section numbering 1–5 and 5.1–5.5 is consistent. +- Governance levels table has 6 rows (0–5); header matches. +- Diagram node IDs (M00, DiamondCut, etc.) match table names; “GovLevel” in diagram = “GovernanceLevelFacet” in table. OK. +- **Fixed:** §5.5 now documents a↔ac, d↔vdc/sdc per Review recommendation. + +### 6.2 Review (Gaps and Recommendations) + +- Section numbering 1–7 is consistent. +- Checklist in §6 has 12 items; “Institutional spec doc” and “Token model A/B/C locked” appear; both depend on creating/locking in other docs. OK. +- References in §7 to “(To be added)” for institutional spec are consistent with §2.1 and §5.1. +- “smom-dbis-138” in References is a directory path; link to TOKEN_SCOPE_GRU is the specific doc. No conflict. + +--- + +## 7. Summary of Fixes Applied in This Review + +1. **Facet Map:** Added §5.5 “Mapping to deployed token names (a/d vs ac/vdc/sdc)” and a link to TOKEN_SCOPE_GRU so the recommended a↔ac, d↔vdc/sdc alignment is documented in the Facet Map. + +--- + +## 8. Recommended Follow-Up — Completed + +1. **Done:** Created **GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md** with full §1–§8; linked from Facet Map and Review. +2. **Done:** Locked **token model A** and **Pattern A** in institutional spec (§8 and §6); updated Facet Map “Token model” and “Target pattern” lines. +3. **Done earlier:** Facet Map §2.2 already clarifies minimum ship list (Compliance + Accounting gate stubs; Messaging/Reserve may follow). +4. **Done:** Added **“GRU Diamond evolution (GRC-2535 vs M00)”** at top of institutional spec (migrate vs new deploy). +5. **Done:** Added TOKEN_SCOPE_GRU and VAULT_SYSTEM_MASTER_TECHNICAL_PLAN to MASTER_INDEX “Related” for the Review row. + +--- + +## 9. Related Documents + +- [GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md](GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md) — §1–§8 institutional spec (token model A, Pattern A, GRC vs M00 evolution). +- [GRU_M00_DIAMOND_FACET_MAP.md](GRU_M00_DIAMOND_FACET_MAP.md) +- [GRU_M00_DIAMOND_REVIEW_GAPS_AND_RECOMMENDATIONS.md](GRU_M00_DIAMOND_REVIEW_GAPS_AND_RECOMMENDATIONS.md) +- [README.md](README.md) (04-configuration) +- [MASTER_INDEX.md](../MASTER_INDEX.md) +- [SUBMODULE_RELATIONSHIP_MAP.md](../11-references/SUBMODULE_RELATIONSHIP_MAP.md) +- [TOKEN_SCOPE_GRU.md](../../smom-dbis-138/docs/tokenization/TOKEN_SCOPE_GRU.md) +- [VAULT_SYSTEM_MASTER_TECHNICAL_PLAN.md](../VAULT_SYSTEM_MASTER_TECHNICAL_PLAN.md) diff --git a/docs/04-configuration/GRU_M00_DIAMOND_FACET_MAP.md b/docs/04-configuration/GRU_M00_DIAMOND_FACET_MAP.md new file mode 100644 index 0000000..86a0e7b --- /dev/null +++ b/docs/04-configuration/GRU_M00_DIAMOND_FACET_MAP.md @@ -0,0 +1,202 @@ +# GRU M00 Diamond — Facet Map and Module List (Whitepaper) + +**Purpose:** Single-page reference for the GRU M00 Diamond (ERC-2535) Token Factory architecture. For Solidity engineers and whitepaper authors. All c/a/d token families are implemented as upgradeable facets; storage and governance placeholders support IPSAS, IFRS/US GAAP, ISO-20022, i18n, and future governance levels. + +**Token model:** **A** (locked). Separate ERC-20 contracts deployed by GRU (Aave-like). See [institutional spec §8](GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md#8-one-key-design-decision-you-should-lock). **Target pattern:** **A** (one factory, many assets); Pattern B only for flagship USD/EUR if needed. See [institutional spec §6](GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md#6-what-upgradeable-facet-per-iso-means-practical). + +--- + +## 1. Facet Map (Mermaid) + +```mermaid +flowchart TB + subgraph diamond [GRU M00 Diamond] + M00[M00 Diamond] + end + + subgraph core [Core Facets] + DiamondCut[DiamondCutFacet] + DiamondLoupe[DiamondLoupeFacet] + Ownership[OwnershipFacet] + Pause[PauseFacet] + end + + subgraph tokenFactory [Token Factory Facets] + AssetRegistry[AssetRegistryFacet] + MarketFactory[MarketFactoryFacet] + MintBurn[MintBurnFacet] + InterestRate[InterestRateFacet] + BridgeWrap[BridgeWrapFacet] + DWIN[DWINFacet] + end + + subgraph standards [Standards and Compliance Facets] + IPSAS[IPSASFacet] + IFRS[IFRSUSGAAPFacet] + ISO20022[ISO20022Facet] + i18n[i18nFacet] + GovLevel[GovernanceLevelFacet] + end + + subgraph gates [Policy Gates] + PolicyRouter[PolicyRouterFacet] + ComplianceGate[ComplianceGate] + AccountingGate[AccountingGate] + MessagingGate[MessagingGate] + ReserveGate[ReserveGate] + end + + M00 --> DiamondCut + M00 --> DiamondLoupe + M00 --> Ownership + M00 --> Pause + M00 --> AssetRegistry + M00 --> MarketFactory + M00 --> MintBurn + M00 --> InterestRate + M00 --> BridgeWrap + M00 --> DWIN + M00 --> IPSAS + M00 --> IFRS + M00 --> ISO20022 + M00 --> i18n + M00 --> GovLevel + M00 --> PolicyRouter + PolicyRouter --> ComplianceGate + PolicyRouter --> AccountingGate + PolicyRouter --> MessagingGate + PolicyRouter --> ReserveGate +``` + +--- + +## 2. Exact Facet Names + +### 2.1 Facets by family + +| Facet name | Role | Notes | +|------------|------|--------| +| **Core** | | | +| DiamondCutFacet | Upgrade mechanism | ERC-2535 diamondCut | +| DiamondLoupeFacet | Introspection | facets, facetAddress, selectors | +| OwnershipFacet | Admin / governance | Owner, timelock, upgrade approval (or use GovernanceFacet) | +| PauseFacet | Risk controls | Global and per-selector pause (GuardianFacet alias) | +| **Token Factory** | | | +| AssetRegistryFacet | Asset definitions | ISO code, type, decimals; W positional semantics; assetId hash | +| MarketFactoryFacet | Market creation | Emits c/a/d token contracts per ISO asset | +| MintBurnFacet | Supply controls | Mint/burn rules, reserve gating, supply caps, emergency locks | +| InterestRateFacet | Aave-style indices | Index math for a/d; rate model plug-ins; accrual triggers | +| BridgeWrapFacet | W-before-ISO | Wrapped bridge; escrow proofs; bridge operators | +| DWINFacet | W-after-T/C | D-WIN; denomination logic; optional windowing rules | +| **Standards / Compliance** | | | +| IPSASFacet | Public sector accounting | GRU ledger ↔ IPSAS reporting; fund accounting | +| IFRSUSGAAPFacet | IFRS / US GAAP | Revenue recognition, lease/contract hooks, impairment/reserve reporting | +| ISO20022Facet | Message builders | pacs/camt payloads; dictionary mapping; settlement correlation | +| i18nFacet | Internationalization | Locale packs, translation keys, disclosure templates | +| GovernanceLevelFacet | Policy levels | Reads policy bitmask; routes enforcement per level 0..N | +| **Minimum ship list (stubs)** | | | +| PolicyRouterFacet | Gate orchestration | Calls Compliance, Accounting, Messaging, Reserve gates | +| ComplianceGateFacet | Stub | Allowlist/denylist, jurisdiction tags placeholders | +| AccountingGateFacet | Stub | Journal entry and chart-of-accounts placeholders | +| StandardsRegistryFacet | Module activation | Activate/deactivate modules; enforce required modules per governance level | + +### 2.2 Gates (used by PolicyRouter) + +| Gate | Purpose | +|------|---------| +| ComplianceGate | checkTransfer (KYC/AML, sanctions, jurisdiction) | +| AccountingGate | postJournal (ledger entries, CoA) | +| MessagingGate | logISO20022 (message logging, correlation IDs) | +| ReserveGate | checkBacking (reserve proofs, attestations) | + +Each gate is replaceable via facet upgrade. The **minimum ship list** (§2.1) explicitly includes ComplianceGateFacet and AccountingGateFacet stubs; MessagingGate and ReserveGate may be stubbed or implemented in a later phase. + +--- + +## 3. Storage Namespaces (GRUStorage) + +App storage is centralized in **GRUStorage** with namespaced domains so upgrades do not break state. + +| Namespace / domain | Contents | +|--------------------|----------| +| Governance & roles | DAO / Council / Guardian roles; emergency pause authorities; upgrade admin; timelock address; policy controllers per module | +| Token Factory Registry | assetId → token addresses (c, a, d); symbol → assetId; per-asset config (decimals, mint rules, chain domain, W positioning) | +| Accounting / Ledger | Journal entries (debits/credits); chart of accounts; cost centers / funds / projects; per-asset reserve attestations; policy metadata hashes | +| Compliance & Identity | KYC/AML allowlists; jurisdiction tags; sanctions flags; travel rule metadata pointers; audit proof roots | +| ISO-20022 Message Vault | Message schemas registry; outbound/inbound message logs; canonicalization hashes; correlation IDs for settlement events | +| i18n Registry | Locale packs (hash pointers); translation keys for UI/clients; multi-jurisdiction disclosure templates | +| Expandable Standards Registry | standardId → moduleConfig: enabled, version, validator contracts, policy-level constraints, data namespace pointers | + +--- + +## 4. Governance Levels (0–5) + +GovernanceLevelFacet reads the policy bitmask; PolicyRouter calls the gates according to the active level. **Default at deployment:** level **0** (Free / devnet / sandbox); set via GovernanceLevelFacet after init. See [GRU_M00_DIAMOND_DEPLOYMENT_RUNBOOK.md](../runbooks/GRU_M00_DIAMOND_DEPLOYMENT_RUNBOOK.md) and institutional spec. + +| Level | Name | KYC | Reserves | ISO-20022 | Accounting | Transfer restrictions | Timelock / attestors | +|-------|------|-----|----------|-----------|-------------|----------------------|----------------------| +| 0 | Free / devnet / sandbox | No | No | No | No | None | Minimal | +| 1 | KYC optional + audit | Optional | No | No | Audit logs | None | Standard | +| 2 | KYC required + proofs | Required | Reserve proofs | Logging | Journal optional | Per policy | Standard | +| 3 | IPSAS/IFRS enforced | Required | Reserve proofs | Logging | Journal mandatory | Restricted sets | Extended | +| 4 | Sovereign / regulated | Required | Attestations | Full | Full reporting | Restricted + allowlists | Multi-sig, attestors | +| 5 | Maximum compliance | Required | Full attestations | Full | Full + disclosures | Strict allowlists | Long timelocks, external attestors | + +--- + +## 5. Canonical Symbol Grammar + +Enforced in **AssetRegistryFacet** with deterministic parsing. + +### 5.1 Market artifacts per ISO-4217 + +| Prefix | Meaning | Example | +|--------|---------|---------| +| c\\ | Base compliant eMoney | cUSDC, cEURCT | +| a\\ | Asset token / claim index | aUSDC, aEURCT | +| d\\ | Debt token / liability index | dUSDC, dEURCT | + +\ = issuer/type suffix (e.g. T = Tether, C = Circle-style). + +### 5.2 W rules + +- **W before ISO (wrapped bridge):** `W` precedes the ISO code. + Examples: `cWUSDT`, `aWUSDT`, `dWUSDT`. +- **W after T/C (D-WIN):** `W` follows the T or C suffix. + Examples: `cUSDTW`, `aUSDTW`, `dUSDTW`. + +### 5.3 BNF-style summary + +``` +symbol := (c|a|d) iso_suffix | (c|a|d) W iso_suffix | (c|a|d) iso_suffix W +iso_suffix := e.g. USDC, USDT, EURCT, EURCC +``` + +### 5.4 Examples + +| Symbol | Interpretation | +|--------|----------------| +| cUSDC | Compliant base eMoney, USD (Circle-style) | +| aEURCT | Asset token, EUR (Tether) | +| dWUSDT | Debt token, wrapped USDT (bridge) | +| cUSDTW | Compliant base, USDT D-WIN (denomination/windowing) | + +### 5.5 Mapping to deployed token names (a/d vs ac/vdc/sdc) + +The canonical grammar uses **a** (asset) and **d** (debt). In the codebase and [TOKEN_SCOPE_GRU](../../smom-dbis-138/docs/tokenization/TOKEN_SCOPE_GRU.md), the same roles use Aave-style names: **a** ↔ **ac** (DepositToken, e.g. acUSDC, acUSDT), **d** ↔ **vdc** / **sdc** (DebtToken, e.g. vdcUSDC, sdcUSDC). The registry may store either form (aUSDC or acUSDC); both denote the same asset token type. + +### 5.6 ISO-4217 Compliant Token Matrix (native / bridged) + +The grammar above aligns with the [ISO4217 Compliant Token Matrix](ISO4217_COMPLIANT_TOKEN_MATRIX.md): native symbols 6-char (`c` + FinChain + ISO + Type), bridged 7-char (`c` + `W` + OriginFinChain + ISO + Type). **ChainID 138 only:** native symbols are v0 (no designator) — `cUSDC`, `cUSDT`; the X is left out. X is used only for origin reference (e.g. bridged `cWXUSDC` on other chains). Registry maps v0 → identity for reporting. + +--- + +## Related documents + +- **Full architecture spec:** [GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md](GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md) (§1–§8, token model and Pattern A locked). +- **Detailed review (gaps, wire-ins, recommendations):** [GRU_M00_DIAMOND_REVIEW_GAPS_AND_RECOMMENDATIONS.md](GRU_M00_DIAMOND_REVIEW_GAPS_AND_RECOMMENDATIONS.md). +- **Docs review (gaps and inconsistencies):** [GRU_M00_DIAMOND_DOCS_REVIEW_GAPS_AND_INCONSISTENCIES.md](GRU_M00_DIAMOND_DOCS_REVIEW_GAPS_AND_INCONSISTENCIES.md). +- **Existing Diamond (GRC-2535):** [gru-docs/contracts/README.md](../../gru-docs/contracts/README.md). The GRU docs repo is also available as a standalone clone (e.g. **GRU-Official-Docs-Monetary-Policies**); in this repo it is the submodule `gru-docs/`. See [SUBMODULE_RELATIONSHIP_MAP.md](../11-references/SUBMODULE_RELATIONSHIP_MAP.md). +- **Token scope (c/a/d, W):** [smom-dbis-138/docs/tokenization/TOKEN_SCOPE_GRU.md](../../smom-dbis-138/docs/tokenization/TOKEN_SCOPE_GRU.md). +- **ISO-4217 compliant symbol matrix (native/bridged, v0/v1):** [ISO4217_COMPLIANT_TOKEN_MATRIX.md](ISO4217_COMPLIANT_TOKEN_MATRIX.md). +- **Vault / M00 reference:** [VAULT_SYSTEM_MASTER_TECHNICAL_PLAN.md](../VAULT_SYSTEM_MASTER_TECHNICAL_PLAN.md). diff --git a/docs/04-configuration/GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md b/docs/04-configuration/GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md new file mode 100644 index 0000000..b6efd26 --- /dev/null +++ b/docs/04-configuration/GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md @@ -0,0 +1,175 @@ +# GRU M00 Diamond — Institutional Architecture Spec + +**Purpose:** Buildable blueprint for a single “giant Token Factory” inside the GRU ERC-2535 Diamond. Each currency + a/d token family is implemented as an upgradeable facet set; the GRU Diamond contains governance + storage placeholders for IPSAS, IFRS/US GAAP, ISO-20022, i18n, and future governance levels. Hand-off for whitepaper/tech spec and Solidity engineers. + +**Related:** [GRU_M00_DIAMOND_FACET_MAP.md](GRU_M00_DIAMOND_FACET_MAP.md) (single-page facet map, storage namespaces, governance levels, symbol grammar) | [GRU_M00_DIAMOND_REVIEW_GAPS_AND_RECOMMENDATIONS.md](GRU_M00_DIAMOND_REVIEW_GAPS_AND_RECOMMENDATIONS.md) (gaps and wire-ins). + +--- + +## GRU Diamond evolution (GRC-2535 vs M00) + +**GRC-2535** (in [gru-docs/contracts](../../gru-docs/contracts/README.md)) is the current GRU Diamond: GrcDiamond + GRCStorage + Monetary, Triangulation, Index, Bond, Audit, Governance, Access, Pause facets. **M00 Diamond** extends or replaces it with the Token Factory, GRUStorage (seven domains), PolicyRouter + gates, and standards placeholders. **Decision:** Either (1) **migrate** GRC → M00 (same contract, add/replace facets and extend storage with reserved GRUStorage namespaces) or (2) **deploy M00 as a new Diamond** and deprecate GRC for token/market flows. Document the chosen path in the deployment runbook. + +**Existing registries:** Until M00 is deployed, **UniversalAssetRegistry** (smom-dbis-138) remains the source of truth for bridges and token lists. After M00 is live, migrate or mirror to GRUStorage.TokenFactoryRegistry and document the cutover. + +--- + +## 1) Diamond Topology Overview + +### Core Principle + +* **GRU = M00 Diamond (ERC-2535)** +* **All c-tokens + a-tokens + d-tokens** are minted/managed by **facets** attached to the GRU Diamond. +* Storage is centralized in **shared app storage** to ensure upgrades don’t break state. +* Governance is **layered and expandable**: policy modules are “plugged in” as facets without changing base state layout. + +**Key idea:** + +> “Tokens aren’t separate systems; they are *markets* inside the GRU Diamond, emitted as ERC-20 instances or ledgered as internal balance sheets, governed by standards modules.” + +--- + +## 2) Storage Layout (Permanent / Upgrade-Safe) + +### A) Diamond App Storage (GRUStorage) + +Use **placeholder storage** for many future standards: + +* a fixed storage struct (core) +* a **namespaced storage registry** for standards modules +* a **policy bitmask** and **module pointer map** + +#### Core Storage Domains + +1. **Governance & Roles** — DAO / Council / Guardian roles; emergency pause authorities; upgrade admin / timelock address; policy controllers (per module). +2. **Token Factory Registry** — mapping of `assetId → token addresses` (c, a, d variants); mapping of symbol → assetId (canonical parsing); per-asset configuration (decimals, mint rules, chain domain, W positioning, etc.). +3. **Accounting / Ledger** — Journal entries (debits/credits); chart of accounts; cost centers / funds / projects; per-asset reserve attestations; policy metadata hashes (auditable). Standards-neutral so IFRS/USGAAP/IPSAS can be added without refactoring. +4. **Compliance & Identity** — KYC/AML allowlists; jurisdiction tags; sanctions flags; travel rule metadata pointers; audit proof roots. +5. **ISO-20022 Message Vault** — Message schemas registry; outbound/inbound message logs; message “canonicalization” hashes; correlation IDs for settlement events. +6. **Internationalization (i18n) Registry** — Locale packs (hash pointers); translation keys for UI/client consumption; multi-jurisdiction disclosure templates. +7. **Expandable Standards Registry** — mapping `standardId => moduleConfig` (enabled flags, version, validator contracts, policy-level constraints, data namespace pointers). Enables “turning on” IPSAS or ISO-20022 without migrating storage. + +--- + +## 3) Facet Families (Modular + Upgradeable) + +### A) Core Diamond Facets (always present) + +* **DiamondCutFacet** (upgrade) +* **DiamondLoupeFacet** (introspection) +* **Ownership/GovernanceFacet** (admin model, timelocks) +* **Pause/GuardianFacet** (risk controls) + +### B) Token Factory Facets + +1. **AssetRegistryFacet** — create/modify asset definition (ISO code, type, decimals); enforce W positional semantics; generate assetId deterministic hash. +2. **MarketFactoryFacet** — create a “market” for a given ISO asset; emit token contracts for **c** (compliant base), **a** (asset/claim), **d** (debt/liability). +3. **MintBurnFacet** — mint/burn rules; reserve gating; supply caps; emergency locks. +4. **InterestRateFacet (Aave-style)** — index math for a/d behavior; rate model plug-ins (stable/variable); accrual triggers. +5. **BridgeWrapFacet** — **W before ISO** assets (wrapped bridge); escrow proofs; bridge operators / trust model. +6. **DWINFacet** — **W after T/C** (D-WIN); denomination logic; optional “windowing” rules (maturity, buckets, liquidity windows). + +### C) Standards / Compliance Facets (placeholders, expandable later) + +* **IPSASFacet** — GRU ledger ↔ IPSAS reporting; fund accounting. +* **IFRS/USGAAPFacet** — Revenue recognition; lease/contract classification hooks; impairment / reserve adequacy reporting. +* **ISO20022Facet** — Message builders (pacs/camt); standard dictionary mapping per assetId; settlement event correlation. +* **i18nFacet** — Multi-language disclosure strings by jurisdiction; “legal label packs” versioned and signed. +* **GovernanceLevelFacet** — Policy levels 0..N; each level toggles KYC, transfer restrictions, message logging, accounting journal mandatory, oracle requirements, timelock durations, which standards must be enabled. Reads **policy bitmask** in storage and routes enforcement. + +--- + +## 4) Governance Model (Expandable + Imposed Levels) + +* **Level 0:** Free / devnet / sandbox rules. +* **Level 1:** KYC optional + audit logs. +* **Level 2:** KYC required + reserve proofs + ISO-20022 logging. +* **Level 3:** IPSAS/IFRS reporting enforced + restricted transfer sets. +* **Level 4+:** Sovereign/regulated regime enforcement + multi-sig + external attestors + longer timelocks. + +**Implementation:** A **PolicyRouter** (facet) calls ComplianceGate.checkTransfer(...), AccountingGate.postJournal(...), MessagingGate.logISO20022(...), ReserveGate.checkBacking(...). Each gate is replaceable via facet upgrade. + +--- + +## 5) How Currency Codes Become “Markets” Inside GRU + +For each ISO-4217 code (USD, EUR, JPY, etc.): + +* **c\\** (base compliant eMoney) +* **a\\** (asset token / claim index) +* **d\\** (debt token / liability index) + +**W rules:** Wrapped bridge = `W` before ISO (e.g. aWUSDT, dWUSDT, cWUSDT). D-WIN = `W` after T/C (e.g. aUSDTW, dUSDTW, cUSDTW). Enforced in **AssetRegistryFacet** with deterministic parsing. + +--- + +## 6) What “Upgradeable Facet per ISO” Means (Practical) + +**Pattern A (recommended): One Factory, Many Assets (data-driven)** — One set of facets supports unlimited assets via config records. Safer: fewer upgrades, less surface area. + +**Pattern B (if required): “Facet Packs” per asset family** — For major markets (USD/EUR), deploy specialized facets (special rate model, compliance regime, settlement rules). Storage remains standard. + +**Target (locked):** **Pattern A** as default. **Pattern B** only for flagship USD/EUR asset families if required. + +--- + +## 7) Minimum Placeholder Checklist (What GRU must include now) + +1. **AppStorage skeleton** — module registry; policy bitmask; ledger/journal base structs; ISO-20022 log structs; i18n registry structs. +2. **GovernanceFacet** — role-based access control; timelock hooks; upgrade approval workflow. +3. **PolicyRouterFacet** — empty gates initially, but callable; emits events for auditability. +4. **TokenFactoryFacet** — can register assets; can deploy token instances (or ledgered balances if internal accounting). +5. **ComplianceGateFacet (stub)** — allowlist/denylist placeholder; jurisdiction tags placeholder. +6. **AccountingGateFacet (stub)** — journal entry emission placeholder; chart of accounts placeholder. +7. **StandardsRegistryFacet** — activate/deactivate modules; enforce “required modules for governance level X.” + +--- + +## 8) One Key Design Decision You Should Lock + +**Are tokens:** + +* **A)** Separate ERC-20 contracts deployed by GRU (Aave-like) +* **B)** Internal ledger balances inside GRU with ERC-20 views +* **C)** Hybrid: ERC-20 external interface, authoritative balances in GRU ledger (tokens as thin proxies) + +For DeFi compatibility, **A** is simplest. For sovereign accounting + ISO-20022 tight control, **B** is more “bank-core-like.” + +**Locked decision:** **Token model A** (separate ERC-20 contracts deployed by GRU, Aave-like). For DeFi compatibility and simplest integration. B or C may be chosen later if sovereign/accounting requirements dictate. + +--- + +## Deployment target chain and CREATE2 + +- **Primary chain:** Chain 138 (DeFi Oracle Meta Mainnet) first; then mainnet (1), 651940 (ALL Mainnet), or other EVM chains as needed. +- **CREATE2:** Use CREATE2 when the same M00 Diamond address is required across chains; otherwise CREATE is acceptable for single-chain (e.g. 138-only) deployment. +- **Default governance level at deployment:** **0** (Free / devnet / sandbox). Set via GovernanceLevelFacet after init. For production, set to 1 or 2 (or per policy) in a separate init step. +- **Runbook:** [GRU_M00_DIAMOND_DEPLOYMENT_RUNBOOK.md](../runbooks/GRU_M00_DIAMOND_DEPLOYMENT_RUNBOOK.md). + +--- + +## Appendix: PolicyRouter and gate event signatures + +For auditability and indexers, PolicyRouter and gates SHOULD emit the following events (or equivalent). Implement when building the spine. + +| Event | Signature (semantic) | Emitted by | +|-------|----------------------|------------| +| **TransferChecked** | `TransferChecked(address from, address to, address token, uint256 amount, bool allowed, bytes32 reason)` | PolicyRouter after ComplianceGate.checkTransfer | +| **JournalPosted** | `JournalPosted(bytes32 journalId, bytes32 coaRef, uint256 amount, address token)` | PolicyRouter after AccountingGate.postJournal | +| **MessageLogged** | `MessageLogged(bytes32 correlationId, bytes32 payloadHash, string msgType)` | PolicyRouter after MessagingGate.logISO20022 | +| **BackingChecked** | `BackingChecked(bytes32 assetId, uint256 amount, bool sufficient, bytes32 attestationHash)` | PolicyRouter after ReserveGate.checkBacking | +| **GovernanceLevelSet** | `GovernanceLevelSet(uint8 previousLevel, uint8 newLevel)` | GovernanceLevelFacet when level is updated | + +Use indexed parameters where appropriate (e.g. `indexed address token`, `indexed bytes32 correlationId`) for efficient filtering. Full ABI and parameter types to be defined in the implementation. + +--- + +## Related documents + +- [GRU_M00_DIAMOND_FACET_MAP.md](GRU_M00_DIAMOND_FACET_MAP.md) — Facet map, storage namespaces, governance levels 0–5, canonical symbol grammar. +- [GRU_M00_DIAMOND_REVIEW_GAPS_AND_RECOMMENDATIONS.md](GRU_M00_DIAMOND_REVIEW_GAPS_AND_RECOMMENDATIONS.md) — Missing components, wire-ins, recommendations. +- [GRU_M00_DIAMOND_DOCS_REVIEW_GAPS_AND_INCONSISTENCIES.md](GRU_M00_DIAMOND_DOCS_REVIEW_GAPS_AND_INCONSISTENCIES.md) — Docs review (gaps and inconsistencies). +- [gru-docs/contracts/README.md](../../gru-docs/contracts/README.md) — GRC-2535 Diamond. +- [TOKEN_SCOPE_GRU.md](../../smom-dbis-138/docs/tokenization/TOKEN_SCOPE_GRU.md) — c/a/d and W token lists. +- [VAULT_SYSTEM_MASTER_TECHNICAL_PLAN.md](../VAULT_SYSTEM_MASTER_TECHNICAL_PLAN.md) — Vault and M00 reference. +- [GRU_M00_DIAMOND_DEPLOYMENT_RUNBOOK.md](../runbooks/GRU_M00_DIAMOND_DEPLOYMENT_RUNBOOK.md) — Deploy or migrate M00; target chain, CREATE2, default governance level, testing. diff --git a/docs/04-configuration/GRU_M00_DIAMOND_REVIEW_GAPS_AND_RECOMMENDATIONS.md b/docs/04-configuration/GRU_M00_DIAMOND_REVIEW_GAPS_AND_RECOMMENDATIONS.md new file mode 100644 index 0000000..6d12d23 --- /dev/null +++ b/docs/04-configuration/GRU_M00_DIAMOND_REVIEW_GAPS_AND_RECOMMENDATIONS.md @@ -0,0 +1,263 @@ +# GRU M00 Diamond — Detailed Review: Gaps, Wire-Ins, and Recommendations + +**Purpose:** Structured review of the GRU M00 Diamond (ERC-2535) Token Factory architecture against the current codebase and docs. Covers missing components, functional wire-ins to complete, naming/alignment gaps, and actionable recommendations. + +**References:** [GRU_M00_DIAMOND_FACET_MAP.md](GRU_M00_DIAMOND_FACET_MAP.md), [gru-docs/contracts/README.md](../../gru-docs/contracts/README.md) (GRU docs; same repo as **GRU-Official-Docs-Monetary-Policies** when cloned standalone), [smom-dbis-138](../smom-dbis-138), [VAULT_SYSTEM_MASTER_TECHNICAL_PLAN.md](../VAULT_SYSTEM_MASTER_TECHNICAL_PLAN.md). + +--- + +## 1. Executive Summary + +| Area | Status | Summary | +|------|--------|---------| +| **Spec vs implementation** | Gap | Facet Map describes M00 Diamond + GRUStorage + PolicyRouter + gates; repo has GRC-2535 Diamond (different facets) and standalone UniversalAssetRegistry/TokenFactory/VaultFactory — no single M00 Diamond yet. | +| **Missing components** | Multiple | Institutional spec doc, GRUStorage layout, PolicyRouter + four gates (on-chain), Token Factory facets (AssetRegistry, MarketFactory, MintBurn, InterestRate, BridgeWrap, DWIN), Standards facets (IPSAS, IFRS, ISO20022, i18n, GovernanceLevel), minimum ship stubs. | +| **Wire-ins** | Incomplete | No Diamond → Token Factory wiring; no PolicyRouter → gate calls; no governance level bitmask → enforcement; off-chain ComplianceGate (dbis_core) not mirrored on-chain. | +| **Naming alignment** | Gap | Spec grammar uses **a**\, **d**\; deployed/specified tokens use **ac***, **vdc***/sdc* — need explicit mapping or doc alignment. | + +--- + +## 2. Missing Components + +### 2.1 Documentation + +| Item | Description | Recommendation | +|------|-------------|-----------------| +| **GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md** | Full §1–§8 institutional architecture spec (Diamond topology, storage, facets, governance, markets, W rules, Pattern A/B, minimum checklist, token model A/B/C). | **Done:** [GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md](GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md) created; token model A and Pattern A locked; GRC vs M00 evolution note added. | +| **Token model decision** | Facet Map had “[ A \| B \| C ]”; locked choice was missing. | **Done:** Institutional spec §8 locks **Token model A**; Facet Map updated to “A (locked).” | +| **Pattern A vs B** | Target pattern was not stated. | **Done:** Institutional spec §6 locks **Target: Pattern A**; Facet Map “Target pattern” line added. | + +### 2.2 Storage (GRUStorage) + +| Domain | Facet Map / Spec | Current State | Gap | +|--------|------------------|---------------|-----| +| Governance & roles | DAO/Council/Guardian, upgrade admin, timelock, policy controllers | GRCStorage has Gov (timelock, quorum, proposals), Access (role bits), no DAO/Council/Guardian names. | Add GRUStorage namespace constants and structs for governance; align or migrate from GRCStorage if M00 supersedes GRC. | +| Token Factory Registry | assetId → (c,a,d) addresses; symbol → assetId; per-asset config | UniversalAssetRegistry has token → UniversalAsset (type, compliance, metadata); no assetId, no c/a/d triple per asset. | Define GRUStorage.TokenFactoryRegistry (or equivalent) with assetId, symbol→assetId, and c/a/d address triple; or document migration path from UniversalAssetRegistry. | +| Accounting / Ledger | Journal entries, CoA, cost centers, reserve attestations, policy hashes | Not in Diamond; OMNL/Fineract off-chain. No on-chain journal/CoA structs. | Add GRUStorage.Accounting placeholder structs (journal entry, CoA slot, attestation hashes) for AccountingGateFacet stub. | +| Compliance & Identity | KYC/AML allowlists, jurisdiction, sanctions, travel rule, audit roots | ComplianceGuard (iso4217w) validates mint/reserve only; no allowlist/jurisdiction/sanctions in contracts. dbis_core has ComplianceGateService (sanctions/AML). | Add GRUStorage.Compliance placeholder (allowlist/denylist, jurisdiction tags); wire ComplianceGate to it or to external oracle. | +| ISO-20022 Message Vault | Schema registry, in/out logs, canonicalization hashes, correlation IDs | SMART_CONTRACTS_ISO20022_FIN_METHODOLOGY defines canonical struct; no on-chain vault or log storage. | Add GRUStorage.ISO20022Vault (or event-only + off-chain index); implement MessagingGate.logISO20022. | +| i18n Registry | Locale packs, translation keys, disclosure templates | Not present in any contract. | Add GRUStorage.i18n placeholder (locale keys, hash pointers); i18nFacet stub reads from it. | +| Expandable Standards Registry | standardId → moduleConfig (enabled, version, validators, constraints, pointers) | Not present. | Add GRUStorage.StandardsRegistry; StandardsRegistryFacet activate/deactivate modules and enforce “required modules per governance level.” | + +### 2.3 Core Diamond Facets + +| Facet | Spec | Current State | Gap | +|-------|------|---------------|-----| +| DiamondCutFacet | Upgrade mechanism | GrcDiamond has diamondCut inline; no separate facet. | OK if M00 keeps cut in core; else extract to DiamondCutFacet. | +| DiamondLoupeFacet | Introspection | GrcDiamond has loupe inline. | Same as above. | +| OwnershipFacet / GovernanceFacet | Owner, timelock, upgrade approval | GrcDiamond has owner; GovernanceFacet has proposeCut/queue/execute. | Alias or merge into single “GovernanceFacet” for M00; ensure timelock and upgrade approval workflow documented. | +| PauseFacet | Global and per-selector pause | PauseFacet exists in gru-docs; GRCStorage has PauseState. | Keep; ensure M00 uses same slot namespace if migrating from GRC. | + +### 2.4 Token Factory Facets (all missing as Diamond facets) + +| Facet | Spec | Current State | Gap | +|-------|------|---------------|-----| +| AssetRegistryFacet | Asset definitions, W semantics, assetId hash | UniversalAssetRegistry (standalone) has asset types and metadata; iso4217w TokenFactory enforces \W. No deterministic assetId or c/a/d symbol grammar in one place. | Implement as facet (or wrap UniversalAssetRegistry behind facet); add symbol→assetId and W-before/W-after parsing per Facet Map grammar. | +| MarketFactoryFacet | Creates market per ISO; emits c/a/d token contracts | VaultFactory creates vault + DepositToken + DebtToken per asset; TokenFactory138 is stub; CompliantUSDC/USDT and CompliantFiatToken are separate contracts. | Either (1) MarketFactoryFacet deploys proxy/minimal clones for c/a/d, or (2) MarketFactoryFacet registers existing external c/a/d addresses in GRUStorage; document vs VaultFactory/TokenFactory138. | +| MintBurnFacet | Mint/burn rules, reserve gating, supply caps, emergency locks | ComplianceGuard validates mint; individual token contracts have mint/burn. No single MintBurnFacet. | Implement MintBurnFacet calling ReserveGate and token contracts or internal ledger; centralize caps and emergency locks in storage. | +| InterestRateFacet | Aave-style index math, rate models, accrual | Not in gru-docs or smom-dbis-138 as a facet. DepositToken/DebtToken do not implement interest indices. | Add InterestRateFacet (stub or full) with index storage and rate model hooks. | +| BridgeWrapFacet | W-before-ISO (wrapped bridge), escrow, bridge operators | Bridge contracts (GRUCCIPBridge, ISO4217WCCIPBridge, etc.) are standalone; no “BridgeWrapFacet” in Diamond. | Add facet that delegates to bridge contracts or holds bridge operator config in GRUStorage. | +| DWINFacet | W-after-T/C (D-WIN), denomination, windowing | Not present. | Add DWINFacet stub with storage for denomination/windowing rules. | + +### 2.5 Standards / Compliance Facets (all missing or stub-only) + +| Facet | Spec | Current State | Gap | +|-------|------|---------------|-----| +| IPSASFacet | GRU ledger ↔ IPSAS reporting, fund accounting | OMNL has IPSAS in Fineract/off-chain journal matrix; no on-chain facet. | Add IPSASFacet stub; document mapping from GRUStorage ledger to IPSAS classifications. | +| IFRSUSGAAPFacet | Revenue recognition, lease/contract hooks, impairment | Not present. | Add stub; document future hooks. | +| ISO20022Facet | pacs/camt builders, dictionary, settlement correlation | Methodology doc and runbook exist; no on-chain message builder facet. | Add ISO20022Facet stub; emit or store canonical message hashes/correlation IDs per MessagingGate. | +| i18nFacet | Locale packs, translation keys, disclosure templates | Not present. | Add stub; read from GRUStorage.i18n. | +| GovernanceLevelFacet | Policy levels 0..N, bitmask, routes enforcement | Not present. GRCStorage has no policy level or bitmask. | Add GovernanceLevelFacet; add GRUStorage policy level and bitmask; document “required modules per level.” | + +### 2.6 Policy Layer (Router + Gates) + +| Component | Spec | Current State | Gap | +|-----------|------|---------------|-----| +| PolicyRouterFacet | Calls ComplianceGate, AccountingGate, MessagingGate, ReserveGate | Not present in contracts. | Implement PolicyRouterFacet: e.g. `checkTransfer` → ComplianceGate, `postJournal` → AccountingGate, `logISO20022` → MessagingGate, `checkBacking` → ReserveGate; gate addresses from storage or facet. | +| ComplianceGate | checkTransfer (KYC/AML, sanctions, jurisdiction) | dbis_core ComplianceGateService (off-chain); ComplianceGuard (on-chain) only validates mint/reserve. | Add ComplianceGateFacet (stub) with allowlist/denylist and jurisdiction placeholders; optionally call off-chain or oracle. | +| AccountingGate | postJournal (ledger, CoA) | No on-chain gate. | Add AccountingGateFacet stub; write to GRUStorage.Accounting or emit events. | +| MessagingGate | logISO20022 (message log, correlation IDs) | No on-chain gate. | Add MessagingGateFacet stub; write to GRUStorage.ISO20022Vault or emit events. | +| ReserveGate | checkBacking (reserve proofs, attestations) | ComplianceGuard validates reserve for mint; no generic “checkBacking” gate. | Add ReserveGateFacet stub; delegate to existing reserve/oracle logic or attestation hashes in storage. | + +### 2.7 Minimum Ship List (Stubs) + +| Item | Spec | Current State | Gap | +|------|------|---------------|-----| +| AppStorage skeleton | Module registry, policy bitmask, ledger/ISO20022/i18n structs | GRCStorage has different namespaces; no GRUStorage. | Define GRUStorage (or extend GRCStorage with reserved namespaces) with all 7 domains + policy bitmask + module registry. | +| GovernanceFacet | RBAC, timelock, upgrade approval | Exists in gru-docs (GovernanceFacet). | Verify it fits M00; add “policy controllers per module” if required. | +| PolicyRouterFacet | Empty gates callable, events | Missing. | Implement as above. | +| TokenFactoryFacet | Register assets, deploy or ledger tokens | TokenFactory138 is stub; no Diamond facet. | Implement TokenFactoryFacet (or unify AssetRegistry + MarketFactory) to register assets and create/link c/a/d. | +| ComplianceGateFacet (stub) | Allowlist, jurisdiction placeholders | Missing. | Add stub. | +| AccountingGateFacet (stub) | Journal, CoA placeholders | Missing. | Add stub. | +| StandardsRegistryFacet | Activate/deactivate modules, enforce required per level | Missing. | Add; wire to GRUStorage.StandardsRegistry and GovernanceLevelFacet. | + +--- + +## 3. Functional Wire-Ins to Complete + +### 3.1 Diamond ↔ Token Factory + +- **Current:** No single Diamond owns token creation. VaultFactory, TokenFactory (iso4217w), CompliantFiatToken deployments are independent. +- **Target:** M00 Diamond exposes AssetRegistryFacet + MarketFactoryFacet (or TokenFactoryFacet); all c/a/d registration and creation go through Diamond. +- **Wire-in:** (1) Deploy M00 Diamond with GRUStorage; (2) Add AssetRegistryFacet + MarketFactoryFacet (or TokenFactoryFacet); (3) MarketFactoryFacet either deploys new c/a/d contracts or registers existing ones in GRUStorage; (4) All mint/burn/transfer that must be gated go through Diamond (or token contracts call back into Diamond for gate checks). + +**c* GRU integration (implemented):** All c* (compliant) tokens are integrated with the GRU ERC-2535 facet path: (1) **UniversalAssetRegistry** — register each c* via `registerGRUCompliantAsset()` (AssetType.GRU, no timelock); (2) **GRUCCIPBridge** and **PoolManager** read the registry and accept GRU assets; (3) **GRUAssetRegistryFacet** delegates to UniversalAssetRegistry so the M00 Diamond can expose the same registry when the facet is attached. Run **RegisterGRUCompliantTokens.s.sol** after deploying c* tokens; run **GRUCompliantTokensRegistryTest** (integration tests) before deployments. See [DEPLOYMENT_ORDER_OF_OPERATIONS](../03-deployment/DEPLOYMENT_ORDER_OF_OPERATIONS.md) § Phase 2.4. + +### 3.2 PolicyRouter → Gates + +- **Current:** No PolicyRouter; no on-chain gates except ComplianceGuard (mint-only). +- **Target:** Every transfer (or mint/burn) that is policy-sensitive calls PolicyRouter.checkTransfer (or equivalent); PolicyRouter reads GovernanceLevelFacet level and calls ComplianceGate, AccountingGate, MessagingGate, ReserveGate as required. +- **Wire-in:** (1) Implement PolicyRouterFacet with `checkTransfer`, `postJournal`, `logISO20022`, `checkBacking`; (2) Implement each gate as facet or internal module; (3) Token contracts or Diamond entry points call PolicyRouter before state changes; (4) GovernanceLevelFacet exposes level/bitmask; PolicyRouter reads it and skips or enforces each gate. + +### 3.3 Governance Level → Enforcement + +- **Current:** No governance level or bitmask in storage; no routing by level. +- **Target:** Governance levels 0–5 (per Facet Map); level stored in GRUStorage; GovernanceLevelFacet and PolicyRouter use it to decide which gates to call and with what strictness. +- **Wire-in:** (1) Add `governanceLevel` (and optional `policyBitmask`) to GRUStorage; (2) GovernanceLevelFacet get/set level (restricted); (3) PolicyRouter and gate stubs branch on level; (4) Document level semantics (0–5) in Facet Map and runbooks. + +### 3.4 Off-Chain vs On-Chain Compliance + +- **Current:** dbis_core ComplianceGateService does sanctions/AML off-chain; on-chain ComplianceGuard only validates mint/reserve for ISO4217W. +- **Target:** Clear split: which checks are on-chain (allowlist/denylist, jurisdiction tags) vs off-chain (full sanctions/AML); on-chain ComplianceGateFacet calls external adapter or stores results. +- **Wire-in:** (1) Define interface for “compliance result” (allowed/denied + reason); (2) ComplianceGateFacet stub stores allowlist/denylist and jurisdiction in GRUStorage; (3) Optionally add “oracle” or relayer that posts off-chain ComplianceGateService result on-chain for PolicyRouter to read. + +### 3.5 ISO-20022 and MessagingGate + +- **Current:** Canonical message format and methodology doc exist; no on-chain message log or correlation. +- **Target:** MessagingGate.logISO20022 stores or emits message hash + correlation ID; ISO20022Facet can build/reference pacs/camt payloads. +- **Wire-in:** (1) Add GRUStorage.ISO20022Vault (or event-only design); (2) MessagingGateFacet accepts canonical struct hash + correlationId; (3) Emit event and/or write to storage; (4) Link to SMART_CONTRACTS_ISO20022_FIN_METHODOLOGY and MULTI_CHAIN_EXECUTION_ISO20022_EMONEY. + +### 3.6 Reserve and Attestation + +- **Current:** ComplianceGuard validates reserve for mint; PoR in GRCStorage (AuditPeriod); no generic “checkBacking” for all operations. +- **Target:** ReserveGate.checkBacking(assetId, amount) used by PolicyRouter before mint/transfer where level requires; attestation hashes in GRUStorage. +- **Wire-in:** (1) ReserveGateFacet stub checks GRUStorage or external oracle for reserve/attestation; (2) MintBurnFacet (or token contracts) call ReserveGate when level ≥ 2; (3) Document attestation format and who posts hashes. + +--- + +## 4. Naming and Alignment Gaps + +### 4.1 Symbol Grammar: a/d vs ac/vdc/sdc + +- **Facet Map / institutional spec:** Canonical grammar uses **a**\\ (asset) and **d**\\ (debt). Examples: aUSDC, dUSDC, aEURCT, dWUSDT. +- **TOKEN_SCOPE_GRU and deployment:** Tokens are named **ac*** (e.g. acUSDC, acUSDT) and **vdc***/sdc* (e.g. vdcUSDC, sdcUSDC). These are Aave-style “deposit” and “debt” tokens. +- **Gap:** “a” and “d” in the spec are logical roles; “ac” and “vdc/sdc” are implementation names. Either (1) document that **a** = **ac** (asset/deposit) and **d** = **vdc/sdc** (debt) and keep both nomenclatures, or (2) rename in spec to ac/d for consistency with deployed tokens. +- **Recommendation:** Add a short subsection in Facet Map or TOKEN_SCOPE_GRU: “Canonical grammar: **a** (asset) ↔ **ac** (DepositToken), **d** (debt) ↔ **vdc** / **sdc** (DebtToken). Symbol in registry may be aUSDC or acUSDC; both refer to same asset token type.” + +### 4.2 GRC-2535 vs M00 Diamond + +- **GRC-2535 (gru-docs):** GrcDiamond + GRCStorage + Monetary, Triangulation, Index, Bond, Audit, Governance, Access, Pause, ComplianceFacet (stub), OracleAggregatorFacet (stub). No Token Factory, no PolicyRouter, no GRUStorage as in Facet Map. +- **M00 Diamond (Facet Map):** Single Diamond with GRUStorage, Token Factory facets, Standards facets, PolicyRouter + gates. +- **Gap:** Two different “Diamond” designs. Migration path or relationship is undefined. +- **Recommendation:** Document in institutional spec or a “GRU Diamond Evolution” note: “GRC-2535 is the current GRU Diamond (monetary, bond, index, audit). M00 Diamond extends or replaces it with Token Factory + GRUStorage + policy gates. Decision: migrate GRC → M00 (same contract, new facets + storage) vs deploy M00 as new Diamond and deprecate GRC.” + +### 4.3 UniversalAssetRegistry vs AssetRegistryFacet + +- **UniversalAssetRegistry (smom-dbis-138):** Central registry for asset types (GRU, ISO4217W, Commodity, etc.); used by bridges, PoolManager, GovernanceController, TokenlistGovernanceSync. Not a Diamond facet. +- **AssetRegistryFacet (spec):** Asset definitions, W semantics, assetId, symbol→assetId inside M00 Diamond. +- **Gap:** Duplication or migration path unclear. +- **Recommendation:** (1) If M00 is new deployment: AssetRegistryFacet could wrap or replace UniversalAssetRegistry (Diamond holds registry state or delegates to external registry). (2) Document “UniversalAssetRegistry remains source of truth for bridges until M00 is deployed; then migrate or mirror to GRUStorage.TokenFactoryRegistry.” + +--- + +## 5. Recommendations and Suggestions + +### 5.1 High priority + +1. **Create GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md** — Paste the full §1–§8 institutional spec; link from Facet Map. This is the single hand-off doc for Solidity engineers. +2. **Lock token model (A/B/C)** — Document in spec or Facet Map which of (A) separate ERC-20, (B) internal ledger, (C) hybrid is the target; update Facet Map “Token model” line accordingly. +3. **Define GRUStorage layout** — One Solidity library or doc with namespaced structs and slots for all 7 domains + policy bitmask + standards registry. Reserve namespaces for future facets to avoid collision. +4. **Implement minimum ship list** — PolicyRouterFacet + four gate stubs (Compliance, Accounting, Messaging, Reserve), StandardsRegistryFacet, GovernanceLevelFacet (level + bitmask), and TokenFactoryFacet (or AssetRegistry + MarketFactory) that register assets and optionally deploy/link c/a/d. Start with stubs that revert or no-op with events. +5. **Wire PolicyRouter to governance level** — PolicyRouter reads level from GovernanceLevelFacet; for each transfer/mint path, call only the gates required for that level; document in runbook. + +### 5.2 Medium priority + +6. **Align symbol grammar with TOKEN_SCOPE_GRU** — Add a↔ac, d↔vdc/sdc mapping and keep single source of truth for “canonical symbol” (either Facet Map or TOKEN_SCOPE_GRU with cross-link). +7. **Document GRC-2535 → M00 path** — One-page “Diamond evolution” or “M00 migration”: whether M00 is new Diamond or upgrade of GrcDiamond; which facets/storage are reused vs new. +8. **Reserve GRUStorage namespaces** — Even if a domain is stub-only, reserve its slot (keccak256 namespace) so future facets can extend without migration. +9. **ISO-20022 on-chain footprint** — Decide event-only vs storage for message log; implement MessagingGate.logISO20022 and optional ISO20022Facet stub. +10. **Off-chain ComplianceGate integration** — Define how dbis_core ComplianceGateService result is consumed on-chain (relayer, oracle, or keep transfer checks off-chain and only log). + +### 5.3 Lower priority / optional + +11. **InterestRateFacet and DWINFacet** — Stub with storage for rate indices and D-WIN rules; full implementation when a/d token behavior is finalized. +12. **IPSASFacet / IFRSUSGAAPFacet** — Stub and mapping doc from GRU ledger codes to IPSAS/IFRS; full logic later. +13. **i18nFacet** — Stub reading locale/key hashes from GRUStorage; UI/legal can consume from indexer or API. +14. **Pattern B (facet packs per asset)** — Only if a flagship USD/EUR market needs dedicated rate/compliance/settlement logic; document when and how. + +--- + +## 6. Checklist for “Spine” Completion + +Use this as a quick gate for “deployable spine” per institutional spec §7. + +| # | Item | Done | +|---|------|------| +| 1 | AppStorage skeleton (module registry, policy bitmask, ledger/ISO20022/i18n structs) | ☐ | +| 2 | GovernanceFacet (RBAC, timelock, upgrade approval) | ☐ (exists in GRC; verify for M00) | +| 3 | PolicyRouterFacet (callable gates, events) | ☐ | +| 4 | TokenFactoryFacet or AssetRegistry + MarketFactory (register assets, deploy or ledger c/a/d) | ☐ | +| 5 | ComplianceGateFacet (stub: allowlist, jurisdiction) | ☐ | +| 6 | AccountingGateFacet (stub: journal, CoA) | ☐ | +| 7 | StandardsRegistryFacet (activate/deactivate, require per level) | ☐ | +| 8 | GovernanceLevelFacet (level 0..N, bitmask) | ☐ | +| 9 | GRUStorage namespaces defined and reserved | ☐ | +| 10 | PolicyRouter wired to level and gates | ☐ | +| 11 | Institutional spec doc created and linked | ☑ (GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md) | +| 12 | Token model A/B/C locked and documented | ☑ (Token model A, Pattern A in institutional spec §8, §6) | +| 13 | Testing and verification (post-deploy) | ☐ — Run [GRU_M00_DIAMOND_DEPLOYMENT_RUNBOOK.md](../runbooks/GRU_M00_DIAMOND_DEPLOYMENT_RUNBOOK.md) §6 (loupe, governance level, PolicyRouter, storage layout, upgrade, events). Add Forge/Hardhat tests when spine is implemented. | + +--- + +## 7. Additional Recommendations, Suggestions, and Gaps + +Beyond §2–§6 and the spine checklist, the following are additional recommendations, suggestions, or gaps. + +### 7.1 Runbooks and deployment + +| Item | Gap | Recommendation | +|------|-----|-----------------| +| **M00 deployment runbook** | Institutional spec said “Document the chosen path in the deployment runbook”; no runbook existed. | **Done:** [GRU_M00_DIAMOND_DEPLOYMENT_RUNBOOK.md](../runbooks/GRU_M00_DIAMOND_DEPLOYMENT_RUNBOOK.md) — Option A (new Diamond), Option B (migrate GRC→M00), target chain, CREATE2, initial facet order, testing §6. | +| **Chain and CREATE2** | M00 Diamond spec did not state target chain(s) or CREATE2. | **Done:** Runbook §1 and institutional spec "Deployment target chain and CREATE2" state: primary chain 138, then mainnet/651940; CREATE2 when same-address parity required. | + +### 7.2 Cross-doc and repo alignment + +| Item | Gap | Recommendation | +|------|-----|-----------------| +| **TOKEN_SCOPE_GRU ↔ Facet Map** | Facet Map §5.5 links to TOKEN_SCOPE_GRU; TOKEN_SCOPE_GRU did not link back. | **Done:** TOKEN_SCOPE_GRU §8 has “Canonical symbol grammar” note with link to Facet Map §5. | +| **VAULT_SYSTEM_MASTER_TECHNICAL_PLAN** | VAULT_SYSTEM mentioned M00 but did not link to M00 docs. | **Done:** VAULT_SYSTEM §3 (GRU Assets) links to institutional spec and Facet Map. | +| **REQUIRED_FIXES_UPDATES_GAPS** | Repo-wide gaps doc did not list GRU M00 Diamond spine. | **Done:** §9 includes “GRU M00 Diamond spine (optional)” with links to institutional spec §7, Review §6 checklist, deployment runbook. | + +### 7.3 Defaults and interfaces + +| Item | Gap | Recommendation | +|------|-----|-----------------| +| **Default governance level** | Facet Map defined levels 0–5 but did not state default at deployment. | **Done:** Institutional spec “Deployment target chain and CREATE2” and runbook §2 state default level 0; Facet Map §4 references runbook and spec. | +| **PolicyRouter and gate events** | Spec said gates “emit events” but no standard event names/signatures were defined. | **Done:** Institutional spec **Appendix: PolicyRouter and gate event signatures** defines TransferChecked, JournalPosted, MessageLogged, BackingChecked, GovernanceLevelSet. Runbook §6 references the appendix. | + +### 7.4 Testing and verification + +| Item | Gap | Recommendation | +|------|-----|-----------------| +| **M00 Diamond tests** | No tests or verification steps were documented for M00 Diamond. | **Done:** Runbook §6 defines post-deploy checks (loupe, governance level, PolicyRouter, storage layout, upgrade, events). Spine checklist item 13 added; add Forge/Hardhat tests when spine is implemented. | + +### 7.5 UniversalAssetRegistry migration + +| Item | Gap | Recommendation | +|------|-----|-----------------| +| **Explicit migration note** | Review §4.3 recommended documenting UniversalAssetRegistry as source of truth until M00. | **Done:** Institutional spec “GRU Diamond evolution” includes “Existing registries”: UniversalAssetRegistry remains source of truth until M00; after M00, migrate or mirror to GRUStorage.TokenFactoryRegistry and document cutover. | + +--- + +## 8. Related Documents + +- [GRU_M00_DIAMOND_FACET_MAP.md](GRU_M00_DIAMOND_FACET_MAP.md) — Facet map, storage namespaces, governance levels, symbol grammar. +- [GRU_M00_DIAMOND_DOCS_REVIEW_GAPS_AND_INCONSISTENCIES.md](GRU_M00_DIAMOND_DOCS_REVIEW_GAPS_AND_INCONSISTENCIES.md) — Review of all GRU M00 Diamond docs for gaps and inconsistencies. +- [GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md](GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md) — Full §1–§8 institutional spec; token model A and Pattern A locked; GRC vs M00 evolution. +- [gru-docs/contracts/README.md](../../gru-docs/contracts/README.md) — GRC-2535 Diamond. +- [smom-dbis-138/docs/tokenization/TOKEN_SCOPE_GRU.md](../../smom-dbis-138/docs/tokenization/TOKEN_SCOPE_GRU.md) — c/a/d and W token lists. +- [SMART_CONTRACTS_ISO20022_FIN_METHODOLOGY.md](SMART_CONTRACTS_ISO20022_FIN_METHODOLOGY.md) — Canonical message format. +- [VAULT_SYSTEM_MASTER_TECHNICAL_PLAN.md](../VAULT_SYSTEM_MASTER_TECHNICAL_PLAN.md) — Vault and M00 reference. +- [REQUIRED_FIXES_UPDATES_GAPS.md](../REQUIRED_FIXES_UPDATES_GAPS.md) — Repo-wide fixes and gaps. + +**See also §7** for additional recommendations (runbooks, cross-docs, defaults, events, testing, UniversalAssetRegistry migration). diff --git a/docs/04-configuration/INGRESS_VERIFICATION_RUNBOOK.md b/docs/04-configuration/INGRESS_VERIFICATION_RUNBOOK.md index 427577d..730b083 100644 --- a/docs/04-configuration/INGRESS_VERIFICATION_RUNBOOK.md +++ b/docs/04-configuration/INGRESS_VERIFICATION_RUNBOOK.md @@ -20,6 +20,8 @@ This runbook provides step-by-step verification procedures for the complete ingr ## Prerequisites +**Production note:** Example values below (e.g. `your-token`, `your-password`) are placeholders. In production, source real values from your `.env` file only; do not commit secrets. + ### Access Credentials Ensure the following are configured in `.env`: diff --git a/docs/04-configuration/IPFS_TOKEN_LOGOS_RUNBOOK.md b/docs/04-configuration/IPFS_TOKEN_LOGOS_RUNBOOK.md new file mode 100644 index 0000000..26da32a --- /dev/null +++ b/docs/04-configuration/IPFS_TOKEN_LOGOS_RUNBOOK.md @@ -0,0 +1,180 @@ +# IPFS Token Logos — Full Coverage for All Networks and Explorers + +**Last Updated:** 2026-02-28 +**Purpose:** Host all token logos on IPFS so they are available for explorer.d-bis.org (Blockscout), token lists, MetaMask, CoinGecko/CMC, and all bridge networks. + +--- + +## 1. Current State + +### IPFS in This Repo + +| Component | Location | Purpose | +|-----------|----------|---------| +| **Firefly IPFS** | `smom-dbis-138/k8s/firefly/ipfs.yaml`, `smom-dbis-138-proxmox/install/firefly-install.sh` | Firefly shared storage (internal) | +| **Kubo (standalone)** | `ProxmoxVE/install/kubo-install.sh` | General-purpose IPFS node (LXC) | + +### Logo Consumers + +| Consumer | Where | Format | +|----------|-------|--------| +| **Blockscout (explorer.d-bis.org)** | `tokens.logo_url` in DB, or `/images/tokens/{address}.png` | PNG, any size | +| **Token list (dbis-138.tokenlist.json)** | `logoURI` per token | URL (PNG/SVG) | +| **Token-aggregation API** | `getLogoUriForSpec()` in canonical-tokens.ts | Trust Wallet URLs | +| **MetaMask / Snap** | Fetches token list with logoURI | URL | +| **CoinGecko / CMC** | 512×512 PNG for submission | PNG | +| **Other explorers** | etherscan.io, bscscan.com, polygonscan.com, etc. | Token metadata or external lists | + +### Networks and Explorers + +| Chain ID | Network | Explorer | Token Logo Source | +|----------|---------|----------|-------------------| +| 138 | Chain 138 | explorer.d-bis.org | Blockscout DB / static / IPFS | +| 651940 | ALL Mainnet | — | Token list | +| 1 | Ethereum | etherscan.io | Contract metadata, token lists | +| 56 | BSC | bscscan.com | Same | +| 137 | Polygon | polygonscan.com | Same | +| 100 | Gnosis | gnosisscan.io | Same | +| 10 | Optimism | optimistic.etherscan.io | Same | +| 42161 | Arbitrum | arbiscan.io | Same | +| 8453 | Base | basescan.org | Same | +| 43114 | Avalanche | snowtrace.io | Same | +| 25 | Cronos | cronoscan.com | Same | +| 42220 | Celo | celoscan.io | Same | +| 1111 | Wemix | scan.wemix.com | Same | + +**Key:** Third-party explorers (Etherscan, BSCScan, etc.) resolve logos from contract metadata, token lists, or their own registries. Our token list URL (`https://explorer.d-bis.org/api/v1/report/token-list`) provides logoURI for wallets. For Blockscout (our explorer), we control logo display. + +--- + +## 2. Logo Inventory (All Tokens) + +### Chain 138 Tokens (dbis-138.tokenlist.json) + +| Symbol | Address (138) | Current logoURI | +|--------|---------------|-----------------| +| ETH-USD | 0x3304b747E565a97ec8AC220b0B6A1f6ffDB837e6 | ethereum.org | +| WETH | 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 | ethereum.org | +| WETH10 | 0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f | ethereum.org | +| LINK | 0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03 | chainlink-docs | +| cUSDT | 0x93E66202A11B1772E55407B32B44e5Cd8eda7f22 | Trust Wallet | +| cUSDC | 0xf22258f57794CC8E06237084b353Ab30fFfa640b | Trust Wallet | + +### Canonical Tokens (All Networks) + +From `canonical-tokens.ts`: cUSDC, cUSDT, cEURC, cEURT, cGBPC, cGBPT, cAUDC, cJPYC, cCHFC, cCADC, cXAUC, cXAUT, LiXAU, USDW, EURW, GBPW, AUDW, JPYW, CHFW, CADW, WETH, WETH10, LINK, ETH-USD (oracle). + +--- + +## 3. IPFS Setup Options + +### Option A: Use Existing Firefly IPFS + +If Firefly IPFS is running and has a public gateway: + +```bash +# Gateway typically at http://:8080 +# Add file: curl -X POST -F file=@logo.png "http://:5001/api/v0/add" +``` + +### Option B: Standalone Kubo (ProxmoxVE Script) + +```bash +# Install Kubo on LXC via ProxmoxVE script +# ProxmoxVE/install/kubo-install.sh +# Then: ipfs add logo.png +``` + +### Option C: Pinata / Infura / Web3.Storage + +For production, use a pinning service so logos stay available even when your node is offline: + +- **Pinata:** https://pinata.cloud — free tier, pin by upload +- **Web3.Storage:** https://web3.storage — free, IPFS + Filecoin +- **Infura IPFS:** https://infura.io/product/ipfs + +### Option D: Public Gateway (ipfs.io) + +After `ipfs add`, use `https://ipfs.io/ipfs/` or `https://.ipfs.dweb.link`. No pinning service needed if you pin locally and others fetch; for reliability, use a pinning service. + +--- + +## 4. Workflow: Prepare → Upload → Update + +### Step 1: Prepare 512×512 PNGs + +```bash +./docs/04-configuration/coingecko/scripts/prepare-token-logos-512x512.sh +# Output: docs/04-configuration/coingecko/logos/*.png +``` + +### Step 2: Upload to IPFS + +```bash +./scripts/upload-token-logos-to-ipfs.sh +# Uses: ipfs add (local) or Pinata API (if PINATA_JWT set) +# Output: docs/04-configuration/coingecko/logos/ipfs-manifest.json +``` + +### Step 3: Update Configs + +- **Token list:** Replace logoURI with IPFS gateway URL +- **canonical-tokens.ts:** Add `logoUrl` to specs or change LOGO_BASE to IPFS +- **Blockscout:** Update `tokens.logo_url` via migration or admin; or serve from `/images/tokens/{address}.png` (nginx static) + +### Step 4: Pin for Persistence + +If using local IPFS: `ipfs pin add ` +If using Pinata: upload pins the file automatically. + +--- + +## 5. Blockscout Logo Paths + +Blockscout can show token logos from: + +1. **`tokens.logo_url`** — Set in DB per token (address). Use IPFS gateway URL. +2. **Static files** — `/images/tokens/{address}.png` (lowercase address). Nginx serves from Blockscout static dir or custom path. +3. **External URL** — If logo_url is an external URL, Blockscout may proxy or hotlink (check Blockscout version). + +Recommended: Set `logo_url` in DB to `https://ipfs.io/ipfs/` or your gateway. Run migration to backfill: + +```sql +UPDATE tokens SET logo_url = 'https://ipfs.io/ipfs/Qm...' WHERE address = '0x...'; +``` + +--- + +## 6. Chainlist Icon (eip155-138.json) + +Chainlist requires `_data/icons/defioraclemeta.json` if you use `"icon": "defioraclemeta"`. Format: + +```json +[{"url":"ipfs://Qm...","width":1000,"height":1628,"format":"png"}] +``` + +Upload chain logo (512×512 or larger) to IPFS, then add this file to chains repo. Or omit `icon` (current approach). + +--- + +## 7. Checklist + +- [x] Run `prepare-token-logos-512x512.sh` — all 24 tokens +- [x] Run `upload-token-logos-to-ipfs.sh` — CIDs in ipfs-manifest.json +- [ ] Run `upload-token-logos-to-ipfs.sh` — get CIDs +- [ ] Pin CIDs (local or Pinata/Web3.Storage) +- [ ] Update `dbis-138.tokenlist.json` logoURI to IPFS URLs +- [ ] Update `canonical-tokens.ts` LOGO_BASE or per-spec logoUrl +- [ ] Backfill Blockscout `tokens.logo_url` for Chain 138 +- [ ] Serve `/images/tokens/{address}.png` from nginx (optional fallback) +- [ ] Add chain icon to Chainlist if desired +- [ ] Verify logos in MetaMask, Blockscout, token list API + +--- + +## See Also + +- [FULL_PARITY_TOKEN_COVERAGE_RUNBOOK](FULL_PARITY_TOKEN_COVERAGE_RUNBOOK.md) +- [PUBLICATION_LOCATIONS_MASTER](PUBLICATION_LOCATIONS_MASTER.md) +- [prepare-token-logos-512x512.sh](coingecko/scripts/prepare-token-logos-512x512.sh) +- [scripts/upload-token-logos-to-ipfs.sh](../../scripts/upload-token-logos-to-ipfs.sh) diff --git a/docs/04-configuration/ISO20022_INTAKE_GATEWAY_CONTRACT_MULTI_NETWORK.md b/docs/04-configuration/ISO20022_INTAKE_GATEWAY_CONTRACT_MULTI_NETWORK.md new file mode 100644 index 0000000..d7657c4 --- /dev/null +++ b/docs/04-configuration/ISO20022_INTAKE_GATEWAY_CONTRACT_MULTI_NETWORK.md @@ -0,0 +1,176 @@ +# ISO-20022 Intake / Gateway Contract on Different Blockchain Networks + +**Version:** 1.0 +**Last Updated:** 2026-02-23 +**Status:** Active +**Companion to:** [SMART_CONTRACTS_ISO20022_FIN_METHODOLOGY.md](SMART_CONTRACTS_ISO20022_FIN_METHODOLOGY.md) + +--- + +## 1. Purpose + +This document describes **how the intake or gateway contract** that receives ISO-20022 (and Fin) messages **works across different blockchain networks**: same logical contract, same address where possible, two delivery paths (relayer-submitted vs cross-chain), and per-chain configuration without breaking deterministic deployment. + +--- + +## 2. Role of the Intake / Gateway Contract + +The **ISO intake contract** is the **single on-chain entry point** that: + +1. **Accepts** a **canonical ISO message** (see [SMART_CONTRACTS_ISO20022_FIN_METHODOLOGY.md](SMART_CONTRACTS_ISO20022_FIN_METHODOLOGY.md)) from either: + - an **off-chain relayer** (gateway that parsed MX/MT and submits the canonical payload), or + - a **cross-chain message** (e.g. CCIP) that carries the canonical payload from another chain. +2. **Enforces** idempotency (by `instructionId` / `msgId`), **authorisation** (relayer role or CCIP router), and optional **policy** (ComplianceGuard, allowlists). +3. **Executes** the intended action: mint, transfer, or unlock for bridge, and **emits events** with canonical metadata for audit and ISO-20022 reporting. + +The contract does **not** parse raw MX/MT; it only ever sees the **canonical struct**. Parsing and mapping happen off-chain or on the source chain before submission. + +--- + +## 3. Same Address on Every Network + +To keep integration simple and avoid per-chain address maps, the intake contract is deployed at the **same address on every supported chain**, following the same pattern as [UniversalCCIPBridge](../runbooks/MULTI_CHAIN_EXECUTION_CROSS_CHAIN_MESSAGE_HANDLING.md) and [MULTI_CHAIN_EXECUTION_DETERMINISTIC_DEPLOYMENT](../runbooks/MULTI_CHAIN_EXECUTION_DETERMINISTIC_DEPLOYMENT.md). + +### 3.1 Deterministic Deployment (CREATE2) + +- **Formula:** `address = keccak256(0xff ++ deployer ++ salt ++ keccak256(bytecode))[12:]`. +- **Identical bytecode** on every chain (same compiler, no chain-specific branches in bytecode). +- **Identical constructor / initializer args** for the core contract; any **chain-specific** config (e.g. CCIP router, relayer list) is set **after** deployment via `initialize()` or setters. + +### 3.2 Suggested Salt and Initialization + +| Item | Value | +|------|--------| +| **Contract name** | ISO20022IntakeGateway (or equivalent) | +| **Salt** | `keccak256("ISO20022IntakeGateway")` (fixed, documented) | +| **Constructor** | Minimal (e.g. none) or same admin everywhere | +| **initialize(args)** | `admin`, optional `ccipRouter`, optional `relayer`; same `admin` on all chains; `ccipRouter` can be set to 0 and configured per chain later | + +This yields **one canonical intake contract address** across all networks (e.g. 138, 1, 56, 10, 137, 42161, 8453, 43114, and 651940 if supported). Integrators and off-chain gateways can use that single address regardless of chain. + +--- + +## 4. Two Ways Messages Reach the Intake Contract + +Messages reach the intake contract in two ways: **direct submission by a relayer** (same chain) or **delivery via a cross-chain protocol** (e.g. CCIP) from another chain. + +### 4.1 Path A: Relayer-Submitted (Same Chain) + +**Flow:** + +1. Off-chain **gateway** receives ISO-20022 MX or SWIFT Fin MT. +2. Gateway **parses, validates, and maps** to the **canonical struct** (see methodology doc). +3. Gateway (as a **relayer**) calls the intake contract on the **target chain**: + - `submitInbound(CanonicalMessage calldata m)` for credits (mint / release), or + - `submitOutbound(CanonicalMessage calldata m)` for debits (burn / lock), + with the relayer’s EOA or contract holding **RELAYER_ROLE** (or **INTAKE_RELAYER_ROLE**). + +**On-chain:** + +- `msg.sender` must have the relayer role. +- Contract checks `processedInstructions[m.instructionId]` (or `processedMessages[m.msgId]`); reverts if already processed. +- Contract optionally checks ComplianceGuard / PolicyManager using `m.debtorId`, `m.creditorId`, `m.purpose`. +- Contract performs the action (mint, transfer, bridge unlock) and sets `processedInstructions[m.instructionId] = true`. +- Contract emits an event with canonical fields for audit and pacs.002/camt.054 mapping. + +**Per-chain:** Only the **relayer address(es)** need to be configured per chain (e.g. different gateway EOA or multisig per network). The intake contract bytecode and address stay the same. + +### 4.2 Path B: Cross-Chain Delivery (e.g. CCIP) + +**Flow:** + +1. On the **source chain**, an authorised sender (e.g. the **same intake contract** at the same address, or a dedicated “sender” contract) encodes the **canonical struct** into `bytes data` and sends a **CCIP** (or other cross-chain) message to the **destination chain**, with **receiver** = intake contract address (same canonical address). +2. On the **destination chain**, the **CCIP router** calls the intake contract’s **receive** entry point (e.g. `ccipReceive(Any2EVMMessage calldata message)`). +3. The intake contract: + - Verifies the call is from the **CCIP router** (or a designated receiver adapter) via `msg.sender == ccipRouter` or a **ROUTER_ROLE** check. + - Decodes `message.data` to obtain the **CanonicalMessage**. + - Applies **replay protection** using `message.messageId` and/or the decoded `instructionId` (must not already be in `processedMessages` / `processedInstructions`). + - Optionally validates **source chain** and **sender** from `message.sourceChainSelector` and `message.sender` (allowlist or “same intake contract on source chain”). + - Executes the same logic as Path A (mint / transfer / unlock) and emits the same canonical events. + +**Per-chain:** The **CCIP router address** is chain-specific. It is set in `initialize()` or via `setCCIPRouter(address)` after deployment so that the same bytecode is used everywhere. On chains without CCIP (e.g. 651940), the router can be set to `address(0)` and Path B disabled; only Path A (relayer) is used. + +--- + +## 5. Contract Interface (Summary) + +The intake contract exposes at least: + +| Entry point | Caller | Purpose | +|-------------|--------|---------| +| **submitInbound(CanonicalMessage)** | Relayer (Path A) | Process an inbound credit (mint / release from bridge). | +| **submitOutbound(CanonicalMessage)** | Relayer (Path A) | Process an outbound debit (burn / lock for bridge). | +| **ccipReceive(Any2EVMMessage)** | CCIP router only (Path B) | Decode payload to CanonicalMessage and process as inbound (or outbound if encoded so). | + +Optional: + +- **setCCIPRouter(address)** – Admin; for deterministic deploy, init with router=0 then set per chain. +- **addRelayer(address)** / **removeRelayer(address)** – Admin; manage who can call submitInbound/submitOutbound. + +Idempotency key: **instructionId** (and optionally msgId). Storage: `mapping(bytes32 => bool) public processedInstructions;` and, for CCIP, `mapping(bytes32 => bool) public processedMessages;` keyed by CCIP `messageId` to avoid replay from the transport layer. + +--- + +## 6. How It Works on Different Networks (By Chain Type) + +### 6.1 Chains With CCIP (e.g. 138, 1, 56, 10, 137, 42161, 8453, 43114) + +- **Deploy** the intake contract via CREATE2 with the same salt and init args (e.g. admin; router=0). +- **Post-deploy:** Call `setCCIPRouter(ccipRouterAddress)` with that chain’s CCIP router. +- **Relayer:** Grant RELAYER_ROLE to the gateway(s) that will submit canonical messages on this chain. +- **Behaviour:** Both Path A (relayer) and Path B (CCIP) are active. Messages can arrive from off-chain (Path A) or from another chain (Path B) with the same canonical format. + +### 6.2 Chains Without CCIP (e.g. ALL Mainnet 651940) + +- **Deploy** the same contract at the same address via CREATE2 (same salt, same init; no CCIP router). +- Leave **CCIP router** as `address(0)` (or never set it). **Path B is unused.** +- **Relayer:** Only Path A is used; the off-chain gateway submits canonical messages via `submitInbound` / `submitOutbound` from an address with RELAYER_ROLE. +- Optionally, a **custom cross-chain transport** (e.g. AlltraCustomBridge-style) could later call a dedicated function that accepts the same canonical payload, with access control analogous to the CCIP router check. + +### 6.3 Same Address, Different Config + +- **Address:** Identical across all networks (CREATE2 + same bytecode + same constructor/init args). +- **Config that can differ per chain:** + - CCIP router address (or 0), + - Relayer list (RELAYER_ROLE), + - Optional: ComplianceGuard / PolicyManager / vault addresses if set via setters after deploy. + +No per-chain address map is needed in application logic; only the single intake contract address is used, and chain-specific behaviour is controlled by which roles and router are set on that chain. + +--- + +## 7. Security and Replay + +- **Path A:** Idempotency by `instructionId` (and optionally `msgId`). Only RELAYER_ROLE can submit; relayer identity is per chain. +- **Path B:** Replay protection by CCIP `messageId` and by decoded `instructionId`; only the CCIP router (or ROUTER_ROLE) can call `ccipReceive`. Validate source chain and sender if required (e.g. only accept from the same intake contract on allowed source chains). +- **Payload integrity:** Optional check of `payloadHash` in the canonical struct against an off-chain attested hash; contract can store or emit it for audit. + +--- + +## 8. Downstream Actions + +The intake contract does not hold balances long-term; it **forwards** the intent to: + +- **Mint:** Call token factory or mint controller (with reserve/attestation checks as in [MULTI_CHAIN_EXECUTION_ISO20022_EMONEY](../runbooks/MULTI_CHAIN_EXECUTION_ISO20022_EMONEY.md)). +- **Transfer:** Call token `transfer` or a vault that holds tokens. +- **Bridge unlock:** Call the bridge/vault contract’s release or unlock function with the same canonical metadata so that bridge and e-money runbooks stay aligned. + +All such downstream calls should carry or emit the same canonical identifiers (instructionId, msgId, debtorId, creditorId, payloadHash) for audit and ISO-20022 reporting. + +--- + +## 9. Related Documents + +| Document | Description | +|----------|-------------| +| [SMART_CONTRACTS_ISO20022_FIN_METHODOLOGY.md](SMART_CONTRACTS_ISO20022_FIN_METHODOLOGY.md) | Canonical format, mapping, validation, and contract interface for ISO/Fin. | +| [MULTI_CHAIN_EXECUTION_ISO20022_EMONEY.md](../runbooks/MULTI_CHAIN_EXECUTION_ISO20022_EMONEY.md) | E-Money and ISO-20022 canonical message semantics. | +| [MULTI_CHAIN_EXECUTION_CROSS_CHAIN_MESSAGE_HANDLING.md](../runbooks/MULTI_CHAIN_EXECUTION_CROSS_CHAIN_MESSAGE_HANDLING.md) | Cross-chain message handling, same address, replay, sender verification. | +| [MULTI_CHAIN_EXECUTION_DETERMINISTIC_DEPLOYMENT.md](../runbooks/MULTI_CHAIN_EXECUTION_DETERMINISTIC_DEPLOYMENT.md) | CREATE2, salts, and deployment order. | + +--- + +**Document Control** + +- **Owner:** Configuration / Integration +- **Review:** When intake contract interface or supported chains change diff --git a/docs/04-configuration/ISO4217_COMPLIANT_TOKEN_MATRIX.md b/docs/04-configuration/ISO4217_COMPLIANT_TOKEN_MATRIX.md new file mode 100644 index 0000000..7921f32 --- /dev/null +++ b/docs/04-configuration/ISO4217_COMPLIANT_TOKEN_MATRIX.md @@ -0,0 +1,168 @@ +# ISO-4217 Compliant Token Matrix (Native + Bridged) + +This matrix formalizes the **symbol construction standard** for compliant ISO-4217 coins/tokens across: + +- **Financial Chains (Native issuance)** using a **6-character** symbol +- **Public Chains (Bridged/wrapped issuance)** using a **7-character** symbol where **ISO shifts to positions 4–6** + +--- + +## 1. Character-Position Rules + +### A) Native Financial-Chain Symbol (6 characters) + +**Format:** `c` + `[FinChain]` + `[ISO4217]` + `[Type]` + +| Position | Meaning | Allowed Values | +| -------: | -------------------------- | ------------------------------------ | +| 1 | Compliance prefix | `c` | +| 2 | Financial chain designator | See FIN_CHAIN_SET | +| 3–5 | ISO-4217 currency code | See ISO4217_SET | +| 6 | Asset type | `C` (coin), `T` (token), `W` (D‑WIN) | + +Example: `cAUSDT` = `c` + `A` + `USD` + `T` + +### B) Bridged Public-Chain Symbol (7 characters) + +**Format:** `c` + `W` + `[OriginFinChain]` + `[ISO4217]` + `[Type]` + +| Position | Meaning | Allowed Values | +| -------: | --------------------------------- | ------------------------------------ | +| 1 | Compliance prefix | `c` | +| 2 | Public wrapper class | `W` | +| 3 | Origin financial chain designator | See FIN_CHAIN_SET | +| 4–6 | ISO-4217 currency code | See ISO4217_SET | +| 7 | Asset type | `C` (coin), `T` (token), `W` (D‑WIN) | + +Example: `cWAUSDT` = `c` + `W` + `A` + `USD` + `T` + +--- + +## 2. FIN_CHAIN_SET + +| Designator | Chain | Chain ID | Notes | +| ---------- | ------------------------------------ | -------- | --------------------------------------------------------------------- | +| *(none)* | Chain 138 (DeFi Oracle Meta Mainnet) | 138 | **v0 only:** native symbols omit designator (e.g. `cUSDC`, `cUSDT`) | +| `X` | Chain 138 (origin reference only) | 138 | Used only when denoting origin 138 on other chains (e.g. bridged) | +| `A` | Alltra Mainnet | 651940 | ALL Mainnet | + +**Chain 138:** On ChainID 138, token symbols are **v0 only** — the chain designator is **left out**. Use `cUSDC`, `cUSDT` (no `X`). The `X` designator is used only for bridged tokens on public chains when the origin is Chain 138 (e.g. `cWXUSDC`). Reserved designators: do not reuse. Add new chains via registry. + +--- + +## 3. ISO4217_SET + +Reference: [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217). Supported subset for implementation: + +- **Fiat:** USD, EUR, GBP, JPY, AUD, CHF, CAD, CNY +- **Commodity:** XAU (gold) +- **Future:** Add codes via registry; validation enforces **3 uppercase letters only** (no 4-letter codes in v1) + +--- + +## 4. Validation Rules + +### Native (len = 6) + +- `s[0] == 'c'` +- `s[1] in FIN_CHAIN_SET` +- `s[2:5] in ISO4217_SET` (positions 2, 3, 4) +- `s[5] in {'C','T','W'}` + +### Bridged (len = 7) + +- `s[0] == 'c'` +- `s[1] == 'W'` +- `s[2] in FIN_CHAIN_SET` (origin chain) +- `s[3:6] in ISO4217_SET` (positions 3, 4, 5) +- `s[6] in {'C','T','W'}` + +--- + +## 5. v0 Symbols (Chain 138 Only) + +On **ChainID 138 only**, compliant token symbols use the **v0 form** with **no chain designator** (the X is left out): + +| v0 Symbol | Identity | Type | Chain | +| --------- | -------------- | ----- | ------ | +| `cUSDT` | ISO USD, Type T | Token | 138 | +| `cUSDC` | ISO USD, Type C | Coin | 138 | + +- These symbols are **maintained only on Chain 138**; they are not used on other chains. +- Registry maps v0 → `{ iso, type, originChain: 'X' }` for reporting and for bridged-origin reference; on-chain on 138 the symbol stays `cUSDC` / `cUSDT`. + +--- + +## 6. Chain 138: No X in Native Symbols + +- **On Chain 138:** Native token symbols remain **v0** — `cUSDC`, `cUSDT` (no `X`, no designator). Do not use `cXUSDC` or `cXUSDT` on Chain 138. +- **X** is used only when referring to Chain 138 as **origin** elsewhere (e.g. bridged tokens on public chains: `cWXUSDC`, `cWXUSDT`). +- Registry maps v0 → v1 identity for reporting and validation; the on-chain symbol on 138 does not change. + +--- + +## 7. Case Sensitivity + +- Symbols are **case-sensitive**. +- Compliance prefix: **lowercase** `c`. +- FinChain, ISO4217, Type: **uppercase** (e.g. `A`, `USD`, `T`). + +--- + +## 8. Edge Cases + +- **ISO codes:** 3 letters only (A–Z); no 4-letter codes in v1. +- **Reserved designators:** `X` (Chain 138), `A` (Alltra); do not reuse. +- **Invalid examples:** `cAUSD` (missing type), `cAUSDCX` (7-char without W at position 2). + +--- + +## 9. Migration Strategy + +- **Chain 138:** v0 symbols `cUSDT`, `cUSDC` are **maintained only on ChainID 138**; the X is left out. No on-chain symbol change on 138. +- **v1 registry:** Maps v0 symbol → `{ iso, type, originChain: 'X' }` for reporting; origin `X` denotes Chain 138 when needed (e.g. bridged). +- **New chains:** Use v1 symbols with designator (e.g. `cAUSDT` on Alltra, `cWAUSDT` on public chains). +- **Bridged from Chain 138:** Use 7-char with origin X (e.g. `cWXUSDC`, `cWXUSDT`) on public chains only. + +--- + +## 10. Matrix Examples + +### Native on Chain 138 (v0 only — no designator) + +| ISO | Coin (`C`) | Token (`T`) | +| --- | ---------- | ----------- | +| USD | `cUSDC` | `cUSDT` | + +### Native (6-char) — Other financial chains (e.g. Alltra A) + +| ISO | Coin (`C`) | Token (`T`) | D‑WIN (`W`) | +| --- | ---------- | ----------- | ----------- | +| USD | `cAUSDC` | `cAUSDT` | `cAUSDW` | +| EUR | `cAEURC` | `cAEURT` | `cAEURW` | +| GBP | `cAGBPC` | `cAGBPT` | `cAGBPW` | + +### Bridged (7-char) — Public networks + +| ISO | Coin (`C`) | Token (`T`) | D‑WIN (`W`) | +| --- | ---------- | ----------- | ----------- | +| USD | `cWXUSDC` | `cWXUSDT` | `cWXUSDW` | +| USD | `cWAUSDC` | `cWAUSDT` | `cWAUSDW` | +| EUR | `cWAEURC` | `cWAEURT` | `cWAEURW` | + +--- + +## 11. Chain-Context Mapping + +- **Chain 138:** Native symbols are **v0 only** (no X): `cUSDC`, `cUSDT`. No 6-char form with X is used on Chain 138. +- **Other financial chains:** Native symbols use 6-char with designator (e.g. Alltra `cAUSDC`, `cAUSDT`). +- **Bridged symbols** (7-char) live on **Public chains** (Ethereum, Base, Polygon, etc.); use `cWXUSDC` when origin is Chain 138. +- Chain specificity remains defined by **chainId + contract address**; the symbol encodes **class + origin** (except v0 on 138, which encodes class only). + +--- + +## References + +- [CHAIN138_TOKEN_ADDRESSES.md](../11-references/CHAIN138_TOKEN_ADDRESSES.md) — v0 symbol mapping +- [TOKEN_SCOPE_GRU.md](../../smom-dbis-138/docs/tokenization/TOKEN_SCOPE_GRU.md) — token scope +- [GRU_M00_DIAMOND_FACET_MAP.md](GRU_M00_DIAMOND_FACET_MAP.md) — canonical symbol grammar §5 diff --git a/docs/04-configuration/MAINNET_RAMP_USER_FLOWS.md b/docs/04-configuration/MAINNET_RAMP_USER_FLOWS.md new file mode 100644 index 0000000..b0ca74f --- /dev/null +++ b/docs/04-configuration/MAINNET_RAMP_USER_FLOWS.md @@ -0,0 +1,42 @@ +# On-Ramp and Off-Ramp User Flows (Mainnet ↔ Chain 138) + +**Purpose:** Document the recommended user flows for fiat on-ramp and off-ramp when using mainnet liquidity and third-party bridges. Companion/dApp copy and links should point here. + +**Related:** [MAINNET_LIQUIDITY_AND_RAMPS_PRIORITY](../00-meta/MAINNET_LIQUIDITY_AND_RAMPS_PRIORITY.md) | [METAMASK_BRIDGE_SWAP](../../smom-dbis-138/docs/operations/integrations/METAMASK_BRIDGE_SWAP.md) + +--- + +## On-ramp (Fiat → Crypto on Chain 138) + +**Flow:** User buys on a supported chain (e.g. Ethereum Mainnet) via ramp, then bridges to Chain 138. + +| Step | User action | +|------|-------------| +| 1 | Open companion/dApp and choose **Buy** (on-ramp). | +| 2 | Select **Ethereum Mainnet** (or another ramp-supported chain). Complete purchase via ramp provider (MoonPay, Ramp, etc.) — funds arrive on mainnet. | +| 3 | Switch to **Bridge** and send assets **Mainnet → Chain 138** using a supported bridge (trustless or third-party). | +| 4 | Receive assets on Chain 138; use for gas, swaps, or dApps. | + +**Operator:** Ensure ramp API keys are set and mainnet is funded so bridges can operate. Ramp API: `POST /ramps/on-ramp/session` with `chainId: 1`. + +--- + +## Off-ramp (Crypto on Chain 138 → Fiat) + +**Flow:** User bridges from Chain 138 to Mainnet, then sells on mainnet via off-ramp. + +| Step | User action | +|------|-------------| +| 1 | On Chain 138, open **Bridge** and send assets **Chain 138 → Ethereum Mainnet**. | +| 2 | Wait for bridge confirmation; assets arrive on user’s mainnet address. | +| 3 | Open companion/dApp and choose **Sell** (off-ramp). Select **Ethereum Mainnet** and complete sale via ramp provider. | +| 4 | Fiat is sent to user’s linked bank/payment method per provider terms. | + +**Operator:** Mainnet liquidity (LiquidityPoolETH and/or Relay Bridge) must be funded so 138→mainnet payouts succeed. Ramp API: `POST /ramps/off-ramp/session` with `chainId: 1`. + +--- + +## Where to link in companion/dApp + +- **Buy (on-ramp):** Link to this doc or a short in-app guide: “Buy on Ethereum → Bridge to Chain 138.” +- **Sell (off-ramp):** Link to this doc or a short in-app guide: “Bridge to Ethereum → Sell on mainnet.” diff --git a/docs/04-configuration/MIGRATION_PLAN_R630_01_DATA.md b/docs/04-configuration/MIGRATION_PLAN_R630_01_DATA.md new file mode 100644 index 0000000..e1a89a0 --- /dev/null +++ b/docs/04-configuration/MIGRATION_PLAN_R630_01_DATA.md @@ -0,0 +1,140 @@ +# Migration Plan: r630-01 Data Pool (72% → target <70%) + +**Last updated:** 2026-02-28 + +**Phase 1 completed (2026-02-28):** Migrated 8 CTs from data → thin1 on r630-01. **data** now **65.8%** (was 72%); **thin1** 50.6% (was 43.5%). Migrated VMIDs: 10233, 10120, 10100, 10101, 10235, 10236, 7804, 8640. + +Goal: Reduce r630-01 **data** pool usage (currently ~65.8%, 280G pool) so it stays below 85% and has headroom. Options: move CTs to **r630-01 thin1** (same host) or to **r630-02 thin5** (cross-host). + +--- + +## 1. Current layout (r630-01) + +| Pool | Size | Used% | Free (approx) | Notes | +|-------|-------|-------|----------------|-------| +| **data** | 280G | **65.8%** ✓ | ~100G | After Phase 1 migrations; target <70% met. | +| **thin1** | 208G | 50.6% | ~107G | Now holds migrated CTs from Phase 1. | + +**CTs on data (by size, VMID = container):** + +| VMID | Allocated | Role / name (typical) | Migration priority | +|-------|-----------|------------------------|--------------------| +| 2500–2505 | 200G each | RPC (alltra etc.) | Low (critical RPC); move only if needed. | +| 2101 | 200G | Core RPC | **Do not move** (deploy/admin). | +| 1000, 1001, 1002 | 100G each | Validators | **Do not move** (consensus). | +| 1500, 1501, 1502 | 100G each | Sentries | Prefer stay; move only if necessary. | +| 10130, 10150, 10151 | 50–100G | Services | Good candidates (Phase 2). | +| 8640, 8642 | 50G each | Services | Good candidates. | +| 7804 | 20G | Gov/portal | Good candidate. | +| 10235, 10236 | 10–20G | Small services | Good candidates. | +| 10232, 10233 | 1–3G | Small | Easy wins. | +| 10100, 10101 | 8G each | Small | Easy wins. | +| 10120 | 4G | Small | Easy win. | + +--- + +## 2. Migration options + +### Option A: Same host — data → thin1 (r630-01) + +- **Pros:** No node change; no IP/network change; quick (stop → vzdump → destroy → restore to thin1 → start). +- **Cons:** thin1 has ~118G free; cannot move all 200G CTs without exceeding thin1. +- **Best for:** Smaller CTs (total ~50–80G) to free space on data without touching validators/core RPC. + +### Option B: Cross host — r630-01 → r630-02 thin5 + +- **Pros:** thin5 is empty (237G); can move one or two large CTs (e.g. 200G each). +- **Cons:** Node migration (IP may change unless static); service dependency and DNS/load balancer updates. +- **Best for:** One or two 200G RPC CTs (e.g. 2503, 2504, 2505) if you need to free a lot of data in one go. + +--- + +## 3. Recommended phases + +### Phase 1 — Same host (data → thin1) + +**Goal:** Free ~50–80G on data (get data from 72% to ~55–60%) by moving smaller CTs to thin1. + +**Candidates (order by size, smaller first for low risk):** + +1. 10232 (1G), 10233 (3G), 10120 (4G) +2. 10100 (8G), 10101 (8G), 10235 (10G) +3. 10236 (20G), 7804 (20G) +4. Optionally one of: 8640 (50G), 8642 (50G), or 10130 (50G) + +**Steps per CT (run on r630-01 or via SSH):** + +```bash +# On r630-01 (192.168.11.11). Replace VMID with actual (e.g. 10232). +VMID=10232 +ssh root@192.168.11.11 bash -s << 'EOF' + set -e + pct stop $VMID + vzdump $VMID --storage local --compress gzip --mode stop --remove 0 + BACKUP=$(ls -t /var/lib/vz/dump/vzdump-lxc-$VMID-*.tar.gz | head -1) + pct destroy $VMID --force + pct restore $VMID $BACKUP --storage thin1 + rm -f $BACKUP + pct start $VMID +EOF +``` + +**Automation:** Run for each VMID: +```bash +bash scripts/maintenance/migrate-ct-r630-01-data-to-thin1.sh # e.g. 10232 +bash scripts/maintenance/migrate-ct-r630-01-data-to-thin1.sh 10232 --dry-run # preview +``` +Suggested order: 10232, 10233, 10120, 10100, 10101, 10235, 10236, 7804, then 8640 or 8642. + +--- + +### Phase 2 — If data still >70%: move one large CT to r630-02 thin5 + +**Goal:** Free ~200G on r630-01 data by migrating one 200G CT to r630-02 and placing it on thin5. + +**Candidates:** 2503, 2504, or 2505 (non–core RPC; confirm which can be moved without breaking dependencies). + +**Steps:** + +1. **Confirm** the CT can run on r630-02 (network, DNS, NPM proxy, etc.). +2. **Migrate** (cross-node): + `pct migrate r630-02 --storage thin5` + Or: backup on r630-01, copy backup to r630-02, restore on r630-02 with `--storage thin5`, then destroy on r630-01. +3. **Update** any static IPs, DNS, or proxy config pointing to the old host. +4. **Verify** service and re-run `audit-proxmox-rpc-storage.sh`. + +--- + +## 4. Scripts to use / create + +| Action | Script / command | +|--------|-------------------| +| List CTs on data | `ssh root@192.168.11.11 'lvs -o lv_name,lv_size,pool_lv --noheadings pve \| grep " data "'` | +| Same-host migration (data → thin1) | New script or inline: `vzdump` → `pct destroy` → `pct restore --storage thin1` → `pct start` | +| Cross-host migration | `pct migrate r630-02 --storage thin5` (or backup/restore to r630-02). | +| Verify after | `bash scripts/audit-proxmox-rpc-storage.sh` and `pvesm status` on both hosts. | + +--- + +## 5. Checklist before migration + +- [ ] Backup or snapshot critical CTs before Phase 1. +- [ ] Run prune on r630-01 data CTs again if not done recently: `fix-storage-r630-01-and-thin5.sh`. +- [ ] Ensure no critical operations (deploy, consensus) during the migration window. +- [ ] For Phase 2: document which VMID is moved and update DNS/NPM/load balancer. + +--- + +## 6. Success criteria + +- **Phase 1:** r630-01 data pool <70% (ideally 55–65%); thin1 still <75%. +- **Phase 2 (if run):** r630-01 data <65%; r630-02 thin5 used by migrated CT(s); all services verified. + +--- + +## 7. Reference + +- **r630-01 data:** 280G, 72% used; LVs: 1000, 1001, 1002, 1500–1502, 2101, 2500–2505, 10100, 10101, 10120, 10130, 10150, 10151, 10232, 10233, 10235, 10236, 7804, 8640, 8642. +- **r630-01 thin1:** 208G, 43.5% used; ~118G free. +- **r630-02 thin5:** 237G, 0% used (empty). +- Storage docs: `STORAGE_RECOMMENDATIONS_BY_FILL_RATE.md`, `PHYSICAL_DRIVES_AND_CONFIG.md`. diff --git a/docs/04-configuration/PHYSICAL_DRIVES_AND_CONFIG.md b/docs/04-configuration/PHYSICAL_DRIVES_AND_CONFIG.md new file mode 100644 index 0000000..0028ad8 --- /dev/null +++ b/docs/04-configuration/PHYSICAL_DRIVES_AND_CONFIG.md @@ -0,0 +1,69 @@ +# Physical Drives and Current Configurations — All Three Proxmox Hosts + +**Last updated:** 2026-02-28 + +--- + +## ml110 (192.168.11.10) + +| Device | Size | Model | Serial | Configuration | +|--------|--------|------------------------|----------|----------------| +| **sda** | 931.5G | ST1000DM003-1ER162 (HDD) | Z4YE0TMR | Partitioned: sda1 (1M), sda2 (1G vfat /boot/efi), sda3 (930.5G LVM2). VG **pve**: swap 8G, root 96G ext4 `/`, **data** thin pool 794G (CTs 1003, 1004, 1503–1508, 2102, 2301, 2304–2308, 2400, 2402, 2403). | +| **sdb** | 931.5G | ST1000DM003-1ER162 (HDD) | Z4YDLPZ3 | **In VG pve** — extended `data` thin pool (data_tdata). Pool now ~1.7 TB total. | + +**RAID:** None. + +**Summary:** 2× 1TB HDDs. Both in use: sda (OS + original data pool); sdb added to pve and used to extend the data thin pool (~930G added). Data/local-lvm pool now ~1.7 TB. + +--- + +## r630-01 (192.168.11.11) + +| Device | Size | Model | Serial | Configuration | +|--------|--------|-------------------|--------------|----------------| +| **sda** | 558.9G | HUC109060CSS600 (SSD) | KSKUZEZF | Partitioned: sda1 (1M), sda2 (1G vfat), sda3 (557G **zfs_member**). ZFS used for Proxmox root (rpool). | +| **sdb** | 558.9G | HUC109060CSS600 (SSD) | KSKM1B4F | Same layout as sda — ZFS mirror partner for root. | +| **sdc** | 232.9G | CT250MX500SSD1 (SSD) | 2203E5FE090E | Member of **md0** (RAID10). | +| **sdd** | 232.9G | CT250MX500SSD1 | 2203E5FE08F8 | Member of **md0** (RAID10). | +| **sde** | 232.9G | CT250MX500SSD1 | 2203E5FE08FA | Member of **md0** (RAID10). | +| **sdf** | 232.9G | CT250MX500SSD1 | 2203E5FE08F1 | Member of **md0** (RAID10). | +| **sdg** | 232.9G | CT250MX500SSD1 | 2203E5FE095E | Member of **md0** (RAID10). | +| **sdh** | 232.9G | CT250MX500SSD1 | 2203E5FE0901 | Member of **md0** (RAID10). | + +**RAID:** **md0** = RAID10, 6× 233G SSDs → **~698G** usable. State: **active**, 6/6 devices [UUUUUU]. + +**LVM on md0:** VG **pve** (single PV `/dev/md0`). Thin pools: **pve-thin1** 208G, **pve-data** 280G. Hosts CTs for validators, RPC 2101, 2500–2505, 1000–1002, 1500–1502, 7800–7804, 10130, 10150–10151, 10200–10236, 3000–3501, 100–105, 130, etc. + +**Summary:** 2× 559G SSDs (ZFS root) + 6× 233G SSDs (RAID10 → LVM data/thin1). All drives in use. + +--- + +## r630-02 (192.168.11.12) + +| Device | Size | Model | Serial | Configuration | +|--------|--------|-------------------|--------------|----------------| +| **sda** | 232.9G | CT250MX500SSD1 | 2202E5FB4CB9 | Partitioned: sda1 (1M), sda2 (1G vfat), sda3 (231G **zfs_member**). ZFS for Proxmox root. | +| **sdb** | 232.9G | CT250MX500SSD1 | 2203E5FE090D | Same — ZFS mirror for root. | +| **sdc** | 232.9G | CT250MX500SSD1 | 2203E5FE07E1 | sdc3 → LVM VG **thin2** (thin pool → VMIDs 5000, 6000, 6001, 6002). | +| **sdd** | 232.9G | CT250MX500SSD1 | 2202E5FB186E | sdd3 → LVM VG **thin3** (VMIDs 5800, 10237, 8641, 5801). | +| **sde** | 232.9G | CT250MX500SSD1 | 2203E5FE0905 | sde3 → LVM VG **thin4** (VMIDs 7810, 7811). | +| **sdf** | 232.9G | CT250MX500SSD1 | 2203E5FE0964 | sdf3 → LVM VG **thin5** (empty pool after 5000 migrated to thin2). | +| **sdg** | 232.9G | CT250MX500SSD1 | 2203E5FE0928 | sdg3 → LVM VG **thin6** (VMIDs 5700, 6400, 6401, 6402). | +| **sdh** | 232.9G | CT250MX500SSD1 | 2203E5FE0903 | sdh3 → LVM VG **thin1** (thin1-r630-02: 2201, 2303, 2401, 5200–5202, 6200, 10234). | + +**RAID:** None (each data disk is a separate LVM PV). + +**Summary:** 2× 233G SSDs (ZFS root) + 6× 233G SSDs (each its own VG: thin1–thin6). All 8 drives in use. + +--- + +## Quick reference + +| Host | Physical drives | Layout | Unused / notes | +|---------|------------------|--------|-----------------| +| ml110 | 2× 1TB HDD | sda: OS+LVM data; sdb: LVM PV only | **sdb** — 931G not in any VG | +| r630-01 | 2× 559G + 6× 233G SSD | ZFS root + RAID10 md0 → LVM | All in use | +| r630-02 | 2× 233G + 6× 233G SSD | ZFS root + 6× single-disk LVM (thin1–thin6) | All in use | + +To re-check: +`ssh root@ 'lsblk -o NAME,SIZE,TYPE,FSTYPE,MODEL,SERIAL; echo; pvs; vgs'` diff --git a/docs/04-configuration/PRICE_FEED_CHAIN138_METAMASK_AND_WALLETS.md b/docs/04-configuration/PRICE_FEED_CHAIN138_METAMASK_AND_WALLETS.md new file mode 100644 index 0000000..a6c61d6 --- /dev/null +++ b/docs/04-configuration/PRICE_FEED_CHAIN138_METAMASK_AND_WALLETS.md @@ -0,0 +1,120 @@ +# Price Feed for Chain 138 — MetaMask and All Wallets + +**Last Updated:** 2026-02-28 +**Purpose:** Single reference for adding Chain 138 USD price feeds to MetaMask and other wallets + +--- + +## 1. Current State + +| Wallet / Platform | Chain 138 USD Display | Cause | +|-------------------|------------------------|-------| +| **MetaMask** | ❌ $0.00 / "No conversion rate available" | MetaMask uses **CoinGecko API** (primary) and **LavaPack** for prices; Chain 138 is not in their supported chains | +| **Trust Wallet** | ❌ Likely no USD | Trust Wallet also pulls from CoinGecko/CMC | +| **Ledger Live** | ❌ Awaiting integration | Ledger form submitted; awaiting response | +| **Other wallets** | ❌ Most use CoinGecko/CMC | Chain 138 not listed | + +**Important:** MetaMask does **not** query on-chain oracle contracts for USD display. Even with a working ETH/USD oracle on Chain 138 (`0x3304b747e565a97ec8ac220b0b6a1f6ffdb837e6`), MetaMask will not show native USD until Chain 138 and tokens are listed on CoinGecko (or MetaMask’s provider adds support). + +--- + +## 2. Paths to Add Price Feeds + +### 2.1 CoinGecko (Primary — MetaMask and many wallets) + +**Why:** MetaMask’s primary price source is CoinGecko. CoinGecko is also used by Trust Wallet, DeFi dashboards, and many other wallets. + +**Steps:** +1. **Chain submission (if applicable):** Request Chain 138 (DeFi Oracle Meta Mainnet) be added as a supported blockchain. +2. **Token submission:** Submit each token (cUSDT, cUSDC, WETH, ETH, etc.) with contract address, chain ID 138, decimals, logo. +3. **Form:** https://www.coingecko.com/en/request or https://www.coingecko.com/en/coins/new + +**Docs:** [COINGECKO_SUBMISSION_GUIDE](coingecko/COINGECKO_SUBMISSION_GUIDE.md), [COINGECKO_SUBMISSION_PACKAGE](coingecko/COINGECKO_SUBMISSION_PACKAGE.md), [CMC_COINGECKO_SUBMISSION_RUNBOOK](coingecko/CMC_COINGECKO_SUBMISSION_RUNBOOK.md) + +**Export data:** Use token-aggregation report API: +```bash +curl "https:///api/v1/report/coingecko?chainId=138" -o report-coingecko-138.json +``` + +--- + +### 2.2 CoinMarketCap (CMC) + +**Why:** Some wallets and aggregators use CMC as a fallback or primary source. + +**Steps:** Same process as CoinGecko — submit chain and tokens via CMC’s listing forms. + +**Export:** `GET /api/v1/report/cmc?chainId=138` + +--- + +### 2.3 Consensys / MetaMask Direct Outreach + +**Why:** MetaMask may add Chain 138 to their native price feed if Consensys approves. + +**Steps:** +1. Contact: **business@consensys.io** +2. Request: Add Chain 138 (DeFi Oracle Meta Mainnet) to MetaMask’s price feed provider. +3. Provide: Chain ID 138, RPC URLs, explorer, token list, oracle contract address if relevant. + +**Status:** Outreach form submitted; awaiting response. No public PR repo for Swaps/Bridge/price feed. + +**Ref:** [REPOSITORIES_AND_PRS_CHAIN138](../../00-meta/REPOSITORIES_AND_PRS_CHAIN138.md) + +--- + +### 2.4 On-Chain Oracle (dApps, not meta-wallet) + +**For dApps and custom UIs:** You can query the Chain 138 ETH/USD oracle directly: + +| Property | Value | +|----------|-------| +| **Oracle Proxy** | `0x3304b747e565a97ec8ac220b0b6a1f6ffdb837e6` | +| **RPC** | `https://rpc-http-pub.d-bis.org` | +| **Method** | `latestRoundData()` → answer in 8 decimals | + +**Docs:** [ORACLE_PRICE_FEED_SETUP](metamask/ORACLE_PRICE_FEED_SETUP.md) + +--- + +### 2.5 Chain 138 Snap (Workaround) + +**For MetaMask users:** The Chain 138 Snap provides market data via the token-aggregation API. Users can: + +- Open the Snap companion site (e.g. https://explorer.d-bis.org/snap/) +- Use **"Show market data"** or **"Fetch market summary"** to see USD prices + +This does **not** change MetaMask’s native balance display; it is a separate UX flow. + +--- + +## 3. Action Checklist + +| # | Action | Owner | Doc | +|---|--------|-------|-----| +| 1 | Submit Chain 138 to CoinGecko (chain listing) | You | [COINGECKO_SUBMISSION_PACKAGE](coingecko/COINGECKO_SUBMISSION_PACKAGE.md) | +| 2 | Submit tokens (cUSDT, cUSDC, WETH, etc.) to CoinGecko | You | [COINGECKO_SUBMISSION_GUIDE](coingecko/COINGECKO_SUBMISSION_GUIDE.md) | +| 3 | Submit Chain 138 and tokens to CoinMarketCap | You | [CMC_COINGECKO_SUBMISSION_RUNBOOK](coingecko/CMC_COINGECKO_SUBMISSION_RUNBOOK.md) | +| 4 | Follow up Consensys outreach | You | [REPOSITORIES_AND_PRS_CHAIN138](../../00-meta/REPOSITORIES_AND_PRS_CHAIN138.md) | +| 5 | Ensure token-aggregation report API is reachable | Ops | [TOKEN_AGGREGATION_REPORT_API_RUNBOOK](TOKEN_AGGREGATION_REPORT_API_RUNBOOK.md) | +| 6 | Prepare 512×512 PNG logos for each token | You | [prepare-token-logos-512x512.sh](coingecko/scripts/prepare-token-logos-512x512.sh) or [COINGECKO_SUBMISSION_GUIDE](coingecko/COINGECKO_SUBMISSION_GUIDE.md) §Step 1 | + +--- + +## 4. Prerequisites + +- **Token-aggregation API:** Running and reachable; `GET /api/v1/report/coingecko?chainId=138` and `GET /api/v1/report/cmc?chainId=138` return valid JSON. +- **Token logos:** 512×512 PNG for each token you submit. +- **Chain details:** Chain name, Chain ID 138, RPC URLs, explorer, native currency (see [COINGECKO_SUBMISSION_PACKAGE](coingecko/COINGECKO_SUBMISSION_PACKAGE.md)). + +**Note:** CoinGecko and CMC may not list ChainID 138 or 651940 until they add the chain. The report API remains the source of truth; submit when ready and keep the runbook for when platforms add support. + +--- + +## 5. Related Docs + +- [TOKEN_AGGREGATION_REPORT_API_RUNBOOK](TOKEN_AGGREGATION_REPORT_API_RUNBOOK.md) — Ensure report API is reachable +- [ORACLE_PRICE_FEED_SETUP](metamask/ORACLE_PRICE_FEED_SETUP.md) — On-chain oracle, MetaMask limitation +- [CHAIN138_SNAP_TROUBLESHOOTING](../../../metamask-integration/chain138-snap/docs/CHAIN138_SNAP_TROUBLESHOOTING.md) — Main balance USD display +- [REPOSITORIES_AND_PRS_CHAIN138](../../00-meta/REPOSITORIES_AND_PRS_CHAIN138.md) — Ledger, Trust, Consensys, CoinGecko/CMC +- [CMC_COINGECKO_REPORTING](../../../smom-dbis-138/services/token-aggregation/docs/CMC_COINGECKO_REPORTING.md) — Report API reference diff --git a/docs/04-configuration/PR_ADDITIONS_VALIDATION_REPORT.md b/docs/04-configuration/PR_ADDITIONS_VALIDATION_REPORT.md new file mode 100644 index 0000000..7dc26a7 --- /dev/null +++ b/docs/04-configuration/PR_ADDITIONS_VALIDATION_REPORT.md @@ -0,0 +1,171 @@ +# PR Additions Validation Report — Format and Content Checks + +**Last Updated:** 2026-02-28 +**Purpose:** Double-check formatting and content for each PR addition before submission. + +--- + +## 1. Token List (dbis-138.tokenlist.json) — tokenlists.org / Uniswap schema + +### Schema requirements (from tokenlist.schema.json) + +| Field | Requirement | Our value | Status | +|-------|--------------|-----------|--------| +| **name** | string, 1–30 chars, pattern `^[\w ]+$` | "DBIS Chain 138 Token List" (24 chars) | ✅ | +| **timestamp** | date-time format | "2026-02-16T00:00:00.000Z" | ✅ | +| **version** | { major, minor, patch } | { 1, 3, 0 } | ✅ | +| **tokens** | array, 1–10000 items | 6 tokens | ✅ | +| **token.chainId** | integer, min 1 | 138 | ✅ | +| **token.address** | checksummed 0x hex or Solana | Must be EIP-55 | ⚠️ Verify | +| **token.decimals** | 0–255 | 6, 8, 18 | ✅ | +| **token.name** | max 60 chars | All valid | ✅ | +| **token.symbol** | max 20 chars, `^\S+$` | ETH-USD, WETH, etc. | ✅ | +| **tags** (in tokens) | must exist in list-level tags | oracle, pricefeed, defi, wrapped, stablecoin, compliant, ccip | ✅ | +| **logoURI** | format uri | https://... | ✅ | + +### Issues to fix + +1. **ETH/USD Price Feed** — Oracle contract at `0x3304b747E565a97ec8AC220b0B6A1f6ffDB837e6` is not a standard ERC20; tokenlists.org typically lists ERC20 tokens. Consider removing or confirming it's acceptable. +2. **Address checksums** — Run `cast to-checksum-address` for each address to ensure EIP-55. WETH10: CHAIN138_TOKEN_ADDRESSES has `0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f` (lowercase f); token list has `0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9F` (uppercase F). One is wrong. +3. **tokenMap** — Schema allows optional `tokenMap`; our list omits it. Optional, no change needed. + +### Validation command + +```bash +cd /home/intlc/projects/token-lists && npm install && npx ajv validate -s src/tokenlist.schema.json -d /home/intlc/projects/proxmox/token-lists/lists/dbis-138.tokenlist.json +``` + +--- + +## 2. Chainlist (eip155-138.json) — ethereum-lists/chains + +### Schema requirements (chainSchema.json) + +| Field | Required | Our value | Status | +|-------|----------|-----------|--------| +| **name** | ✅ | "Defi Oracle Meta Mainnet" | ✅ | +| **shortName** | ✅ | "dfio-meta-main" — pattern `^[A-Za-z0-9-_]{1,64}$` | ✅ | +| **chain** | ✅ | "dfiometa" | ✅ | +| **chainId** | ✅ | 138 | ✅ | +| **networkId** | ✅ | 1 | ⚠️ Verify | +| **rpc** | ✅ | array of strings | ✅ | +| **faucets** | ✅ | [] | ✅ | +| **infoURL** | ✅ | "https://d-bis.org" | ✅ | +| **nativeCurrency** | ✅ | { name, symbol, decimals } | ✅ | +| **icon** | ❌ | "defioraclemeta" | ⚠️ Requires icon file | + +### Issues to fix + +1. **networkId** — Currently `1`. Most EVM mainnets use `networkId === chainId`. Chain 138 may use networkId 138; verify from chain config. If wrong, change to `138`. +2. **icon** — Using `"icon": "defioraclemeta"` requires `_data/icons/defioraclemeta.json` to exist. Format: + ```json + [{"url":"ipfs://Qm...","width":1000,"height":1628,"format":"png"}] + ``` + The URL must be IPFS and retrievable via `ipfs get`. **Option:** Remove `icon` field to avoid needing the icon file (some chains omit it). +3. **explorers[].icon** — We don't use explorer icon; OK. +4. **Prettier** — Run `npx prettier --write _data/chains/eip155-138.json` before PR. + +### Validation command + +```bash +cd /home/intlc/projects/chains +cp /home/intlc/projects/proxmox/docs/04-configuration/pr-ready/eip155-138.json _data/chains/ +./gradlew run +npx prettier --write _data/chains/eip155-138.json +``` + +--- + +## 3. Trust Wallet (trust-wallet-registry-chain138.json) — wallet-core + +### Registry format (from registry-fields.md) + +| Field | Requirement | Our value | Status | +|-------|--------------|-----------|--------| +| **id** | lowercase, never change | "dfiometa" | ✅ | +| **name** | readable | "Defi Oracle Meta Mainnet" | ✅ | +| **coinId** | 10000000 + chainId for EVM clones | 10000138 | ✅ | +| **symbol** | native coin | "ETH" | ✅ | +| **decimals** | 18 | 18 | ✅ | +| **blockchain** | "Ethereum" for EVM | "Ethereum" | ✅ | +| **derivation** | path m/44'/60'/0'/0/0 | ✅ | ✅ | +| **chainId** | string | "138" | ✅ | +| **explorer.sampleTx** | Real tx hash for URL validation | "" | ❌ **MUST FIX** | +| **explorer.sampleAccount** | Real address for URL validation | "" | ❌ **MUST FIX** | + +### Issues to fix + +1. **sampleTx** — Must be a real transaction hash from Chain 138. Get from https://explorer.d-bis.org (any recent tx). +2. **sampleAccount** — Must be a real address. Use any address that has had activity. + +From registry-fields.md: *"Note that the sample values should include existing IDs, so that the resulting full URL is valid."* + +### How to get sample values + +```bash +# From explorer or RPC +curl -s "https://explorer.d-bis.org/api/v2/transactions" | jq '.items[0].hash' +curl -s "https://explorer.d-bis.org/api/v2/addresses/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" | jq '.hash' +# Or use a known address: 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 (WETH) +``` + +--- + +## 4. DefiLlama-Adapters — Protocol TVL + +### Not a token list + +DefiLlama adapters return TVL (total value locked), not token lists. Each protocol (e.g. DODO) has an `index.js` exporting `tvl(api)` per chain. + +### Chain 138 support + +- DefiLlama uses chain keys: `ethereum`, `bsc`, `polygon`, `arbitrum`, etc. +- Chain 138 is likely **not** a built-in chain key. Check `DefiLlama-Adapters/helper/chains.js` or similar. +- If adding DODO on Chain 138, you must: + 1. Confirm DefiLlama supports chain 138 (may need PR to add chain first) + 2. Add config entry and tvl logic for the chain key they use (e.g. `chain138` or `defi-oracle-meta`) + +### No PR-ready file + +We do not have a DefiLlama adapter file. Create one only after confirming chain support. + +--- + +## Summary — Action Items + +| Addition | File | Status | +|----------|------|--------| +| **Token list** | dbis-138.tokenlist.json | ✅ WETH10 address fixed to checksum per CHAIN138_TOKEN_ADDRESSES | +| **Chainlist** | eip155-138.json | ✅ networkId→138; icon removed (avoids needing _data/icons file) | +| **Trust Wallet** | trust-wallet-registry-chain138.json | ✅ sampleTx and sampleAccount added (real tx from explorer) | +| **DefiLlama** | N/A | No PR until chain 138 is supported; adapter structure differs | + +--- + +## Verification commands (run before PR) + +```bash +# Token list (from token-lists repo) +cd /home/intlc/projects/token-lists +npm install +# Validate schema (if ajv available) +node -e " +const schema = require('./src/tokenlist.schema.json'); +const list = require('/home/intlc/projects/proxmox/token-lists/lists/dbis-138.tokenlist.json'); +console.log('name length:', list.name.length, '(max 30)'); +console.log('tokens:', list.tokens.length); +list.tokens.forEach(t => console.log(t.symbol, t.address)); +" + +# Chains +cd /home/intlc/projects/chains +cp ../../proxmox/docs/04-configuration/pr-ready/eip155-138.json _data/chains/ +npx prettier --write _data/chains/eip155-138.json +./gradlew run + +# Trust Wallet - use registry id, not chainId +# Add entry from pr-ready/trust-wallet-registry-chain138.json to registry.json first +. "$HOME/.cargo/env" # if Rust installed via rustup +cd /home/intlc/projects/wallet-core +./tools/new-evmchain dfiometa # use registry id, NOT 138 +``` diff --git a/docs/04-configuration/README.md b/docs/04-configuration/README.md index f65cc52..8db9bd3 100644 --- a/docs/04-configuration/README.md +++ b/docs/04-configuration/README.md @@ -46,6 +46,16 @@ This directory contains setup and configuration guides. - **Fireblocks Web3:** Submodule **[fireblocks-integration/](../fireblocks-integration/)** (Gitea: [d-bis/fireblocks-integration](https://gitea.d-bis.org/d-bis/fireblocks-integration)) — Dedicated RPC (VMID 2301), Console/SDK docs, `.env.example`. In-repo copy: [FIREBLOCKS_WEB3_INTEGRATION.md](FIREBLOCKS_WEB3_INTEGRATION.md) (operator/hosting ref). +**Price feed (MetaMask and all wallets):** +- **[PRICE_FEED_CHAIN138_METAMASK_AND_WALLETS.md](PRICE_FEED_CHAIN138_METAMASK_AND_WALLETS.md)** ⭐⭐⭐ - **Single reference** for adding Chain 138 USD prices to MetaMask and wallets: CoinGecko, CMC, Consensys outreach, on-chain oracle, Snap workaround. + +**Explorer tokens and GRU:** +- **[EXPLORER_TOKENS_GRU_POLICY.md](EXPLORER_TOKENS_GRU_POLICY.md)** ⭐⭐ - Policy: all c* tokens on [explorer.d-bis.org/tokens](https://explorer.d-bis.org/tokens) must be registered as GRU; token list and registration steps. +- **[C_TO_CW_MAPPER_MAPPING.md](C_TO_CW_MAPPER_MAPPING.md)** ⭐⭐ - c* → cW* mapping for mapper: symbol mapping and per-chain address mapping in `config/token-mapping-multichain.json`. + +**DEX and aggregators (Chain 138 tokens and routing):** +- **[DEX_AND_AGGREGATORS_CHAIN138_EXPLAINER.md](DEX_AND_AGGREGATORS_CHAIN138_EXPLAINER.md)** ⭐⭐⭐ - Using DEX and aggregators with Chain 138 coins/tokens; routing for DEXs; token-aggregation API, DODO PMM, swap–bridge–swap flows. + **Chain 138 / Wallets (overview first; all repos in ~/projects/):** - **[CHAIN138_WALLET_REPOSITORIES.md](CHAIN138_WALLET_REPOSITORIES.md)** ⭐⭐⭐ - **Canonical layout:** metamask-integration, LedgerLive, app-ethereum, TrustWallet-Integration each in `~/projects/`. All items **Yes / Completed.** - **[CHAIN138_WALLET_ECOSYSTEM_AND_RATIONALE.md](CHAIN138_WALLET_ECOSYSTEM_AND_RATIONALE.md)** ⭐⭐⭐ - **Why** we have the MetaMask Snap, **why** we need Ledger Live when we already use App-Ethereum, Trust Wallet support; links to all wallet docs. @@ -58,6 +68,37 @@ This directory contains setup and configuration guides. - **[FIXES_PREPARED.md](FIXES_PREPARED.md)** ⭐⭐⭐ - Single checklist of all fixes (required + optional) with copy-paste commands: UDM Pro Alltra/HYBX port forward, Alltra/HYBX 502 diagnosis, NPMplus certs, Explorer SSL, shellcheck, verification re-run. - **[FULL_FIXES_PREPARED.md](FULL_FIXES_PREPARED.md)** ⭐⭐⭐ - Consolidated full fixes: validators & block production, stuck tx, Sentries (1503/1504), RPCs (2301, 2402, 2503–2508), UDM Pro, Alltra/HYBX 502, optional (certs, Explorer SSL, shellcheck, verification). Master table + execution order. +**Smart contracts & ISO-20022 / Fin messaging:** +- **[SMART_CONTRACTS_ISO20022_FIN_METHODOLOGY.md](SMART_CONTRACTS_ISO20022_FIN_METHODOLOGY.md)** ⭐⭐⭐ - Methodology for smart contracts to accept ISO-20022 and SWIFT Fin messages: canonical format, mapping, validation, and contract interface. +- **[ISO20022_INTAKE_GATEWAY_CONTRACT_MULTI_NETWORK.md](ISO20022_INTAKE_GATEWAY_CONTRACT_MULTI_NETWORK.md)** ⭐⭐⭐ - How the intake/gateway contract receives ISO messages on different blockchain networks: relayer vs cross-chain (CCIP), same address (CREATE2), per-chain config. +- **[GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md](GRU_M00_DIAMOND_INSTITUTIONAL_SPEC.md)** ⭐⭐⭐ - GRU M00 Diamond institutional spec (§1–§8): topology, storage, facets, governance, markets, Pattern A/B, minimum checklist; token model A and Pattern A locked. +- **[GRU_M00_DIAMOND_FACET_MAP.md](GRU_M00_DIAMOND_FACET_MAP.md)** ⭐⭐⭐ - GRU M00 Diamond (ERC-2535) Token Factory: facet map, storage namespaces, governance levels 0–5, canonical symbol grammar (c/a/d, W rules). Whitepaper-ready. +- **[GRU_M00_DIAMOND_REVIEW_GAPS_AND_RECOMMENDATIONS.md](GRU_M00_DIAMOND_REVIEW_GAPS_AND_RECOMMENDATIONS.md)** ⭐⭐⭐ - Detailed review: missing components, functional wire-ins, naming alignment (a/d vs ac/vdc/sdc), checklist and recommendations. +- **[GRU_M00_DIAMOND_DOCS_REVIEW_GAPS_AND_INCONSISTENCIES.md](GRU_M00_DIAMOND_DOCS_REVIEW_GAPS_AND_INCONSISTENCIES.md)** ⭐⭐ - Review of all GRU M00 Diamond docs: missing refs, link consistency, terminology, and follow-up list. +- **[DBIS Rail Technical Spec v1](../dbis-rail/DBIS_RAIL_TECHNICAL_SPEC_V1.md)** ⭐⭐⭐ - Bank-rail settlement and GRU mint orchestration on Chain 138: RootRegistry, ParticipantRegistry, SignerRegistry, SettlementRouter, GRU_MintController, MintAuth lifecycle, EIP-712 signer quorum (3-of-5), replay protection, and audit events. +- **[DBIS Rail Rulebook v1](../dbis-rail/DBIS_RAIL_RULEBOOK_V1.md)** ⭐⭐⭐ - Operational and compliance policy: good funds matrix, finality triggers per rail (wire/ACH/cash/internal), accounting sequence and deterministic accountingRef, MintAuth preconditions, reversal and exception handling, signer revocation timing, incident controls, audit and reporting standards. +- **[DBIS Rail Security Threat Model v1](../dbis-rail/DBIS_RAIL_SECURITY_THREAT_MODEL_V1.md)** ⭐⭐⭐ - Trust boundaries, authorization/ledger/router/mint/validator/off-chain threat categories, severity classification, mitigations, residual risk, versioning and review cycle. +- **[DBIS Rail Regulator-Facing Brief v1](../dbis-rail/DBIS_RAIL_REGULATOR_BRIEF_V1.md)** ⭐⭐⭐ - Institutional narrative for banks, examiners, counsel, risk committees: overview, governance, settlement lifecycle, good funds and finality, controls, risk posture, audit, residual risk disclosure, amendment process. +- **[DBIS Rail Audit Readiness Checklist v1](../dbis-rail/DBIS_RAIL_AUDIT_READINESS_CHECKLIST_V1.md)** ⭐⭐⭐ - Pre-audit control verification: mint path, authorization, signer governance, accounting/evidence, router controls, validator layer, emergency controls, documentation integrity. +- **[DBIS Rail Audit Readiness Results v1](../dbis-rail/DBIS_RAIL_AUDIT_READINESS_RESULTS_V1.md)** ⭐⭐ - Baseline checklist run: status per section, gaps, and prioritized remediation (rail contracts, mint path lock, tests, ops). +- **[DBIS Rail Control Mapping v1](../dbis-rail/DBIS_RAIL_CONTROL_MAPPING_V1.md)** ⭐⭐ - Control IDs mapped to checklist, Spec, Rulebook, and Threat Model for audit and SOC 2 / ISO 27001 alignment. +- **[DBIS Rail and Project Completion Master v1](../dbis-rail/DBIS_RAIL_AND_PROJECT_COMPLETION_MASTER_V1.md)** ⭐⭐ - Project and deployment status; full task list (required and optional) for DBIS Rail and project completion. +- **[Implementation coordination (transcript 540ae663)](../dbis-rail/IMPLEMENTATION_COORDINATION_WITH_TRANSCRIPT_540AE663.md)** ⭐⭐ - Coordinate implementations with PMM/DEX, tokens, GRU, cW*, deployments; maps Completion Master tasks to done/partial/open. +- **[DBIS Rail Ledger Attestation Add-On v1.5](../dbis-rail/DBIS_RAIL_LEDGER_ATTESTATION_ADDON_V1_5.md)** ⭐⭐ - LPA state machine, reversal matrix, signer effectiveFromBlock/revokedAtBlock mandatory. +- **[DBIS Rail Conversion Router Spec v1.5](../dbis-rail/DBIS_RAIL_CONVERSION_ROUTER_SPEC_V1_5.md)** ⭐⭐ - SwapAuth, best execution/MEV, quote provenance, venue allowlist, sanctions/AML for swaps. +- **[DBIS Rail Stablecoin Policy v1.5](../dbis-rail/DBIS_RAIL_STABLECOIN_POLICY_V1_5.md)** ⭐⭐ - Canonical stablecoin definition, registry, routing and monitoring. +- **[DBIS Rail Hash Canonicalization and Test Vectors v1.5](../dbis-rail/DBIS_RAIL_HASH_CANONICALIZATION_AND_TEST_VECTORS_V1_5.md)** ⭐⭐ - LEB/LPA/ISO schemas, canonicalization rules, test vectors. + +**Mainnet liquidity & ramps (priority):** +- **[MAINNET_RAMP_USER_FLOWS.md](MAINNET_RAMP_USER_FLOWS.md)** ⭐⭐ - On-ramp (buy on mainnet → bridge to 138) and off-ramp (138→mainnet → sell) user flows. Companion/dApp link target. +- **Priority plan:** [MAINNET_LIQUIDITY_AND_RAMPS_PRIORITY.md](../00-meta/MAINNET_LIQUIDITY_AND_RAMPS_PRIORITY.md) - Obtain liquid on mainnet (fund LP + relay bridge), then wire off/on-ramps. + +**Explorer (explorer.d-bis.org):** +- **[EXPLORER_FUNCTIONALITY_REVIEW.md](EXPLORER_FUNCTIONALITY_REVIEW.md)** - Routes, API URLs, contract verification, Snap send HTTPS. +- **[EXPLORER_GAPS_AND_RECOMMENDATIONS.md](EXPLORER_GAPS_AND_RECOMMENDATIONS.md)** - Loading on all pages, bridge/lanes, **Verify & Publish** (UI) and batch verification (Forge + proxy), user/API key issuance, operator checklist. +- **[EXPLORER_TROUBLESHOOTING.md](EXPLORER_TROUBLESHOOTING.md)** - SSL, NPMplus, 502/verification failures, common errors. +- **Contract verification (Forge + Blockscout):** [../08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md](../08-monitoring/BLOCKSCOUT_VERIFICATION_GUIDE.md) — proxy, manual UI, 502/HTML troubleshooting. + ## Quick Reference **Initial Setup:** diff --git a/docs/04-configuration/RPC_ENDPOINTS_MASTER.md b/docs/04-configuration/RPC_ENDPOINTS_MASTER.md index fe4f677..e0ba66d 100644 --- a/docs/04-configuration/RPC_ENDPOINTS_MASTER.md +++ b/docs/04-configuration/RPC_ENDPOINTS_MASTER.md @@ -29,10 +29,11 @@ This is the **authoritative source** for all RPC endpoint configurations. All ot | **138 Public RPC** | `RPC_URL_138_PUBLIC` | Bridge, monitoring, frontend, browser | `http://192.168.11.221:8545` (VMID 2201); public URL: `https://rpc-http-pub.d-bis.org` | - Set in `config/ip-addresses.conf` or `smom-dbis-138/.env`. In smom `.env`, **`RPC_URL`** is an accepted alias for **Core** and is normalized to `RPC_URL_138`. `CHAIN138_RPC_URL` / `CHAIN138_RPC` are derived from `RPC_URL_138`. `WS_URL_138_PUBLIC` is the WebSocket for Public (e.g. `ws://192.168.11.221:8546`). +- **Core RPC (VMID 2101) for deploy:** Use **IP and port**, not FQDN. Set `RPC_URL_138=http://192.168.11.211:8545` in `smom-dbis-138/.env` for contract deployment and gas checks. Do not use `https://rpc-core.d-bis.org` for deployment (avoids DNS/tunnel dependency; direct IP is reliable from LAN). See [TODOS_CONSOLIDATED](../00-meta/TODOS_CONSOLIDATED.md) § First (0b). | Variable / use | Canonical value | Notes | |----------------|-----------------|--------| -| **RPC_URL_138** (Core) | `http://192.168.11.211:8545` or `https://rpc-core.d-bis.org` | Single standard for Chain 138 admin/deploy | +| **RPC_URL_138** (Core) | `http://192.168.11.211:8545` | **Prefer IP:port for admin/deploy.** Fallback from off-LAN: `https://rpc-core.d-bis.org` | | **RPC_URL_138_PUBLIC** (Public) | `http://192.168.11.221:8545` or `https://rpc-http-pub.d-bis.org` | Single standard for Chain 138 public; VITE_RPC_URL_138 in frontend | | **RPC_URL_138_FIREBLOCKS** (Fireblocks) | `http://192.168.11.232:8545` or `https://rpc-fireblocks.d-bis.org` | Dedicated RPC for Fireblocks Web3 (VMID 2301); `WS_URL_138_FIREBLOCKS`: `wss://ws.rpc-fireblocks.d-bis.org` | | **Ethereum Mainnet** | `https://eth.llamarpc.com` or Infura/Alchemy | `ETHEREUM_MAINNET_RPC` or `RPC_URL_MAINNET` in .env; CCIP relay uses both. Prefer Infura `https://mainnet.infura.io/v3/` to avoid 429. | diff --git a/docs/04-configuration/SECRETS_CONSOLIDATED_DOWNLOAD.env b/docs/04-configuration/SECRETS_CONSOLIDATED_DOWNLOAD.env new file mode 100644 index 0000000..7a87b86 --- /dev/null +++ b/docs/04-configuration/SECRETS_CONSOLIDATED_DOWNLOAD.env @@ -0,0 +1,205 @@ +# ============================================================================= +# CONSOLIDATED SECRETS — Single file for download / backup / fill-from-sources +# ============================================================================= +# INSTRUCTIONS: +# 1. Download this file (or copy from repo). +# 2. Fill each value from your existing .env files (see comments after each key). +# 3. Save the filled file as secrets-consolidated.env or .env.master in a secure +# location. NEVER commit the filled file. Keep it off cloud/email. +# 4. Use for backup, new machine setup, or feeding into a secrets manager. +# ============================================================================= +# Sources: root = proxmox repo root .env; smom = smom-dbis-138/.env; +# dbis = dbis_core/.env; omnis = OMNIS/backend/.env; etc. +# ============================================================================= + +# --- Proxmox (root) --- +PROXMOX_ML110= +PROXMOX_R630_01= +PROXMOX_R630_02= +PROXMOX_HOST= +PROXMOX_PORT= +PROXMOX_USER= +PROXMOX_TOKEN_NAME= +PROXMOX_TOKEN_VALUE= +PROXMOX_ALLOW_ELEVATED= + +# --- Cloudflare (root) --- +CLOUDFLARE_API_TOKEN= +CLOUDFLARE_EMAIL= +CLOUDFLARE_API_KEY= +CLOUDFLARE_ZONE_ID= +CLOUDFLARE_ZONE_ID_D_BIS_ORG= +CLOUDFLARE_ZONE_ID_MIM4U_ORG= +CLOUDFLARE_ZONE_ID_SANKOFA_NEXUS= +CLOUDFLARE_ZONE_ID_DEFI_ORACLE_IO= +CLOUDFLARE_TUNNEL_TOKEN= +CLOUDFLARE_TUNNEL_ID= +CLOUDFLARE_TUNNEL_ID_ALLTRA_HYBX= +CLOUDFLARE_TUNNEL_ID_MIFOS_R630_02= +CLOUDFLARE_TUNNEL_TOKEN_MIFOS_R630_02= +CLOUDFLARE_ORIGIN_CA_KEY= +CLOUDFLARE_ACCOUNT_ID= + +# --- ClouDNS (root) --- +CLOUDNS_AUTH_ID= +CLOUDNS_AUTH_PASSWORD= + +# --- NPM / NPMplus (root) --- +NPM_URL= +NPM_EMAIL= +NPM_PASSWORD= +NPM_HOST= +NPM_PROXMOX_HOST= +NPMPLUS_HOST= +NPM_VMID= +NPMPLUS_VMID= +NPMPLUS_ALLTRA_HYBX_VMID= +IP_NPMPLUS_ALLTRA_HYBX= +NPM_URL_MIFOS= + +# --- Fastly (root) --- +FASTLY_API_TOKEN= + +# --- Network / UniFi (root) | Omada (omada-api/.env) --- +PUBLIC_IP= +PROXMOX_HOST_FOR_TEST= +UNIFI_UDM_URL= +UNIFI_API_KEY= +UNIFI_API_MODE= +UNIFI_SITE_ID= +UNIFI_VERIFY_SSL= +OMADA_API_KEY= +OMADA_CLIENT_SECRET= + +# --- Gitea (root) --- +GITEA_URL= +GITEA_TOKEN= +GITEA_ORG= + +# --- Database & app auth (root, dbis_core, omnis, explorer) --- +DATABASE_URL= +JWT_SECRET= +JWT_REFRESH_SECRET= +JWT_EXPIRES_IN= +JWT_REFRESH_EXPIRES_IN= +SESSION_SECRET= +ADMIN_CENTRAL_API_KEY= +DBIS_CENTRAL_URL= +ADMIN_JWT_SECRET= + +# --- Storage AWS/Azure (root, omnis) --- +STORAGE_TYPE= +STORAGE_PATH= +AWS_REGION= +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_S3_BUCKET= +AZURE_STORAGE_CONNECTION_STRING= +AZURE_STORAGE_CONTAINER= + +# --- Blockchain / SMOM-DBIS-138 (smom-dbis-138/.env, root) --- +PRIVATE_KEY= +RPC_URL_138= +RPC_URL_138_PUBLIC= +ETHEREUM_MAINNET_RPC= +CHAIN_651940_RPC_URL= +ETHERLINK_RPC_URL= +TEZOS_RPC_URL= +ETHERSCAN_API_KEY= +ETHERLINK_CCIP_SELECTOR= +TEZOS_BRIDGE_ENABLED= +ETHERLINK_BRIDGE_ENABLED= +TEZOS_RELAY_ORACLE_KEY= +ETHERLINK_RELAY_BRIDGE= +ETHERLINK_RELAY_PRIVATE_KEY= +JUMPER_API_KEY= +ONEINCH_API_KEY= +MOONPAY_API_KEY= +MOONPAY_SECRET_KEY= +RAMP_NETWORK_API_KEY= +ONRAMPER_API_KEY= + +# --- Alerts & monitoring (root, dbis_core) --- +SLACK_WEBHOOK_URL= +PAGERDUTY_INTEGRATION_KEY= +EMAIL_ALERT_API_URL= +EMAIL_ALERT_RECIPIENTS= +SENTRY_DSN= + +# --- Legal / e-signature (root, the-order/legal-documents) --- +E_SIGNATURE_BASE_URL= + +# --- OTC / exchanges (dbis_core/.env) --- +CRYPTO_COM_API_KEY= +CRYPTO_COM_API_SECRET= +CRYPTO_COM_ENVIRONMENT= +BINANCE_API_KEY= +BINANCE_API_SECRET= +KRAKEN_API_KEY= +KRAKEN_PRIVATE_KEY= +OANDA_API_KEY= +OANDA_ACCOUNT_ID= +OANDA_ENVIRONMENT= +FXCM_API_TOKEN= + +# --- Price / market data (root, token-aggregation, smom-dbis-138) --- +COINGECKO_API_KEY= +COINDESK_API_KEY= +COINMARKETCAP_API_KEY= +DEXSCREENER_API_KEY= + +# --- Mifos / Fineract / OMNL (root, omnl-fineract) --- +MIFOS_BASE_URL= +MIFOS_TENANT= +MIFOS_USER= +MIFOS_PASSWORD= +MIFOS_INSECURE= +OMNL_FINERACT_BASE_URL= +OMNL_FINERACT_TENANT= +OMNL_FINERACT_USER= +OMNL_FINERACT_PASSWORD= + +# --- Phoenix / Sankofa / OMNIS backend (OMNIS/backend/.env) --- +SANKOFA_PHOENIX_API_URL= +SANKOFA_PHOENIX_CLIENT_ID= +SANKOFA_PHOENIX_CLIENT_SECRET= +SANKOFA_PHOENIX_TENANT_ID= + +# --- Frontend / MetaMask / Explorer (various .env) --- +VITE_WALLETCONNECT_PROJECT_ID= +VITE_THIRDWEB_CLIENT_ID= +VITE_ETHERSCAN_API_KEY= +VITE_SENTRY_DSN= +VITE_API_URL= +VITE_API_BASE_URL= +NEXT_PUBLIC_API_URL= +NEXT_PUBLIC_CHAIN_ID= +METAMASK_API_KEY= +THIRDWEB_SECRET_KEY= +NPM_ACCESS_TOKEN= + +# --- DeFi aggregators (alltra-lifi-settlement/.env) --- +PARASWAP_API_KEY= +ZEROX_API_KEY= + +# --- ProxmoxVE API (ProxmoxVE/api/.env) --- +MONGO_USER= +MONGO_PASSWORD= +MONGO_IP= +MONGO_PORT= +MONGO_DATABASE= + +# --- Chain138 / Fireblocks (root, fireblocks-integration) --- +CHAIN138_RPC_URL= +RPC_URL_138_FIREBLOCKS= +WS_URL_138_FIREBLOCKS= +CHAIN_ID_138= + +# --- Phoenix deploy API (phoenix-deploy-api/.env) --- +PORT= +GITEA_TOKEN= + +# --- Optional / per-service --- +MARKET_REPORTING_API_KEY= +E_FILING_ENABLED= +NODE_ENV= diff --git a/docs/04-configuration/SMART_CONTRACTS_ISO20022_FIN_METHODOLOGY.md b/docs/04-configuration/SMART_CONTRACTS_ISO20022_FIN_METHODOLOGY.md new file mode 100644 index 0000000..199f77e --- /dev/null +++ b/docs/04-configuration/SMART_CONTRACTS_ISO20022_FIN_METHODOLOGY.md @@ -0,0 +1,262 @@ +# Methodology: Smart Contracts Accepting ISO-20022 and Fin Messages + +**Version:** 1.0 +**Last Updated:** 2026-02-23 +**Status:** Active +**Scope:** Chain 138 (and multi-chain) e-money and bridge contracts + +--- + +## 1. Purpose and Scope + +This document defines the **methodology** for designing and operating smart contracts that **accept** ISO-20022 financial messages (MX/XML) and, where applicable, **SWIFT Fin** (MT) messages, by normalising them to a single **canonical on-chain representation** and processing them through a well-defined contract interface. + +### 1.1 Objectives + +- **Interoperability:** Enable value transfers and settlement flows that originate from or are traceable to ISO-20022 (and Fin) messaging. +- **Auditability:** Ensure every on-chain transfer, mint, burn, or cross-chain action can be correlated with a standardised message identifier and metadata (e.g. MsgId, UETR, debtor/creditor, purpose). +- **Compliance:** Support regulatory and E-Money requirements (par redeemability, safeguarded reserves, transaction monitoring) while preserving ISO-20022 semantics at the boundary. + +### 1.2 Out of Scope + +- Off-chain generation or routing of ISO-20022/Fin messages (covered by [ISO 20022 Mapping Table](../../gru-docs/docs/integration/iso20022/Mapping_Table.md) and [dbis_core ISO 20022 integration](../../dbis_core/docs/nostro-vostro/iso20022-mapping.md)). +- Contract deployment or network topology (see deployment runbooks). + +--- + +## 2. Message Sources: ISO-20022 and Fin + +### 2.1 ISO-20022 (MX) Messages + +| Message Type | Purpose | Typical Use in Smart Contract Context | +|-------------------|----------------------------------|----------------------------------------| +| **pain.001** | Customer credit transfer initiation | Initiation of a payment that may settle on-chain | +| **pacs.008** | FI-to-FI customer credit transfer | Settlement instruction; primary input for on-chain credit | +| **pacs.009** | FI-to-FI direct debit | Debit-side settlement | +| **pacs.002** | Payment status report | Status/correlation off-chain or in events | +| **camt.053** | Bank statement | Off-chain reconciliation | +| **camt.054** | Debit/credit notification | Notifications; optional event mapping | + +Messages are **XML** with namespaces per ISO 20022 XSDs (e.g. `urn:iso:std:iso:20022:tech:xsd:pacs.008.001.10`). Parsing and validation are done **off-chain**; only a **canonical payload** is passed to the contract. + +### 2.2 SWIFT Fin (MT) Messages + +Where legacy flows use **SWIFT Fin** (e.g. MT103, MT202), the methodology treats them as **additional input formats** that must be **mapped into the same canonical structure** as ISO-20022 before being passed to smart contracts. + +| MT Type | Purpose | Mapping Notes | +|-----------|----------------------|----------------------------------------------------| +| **MT103** | Single customer transfer | Field 20 → instructionId; 32A → amount/currency; 50/59 → debtor/creditor | +| **MT202** | Bank transfer | Map to pacs.008-like canonical fields | + +Fin messages are **normalised to the canonical format** (Section 3) so that contracts do not need separate MT vs MX logic. + +--- + +## 3. Canonical Message Format (On-Chain Contract View) + +All accepted messages (ISO-20022 MX or SWIFT Fin) are reduced to a **single canonical struct** used in contract interfaces and events. This aligns with the extended CanonicalMessage described in [MULTI_CHAIN_EXECUTION_ISO20022_EMONEY.md](../runbooks/MULTI_CHAIN_EXECUTION_ISO20022_EMONEY.md). + +### 3.1 Canonical Struct (Semantic Definition) + +| Field | Type | Purpose | +|--------------------|---------|--------| +| `msgType` | string | Message type: `pacs.008`, `pain.001`, `camt.054`, or normalized equivalent (e.g. `MT103`) | +| `instructionId` | bytes32 | InstrId – unique instruction reference (hashed if longer than 32 bytes) | +| `endToEndId` | string | EndToEndId (optional) | +| `msgId` | string | MsgId (optional) | +| `uetr` | string | UETR (optional) | +| `accountRefId` | string | Account reference (debtor account or equivalent) | +| `counterpartyRefId`| string | Counterparty account reference (creditor or equivalent) | +| `debtorId` | string | Debtor identifier (optional) | +| `creditorId` | string | Creditor identifier (optional) | +| `purpose` | string | Purpose / remittance info (optional) | +| `settlementMethod` | string | Settlement method (optional) | +| `categoryPurpose` | string | Category purpose (optional) | +| `token` | address | Token contract address | +| `amount` | uint256 | Amount (in token’s smallest unit) | +| `currencyCode` | string | Currency code (ISO 4217) | +| `payloadHash` | bytes32 | Hash of off-chain payload (full MX/MT or selected elements) for audit | + +Strings that exceed on-chain limits (e.g. 32 bytes for a single storage slot) should be **hashed** for storage and the full value emitted in events or stored in an off-chain index keyed by `instructionId` or `msgId`. + +### 3.2 Solidity-Oriented Representation + +Contracts may use a struct such as: + +```solidity +struct CanonicalMessage { + string msgType; + bytes32 instructionId; + string endToEndId; + string msgId; + string uetr; + string accountRefId; + string counterpartyRefId; + string debtorId; + string creditorId; + string purpose; + string settlementMethod; + string categoryPurpose; + address token; + uint256 amount; + string currencyCode; + bytes32 payloadHash; +} +``` + +Optional fields can be empty strings or zero values where not applicable. Events should expose at least `instructionId`, `msgId` (if present), `token`, `amount`, `debtorId`, `creditorId`, and `payloadHash` so that off-chain systems can map back to ISO-20022. + +--- + +## 4. End-to-End Flow: From Fin/ISO-20022 to Smart Contract + +### 4.1 High-Level Pipeline + +``` +[ISO-20022 MX / SWIFT Fin] → Parse & Validate (off-chain) → Map to Canonical → Submit to Contract → Contract applies policy & executes +``` + +1. **Ingest:** Receive MX (XML) or Fin (MT) message at an off-chain service (e.g. [dbis_core Iso20022Service](../../dbis_core/src/integration/iso20022/iso20022.service.ts), [Iso20022Adapter](../../dbis_core/src/integration/plugins/iso20022-adapter.ts), or a dedicated gateway). +2. **Parse and validate:** Check schema, mandatory elements, and business rules (amounts, currency, identifiers). Reject invalid messages before any on-chain step. +3. **Map to canonical:** Fill the canonical struct from the message (see Section 5). For MT, use a dedicated MT→canonical mapping (e.g. MT103 field 20 → instructionId, 32A → amount/currencyCode, 50/59 → debtorId/creditorId). +4. **Submit to contract:** Call the contract’s **accept** entry point (e.g. `submitInbound` / `submitOutbound` or equivalent) with the canonical payload. The contract must verify sender (relayer/guardian), idempotency (e.g. by `instructionId` or `msgId`), and policy (ComplianceGuard, PolicyManager, allowlists). +5. **Execute and emit:** Contract performs transfer/mint/burn/cross-chain and emits events that include canonical metadata so that off-chain systems can map to ISO-20022 reports (pacs.002, camt.054, etc.). + +### 4.2 Idempotency and Replay Protection + +- **Unique key:** Use `instructionId` (and optionally `msgId` or `uetr`) as the idempotency key. Contracts must maintain a mapping (e.g. `processedInstructions[instructionId]`) and **revert or no-op** if the same key is submitted again. +- **Replay:** Ensure the same MX/Fin message cannot be replayed on another chain or at another time by binding the canonical payload to chain and, if needed, to a nonce or timestamp validated off-chain or on-chain. + +--- + +## 5. Mapping Rules: ISO-20022 and Fin → Canonical + +### 5.1 ISO-20022 MX → Canonical + +Use the same semantic mapping as in the [ISO 20022 Mapping Table](../../gru-docs/docs/integration/iso20022/Mapping_Table.md) and [dbis_core iso20022-mapping](../../dbis_core/docs/nostro-vostro/iso20022-mapping.md), then project onto the canonical struct: + +| Canonical Field | ISO-20022 Source (e.g. pacs.008) | +|----------------------|-----------------------------------| +| msgType | Message type (e.g. `pacs.008`) | +| instructionId | `PmtId/InstrId` (hash if needed) | +| endToEndId | `PmtId/EndToEndId` | +| msgId | `GrpHdr/MsgId` | +| uetr | UETR element if present | +| accountRefId | `DbtrAcct/Id` (IBAN or Othr/Id) | +| counterpartyRefId | `CdtrAcct/Id` (IBAN or Othr/Id) | +| debtorId | `Dbtr/Nm` or `Dbtr/Id` | +| creditorId | `Cdtr/Nm` or `Cdtr/Id` | +| purpose | `RmtInf/Ustrd` or `Purp` | +| settlementMethod | Settlement method element | +| categoryPurpose | `CategoryPurp` | +| token | Resolved from currency/account (off-chain config) | +| amount | `IntrBkSttlmAmt` (scaled to token decimals) | +| currencyCode | `IntrBkSttlmAmt/@Ccy` | +| payloadHash | `keccak256(rawMessage)` or hash of selected elements | + +### 5.2 SWIFT Fin (MT) → Canonical + +Example for **MT103**: + +| Canonical Field | MT103 Field | Notes | +|----------------------|-------------|--------| +| msgType | — | Set to `MT103` | +| instructionId | 20 | Hash if > 32 bytes | +| endToEndId | 121 (UETR) or 20 | If present | +| msgId | — | From header or generate | +| uetr | 121 | If present | +| accountRefId | 50a / 52a | Sender account | +| counterpartyRefId | 59a | Beneficiary account | +| debtorId | 50K / 50a | Ordering customer | +| creditorId | 59 / 59a | Beneficiary | +| purpose | 72 | Sender to receiver info | +| token | — | From currency in 32A + config | +| amount | 32A | Parse amount; scale to token decimals | +| currencyCode | 32A | Currency from 32A | +| payloadHash | — | Hash of MT text block or full message | + +Contracts only ever see the **canonical** struct; they do not need to know whether the source was MX or MT. + +--- + +## 6. Contract Interface Requirements + +### 6.1 Entry Points for “Accepting” Messages + +Smart contracts that **accept** ISO-20022/Fin semantics should expose at least one of the following (or equivalent): + +- **Inbound (e.g. submitInbound):** For instructions that result in **credit** to the chain (e.g. mint, or release from bridge). Caller must be an authorised relayer/guardian; payload is the canonical struct. +- **Outbound (e.g. submitOutbound):** For instructions that result in **debit** from the chain (e.g. burn, or lock for bridge). Same authorisation and canonical payload. + +Naming may vary (e.g. `processInboundMessage`, `acceptCreditTransfer`); the important part is that the **payload is the canonical struct** and that **idempotency** and **policy checks** are enforced. + +### 6.2 Authorisation + +- Only designated roles (e.g. `ROUTER_ROLE`, `RELAYER_ROLE`, or a guard contract) may call the submit functions. Use AccessControl or equivalent. +- Optionally, require that the **sender** of the transaction is a known **guardian** or **relayer** address list, and that the canonical payload’s `payloadHash` matches an off-chain attested hash. + +### 6.3 Events + +Emit events that carry enough canonical metadata for off-chain systems to map to ISO-20022 status and reporting (e.g. pacs.002, camt.054): + +- At least: `instructionId`, `msgId` (if any), `token`, `amount`, `debtorId`, `creditorId`, `payloadHash`, success/failure. +- Prefer including `msgType`, `endToEndId`, `uetr` where available so that reconciliation and compliance reporting are straightforward. + +### 6.4 Integration with E-Money and Compliance + +- **ComplianceGuard / PolicyManager / ComplianceRegistry:** Before executing the transfer/mint/burn, contracts should enforce allowlists, KYT, and circuit breakers as described in [MULTI_CHAIN_EXECUTION_ISO20022_EMONEY.md](../runbooks/MULTI_CHAIN_EXECUTION_ISO20022_EMONEY.md). The canonical struct supplies `debtorId`, `creditorId`, and `purpose` for policy checks. +- **Reserve and par redeemability:** For base-money mints, ensure reserve attestation and par redeemability rules are applied as in the same runbook; the canonical message does not replace those checks. + +--- + +## 7. Validation and Security + +### 7.1 Off-Chain Validation (Before Submit) + +- **Schema:** Validate MX against the appropriate ISO 20022 XSD; validate MT format per SWIFT rules. +- **Business rules:** Amount > 0, currency matches token, mandatory identifiers present, no duplicate `instructionId`/`msgId` in the system. +- **Payload hash:** Compute `payloadHash` over the raw or normalized message and attach to the canonical struct so the contract (or a verifier) can optionally check it. + +### 7.2 On-Chain Checks + +- **Idempotency:** Revert or skip if `instructionId` (or chosen key) already processed. +- **Role:** Only authorised roles can call submit. +- **Token:** Ensure `token` is a known, allowed token (e.g. via TokenRegistry or allowlist). +- **Amount:** Ensure `amount` is within bounds and, for mints, consistent with reserve/attestation logic. + +### 7.3 Audit and Non-Repudiation + +- Store or log `payloadHash` and `instructionId` on-chain so that auditors can match on-chain execution to off-chain MX/Fin messages. +- Prefer emitting full canonical metadata in events and indexing them off-chain for compliance and reconciliation. + +--- + +## 8. Implementation Checklist + +- [ ] **Off-chain:** Parser for ISO-20022 MX (and optionally SWIFT Fin MT) producing the canonical struct. +- [ ] **Off-chain:** Mapping tables and validation rules (amounts, currency, identifiers) aligned with [Mapping_Table.md](../../gru-docs/docs/integration/iso20022/Mapping_Table.md) and [iso20022-mapping.md](../../dbis_core/docs/nostro-vostro/iso20022-mapping.md). +- [ ] **Contract:** Canonical struct and submit interface (e.g. `submitInbound`/`submitOutbound`) with role-based access. +- [ ] **Contract:** Idempotency (e.g. `processedInstructions[instructionId]`) and policy hooks (ComplianceGuard, PolicyManager, ComplianceRegistry). +- [ ] **Contract:** Events that expose canonical metadata for ISO-20022 mapping and reporting. +- [ ] **Integration:** Bridge and e-money entry points (BridgeVault, UniversalCCIPBridge, etc.) carry or reference canonical metadata in events as per [MULTI_CHAIN_EXECUTION_ISO20022_EMONEY.md](../runbooks/MULTI_CHAIN_EXECUTION_ISO20022_EMONEY.md). + +--- + +## 9. Related Documents + +| Document | Description | +|----------|-------------| +| [ISO20022_INTAKE_GATEWAY_CONTRACT_MULTI_NETWORK.md](ISO20022_INTAKE_GATEWAY_CONTRACT_MULTI_NETWORK.md) | How the intake/gateway contract receives ISO messages on different blockchain networks (relayer vs cross-chain, same address, per-chain config) | +| [MULTI_CHAIN_EXECUTION_ISO20022_EMONEY.md](../runbooks/MULTI_CHAIN_EXECUTION_ISO20022_EMONEY.md) | ISO-20022 canonical message and E-Money requirements for GRU multi-chain | +| [Mapping_Table.md](../../gru-docs/docs/integration/iso20022/Mapping_Table.md) | ISO 20022 (pain.001, pacs.008, etc.) field-level mapping and validation | +| [iso20022-mapping.md](../../dbis_core/docs/nostro-vostro/iso20022-mapping.md) | ISO 20022 to DBIS API mapping and Iso20022Adapter usage | +| [iso20022-message-flow.md](../../dbis_core/docs/flows/iso20022-message-flow.md) | ISO 20022 message processing flow | +| [LEGAL_COMPLIANCE_REQUIREMENTS.md](../../explorer-monorepo/docs/LEGAL_COMPLIANCE_REQUIREMENTS.md) | Legal and ISO 20022 compliance for smart contracts | + +--- + +**Document Control** + +- **Owner:** Configuration / Integration +- **Review:** Align with runbook and mapping table changes +- **Next review:** When contract interfaces or ISO-20022 message set change diff --git a/docs/04-configuration/STORAGE_FIX_R630_01_AND_THIN5.md b/docs/04-configuration/STORAGE_FIX_R630_01_AND_THIN5.md new file mode 100644 index 0000000..9eb3304 --- /dev/null +++ b/docs/04-configuration/STORAGE_FIX_R630_01_AND_THIN5.md @@ -0,0 +1,64 @@ +# Storage fix: r630-01 (72%) and r630-02 thin5 (84.6%) + +**Last updated:** 2026-02-28 + +## Situation + +- **r630-01** `data` / `local-lvm`: **~72%** used. Many CTs (validators, RPC 2101, 2500–2505, etc.) use this pool. +- **r630-02** `thin5`: **~84.6%** used. **Only VMID 5000 (Blockscout/Explorer)** uses thin5. + +## Fix options + +### 1. Prune only (recommended first) + +Frees space without moving any container: + +- **thin5:** Prune inside VMID 5000: journal, Docker logs/images, logrotate, backups. +- **r630-01:** Prune journal and logs in all running CTs on the host. + +```bash +# From project root (LAN, SSH to both hosts) +bash scripts/maintenance/fix-storage-r630-01-and-thin5.sh +``` + +Dry-run: + +```bash +bash scripts/maintenance/fix-storage-r630-01-and-thin5.sh --dry-run +``` + +### 2. Prune + migrate VMID 5000 to an empty pool + +To free thin5, migrate Blockscout (5000) to the emptiest pool on r630-02: **thin2** (~4.8% used): + +```bash +# Migrate 5000 from thin5 -> thin2 (empty pool) +bash scripts/maintenance/fix-storage-r630-01-and-thin5.sh --migrate-5000 thin2 +``` + +Other options: `thin6` (~14% used), `thin3` (~11% used). This will: stop 5000 → vzdump to local → destroy CT → restore to target pool → start. Expect 15–45 min; Blockscout is down during backup/restore. + +### 3. Manual VMID 5000 prune (if script not run from repo) + +On r630-02 or from a host that can SSH there: + +```bash +bash scripts/maintenance/vmid5000-free-disk-and-logs.sh +``` + +## Verify after fix + +```bash +bash scripts/audit-proxmox-rpc-storage.sh +# or +ssh root@192.168.11.11 'pvesm status' +ssh root@192.168.11.12 'pvesm status' +``` + +LVM thin reclaim can take a few minutes after deleting data inside CTs; re-run `pvesm status` or `lvs` after a short wait. + +## Reference + +- thin5 on r630-02: single consumer **VMID 5000**. +- r630-01 data: shared by VMIDs 2101, 1000, 1001, 1002, 10100, 10101, 10120, and others on that host. +- Existing prune script for 5000: `scripts/maintenance/vmid5000-free-disk-and-logs.sh`. diff --git a/docs/04-configuration/STORAGE_RECOMMENDATIONS_BY_FILL_RATE.md b/docs/04-configuration/STORAGE_RECOMMENDATIONS_BY_FILL_RATE.md new file mode 100644 index 0000000..e1aa2fc --- /dev/null +++ b/docs/04-configuration/STORAGE_RECOMMENDATIONS_BY_FILL_RATE.md @@ -0,0 +1,145 @@ +# Storage Recommendations by Fill Rate and Growth + +**Last updated:** 2026-02-28 + +Based on current usage, history in `logs/storage-growth/history.csv`, and physical drive layout across ml110, r630-01, and r630-02. + +**Completed (2026-02-28):** Storage growth cron verified; prune (VMID 5000 + r630-01 CTs) run; ml110 sdb added to VG `pve` and data thin pool extended to ~1.7 TB (ml110 data now ~11% used). **Phase 1 migration (r630-01 data → thin1):** 8 CTs migrated (10233, 10120, 10100, 10101, 10235, 10236, 7804, 8640); r630-01 data **65.8%** (was 72%), thin1 50.6%. + +--- + +## 1. Thresholds and monitoring + +| Level | Use % | Action | +|-------|--------|--------| +| **Healthy** | < 75% | Continue normal collection; review quarterly. | +| **Watch** | 75–84% | Weekly review; plan prune or migration. | +| **WARN** | 85–94% | Prune and/or migrate within 1–2 weeks; do not add new large CTs. | +| **CRIT** | ≥ 95% | Immediate action; LVM thin pools can fail or go read-only. | + +Current scripts: `check-disk-all-vmids.sh` uses WARN 85%, CRIT 95% for **container root** usage. These recommendations apply to **host storage (pvesm / LVM)** as well. + +--- + +## 2. Observed fill behavior (from history) + +| Host | Storage | Trend (recent) | Implied rate / note | +|------|---------|----------------|----------------------| +| **ml110** | data | ~28.7% → ~25% (Feb 15 → 27) | Slight decrease (prune/dedup). Plenty of free space. | +| **r630-01** | data | 88% → 100% → 72% → **65.8%** (Phase 1 migration) | After Phase 1 (8 CTs data→thin1). Main growth host (validators, RPCs, many CTs). | +| **r630-02** | thin1-r630-02 | ~26.5% stable | Low growth. | +| **r630-02** | thin2 | ~4.8% → ~9% after 5000 migration | Now holds Blockscout (5000); monitor. | +| **r630-02** | thin5 | Was 84.6% → 0% after migration | Empty; available for future moves. | + +**Conclusion:** The pool that fills fastest and needs the most attention is **r630-01 data** (72% now; many CTs, Besu/DB growth). **ml110 data** is stable and has headroom. **r630-02** is manageable if you avoid concentrating more large CTs on a single thin pool. + +--- + +## 3. Recommendations by host and pool + +### ml110 + +- **data / local-lvm (~25%)** + - **Rate:** Low/slow. + - **Recommendations:** + - Keep running `collect-storage-growth-data.sh --append` (e.g. cron every 6h). + - Prune logs in CTs periodically (e.g. with `fix-storage-r630-01-and-thin5.sh`-style logic for ml110 or a dedicated prune script). + - No urgency; review again when approaching 70%. + +- **Unused sdb (931G)** + - **Recommendation:** Use it before adding new disks elsewhere. + - **Option A:** Add sdb to VG `pve` and extend the `data` thin pool (or create a second thin pool). Frees pressure on sda and doubles effective data capacity. + - **Option B:** Create a separate VG + thin pool on sdb for new or migrated CTs. + - Document the chosen layout and any new Proxmox storage names in `storage.cfg` and in `PHYSICAL_DRIVES_AND_CONFIG.md`. + +### r630-01 + +- **data / local-lvm (~72%)** + - **Rate:** Highest risk; this pool has the most CTs and Besu/DB growth. + - **Recommendations:** + 1. **Short term:** + - Run log/journal prune on all r630-01 CTs regularly (e.g. `fix-storage-r630-01-and-thin5.sh` Phase 2, or a cron job). + - Keep storage growth collection (e.g. every 6h) and review weekly when > 70%. + 2. **Before 85%:** + - Move one or more large CTs to **thin1** on r630-01 (thin1 ~43% used, has space) if VMIDs allow, or plan migration to r630-02 thin pools. + - Identify biggest CTs: `check-disk-all-vmids.sh` and `lvs` on r630-01 (data pool). + 3. **Before 90%:** + - Decide on expansion (e.g. add disks to RAID10 and extend md0/LVM) or permanent migration of several CTs to r630-02. + - **Do not** let this pool sit above 85% for long; it has already hit 100% once. + +- **thin1 (~43%)** + - **Rate:** Moderate. + - **Recommendations:** Use as spillover for data pool migrations when possible. Monitor monthly; act if > 75%. + +### r630-02 + +- **thin1-r630-02 (~26%)** + - **Rate:** Low. + - **Recommendation:** Monitor; no change needed unless you add many CTs here. + +- **thin2 (~9% after 5000 migration)** + - **Rate:** May grow with Blockscout (5000) and other CTs. + - **Recommendations:** + - Run VMID 5000 prune periodically: `vmid5000-free-disk-and-logs.sh`. + - If thin2 approaches 75%, consider moving one CT to thin5 (now empty) or thin6. + +- **thin3, thin4, thin6 (roughly 11–22%)** + - **Rate:** Low to moderate. + - **Recommendation:** Include in weekly pvesm/lvs review; no special action unless one pool trends > 75%. + +- **thin5 (0% after migration)** + - **Recommendation:** Keep as reserve for migrations from thin2 or other pools when they approach WARN. + +--- + +## 4. Operational schedule (by fill rate) + +| When | Action | +|------|--------| +| **Always** | Cron: `collect-storage-growth-data.sh --append` every 6h; weekly: `prune-storage-snapshots.sh` (e.g. Sun 08:00). | +| **Weekly** | Review `pvesm status` and `lvs` (or run `audit-proxmox-rpc-storage.sh`); check any pool > 70%. | +| **75% ≤ use < 85%** | Plan and run prune; plan migration for largest CTs on that pool; consider using ml110 sdb (if not yet in use). | +| **85% ≤ use < 95%** | Execute prune and migration within 1–2 weeks; do not add new large VMs/CTs to that pool. | +| **≥ 95%** | Immediate prune + migration; consider emergency migration to ml110 (after adding sdb) or r630-02. | + +--- + +## 5. Scripts to support these recommendations + +| Script | Purpose | +|--------|--------| +| `scripts/monitoring/collect-storage-growth-data.sh --append` | Record fill over time (for rate). | +| `scripts/maintenance/schedule-storage-growth-cron.sh --install` | Install 6h collect + weekly prune. | +| `scripts/audit-proxmox-rpc-storage.sh` | Current pvesm + RPC rootfs mapping. | +| `scripts/maintenance/check-disk-all-vmids.sh` | Per-CT disk usage (find big consumers). | +| `scripts/maintenance/fix-storage-r630-01-and-thin5.sh` | Prune 5000 + r630-01 CT logs; optional migrate 5000. | +| `scripts/maintenance/migrate-ct-r630-01-data-to-thin1.sh ` | Migrate one CT from r630-01 data → thin1 (same host). | +| `scripts/maintenance/vmid5000-free-disk-and-logs.sh` | Prune Blockscout (5000) only. | + +--- + +## 6. Adding ml110 sdb to increase capacity (suggested steps) + +1. On ml110: `vgextend pve /dev/sdb` (if sdb is already a PV) or `pvcreate /dev/sdb && vgextend pve /dev/sdb`. +2. Extend the data thin pool: `lvextend -L +900G /dev/pve/data` (or use `lvextend -l +100%FREE` and adjust as needed). +3. Re-run `pvesm status` and update documentation. +4. No CT migration required; existing LVs on data can use the new space. + +(If sdb is a raw disk with no PV, partition or use full disk as PV per your policy; then add to `pve` and extend the data LV as above.) + +--- + +## 7. Summary table by risk + +| Host | Pool | Current (approx) | Risk | Priority recommendation | +|------|------|-------------------|------|--------------------------| +| ml110 | data | ~11% (post-extension) | Low | **Done:** sdb added; pool ~1.7 TB. Monitor as before. | +| ml110 | sdb | In use (extended data) | — | **Done:** sdb added to pve, data thin pool extended (~1.7 TB total). | +| r630-01 | data | ~72% | High | Prune weekly; plan migrations before 85%; consider thin1 spillover. | +| r630-01 | thin1 | ~43% | Medium | Use for migrations from data; monitor monthly. | +| r630-02 | thin1-r630-02 | ~26% | Low | Monitor. | +| r630-02 | thin2 | ~9% | Low | Prune 5000 periodically; watch growth. | +| r630-02 | thin5 | 0% | Low | Keep as reserve for migrations. | +| r630-02 | thin3, thin4, thin6 | ~11–22% | Low | Include in weekly review. | + +These recommendations are based on the rate of filling observed in history and current configurations; adjust thresholds or schedule if your growth pattern changes. diff --git a/docs/04-configuration/THIRDWEB_BRIDGE_VS_CCIP.md b/docs/04-configuration/THIRDWEB_BRIDGE_VS_CCIP.md new file mode 100644 index 0000000..e87f95c --- /dev/null +++ b/docs/04-configuration/THIRDWEB_BRIDGE_VS_CCIP.md @@ -0,0 +1,41 @@ +# Thirdweb Bridge Tab vs Custom CCIP Bridge – Do You Deploy a Contract? + +**Short answer:** +**No.** For the **Thirdweb** bridge tab in the Interoperability Bridge app, you do **not** deploy any contract. That tab embeds Thirdweb’s hosted bridge (iframe to `thirdweb.com/bridge`). Thirdweb runs the bridge contracts and supports a fixed set of chains (85+). You only need a **Thirdweb Client ID** (from the [thirdweb dashboard](https://thirdweb.com/dashboard)) and `VITE_THIRDWEB_CLIENT_ID` in the dapp env. + +**Custom CCIP bridge (Custom tab):** +For the **Custom** tab (Wrap → Approve → Bridge WETH9 via CCIP), **you do** use your own deployed contracts on Chain 138 and mainnet: WETH9, WETH9 Bridge (CCIP), and LINK for fees. Those are already configured in `config/bridge.ts` and the Custom tab uses them. No extra “Thirdweb bridge contract” is required for the Thirdweb tab. + +--- + +## 1. Thirdweb tab (iframe) + +- **What it is:** The “ThirdWeb” tab loads Thirdweb’s **hosted** bridge UI in an iframe: + `https://thirdweb.com/bridge?clientId=...&fromChain=138&toChain=...` +- **Who runs the contracts:** Thirdweb. Their bridge supports a fixed list of chains (85+). Chain 138 may or may not be in that list. +- **What you need:** + - A thirdweb project and **Client ID**. + - `VITE_THIRDWEB_CLIENT_ID` set in the frontend-dapp env (or the fallback in code). +- **Do you deploy a contract?** **No.** You do not deploy any contract for this tab. + +If Chain 138 is not supported by Thirdweb’s bridge, the iframe may show an error or “no entry” until Thirdweb adds Chain 138. For Chain 138 → EVM bridging that you control, use the **Custom** tab with your CCIP contracts. + +--- + +## 2. Custom tab (CCIP) + +- **What it is:** Your own UI (BridgeButtons, etc.) that talks to your WETH9 and WETH9 Bridge (CCIP) contracts on Chain 138 and LINK on mainnet. +- **Who runs the contracts:** You (addresses in `config/bridge.ts` / env). +- **What you need:** Deployed WETH9, WETH9 Bridge, and LINK (and any allowlists) on Chain 138 and mainnet as per your deployment runbooks. +- **Do you deploy a contract?** **Yes.** This tab uses **your** deployed CCIP/bridge contracts; no Thirdweb bridge contract is involved. + +--- + +## 3. Summary + +| Tab | Contract deployment for the bridge? | Who runs bridge contracts? | +|----------|--------------------------------------|-----------------------------| +| ThirdWeb | **No** | Thirdweb (hosted) | +| Custom | **Yes** (WETH9, WETH9 Bridge, LINK) | You (Chain 138 + mainnet) | + +So: **there is no separate “Thirdweb bridge contract” for you to deploy.** For the Thirdweb tab you only need a Client ID; for the Custom tab you use your existing CCIP bridge deployment. diff --git a/docs/04-configuration/THIRDWEB_WALLETS_INTEGRATION.md b/docs/04-configuration/THIRDWEB_WALLETS_INTEGRATION.md new file mode 100644 index 0000000..a09093c --- /dev/null +++ b/docs/04-configuration/THIRDWEB_WALLETS_INTEGRATION.md @@ -0,0 +1,124 @@ +# Thirdweb Wallets – Documentation Review and Integration + +**Purpose:** Review [thirdweb Wallets portal](https://portal.thirdweb.com/wallets) and document how we use or can fully integrate user/embedded wallets (email, phone, social, passkey, external) across the repo. + +**References:** [thirdweb Wallets – Get Started](https://portal.thirdweb.com/wallets), [User Wallets](https://portal.thirdweb.com/wallets/users), [External Wallets](https://portal.thirdweb.com/wallets/external-wallets), [Quickstart (TypeScript/React)](https://portal.thirdweb.com/wallets/quickstart), [Connect SDK v5](https://portal.thirdweb.com/react/v5). + +--- + +## 1. Portal overview + +The thirdweb Wallets section covers: + +- **User wallets (embedded/in-app):** Email, phone, social OAuth (Google, Apple, Facebook, Discord, X, etc.), passkey, guest, custom JWT. +- **External wallets:** 500+ wallets, EIP-6963; MetaMask, WalletConnect, Coinbase Wallet, etc. +- **Server wallets:** Backend-controlled wallets (send tx, monitor). +- **Gas sponsorship / session keys:** Optional. + +For each user, thirdweb can create a **non-custodial wallet** and expose it via SDK or HTTP API. + +--- + +## 2. HTTP API (Wallets) + +Relevant for backend or headless flows: + +| Endpoint | Purpose | +|----------|--------| +| `POST /v1/auth/initiate` | Start auth (email, phone, passkey, SIWE); get challenge. | +| `POST /v1/auth/complete` | Verify and complete auth; returns `token`, `userId`, `walletAddress`. | +| `GET /v1/auth/social` | Redirect to OAuth provider (`provider`, `redirectUrl`). | +| `GET /v1/wallets/me` | Get authenticated user wallet (use token from complete). | + +**Headers:** + +- **Frontend:** `x-client-id` (project Client ID). +- **Backend:** `x-secret-key` (Dashboard → Settings → API Keys); never in frontend. + +**Auth flow (e.g. email):** + +1. `POST /v1/auth/initiate` with `{ "type": "email", "email": "user@example.com" }`. +2. User receives code; then `POST /v1/auth/complete` with `{ "type": "email", "email": "...", "code": "123456" }`. +3. Response includes `token`, `walletAddress`; use `token` for `GET /v1/wallets/me` or other authenticated calls. + +**Custom auth:** If you already have an auth system, you can attach thirdweb wallets via [Custom Authentication](https://portal.thirdweb.com/wallets/custom-auth). + +--- + +## 3. Current usage in this repo + +| Area | What we use | Notes | +|------|-------------|--------| +| **smom-dbis-138/frontend-dapp** | `ThirdwebProvider` (v4), `useAddress` / `useBalance` / `useContract` from `@thirdweb-dev/react`; bridge UI uses thirdweb v4 hooks. | Connect UI is **wagmi** (MetaMask, WalletConnect, Coinbase) in `WalletConnect.tsx`; no embedded wallet (email/social) yet. | +| **x402-api** | `thirdweb` v5: `createThirdwebClient`, `facilitator`, `settlePayment` from `thirdweb/x402`; custom Chain 138. | Server-side only; no user wallets. | +| **explorer-monorepo** | Raw ethers + MetaMask + custom `/api/v1/auth/nonce` and `/api/v1/auth/wallet`. | No thirdweb SDK. | + +**Secrets / env:** + +- **frontend-dapp:** `VITE_THIRDWEB_CLIENT_ID`, `VITE_WALLETCONNECT_PROJECT_ID` (see [MASTER_SECRETS.md](MASTER_SECRETS.md), [DAPP_LXC_DEPLOYMENT.md](../03-deployment/DAPP_LXC_DEPLOYMENT.md)). +- **x402-api:** `THIRDWEB_SECRET_KEY` (backend only). + +--- + +## 4. Full integration options + +### 4.1 Frontend: one connect experience (embedded + external) + +**Goal:** Single “Connect” that supports both **in-app wallets** (email, phone, social) and **external wallets** (MetaMask, WalletConnect, etc.) as in the [portal Get Started](https://portal.thirdweb.com/wallets) and [Quickstart](https://portal.thirdweb.com/wallets/quickstart). + +**Recommended path: thirdweb SDK v5** + +- Portal and Quickstart use **v5** (`thirdweb` package, `thirdweb/react`). +- v5 provides `ConnectButton` / `ConnectEmbed`, `inAppWallet({ auth: { options: ["email", "google", "passkey", ...] } })`, and 500+ external wallets with smaller bundle and better perf than v4. +- v4 (`@thirdweb-dev/react`) is still in use in the dapp for contract hooks; v5 can run [alongside v4](https://portal.thirdweb.com/react/v5/migrate) for a gradual move. + +**Steps:** + +1. **Add v5 and a dedicated wallets flow (e.g. demo page)** + - Install: `npm i thirdweb`. + - Use `createThirdwebClient({ clientId })`, `ThirdwebProvider`, `ConnectButton` from `thirdweb/react`. + - Configure `ConnectButton` with `inAppWallet({ auth: { options: ["email", "google", "apple", "passkey"] } })` so users can sign in with email/social or connect MetaMask/WalletConnect. + - **Done:** The frontend-dapp has a **Wallets** page (`/wallets`, `src/pages/WalletsDemoPage.tsx`) that uses only v5: `ConnectButton` with in-app wallet + external wallets, `useActiveAccount`, `useWalletBalance` on Chain 138. Use it to try email/social/external connect without changing the rest of the app. + +2. **Unify connect UI (full integration)** + - Replace the current wagmi-only connect modal in `Layout` / `WalletConnect.tsx` with thirdweb v5’s `ConnectButton` (or `ConnectEmbed`) so the same button offers embedded + external. + - Migrate bridge and other features from v4 hooks to v5: e.g. `useAddress` → `useActiveAccount`, `useContract`/`useContractWrite` → v5 contract extensions + `useSendTransaction` (see [v5 migrate](https://portal.thirdweb.com/react/v5/migrate)). + - Keep Chain 138 in v5 (e.g. `defineChain` or use a chain list that includes 138) so the same RPC and chain are used. + +3. **Env** + - Use the same `VITE_THIRDWEB_CLIENT_ID` (and optional `VITE_WALLETCONNECT_PROJECT_ID` if needed by v5). No backend secret in frontend. + +### 4.2 Backend: optional use of Wallets API + +- If you need to **resolve or manage user wallets server-side** (e.g. after a custom auth), call `GET /v1/wallets/me` with the thirdweb token, or use the HTTP auth flow (`/v1/auth/initiate`, `/v1/auth/complete`) with `x-secret-key` from a secure backend. +- **x402-api** already uses `THIRDWEB_SECRET_KEY` for x402; the same key can be used for server-side Wallets API calls if you add them. + +### 4.3 Explorer (Blockscout frontend) + +- The explorer uses ethers + MetaMask and custom auth endpoints; it does not use thirdweb. +- Full thirdweb Wallets integration there would mean adding the thirdweb SDK and either replacing or complementing the current connect flow with `ConnectButton` + in-app wallet; that’s a separate, optional project. + +--- + +## 5. Checklist for “fully integrated” thirdweb Wallets + +- [x] **Documentation:** This file + links to portal (Get Started, Users, Quickstart, v5 migrate). +- [x] **Client ID:** `VITE_THIRDWEB_CLIENT_ID` set in frontend-dapp (and any other app that uses thirdweb). +- [x] **Connect UI (demo):** `/wallets` page with v5 `ConnectButton` + `inAppWallet` (email, google, apple, passkey) + external wallets; Chain 138 balance shown. +- [ ] **Chain 138:** Supported in the thirdweb client/chains config used by the dapp. +- [ ] **Migration (optional):** Bridge and other components moved from v4 hooks to v5 extensions/hooks so one account source is used everywhere. +- [ ] **Backend (optional):** Use of `/v1/wallets/me` or auth endpoints from a secure service when needed. + +--- + +## 6. Quick links + +- [Wallets – Get Started](https://portal.thirdweb.com/wallets) +- [User Wallets (auth methods)](https://portal.thirdweb.com/wallets/users) +- [External Wallets](https://portal.thirdweb.com/wallets/external-wallets) +- [Quickstart (TypeScript/React)](https://portal.thirdweb.com/wallets/quickstart) +- [React v5 ConnectButton / ConnectEmbed](https://portal.thirdweb.com/react/v5/components/ConnectButton) +- [In-App Wallet (v5)](https://portal.thirdweb.com/react/v5/in-app-wallet/get-started) +- [Migrate from v4 to v5](https://portal.thirdweb.com/react/v5/migrate) +- [API Reference – Authentication](https://portal.thirdweb.com/reference#tag/authentication) +- [Custom auth](https://portal.thirdweb.com/wallets/custom-auth) diff --git a/docs/04-configuration/TOKEN_AGGREGATION_REPORT_API_RUNBOOK.md b/docs/04-configuration/TOKEN_AGGREGATION_REPORT_API_RUNBOOK.md new file mode 100644 index 0000000..da3f8a3 --- /dev/null +++ b/docs/04-configuration/TOKEN_AGGREGATION_REPORT_API_RUNBOOK.md @@ -0,0 +1,124 @@ +# Token-Aggregation Report API — Reachability Runbook + +**Purpose:** Ensure `GET /api/v1/report/coingecko`, `GET /api/v1/report/cmc`, and `GET /api/v1/report/token-list` are reachable for CoinGecko/CMC submission and Chain 138 Snap. + +--- + +## 1. Verify current state + +```bash +# From repo root +bash metamask-integration/chain138-snap/scripts/verify-snap-api-and-icons.sh https://explorer.d-bis.org +``` + +**Expected when working:** Token list and networks return valid JSON with `.tokens` and `.networks`. + +**If you see "no .tokens" or "no .networks":** The `/api/v1/` path is likely proxied to Blockscout (or another backend) instead of token-aggregation. Proceed to §2. + +--- + +## 2. Deploy token-aggregation (if not running) + +### 2.1 On explorer VM (VMID 5000) or dedicated host + +1. **Deploy the service:** + ```bash + cd smom-dbis-138/services/token-aggregation + cp .env.example .env + # Edit .env: DATABASE_URL, CUSDC_ADDRESS_138, CUSDT_ADDRESS_138 (minimum for report) + npm install && npm run build + ``` + +2. **Run via systemd** (or use `deploy-to-proxmox.sh` / `deploy-to-vmid.sh`): + ```bash + # Example systemd unit + ExecStart=/usr/bin/node /opt/token-aggregation/dist/index.js + WorkingDirectory=/opt/token-aggregation + ``` + +3. **Verify locally:** + ```bash + curl -s "http://localhost:3000/api/v1/report/token-list?chainId=138" | jq '.tokens | length' + curl -s "http://localhost:3000/api/v1/report/coingecko?chainId=138" | jq '.' + curl -s "http://localhost:3000/api/v1/networks" | jq '.networks | length' + ``` + +### 2.2 Minimum env for report API + +| Var | Purpose | +|-----|---------| +| `CUSDC_ADDRESS_138` | cUSDC on Chain 138 | +| `CUSDT_ADDRESS_138` | cUSDT on Chain 138 | +| `CHAIN_138_RPC_URL` or `RPC_URL_138` | RPC for indexing | +| `DATABASE_URL` | PostgreSQL (required for full service) | + +**Note:** The report endpoints may work with minimal config; full indexing requires DB and RPC. + +--- + +## 3. Proxy /api/v1/ to token-aggregation (explorer.d-bis.org) + +If token-aggregation runs on the **explorer VM** (e.g. port 3000): + +```bash +# SSH to explorer VM (VMID 5000), then: +TOKEN_AGG_PORT=3000 CONFIG_FILE=/etc/nginx/sites-available/blockscout \ + bash /path/to/explorer-monorepo/scripts/apply-nginx-token-aggregation-proxy.sh +``` + +This inserts `location /api/v1/` proxying to `http://127.0.0.1:3000/api/v1/`. **Important:** The token-aggregation `location` must be defined **before** any Blockscout API `location` that might also match `/api/v1/`, so token-aggregation takes precedence. + +### 3.1 If token-aggregation runs elsewhere + +- **Option A:** Run token-aggregation on the explorer host (same machine as nginx) and proxy to `127.0.0.1:3000`. +- **Option B:** Run on a different host; proxy to that host, e.g. `proxy_pass http://192.168.11.XXX:3000/api/v1/;` +- **Option C:** Use a separate domain (e.g. `api.d-bis.org`) for the token-aggregation API and set `GATSBY_SNAP_API_BASE_URL` to that URL when building the Snap site. + +--- + +## 4. Re-verify + +```bash +bash metamask-integration/chain138-snap/scripts/verify-snap-api-and-icons.sh https://explorer.d-bis.org +``` + +All checks should pass. Then: + +```bash +curl -s "https://explorer.d-bis.org/api/v1/report/coingecko?chainId=138" -o report-coingecko-138.json +curl -s "https://explorer.d-bis.org/api/v1/report/cmc?chainId=138" -o report-cmc-138.json +``` + +Use these files for CoinGecko/CMC submission per [CMC_COINGECKO_SUBMISSION_RUNBOOK](coingecko/CMC_COINGECKO_SUBMISSION_RUNBOOK.md). + +--- + +## 5. Troubleshooting + +| Issue | Cause | Fix | +|-------|-------|-----| +| `curl .../api/v1/report/token-list` returns Blockscout-style JSON (`message`, `result`, `status`) | `/api/v1/` proxied to Blockscout, not token-aggregation | Ensure token-aggregation `location` is first; reload nginx | +| Connection refused to 127.0.0.1:3000 | Token-aggregation not running | Start service; check `systemctl status token-aggregation` | +| Empty `tokens` array | `CUSDC_ADDRESS_138`, `CUSDT_ADDRESS_138` unset or wrong | Set in `.env`; restart service | +| 502 Bad Gateway | Token-aggregation crashed or wrong port | Check logs; verify `TOKEN_AGG_PORT` matches service | + +--- + +## 6. Quick commands summary + +```bash +# 1. Verify (from repo root) +bash metamask-integration/chain138-snap/scripts/verify-snap-api-and-icons.sh https://explorer.d-bis.org + +# 2. Export for submission (after API is reachable) +curl -s "https://explorer.d-bis.org/api/v1/report/coingecko?chainId=138" -o report-coingecko-138.json +curl -s "https://explorer.d-bis.org/api/v1/report/cmc?chainId=138" -o report-cmc-138.json +``` + +--- + +## 7. Related docs + +- [PRICE_FEED_CHAIN138_METAMASK_AND_WALLETS](PRICE_FEED_CHAIN138_METAMASK_AND_WALLETS.md) — Price feed checklist +- [CMC_COINGECKO_SUBMISSION_RUNBOOK](coingecko/CMC_COINGECKO_SUBMISSION_RUNBOOK.md) — Export and submit +- [smom-dbis-138/services/token-aggregation/README.md](../../../smom-dbis-138/services/token-aggregation/README.md) — Service setup diff --git a/docs/04-configuration/TOKEN_LISTS_E2E_VERIFICATION.md b/docs/04-configuration/TOKEN_LISTS_E2E_VERIFICATION.md new file mode 100644 index 0000000..209801b --- /dev/null +++ b/docs/04-configuration/TOKEN_LISTS_E2E_VERIFICATION.md @@ -0,0 +1,94 @@ +# Token Lists E2E Verification Report + +**Date:** 2026-02-28 +**Status:** Verification complete + +--- + +## 1. Token List Validation + +| List | Status | Tokens | Notes | +|------|--------|--------|-------| +| dbis-138.tokenlist.json | ✅ Valid | 6 | All IPFS logos, EIP-55 checksummed | +| cronos.tokenlist.json | ✅ Valid | 10 | All IPFS logos, ISO-4217 W tokens | +| all-mainnet.tokenlist.json | ✅ Valid | 9 | All 9 tokens have logoURI (IPFS) | +| DUAL_CHAIN_TOKEN_LIST | ✅ Valid | 22 | Chains 138, 1, 25, 651940 | + +--- + +## 2. Cross-File Consistency + +| Check | Result | +|-------|--------| +| Chain 138 addresses (dbis-138 vs DUAL_CHAIN) | ✅ Consistent | +| Cronos addresses (cronos vs DUAL_CHAIN) | ✅ Consistent | +| DUAL_CHAIN synced to backend/config, docs, metamask | ✅ Done | + +--- + +## 3. IPFS Manifest + +- **addressToUrl:** 14 of 22 DUAL_CHAIN addresses covered +- **Missing:** Chain 1 (USDT, USDC, DAI, ETH-USD, WETH) and Chain 651940 USDC, Cronos WETH9/LINK — these use external logo URLs in token lists (TrustWallet, ethereum.org) +- **Our tokens (138, 25):** All covered + +--- + +## 4. Explorer API (`/api/config/token-list`) + +| Check | Result | +|-------|--------| +| Public URL | ❌ Returns 400 (Blockscout error) | +| Cause | Nginx config not yet applied on VMID 5000 | +| Fix | Run on Proxmox host: | +| | 1. `fix-nginx-conflicts-vmid5000.sh` (inside VMID 5000) | +| | 2. `deploy-explorer-config-to-vmid5000.sh` (from repo root, with pct or EXEC_MODE=ssh) | + +--- + +## 5. Deploy Script + +| Check | Result | +|-------|--------| +| Config source path | ✅ Correct | +| pct mode | Requires Proxmox host | +| ssh mode | `EXEC_MODE=ssh EXPLORER_IP=192.168.11.140 ./explorer-monorepo/scripts/deploy-explorer-config-to-vmid5000.sh` | + +--- + +## 6. Nginx Location Order + +``` +location = /api/config/token-list # Exact match (highest priority) +location = /api/config/networks +location /api/v1/ # Token-aggregation +location /api/ # Blockscout (fallback) +``` + +✅ Correct — `/api/config/*` takes precedence over `/api/` + +--- + +## 7. Frontend tokenIcons.ts + +- Chain 138: 6 addresses ✅ +- Cronos WETH9, LINK, ISO-4217 W tokens: 9 addresses ✅ + +--- + +## 8. E2E Checklist (Operator) + +To achieve full E2E: + +1. [ ] SSH to Proxmox host (or VMID 5000) +2. [ ] Run `fix-nginx-conflicts-vmid5000.sh` inside VMID 5000 +3. [ ] Run `deploy-explorer-config-to-vmid5000.sh` from repo root (pct or ssh) +4. [ ] Verify: `curl -s https://explorer.d-bis.org/api/config/token-list | jq '.tokens | length'` → 22 +5. [ ] Verify: `curl -s https://explorer.d-bis.org/api/config/networks | jq '.chains | length'` → 4 + +--- + +## 9. Completed Improvements + +- ✅ all-mainnet: logoURI added for HYDX, HYBX, CHT, AUDA +- ✅ tokenIcons.ts: Cronos WETH9, LINK added to TOKEN_ICON_BY_ADDRESS diff --git a/docs/04-configuration/TOKEN_LIST_PR_REVIEW.md b/docs/04-configuration/TOKEN_LIST_PR_REVIEW.md new file mode 100644 index 0000000..9b64598 --- /dev/null +++ b/docs/04-configuration/TOKEN_LIST_PR_REVIEW.md @@ -0,0 +1,198 @@ +# Token List PR Review — How Each Repo Handles Token Lists + +**Cloned repos:** `/home/intlc/projects/token-lists`, `chains`, `wallet-core`, `DefiLlama-Adapters` +**Last Updated:** 2026-02-28 + +--- + +## 1. Uniswap token-lists (`/home/intlc/projects/token-lists`) + +### What it is +- **Schema + TypeScript package**, not a registry of token lists +- Defines the Uniswap token list JSON schema (`src/tokenlist.schema.json`) +- Schema ID: `https://uniswap.org/tokenlist.schema.json` +- Used by tokenlists.org, Uniswap Interface, MetaMask, etc. + +### Token list format (from `example.tokenlist.json`) + +```json +{ + "name": "My Token List", + "logoURI": "ipfs://...", + "keywords": ["audited", "verified"], + "tags": { "stablecoin": { "name": "Stablecoin", "description": "..." } }, + "timestamp": "2020-06-12T00:00:00+00:00", + "tokens": [ + { + "chainId": 1, + "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "symbol": "USDC", + "name": "USD Coin", + "decimals": 6, + "logoURI": "ipfs://..." + } + ], + "version": { "major": 1, "minor": 0, "patch": 0 } +} +``` + +### Cross-chain (from `example-crosschain.tokenlist.json`) +- Same structure; tokens can have `extensions.bridgeInfo` mapping chainId → bridged address +- Each chain gets its own token entry with `chainId` + +### PR process +- **This repo does NOT host token lists** — it only provides the schema +- To add a list: host it (GitHub Raw, IPFS, ENS) and submit to **tokenlists.org** via https://github.com/Uniswap/tokenlists-org/issues (template: "add list request") +- Or use your own URL (e.g. `explorer.d-bis.org/api/v1/report/token-list`) + +### Chain 138 action +- Ensure `proxmox/token-lists/lists/dbis-138.tokenlist.json` validates against schema +- Host at GitHub Raw or explorer API +- Submit URL to tokenlists.org + +--- + +## 2. Chainlist / ethereum-lists/chains (`/home/intlc/projects/chains`) + +### What it is +- **Chain metadata** (RPC, explorers, native currency) — not token lists +- Used by chainlist.org, wallets, MESC, etc. +- File: `_data/chains/eip155-{chainId}.json` + +### Chain format (from `eip155-1.json`) + +```json +{ + "name": "Ethereum Mainnet", + "chain": "ETH", + "icon": "ethereum", + "rpc": ["https://mainnet.infura.io/...", "..."], + "features": [{"name": "EIP155"}, {"name": "EIP1559"}], + "faucets": [], + "nativeCurrency": { "name": "Ether", "symbol": "ETH", "decimals": 18 }, + "infoURL": "https://ethereum.org", + "shortName": "eth", + "chainId": 1, + "networkId": 1, + "slip44": 60, + "explorers": [{ "name": "etherscan", "url": "https://etherscan.io", "standard": "EIP3091" }] +} +``` + +### PR process +1. Add `_data/chains/eip155-138.json` +2. If using `icon`, add `_data/icons/defioraclemeta.json` (IPFS URL for logo) +3. Run `./gradlew run` and `npx prettier --write _data/*/*.json` +4. Open PR to https://github.com/ethereum-lists/chains + +### Chain 138 status +- **Not present** (no eip155-138.json in chains repo) +- PR-ready: `proxmox/docs/04-configuration/pr-ready/eip155-138.json` + +--- + +## 3. Trust Wallet wallet-core (`/home/intlc/projects/wallet-core`) + +### What it is +- **Coin/chain registry** for Trust Wallet app +- `registry.json` — flat array of coins/chains +- EVM chains have: `id`, `name`, `coinId`, `symbol`, `blockchain`, `chainId`, `explorer`, `info.rpc` + +### EVM chain format (from registry.json) + +```json +{ + "id": "ethereum", + "name": "Ethereum", + "coinId": 60, + "symbol": "ETH", + "decimals": 18, + "blockchain": "Ethereum", + "derivation": [{ "path": "m/44'/60'/0'/0/0" }], + "curve": "secp256k1", + "publicKeyType": "secp256k1Extended", + "chainId": "1", + "addressHasher": "keccak256", + "explorer": { + "url": "https://etherscan.io", + "txPath": "/tx/", + "accountPath": "/address/", + "sampleTx": "...", + "sampleAccount": "..." + }, + "info": { + "url": "https://ethereum.org", + "source": "https://github.com/ethereum/go-ethereum", + "rpc": "https://mainnet.infura.io", + "documentation": "..." + } +} +``` + +### PR process +1. Add entry to `registry.json` (EVM: `blockchain: "Ethereum"`, `chainId`, `explorer`, `info.rpc`) +2. Run codegen: `cd codegen-v2 && cargo run -- new-evmchain 138` (or per their CLI) +3. Extend derivation tests +4. Open PR to https://github.com/trustwallet/wallet-core + +### Chain 138 status +- **Not present** +- PR-ready: `proxmox/docs/04-configuration/pr-ready/trust-wallet-registry-chain138.json` + +--- + +## 4. DefiLlama-Adapters (`/home/intlc/projects/DefiLlama-Adapters`) + +### What it is +- **Protocol TVL adapters** — not token lists +- Each project (e.g. `dodo`, `1inch`) has `index.js` that exports `tvl(api)` per chain +- DefiLlama uses chain keys: `ethereum`, `bsc`, `polygon`, `arbitrum`, `avax`, `optimism`, `base`, etc. + +### Adapter format (from `dodo/index.js`) + +```javascript +const config = { + ethereum: { dvmFactory: '0x...', fromBlock: 10613640, ... }, + arbitrum: { dvmFactory: '0x...', fromBlock: 226578, ... }, + // Add new chain: chain138: { ... } +}; + +Object.keys(config).forEach(chain => { + module.exports[chain] = { + tvl: async (api) => { + // Fetch balances, return { 'ethereum:0xToken': balance } + } + }; +}); +``` + +### PR process +1. Add adapter under `projects/{protocol-name}/` +2. Export `tvl` (and optionally `staking`, `borrowed`) per chain +3. Chain 138 would need DefiLlama to add `chain138` as a supported chain key first (see docs.llama.fi) +4. Open PR to https://github.com/DefiLlama/DefiLlama-Adapters + +### Chain 138 action +- DefiLlama may not have `chain138` as a chain key yet +- Check `helper/chains.js` or similar for supported chains +- If adding DODO/other protocol on Chain 138, add config entry + tvl logic + +--- + +## Summary: PR Targets by Repo + +| Repo | Content | Chain 138 PR | +|------|---------|--------------| +| **token-lists** | Schema only; lists hosted elsewhere | N/A — use tokenlists.org issue to add list URL | +| **chains** | Chain metadata (eip155-138.json) | Add `_data/chains/eip155-138.json` | +| **wallet-core** | Coin/chain registry | Add entry to `registry.json` + codegen | +| **DefiLlama-Adapters** | Protocol TVL adapters | Add adapter for DODO/etc. on Chain 138 (if chain supported) | + +--- + +## References + +- [PUBLICATION_LOCATIONS_MASTER](PUBLICATION_LOCATIONS_MASTER.md) +- [pr-ready/eip155-138.json](pr-ready/eip155-138.json) +- [pr-ready/trust-wallet-registry-chain138.json](pr-ready/trust-wallet-registry-chain138.json) +- [ADD_CHAIN138_TO_TRUST_WALLET](ADD_CHAIN138_TO_TRUST_WALLET.md) diff --git a/docs/04-configuration/VERIFICATION_GAPS_AND_TODOS.md b/docs/04-configuration/VERIFICATION_GAPS_AND_TODOS.md index 87cb091..5f6b6a6 100644 --- a/docs/04-configuration/VERIFICATION_GAPS_AND_TODOS.md +++ b/docs/04-configuration/VERIFICATION_GAPS_AND_TODOS.md @@ -1,6 +1,6 @@ # Verification Scripts and Documentation - Gaps and TODOs -**Last Updated:** 2026-01-31 +**Last Updated:** 2026-03-02 **Document Version:** 1.0 **Status:** Active Documentation @@ -10,6 +10,8 @@ **Status**: Gap Analysis Complete **Purpose**: Identify all placeholders, missing components, and incomplete implementations +**Documentation note (2026-03-02):** Runbook placeholders (e.g. `your-token`, `your-password`) are intentional examples. In production, use values from `.env` only; do not commit secrets. [INGRESS_VERIFICATION_RUNBOOK.md](INGRESS_VERIFICATION_RUNBOOK.md) updated with a production note in Prerequisites. Other runbooks (NPMPLUS_BACKUP_RESTORE, SANKOFA_CUTOVER_PLAN) keep example placeholders; operators should source from .env when running commands. + --- ## Critical Missing Components @@ -106,7 +108,7 @@ - Line 125: `NPM_PASSWORD="your-password"` → Example placeholder (acceptable) - Line 178: `NPM_PASSWORD="your-password"` → Example placeholder (acceptable) -**Action Required**: Add clear notes that these are examples and should use `.env` file in production. +**Status (2026-03-02):** Addressed. INGRESS_VERIFICATION_RUNBOOK.md now includes a production note in Prerequisites. VERIFICATION_GAPS_AND_TODOS documents that runbooks use example placeholders and production should source from .env. --- diff --git a/docs/04-configuration/coingecko/COINGECKO_SUBMISSION_GUIDE.md b/docs/04-configuration/coingecko/COINGECKO_SUBMISSION_GUIDE.md index d4e1de4..07650fa 100644 --- a/docs/04-configuration/coingecko/COINGECKO_SUBMISSION_GUIDE.md +++ b/docs/04-configuration/coingecko/COINGECKO_SUBMISSION_GUIDE.md @@ -67,10 +67,18 @@ This guide provides step-by-step instructions for submitting cUSDT and cUSDC tok **Requirements:** - Format: PNG -- Size: 512x512 pixels +- Size: 512×512 pixels - Background: Transparent preferred - Quality: High resolution +**Quick prepare (script):** +```bash +# From repo root. Requires ImageMagick (convert) or Pillow for 512×512 resize. +# Install: apt install imagemagick OR pip install Pillow +./docs/04-configuration/coingecko/scripts/prepare-token-logos-512x512.sh +# Output: docs/04-configuration/coingecko/logos/*-512x512.png +``` + **Where to get logos:** - Use USDT/USDC logos as reference - Create distinct versions for cUSDT/cUSDC diff --git a/docs/04-configuration/coingecko/exports/report-cmc-1.json b/docs/04-configuration/coingecko/exports/report-cmc-1.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-cmc-1.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-cmc-10.json b/docs/04-configuration/coingecko/exports/report-cmc-10.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-cmc-10.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-cmc-100.json b/docs/04-configuration/coingecko/exports/report-cmc-100.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-cmc-100.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-cmc-1111.json b/docs/04-configuration/coingecko/exports/report-cmc-1111.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-cmc-1111.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-cmc-137.json b/docs/04-configuration/coingecko/exports/report-cmc-137.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-cmc-137.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-cmc-138.json b/docs/04-configuration/coingecko/exports/report-cmc-138.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-cmc-138.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-cmc-25.json b/docs/04-configuration/coingecko/exports/report-cmc-25.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-cmc-25.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-cmc-42161.json b/docs/04-configuration/coingecko/exports/report-cmc-42161.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-cmc-42161.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-cmc-42220.json b/docs/04-configuration/coingecko/exports/report-cmc-42220.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-cmc-42220.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-cmc-43114.json b/docs/04-configuration/coingecko/exports/report-cmc-43114.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-cmc-43114.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-cmc-56.json b/docs/04-configuration/coingecko/exports/report-cmc-56.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-cmc-56.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-cmc-651940.json b/docs/04-configuration/coingecko/exports/report-cmc-651940.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-cmc-651940.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-cmc-8453.json b/docs/04-configuration/coingecko/exports/report-cmc-8453.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-cmc-8453.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-coingecko-1.json b/docs/04-configuration/coingecko/exports/report-coingecko-1.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-coingecko-1.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-coingecko-10.json b/docs/04-configuration/coingecko/exports/report-coingecko-10.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-coingecko-10.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-coingecko-100.json b/docs/04-configuration/coingecko/exports/report-coingecko-100.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-coingecko-100.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-coingecko-1111.json b/docs/04-configuration/coingecko/exports/report-coingecko-1111.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-coingecko-1111.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-coingecko-137.json b/docs/04-configuration/coingecko/exports/report-coingecko-137.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-coingecko-137.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-coingecko-138.json b/docs/04-configuration/coingecko/exports/report-coingecko-138.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-coingecko-138.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-coingecko-25.json b/docs/04-configuration/coingecko/exports/report-coingecko-25.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-coingecko-25.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-coingecko-42161.json b/docs/04-configuration/coingecko/exports/report-coingecko-42161.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-coingecko-42161.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-coingecko-42220.json b/docs/04-configuration/coingecko/exports/report-coingecko-42220.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-coingecko-42220.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-coingecko-43114.json b/docs/04-configuration/coingecko/exports/report-coingecko-43114.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-coingecko-43114.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-coingecko-56.json b/docs/04-configuration/coingecko/exports/report-coingecko-56.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-coingecko-56.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-coingecko-651940.json b/docs/04-configuration/coingecko/exports/report-coingecko-651940.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-coingecko-651940.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-coingecko-8453.json b/docs/04-configuration/coingecko/exports/report-coingecko-8453.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-coingecko-8453.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/report-cross-chain-138.json b/docs/04-configuration/coingecko/exports/report-cross-chain-138.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/report-cross-chain-138.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/exports/token-list-all.json b/docs/04-configuration/coingecko/exports/token-list-all.json new file mode 100644 index 0000000..b0f5d11 --- /dev/null +++ b/docs/04-configuration/coingecko/exports/token-list-all.json @@ -0,0 +1 @@ +{"message":"Params 'module' and 'action' are required parameters","result":null,"status":"0"} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/logos/ipfs-manifest.json b/docs/04-configuration/coingecko/logos/ipfs-manifest.json new file mode 100644 index 0000000..1350b31 --- /dev/null +++ b/docs/04-configuration/coingecko/logos/ipfs-manifest.json @@ -0,0 +1,122 @@ +{ + "gateway": "https://ipfs.io/ipfs", + "symbols": { + "cEURT": { + "cid": "QmWUVjZ4V6nUGgbvDGeVcQbd2V395TmjaLDdm87tF8VDC1", + "url": "https://ipfs.io/ipfs/QmWUVjZ4V6nUGgbvDGeVcQbd2V395TmjaLDdm87tF8VDC1" + }, + "cEURC": { + "cid": "QmNPq4D5JXzurmi9jAhogVMzhAQRk1PZ1r9H3qQUV9gjDm", + "url": "https://ipfs.io/ipfs/QmNPq4D5JXzurmi9jAhogVMzhAQRk1PZ1r9H3qQUV9gjDm" + }, + "USDW": { + "cid": "QmNPq4D5JXzurmi9jAhogVMzhAQRk1PZ1r9H3qQUV9gjDm", + "url": "https://ipfs.io/ipfs/QmNPq4D5JXzurmi9jAhogVMzhAQRk1PZ1r9H3qQUV9gjDm" + }, + "cUSDC": { + "cid": "QmNPq4D5JXzurmi9jAhogVMzhAQRk1PZ1r9H3qQUV9gjDm", + "url": "https://ipfs.io/ipfs/QmNPq4D5JXzurmi9jAhogVMzhAQRk1PZ1r9H3qQUV9gjDm", + "address138": "0xf22258f57794CC8E06237084b353Ab30fFfa640b" + }, + "cUSDT": { + "cid": "QmRfhPs9DcyFPpGjKwF6CCoVDWUHSxkQR34n9NK7JSbPCP", + "url": "https://ipfs.io/ipfs/QmRfhPs9DcyFPpGjKwF6CCoVDWUHSxkQR34n9NK7JSbPCP", + "address138": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22" + }, + "CHFW": { + "cid": "Qmb9JmuD9ehaQtTLBBZmAoiAbvE53e3FMjkEty8rvbPf9K", + "url": "https://ipfs.io/ipfs/Qmb9JmuD9ehaQtTLBBZmAoiAbvE53e3FMjkEty8rvbPf9K" + }, + "CADW": { + "cid": "Qmb9JmuD9ehaQtTLBBZmAoiAbvE53e3FMjkEty8rvbPf9K", + "url": "https://ipfs.io/ipfs/Qmb9JmuD9ehaQtTLBBZmAoiAbvE53e3FMjkEty8rvbPf9K" + }, + "cJPYC": { + "cid": "Qmb9JmuD9ehaQtTLBBZmAoiAbvE53e3FMjkEty8rvbPf9K", + "url": "https://ipfs.io/ipfs/Qmb9JmuD9ehaQtTLBBZmAoiAbvE53e3FMjkEty8rvbPf9K" + }, + "AUDW": { + "cid": "Qmb9JmuD9ehaQtTLBBZmAoiAbvE53e3FMjkEty8rvbPf9K", + "url": "https://ipfs.io/ipfs/Qmb9JmuD9ehaQtTLBBZmAoiAbvE53e3FMjkEty8rvbPf9K" + }, + "JPYW": { + "cid": "Qmb9JmuD9ehaQtTLBBZmAoiAbvE53e3FMjkEty8rvbPf9K", + "url": "https://ipfs.io/ipfs/Qmb9JmuD9ehaQtTLBBZmAoiAbvE53e3FMjkEty8rvbPf9K" + }, + "cXAUT": { + "cid": "Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong", + "url": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong" + }, + "cXAUC": { + "cid": "Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong", + "url": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong" + }, + "GBPW": { + "cid": "QmT2nJ6WyhYBCsYJ6NfS1BPAqiGKkCEuMxiC8ye93Co1hF", + "url": "https://ipfs.io/ipfs/QmT2nJ6WyhYBCsYJ6NfS1BPAqiGKkCEuMxiC8ye93Co1hF" + }, + "WETH": { + "cid": "Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong", + "url": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong", + "address138": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" + }, + "WETH10": { + "cid": "QmanDFPHxnbKd6SSNzzXHf9GbpL9dLXSphxDZSPPYE6ds4", + "url": "https://ipfs.io/ipfs/QmanDFPHxnbKd6SSNzzXHf9GbpL9dLXSphxDZSPPYE6ds4", + "address138": "0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9F" + }, + "cAUDC": { + "cid": "QmPh16PY241zNtePyeK7ep1uf1RcARV2ynGAuRU8U7sSqS", + "url": "https://ipfs.io/ipfs/QmPh16PY241zNtePyeK7ep1uf1RcARV2ynGAuRU8U7sSqS" + }, + "EURW": { + "cid": "QmPh16PY241zNtePyeK7ep1uf1RcARV2ynGAuRU8U7sSqS", + "url": "https://ipfs.io/ipfs/QmPh16PY241zNtePyeK7ep1uf1RcARV2ynGAuRU8U7sSqS" + }, + "cCADC": { + "cid": "QmPh16PY241zNtePyeK7ep1uf1RcARV2ynGAuRU8U7sSqS", + "url": "https://ipfs.io/ipfs/QmPh16PY241zNtePyeK7ep1uf1RcARV2ynGAuRU8U7sSqS" + }, + "cCHFC": { + "cid": "QmPh16PY241zNtePyeK7ep1uf1RcARV2ynGAuRU8U7sSqS", + "url": "https://ipfs.io/ipfs/QmPh16PY241zNtePyeK7ep1uf1RcARV2ynGAuRU8U7sSqS" + }, + "cGBPT": { + "cid": "QmV4frsJmDTWzLdxdj1z81uMqVXcbGpHZLzwkpj6GvEX4k", + "url": "https://ipfs.io/ipfs/QmV4frsJmDTWzLdxdj1z81uMqVXcbGpHZLzwkpj6GvEX4k" + }, + "cGBPC": { + "cid": "QmNQF73WjxU6FwTXNH8PXoDRFaSFKTYQWL7d4Q1kdRVJ4o", + "url": "https://ipfs.io/ipfs/QmNQF73WjxU6FwTXNH8PXoDRFaSFKTYQWL7d4Q1kdRVJ4o" + }, + "ETH-USD": { + "cid": "QmPZuycjyJEe2otREuQ5HirvPJ8X6Yc6MBtwz1VhdD79pY", + "url": "https://ipfs.io/ipfs/QmPZuycjyJEe2otREuQ5HirvPJ8X6Yc6MBtwz1VhdD79pY", + "address138": "0x3304b747E565a97ec8AC220b0B6A1f6ffDB837e6" + }, + "LINK": { + "cid": "QmenWcmfNGfssz4HXvrRV912eZDiKqLTt6z2brRYuTGz9A", + "url": "https://ipfs.io/ipfs/QmenWcmfNGfssz4HXvrRV912eZDiKqLTt6z2brRYuTGz9A", + "address138": "0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03" + }, + "LiXAU": { + "cid": "QmUVY5trUM5N1UnS4abReb66fNzGw7kenjU9AjL7TgR3M1", + "url": "https://ipfs.io/ipfs/QmUVY5trUM5N1UnS4abReb66fNzGw7kenjU9AjL7TgR3M1" + } + }, + "addressToUrl": { + "0xf22258f57794CC8E06237084b353Ab30fFfa640b": "https://ipfs.io/ipfs/QmNPq4D5JXzurmi9jAhogVMzhAQRk1PZ1r9H3qQUV9gjDm", + "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22": "https://ipfs.io/ipfs/QmRfhPs9DcyFPpGjKwF6CCoVDWUHSxkQR34n9NK7JSbPCP", + "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong", + "0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9F": "https://ipfs.io/ipfs/QmanDFPHxnbKd6SSNzzXHf9GbpL9dLXSphxDZSPPYE6ds4", + "0x3304b747E565a97ec8AC220b0B6A1f6ffDB837e6": "https://ipfs.io/ipfs/QmPZuycjyJEe2otREuQ5HirvPJ8X6Yc6MBtwz1VhdD79pY", + "0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03": "https://ipfs.io/ipfs/QmenWcmfNGfssz4HXvrRV912eZDiKqLTt6z2brRYuTGz9A", + "0x948690147D2e50ffe50C5d38C14125aD6a9FA036": "https://ipfs.io/ipfs/QmNPq4D5JXzurmi9jAhogVMzhAQRk1PZ1r9H3qQUV9gjDm", + "0x58a8D8F78F1B65c06dAd7542eC46b299629A60dd": "https://ipfs.io/ipfs/QmPh16PY241zNtePyeK7ep1uf1RcARV2ynGAuRU8U7sSqS", + "0xFb4B6Cc81211F7d886950158294A44C312abCA29": "https://ipfs.io/ipfs/QmT2nJ6WyhYBCsYJ6NfS1BPAqiGKkCEuMxiC8ye93Co1hF", + "0xf9f5D0ACD71C76F9476F10B3F3d3E201F0883C68": "https://ipfs.io/ipfs/Qmb9JmuD9ehaQtTLBBZmAoiAbvE53e3FMjkEty8rvbPf9K", + "0xeE17bB0322383fecCA2784fbE2d4CD7d02b1905B": "https://ipfs.io/ipfs/Qmb9JmuD9ehaQtTLBBZmAoiAbvE53e3FMjkEty8rvbPf9K", + "0xc9750828124D4c10e7a6f4B655cA8487bD3842EB": "https://ipfs.io/ipfs/Qmb9JmuD9ehaQtTLBBZmAoiAbvE53e3FMjkEty8rvbPf9K", + "0x328Cd365Bb35524297E68ED28c6fF2C9557d1363": "https://ipfs.io/ipfs/Qmb9JmuD9ehaQtTLBBZmAoiAbvE53e3FMjkEty8rvbPf9K" + } +} \ No newline at end of file diff --git a/docs/04-configuration/coingecko/scripts/prepare-token-logos-512x512.sh b/docs/04-configuration/coingecko/scripts/prepare-token-logos-512x512.sh new file mode 100755 index 0000000..107a9df --- /dev/null +++ b/docs/04-configuration/coingecko/scripts/prepare-token-logos-512x512.sh @@ -0,0 +1,85 @@ +#!/usr/bin/env bash +# Prepare 512×512 PNG logos for CoinGecko/CMC token submission. +# Downloads logos from Trust Wallet (or provided URLs) and resizes to 512×512. +# Output: docs/04-configuration/coingecko/logos/ (gitignored by default). +# +# Requires: curl, and one of: convert (ImageMagick), magick (ImageMagick 7), sips (macOS), or python3+PIL +# Install ImageMagick for resize: apt install imagemagick / brew install imagemagick +# Usage: ./prepare-token-logos-512x512.sh [OUTPUT_DIR] + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +OUTPUT_DIR="${1:-${SCRIPT_DIR}/../logos}" +mkdir -p "$OUTPUT_DIR" + +LOGO_BASE="https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets" + +# Symbol -> URL (Trust Wallet mainnet addresses for USDC, USDT, WETH) +declare -A LOGOS=( + ["WETH"]="${LOGO_BASE}/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png" + ["WETH10"]="${LOGO_BASE}/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png" + ["cUSDC"]="${LOGO_BASE}/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png" + ["cUSDT"]="${LOGO_BASE}/0xdAC17F958D2ee523a2206206994597C13D831ec7/logo.png" + ["cEURC"]="${LOGO_BASE}/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png" + ["cEURT"]="${LOGO_BASE}/0xdAC17F958D2ee523a2206206994597C13D831ec7/logo.png" + ["cGBPC"]="${LOGO_BASE}/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png" + ["cGBPT"]="${LOGO_BASE}/0xdAC17F958D2ee523a2206206994597C13D831ec7/logo.png" + ["cAUDC"]="${LOGO_BASE}/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png" + ["cJPYC"]="${LOGO_BASE}/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png" + ["cCHFC"]="${LOGO_BASE}/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png" + ["cCADC"]="${LOGO_BASE}/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png" + ["cXAUC"]="${LOGO_BASE}/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png" + ["cXAUT"]="${LOGO_BASE}/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png" + ["LiXAU"]="${LOGO_BASE}/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png" + ["USDW"]="${LOGO_BASE}/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png" + ["EURW"]="${LOGO_BASE}/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png" + ["GBPW"]="${LOGO_BASE}/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png" + ["AUDW"]="${LOGO_BASE}/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png" + ["JPYW"]="${LOGO_BASE}/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png" + ["CHFW"]="${LOGO_BASE}/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png" + ["CADW"]="${LOGO_BASE}/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png" + ["LINK"]="${LOGO_BASE}/0x514910771AF9Ca656af840dff83E8264EcF986CA/logo.png" + ["ETH-USD"]="${LOGO_BASE}/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png" +) + +resize_to_512() { + local src="$1" + local dst="$2" + if command -v convert &>/dev/null; then + convert "$src" -resize 512x512! -background none -gravity center -extent 512x512 "$dst" + elif command -v magick &>/dev/null; then + magick "$src" -resize 512x512! -background none -gravity center -extent 512x512 "$dst" + elif command -v sips &>/dev/null; then + sips -z 512 512 "$src" --out "$dst" + elif python3 -c "from PIL import Image" 2>/dev/null; then + python3 -c " +from PIL import Image +img = Image.open('$src').convert('RGBA') +img = img.resize((512, 512), Image.Resampling.LANCZOS) +img.save('$dst') +" + else + echo "No ImageMagick, sips, or PIL found. Copying without resize (may not be 512×512)." >&2 + cp "$src" "$dst" + fi +} + +echo "Preparing 512×512 PNG logos in $OUTPUT_DIR" +for symbol in "${!LOGOS[@]}"; do + url="${LOGOS[$symbol]}" + out="$OUTPUT_DIR/${symbol}-512x512.png" + tmp="$OUTPUT_DIR/.tmp-${symbol}.png" + if curl -sS -L -o "$tmp" "$url" 2>/dev/null && [ -s "$tmp" ]; then + resize_to_512 "$tmp" "$out" + rm -f "$tmp" + echo " ✅ $symbol -> $out" + else + echo " ❌ $symbol: failed to fetch $url" + rm -f "$tmp" + fi +done + +echo "" +echo "Done. Logos in $OUTPUT_DIR" +echo "Use these for CoinGecko/CMC submission (512×512 PNG required)." diff --git a/docs/04-configuration/metamask/DUAL_CHAIN_NETWORKS.json b/docs/04-configuration/metamask/DUAL_CHAIN_NETWORKS.json index 5457263..b653317 100644 --- a/docs/04-configuration/metamask/DUAL_CHAIN_NETWORKS.json +++ b/docs/04-configuration/metamask/DUAL_CHAIN_NETWORKS.json @@ -1,61 +1,19 @@ { - "name": "MetaMask Multi-Chain Networks (Chain 138 + Ethereum Mainnet + ALL Mainnet)", - "version": { "major": 1, "minor": 1, "patch": 0 }, + "name": "MetaMask Multi-Chain Networks (13 chains)", + "version": {"major": 1, "minor": 2, "patch": 0}, "chains": [ - { - "chainId": "0x8a", - "chainIdDecimal": 138, - "chainName": "DeFi Oracle Meta Mainnet", - "rpcUrls": [ - "https://rpc-http-pub.d-bis.org", - "https://rpc.d-bis.org", - "https://rpc2.d-bis.org", - "https://rpc.defi-oracle.io" - ], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 - }, - "blockExplorerUrls": ["https://explorer.d-bis.org"], - "iconUrls": [ - "https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png" - ] - }, - { - "chainId": "0x1", - "chainIdDecimal": 1, - "chainName": "Ethereum Mainnet", - "rpcUrls": [ - "https://eth.llamarpc.com", - "https://rpc.ankr.com/eth", - "https://ethereum.publicnode.com", - "https://1rpc.io/eth" - ], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 - }, - "blockExplorerUrls": ["https://etherscan.io"], - "iconUrls": [ - "https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png" - ] - }, - { - "chainId": "0x9f2c4", - "chainIdDecimal": 651940, - "chainName": "ALL Mainnet", - "rpcUrls": ["https://mainnet-rpc.alltra.global"], - "nativeCurrency": { - "name": "Ether", - "symbol": "ETH", - "decimals": 18 - }, - "blockExplorerUrls": ["https://alltra.global"], - "iconUrls": [ - "https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png" - ] - } + {"chainId":"0x8a","chainIdDecimal":138,"chainName":"DeFi Oracle Meta Mainnet","rpcUrls":["https://rpc-http-pub.d-bis.org","https://rpc.d-bis.org","https://rpc2.d-bis.org","https://rpc.defi-oracle.io"],"nativeCurrency":{"name":"Ether","symbol":"ETH","decimals":18},"blockExplorerUrls":["https://explorer.d-bis.org"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"]}, + {"chainId":"0x1","chainIdDecimal":1,"chainName":"Ethereum Mainnet","rpcUrls":["https://eth.llamarpc.com","https://rpc.ankr.com/eth","https://ethereum.publicnode.com","https://1rpc.io/eth"],"nativeCurrency":{"name":"Ether","symbol":"ETH","decimals":18},"blockExplorerUrls":["https://etherscan.io"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"]}, + {"chainId":"0x9f2c4","chainIdDecimal":651940,"chainName":"ALL Mainnet","rpcUrls":["https://mainnet-rpc.alltra.global"],"nativeCurrency":{"name":"Ether","symbol":"ETH","decimals":18},"blockExplorerUrls":["https://alltra.global"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"]}, + {"chainId":"0x19","chainIdDecimal":25,"chainName":"Cronos Mainnet","rpcUrls":["https://evm.cronos.org","https://cronos-rpc.publicnode.com"],"nativeCurrency":{"name":"CRO","symbol":"CRO","decimals":18},"blockExplorerUrls":["https://cronos.org/explorer"],"iconUrls":["https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong"]}, + {"chainId":"0x38","chainIdDecimal":56,"chainName":"BNB Smart Chain","rpcUrls":["https://bsc-dataseed.binance.org","https://bsc-dataseed1.defibit.io","https://bsc-dataseed1.ninicoin.io"],"nativeCurrency":{"name":"BNB","symbol":"BNB","decimals":18},"blockExplorerUrls":["https://bscscan.com"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"]}, + {"chainId":"0x64","chainIdDecimal":100,"chainName":"Gnosis Chain","rpcUrls":["https://rpc.gnosischain.com","https://gnosis-rpc.publicnode.com","https://1rpc.io/gnosis"],"nativeCurrency":{"name":"xDAI","symbol":"xDAI","decimals":18},"blockExplorerUrls":["https://gnosisscan.io"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"]}, + {"chainId":"0x89","chainIdDecimal":137,"chainName":"Polygon","rpcUrls":["https://polygon-rpc.com","https://polygon.llamarpc.com","https://polygon-bor-rpc.publicnode.com"],"nativeCurrency":{"name":"MATIC","symbol":"MATIC","decimals":18},"blockExplorerUrls":["https://polygonscan.com"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"]}, + {"chainId":"0xa","chainIdDecimal":10,"chainName":"Optimism","rpcUrls":["https://mainnet.optimism.io","https://optimism.llamarpc.com","https://optimism-rpc.publicnode.com"],"nativeCurrency":{"name":"Ether","symbol":"ETH","decimals":18},"blockExplorerUrls":["https://optimistic.etherscan.io"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"]}, + {"chainId":"0xa4b1","chainIdDecimal":42161,"chainName":"Arbitrum One","rpcUrls":["https://arb1.arbitrum.io/rpc","https://arbitrum.llamarpc.com","https://arbitrum-one-rpc.publicnode.com"],"nativeCurrency":{"name":"Ether","symbol":"ETH","decimals":18},"blockExplorerUrls":["https://arbiscan.io"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"]}, + {"chainId":"0x2105","chainIdDecimal":8453,"chainName":"Base","rpcUrls":["https://mainnet.base.org","https://base.llamarpc.com","https://base-rpc.publicnode.com"],"nativeCurrency":{"name":"Ether","symbol":"ETH","decimals":18},"blockExplorerUrls":["https://basescan.org"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"]}, + {"chainId":"0xa86a","chainIdDecimal":43114,"chainName":"Avalanche C-Chain","rpcUrls":["https://api.avax.network/ext/bc/C/rpc","https://avalanche-c-chain-rpc.publicnode.com","https://1rpc.io/avax/c"],"nativeCurrency":{"name":"AVAX","symbol":"AVAX","decimals":18},"blockExplorerUrls":["https://snowtrace.io"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"]}, + {"chainId":"0xa4ec","chainIdDecimal":42220,"chainName":"Celo","rpcUrls":["https://forno.celo.org","https://celo-mainnet-rpc.publicnode.com","https://1rpc.io/celo"],"nativeCurrency":{"name":"CELO","symbol":"CELO","decimals":18},"blockExplorerUrls":["https://celoscan.io"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"]}, + {"chainId":"0x457","chainIdDecimal":1111,"chainName":"Wemix","rpcUrls":["https://api.wemix.com","https://wemix-mainnet-rpc.publicnode.com"],"nativeCurrency":{"name":"WEMIX","symbol":"WEMIX","decimals":18},"blockExplorerUrls":["https://scan.wemix.com"],"iconUrls":["https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png"]} ] } diff --git a/docs/04-configuration/metamask/DUAL_CHAIN_TOKEN_LIST.tokenlist.json b/docs/04-configuration/metamask/DUAL_CHAIN_TOKEN_LIST.tokenlist.json index f0ec418..508e69e 100644 --- a/docs/04-configuration/metamask/DUAL_CHAIN_TOKEN_LIST.tokenlist.json +++ b/docs/04-configuration/metamask/DUAL_CHAIN_TOKEN_LIST.tokenlist.json @@ -1,115 +1,859 @@ { - "name": "Multi-Chain Token List (Chain 138 + Ethereum Mainnet + ALL Mainnet)", - "version": { "major": 1, "minor": 1, "patch": 0 }, - "timestamp": "2026-01-30T00:00:00.000Z", - "logoURI": "https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png", - "tokens": [ - { - "chainId": 138, - "address": "0x3304b747e565a97ec8ac220b0b6a1f6ffdb837e6", - "name": "ETH/USD Price Feed", - "symbol": "ETH-USD", - "decimals": 8, - "logoURI": "https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png", - "tags": ["oracle", "price-feed"] - }, - { - "chainId": 138, - "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - "name": "Wrapped Ether", - "symbol": "WETH", - "decimals": 18, - "logoURI": "https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png", - "tags": ["defi", "wrapped"] - }, - { - "chainId": 138, - "address": "0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f", - "name": "Wrapped Ether v10", - "symbol": "WETH10", - "decimals": 18, - "logoURI": "https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png", - "tags": ["defi", "wrapped"] - }, - { - "chainId": 138, - "address": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", - "name": "Compliant Tether USD", - "symbol": "cUSDT", - "decimals": 6, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xdAC17F958D2ee523a2206206994597C13D831ec7/logo.png", - "tags": ["stablecoin", "defi", "compliant"] - }, - { - "chainId": 138, - "address": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", - "name": "Compliant USD Coin", - "symbol": "cUSDC", - "decimals": 6, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png", - "tags": ["stablecoin", "defi", "compliant"] - }, - { - "chainId": 1, - "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - "name": "Wrapped Ether", - "symbol": "WETH", - "decimals": 18, - "logoURI": "https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png", - "tags": ["defi", "wrapped"] - }, - { - "chainId": 1, - "address": "0xdAC17F958D2ee523a2206206994597C13D831ec7", - "name": "Tether USD", - "symbol": "USDT", - "decimals": 6, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xdAC17F958D2ee523a2206206994597C13D831ec7/logo.png", - "tags": ["stablecoin", "defi"] - }, - { - "chainId": 1, - "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - "name": "USD Coin", - "symbol": "USDC", - "decimals": 6, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png", - "tags": ["stablecoin", "defi"] - }, - { - "chainId": 1, - "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", - "name": "Dai Stablecoin", - "symbol": "DAI", - "decimals": 18, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x6B175474E89094C44Da98b954EedeAC495271d0F/logo.png", - "tags": ["stablecoin", "defi"] - }, - { - "chainId": 1, - "address": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", - "name": "ETH/USD Price Feed", - "symbol": "ETH-USD", - "decimals": 8, - "logoURI": "https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png", - "tags": ["oracle", "price-feed"] - }, - { - "chainId": 651940, - "address": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", - "name": "USD Coin", - "symbol": "USDC", - "decimals": 6, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png", - "tags": ["stablecoin", "defi"] - } - ], - "tags": { - "defi": { "name": "DeFi", "description": "Decentralized Finance tokens" }, - "wrapped": { "name": "Wrapped", "description": "Wrapped tokens representing native assets" }, - "oracle": { "name": "Oracle", "description": "Oracle price feed contracts" }, - "price-feed": { "name": "Price Feed", "description": "Price feed oracle contracts" }, - "stablecoin": { "name": "Stablecoin", "description": "Stable value tokens pegged to fiat" }, - "compliant": { "name": "Compliant", "description": "Regulatory compliant tokens" } - } +"name": "Multi-Chain Token List (13 chains, 138 base)", +"version": { +"major": 1, +"minor": 3, +"patch": 0 +}, +"timestamp": "2026-02-28T00:00:00.000Z", +"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong", +"tokens": [ +{ +"chainId": 138, +"address": "0x3304b747e565a97ec8ac220b0b6a1f6ffdb837e6", +"name": "ETH/USD Price Feed", +"symbol": "ETH-USD", +"decimals": 8, +"logoURI": "https://ipfs.io/ipfs/QmPZuycjyJEe2otREuQ5HirvPJ8X6Yc6MBtwz1VhdD79pY", +"tags": [ +"oracle", +"price-feed" +] +}, +{ +"chainId": 138, +"address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", +"name": "Wrapped Ether", +"symbol": "WETH", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong", +"tags": [ +"defi", +"wrapped" +] +}, +{ +"chainId": 138, +"address": "0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9F", +"name": "Wrapped Ether v10", +"symbol": "WETH10", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/QmanDFPHxnbKd6SSNzzXHf9GbpL9dLXSphxDZSPPYE6ds4", +"tags": [ +"defi", +"wrapped" +] +}, +{ +"chainId": 138, +"address": "0xb7721dD53A8c629d9f1Ba31a5819AFe250002b03", +"name": "Chainlink Token", +"symbol": "LINK", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/QmenWcmfNGfssz4HXvrRV912eZDiKqLTt6z2brRYuTGz9A", +"tags": [ +"defi", +"oracle", +"ccip" +] +}, +{ +"chainId": 138, +"address": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22", +"name": "Compliant Tether USD", +"symbol": "cUSDT", +"decimals": 6, +"logoURI": "https://ipfs.io/ipfs/QmRfhPs9DcyFPpGjKwF6CCoVDWUHSxkQR34n9NK7JSbPCP", +"tags": [ +"stablecoin", +"defi", +"compliant" +] +}, +{ +"chainId": 138, +"address": "0xf22258f57794CC8E06237084b353Ab30fFfa640b", +"name": "Compliant USD Coin", +"symbol": "cUSDC", +"decimals": 6, +"logoURI": "https://ipfs.io/ipfs/QmNPq4D5JXzurmi9jAhogVMzhAQRk1PZ1r9H3qQUV9gjDm", +"tags": [ +"stablecoin", +"defi", +"compliant" +] +}, +{ +"chainId": 1, +"address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", +"name": "USD Coin", +"symbol": "USDC", +"decimals": 6, +"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 1, +"address": "0xdAC17F958D2ee523a2206206994597C13D831ec7", +"name": "Tether USD", +"symbol": "USDT", +"decimals": 6, +"logoURI": "https://ipfs.io/ipfs/QmRfhPs9DcyFPpGjKwF6CCoVDWUHSxkQR34n9NK7JSbPCP", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 1, +"address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", +"name": "Wrapped Ether", +"symbol": "WETH", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong", +"tags": [ +"defi", +"wrapped" +] +}, +{ +"chainId": 1, +"address": "0x514910771AF9Ca656af840dff83E8264EcF986CA", +"name": "Chainlink Token", +"symbol": "LINK", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/QmenWcmfNGfssz4HXvrRV912eZDiKqLTt6z2brRYuTGz9A", +"tags": [ +"defi", +"oracle", +"ccip" +] +}, +{ +"chainId": 1, +"address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", +"name": "Dai Stablecoin", +"symbol": "DAI", +"decimals": 18, +"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x6B175474E89094C44Da98b954EedeAC495271d0F/logo.png", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 1, +"address": "0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419", +"name": "ETH/USD Price Feed", +"symbol": "ETH-USD", +"decimals": 8, +"logoURI": "https://raw.githubusercontent.com/ethereum/ethereum.org/main/static/images/eth-diamond-black.png", +"tags": [ +"oracle", +"price-feed" +] +}, +{ +"chainId": 651940, +"address": "0xa95EeD79f84E6A0151eaEb9d441F9Ffd50e8e881", +"name": "USD Coin", +"symbol": "USDC", +"decimals": 6, +"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 651940, +"address": "0x015B1897Ed5279930bC2Be46F661894d219292A6", +"name": "Tether USD", +"symbol": "USDT", +"decimals": 6, +"logoURI": "https://ipfs.io/ipfs/QmRfhPs9DcyFPpGjKwF6CCoVDWUHSxkQR34n9NK7JSbPCP", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 25, +"address": "0xc21223249CA28397B4B6541dfFaEcC539BfF0c59", +"name": "USD Coin", +"symbol": "USDC", +"decimals": 6, +"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 25, +"address": "0x66e4286603D22FF153A6547700f37C7Eae42F8E2", +"name": "Tether USD", +"symbol": "USDT", +"decimals": 6, +"logoURI": "https://ipfs.io/ipfs/QmRfhPs9DcyFPpGjKwF6CCoVDWUHSxkQR34n9NK7JSbPCP", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 25, +"address": "0x99B3511A2d315A497C8112C1fdd8D508d4B1E506", +"name": "Wrapped Ether (WETH9)", +"symbol": "WETH", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong", +"tags": [ +"defi", +"wrapped" +] +}, +{ +"chainId": 25, +"address": "0x3304b747E565a97ec8AC220b0B6A1f6ffDB837e6", +"name": "Wrapped Ether v10", +"symbol": "WETH10", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/QmanDFPHxnbKd6SSNzzXHf9GbpL9dLXSphxDZSPPYE6ds4", +"tags": [ +"defi", +"wrapped" +] +}, +{ +"chainId": 25, +"address": "0x8c80A01F461f297Df7F9DA3A4f740D7297C8Ac85", +"name": "Chainlink Token", +"symbol": "LINK", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/QmenWcmfNGfssz4HXvrRV912eZDiKqLTt6z2brRYuTGz9A", +"tags": [ +"defi", +"oracle", +"ccip" +] +}, +{ +"chainId": 25, +"address": "0x948690147D2e50ffe50C5d38C14125aD6a9FA036", +"name": "USD W Token", +"symbol": "USDW", +"decimals": 2, +"logoURI": "https://ipfs.io/ipfs/QmNPq4D5JXzurmi9jAhogVMzhAQRk1PZ1r9H3qQUV9gjDm", +"tags": [ +"stablecoin", +"iso4217w" +] +}, +{ +"chainId": 25, +"address": "0x58a8D8F78F1B65c06dAd7542eC46b299629A60dd", +"name": "EUR W Token", +"symbol": "EURW", +"decimals": 2, +"logoURI": "https://ipfs.io/ipfs/QmPh16PY241zNtePyeK7ep1uf1RcARV2ynGAuRU8U7sSqS", +"tags": [ +"stablecoin", +"iso4217w" +] +}, +{ +"chainId": 25, +"address": "0xFb4B6Cc81211F7d886950158294A44C312abCA29", +"name": "GBP W Token", +"symbol": "GBPW", +"decimals": 2, +"logoURI": "https://ipfs.io/ipfs/QmT2nJ6WyhYBCsYJ6NfS1BPAqiGKkCEuMxiC8ye93Co1hF", +"tags": [ +"stablecoin", +"iso4217w" +] +}, +{ +"chainId": 25, +"address": "0xf9f5D0ACD71C76F9476F10B3F3d3E201F0883C68", +"name": "AUD W Token", +"symbol": "AUDW", +"decimals": 2, +"logoURI": "https://ipfs.io/ipfs/Qmb9JmuD9ehaQtTLBBZmAoiAbvE53e3FMjkEty8rvbPf9K", +"tags": [ +"stablecoin", +"iso4217w" +] +}, +{ +"chainId": 25, +"address": "0xeE17bB0322383fecCA2784fbE2d4CD7d02b1905B", +"name": "JPY W Token", +"symbol": "JPYW", +"decimals": 2, +"logoURI": "https://ipfs.io/ipfs/Qmb9JmuD9ehaQtTLBBZmAoiAbvE53e3FMjkEty8rvbPf9K", +"tags": [ +"stablecoin", +"iso4217w" +] +}, +{ +"chainId": 25, +"address": "0xc9750828124D4c10e7a6f4B655cA8487bD3842EB", +"name": "CHF W Token", +"symbol": "CHFW", +"decimals": 2, +"logoURI": "https://ipfs.io/ipfs/Qmb9JmuD9ehaQtTLBBZmAoiAbvE53e3FMjkEty8rvbPf9K", +"tags": [ +"stablecoin", +"iso4217w" +] +}, +{ +"chainId": 25, +"address": "0x328Cd365Bb35524297E68ED28c6fF2C9557d1363", +"name": "CAD W Token", +"symbol": "CADW", +"decimals": 2, +"logoURI": "https://ipfs.io/ipfs/Qmb9JmuD9ehaQtTLBBZmAoiAbvE53e3FMjkEty8rvbPf9K", +"tags": [ +"stablecoin", +"iso4217w" +] +}, +{ +"chainId": 56, +"address": "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", +"name": "USD Coin", +"symbol": "USDC", +"decimals": 6, +"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 56, +"address": "0x55d398326f99059fF775485246999027B3197955", +"name": "Tether USD", +"symbol": "USDT", +"decimals": 6, +"logoURI": "https://ipfs.io/ipfs/QmRfhPs9DcyFPpGjKwF6CCoVDWUHSxkQR34n9NK7JSbPCP", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 56, +"address": "0x2170Ed0880ac9A755fd29B2688956BD959F933F8", +"name": "Wrapped Ether", +"symbol": "WETH", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong", +"tags": [ +"defi", +"wrapped" +] +}, +{ +"chainId": 56, +"address": "0x404460C6A5EdE2D891e8297795264fDe62ADBB75", +"name": "Chainlink Token", +"symbol": "LINK", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/QmenWcmfNGfssz4HXvrRV912eZDiKqLTt6z2brRYuTGz9A", +"tags": [ +"defi", +"oracle", +"ccip" +] +}, +{ +"chainId": 56, +"address": "0x1AF3F329e8BE154074D8769D1FFa4eE058B1DBc3", +"name": "Dai Stablecoin", +"symbol": "DAI", +"decimals": 18, +"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x6B175474E89094C44Da98b954EedeAC495271d0F/logo.png", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 100, +"address": "0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83", +"name": "USD Coin", +"symbol": "USDC", +"decimals": 6, +"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 100, +"address": "0x4ECaBa5870353805a9F068101A40E0f32ed605C6", +"name": "Tether USD", +"symbol": "USDT", +"decimals": 6, +"logoURI": "https://ipfs.io/ipfs/QmRfhPs9DcyFPpGjKwF6CCoVDWUHSxkQR34n9NK7JSbPCP", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 100, +"address": "0x6A023CCd1ff6F2045C3309768eAd9E68F978f6e1", +"name": "Wrapped Ether", +"symbol": "WETH", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong", +"tags": [ +"defi", +"wrapped" +] +}, +{ +"chainId": 100, +"address": "0xE2e73A1c69ecF83F464EFCE6A5be353a37cA09b2", +"name": "Chainlink Token", +"symbol": "LINK", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/QmenWcmfNGfssz4HXvrRV912eZDiKqLTt6z2brRYuTGz9A", +"tags": [ +"defi", +"oracle", +"ccip" +] +}, +{ +"chainId": 100, +"address": "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d", +"name": "Dai Stablecoin", +"symbol": "DAI", +"decimals": 18, +"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x6B175474E89094C44Da98b954EedeAC495271d0F/logo.png", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 137, +"address": "0x3c499c542cEF5E3811e1192ce70d8cC03d5c1369", +"name": "USD Coin", +"symbol": "USDC", +"decimals": 6, +"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 137, +"address": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", +"name": "Tether USD", +"symbol": "USDT", +"decimals": 6, +"logoURI": "https://ipfs.io/ipfs/QmRfhPs9DcyFPpGjKwF6CCoVDWUHSxkQR34n9NK7JSbPCP", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 137, +"address": "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619", +"name": "Wrapped Ether", +"symbol": "WETH", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong", +"tags": [ +"defi", +"wrapped" +] +}, +{ +"chainId": 137, +"address": "0xb0897686c545045aFc77CF20eC7A532E3120E0F1", +"name": "Chainlink Token", +"symbol": "LINK", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/QmenWcmfNGfssz4HXvrRV912eZDiKqLTt6z2brRYuTGz9A", +"tags": [ +"defi", +"oracle", +"ccip" +] +}, +{ +"chainId": 137, +"address": "0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063", +"name": "Dai Stablecoin", +"symbol": "DAI", +"decimals": 18, +"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x6B175474E89094C44Da98b954EedeAC495271d0F/logo.png", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 10, +"address": "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", +"name": "USD Coin", +"symbol": "USDC", +"decimals": 6, +"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 10, +"address": "0x94b008aA00579c1307B0EF2c499aD98a8ce58e58", +"name": "Tether USD", +"symbol": "USDT", +"decimals": 6, +"logoURI": "https://ipfs.io/ipfs/QmRfhPs9DcyFPpGjKwF6CCoVDWUHSxkQR34n9NK7JSbPCP", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 10, +"address": "0x4200000000000000000000000000000000000006", +"name": "Wrapped Ether", +"symbol": "WETH", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong", +"tags": [ +"defi", +"wrapped" +] +}, +{ +"chainId": 10, +"address": "0x350a791Bfc2C21F9Ed5d10980Dad2e2638ffa7f6", +"name": "Chainlink Token", +"symbol": "LINK", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/QmenWcmfNGfssz4HXvrRV912eZDiKqLTt6z2brRYuTGz9A", +"tags": [ +"defi", +"oracle", +"ccip" +] +}, +{ +"chainId": 10, +"address": "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1", +"name": "Dai Stablecoin", +"symbol": "DAI", +"decimals": 18, +"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x6B175474E89094C44Da98b954EedeAC495271d0F/logo.png", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 42161, +"address": "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", +"name": "USD Coin", +"symbol": "USDC", +"decimals": 6, +"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 42161, +"address": "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9", +"name": "Tether USD", +"symbol": "USDT", +"decimals": 6, +"logoURI": "https://ipfs.io/ipfs/QmRfhPs9DcyFPpGjKwF6CCoVDWUHSxkQR34n9NK7JSbPCP", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 42161, +"address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", +"name": "Wrapped Ether", +"symbol": "WETH", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong", +"tags": [ +"defi", +"wrapped" +] +}, +{ +"chainId": 42161, +"address": "0xf97f4df75117a78c1A5a0DBb814Af92458539FB4", +"name": "Chainlink Token", +"symbol": "LINK", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/QmenWcmfNGfssz4HXvrRV912eZDiKqLTt6z2brRYuTGz9A", +"tags": [ +"defi", +"oracle", +"ccip" +] +}, +{ +"chainId": 42161, +"address": "0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1", +"name": "Dai Stablecoin", +"symbol": "DAI", +"decimals": 18, +"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x6B175474E89094C44Da98b954EedeAC495271d0F/logo.png", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 8453, +"address": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913", +"name": "USD Coin", +"symbol": "USDC", +"decimals": 6, +"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 8453, +"address": "0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2", +"name": "Tether USD", +"symbol": "USDT", +"decimals": 6, +"logoURI": "https://ipfs.io/ipfs/QmRfhPs9DcyFPpGjKwF6CCoVDWUHSxkQR34n9NK7JSbPCP", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 8453, +"address": "0x4200000000000000000000000000000000000006", +"name": "Wrapped Ether", +"symbol": "WETH", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong", +"tags": [ +"defi", +"wrapped" +] +}, +{ +"chainId": 8453, +"address": "0x88Fb150BDc53A65fe94Dea0c9BA0a6dAf8C6e196", +"name": "Chainlink Token", +"symbol": "LINK", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/QmenWcmfNGfssz4HXvrRV912eZDiKqLTt6z2brRYuTGz9A", +"tags": [ +"defi", +"oracle", +"ccip" +] +}, +{ +"chainId": 8453, +"address": "0x50c5725949A6F0c72E6C4a641F24049A917DB0Cb", +"name": "Dai Stablecoin", +"symbol": "DAI", +"decimals": 18, +"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x6B175474E89094C44Da98b954EedeAC495271d0F/logo.png", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 43114, +"address": "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E", +"name": "USD Coin", +"symbol": "USDC", +"decimals": 6, +"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 43114, +"address": "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7", +"name": "Tether USD", +"symbol": "USDT", +"decimals": 6, +"logoURI": "https://ipfs.io/ipfs/QmRfhPs9DcyFPpGjKwF6CCoVDWUHSxkQR34n9NK7JSbPCP", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 43114, +"address": "0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB", +"name": "Wrapped Ether", +"symbol": "WETH", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong", +"tags": [ +"defi", +"wrapped" +] +}, +{ +"chainId": 43114, +"address": "0x5947BB275c521040051D82396192181b413227A3", +"name": "Chainlink Token", +"symbol": "LINK", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/QmenWcmfNGfssz4HXvrRV912eZDiKqLTt6z2brRYuTGz9A", +"tags": [ +"defi", +"oracle", +"ccip" +] +}, +{ +"chainId": 43114, +"address": "0xd586E7F844cEa2F87f50152665BCbc2C279D8d70", +"name": "Dai Stablecoin", +"symbol": "DAI", +"decimals": 18, +"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x6B175474E89094C44Da98b954EedeAC495271d0F/logo.png", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 42220, +"address": "0xcebA9300f2b948710d2653dD7B07f33A8B32118C", +"name": "USD Coin", +"symbol": "USDC", +"decimals": 6, +"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 42220, +"address": "0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e", +"name": "Tether USD", +"symbol": "USDT", +"decimals": 6, +"logoURI": "https://ipfs.io/ipfs/QmRfhPs9DcyFPpGjKwF6CCoVDWUHSxkQR34n9NK7JSbPCP", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 42220, +"address": "0x122013fd7dF1C6F636a5bb8f03108E876548b455", +"name": "Wrapped Ether", +"symbol": "WETH", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/Qma3FKtLce9MjgJgWbtyCxBiPjJ6xi8jGWUSKNS5Jc2ong", +"tags": [ +"defi", +"wrapped" +] +}, +{ +"chainId": 42220, +"address": "0xd07294e6E917e07dfDcee882dd1e2565085C2ae0", +"name": "Chainlink Token", +"symbol": "LINK", +"decimals": 18, +"logoURI": "https://ipfs.io/ipfs/QmenWcmfNGfssz4HXvrRV912eZDiKqLTt6z2brRYuTGz9A", +"tags": [ +"defi", +"oracle", +"ccip" +] +}, +{ +"chainId": 1111, +"address": "0xE3F5a90F9cb311505cd691a46596599aA1A0AD7D", +"name": "USD Coin", +"symbol": "USDC", +"decimals": 6, +"logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png", +"tags": [ +"stablecoin", +"defi" +] +}, +{ +"chainId": 1111, +"address": "0xA649325Aa7C5093d12D6F98EB4378deAe68CE23F", +"name": "Tether USD", +"symbol": "USDT", +"decimals": 6, +"logoURI": "https://ipfs.io/ipfs/QmRfhPs9DcyFPpGjKwF6CCoVDWUHSxkQR34n9NK7JSbPCP", +"tags": [ +"stablecoin", +"defi" +] } +], +"tags": { +"defi": { +"name": "DeFi", +"description": "Decentralized Finance tokens" +}, +"wrapped": { +"name": "Wrapped", +"description": "Wrapped tokens representing native assets" +}, +"oracle": { +"name": "Oracle", +"description": "Oracle price feed contracts" +}, +"price-feed": { +"name": "Price Feed", +"description": "Price feed oracle contracts" +}, +"stablecoin": { +"name": "Stablecoin", +"description": "Stable value tokens pegged to fiat" +}, +"compliant": { +"name": "Compliant", +"description": "Regulatory compliant tokens" +}, +"iso4217w": { +"name": "ISO4217W", +"description": "ISO 4217 compliant wrapped fiat tokens" +} +} +} \ No newline at end of file diff --git a/docs/04-configuration/mifos-omnl-central-bank/CRUNCHYGALAXY_OFFICE_AND_1B_FUNDING.md b/docs/04-configuration/mifos-omnl-central-bank/CRUNCHYGALAXY_OFFICE_AND_1B_FUNDING.md new file mode 100644 index 0000000..1b750fc --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/CRUNCHYGALAXY_OFFICE_AND_1B_FUNDING.md @@ -0,0 +1,184 @@ +# Crunchygalaxy Unip. Lda. — Office Creation + 1.0B USD M1 Funding + +**Entity:** CRUNCHYGALAXY UNIP. LDA. +**NIPC:** 515159573 +**Address:** Av. da Liberdade nº 110 – 1º, 1269-046 Lisboa, Portugal + +Full cycle: create office → 1.0B M1 from Head Office (Rail B two-leg) → audit → closure → artifact packaging → upload per PDF. + +--- + +## Phase 1 — Create New Office (Crunchygalaxy) + +### 1.1 Confirm next available officeId + +```bash +source omnl-fineract/.env +BASE="${OMNL_FINERACT_BASE_URL}" +TENANT="${OMNL_FINERACT_TENANT:-omnl}" +AUTH="-u ${OMNL_FINERACT_USER}:${OMNL_FINERACT_PASSWORD}" + +curl -s -H "Fineract-Platform-TenantId: $TENANT" -H "Content-Type: application/json" $AUTH \ + "$BASE/offices" | jq '.[] | {id, name}' +``` + +Use the next free ID (e.g. **21**). Replace `21` below if different. + +### 1.2 Create Office + +```bash +curl -X POST "$BASE/offices" \ + -H "Fineract-Platform-TenantId: $TENANT" \ + -H "Content-Type: application/json" $AUTH \ + -d '{ + "name": "Crunchygalaxy Unip Lda - Portugal", + "parentId": 1, + "openingDate": "2026-02-24", + "dateFormat": "yyyy-MM-dd", + "locale": "en", + "externalId": "CRUNCHYGALAXY-515159573" + }' +``` + +Confirm HTTP 200 and note returned `resourceId` / `officeId` (e.g. 21). + +--- + +## Phase 2 — Transfer 1.0B USD M1 (Rail B: HO → Office 21) + +**Economic result:** HO −1.0B; Office 21 +1.0B (symmetric). + +### 2.1 Prep (IDs + closures + pre-audit) + +```bash +bash scripts/omnl/resolve_ids.sh +source ids.env + +bash scripts/omnl/omnl-gl-closures-post.sh +# Pre-audit for HO/Office 20 (baseline); then post-audit for Office 21 after funding +OFFICE_ID=21 bash scripts/omnl/omnl-audit-packet-office20.sh +``` + +(Pre-audit for office 21 will be empty until after Leg 2; optional. Alternatively run pre-audit for office 20 only.) + +### 2.2 Leg 1 — Head Office reduction (Office 1) + +Dr 2100 / Cr 1410, 1,000,000,000. Replace `<>`. + +```bash +export REFERENCE_NUMBER="CRUNCHY-1-20260224-TR1-1B-L1" +export TX_DATE="2026-02-24" +export AMOUNT="1000000000" + +REQUIRES_APPROVAL=1 APPROVER="<>" \ +REFERENCE_NUMBER="$REFERENCE_NUMBER" TX_DATE="$TX_DATE" OFFICE_ID=1 \ +DEBIT_GL_ID="$ID_2100" CREDIT_GL_ID="$ID_1410" AMOUNT="$AMOUNT" \ +bash scripts/omnl/omnl-je-maker.sh + +# Payload file may have trailing _ (safe_ref); use the one created +PAYLOAD_FILE="reconciliation/je-${REFERENCE_NUMBER}_.payload.json" \ +bash scripts/omnl/omnl-je-checker.sh +``` + +If the payload has no trailing underscore, use `reconciliation/je-${REFERENCE_NUMBER}.payload.json`. + +### 2.3 Leg 2 — Crunchygalaxy office funding (Office 21) + +Dr 1410 / Cr 2100, 1,000,000,000. + +```bash +export REFERENCE_NUMBER="CRUNCHY-21-20260224-TR1-1B-L2" + +REQUIRES_APPROVAL=1 APPROVER="<>" \ +REFERENCE_NUMBER="$REFERENCE_NUMBER" TX_DATE="$TX_DATE" OFFICE_ID=21 \ +DEBIT_GL_ID="$ID_1410" CREDIT_GL_ID="$ID_2100" AMOUNT="$AMOUNT" \ +bash scripts/omnl/omnl-je-maker.sh + +PAYLOAD_FILE="reconciliation/je-${REFERENCE_NUMBER}_.payload.json" \ +bash scripts/omnl/omnl-je-checker.sh +``` + +If maker did not add a trailing underscore, use `reconciliation/je-${REFERENCE_NUMBER}.payload.json` for PAYLOAD_FILE. + +--- + +## Phase 3 — Post-audit (Office 21) + +Audit script supports any `OFFICE_ID`; default script name is office20 but it uses `OFFICE_ID` env. + +```bash +OFFICE_ID=21 bash scripts/omnl/omnl-audit-packet-office20.sh +``` + +**Expected:** Packet folder `reconciliation/audit-office21-/` with: +- Office 21: **1410 Dr = 1,000,000,000**, **2100 Cr = 1,000,000,000** +- HO reduced by 1.0B + +Movement monitor (if run for office 21 or all offices): exit 2 when movement detected. + +--- + +## Phase 4 — Re-lock GL period + +```bash +bash scripts/omnl/omnl-gl-closures-post.sh +``` + +--- + +## Phase 5 — Artifact packaging + +Set the audit folder from Phase 3 output (e.g. `reconciliation/audit-office21-20260224-HHMMSS`). + +```bash +export AUDIT_FOLDER="reconciliation/audit-office21-" +export ZIP_NAME="CRUNCHY-21-20260224-TR1-1B-AUDIT.zip" + +HASH_LINE=$(tail -n 1 audit_log.jsonl 2>/dev/null || echo "Hash not found") +cat > "$AUDIT_FOLDER/README.txt" <`; checker refuses to post without approval metadata in payload. | +| **Reviewer + audit packet** | 100,000,000 (100M) | Single JE ≥ this → maker-checker + second reviewer + run audit packet before and after. | +| **Office 20 rails (1410/2100/2410)** | any | Any posting touching officeId=20 and these GLs → audit packet mandatory after post. | + +Defaults: `MATERIAL_THRESHOLD_MAKER_CHECKER=10000000`, `MATERIAL_THRESHOLD_REVIEWER=100000000`. + +--- + +## 2) Maker script (omnl-je-maker.sh) + +- If `AMOUNT >= MATERIAL_THRESHOLD_MAKER_CHECKER` and neither `REQUIRES_APPROVAL=1` nor `APPROVER` is set → **refuse** to generate payload and exit non-zero. +- When `REQUIRES_APPROVAL=1` and `APPROVER` is set, maker writes **approvalMetadata** into the payload file (or a sidecar): `{ "approver": "", "approvedAt": "" }`. Checker expects this in/alongside the payload for material amounts. + +--- + +## 3) Checker script (omnl-je-checker.sh) + +- If payload amount ≥ `MATERIAL_THRESHOLD_MAKER_CHECKER` and payload (or sidecar) does **not** contain valid approvalMetadata → **refuse** to post and exit non-zero. +- Optional: if amount ≥ `MATERIAL_THRESHOLD_REVIEWER`, checker can require `AUDIT_PACKET_PATH` to be set (path to a just-generated audit packet) before posting. + +--- + +## 4) Matrix posting (omnl-ledger-post-from-matrix.sh) + +- `MAX_POST_AMOUNT` caps any single entry; use it to enforce a hard ceiling (e.g. 100B). +- `ALLOWED_OFFICE_IDS` restricts which offices can receive postings. + +--- + +## 5) Success conditions + +- No one can post ≥10M without going through maker + checker with approval. +- No one can post ≥100M without second reviewer + audit packet. +- Office 20 postings to 1410/2100/2410 always trigger audit packet (run manually or in runbook after post). diff --git a/docs/04-configuration/mifos-omnl-central-bank/OFFICE_20_AUDIT_PACKET.md b/docs/04-configuration/mifos-omnl-central-bank/OFFICE_20_AUDIT_PACKET.md new file mode 100644 index 0000000..d9ab6ae --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OFFICE_20_AUDIT_PACKET.md @@ -0,0 +1,74 @@ +# Office 20 Audit Packet + +**Purpose:** One folder per run with snapshot, computed balances, recent journal entries, and manifest so the 5B position is defensible in any review. + +**Script:** `scripts/omnl/omnl-audit-packet-office20.sh` + +**Dynamic office:** The script uses `OFFICE_ID` (default 20). For any other office, run e.g. `OFFICE_ID=21 bash scripts/omnl/omnl-audit-packet-office20.sh`; output folder is `audit-office-/`. + +--- + +## Output layout (one folder per run) + +``` +reconciliation/audit-office20--/ + snapshot.json # Offices (1, 20) + GL 1410/2100/2410 + snapshot.meta # sha256, timestamp + computed_balances.json # Sum-based balances by glAccountId (deterministic) + recent_journal_entries.json # Last N days of JEs for office 20 (id, date, ref, amount, createdBy) + manifest.json # Script name, repo, git commit/branch, operator, tenant +``` + +--- + +## Snapshot schema + +- **timestamp**, **officeId**, **operator** +- **offices**: array of office objects (id, name, externalId, …) +- **glRelevant**: array of GL accounts 1410, 2100, 2410 with glCode, id, name, organizationRunningBalance (if API provides it) + +--- + +## Computed balances + +- **computedBy**: `"sum_of_journal_entries"` +- **balancesByGlId**: map of GL account id → sum of amounts from recent JEs +- Deterministic: does not depend on Trial Balance endpoint. Compare to reported TB for reconciliation. + +--- + +## Recent journal entries + +- Sourced from `GET /journalentries?officeId=20&fromDate=...&toDate=...&dateFormat=yyyy-MM-dd&locale=en` (required for many Fineract builds). Date window: `fromDate` = today − RECENT_JE_DAYS, `toDate` = today + 1 day (avoids boundary/timezone gaps). +- **API shape:** This tenant returns `{ "totalFilteredRecords": N, "pageItems": [ ... ] }` where each item is a **line-level** entry (one row per debit/credit): **id**, **officeId**, **glAccountId**, **glAccountCode**, **amount**, **entryType** (object with **value** "DEBIT"/"CREDIT"), **transactionDate** (array [y,m,d]), **transactionId**, **referenceNumber**, **comments**. The script normalizes to a flat list and derives **computed_balances** by summing signed amounts (DEBIT +, CREDIT −) per glAccountId. +- If the API does not support listing by office/date, the file may be empty; ensure **dateFormat** and **locale** are set and that the response uses **pageItems** (not a top-level array). + +--- + +## Manifest + +- **script**, **repo**, **gitCommit**, **gitBranch**, **operator**, **tenant** +- **envBaseUrl**: redacted; no credentials. + +--- + +## Acceptance (Office 20 after 5B) + +- **1410** net Dr = 5,000,000,000 +- **2100** net Cr = 5,000,000,000 +- HO **2410** increased by 5,000,000,000 + +Use **computed_balances** + **recent_journal_entries** to trace the position to exact JE IDs. + +--- + +## Usage + +```bash +# From repo root +source omnl-fineract/.env +bash scripts/omnl/omnl-audit-packet-office20.sh +# Optional: RECENT_JE_DAYS=30 OUT_BASE=./reconciliation OFFICE_ID=20 +``` + +Run daily or after any material posting to Office 20. diff --git a/docs/04-configuration/mifos-omnl-central-bank/OFFICE_20_DR_RUNBOOK.md b/docs/04-configuration/mifos-omnl-central-bank/OFFICE_20_DR_RUNBOOK.md new file mode 100644 index 0000000..68c458d --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OFFICE_20_DR_RUNBOOK.md @@ -0,0 +1,60 @@ +# Office 20 Disaster Recovery Runbook + +**Purpose:** Backups, reversal protocol, and recovery steps for Office 20 (Samama) 5B position. + +--- + +## 1) Backups + +- **Reconciliation snapshots:** Keep audit packets (e.g. `reconciliation/audit-office20-*`) retained per policy (e.g. 90 days). Copy to immutable or off-site storage if required. +- **Posting manifests:** When using maker-checker, retain the payload file and its sha256; store with the audit packet or in a dedicated manifest store. +- **Scripts and config:** Repo is source of truth; tag releases and document which git commit was used for each posting run. + +--- + +## 2) Reversal protocol + +To reverse a mistaken posting identified by **referenceNumber**: + +### 2.1 One-command reversal (when JE list API returns the entry) + +```bash +REFERENCE_NUMBER=SAMAMA-20-20260224-HO bash scripts/omnl/omnl-je-reverse-by-reference.sh +``` + +- Script finds the JE (via GET journalentries filtered by date range; then jq filter by referenceNumber). +- Posts a **new** journal entry with opposite debits/credits and comment `REVERSAL: `. +- Reversal itself gets referenceNumber `REV-`. + +### 2.2 If JE list API does not support referenceNumber filter + +1. Run **audit packet** to get `recent_journal_entries.json` and identify the JE **id** and its debits/credits. +2. Manually or via script: **POST /journalentries** with same officeId/transactionDate, comments `REVERSAL: `, **debits** = original credits, **credits** = original debits. +3. Record the reversal in a reversal manifest (ref, reversal JE id, timestamp). + +### 2.3 Reversal manifest + +After any reversal, record: + +- Original referenceNumber +- Reversal referenceNumber (e.g. REV-…) +- Reversal JE id (if returned) +- Timestamp and operator + +Store in `reconciliation/reversals.log` or equivalent (do not commit secrets). + +--- + +## 3) Recovery after outage + +1. **Verify Office 20 and HO** — GET /offices, GET /glclosures (office 20 and 1). +2. **Run audit packet** — Produce a fresh packet and compare computed_balances to expected (1410 Dr 5B, 2100 Cr 5B for office 20). +3. **Reconcile** — If TB or computed totals differ from expected, trace via recent_journal_entries.json and GL ledger in UI; then correct or reverse as per §2. + +--- + +## 4) References + +- [OPERATING_RAILS.md](OPERATING_RAILS.md) — Controls, idempotency, reconciliation +- [OFFICE_20_AUDIT_PACKET.md](OFFICE_20_AUDIT_PACKET.md) — Audit packet layout +- [SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md](SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md) — Office 20 creation and 5B transfer diff --git a/docs/04-configuration/mifos-omnl-central-bank/OFFICE_20_FIRE_DRILL_RUNBOOK.md b/docs/04-configuration/mifos-omnl-central-bank/OFFICE_20_FIRE_DRILL_RUNBOOK.md new file mode 100644 index 0000000..2e6b4ec --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OFFICE_20_FIRE_DRILL_RUNBOOK.md @@ -0,0 +1,67 @@ +# Office 20 Fire Drill Runbook + +**Purpose:** Prove end-to-end: detect → document → reverse → verify. Run once in a calm period. + +**Prereqs:** `omnl-fineract/.env` and `ids.env` (run `scripts/omnl/resolve_ids.sh` from repo root). + +--- + +## Steps + +### 1) Maker: generate $1 payload (ref DRILL-…) + +```bash +cd /path/to/repo +source ids.env +REF="DRILL-$(date +%Y%m%d)-001" AMOUNT=1 OFFICE_ID=20 \ + DEBIT_GL_ID=$ID_2100 CREDIT_GL_ID=$ID_1410 \ + bash scripts/omnl/omnl-je-maker.sh +``` + +Expect: `reconciliation/je-DRILL--001.payload.json` and `.payload.sha256`. + +### 2) Checker: post the JE + +```bash +PAYLOAD_FILE=reconciliation/je-DRILL-$(date +%Y%m%d)-001.payload.json \ + bash scripts/omnl/omnl-je-checker.sh +``` + +Expect: HTTP 200, ref recorded in `.posted_refs`. + +### 3) Movement monitor: confirm alert (exit 2) + +```bash +bash scripts/omnl/omnl-monitor-office20-movement.sh +echo "Exit code: $?" +``` + +Expect: exit code **2** and JSON indicating Office 20 movement. + +### 4) Audit packet (before reversal) + +```bash +bash scripts/omnl/omnl-audit-packet-office20.sh +``` + +Archive the printed packet path (and optional `audit_log.jsonl` line). + +### 5) Reverse by reference + +```bash +bash scripts/omnl/omnl-je-reverse-by-reference.sh DRILL-$(date +%Y%m%d)-001 +``` + +Expect: reversal JE created. + +### 6) Audit packet again (after reversal) + +```bash +bash scripts/omnl/omnl-audit-packet-office20.sh +``` + +Compare with step 4 to confirm returned state. + +--- + +**Success:** You have demonstrated detect → document → reverse → verify. See PRODUCTION_OPS_OFFICE20.md for alert wiring and durable posted_refs. diff --git a/docs/04-configuration/mifos-omnl-central-bank/OFFICE_2_READINESS_CONFIRMATION.md b/docs/04-configuration/mifos-omnl-central-bank/OFFICE_2_READINESS_CONFIRMATION.md new file mode 100644 index 0000000..f745ea3 --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OFFICE_2_READINESS_CONFIRMATION.md @@ -0,0 +1,38 @@ +# Office 2 (Shamrayan Enterprises) — Readiness Confirmation + +**Entity:** Shamrayan Enterprises +**Office ID:** 2 +**Date confirmed:** 2026-02-24 + +--- + +## Confirmation Summary + +| Item | Status | Reference | +|------|--------|-----------| +| **5B USD M1** | ✅ Confirmed | Office 2 holds 5,000,000,000 USD M1 (1410 Dr / 2100 Cr). Source: [OMNL_OFFICE_BALANCES.md](OMNL_OFFICE_BALANCES.md) — Office 2 totals: Assets 5B, Liabilities 5B; 0 M0 (2000); 5B M1 (2100) only. | +| **Full accounting** | ✅ In place | GL 1410 (Due From HO), 2100 (M1); journal entries via Fineract API; referenceNumber idempotency; closures and trial balance. | +| **Audit** | ✅ In place | Audit packet script supports any office: `OFFICE_ID=2 bash scripts/omnl/omnl-audit-packet-office20.sh`. Output: snapshot, computed_balances, recent_journal_entries, manifest; hash in audit_log.jsonl. See [OFFICE_20_AUDIT_PACKET.md](OFFICE_20_AUDIT_PACKET.md) (dynamic OFFICE_ID). | +| **Compliance** | ✅ In place | Maker-checker (≥10M), material policy, ALLOWED_OFFICE_IDS, MAX_POST_AMOUNT, durable posted_refs, chain-of-custody. See [OPERATING_RAILS.md](OPERATING_RAILS.md), [MATERIAL_POSTING_POLICY.md](MATERIAL_POSTING_POLICY.md). | +| **Ready for transfer via API P2P Bank Rail** | ✅ Ready | Runbook and controls support outbound settlement: (1) Execute P2P call to recipient endpoint; (2) Confirm settlement (e.g. status SETTLED); (3) Post mirror ledger entry (Dr 2100 / Cr 1410 at Office 2); (4) Audit + closure + package. See [OFFICE_2_SHAMRAYAN_RUNBOOK.md](OFFICE_2_SHAMRAYAN_RUNBOOK.md) (Phase 2–6) and P2P pattern in [P2P_SETTLEMENT_CRUNCHYGALAXY_RAIL.md](P2P_SETTLEMENT_CRUNCHYGALAXY_RAIL.md) (adapt for Shamrayan when endpoint/auth available). | +| **Reconcile** | ✅ Supported | Reconciliation snapshot via audit packet (computed_balances from JE lines); movement monitor for Office 2: `OFFICE_ID=2 bash scripts/omnl/omnl-monitor-office20-movement.sh`. | +| **Settlement** | ✅ Supported | Settlement = P2P confirmation (SETTLED) then mirror entry; no mirror before confirmation. Close package: request + response + settlement confirmation + mirror JE + audit packet + hash + closing memo. | + +--- + +## Ledger Position (Office 2) + +- **1410 (Due From Head Office):** Dr 5,000,000,000 +- **2100 (M1):** Cr 5,000,000,000 +- **Office 2 totals:** Assets 5B; Liabilities 5B. 0 M0; 5B M1 only. + +--- + +## Runbooks + +- **Funding / tranche (Rail B HO → Office 2):** [OFFICE_2_SHAMRAYAN_RUNBOOK.md](OFFICE_2_SHAMRAYAN_RUNBOOK.md) +- **P2P settlement pattern (adapt for Shamrayan):** [P2P_SETTLEMENT_CRUNCHYGALAXY_RAIL.md](P2P_SETTLEMENT_CRUNCHYGALAXY_RAIL.md) — use when Shamrayan P2P endpoint and auth are defined. + +--- + +**Conclusion:** Office 2 has 5B USD M1, full accounting and audit, compliance controls, and is ready for transfer via API P2P Bank Rail, reconcile, and settlement following the documented runbooks and control rule (no mirror entry before settlement confirmed). diff --git a/docs/04-configuration/mifos-omnl-central-bank/OFFICE_2_SHAMRAYAN_RUNBOOK.md b/docs/04-configuration/mifos-omnl-central-bank/OFFICE_2_SHAMRAYAN_RUNBOOK.md new file mode 100644 index 0000000..3f5a308 --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OFFICE_2_SHAMRAYAN_RUNBOOK.md @@ -0,0 +1,1021 @@ +# Office 2 — Shamrayan Enterprises Runbook + +**Entity:** Shamrayan Enterprises +**Office ID:** 2 (existing; no creation step) + +Same structure as [CRUNCHYGALAXY_OFFICE_AND_1B_FUNDING.md](CRUNCHYGALAXY_OFFICE_AND_1B_FUNDING.md): funding tranche (Rail B HO → Office 2) → audit → closure → artifact packaging → upload. **P2P banking rail (API send):** use the **Shamrayan Banking Rail** section below; flow is create bank server → create bank account → create transaction → poll/verify settlement → mirror JE → audit → closure → archive (same discipline as Office 20). + +--- + +# Office 2 — Shamrayan Banking Rail (API sending instructions) + +## Receiver banking details (for the transaction payload) + +| Field | Value | +|-------|--------| +| **Company** | SHAMRAYAN ENTERPRISES | +| **Bank** | DFCU Bank Limited | +| **SWIFT** | **DFCUUGKA** | +| **Account name** | SHAMRAYAN ENTERPRISES | +| **Account number** | **02650010158937** | +| **Country** | Uganda (use as `target_country`) | + +## Channel requirement + +- **Channel selection:** Choose **Instant Server Settlement** when sending the Financial Broadcast to the receiver. + +--- + +## API endpoints and auth (receiver rail) + +| Item | Value | +|------|--------| +| **Base URL** | `https://banktransfer.devmindgroup.com` | +| **POST transactions** | `https://banktransfer.devmindgroup.com/api/transactions` | +| **Auth method** | Bearer Token Authorization | +| **Server IP** | `172.67.157.88` | +| **Port** | 443 (TLS/SSL) | +| **Protocol** | HTTPS REST API — JSON payload | +| **Method** | POST | + +The Shamrayan PDF provides the auth details: **Bearer token** in the `Authorization` header. Map that token to the script env var below; do not treat this as “missing info.” + +--- + +### Office 2 (Shamrayan) — Required env vars (PDF-mapped) + +**Auth per PDF:** the rail uses **Bearer token auth** in the `Authorization` header. + +```bash +# REQUIRED (per Shamrayan PDF examples) +export P2P_BEARER_TOKEN="47061d41-7994-4fad-99a7-54879acd9a83" + +# OPTIONAL (ONLY if your environment requires it; the PDF example does not show it) +# export P2P_API_KEY="<>" +``` + +**Sender server identity (YOU must set these):** + +```bash +# REQUIRED (sender-side values) +export SENDER_SERVER_NAME="OMNL-OFF2-SHAMRAYAN" + +# IMPORTANT: use your PUBLIC egress IP if required (PDF uses 192.168.x.x as an EXAMPLE only) +export SENDER_SERVER_IP="<>" + +export SOURCE_ACCOUNT_NAME="<>" +export SOURCE_ACCOUNT_NUMBER="<>" +``` + +**Base URL + endpoints (per PDF):** + +```bash +export P2P_BASE_URL="https://banktransfer.devmindgroup.com" +export P2P_BANK_SERVERS_ENDPOINT="/api/bank-servers" +export P2P_BANK_ACCOUNTS_ENDPOINT="/api/bank-accounts" +export P2P_TRANSACTIONS_ENDPOINT="/api/transactions" +# Optional: if step 3 returns 404, try e.g. P2P_TRANSACTIONS_ENDPOINT="/api/v1/transactions" +``` + +**Safety:** If the token was ever shared or printed, treat it as compromised and rotate it before a live send. Optional runbook-only env file: `docs/04-configuration/mifos-omnl-central-bank/.env.office2-p2p` (gitignored); load with `set -a && source docs/04-configuration/mifos-omnl-central-bank/.env.office2-p2p && set +a` from repo root. + +--- + +## Required 3-step flow (strict order) + +Per the **API Step-by-Step** instructions: **create bank server → create bank account → create transaction**. Auth: **Bearer Token** (`Authorization: Bearer `). Optional: `x-api-key` header if provided by the provider. + +### Provider example: three endpoints (by design) + +The flow uses **one base URL** and **three different path endpoints**. That is intentional: + +| Step | Purpose | Endpoint (full URL) | +|------|---------|----------------------| +| 1 | Create bank server (sender registers) | `https://banktransfer.devmindgroup.com/api/bank-servers` | +| 2 | Create bank account (sender source account) | `https://banktransfer.devmindgroup.com/api/bank-accounts` | +| 3 | Create transaction (the actual send) | `https://banktransfer.devmindgroup.com/api/transactions` | + +- **Same base:** `https://banktransfer.devmindgroup.com` +- **Same headers for all:** `Content-Type: application/json`, `Authorization: Bearer ` (no `x-api-key` in the provider Python example) +- **Chaining:** Step 1 returns server `id` → use as `bank_server` in Step 2. Step 2 returns bank account `id` → use as `source_account` in Step 3. + +### Step 1 — Create bank server (sender registers itself) + +- **Endpoint:** `POST https://banktransfer.devmindgroup.com/api/bank-servers` +- **Headers:** `Content-Type: application/json`, `Authorization: Bearer ` +- **Request body (no `id` — server returns id):** + ```json + { + "name": "New Bank Server", + "server_ip_address": "192.168.1.102" + } + ``` +- **Response example:** `{"id": 3, "name": "New Bank Server", "server_ip_address": "192.168.1.102"}` — capture `id` for Step 2. + +### Step 2 — Create bank account (sender creates a source account) + +- **Endpoint:** `POST https://banktransfer.devmindgroup.com/api/bank-accounts` +- **Headers:** `Content-Type: application/json`, `Authorization: Bearer ` +- **Request body (no `id`):** + ```json + { + "bank_server": 1, + "account_name": "Payroll Account", + "account_number": "987654321" + } + ``` + Use the **server id** from Step 1 as `bank_server`. +- **Response example:** includes `id` (bank account id), `bank_server` (object), `account_name`, `account_number` — capture `id` for Step 3. + +### Step 3 — Create transaction (the actual send) + +- **Endpoint:** `POST https://banktransfer.devmindgroup.com/api/transactions` +- **Headers:** `Content-Type: application/json`, `Authorization: Bearer ` +- **Request body (per API doc):** + ```json + { + "transaction_type": "bank_transfer", + "amount": 500.00, + "source_account": 1, + "target_iban": null, + "target_swift_code": "DFCUUGKA", + "target_bank_account_number": "02650010158937", + "target_bank_name": "DFCU Bank Limited", + "target_country": "Uganda", + "provider": "SWIFT" + } + ``` + Use the **bank account id** from Step 2 as `source_account`. The provider Python example uses **only** these fields (no `reference`, no `channel`). Our script adds optional `reference`, `channel`, and `Idempotency-Key` header; if the API rejects the request, try the minimal payload below (and omit the Idempotency-Key header). +- **Response example:** `{"id": 3, "transaction_type": "bank_transfer", "amount": 500.00, "source_account": {...}, "target_swift_code": "DFCUUGKA", "target_bank_account_number": "02650010158937", "target_bank_name": "DFCU Bank Limited", "target_country": "Uganda", "provider": "SWIFT", "status": "pending"}` — settlement is **asynchronous**. Do **not** book ledger as settled until status is confirmed (see Settlement confirmation below). + +**Live API vs document:** If the live API returns 422 for step 1/2 or 500 for step 1, use **existing ids** and skip create: set `OFFICE2_BANK_SERVER_ID` and/or `OFFICE2_BANK_ACCOUNT_ID` (e.g. `1`) before running `office2-5b-full-execution.sh`. If step 3 returns 404, confirm the transactions endpoint with the provider; you can try an alternate path by setting `P2P_TRANSACTIONS_ENDPOINT` (e.g. `/api/v1/transactions`) or `BASE_URL` before re-running. The script then runs: step 3 → settlement → mirror JE → audit → closures. + +--- + +### Canonical Step-by-step (aligned 1:1 to the PDF) + +Headers match the PDF: `Content-Type: application/json` and `Authorization: Bearer $P2P_BEARER_TOKEN`. Add `x-api-key` only if your environment requires it: `${P2P_API_KEY:+-H "x-api-key: $P2P_API_KEY"}`. + +**Step 1 — Create bank server** + +```bash +curl -sS -X POST "$P2P_BASE_URL$P2P_BANK_SERVERS_ENDPOINT" \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $P2P_BEARER_TOKEN" \ + ${P2P_API_KEY:+-H "x-api-key: $P2P_API_KEY"} \ + -d "{ + \"name\": \"$SENDER_SERVER_NAME\", + \"server_ip_address\": \"$SENDER_SERVER_IP\" + }" +``` + +**Step 2 — Create bank account (use bank_server id from step 1)** + +```bash +curl -sS -X POST "$P2P_BASE_URL$P2P_BANK_ACCOUNTS_ENDPOINT" \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $P2P_BEARER_TOKEN" \ + ${P2P_API_KEY:+-H "x-api-key: $P2P_API_KEY"} \ + -d "{ + \"bank_server\": $BANK_SERVER_ID, + \"account_name\": \"$SOURCE_ACCOUNT_NAME\", + \"account_number\": \"$SOURCE_ACCOUNT_NUMBER\" + }" +``` + +**Step 3 — Create transaction (use source_account id from step 2)** + +This matches the provider Python example exactly (no `reference`, no `channel`, no `Idempotency-Key` header). For 5B USD use `\"amount\": 5000000000`. The full execution script adds optional `reference`, `channel`, and `Idempotency-Key`; if the API returns 4xx, try this minimal request first. + +```bash +curl -sS -X POST "$P2P_BASE_URL$P2P_TRANSACTIONS_ENDPOINT" \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $P2P_BEARER_TOKEN" \ + ${P2P_API_KEY:+-H "x-api-key: $P2P_API_KEY"} \ + -d "{ + \"transaction_type\": \"bank_transfer\", + \"amount\": 500.00, + \"source_account\": $SOURCE_ACCOUNT_ID, + \"target_iban\": null, + \"target_swift_code\": \"DFCUUGKA\", + \"target_bank_account_number\": \"02650010158937\", + \"target_bank_name\": \"DFCU Bank Limited\", + \"target_country\": \"Uganda\", + \"provider\": \"SWIFT\" + }" +``` + +--- + +## Settlement confirmation (gap — runbook requirement) + +The PDF provides **create** endpoints and shows `status: pending` but **does not provide** a “GET transaction status” endpoint or webhook spec. + +**Settlement confirmation** for Office 2 **requires one of**: + +- **Option A:** `GET /api/transactions/{id}` (if supported by the API) +- **Option B:** A query endpoint e.g. `GET /api/transactions?...` to retrieve status by id or reference +- **Option C:** Out-of-band confirmation from the provider (e.g. email, portal, or manual confirmation) + +**Runbook requirement:** Poll or verify until `status` is settled/complete **before** posting the mirror journal entry in Mifos/Fineract. Do not book “settled/closed” on-ledger until settlement is confirmed. + +**TBD:** Once the status-check endpoint (or webhook) is available from API docs or Swagger, add the exact polling commands here. Until then, document which option (A/B/C) is used and the procedure (e.g. “check provider portal for ref X”). + +--- + +## Package evidence (mirrors Office 20 discipline) + +Capture and store the following **(redact Bearer token, API key, and any secrets)**: + +| # | Evidence | Content | +|---|----------|--------| +| 1 | Step 1 request/response | Bank-server create: request JSON (redacted), response JSON; **capture returned server id** | +| 2 | Step 2 request/response | Bank-account create: request JSON (redacted), response JSON; **capture returned bank-account id** | +| 3 | Step 3 request/response | Transaction create: request JSON (redacted), response JSON; **capture transaction id and `status`** | +| 4 | Settlement verification | Repeatable check until `status` is settled/complete. **TBD:** status-check endpoint not in PDF — use GET by id, query, or out-of-band per “Settlement confirmation” above. | +| 5 | Ledger mirror JE | In Mifos/Fineract **only after settlement**: mirror JE (e.g. Dr 2100 / Cr 1410 at Office 2 for settled amount), then audit packet + closures (same as Office 20). | + +**After settlement:** Audit packet (e.g. `OFFICE_ID=2 bash scripts/omnl/omnl-audit-packet-office20.sh`), closure re-lock, full close package (API request/response + settlement confirmation + mirror JE + audit packet + hash + closing memo), then archive. + +--- + +## Structural confirmation (5B full settlement) + +Office 2’s first settlement is **one single 5B USD M1** transaction. The sequence implies: + +1. **5B was funded on-ledger to Office 2** (Rail B HO → Office 2). +2. A **P2P rail send of 5B** is executed (single transaction). +3. Only after status = **SETTLED**: mirror JE posts 5B reduction; Office 2 treasury closes. + +**Intended outcome after close (no residual balance):** + +| GL | Office 2 expected | +|------|-------------------| +| 1410 | 0 | +| 2100 | 0 | + +If only a portion were settled in future runs, the mirror amount would reflect that tranche; for this first run, **full 5B settlement** → Office 2 closes to zero. + +--- + +## Execution readiness check (before 5B P2P) + +Before executing the 5B P2P settlement, verify: + +- [ ] Banking rail limit supports **5B in one transaction** +- [ ] Provider allows 5B via **SWIFT** provider flag +- [ ] AML/compliance thresholds will not auto-hold +- [ ] Idempotency key uniqueness enforced +- [ ] Timeout and retry strategy defined + +**5B-specific recommendations:** + +| Item | Value | +|------|--------| +| Idempotency key format | `OFF2-SHAMRAYAN-5B-YYYYMMDD-HHMMSS` | +| Poll interval | ≥ 15 seconds | +| Max polling window | ≥ 30 minutes before escalation | + +--- + +## Safest execution pattern (until status endpoint is known) + +Until the provider supplies a defined settlement-status endpoint: + +1. **POST** transaction → capture full response. +2. **Capture** transaction id and initial status. +3. **Attempt GET by id** (or query by reference); if a path works, use it for polling. +4. **If no GET exists:** obtain **out-of-band confirmation**, store as `04_settlement.confirmation.txt` (or `.pdf`). +5. **Only then** post mirror JE. + +This control prevents false internal settlement. + +--- + +## Operational layers + +Execution flows through these layers in order: + +``` +Rail Execution Layer + ↓ +Settlement Confirmation Layer + ↓ +Ledger Mirror Layer + ↓ +Audit & Closure Layer + ↓ +Archive Layer +``` + +--- + +## Pre-flight dry run gate (no send, no ledger change) + +**PDF-aligned script (recommended):** Builds payloads and curl commands per *API CIS & Procedure SHAMRAYAN* PDF; no POST, no ledger change. From repo root: + +```bash +bash scripts/omnl/office2-shamrayan-dryrun.sh +``` + +Optional: `SENDER_SERVER_IP`, `SOURCE_ACCOUNT_NAME`, `SOURCE_ACCOUNT_NUMBER` (or placeholders); `DRYRUN_SKIP_ACK=1` to skip interactive prompt. Evidence and exact curl commands are written to `reconciliation/p2p-office2-/`. + +**Run again (interactive confirmation):** + +```bash +bash scripts/omnl/office2-shamrayan-dryrun.sh +``` +(Type YES at the prompt after reviewing artifacts.) + +--- + +### EXECUTE prompt (only run after you confirm) + +Once you’ve reviewed the DRY RUN artifacts and have the vault secrets loaded, run this **separately** (this is the “send” path). Do not paste secrets into chat/Slack. + +```bash +# Load secrets from vault into env FIRST (do not paste secrets into Slack/chat) +# REQUIRED: Bearer token (PDF uses this; map to P2P_BEARER_TOKEN) +export P2P_BEARER_TOKEN="<>" +export SENDER_SERVER_IP="<>" +export SOURCE_ACCOUNT_NAME="<>" +export SOURCE_ACCOUNT_NUMBER="<>" +export APPROVER="<>" +# OPTIONAL: only if provider requires (PDF example does not show it) +# export P2P_API_KEY="<>" +export P2P_BASE_URL="https://banktransfer.devmindgroup.com" +export P2P_BANK_SERVERS_ENDPOINT="/api/bank-servers" +export P2P_BANK_ACCOUNTS_ENDPOINT="/api/bank-accounts" +export P2P_TRANSACTIONS_ENDPOINT="/api/transactions" + +# Run the three POSTs using the exact run folder created above: +RUN_DIR="reconciliation/p2p-office2-" +bash -c "set -euo pipefail; source omnl-fineract/.env 2>/dev/null || true; cat \${RUN_DIR}/DRYRUN.commands.txt | bash" +``` + +Replace `` with the timestamp from your dry run evidence folder (e.g. `p2p-office2-20260224-144553`). **Note:** Steps 2 and 3 require replacing placeholders in the request JSONs with ids from the previous step’s response (or use `scripts/omnl/office2-5b-full-execution.sh`, which does that automatically). + +--- + +Alternatively, run this **single operator prompt** before a live 5B send. It validates structure, funding, and readiness **without** calling the banking endpoint or posting any JE. + +**Does:** validate 5B→zero close assumption, confirm Office 2 exists and is funded 5B, resolve GL IDs, generate idempotency key (no send), build transaction payload (no POST), validate mirror JE math (no post), print readiness checklist. + +**Does not:** call the banking API, post mirror JE, alter closures, or modify the ledger. + +**Exit:** clean **READY_TO_EXECUTE=YES** or stop with explicit reason (e.g. Office 2 not found, funding ≠ 5B). + +**Run from repo root.** + +```bash +############################################### +# OFFICE 2 — SHAMRAYAN +# 5B FULL SETTLEMENT DRY RUN (NO SEND) +############################################### + +set -e + +echo "===== OFFICE 2 (SHAMRAYAN) 5B DRY RUN START =====" + +# --- CONFIG --- +export OMNL_OFFICE_ID="2" +export OMNL_AMOUNT="5000000000" +export OMNL_CURRENCY="USD" +export OMNL_TX_DATE="$(date +%Y-%m-%d)" + +# --- ENV + GL IDs --- +source omnl-fineract/.env +export BASE="${OMNL_FINERACT_BASE_URL}" +export TENANT="${OMNL_FINERACT_TENANT:-omnl}" +export AUTH="-u ${OMNL_FINERACT_USER}:${OMNL_FINERACT_PASSWORD}" + +bash scripts/omnl/resolve_ids.sh +source ids.env + +# --- STEP 1: VERIFY OFFICE EXISTS --- +echo "[1] Verifying Office 2 exists..." +OFFICE_CHECK=$(curl -s -H "Fineract-Platform-TenantId: $TENANT" \ + -H "Content-Type: application/json" $AUTH \ + "$BASE/offices" | jq ".[] | select(.id==$OMNL_OFFICE_ID) | .id" 2>/dev/null || true) +if [ -z "$OFFICE_CHECK" ] || [ "$OFFICE_CHECK" = "null" ]; then + echo "ERROR: Office 2 not found." + exit 1 +fi +echo "OK: Office 2 confirmed." + +# --- STEP 2: VERIFY FUNDING STATE (computed balance 1410 = 5B) --- +echo "[2] Verifying Office 2 ledger funding..." +FROM_DATE="2026-01-01" +TO_DATE="$(date +%Y-%m-%d)" +JE_URL="$BASE/journalentries?officeId=$OMNL_OFFICE_ID&fromDate=$FROM_DATE&toDate=$TO_DATE&dateFormat=yyyy-MM-dd&locale=en" +curl -s -H "Fineract-Platform-TenantId: $TENANT" -H "Content-Type: application/json" $AUTH "$JE_URL" \ + | jq 'if type == "array" then . else (.pageItems // .) end | if type != "array" then [] else . end' \ + > /tmp/office2_ledger.json + +# Signed balance by GL (DEBIT +, CREDIT -) same as audit script +BAL_1410=$(jq -r --argjson gid "$ID_1410" ' + [.[] | select(.glAccountId == $gid or (.glAccount.id != null and .glAccount.id == $gid)) | + if ((.entryType // .entryType.value // "") | test("debit"; "i")) then (.amount // 0) else -(.amount // 0) end] | add // 0 +' /tmp/office2_ledger.json 2>/dev/null || echo "0") +BAL_2100=$(jq -r --argjson gid "$ID_2100" ' + [.[] | select(.glAccountId == $gid or (.glAccount.id != null and .glAccount.id == $gid)) | + if ((.entryType // .entryType.value // "") | test("debit"; "i")) then (.amount // 0) else -(.amount // 0) end] | add // 0 +' /tmp/office2_ledger.json 2>/dev/null || echo "0") + +echo "Computed 1410 balance: $BAL_1410" +echo "Computed 2100 balance: $BAL_2100" + +if [ "${BAL_1410:-0}" -ne "$OMNL_AMOUNT" ]; then + echo "ERROR: Office 2 1410 does not equal 5B (got $BAL_1410)." + exit 2 +fi +echo "OK: Office 2 funded 5B." + +# --- STEP 3: GENERATE IDEMPOTENCY KEY --- +DRYRUN_DIR="reconciliation/dryrun-office2-$(date +%Y%m%d-%H%M%S)" +mkdir -p "$DRYRUN_DIR" +echo "[3] Generating idempotency key..." +export IDEMPOTENCY_KEY="OFF2-SHAMRAYAN-5B-$(date +%Y%m%d)-$(date +%H%M%S)" +echo "$IDEMPOTENCY_KEY" > "$DRYRUN_DIR/03_idempotency_key.txt" +echo "Idempotency key: $IDEMPOTENCY_KEY (written to $DRYRUN_DIR)" + +# --- STEP 4: BUILD TRANSACTION PAYLOAD (NO SEND) --- +echo "[4] Building 5B P2P transaction payload (dry run)..." +cat > "$DRYRUN_DIR/03_transaction.dryrun.json" <>", + "target_iban": null, + "target_swift_code": "DFCUUGKA", + "target_bank_account_number": "02650010158937", + "target_bank_name": "DFCU Bank Limited", + "target_country": "Uganda", + "provider": "SWIFT", + "reference": "$IDEMPOTENCY_KEY", + "channel": "Instant Server Settlement" +} +EOF +echo "Payload written to $DRYRUN_DIR/03_transaction.dryrun.json" +echo "NO API CALL EXECUTED." + +# --- STEP 5: MIRROR JE VALIDATION (NO POST) --- +echo "[5] Validating mirror JE math (no post)..." +echo "If settled, expected Office 2: 1410 = 0, 2100 = 0 (full 5B reduction)." + +# --- STEP 6: EXECUTION READINESS CHECK --- +echo "[6] Execution Readiness Checklist — confirm manually:" +echo " - Rail limit supports 5B" +echo " - Provider SWIFT limit supports 5B" +echo " - AML/compliance cleared" +echo " - Vault tokens available (omnl/offices/2/p2p)" +echo " - Poll interval >= 15s" +echo " - Max polling >= 30 min" +echo " - Idempotency format: OFF2-SHAMRAYAN-5B-YYYYMMDD-HHMMSS" + +echo "" +echo "===== DRY RUN COMPLETE =====" +echo "NO FUNDS SENT | NO LEDGER MODIFIED" +echo "" +echo "READY_TO_EXECUTE=YES" +``` + +### What this dry run confirms + +| Check | Result | +|-------|--------| +| Office 2 exists | ✔ | +| Office 2 funded 5B (1410 balance) | ✔ | +| Ledger math / GL IDs resolved | ✔ | +| Idempotency format correct | ✔ | +| Payload constructed (no POST) | ✔ | +| Expected post-settlement zero close (1410=0, 2100=0) | ✔ | +| No API send | ✔ | +| No mirror JE | ✔ | +| No closures altered | ✔ | + +### After running + +If output shows **READY_TO_EXECUTE=YES**, you are structurally cleared to execute the real 5B send. Dry-run artifacts are under `reconciliation/dryrun-office2-/`. + +**Optional next automation (when you want them):** + +- **Hardened LIVE EXECUTION BLOCK** — single 5B send with strict guards. +- **Auto-abort guard** — abort if funding ≠ 5B at execution time. +- **Post-execution verification** — enforce 1410=0 and 2100=0 before allowing closure. + +--- + +## End-to-end execution (send → capture → settle → mirror → audit → archive) + +**Single script (recommended):** From repo root, set required env (see below) and run: + +```bash +export P2P_BEARER_TOKEN="" +export P2P_API_KEY="" +export SENDER_SERVER_IP="" +export SOURCE_ACCOUNT_NAME="" +export SOURCE_ACCOUNT_NUMBER="" +export APPROVER="" +bash scripts/omnl/office2-5b-full-execution.sh +``` + +The script tests API connectivity, then runs: create bank server → create bank account → create transaction (5B) → settlement probe/poll (or use `SKIP_POLL=1 SETTLED=1` for out-of-band) → mirror JE → audit → closures → archive instructions. Evidence is written to `reconciliation/p2p-office2-/`. + +Copy-paste blocks below in order if you prefer manual steps. No secrets in repo. + +### OMNL Office Mapping (Locked) + +```bash +# OMNL office mapping +export OMNL_OFFICE_ID="2" # SHAMRAYAN +``` + +Office 2 is **Shamrayan**. First settlement on-ledger: **5,000,000,000 USD M1**. Set amount and date per run below. + +### A) Execution variables (no secrets in repo) + +```bash +# OMNL / Fineract context (mirror happens only after settlement) +export OMNL_OFFICE_ID="2" # SHAMRAYAN (locked) +export OMNL_TX_DATE="2026-02-24" # set per run (or today) +export OMNL_CURRENCY="USD" +export OMNL_AMOUNT="5000000000" # 5B USD M1 on-ledger (Office 2 first settlement) + +# Banking Rail context (from vault) +export VAULT_PATH="omnl/offices/2/p2p" +export BASE_URL="https://banktransfer.devmindgroup.com" + +# Evidence folder +export EVID_DIR="reconciliation/p2p-office2-$(date +%Y%m%d-%H%M%S)" +mkdir -p "$EVID_DIR" +``` + +### B) Load secrets and preflight (operator action) + +**Operator action:** set **Bearer token** (required; from Shamrayan PDF or vault path `omnl/offices/2/p2p`). Set sender identity and approver. **API key is optional** (PDF example does not show it; only if your environment requires it). Do not store tokens in shell history. + +```bash +export P2P_BEARER_TOKEN="<>" +export SENDER_SERVER_NAME="${SENDER_SERVER_NAME:-OMNL-OFF2-SHAMRAYAN}" +export SENDER_SERVER_IP="<>" +export SOURCE_ACCOUNT_NAME="<>" +export SOURCE_ACCOUNT_NUMBER="<>" +export APPROVER="<>" +# Optional: only if provider requires +# export P2P_API_KEY="<>" +``` + +**Preflight (script uses these; stops if missing):** + +```bash +: "${P2P_BEARER_TOKEN:?Set P2P_BEARER_TOKEN (from Shamrayan PDF / vault path omnl/offices/2/p2p)}" +: "${SENDER_SERVER_IP:?Set SENDER_SERVER_IP (public sender IP; PDF IP is example only)}" +: "${SOURCE_ACCOUNT_NAME:?Set SOURCE_ACCOUNT_NAME}" +: "${SOURCE_ACCOUNT_NUMBER:?Set SOURCE_ACCOUNT_NUMBER}" +: "${APPROVER:?Set APPROVER for mirror JE (maker-checker)}" +# Optional key (only enforce if your deployment requires it) +# : "${P2P_API_KEY:?Set P2P_API_KEY if required by provider}" +``` + +### C) Step 1 — Create bank server (capture full req/resp) + +Use PDF-aligned headers: `Content-Type: application/json`, `Authorization: Bearer $P2P_BEARER_TOKEN`; add `x-api-key` only if required: `${P2P_API_KEY:+-H "x-api-key: $P2P_API_KEY"}`. + +```bash +cat > "$EVID_DIR/01_bank_server.request.json" < "$EVID_DIR/02_bank_account.request.json" <>", + "account_number": "<>" +} +EOF + +curl -sS -X POST "$P2P_BASE_URL$P2P_BANK_ACCOUNTS_ENDPOINT" \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $P2P_BEARER_TOKEN" \ + ${P2P_API_KEY:+-H "x-api-key: $P2P_API_KEY"} \ + --data @"$EVID_DIR/02_bank_account.request.json" \ + | tee "$EVID_DIR/02_bank_account.response.json" + +export SOURCE_ACCOUNT_ID=$(jq -r '.id' "$EVID_DIR/02_bank_account.response.json") +test "$SOURCE_ACCOUNT_ID" != "null" && test -n "$SOURCE_ACCOUNT_ID" +echo "SOURCE_ACCOUNT_ID=$SOURCE_ACCOUNT_ID" | tee "$EVID_DIR/02_bank_account.id.txt" +``` + +### E) Step 3 — Create transaction (capture full req/resp + idempotency) + +```bash +export IDEMPOTENCY_KEY="OFF2-SHAMRAYAN-${OMNL_TX_DATE//-/}-$(date +%H%M%S)-${OMNL_AMOUNT}" + +cat > "$EVID_DIR/03_transaction.request.json" </dev/null + + STATUS=$(jq -r '.status // .data.status // empty' "$EVID_DIR/04_settlement.response.json") + if [ -n "$STATUS" ]; then + echo "STATUS=$STATUS" | tee "$EVID_DIR/04_settlement.status.txt" + break + fi +done +``` + +#### Polling rule (safe default) + +```bash +# Poll until SETTLED/COMPLETED/SUCCESS (adjust to provider vocabulary) +for i in $(seq 1 30); do + STATUS=$(jq -r '.status // .data.status // empty' "$EVID_DIR/04_settlement.response.json") + echo "$(date -Is) status=$STATUS" | tee -a "$EVID_DIR/04_settlement.poll.log" + + case "$STATUS" in + SETTLED|COMPLETED|SUCCESS) export SETTLED=1; break ;; + FAILED|REJECTED|CANCELED) echo "Settlement failed: $STATUS"; exit 2 ;; + *) sleep 10 ;; + esac + + # re-fetch (use the working GET path you discovered above; if none worked, stop here) +done + +test "${SETTLED:-0}" -eq 1 +``` + +#### Option C — Out-of-band confirmation (if no GET exists) + +If no GET works, use runbook **Option C**: + +- Capture the provider confirmation email/message as `04_settlement.confirmation.txt` (or `.pdf`). +- Only then proceed to mirror entry. + +--- + +### Single 5B transaction — hardened execution & monitoring + +Use this block when executing the **single 5B** send so there is zero ambiguity. It enforces 5B-specific idempotency, 15s poll interval, and 30-minute max window with escalation. + +**5B idempotency key (use in Step 3):** + +```bash +# Override idempotency for single 5B transaction +export IDEMPOTENCY_KEY="OFF2-SHAMRAYAN-5B-$(date +%Y%m%d)-$(date +%H%M%S)" +echo "$IDEMPOTENCY_KEY" | tee "$EVID_DIR/03_idempotency_key.txt" +``` + +**5B settlement polling (15s interval, 30 min max, then escalate):** + +```bash +# 5B: poll every 15s; max 120 iterations = 30 minutes +POLL_INTERVAL=15 +MAX_POLL=120 +SETTLED=0 + +for i in $(seq 1 $MAX_POLL); do + # Re-fetch using the GET path that worked during probe (Option A) + curl -sS "$BASE_URL/api/transactions/$TX_ID" \ + -H "Authorization: Bearer $P2P_BEARER_TOKEN" \ + -H "Content-Type: application/json" \ + -H "X-API-KEY: $P2P_API_KEY" \ + > "$EVID_DIR/04_settlement.response.json" + + STATUS=$(jq -r '.status // .data.status // empty' "$EVID_DIR/04_settlement.response.json") + echo "$(date -Is) iteration=$i status=$STATUS" | tee -a "$EVID_DIR/04_settlement.poll.log" + + case "$STATUS" in + SETTLED|COMPLETED|SUCCESS) SETTLED=1; break ;; + FAILED|REJECTED|CANCELED) echo "Settlement failed: $STATUS"; exit 2 ;; + *) sleep $POLL_INTERVAL ;; + esac +done + +if [ "$SETTLED" -ne 1 ]; then + echo "ESCALATE: 30 min polling window exceeded. TX_ID=$TX_ID. Obtain out-of-band confirmation before mirror." \ + | tee "$EVID_DIR/04_settlement.ESCALATE.txt" + exit 3 +fi + +export SETTLED=1 +echo "SETTLED" | tee "$EVID_DIR/04_settlement.status.txt" +``` + +**Execution state checklist (single 5B):** + +| Step | State | Action | +|------|--------|--------| +| 1 | Rail executed | POST transaction; TX_ID and initial status captured | +| 2 | Confirmation | Poll until SETTLED or 30 min → escalate or out-of-band | +| 3 | Mirror | Only after SETTLED: post mirror JE 5B (Dr 2100 / Cr 1410) | +| 4 | Close | Audit Office 2 → closures → archive both folders + mirror payload | + +--- + +### After Settlement → Mirror JE → Audit → Closures → Archive (Office-20 equivalent) + +> **Rule:** Do **not** post the mirror JE until the P2P rail status is confirmed **SETTLED/COMPLETED/SUCCESS**. + +```bash +############################################## +# AFTER SETTLEMENT CONFIRMED (P2P Rail) +# Mirror the settlement in OMNL (Office 2) +############################################## + +# 1) Resolve GL IDs +source omnl-fineract/.env +bash scripts/omnl/resolve_ids.sh +source ids.env + +# 2) Post mirror JE (reduces Office 2 treasury by settled amount) +# Dr 2100 / Cr 1410 = settled amount +export REFERENCE_NUMBER="OFF2-SHAMRAYAN-SETTLED-${OMNL_TX_DATE//-/}-${OMNL_AMOUNT}" + +REQUIRES_APPROVAL=1 APPROVER="<>" \ +REFERENCE_NUMBER="$REFERENCE_NUMBER" \ +TX_DATE="$OMNL_TX_DATE" \ +OFFICE_ID="$OMNL_OFFICE_ID" \ +CURRENCY="$OMNL_CURRENCY" \ +DEBIT_GL_ID="$ID_2100" \ +CREDIT_GL_ID="$ID_1410" \ +AMOUNT="$OMNL_AMOUNT" \ +bash scripts/omnl/omnl-je-maker.sh + +PAYLOAD_FILE=$(ls reconciliation/je-$REFERENCE_NUMBER*.payload.json) +PAYLOAD_FILE="$PAYLOAD_FILE" bash scripts/omnl/omnl-je-checker.sh + +# 3) Post-audit (Office 2) +OFFICE_ID="$OMNL_OFFICE_ID" bash scripts/omnl/omnl-audit-packet-office20.sh + +# 4) Re-lock GL closures +bash scripts/omnl/omnl-gl-closures-post.sh + +# 5) Archive off-box (operator action) +echo "Archive off-box: reconciliation/audit-office2-/ and reconciliation/p2p-office2-/" \ + > "reconciliation/p2p-office2-archive-instructions.txt" +``` + +--- + +### Evidence package (required contents) + +The final package **must** include **both** folders and the mirror JE payload: + +| Item | Description | +|------|-------------| +| `reconciliation/p2p-office2-/` | Banking rail: req/resp for steps 1–3 + settlement proof (`04_settlement.*`) | +| `reconciliation/audit-office2-/` | OMNL audit packet (snapshot, computed_balances, recent_journal_entries, manifest) | +| `reconciliation/je-OFF2-SHAMRAYAN-SETTLED-*.payload.json` | Mirror JE payload file (and .sha256 if maker writes it) | + +Within the P2P evidence folder: + +- `01_bank_server.request.json` / `01_bank_server.response.json` / `01_bank_server.id.txt` +- `02_bank_account.request.json` / `02_bank_account.response.json` / `02_bank_account.id.txt` +- `03_transaction.request.json` / `03_transaction.response.json` / `03_transaction.id.txt` / `03_transaction.status.txt` +- `04_settlement.*` (poll logs + final status response OR out-of-band confirmation artifact) + +Include `audit_log.jsonl` line reference (or in README). **Redact** Bearer token and API key from any stored evidence before archive. + +--- + +### Upload destination (Office 2 — Shamrayan) + +**Samama is not the receiving bank for Office 2.** Treat **upload destination as TBD / receiver-specific** unless the Shamrayan (or provider) PDF explicitly provides an upload portal. If the provider requires evidence delivery, add an “Upload destination” procedure for Shamrayan separately and document the URL/credentials (vault path only) here when defined. + +--- + +## Phase 1 — Confirm Office 2 Exists + +Office 2 is pre-existing; no creation. Verify: + +```bash +source omnl-fineract/.env +BASE="${OMNL_FINERACT_BASE_URL}" +TENANT="${OMNL_FINERACT_TENANT:-omnl}" +AUTH="-u ${OMNL_FINERACT_USER}:${OMNL_FINERACT_PASSWORD}" + +curl -s -H "Fineract-Platform-TenantId: $TENANT" -H "Content-Type: application/json" $AUTH \ + "$BASE/offices" | jq '.[] | select(.id == 2) | {id, name, externalId}' +``` + +Expect: `id: 2`, `name: "Shamrayan Enterprises"` (or equivalent). Proceed only if Office 2 exists. + +--- + +## Phase 2 — Transfer M1 from Head Office (Rail B: HO → Office 2) + +**Economic result:** HO −AMOUNT; Office 2 +AMOUNT (symmetric). +Example: 1.0B USD M1 → set `AMOUNT=1000000000`. Replace `<>` for material (≥10M). + +### 2.1 Prep (IDs + closures + optional pre-audit) + +```bash +bash scripts/omnl/resolve_ids.sh +source ids.env + +bash scripts/omnl/omnl-gl-closures-post.sh +# Optional: OFFICE_ID=2 bash scripts/omnl/omnl-audit-packet-office20.sh +``` + +If GL closure blocks posting on the intended date, use the same operational pattern as Crunchygalaxy (see PRODUCTION_OPS_OFFICE20.md — closure delete/re-lock only when necessary and logged). + +### 2.2 Leg 1 — Head Office reduction (Office 1) + +Dr 2100 / Cr 1410. Example: 1,000,000,000 (1B). + +```bash +export REFERENCE_NUMBER="SHAMRAYAN-1-20260224-TR1-1B-L1" +export TX_DATE="2026-02-24" +export AMOUNT="1000000000" + +REQUIRES_APPROVAL=1 APPROVER="<>" \ +REFERENCE_NUMBER="$REFERENCE_NUMBER" TX_DATE="$TX_DATE" OFFICE_ID=1 \ +DEBIT_GL_ID="$ID_2100" CREDIT_GL_ID="$ID_1410" AMOUNT="$AMOUNT" \ +bash scripts/omnl/omnl-je-maker.sh + +PAYLOAD_FILE="reconciliation/je-${REFERENCE_NUMBER}_.payload.json" \ +bash scripts/omnl/omnl-je-checker.sh +``` + +If payload has no trailing underscore, use `reconciliation/je-${REFERENCE_NUMBER}.payload.json`. + +### 2.3 Leg 2 — Office 2 (Shamrayan) funding + +Dr 1410 / Cr 2100. Same amount as Leg 1. + +```bash +export REFERENCE_NUMBER="SHAMRAYAN-2-20260224-TR1-1B-L2" + +REQUIRES_APPROVAL=1 APPROVER="<>" \ +REFERENCE_NUMBER="$REFERENCE_NUMBER" TX_DATE="$TX_DATE" OFFICE_ID=2 \ +DEBIT_GL_ID="$ID_1410" CREDIT_GL_ID="$ID_2100" AMOUNT="$AMOUNT" \ +bash scripts/omnl/omnl-je-maker.sh + +PAYLOAD_FILE="reconciliation/je-${REFERENCE_NUMBER}_.payload.json" \ +bash scripts/omnl/omnl-je-checker.sh +``` + +--- + +## Phase 3 — Post-audit (Office 2) + +```bash +OFFICE_ID=2 bash scripts/omnl/omnl-audit-packet-office20.sh +``` + +**Expected:** Packet folder `reconciliation/audit-office2-/` with: +- Office 2: **1410 Dr** and **2100 Cr** increased by the tranche amount (e.g. +1.0B each for a 1B tranche). +- HO reduced by same amount. + +Movement monitor for Office 2: + +```bash +OFFICE_ID=2 bash scripts/omnl/omnl-monitor-office20-movement.sh +``` + +Expect exit 2 when movement detected. + +--- + +## Phase 4 — Re-lock GL Period + +```bash +bash scripts/omnl/omnl-gl-closures-post.sh +``` + +--- + +## Phase 5 — Artifact Packaging + +Set `AUDIT_FOLDER` from Phase 3 output (e.g. `reconciliation/audit-office2-20260224-HHMMSS`). + +```bash +export AUDIT_FOLDER="reconciliation/audit-office2-" +export ZIP_NAME="SHAMRAYAN-2-20260224-TR1-1B-AUDIT.zip" + +HASH_LINE=$(tail -n 1 audit_log.jsonl 2>/dev/null || echo "Hash not found") +cat > "$AUDIT_FOLDER/README.txt" <-SET-` (see [OMNL_OFFICE_ADDRESS_BOOK.md](OMNL_OFFICE_ADDRESS_BOOK.md)). +- **Capture:** Step 1–3 request/response (redacted), settlement verification, then mirror JE only after settlement. +- **After settlement:** Mirror JE (e.g. Dr 2100 / Cr 1410 at Office 2 for settled amount) → audit (OFFICE_ID=2) → closure → full close package (request + response + settlement confirmation + mirror JE + audit packet + hash + closing memo) → archive. + +**Office 2 on OMNL side:** officeId = **2**, funding amount as per tranche (e.g. from Rail B Leg 2). When you have the exact **officeId** and **funding amount** for “after settlement → mirror JE → audit → closure → archive,” that block can be appended here for end-to-end parity with Office 20. diff --git a/docs/04-configuration/mifos-omnl-central-bank/OMNL_CLIENT_API_TO_UI_MAPPING.md b/docs/04-configuration/mifos-omnl-central-bank/OMNL_CLIENT_API_TO_UI_MAPPING.md new file mode 100644 index 0000000..0424a45 --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OMNL_CLIENT_API_TO_UI_MAPPING.md @@ -0,0 +1,98 @@ +# OMNL Client API → UI Column Mapping + +**Purpose:** Map the UI client list columns to the Fineract list API response so each column shows the correct data. + +**API:** `GET /fineract-provider/api/v1/clients` → response has `pageItems[]` (one object per client). Tenant `omnl`, Basic auth. + +--- + +## UI column → API field mapping + +| UI column | API field / expression | Notes | +|-------------|------------------------|--------| +| **Name** | `firstname` (or see below) | API does not return `displayName` or `fullname`. Use `firstname`; if `lastname === "."` show only `firstname`, else `firstname + " " + lastname`. | +| **Account No.** | `accountNo` | String, e.g. `"000000001"`. | +| **External Id** | `externalId` | String, e.g. `"OMNL-1-M0-M1"`, `"OMNL-9"`. | +| **Status** | `status.value` | Status is an object; use the `value` property, e.g. `"Pending"`. | +| **Office Name** | `officeName` | String, e.g. `"Head Office"`. | + +--- + +## Name column (detail) + +The API returns **`firstname`** and **`lastname`** only (no `displayName` / `fullname`). For OMNL we set `lastname` to `"."` when there is no real last name. To show a clean name: + +```ts +// Recommended: show firstname only when lastname is the placeholder +const displayName = (client.lastname === '.' || !client.lastname) + ? client.firstname + : `${client.firstname} ${client.lastname}`; +``` + +Bind the **Name** column to `displayName` (computed as above) or, for simplicity, to **`firstname`** only. + +--- + +## Full list API shape (reference) + +Each item in `pageItems` has (among others): + +| API key | Type | Example | +|---------|------|---------| +| `id` | number | 1 | +| `accountNo` | string | "000000001" | +| `externalId` | string | "OMNL-9" | +| `status` | object | `{ "id": 100, "code": "clientStatusType.pending", "value": "Pending" }` | +| `firstname` | string | "FIDIS" | +| `lastname` | string | "." | +| `officeId` | number | 1 | +| `officeName` | string | "Head Office" | + +`displayName` and `fullname` are **not** in the API response; do not bind any column to them. + +--- + +## Edit form (Home / Clients / Edit) + +When loading a client for edit (e.g. from `GET /clients/{id}`), the form fields must be filled from the API response. The **Entity Name** field is required but often appears empty because it is not bound to the API. + +| Form label | API field (load & save) | Notes | +|-----------------|--------------------------|--------| +| **Entity Name *** | **`firstname`** | **Required.** Load this from the client payload when opening the form; on Submit, send it as `firstname`. If the field is bound to `displayName` or `fullname` (which the API does not return), it will stay empty — bind it to **`firstname`**. | +| Account No. | `accountNo` | Read-only; display only. | +| External Id | `externalId` | Load and save. | +| Office | `officeId` / `officeName` | Dropdown; use `officeId` for save. | +| Legal Form | `legalForm` / `legalForm.id` | Already correct if showing "Entity". | +| Submitted On * | `timeline.submittedOnDate` or equivalent | For display/load. | +| Mobile No | `mobileNo` (if present) | Optional. | +| Email Address | `emailAddress` (if present) | Optional. | + +**Fix for empty Entity Name on edit:** Ensure the edit form loads **`firstname`** from the client response into the "Entity Name" input. On submit, send **`firstname`** (and **`lastname`**: use `"."` if no real last name, since the tenant requires non-blank lastname). + +--- + +## Verification + +To re-check the API response from repo root: + +```bash +source omnl-fineract/.env # or .env +curl -s -u "${OMNL_FINERACT_USER}:${OMNL_FINERACT_PASSWORD}" \ + -H "Fineract-Platform-TenantId: omnl" \ + "${OMNL_FINERACT_BASE_URL}/clients" | jq '.pageItems[0] | keys' +``` + +To list only name-related fields for all clients: + +```bash +curl -s -u "${OMNL_FINERACT_USER}:${OMNL_FINERACT_PASSWORD}" \ + -H "Fineract-Platform-TenantId: omnl" \ + "${OMNL_FINERACT_BASE_URL}/clients" | jq '.pageItems[] | { accountNo, firstname, lastname }' +``` + +--- + +## References + +- [OMNL_CLIENT_NAMES_FIX.md](OMNL_CLIENT_NAMES_FIX.md) — How names are set via API +- [OMNL_ENTITY_MASTER_DATA.json](OMNL_ENTITY_MASTER_DATA.json) — Canonical entity names (1–15) diff --git a/docs/04-configuration/mifos-omnl-central-bank/OMNL_CLIENT_NAMES_FIX.md b/docs/04-configuration/mifos-omnl-central-bank/OMNL_CLIENT_NAMES_FIX.md new file mode 100644 index 0000000..2e3601c --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OMNL_CLIENT_NAMES_FIX.md @@ -0,0 +1,112 @@ +# OMNL Clients — Blank Name Column Fix + +**Issue:** The Clients list at [https://omnl.hybxfinance.io/#/clients](https://omnl.hybxfinance.io/#/clients) shows **blank names** for all clients. Account No., External Id (e.g. `OMNL-1-M0-M1`), Status (Pending), and Office are present. + +**Cause:** Clients were created (e.g. via import or API) without `firstname` / `lastname` (or `fullname` / `displayName`). The Fineract UI “Name” column often shows the client’s **displayName**; when that field is empty, the column is blank. + +**Note:** The API stores **firstname** and **lastname** (we set lastname to `"."` because the tenant requires a non-blank value). Some tenants or list endpoints return **displayName** as null even when firstname/lastname are set. If the Name column stays blank after running the fix: try a **hard refresh** (Ctrl+Shift+R or Cmd+Shift+R) or clear browser cache; if it still stays blank, the list view may be bound to displayName and the platform may need to show firstname when displayName is null. + +--- + +## Canonical client names (Operating / External-Facing Entities) + +| Client | Account No. | Name | +|--------|-------------|------| +| 1 | 000000001 | **OMNL Head Office (DBIS)** – Central Bank | +| 2 | 000000002 | Shamrayan Enterprises | +| 3 | 000000003 | HYBX | +| 4 | 000000004 | TAJ Private Single Family Office | +| 5 | 000000005 | Aseret Mortgage Bank | +| 6 | 000000006 | Mann Li Family Offices | +| 7 | 000000007 | Sovereign Order of Malta OSJ | +| 8 | 000000008 | Alltra Mainnet | +| 9 | 000000009 | FIDIS | +| 10 | 000000010 | Alpha Omega Holdings | +| 11 | 000000011 | SGI Capital | +| 12 | 000000012 | Titan Financial | +| 13 | 000000013 | Roy Walker PLLC | +| 14 | 000000014 | SGI Partners LLC | +| 15 | 000000015 | Tsunami Holdings AG | + +The fix script maps by **Account No.** (000000001 → Client 1, …) and sets the name above for each. + +--- + +## Fix options + +### 1. Script (recommended): set canonical names + +From repo root, with `omnl-fineract/.env` (or root `.env`) containing `OMNL_FINERACT_BASE_URL` and `OMNL_FINERACT_PASSWORD`: + +```bash +# Dry run: print what would be updated +DRY_RUN=1 bash scripts/omnl/omnl-client-names-fix.sh + +# Apply: PUT firstname for each client (canonical name from table above) +bash scripts/omnl/omnl-client-names-fix.sh +``` + +The script sets each client’s display name to the canonical operating-entity name in the table above. + +### 2. Manual API (one client) + +1. Get client list: + ```bash + curl -s -u "${OMNL_FINERACT_USER}:${OMNL_FINERACT_PASSWORD}" \ + -H "Fineract-Platform-TenantId: omnl" \ + "${OMNL_FINERACT_BASE_URL}/clients" + ``` +2. Update one client (replace `{clientId}` and name): + ```bash + curl -s -X PUT -u "${OMNL_FINERACT_USER}:${OMNL_FINERACT_PASSWORD}" \ + -H "Fineract-Platform-TenantId: omnl" \ + -H "Content-Type: application/json" \ + -d '{"firstname":"OMNL Head Office (DBIS) – Central Bank","lastname":""}' \ + "${OMNL_FINERACT_BASE_URL}/clients/{clientId}" + ``` + +### 3. Via Mifos UI (if allowed) + +If the tenant allows editing pending clients: open each client, edit and set First name / Last name, then save. + +--- + +## Preventing blank names for new clients + +When creating clients via API (`POST /clients`), always send at least one of: + +- `firstname` and `lastname`, or +- `fullname` (e.g. for organisations) + +Example minimal body: + +```json +{ + "officeId": 1, + "firstname": "OMNL", + "lastname": "2-M0-M1", + "externalId": "OMNL-2-M0-M1", + "dateFormat": "yyyy-MM-dd", + "locale": "en", + "active": false, + "submittedOnDate": "2026-02-21" +} +``` + +--- + +## Full entity data (name + LEI + address + contacts) + +For **entity names plus LEI, address, and contacts**, use the master data file and apply script: + +- **[OMNL_ENTITY_MASTER_DATA.md](OMNL_ENTITY_MASTER_DATA.md)** — Data file description, how to fill LEI/address/contacts, Fineract mapping +- **[OMNL_ENTITY_MASTER_DATA.json](OMNL_ENTITY_MASTER_DATA.json)** — Edit this file with LEI, address, and contact details per entity +- **Script:** `bash scripts/omnl/omnl-entity-data-apply.sh` (applies names, identifiers (LEI), addresses, contacts) + +--- + +## References + +- [FINERACT_API_REFERENCE.md](FINERACT_API_REFERENCE.md) — Auth, tenant header, base URL +- [OMNL Fineract README](../../../omnl-fineract/README.md) — Env vars and quick API reference +- OpenAPI spec: `docs/api/omnl-fineract-openapi.json` — `Client` / `PostClientsRequest` schemas diff --git a/docs/04-configuration/mifos-omnl-central-bank/OMNL_ENTITY_MASTER_DATA.json b/docs/04-configuration/mifos-omnl-central-bank/OMNL_ENTITY_MASTER_DATA.json new file mode 100644 index 0000000..78cacb2 --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OMNL_ENTITY_MASTER_DATA.json @@ -0,0 +1,386 @@ +{ + "description": "Operating / external-facing entities for OMNL. Used for Offices (Organization / Manage Offices) or Clients. Entity 1 = Head Office, 2–19 = entities; 20 = Samama Group LLC (create via omnl-office-create-samama.sh). Fill LEI, address, contact when used as clients.", + "source": "https://omnl.hybxfinance.io/#/clients", + "entities": [ + { + "clientNumber": 1, + "accountNo": "000000001", + "entityName": "OMNL Head Office (DBIS) – Central Bank", + "lei": "", + "address": { + "street": "", + "addressLine1": "", + "addressLine2": "", + "city": "", + "stateProvinceId": null, + "countryId": null, + "postalCode": "" + }, + "contact": { + "mobileNo": "", + "emailAddress": "" + } + }, + { + "clientNumber": 2, + "accountNo": "000000002", + "entityName": "Shamrayan Enterprises", + "lei": "", + "address": { + "street": "", + "addressLine1": "", + "addressLine2": "", + "city": "", + "stateProvinceId": null, + "countryId": null, + "postalCode": "" + }, + "contact": { + "mobileNo": "", + "emailAddress": "" + } + }, + { + "clientNumber": 3, + "accountNo": "000000003", + "entityName": "HYBX", + "lei": "", + "address": { + "street": "", + "addressLine1": "", + "addressLine2": "", + "city": "", + "stateProvinceId": null, + "countryId": null, + "postalCode": "" + }, + "contact": { + "mobileNo": "", + "emailAddress": "" + } + }, + { + "clientNumber": 4, + "accountNo": "000000004", + "entityName": "TAJ Private Single Family Office", + "lei": "", + "address": { + "street": "", + "addressLine1": "", + "addressLine2": "", + "city": "", + "stateProvinceId": null, + "countryId": null, + "postalCode": "" + }, + "contact": { + "mobileNo": "", + "emailAddress": "" + } + }, + { + "clientNumber": 5, + "accountNo": "000000005", + "entityName": "Aseret Mortgage Bank", + "lei": "", + "address": { + "street": "", + "addressLine1": "", + "addressLine2": "", + "city": "", + "stateProvinceId": null, + "countryId": null, + "postalCode": "" + }, + "contact": { + "mobileNo": "", + "emailAddress": "" + } + }, + { + "clientNumber": 6, + "accountNo": "000000006", + "entityName": "Mann Li Family Offices", + "lei": "", + "address": { + "street": "", + "addressLine1": "", + "addressLine2": "", + "city": "", + "stateProvinceId": null, + "countryId": null, + "postalCode": "" + }, + "contact": { + "mobileNo": "", + "emailAddress": "" + } + }, + { + "clientNumber": 7, + "accountNo": "000000007", + "entityName": "Sovereign Order of Malta OSJ", + "lei": "", + "address": { + "street": "", + "addressLine1": "", + "addressLine2": "", + "city": "", + "stateProvinceId": null, + "countryId": null, + "postalCode": "" + }, + "contact": { + "mobileNo": "", + "emailAddress": "" + } + }, + { + "clientNumber": 8, + "accountNo": "000000008", + "entityName": "Alltra Mainnet", + "lei": "", + "address": { + "street": "", + "addressLine1": "", + "addressLine2": "", + "city": "", + "stateProvinceId": null, + "countryId": null, + "postalCode": "" + }, + "contact": { + "mobileNo": "", + "emailAddress": "" + } + }, + { + "clientNumber": 9, + "accountNo": "000000009", + "entityName": "FIDIS", + "lei": "", + "address": { + "street": "", + "addressLine1": "", + "addressLine2": "", + "city": "", + "stateProvinceId": null, + "countryId": null, + "postalCode": "" + }, + "contact": { + "mobileNo": "", + "emailAddress": "" + } + }, + { + "clientNumber": 10, + "accountNo": "000000010", + "entityName": "Alpha Omega Holdings", + "lei": "", + "address": { + "street": "", + "addressLine1": "", + "addressLine2": "", + "city": "", + "stateProvinceId": null, + "countryId": null, + "postalCode": "" + }, + "contact": { + "mobileNo": "", + "emailAddress": "" + } + }, + { + "clientNumber": 11, + "accountNo": "000000011", + "entityName": "SGI Capital", + "lei": "", + "address": { + "street": "", + "addressLine1": "", + "addressLine2": "", + "city": "", + "stateProvinceId": null, + "countryId": null, + "postalCode": "" + }, + "contact": { + "mobileNo": "", + "emailAddress": "" + } + }, + { + "clientNumber": 12, + "accountNo": "000000012", + "entityName": "Titan Financial", + "lei": "", + "address": { + "street": "", + "addressLine1": "", + "addressLine2": "", + "city": "", + "stateProvinceId": null, + "countryId": null, + "postalCode": "" + }, + "contact": { + "mobileNo": "", + "emailAddress": "" + } + }, + { + "clientNumber": 13, + "accountNo": "000000013", + "entityName": "Roy Walker PLLC", + "lei": "", + "address": { + "street": "", + "addressLine1": "", + "addressLine2": "", + "city": "", + "stateProvinceId": null, + "countryId": null, + "postalCode": "" + }, + "contact": { + "mobileNo": "", + "emailAddress": "" + } + }, + { + "clientNumber": 14, + "accountNo": "000000014", + "entityName": "SGI Partners LLC", + "lei": "", + "address": { + "street": "", + "addressLine1": "", + "addressLine2": "", + "city": "", + "stateProvinceId": null, + "countryId": null, + "postalCode": "" + }, + "contact": { + "mobileNo": "", + "emailAddress": "" + } + }, + { + "clientNumber": 15, + "accountNo": "000000015", + "entityName": "Tsunami Holdings AG", + "lei": "", + "address": { + "street": "", + "addressLine1": "", + "addressLine2": "", + "city": "", + "stateProvinceId": null, + "countryId": null, + "postalCode": "" + }, + "contact": { + "mobileNo": "", + "emailAddress": "" + } + }, + { + "clientNumber": 16, + "accountNo": "000000016", + "entityName": "Anakatech", + "lei": "", + "address": { + "street": "", + "addressLine1": "", + "addressLine2": "", + "city": "", + "stateProvinceId": null, + "countryId": null, + "postalCode": "" + }, + "contact": { + "mobileNo": "", + "emailAddress": "" + } + }, + { + "clientNumber": 17, + "accountNo": "000000017", + "entityName": "Anema Camden Walker Global", + "lei": "", + "address": { + "street": "", + "addressLine1": "", + "addressLine2": "", + "city": "", + "stateProvinceId": null, + "countryId": null, + "postalCode": "" + }, + "contact": { + "mobileNo": "", + "emailAddress": "" + } + }, + { + "clientNumber": 18, + "accountNo": "000000018", + "entityName": "NEPAL RASTRA BANK", + "lei": "25490000MX377HHPSR96", + "address": { + "street": "Baluwatar, Kathmandu", + "addressLine1": "Baluwatar, Kathmandu", + "addressLine2": "", + "city": "Kathmandu", + "stateProvinceId": null, + "countryId": null, + "postalCode": "44616" + }, + "contact": { + "mobileNo": "", + "emailAddress": "" + } + }, + { + "clientNumber": 19, + "accountNo": "000000019", + "entityName": "SANIMA BANK LIMITED", + "lei": "25490043FER1B108XE95", + "address": { + "street": "Alkapuri, Naxal, Kathmandu", + "addressLine1": "Alkapuri, Naxal, Kathmandu", + "addressLine2": "", + "city": "Kathmandu", + "stateProvinceId": null, + "countryId": null, + "postalCode": "20394" + }, + "contact": { + "mobileNo": "", + "emailAddress": "" + } + }, + { + "clientNumber": 20, + "accountNo": "SAMAMA-AZ-1703722701", + "entityName": "Samama Group LLC - Azerbaijan", + "lei": "", + "address": { + "street": "Sabail District, Nizami, Home 1", + "addressLine1": "Sabail District, Nizami, Home 1", + "addressLine2": "", + "city": "Baku", + "stateProvinceId": null, + "countryId": null, + "postalCode": "AZ1001" + }, + "contact": { + "mobileNo": "", + "emailAddress": "" + } + } + ] +} diff --git a/docs/04-configuration/mifos-omnl-central-bank/OMNL_ENTITY_MASTER_DATA.md b/docs/04-configuration/mifos-omnl-central-bank/OMNL_ENTITY_MASTER_DATA.md new file mode 100644 index 0000000..4775774 --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OMNL_ENTITY_MASTER_DATA.md @@ -0,0 +1,110 @@ +# OMNL Entity Master Data — Names, LEI, Address, Contacts + +**Purpose:** Single source of truth for the 19 operating / external-facing entities. Used to populate either **Offices** (Organization / Manage Offices) or **Clients** (names, LEI, address, contacts). + +**Data file:** [OMNL_ENTITY_MASTER_DATA.json](OMNL_ENTITY_MASTER_DATA.json) + +**Using entities as Offices (recommended):** To model the 15 as offices instead of clients, see [OMNL_OFFICES_POPULATE.md](OMNL_OFFICES_POPULATE.md). Run `omnl-offices-populate-15.sh` then `omnl-clients-remove-15.sh`. + +--- + +## Entity list (reference) + +| # | Account No. | Entity name | +|---|-------------|-------------| +| 1 | 000000001 | OMNL Head Office (DBIS) – Central Bank | +| 2 | 000000002 | Shamrayan Enterprises | +| 3 | 000000003 | HYBX | +| 4 | 000000004 | TAJ Private Single Family Office | +| 5 | 000000005 | Aseret Mortgage Bank | +| 6 | 000000006 | Mann Li Family Offices | +| 7 | 000000007 | Sovereign Order of Malta OSJ | +| 8 | 000000008 | Alltra Mainnet | +| 9 | 000000009 | FIDIS | +| 10 | 000000010 | Alpha Omega Holdings | +| 11 | 000000011 | SGI Capital | +| 12 | 000000012 | Titan Financial | +| 13 | 000000013 | Roy Walker PLLC | +| 14 | 000000014 | SGI Partners LLC | +| 15 | 000000015 | Tsunami Holdings AG | +| 16 | 000000016 | Anakatech | +| 17 | 000000017 | Anema Camden Walker Global | +| 18 | 000000018 | NEPAL RASTRA BANK (Central Bank) | +| 19 | 000000019 | SANIMA BANK LIMITED | + +--- + +## Fields to complete per entity + +### 1. Entity name +- Already set in the JSON. +- Pushed to Fineract as client **firstname** (full name); **lastname** empty. + +### 2. LEI (Legal Entity Identifier) +- **Format:** 20-character alphanumeric (e.g. `5493001KJTIIGC8Y1R12`). +- **In Fineract:** Stored as a **Client Identifier** with document type **LEI** (or “Legal Entity Identifier”). The tenant must have a document/identifier type named LEI (or equivalent); the apply script uses the first matching type from `GET /clients/{clientId}/identifiers/template` (`allowedDocumentTypes`). +- **In JSON:** `"lei": "<20-char LEI>"`. Leave `""` if not yet assigned. + +### 3. Address +- **In Fineract:** Stored via **Client Addresses** API: `POST /client/{clientId}/addresses` (and optionally `PUT` to update). Fields: `street`, `addressLine1`, `addressLine2`, `addressLine3`, `city`, `stateProvinceId`, `countryId`, `postalCode`, `isActive`. `countryId` and optionally `stateProvinceId` are Fineract reference IDs (from `GET /codes` or the UI). +- **In JSON:** Under `address`: fill `street`, `addressLine1`, `addressLine2`, `city`, `postalCode`; set `countryId` (and `stateProvinceId` if applicable) when you have the Fineract code IDs. Use `null` or omit to skip address for that entity. + +### 4. Contacts +- **In Fineract:** Client-level **mobile** and **email** (e.g. `mobileNo`, `emailAddress`). May be updatable via `PUT /clients/{clientId}` if the server allows it; otherwise via UI or datatables. +- **In JSON:** Under `contact`: `"mobileNo": "+1234567890"`, `"emailAddress": "entity@example.com"`. Leave `""` if not yet known. + +--- + +## How to fill the JSON + +1. Open [OMNL_ENTITY_MASTER_DATA.json](OMNL_ENTITY_MASTER_DATA.json). +2. For each entity in `entities`: + - **LEI:** Set `lei` to the 20-character LEI when assigned; otherwise leave `""`. + - **Address:** Fill `address.street`, `addressLine1`, `addressLine2`, `city`, `postalCode`. For `countryId` (and `stateProvinceId`) you need the Fineract code IDs from the tenant (Admin → Code values / address config, or `GET /codes`). + - **Contact:** Fill `contact.mobileNo` and `contact.emailAddress` as appropriate; leave `""` if unknown. +3. Save the file. The apply script reads this file and updates Fineract (names, then LEI identifiers, addresses, then contact fields when supported). + +--- + +## Applying data to Fineract + +From repo root, with `omnl-fineract/.env` (or root `.env`) set: + +```bash +# Data file path (default: docs/04-configuration/mifos-omnl-central-bank/OMNL_ENTITY_MASTER_DATA.json) +ENTITY_DATA="docs/04-configuration/mifos-omnl-central-bank/OMNL_ENTITY_MASTER_DATA.json" + +# Dry run: show what would be updated +DRY_RUN=1 bash scripts/omnl/omnl-entity-data-apply.sh + +# Apply: names, then LEI (identifiers), addresses, contacts +bash scripts/omnl/omnl-entity-data-apply.sh +``` + +**Complete all clients (1–15) in one go:** If clients 9–15 do not exist yet, create them first, then apply entity data: + +```bash +bash scripts/omnl/omnl-clients-create-9-15.sh +bash scripts/omnl/omnl-entity-data-apply.sh +``` + +See [scripts/omnl/README.md](../../../scripts/omnl/README.md) for full script list. + +--- + +## Fineract API mapping summary + +| Master data | Fineract API | Notes | +|-------------|--------------|--------| +| Entity name | `PUT /clients/{clientId}` body `firstname`, `lastname` | One-line display name in UI | +| LEI | `POST /clients/{clientId}/identifiers` | `documentTypeId` = LEI type from template; `documentKey` = LEI value | +| Address | `POST /client/{clientId}/addresses` | Requires `countryId` (and optionally `stateProvinceId`) from tenant codes | +| Mobile / email | `PUT /clients/{clientId}` body `mobileNo`, `emailAddress` | If server accepts; else use UI | + +--- + +## References + +- [OMNL_CLIENT_NAMES_FIX.md](OMNL_CLIENT_NAMES_FIX.md) — Name-only fix and canonical names +- [FINERACT_API_REFERENCE.md](FINERACT_API_REFERENCE.md) — Auth, tenant, base URL +- OpenAPI: `docs/api/omnl-fineract-openapi.json` — `Client`, identifiers, addresses diff --git a/docs/04-configuration/mifos-omnl-central-bank/OMNL_GL_ACCOUNTS_FX_GRU.md b/docs/04-configuration/mifos-omnl-central-bank/OMNL_GL_ACCOUNTS_FX_GRU.md new file mode 100644 index 0000000..10a45c1 --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OMNL_GL_ACCOUNTS_FX_GRU.md @@ -0,0 +1,108 @@ +# OMNL — FX and GRU GL Accounts (Create Script & Manual Steps) + +**Purpose:** Create the FX (foreign exchange) and GRU (M00 base reserve) GL accounts from the [Chart of Accounts](CHART_OF_ACCOUNTS.md) in Fineract. Use the script for automation or follow the step-by-step list for manual creation. + +**Reference:** [CHART_OF_ACCOUNTS.md](CHART_OF_ACCOUNTS.md) · [FX_AND_VALUATION.md](FX_AND_VALUATION.md) + +--- + +## 1. Script (recommended) + +From repo root with `omnl-fineract/.env` set: + +```bash +bash scripts/omnl/omnl-gl-accounts-fx-gru-create.sh +``` + +- **Idempotent:** Skips any glCode that already exists. +- **Order:** Creates parents before children (headers then detail accounts). +- **Accounts created:** Assets 10000, 12000, 12010, 12020, 12090, 13000, 13010; Liabilities 20000, 21000, 21010; Income 40000, 42000, 42100; Expenses 50000, 51000, 52100. + +--- + +## 2. Step-by-step list (manual creation) + +Create accounts in this order so parents exist before children. Use **Organization → Chart of Accounts** in the UI, or `POST /v1/glaccounts` with the body below. + +**Fineract types:** 1 = ASSET, 2 = LIABILITY, 4 = INCOME, 5 = EXPENSE. +**Usage:** 1 = DETAIL (postable), 2 = HEADER (grouping only). + +### 2.1 Assets (FX reserves and settlement) + +| Step | glCode | Name | Type | Usage | Parent glCode | Description | +|------|--------|------|------|-------|---------------|--------------| +| 1 | 10000 | Assets (header) | 1 ASSET | HEADER (2) | — | Total assets | +| 2 | 12000 | Foreign currency reserves (header) | 1 ASSET | HEADER (2) | 10000 | FX reserves header | +| 3 | 12010 | FX reserves — USD | 1 ASSET | DETAIL (1) | 12000 | Foreign currency reserves — USD | +| 4 | 12020 | FX reserves — EUR | 1 ASSET | DETAIL (1) | 12000 | Foreign currency reserves — EUR | +| 5 | 12090 | FX reserves — other | 1 ASSET | DETAIL (1) | 12000 | Other ISO-4217 and special units | +| 6 | 13000 | FX settlement balances (header) | 1 ASSET | HEADER (2) | 10000 | FX settlement header | +| 7 | 13010 | FX settlement — nostro | 1 ASSET | DETAIL (1) | 13000 | Settlement balances with counterparties | + +### 2.2 Liabilities (GRU / M00) + +| Step | glCode | Name | Type | Usage | Parent glCode | Description | +|------|--------|------|------|-------|---------------|--------------| +| 8 | 20000 | Liabilities (header) | 2 LIABILITY | HEADER (2) | — | Total liabilities | +| 9 | 21000 | M00 — Base reserve (header) | 2 LIABILITY | HEADER (2) | 20000 | Central bank reserve unit; GRU-denominated | +| 10 | 21010 | M00 — Bank reserves (control) | 2 LIABILITY | DETAIL (1) | 21000 | Control account for M00 | + +### 2.3 Income (FX gains) + +| Step | glCode | Name | Type | Usage | Parent glCode | Description | +|------|--------|------|------|-------|---------------|--------------| +| 11 | 40000 | Income (header) | 4 INCOME | HEADER (2) | — | Total income | +| 12 | 42000 | FX gains (realized) | 4 INCOME | DETAIL (1) | 40000 | Realized foreign exchange gains | +| 13 | 42100 | Unrealized FX gain (P&L) | 4 INCOME | DETAIL (1) | 40000 | Unrealized FX gain (revaluation) | + +### 2.4 Expenses (FX losses) + +| Step | glCode | Name | Type | Usage | Parent glCode | Description | +|------|--------|------|------|-------|---------------|--------------| +| 14 | 50000 | Expenses (header) | 5 EXPENSE | HEADER (2) | — | Total expenses | +| 15 | 51000 | FX losses (realized) | 5 EXPENSE | DETAIL (1) | 50000 | Realized foreign exchange losses | +| 16 | 52100 | Unrealized FX loss (P&L) | 5 EXPENSE | DETAIL (1) | 50000 | Unrealized FX loss (revaluation) | + +--- + +## 3. API request body (per account) + +For each row above, `POST /v1/glaccounts` with a body like (replace placeholders): + +```json +{ + "glCode": "", + "name": "", + "type": , + "usage": <1=DETAIL, 2=HEADER>, + "parentId": , + "manualEntriesAllowed": true, + "description": "" +} +``` + +- Omit `parentId` for root headers (10000, 20000, 40000, 50000). +- For child accounts, run `GET /v1/glaccounts` and set `parentId` to the `id` of the parent’s glCode (e.g. parent 12000 → use 12000’s `id`). + +--- + +## 4. Verification + +After creation: + +```bash +curl -s -u "${OMNL_FINERACT_USER}:${OMNL_FINERACT_PASSWORD}" \ + -H "Fineract-Platform-TenantId: omnl" \ + "${OMNL_FINERACT_BASE_URL}/glaccounts" | jq '.[] | select(.glCode | test("^1[023]|^2[01]|^4[02]|^5[12]")) | {glCode, name, type: .type.value}' +``` + +Expect 10000, 12000, 12010, 12020, 12090, 13000, 13010, 20000, 21000, 21010, 40000, 42000, 42100, 50000, 51000, 52100. + +--- + +## 5. References + +- [CHART_OF_ACCOUNTS.md](CHART_OF_ACCOUNTS.md) — Full CoA (gold, M0, M1, equity, etc.) +- [FX_AND_VALUATION.md](FX_AND_VALUATION.md) — XAU triangulation, revaluation, 42100/52100 usage +- [OMNL_GL_ACCOUNTS_REQUIRED.md](OMNL_GL_ACCOUNTS_REQUIRED.md) — Migration GL (1000, 1050, 2000, 2100, 3000) +- [scripts/omnl/README.md](../../scripts/omnl/README.md) — Script list diff --git a/docs/04-configuration/mifos-omnl-central-bank/OMNL_GL_ACCOUNTS_REQUIRED.md b/docs/04-configuration/mifos-omnl-central-bank/OMNL_GL_ACCOUNTS_REQUIRED.md new file mode 100644 index 0000000..74f51ca --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OMNL_GL_ACCOUNTS_REQUIRED.md @@ -0,0 +1,106 @@ +# OMNL — Required GL Accounts and Office Usage + +**Purpose:** List all necessary GL accounts for the OMNL ledger and clarify how offices use them. In Fineract, **GL accounts are tenant-wide** (shared); every office posts journal entries to the same chart of accounts. + +--- + +## 1. Required GL accounts (migration and operations) + +These are the GL accounts needed for the [Migration & Ledger Allocation Memorandum](MIGRATION_AND_LEDGER_ALLOCATION_MEMORANDUM.md), matrix posting ([OMNL_JOURNAL_LEDGER_MATRIX.md](OMNL_JOURNAL_LEDGER_MATRIX.md)), and runbook ([LEDGER_ALLOCATION_POSTING_RUNBOOK.md](LEDGER_ALLOCATION_POSTING_RUNBOOK.md)). + +| glCode | Name | Fineract type | Usage | Purpose | +|--------|------|----------------|-------|---------| +| **1000** | USD Settlement / Reserve Assets | 1 (ASSET) | DETAIL | USD settlement & reserve assets; opening balance (T-001 debit) | +| **1050** | USD Treasury Conversion Reserve (M0) | 1 (ASSET) | DETAIL | Treasury Conversion Reserve; backs M1 capacity at 1:5 (T-001B debit) | +| **2000** | USD Central Deposits **(M0)** | 2 (LIABILITY) | DETAIL | **M0** — Monetary base; T-001 credit; reduced by T-001B and T-001C (M0→M1 conversion) | +| **2100** | USD Liabilities **(M1)** | 2 (LIABILITY) | DETAIL | **M1** — Narrow money; T-001C credit at HO; offices 2–8 receive only 2100 (M1) in Phase C | +| **3000** | Opening Balance Control | 3 (EQUITY) | DETAIL | Migration control account (optional in posting) | +| **1410** | Due From Head Office (Interoffice Receivable) | 1 (ASSET) | DETAIL | For Phase C interoffice (Due-To/Due-From); branch receivable | +| **2410** | Due To Offices (Interoffice Payable) | 2 (LIABILITY) | DETAIL | For Phase C interoffice; Head Office payable to branches | + +**Optional in current matrix:** 3000 is referenced in the full CoA; the posted entries use 1000, 1050, 2000, 2100. If your instance uses **3100** for Opening Balance Control, that is consistent with [CHART_OF_ACCOUNTS.md](CHART_OF_ACCOUNTS.md); keep 3000 or 3100 as configured. + +--- + +## 2. Instance alignment (OMNL Hybx) + +After ensuring 1050 exists, the instance should have at least: + +| glCode | Required | Notes | +|--------|----------|--------| +| 1000 | Yes | Reserve / settlement assets | +| 1050 | Yes | Treasury Conversion Reserve (M0) — create if missing | +| 2000 | Yes | Central deposits | +| 2100 | Yes | Central or restricted liabilities (matrix credits 2100 for restricted) | +| 2200 | Optional | Some instances use 2200 for “M1 Restricted”; matrix uses 2100 | +| 3000 / 3100 | Optional | Control / equity; 3000 or 3100 per your CoA | + +**Create missing accounts:** Run from repo root: + +```bash +bash scripts/omnl/omnl-gl-accounts-create.sh +``` + +That script creates 1000, 1050, 2000, 2100, 3000 (idempotent). If the instance already uses 3100 for Opening Balance Control, you can keep both 3000 and 3100. + +--- + +## 3. Each office and GL accounts + +**In Fineract there are no per-office GL accounts.** The chart of accounts is **shared across the tenant**. Every office (Head Office and entities 2–17) posts journal entries using the **same** GL account IDs (same glCodes). + +So: + +- **Each office “has” all required GL accounts** in the sense that they can use them when posting: every office may post debits/credits to 1000, 1050, 2000, 2100 (and 3000/3100 if used). +- **No office-specific GL accounts** need to be created; no “2002”, “2003” per office unless you explicitly design a per-entity CoA (not required for the current matrix). + +**Office list (for reference):** 1 = Head Office; 2–17 = Shamrayan, HYBX, TAJ, Aseret, Mann Li, OSJ, Alltra, FIDIS, Alpha Omega, SGI Capital, Titan, Roy Walker, SGI Partners, Tsunami, Anakatech, Anema Camden Walker Global. All use the same GL. + +--- + +## 4. Updating offices (if needed) + +Offices are managed via **Organization / Manage Offices** (API: `GET/PUT/POST /offices`). To ensure each office is correct: + +- **Names** — Match [OMNL_ENTITY_MASTER_DATA.json](OMNL_ENTITY_MASTER_DATA.json); run `omnl-offices-populate-15.sh` (or equivalent for 17 entities) to sync names and create missing offices. +- **Opening date** — Set per office if required for reporting; API supports opening date on office. +- **Parent** — Head Office (1) is root; offices 2–17 have `parentId=1`. + +No GL-specific office updates are required; GL is tenant-wide. + +--- + +## 5. Verification + +From repo root with `omnl-fineract/.env` loaded: + +```bash +# List GL accounts (expect 1000, 1050, 2000, 2100, and optionally 3000/3100) +curl -s -u "${OMNL_FINERACT_USER}:${OMNL_FINERACT_PASSWORD}" \ + -H "Fineract-Platform-TenantId: omnl" \ + "${OMNL_FINERACT_BASE_URL}/glaccounts" | jq '.[] | {glCode, id, name}' + +# List offices (expect 1–17) +curl -s -u "${OMNL_FINERACT_USER}:${OMNL_FINERACT_PASSWORD}" \ + -H "Fineract-Platform-TenantId: omnl" \ + "${OMNL_FINERACT_BASE_URL}/offices" | jq '.[] | {id, name}' +``` + +--- + +## 6. FX and GRU (full CoA) + +For FX reserves (12xxx, 13xxx), GRU/M00 (21xxx), and FX gain/loss (42xxx, 52xxx), use: + +- **Script:** `bash scripts/omnl/omnl-gl-accounts-fx-gru-create.sh` +- **Doc:** [OMNL_GL_ACCOUNTS_FX_GRU.md](OMNL_GL_ACCOUNTS_FX_GRU.md) (script + step-by-step manual list) + +--- + +## 7. References + +- [LEDGER_ALLOCATION_GL_MAPPING.md](LEDGER_ALLOCATION_GL_MAPPING.md) — GL mapping and memo +- [OMNL_JOURNAL_LEDGER_MATRIX.md](OMNL_JOURNAL_LEDGER_MATRIX.md) — Journal matrix and IPSAS +- [omnl-gl-accounts-create.sh](../../scripts/omnl/omnl-gl-accounts-create.sh) — Create 1000, 1050, 2000, 2100, 3000 +- [OMNL_GL_ACCOUNTS_FX_GRU.md](OMNL_GL_ACCOUNTS_FX_GRU.md) — FX and GRU GL creation (script + manual steps) +- [OMNL_ENTITY_MASTER_DATA.json](OMNL_ENTITY_MASTER_DATA.json) — Office/entity names diff --git a/docs/04-configuration/mifos-omnl-central-bank/OMNL_JOURNAL_LEDGER_MATRIX.md b/docs/04-configuration/mifos-omnl-central-bank/OMNL_JOURNAL_LEDGER_MATRIX.md new file mode 100644 index 0000000..4004e47 --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OMNL_JOURNAL_LEDGER_MATRIX.md @@ -0,0 +1,135 @@ +# OMNL Journal / Ledger Matrix — Full GL & IPSAS Compliance + +**Purpose:** Single reference for the OMNL Hybx (Fineract) journal and ledger structure: **matrix** of journal entries for Head Office and all operating entities (offices 1–17), **full GL** mapping, and **IPSAS** (International Public Sector Accounting Standards) alignment. All entries are postable via the Fineract API to [omnl.hybxfinance.io](https://omnl.hybxfinance.io/). + +**Target:** OMNL tenant `omnl`; API base `https://omnl.hybxfinance.io/fineract-provider/api/v1`. Credentials in `omnl-fineract/.env` (see [OMNL_FINERACT_CONFIGURATION.md](../OMNL_FINERACT_CONFIGURATION.md)). + +--- + +## 1. Office / Entity mapping (Organization) + +| officeId | Entity (Office name) | Role in ledger | +|----------|------------------------|-----------------| +| 1 | OMNL Head Office (DBIS) – Central Bank | Central bank; holds settlement reserves (1000), conversion reserve (1050), central deposits (2000), restricted (2100) | +| 2 | Shamrayan Enterprises | Allocatee (M1 available + restricted) | +| 3 | HYBX | Allocatee (capitalization escrow) | +| 4 | TAJ Private Single Family Office | Allocatee | +| 5 | Aseret Mortgage Bank | Allocatee | +| 6 | Mann Li Family Offices | Allocatee | +| 7 | Sovereign Order of Malta OSJ | Allocatee | +| 8 | Alltra Mainnet | Allocatee | +| 9–17 | FIDIS, Alpha Omega Holdings, …, Anakatech, Anema Camden Walker Global | Optional future allocations; same GL structure | + +--- + +## 2. Full GL structure (IPSAS-aligned) + +### 2.1 Migration / operational GL (in use for matrix) + +| glCode | Name | Fineract type | Usage | IPSAS / purpose | +|--------|------|----------------|-------|------------------| +| 1000 | USD Settlement & Reserve Assets | 1 (ASSET) | DETAIL | Cash and cash equivalents (IPSAS 2); settlement balances | +| 1050 | USD Treasury Conversion Reserve (M0) | 1 (ASSET) | DETAIL | Reserve backing M1 capacity; financial asset (IPSAS 28/29) | +| 2000 | USD Central Deposits (M1) | 2 (LIABILITY) | DETAIL | Demand deposits; financial liability (IPSAS 28/29) | +| 2100 | USD Restricted Liabilities | 2 (LIABILITY) | DETAIL | Restricted/escrow; financial liability | +| 3000 | Opening Balance Control | 3 (EQUITY) | DETAIL | Migration control; equity (IPSAS 1) | + +### 2.2 Extended CoA (full central bank — reference) + +The full OMNL Chart of Accounts (M00/M0/M1, reserves, FX, income/expense) is in [CHART_OF_ACCOUNTS.md](CHART_OF_ACCOUNTS.md). Summary: + +- **1xxxx** ASSETS (11xxx gold/commodity, 12xxx FX reserves, 13xxx settlement) +- **2xxxx** LIABILITIES (21xxx M00, 22xxx M0, 23xxx M1) +- **3xxxx** EQUITY (31xxx sovereign capital, 32xxx revaluation) +- **4xxxx** INCOME (41xxx seigniorage, 42xxx FX gains) +- **5xxxx** EXPENSES (51xxx FX losses, 52xxx monetary ops) + +Migration accounts 1000, 1050, 2000, 2100, 3000 map into this structure for opening balance and allocation; expand to 13xxx/23xxx etc. when consolidating to full IPSAS reporting. + +--- + +## 3. IPSAS compliance mapping + +| IPSAS | Topic | OMNL application | +|-------|--------|-------------------| +| IPSAS 1 | Presentation of Financial Statements | Structure of FS (assets, liabilities, equity, income, expense); segment reporting by office/entity | +| IPSAS 2 | Cash Flow Statements | 1000/1050/2000/2100 support cash and cash-equivalent classification | +| IPSAS 3 | Accounting Policies, Changes, Errors | Documented in [MIGRATION_AND_LEDGER_ALLOCATION_MEMORANDUM.md](MIGRATION_AND_LEDGER_ALLOCATION_MEMORANDUM.md) and this matrix | +| IPSAS 9 | Revenue from Exchange Transactions | Revenue (4xxxx) separated; allocation entries are internal transfers, not revenue | +| IPSAS 23 | Revenue from Non-Exchange Transactions | Non-exchange flows (e.g. grants) if any; narrative in journal | +| IPSAS 28 | Financial Instruments: Presentation | 1000, 1050, 2000, 2100 as financial assets/liabilities; classified and disclosed | +| IPSAS 29 | Financial Instruments: Recognition & Measurement | Amortized cost for deposits/reserves; fair value if applicable and disclosed | +| IPSAS 41 | Financial Reporting Under the Cash Basis | Cash basis option; OMNL uses accrual (double-entry) | +| IPSAS 42 | Social Benefits | N/A for central bank monetary operations | + +--- + +## 4. Journal entry matrix (Head Office + entities) + +All entries are posted with **officeId = 1** (Head Office) in the current Fineract model; narrative and memo identify the entity. Amounts in USD. Post in order. + +| # | Memo | Debit glCode | Credit glCode | Amount (USD) | Narrative / entity | IPSAS note | +|---|------|--------------|---------------|--------------|-------------------|------------| +| 1 | T-001 | 1000 | 2000 | 900,000,000,000 | Opening Balance Migration (Head Office) | IPSAS 3, 28 | +| 2 | T-001B | 1050 | 2000 | 250,000,000,000 | Treasury Conversion — Transfer to Reserve (M0); Head Office | IPSAS 28, 29 | +| 3 | T-002A | 2000 | 2000 | 2,900,000,000 | Shamrayan Available (M1) — Office 2 | IPSAS 28 | +| 4 | T-002B | 2000 | 2100 | 2,100,000,000 | Shamrayan Restricted — Office 2 | IPSAS 28 | +| 5 | T-003 | 2000 | 2100 | 350,000,000,000 | HYBX Capitalization Escrow — Office 3 | IPSAS 28 | +| 6 | T-004 | 2000 | 2000 | 5,000,000,000 | TAJ Allocation (M1) — Office 4 | IPSAS 28 | +| 7 | T-005 | 2000 | 2000 | 5,000,000,000 | Aseret Allocation (M1) — Office 5 | IPSAS 28 | +| 8 | T-006 | 2000 | 2000 | 5,000,000,000 | Mann Li Allocation (M1) — Office 6 | IPSAS 28 | +| 9 | T-007 | 2000 | 2000 | 50,000,000,000 | OSJ Allocation (M1) — Office 7 | IPSAS 28 | +| 10 | T-008 | 2000 | 2000 | 50,000,000,000 | Alltra Allocation (M1) — Office 8 | IPSAS 28 | + +**Note:** For per-entity/segment reporting, Fineract journal entries use a single `officeId` per entry. Entity is identified in `comments`/narrative. If the tenant is extended to per-office GL (e.g. 2002, 2003, …), the matrix can be updated to debit/credit those accounts and post with the corresponding `officeId`. + +--- + +## 5. API usage (OMNL Hybx) + +- **Create GL accounts:** `POST /glaccounts` — ensure 1000, 1050, 2000, 2100, 3000 exist ([omnl-gl-accounts-create.sh](../../scripts/omnl/omnl-gl-accounts-create.sh)). +- **Resolve GL IDs:** `GET /glaccounts` — map glCode → id for each journal line. +- **Post journal entries:** `POST /journalentries` — body: `officeId`, `transactionDate`, `dateFormat`, `locale`, `currencyCode`, `comments`, `debits[]`, `credits[]` (each with `glAccountId`, `amount`). + +**Scripts:** + +- **From runbook (fixed list):** [omnl-ledger-post.sh](../../scripts/omnl/omnl-ledger-post.sh) — posts T-001 through T-008 per [LEDGER_ALLOCATION_POSTING_RUNBOOK.md](LEDGER_ALLOCATION_POSTING_RUNBOOK.md). +- **From matrix JSON:** [omnl-ledger-post-from-matrix.sh](../../scripts/omnl/omnl-ledger-post-from-matrix.sh) — reads [omnl-journal-matrix.json](omnl-journal-matrix.json), resolves glCode → id, posts in order. + +**Environment:** `omnl-fineract/.env`: `OMNL_FINERACT_BASE_URL`, `OMNL_FINERACT_PASSWORD`. Optional: `TRANSACTION_DATE=yyyy-MM-dd`, `OFFICE_ID=1`, `DRY_RUN=1`. + +--- + +## 6. Reconciliation (matrix totals) + +| GL (glCode) | Expected balance (USD) after all entries | Notes | +|-------------|------------------------------------------|--------| +| 1000 | 900,000,000,000 | Debit (T-001) | +| 1050 | 250,000,000,000 | Debit (T-001B) | +| 2000 | 780,000,000,000 | Credit: 900B+250B − 470B allocations; net liability | +| 2100 | 352,100,000,000 | Credit: 2.1B + 350B (Shamrayan restricted + HYBX escrow) | + +--- + +## 7. Next steps (complete flow) + +| Step | Action | Script / doc | +|------|--------|---------------| +| 1 | **Create GL accounts** (1000, 1050, 2000, 2100, 3000, and for Phase C interoffice 1410, 2410) if not present | `bash scripts/omnl/omnl-gl-accounts-create.sh` | +| 2 | **Verify** offices and GL: `GET /offices`, `GET /glaccounts` | [LEDGER_ALLOCATION_POSTING_RUNBOOK.md](LEDGER_ALLOCATION_POSTING_RUNBOOK.md) pre-posting checklist | +| 3 | **Post journal entries** from matrix (or runbook list). For **Phase C interoffice** use [omnl-journal-matrix-phase-c-interoffice.json](omnl-journal-matrix-phase-c-interoffice.json) (see [OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md](OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md)) | `DRY_RUN=1 bash scripts/omnl/omnl-ledger-post-from-matrix.sh` then run without DRY_RUN | +| 4 | **Reconcile** trial balance / GL report per runbook | [LEDGER_ALLOCATION_POSTING_RUNBOOK.md](LEDGER_ALLOCATION_POSTING_RUNBOOK.md) § Post-posting reconciliation | +| 5 | **Sign-off and audit** — attach memo, runbook, matrix to audit trail | [LEDGER_ALLOCATION_POSTING_RUNBOOK.md](LEDGER_ALLOCATION_POSTING_RUNBOOK.md) § Sign-off and audit | + +**Optional:** Use `omnl-ledger-post.sh` (fixed T-001–T-008 list) instead of the matrix script if you prefer not to use the JSON file. + +--- + +## 8. References + +- [MIGRATION_AND_LEDGER_ALLOCATION_MEMORANDUM.md](MIGRATION_AND_LEDGER_ALLOCATION_MEMORANDUM.md) — Authoritative migration memo +- [LEDGER_ALLOCATION_GL_MAPPING.md](LEDGER_ALLOCATION_GL_MAPPING.md) — GL mapping and implementation +- [LEDGER_ALLOCATION_POSTING_RUNBOOK.md](LEDGER_ALLOCATION_POSTING_RUNBOOK.md) — Posting runbook +- [CHART_OF_ACCOUNTS.md](CHART_OF_ACCOUNTS.md) — Full OMNL CoA (1xxxx–5xxxx) +- [OMNL_ENTITY_MASTER_DATA.json](OMNL_ENTITY_MASTER_DATA.json) — Office/entity list (1–17) +- Swagger UI: [omnl.hybxfinance.io/fineract-provider/swagger-ui](https://omnl.hybxfinance.io/fineract-provider/swagger-ui/index.html) diff --git a/docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICES_POPULATE.md b/docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICES_POPULATE.md new file mode 100644 index 0000000..811fff9 --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICES_POPULATE.md @@ -0,0 +1,72 @@ +# OMNL — Populate Entities as Offices (Remove as Clients) + +**Purpose:** Use the operating entities from master data as **Offices** (Organization / Manage Offices) instead of Clients. This updates the head office name and creates child offices 2–19 (from entity data), then removes the corresponding client records. + +**API:** Fineract **Offices** API (`GET/PUT/POST /offices`); **Clients** API (`DELETE /clients/{id}`). + +--- + +## Entity list (same as master data) + +| # | Entity name | As office | +|---|-------------|-----------| +| 1 | OMNL Head Office (DBIS) – Central Bank | Office 1 (updated name) | +| 2 | Shamrayan Enterprises | New office, parent=1 | +| 3 | HYBX | New office, parent=1 | +| … | … | … | +| 15 | Tsunami Holdings AG | New office, parent=1 | +| 16 | Anakatech | New office, parent=1 | +| 17 | Anema Camden Walker Global | New office, parent=1 | +| 18 | NEPAL RASTRA BANK (Central Bank) | New office, parent=1 | +| 19 | SANIMA BANK LIMITED | New office, parent=1 | + +Office 1 already exists (Head Office). It is **renamed** to entity 1. Offices 2, 3, … are **created** with `parentId=1` and `externalId=OMNL-2`, `OMNL-3`, … (one per entity in master data with clientNumber ≥ 2). + +--- + +## Steps + +### 1. Populate entities as offices + +From repo root with `omnl-fineract/.env` set: + +```bash +# Preview +DRY_RUN=1 bash scripts/omnl/omnl-offices-populate-15.sh + +# Run: update office 1 name, create offices 2–19 (from entity data) +bash scripts/omnl/omnl-offices-populate-15.sh +``` + +- **ENTITY_DATA:** Path to [OMNL_ENTITY_MASTER_DATA.json](OMNL_ENTITY_MASTER_DATA.json) (default). +- **OPENING_DATE:** `yyyy-MM-dd` for new offices (default `2026-01-01`). + +Idempotent: offices already present (by externalId) are skipped. + +### 2. Remove the 15 clients + +After the offices are in place, delete the 15 client records: + +```bash +# Preview +DRY_RUN=1 bash scripts/omnl/omnl-clients-remove-15.sh + +# Run (requires confirmation) +CONFIRM_REMOVE=1 bash scripts/omnl/omnl-clients-remove-15.sh +``` + +Deletes client ids 1–15 (in reverse order). If any client has linked data (e.g. accounts), the API may reject the delete; resolve those first in the UI or API. + +--- + +## Result + +- **Organization / Manage Offices:** 19 offices: “OMNL Head Office (DBIS) – Central Bank” (id=1) plus Shamrayan Enterprises, HYBX, … NEPAL RASTRA BANK, SANIMA BANK LIMITED (ids 2–19), all under office 1. +- **Clients:** The former entity clients are removed; new clients can be created and assigned to any of these offices. + +--- + +## References + +- [OMNL_ENTITY_MASTER_DATA.json](OMNL_ENTITY_MASTER_DATA.json) — Source of entity names +- [scripts/omnl/README.md](../../../scripts/omnl/README.md) — Script list and usage diff --git a/docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICE_2_ACCESS_SECURITY_TEST.md b/docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICE_2_ACCESS_SECURITY_TEST.md new file mode 100644 index 0000000..e0de0e2 --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICE_2_ACCESS_SECURITY_TEST.md @@ -0,0 +1,138 @@ +# OMNL-2 Access Security Test — Collateral Attacks and Data Isolation + +**Purpose:** Verify that the office OMNL-2 (Office 2, Shamrayan) user **cannot** gain access to anything beyond Office 2 data—including no shell access, no arbitrary file read (e.g. `cat` or directory listing), and no exposure of “secret sauce” (config, .env, other offices’ data). + +**Principle:** Nothing more than the data for office OMNL-2 may be exposed. Access must not be abusable for collateral attacks. + +--- + +## 1. Attack surface + +| Vector | What the office-2 user has | What they must NOT get | +|--------|---------------------------|-------------------------| +| **Fineract API** | HTTP Basic auth to `omnl.hybxfinance.io` (REST) | Other offices’ data; shell execution; filesystem read | +| **Mifos UI** | Web login to same instance | Other offices in dropdowns/reports; dev tools / network revealing other offices | +| **SSH / server** | Only if explicitly granted (separate from Mifos) | Shell on app host; read of `.env`, app config, or repo | + +The Fineract application itself does **not** grant OS shell or filesystem access to API users. The tests below check that the API and UI do not leak other offices’ data and that no parameter allows path traversal, command injection, or SSRF that could expose files or run commands. + +--- + +## 2. Data isolation (API) + +**Objective:** With office-2 user credentials, the user must not see or access data for other offices (e.g. 1, 20, 21). + +| Test | Action | Expected | +|------|--------|----------| +| 2.1 | `GET /offices` as office-2 user | Only office 2 (and parent if applicable); **no** full list of all offices (e.g. no 20, 21). | +| 2.2 | `GET /offices/1` or `GET /offices/20` (if IDs exist) as office-2 user | 403 Forbidden or 404, or only office 2 in response. | +| 2.3 | `GET /clients?officeId=1` or `officeId=20` as office-2 user | 403 or empty/filtered so only office-2 clients (if any) when querying within allowed scope. | +| 2.4 | `GET /journalentries?officeId=1` or `officeId=20` as office-2 user | 403 or empty/filtered; no journal entries for other offices. | +| 2.5 | `GET /glaccounts` as office-2 user | If allowed, only for reporting; must not return data that reveals other offices’ balances (e.g. by officeId) beyond what’s allowed for office 2. | + +Run with the office-2 user’s Basic auth (e.g. `shamrayan.admin` / password). See **Section 5** for a script. + +--- + +## 3. Path traversal and local file read + +**Objective:** No API parameter must allow reading arbitrary files (e.g. `cat /etc/passwd` or `../../.env`). + +| Test | Action | Expected | +|------|--------|----------| +| 3.1 | Any endpoint that accepts a **file path**, **template name**, or **report path** (e.g. report export, document template): send `../../../etc/passwd` or `file:///etc/passwd` (if URL is accepted). | 400 Bad Request or 404; **no** content of `/etc/passwd` or any server file in the response body. | +| 3.2 | Try path-like values in query or body: `template=../../.env`, `file=....//....//....//etc/passwd`. | Same: no file content in response. | + +Fineract’s standard REST endpoints (offices, clients, journalentries, glaccounts) do not take arbitrary file paths; if your instance exposes custom or report endpoints that do, test those specifically. + +--- + +## 4. Command injection (no `cat`, bash, or OS commands) + +**Objective:** No API parameter must be executed as an OS command (e.g. bash, `cat`, `id`). + +| Test | Action | Expected | +|------|--------|----------| +| 4.1 | In **comments**, **narrative**, **reference**, or **name** fields (e.g. journal entry, client name): send `; cat /etc/passwd`, `$(cat /etc/passwd)`, `` `id` ``, `| cat /etc/passwd`. | Value stored or reflected as **literal text**; **no** output of `cat` or `id` in response or anywhere else. | +| 4.2 | Same in query parameters (e.g. `comments=;id`). | Treated as literal; no command execution. | + +If any response body or later API response contains `/etc/passwd` contents or `uid=` output, treat as **critical** and fix. + +--- + +## 5. SSRF (no internal or file URL fetch) + +**Objective:** No endpoint that takes a URL may fetch internal resources or `file://` from the server. + +| Test | Action | Expected | +|------|--------|----------| +| 5.1 | If any endpoint accepts a URL (e.g. webhook, callback, document URL): send `file:///etc/passwd` or `http://169.254.169.254/` (metadata). | 400 or no fetch of that URL; response must not contain contents of that resource. | + +--- + +## 6. Shell and filesystem (clarification) + +- **Fineract/Mifos API:** Does not provide shell or direct filesystem access. The only way to “run `cat`” or “see files in directories” via the **application** would be a bug (e.g. path traversal, RCE, or SSRF). The tests above are designed to catch such issues. +- **SSH to a host:** If the same person (office-2 operator) is granted **SSH** to a server (e.g. for running scripts), that is a **separate** access path. Then: + - **Do not** use the same credentials as Fineract; use a dedicated OS user. + - Use a **restricted shell** or **allowed commands only** so they cannot run arbitrary `cat`, `ls`, or access app directories. + - Ensure the user **cannot** read: `.env`, `omnl-fineract/.env`, app config with credentials, or any directory that holds other offices’ exports or “secret sauce.” + - Prefer a **jump host** or **restricted VM** that only has the minimum needed (e.g. run one script) and no access to the Fineract server’s filesystem. + +--- + +## 7. Executable test script (API tests) + +From repo root, with **office-2** credentials set (do **not** use the global `app.omnl` admin): + +```bash +# Option A: use OMNL-2–specific dotenv (omnl-fineract/.env.office2) +set -a && source omnl-fineract/.env.office2 && set +a +bash scripts/omnl/omnl-office2-access-security-test.sh + +# Option B: set variables manually +export OMNL_OFFICE2_TEST_USER="shamrayan_admin" +export OMNL_OFFICE2_TEST_PASSWORD="" +export OMNL_FINERACT_BASE_URL="https://omnl.hybxfinance.io/fineract-provider/api/v1" +export OMNL_FINERACT_TENANT="omnl" +bash scripts/omnl/omnl-office2-access-security-test.sh +``` + +The script will: + +- **[1]** `GET /offices` — **Fail** if office 2 is not in the response. If other offices (e.g. 20, 21) are listed, **warn** only unless `STRICT_OFFICE_LIST=1`. +- **[2]** `GET /offices/20` — **Fail** only in strict mode (`STRICT_OFFICE_LIST=1`) if 200 with office 20 data. +- **[3]** `GET /clients?officeId=20` — **Fail** if 200 with any clients (office-2 user must not see other offices’ clients). +- **[4]** Command injection — **Fail** if response contains actual file/command output (e.g. `root:...:0:0:`, `uid=...gid=`). +- **[5]** Path traversal — **Fail** if response contains `/etc/passwd`-style line content. + +To enforce strict office list (fail when other offices are visible or when `GET /offices/20` returns 200): + +```bash +export STRICT_OFFICE_LIST=1 +bash scripts/omnl/omnl-office2-access-security-test.sh +``` + +See `scripts/omnl/omnl-office2-access-security-test.sh` for the exact checks and exit codes. + +--- + +## 8. Checklist summary + +| # | Check | Pass criteria | +|---|--------|----------------| +| 1 | Data isolation (API) | Office-2 user sees only office 2 (and allowed parent); no other offices’ clients/JEs. | +| 2 | Path traversal | No parameter returns server file content (e.g. `/etc/passwd`, `.env`). | +| 3 | Command injection | No parameter executes OS commands; payloads appear as literal text. | +| 4 | SSRF | No URL parameter fetches `file://` or internal endpoints. | +| 5 | Shell/filesystem | No shell or directory access via Fineract; if SSH is granted, it is restricted and cannot read secret sauce. | + +Run the script and the manual UI checks from [OMNL_OFFICE_LOGINS_AND_CREDENTIALS.md](OMNL_OFFICE_LOGINS_AND_CREDENTIALS.md#verification-only-omnl-2-data-exposed) at least once before treating OMNL-2 access as production-ready. + +--- + +## References + +- [OMNL_OFFICE_LOGINS_AND_CREDENTIALS.md](OMNL_OFFICE_LOGINS_AND_CREDENTIALS.md) — Data isolation requirement and verification +- [OMNL_FINERACT_CONFIGURATION.md](../OMNL_FINERACT_CONFIGURATION.md) — Base URL, tenant, auth +- Fineract Swagger: [omnl.hybxfinance.io/fineract-provider/swagger-ui](https://omnl.hybxfinance.io/fineract-provider/swagger-ui/index.html) diff --git a/docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICE_ADDRESS_BOOK.md b/docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICE_ADDRESS_BOOK.md new file mode 100644 index 0000000..8a8c0b0 --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICE_ADDRESS_BOOK.md @@ -0,0 +1,56 @@ +# OMNL Office Address Book + +**Purpose:** Per-office identity, API Banking Rail instructions (endpoint, auth, **secrets reference** only — no secrets in repo), and pointer to Master Runbook and sub-runbooks. See [OMNL_OFFICE_MASTER_RUNBOOK_INDEX.md](OMNL_OFFICE_MASTER_RUNBOOK_INDEX.md) for Master vs sub-runbooks by office. + +**Secrets:** Store credentials in vault. This doc references vault path only; do not commit tokens or keys. + +--- + +## Office 1 — Head Office + +- **officeId:** 1 | **Entity:** OMNL Head Office (DBIS) – Central Bank +- **Master Runbook:** [OPERATING_RAILS.md](OPERATING_RAILS.md) | **Sub:** [LEDGER_ALLOCATION_POSTING_RUNBOOK.md](LEDGER_ALLOCATION_POSTING_RUNBOOK.md) +- **Banking Rail:** N/A (HO is originator) + +--- + +## Office 2 — Shamrayan Enterprises + +- **officeId:** 2 | **Entity:** Shamrayan Enterprises +- **Master Runbook:** [OFFICE_2_SHAMRAYAN_RUNBOOK.md](OFFICE_2_SHAMRAYAN_RUNBOOK.md) | **Sub:** [OFFICE_2_READINESS_CONFIRMATION.md](OFFICE_2_READINESS_CONFIRMATION.md); P2P API send in runbook +- **Banking Rail:** `https://banktransfer.devmindgroup.com` (POST `/api/bank-servers`, `/api/bank-accounts`, `/api/transactions`) | Auth: Bearer + API key | **Secrets:** Vault `omnl/offices/2/p2p` (Bearer token, API key) | Idempotency: `SHAMRAYAN-2--SET-` | Channel: Instant Server Settlement | Receiver: DFCUUGKA / 02650010158937 (see runbook) + +--- + +## Office 20 — Samama Group LLC (Azerbaijan) + +- **officeId:** 20 | **Entity:** Samama Group LLC - Azerbaijan | **externalId:** SAMAMA-AZ-1703722701 +- **Master Runbook:** [SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md](SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md) + [TRANCHE_1_500M_RUNBOOK.md](TRANCHE_1_500M_RUNBOOK.md) | **Sub:** OFFICE_20_AUDIT_PACKET, DR, Fire Drill +- **Banking Rail:** Artifact upload `https://upload.siemb-samama.com/` | **Secrets:** Vault `omnl/offices/20/upload` | P2P settlement TBD + +--- + +## Office 21 — Crunchygalaxy Unip. Lda. (Portugal) + +- **officeId:** 21 | **Entity:** Crunchygalaxy Unip Lda - Portugal | **externalId:** CRUNCHYGALAXY-515159573 +- **Master Runbook:** [CRUNCHYGALAXY_OFFICE_AND_1B_FUNDING.md](CRUNCHYGALAXY_OFFICE_AND_1B_FUNDING.md) | **Sub:** [P2P_SETTLEMENT_CRUNCHYGALAXY_RAIL.md](P2P_SETTLEMENT_CRUNCHYGALAXY_RAIL.md) +- **Banking Rail:** Settlement endpoint TBD | Auth TBD | **Secrets:** Vault `omnl/offices/21/p2p` | Idempotency: `CRUNCHY-21--SET-` | Mirror ref: `CRUNCHY-21--SETTLED-` + +--- + +## Other offices (3–19) + +Add a row when an office gets a Banking Rail endpoint or Master Runbook: officeId, Entity, Master Runbook, Sub-runbooks, Banking Rail (endpoint, auth, **vault path only**). + +--- + +## Summary + +| officeId | Entity | Master Runbook | Secrets (vault path) | +|----------|--------|----------------|----------------------| +| 1 | Head Office | OPERATING_RAILS | N/A | +| 2 | Shamrayan | OFFICE_2_SHAMRAYAN_RUNBOOK | offices/2/p2p | +| 20 | Samama | SAMAMA + TRANCHE_1_500M | offices/20/upload | +| 21 | Crunchygalaxy | CRUNCHYGALAXY_OFFICE_AND_1B_FUNDING | offices/21/p2p | + +Credentials live only in vault; this address book holds instructions and vault references. diff --git a/docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICE_BALANCES.md b/docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICE_BALANCES.md new file mode 100644 index 0000000..39fd55a --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICE_BALANCES.md @@ -0,0 +1,193 @@ +# OMNL — Balances by Office + +**Purpose:** GL balances per office after Phase A+B and Phase C interoffice posting. All amounts in **USD**. Debit (Dr) = asset increase / liability decrease; Credit (Cr) = liability increase / asset decrease. **Transaction date of postings:** 2026-02-23. + +**GL classification:** **2000 = M0** (monetary base / central deposits). **2100 = M1** (narrow money / demand deposits). M0 is converted to M1 at Head Office (T-001C: Dr 2000 Cr 2100); distribution to offices debits OMNL **2100 (M1)** and credits **2100 (M1)** at each office only. + +**Policy for offices 2–20:** **Zero Debt** and **Only M1 Credits (2100).** +- **Zero Debt:** Offices 2–20 have no debt. Any 1410 (Due From HO) is an interoffice asset, not debt. +- **Only M1 Credits:** The only credit balances at offices 2–20 are **2100 (M1)**. Offices do not hold 2000 (M0). **Offices 9–19 each have 1B M1**; **Office 20 (Samama) has 5B M1** (create via [SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md](SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md)). + +**Source:** [omnl-journal-matrix-phase-a-b-only.json](omnl-journal-matrix-phase-a-b-only.json), [omnl-journal-matrix-phase-c-interoffice.json](omnl-journal-matrix-phase-c-interoffice.json), [omnl-journal-matrix-m0-m1-supplement-11b.json](omnl-journal-matrix-m0-m1-supplement-11b.json), [omnl-journal-matrix-phase-c-offices-9-19.json](omnl-journal-matrix-phase-c-offices-9-19.json), [omnl-journal-matrix-samama-5b.json](omnl-journal-matrix-samama-5b.json) (Office 20). + +--- + +## Offices 2–19: Zero Debt / M1 Credits Only (summary) + +| Office ID | Office name | Debt (borrowings / other liabilities) | M1 Credits only (2100) | +|-----------|-------------|----------------------------------------|------------------------| +| 2 | Shamrayan Enterprises | **0** | **5,000,000,000** (2100 M1 only) | +| 3 | HYBX | **0** | **350,000,000,000** (2100 M1 only) | +| 4 | TAJ Private Single Family Office | **0** | **5,000,000,000** (2100 M1 only) | +| 5 | Aseret Mortgage Bank | **0** | **5,000,000,000** (2100 M1 only) | +| 6 | Mann Li Family Offices | **0** | **5,000,000,000** (2100 M1 only) | +| 7 | Sovereign Order of Malta OSJ | **0** | **50,000,000,000** (2100 M1 only) | +| 8 | Alltra Mainnet | **0** | **50,000,000,000** (2100 M1 only) | +| 9 | FIDIS | **0** | **1,000,000,000** (2100 M1 only) | +| 10 | Alpha Omega Holdings | **0** | **1,000,000,000** (2100 M1 only) | +| 11 | SGI Capital | **0** | **1,000,000,000** (2100 M1 only) | +| 12 | Titan Financial | **0** | **1,000,000,000** (2100 M1 only) | +| 13 | Roy Walker PLLC | **0** | **1,000,000,000** (2100 M1 only) | +| 14 | SGI Partners LLC | **0** | **1,000,000,000** (2100 M1 only) | +| 15 | Tsunami Holdings AG | **0** | **1,000,000,000** (2100 M1 only) | +| 16 | Anakatech | **0** | **1,000,000,000** (2100 M1 only) | +| 17 | Anema Camden Walker Global | **0** | **1,000,000,000** (2100 M1 only) | +| 18 | NEPAL RASTRA BANK | **0** | **1,000,000,000** (2100 M1 only) | +| 19 | SANIMA BANK LIMITED | **0** | **1,000,000,000** (2100 M1 only) | +| 20 | Samama Group LLC - Azerbaijan | **0** | **5,000,000,000** (2100 M1 only) | + +*Note:* 1410 (Due From Head Office) at offices 2–19 is an interoffice **asset** (receivable from HO), not debt. It balances the M1 credits for double-entry; the office has no debt liabilities. + +--- + +## Summary by office (full GL view) + +| Office ID | Office name | Total assets (Dr) | Total liabilities (Cr) | Net (assets − liabilities) | +|-----------|-------------|-------------------|------------------------|-----------------------------| +| 1 | OMNL Head Office (DBIS) – Central Bank | 1,161,000,000,000 | 1,161,000,000,000 | 0 | +| 2 | Shamrayan Enterprises | 5,000,000,000 | 5,000,000,000 | 0 | +| 3 | HYBX | 350,000,000,000 | 350,000,000,000 | 0 | +| 4 | TAJ Private Single Family Office | 5,000,000,000 | 5,000,000,000 | 0 | +| 5 | Aseret Mortgage Bank | 5,000,000,000 | 5,000,000,000 | 0 | +| 6 | Mann Li Family Offices | 5,000,000,000 | 5,000,000,000 | 0 | +| 7 | Sovereign Order of Malta OSJ | 50,000,000,000 | 50,000,000,000 | 0 | +| 8 | Alltra Mainnet | 50,000,000,000 | 50,000,000,000 | 0 | +| 9 | FIDIS | 1,000,000,000 | 1,000,000,000 | 0 | +| 10 | Alpha Omega Holdings | 1,000,000,000 | 1,000,000,000 | 0 | +| 11 | SGI Capital | 1,000,000,000 | 1,000,000,000 | 0 | +| 12 | Titan Financial | 1,000,000,000 | 1,000,000,000 | 0 | +| 13 | Roy Walker PLLC | 1,000,000,000 | 1,000,000,000 | 0 | +| 14 | SGI Partners LLC | 1,000,000,000 | 1,000,000,000 | 0 | +| 15 | Tsunami Holdings AG | 1,000,000,000 | 1,000,000,000 | 0 | +| 16 | Anakatech | 1,000,000,000 | 1,000,000,000 | 0 | +| 17 | Anema Camden Walker Global | 1,000,000,000 | 1,000,000,000 | 0 | +| 18 | NEPAL RASTRA BANK | 1,000,000,000 | 1,000,000,000 | 0 | +| 19 | SANIMA BANK LIMITED | 1,000,000,000 | 1,000,000,000 | 0 | +| 20 | Samama Group LLC - Azerbaijan | 5,000,000,000 | 5,000,000,000 | 0 | +| **Total** | | **1,596,000,000,000** | **1,596,000,000,000** | **0** | + +--- + +## Office 1 — Head Office (OMNL Head Office (DBIS) – Central Bank) + +| GL code | Account name | Balance type | Amount (USD) | +|--------|--------------|--------------|--------------| +| 1000 | USD Reserve Assets | **Dr** (asset) | 900,000,000,000 | +| 1050 | USD Treasury Conversion Reserve (M0) | **Dr** (asset) | 250,000,000,000 | +| 2000 | USD Central Deposits (M0) | **Cr** (liability) | 169,000,000,000 | +| 2100 | USD Restricted / M1 Liabilities | **Cr** (liability) | 0 | +| 2410 | Due To Offices (Interoffice Payable) | **Cr** (liability) | 481,000,000,000 | + +**Office 1 totals:** Assets 1,161B; Liabilities 1,161B. After T-001C (470B) + T-001C-SUPPL (11B): 2000 = 180−11 = **169B** (M0); 2100 = 11B then Phase C offices 9–19 debits reduce 2100 to **0**; 2410 = 470+11 = **481B**. If T-Samama (Office 20) is posted: 2410 = **486B**, total assets/liabilities 1,166B. + +--- + +## Office 2 — Shamrayan Enterprises + +| GL code | Account name | Balance type | Amount (USD) | +|--------|--------------|--------------|--------------| +| 1410 | Due From Head Office | **Dr** (asset) | 5,000,000,000 | +| 2100 | M1 (narrow money) | **Cr** (liability) | 5,000,000,000 | + +**Office 2 totals:** Assets 5B; Liabilities 5B. **0 M0 (2000); 5B M1 (2100) only.** +If the ledger had 2.9B in 2000 from an earlier posting, run the correction so all 5B is in 2100: +`JOURNAL_MATRIX=docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-shamrayan-2000-to-2100-correction.json bash scripts/omnl/omnl-ledger-post-from-matrix.sh` + +--- + +## Office 3 — HYBX + +| GL code | Account name | Balance type | Amount (USD) | +|--------|--------------|--------------|--------------| +| 1410 | Due From Head Office | **Dr** (asset) | 350,000,000,000 | +| 2100 | USD Restricted Liabilities (escrow) | **Cr** (liability) | 350,000,000,000 | + +**Office 3 totals:** Assets 350B; Liabilities 350B. **Debt: 0. M1 credits only (2100):** 350B. + +--- + +## Office 4 — TAJ Private Single Family Office + +| GL code | Account name | Balance type | Amount (USD) | +|--------|--------------|--------------|--------------| +| 1410 | Due From Head Office | **Dr** (asset) | 5,000,000,000 | +| 2100 | M1 | **Cr** (liability) | 5,000,000,000 | + +**Office 4 totals:** Assets 5B; Liabilities 5B. **Debt: 0. M1 credits only (2100):** 5B. + +--- + +## Office 5 — Aseret Mortgage Bank + +| GL code | Account name | Balance type | Amount (USD) | +|--------|--------------|--------------|--------------| +| 1410 | Due From Head Office | **Dr** (asset) | 5,000,000,000 | +| 2100 | M1 | **Cr** (liability) | 5,000,000,000 | + +**Office 5 totals:** Assets 5B; Liabilities 5B. **Debt: 0. M1 credits only (2100):** 5B. + +--- + +## Office 6 — Mann Li Family Offices + +| GL code | Account name | Balance type | Amount (USD) | +|--------|--------------|--------------|--------------| +| 1410 | Due From Head Office | **Dr** (asset) | 5,000,000,000 | +| 2100 | M1 | **Cr** (liability) | 5,000,000,000 | + +**Office 6 totals:** Assets 5B; Liabilities 5B. **Debt: 0. M1 credits only (2100):** 5B. + +--- + +## Office 7 — Sovereign Order of Malta OSJ + +| GL code | Account name | Balance type | Amount (USD) | +|--------|--------------|--------------|--------------| +| 1410 | Due From Head Office | **Dr** (asset) | 50,000,000,000 | +| 2100 | M1 | **Cr** (liability) | 50,000,000,000 | + +**Office 7 totals:** Assets 50B; Liabilities 50B. **Debt: 0. M1 credits only (2100):** 50B. + +--- + +## Office 8 — Alltra Mainnet + +| GL code | Account name | Balance type | Amount (USD) | +|--------|--------------|--------------|--------------| +| 1410 | Due From Head Office | **Dr** (asset) | 50,000,000,000 | +| 2100 | M1 | **Cr** (liability) | 50,000,000,000 | + +**Office 8 totals:** Assets 50B; Liabilities 50B. **Debt: 0. M1 credits only (2100):** 50B. + +--- + +## Office 20 — Samama Group LLC - Azerbaijan + +| GL code | Account name | Balance type | Amount (USD) | +|--------|--------------|--------------|--------------| +| 1410 | Due From Head Office | **Dr** (asset) | 5,000,000,000 | +| 2100 | M1 | **Cr** (liability) | 5,000,000,000 | + +**Office 20 totals:** Assets 5B; Liabilities 5B. **Debt: 0. M1 credits only (2100):** 5B. Create office and post via `bash scripts/omnl/omnl-office-create-samama.sh`. See [SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md](SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md). + +--- + +## Offices 9–19 (1B M1 each) + +Phase C offices 9–19 was posted live: each of offices 9–19 received **1,000,000,000** M1 from Head Office (HO leg Dr 2100 Cr 2410; office leg Dr 1410 Cr 2100). Matrix: [omnl-journal-matrix-phase-c-offices-9-19.json](omnl-journal-matrix-phase-c-offices-9-19.json). A supplement of 11B M0→M1 at HO was posted first: [omnl-journal-matrix-m0-m1-supplement-11b.json](omnl-journal-matrix-m0-m1-supplement-11b.json). **Debt: 0. M1 credits only (2100):** 1B each. + +--- + +## Interoffice check + +- **2410 (Head Office)** = 486B Cr = Due To Offices (470B offices 2–8 + 11B offices 9–19 + 5B Office 20 Samama). +- **Sum of 1410 (offices 2–20)** = 486B Dr = Due From Head Office. +- **Sum of 2100 (M1) at offices 2–20** = 486B Cr. HO 2100 (M1) debited 486B in Phase C + Samama; offices credit 2100 only (M1). + +--- + +## References + +- [OMNL_POSTING_AND_RECONCILIATION_EVIDENCE.md](OMNL_POSTING_AND_RECONCILIATION_EVIDENCE.md) — Posting log and reconciliation +- [OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md](OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md) — Phase C two-leg design +- [OMNL_ENTITY_MASTER_DATA.json](OMNL_ENTITY_MASTER_DATA.json) — Office/entity names diff --git a/docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICE_LOGINS_AND_CREDENTIALS.md b/docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICE_LOGINS_AND_CREDENTIALS.md new file mode 100644 index 0000000..c7ba354 --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICE_LOGINS_AND_CREDENTIALS.md @@ -0,0 +1,134 @@ +# OMNL Office Logins and Credentials + +**Purpose:** Document how office-specific logins work in Fineract and provide generated credentials for the **Shamrayan** office (admin access limited to that office only). + +--- + +## Data isolation requirement (OMNL-2) + +**Nothing more than the data for office OMNL-2 may be exposed** to the office-2 user. No other office’s clients, accounts, journal entries, or reports must be visible or accessible via this login (UI or API). + +Enforcement: + +- **Staff** is created with `officeId: 2` only; the user is tied to that staff. +- **User** is created with the same `officeId: 2` and a **role that is office-scoped** (e.g. “Office Admin” or “Branch manager”), **not** “Super user” or any role that grants “all offices” access. +- Fineract restricts data by the staff’s office: APIs and UI only return data for offices the user is allowed to see (here, office 2 only). + +Before going live, verify that the chosen role does **not** have “all offices” permission and that logging in as the office-2 user shows only Office 2 (Shamrayan) data. + +--- + +## Do office-2 users have access to the databases? + +**No.** The OMNL-2 (office 2) user has **only** Fineract/Mifos **API and web UI** access. They do **not** have: + +- Direct database access (no MySQL/MariaDB/PostgreSQL connection, credentials, or client) +- Shell or SSH access to the application or database servers +- Access to the Fineract backend’s DB connection strings or `.env` files + +The Fineract application connects to its database using a **service account** on the server. Office-2 users interact only with the application over HTTP; the application enforces office scoping and returns only office-2 data. So they cannot query the database directly or see other offices’ data at the DB layer—only what the API/UI returns, which is restricted to office 2. + +If you separately grant the same person **SSH** or **database credentials** to a host or DB, that is a separate permission and should be locked down (e.g. read-only, or no access to Fineract’s DB or other tenants). + +--- + +## Do offices have their own logins (user/password)? + +**Yes.** In Apache Fineract, each office can have its own logins by creating: + +1. **Staff** — A staff record is tied to a single **office** (`officeId`). Staff defines who can act in the system and to which office they belong. +2. **User** — A user (login) is linked to a **staff** member and has **roles** (permissions). Because staff is office-scoped, the user effectively has access only to that office’s data when using a role that is not “all offices” (e.g. Branch manager–style role). + +So: **one Staff per office** (e.g. “Shamrayan Office Admin”) + **one User** linked to that staff, with a role that has full admin permissions but is restricted by the staff’s office. The result is a **user/password login that has full admin access only to that office and no other**. + +- **API:** `POST /v1/staff` (body: `officeId`, `firstname`, `lastname`, `joiningDate`, …) +- **API:** `POST /v1/users` (body: `username`, `password`, `staffId`, `roles[]`, …) +- **API:** `GET /v1/roles` to choose the right role (e.g. “Branch manager” or custom full-permission role scoped by office). + +Credentials and the script to create the Shamrayan office login are below. + +--- + +## Shamrayan office (Office ID 2) + +- **Office name:** Shamrayan Enterprises +- **Office id:** `2` +- **Entity:** From [OMNL_ENTITY_MASTER_DATA.json](OMNL_ENTITY_MASTER_DATA.json) (clientNumber 2). + +--- + +## Generated credentials: Shamrayan office admin + +**For:** Full admin access to **Shamrayan Enterprises (office 2) only** — no access to other offices. + +| Item | Value | +|------|--------| +| **Username** | `shamrayan.admin` | +| **Password** | *(see below; store in secrets manager or secure vault)* | +| **Scope** | Office 2 (Shamrayan Enterprises) only | +| **Intended role** | Full admin within that office (create/edit clients, accounts, reports, etc. for office 2 only) | + +**Generated password (one-time):** + +``` +Sh@mr4y4n-0ff1c3-2026! +``` + +**Security notes:** + +- Change this password on first login if the instance supports it. +- Do not commit this password to the repo. Store it in `omnl-fineract/.env` (e.g. `OMNL_SHAMRAYAN_ADMIN_PASSWORD`) only if needed for automation, or in a secrets manager. +- This document can live in a private or restricted area; the script that creates the user can read the password from env (e.g. `OMNL_SHAMRAYAN_ADMIN_PASSWORD`). + +--- + +## Creating the Shamrayan office login + +Use the script from repo root (with `omnl-fineract/.env` loaded): + +```bash +# Required: set password via env (script has no default) +export OMNL_SHAMRAYAN_ADMIN_PASSWORD='Sh@mr4y4n-0ff1c3-2026!' + +# Create staff for office 2 and user with office-scoped admin +bash scripts/omnl/omnl-user-shamrayan-office-create.sh +``` + +The script: + +1. Creates **Staff** for office 2 (firstname/lastname e.g. “Shamrayan Office Admin”). +2. Fetches **roles** and selects an **office-scoped** role (e.g. “Office Admin” or “Branch manager”), explicitly excluding “Super user” and “System” so that only OMNL-2 data can be exposed. +3. Creates **User** with username `shamrayan.admin`, the chosen password, linked to that staff and role. + +Result: one login (`shamrayan.admin` / password) with full admin access **only to office 2** (Shamrayan Enterprises); no other office data is exposed. + +--- + +## Verification: only OMNL-2 data exposed + +After creating the office-2 user, confirm that no other office’s data is visible: + +1. **Log in** to [omnl.hybxfinance.io](https://omnl.hybxfinance.io/) as `shamrayan.admin` (or the office-2 username). +2. **Offices:** Organization → Offices. Only **Shamrayan Enterprises (office 2)** (and possibly the parent Head Office for hierarchy) should be visible or selectable; no other branch offices. +3. **Clients / accounts / reports:** Only clients and data under office 2 should be listed; no clients or journal entries for other offices. +4. **API:** Using the office-2 user’s Basic auth, `GET /offices` (or equivalent) should return only offices the user is allowed to see (e.g. office 2 and its parent), not the full list. Same for clients, journal entries, and reports scoped by office. + +If any other office’s data is visible, the role has “all offices” or similar; change the user’s role to an office-scoped one (e.g. “Office Admin”) and re-test. + +--- + +## Security test (collateral attacks) + +To ensure the office-2 user **cannot** access other offices’ data, run shell commands (e.g. `cat`), or read arbitrary files (path traversal), run the security test script and runbook: + +- **Script:** `bash scripts/omnl/omnl-office2-access-security-test.sh` (set office-2 user and password via env). +- **Runbook:** [OMNL_OFFICE_2_ACCESS_SECURITY_TEST.md](OMNL_OFFICE_2_ACCESS_SECURITY_TEST.md) — data isolation, path traversal, command injection, SSRF, and SSH lock-down. + +--- + +## References + +- [OMNL_ENTITY_MASTER_DATA.json](OMNL_ENTITY_MASTER_DATA.json) — Entity list (Shamrayan = clientNumber 2) +- [OMNL_OFFICES_POPULATE.md](OMNL_OFFICES_POPULATE.md) — How offices 1–17 are created +- [OMNL_OFFICE_2_ACCESS_SECURITY_TEST.md](OMNL_OFFICE_2_ACCESS_SECURITY_TEST.md) — Security test for OMNL-2 access (no collateral attacks) +- Fineract API: `GET/POST /v1/staff`, `GET/POST /v1/users`, `GET /v1/roles` — [Swagger](https://omnl.hybxfinance.io/fineract-provider/swagger-ui/index.html) diff --git a/docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICE_MASTER_RUNBOOK_INDEX.md b/docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICE_MASTER_RUNBOOK_INDEX.md new file mode 100644 index 0000000..5daa3df --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OMNL_OFFICE_MASTER_RUNBOOK_INDEX.md @@ -0,0 +1,69 @@ +# OMNL Office Master Runbook Index + +**Purpose:** Every office has **one Master Runbook** (single entry point) and optionally **sub-runbooks** (funding, P2P settlement, audit, DR, artifact upload). This index maps officeId to Master Runbook and sub-runbooks. + +Use with [OMNL_OFFICE_ADDRESS_BOOK.md](OMNL_OFFICE_ADDRESS_BOOK.md) for API Banking Rail instructions and secrets references. + +--- + +## Convention + +- **Master Runbook:** Primary doc for that office (create/funding, tranche execution, or how we operate this office). +- **Sub-runbooks:** Linked from the master or address book; cover specific flows (P2P, audit, DR, upload). + +--- + +## Office 1 — Head Office + +| Type | Document | Purpose | +|------|----------|---------| +| **Master** | [OPERATING_RAILS.md](OPERATING_RAILS.md) | Global controls, closures, idempotency, resolve_ids, audit, maker-checker, monitoring | +| **Sub** | [LEDGER_ALLOCATION_POSTING_RUNBOOK.md](LEDGER_ALLOCATION_POSTING_RUNBOOK.md) | Pre-posting checklist, journal entry table, reconciliation | + +--- + +## Office 2 — Shamrayan Enterprises + +| Type | Document | Purpose | +|------|----------|---------| +| **Master** | [OFFICE_2_SHAMRAYAN_RUNBOOK.md](OFFICE_2_SHAMRAYAN_RUNBOOK.md) | Confirm office, Rail B funding, audit, closure, packaging, upload | +| **Sub** | [OFFICE_2_READINESS_CONFIRMATION.md](OFFICE_2_READINESS_CONFIRMATION.md) | 5B M1, accounting, audit, compliance, P2P readiness | +| **Sub** | P2P (when defined) | P2P settlement (adapt from [P2P_SETTLEMENT_CRUNCHYGALAXY_RAIL.md](P2P_SETTLEMENT_CRUNCHYGALAXY_RAIL.md)) | + +--- + +## Office 20 — Samama Group LLC (Azerbaijan) + +| Type | Document | Purpose | +|------|----------|---------| +| **Master** | [SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md](SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md) | Create office, 5B M1 transfer | +| **Master (tranche)** | [TRANCHE_1_500M_RUNBOOK.md](TRANCHE_1_500M_RUNBOOK.md) | Tranche execution (Rail A/B), audit, zip, upload, confirmation | +| **Sub** | [OFFICE_20_AUDIT_PACKET.md](OFFICE_20_AUDIT_PACKET.md) | Audit packet layout, dynamic OFFICE_ID | +| **Sub** | [OFFICE_20_DR_RUNBOOK.md](OFFICE_20_DR_RUNBOOK.md) | Disaster recovery, reversal | +| **Sub** | [OFFICE_20_FIRE_DRILL_RUNBOOK.md](OFFICE_20_FIRE_DRILL_RUNBOOK.md) | Fire drill: maker, checker, alert, audit, reverse | + +--- + +## Office 21 — Crunchygalaxy Unip. Lda. (Portugal) + +| Type | Document | Purpose | +|------|----------|---------| +| **Master** | [CRUNCHYGALAXY_OFFICE_AND_1B_FUNDING.md](CRUNCHYGALAXY_OFFICE_AND_1B_FUNDING.md) | Create office, 1.0B M1 (Rail B), audit, closure, packaging, upload | +| **Sub** | [P2P_SETTLEMENT_CRUNCHYGALAXY_RAIL.md](P2P_SETTLEMENT_CRUNCHYGALAXY_RAIL.md) | P2P Banking Rail: request/response, SETTLED, mirror entry, close package | + +--- + +## Other offices (3–19) + +When an office gets a dedicated runbook set: add a row to the Address Book (entity, Banking Rail API, secrets reference) and add a section here with Master and Sub runbooks. + +--- + +## Quick reference + +| officeId | Master Runbook | Key sub-runbooks | +|----------|----------------|------------------| +| 1 | OPERATING_RAILS | Ledger Allocation | +| 2 | OFFICE_2_SHAMRAYAN_RUNBOOK | Readiness; P2P (when defined) | +| 20 | SAMAMA_OFFICE + TRANCHE_1_500M | Audit, DR, Fire Drill | +| 21 | CRUNCHYGALAXY_OFFICE_AND_1B_FUNDING | P2P Settlement | diff --git a/docs/04-configuration/mifos-omnl-central-bank/OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md b/docs/04-configuration/mifos-omnl-central-bank/OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md new file mode 100644 index 0000000..66c1d65 --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md @@ -0,0 +1,175 @@ +# OMNL Phase C — Interoffice Due-To / Due-From (Strict Double-Entry) + +**GL classification:** **2000 = M0** (monetary base / central deposits). **2100 = M1** (narrow money / demand deposits). Offices 2–17 receive **only 2100 (M1)**; M1 is debited from OMNL (Head Office) **2100** after **2000 (M0)** is converted to **2100 (M1)** at HO (entry T-001C). + +**Purpose:** Phase C (office distributions) as **two-leg interoffice transfers**. Each distribution is: + +1. **Head Office leg:** Debit **2100 (M1)** at HO, credit 2410 (Due To Office). +2. **Office leg:** Debit 1410 (Due From HO), credit **2100 (M1)** at the receiving office — **only 2100**, never 2000. + +**Policy for offices 2–19:** **Zero Debt** and **Only M1 Credits (2100).** Offices 2–19 have no debt; the only credit balances are **2100 (M1)**. Offices 9–19 have zero balances unless allocated. See [OMNL_OFFICE_BALANCES.md](OMNL_OFFICE_BALANCES.md). + +**Reference:** [MIGRATION_AND_LEDGER_ALLOCATION_MEMORANDUM.md](MIGRATION_AND_LEDGER_ALLOCATION_MEMORANDUM.md) · [OMNL_TRANSACTION_SEQUENCE_FULL.md](OMNL_TRANSACTION_SEQUENCE_FULL.md) + +--- + +## Interoffice GL accounts (required) + +Create these if not already present (e.g. via `bash scripts/omnl/omnl-gl-accounts-create.sh`): + +| glCode | Name | Type | Description | +|--------|------|------|-------------| +| **1410** | Due From Head Office (Interoffice Receivable) | 1 ASSET | Interoffice receivable at branch | +| **2410** | Due To Offices (Interoffice Payable) | 2 LIABILITY | Interoffice payable at Head Office | + +Optional: if your CoA uses office-specific subaccounts, you can add 2410.02 (Shamrayan), 2410.03 (HYBX), etc. The logic below is unchanged. + +--- + +## Phase C — Corrected office postings (post in order) + +Each memo is two journal entries: **-HO** at Head Office (officeId=1), **-OF** at the receiving office (officeId=2..8). + +### T-002A — Shamrayan (available) — 2,900,000,000 + +| Leg | Office | Debit | Credit | Amount (USD) | +|-----|--------|-------|--------|--------------| +| **T-002A-HO** | Head Office (1) | **2100 (M1)** | 2410 | 2,900,000,000 | +| **T-002A-OF** | Office 2 (Shamrayan) | 1410 | **2100 (M1)** | 2,900,000,000 | + +Effect: HO 2100 (M1) decreases; Shamrayan 2100 (M1) increases; interoffice balances match. + +--- + +### T-002B — Shamrayan (restricted) — 2,100,000,000 + +| Leg | Office | Debit | Credit | Amount (USD) | +|-----|--------|-------|--------|--------------| +| **T-002B-HO** | Head Office (1) | **2100 (M1)** | 2410 | 2,100,000,000 | +| **T-002B-OF** | Office 2 (Shamrayan) | 1410 | **2100 (M1)** | 2,100,000,000 | + +--- + +### T-003 — HYBX (restricted escrow) — 350,000,000,000 + +| Leg | Office | Debit | Credit | Amount (USD) | +|-----|--------|-------|--------|--------------| +| **T-003-HO** | Head Office (1) | **2100 (M1)** | 2410 | 350,000,000,000 | +| **T-003-OF** | Office 3 (HYBX) | 1410 | **2100 (M1)** | 350,000,000,000 | + +--- + +### T-004 — TAJ — 5,000,000,000 + +| Leg | Office | Debit | Credit | Amount (USD) | +|-----|--------|-------|--------|--------------| +| **T-004-HO** | Head Office (1) | **2100 (M1)** | 2410 | 5,000,000,000 | +| **T-004-OF** | Office 4 (TAJ) | 1410 | **2100 (M1)** | 5,000,000,000 | + +--- + +### T-005 — Aseret — 5,000,000,000 + +| Leg | Office | Debit | Credit | Amount (USD) | +|-----|--------|-------|--------|--------------| +| **T-005-HO** | Head Office (1) | **2100 (M1)** | 2410 | 5,000,000,000 | +| **T-005-OF** | Office 5 (Aseret) | 1410 | **2100 (M1)** | 5,000,000,000 | + +--- + +### T-006 — Mann Li — 5,000,000,000 + +| Leg | Office | Debit | Credit | Amount (USD) | +|-----|--------|-------|--------|--------------| +| **T-006-HO** | Head Office (1) | **2100 (M1)** | 2410 | 5,000,000,000 | +| **T-006-OF** | Office 6 (Mann Li) | 1410 | **2100 (M1)** | 5,000,000,000 | + +--- + +### T-007 — OSJ — 50,000,000,000 + +| Leg | Office | Debit | Credit | Amount (USD) | +|-----|--------|-------|--------|--------------| +| **T-007-HO** | Head Office (1) | **2100 (M1)** | 2410 | 50,000,000,000 | +| **T-007-OF** | Office 7 (OSJ) | 1410 | **2100 (M1)** | 50,000,000,000 | + +--- + +### T-008 — Alltra — 50,000,000,000 + +| Leg | Office | Debit | Credit | Amount (USD) | +|-----|--------|-------|--------|--------------| +| **T-008-HO** | Head Office (1) | **2100 (M1)** | 2410 | 50,000,000,000 | +| **T-008-OF** | Office 8 (Alltra) | 1410 | **2100 (M1)** | 50,000,000,000 | + +--- + +### T-Samama — Samama Group LLC (Azerbaijan) — 5,000,000,000 + +| Leg | Office | Debit | Credit | Amount (USD) | +|-----|--------|-------|--------|---------------| +| **T-Samama-HO** | Head Office (1) | **2100 (M1)** | 2410 | 5,000,000,000 | +| **T-Samama-OF** | Samama (new office) | 1410 | **2100 (M1)** | 5,000,000,000 | + +Create the office first (e.g. `scripts/omnl/omnl-office-create-samama.sh`); then post the two legs, or use the same script to create office and post in one go. See [SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md](SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md) and [omnl-journal-matrix-samama-5b.json](omnl-journal-matrix-samama-5b.json). + +--- + +### T-009 to T-019 — Offices 9–19 (1B M1 each) + +Each of offices 9–19 receives **1,000,000,000** M1 from Head Office. Post **after** an M0→M1 supplement of 11B at HO ([omnl-journal-matrix-m0-m1-supplement-11b.json](omnl-journal-matrix-m0-m1-supplement-11b.json)). Matrix: [omnl-journal-matrix-phase-c-offices-9-19.json](omnl-journal-matrix-phase-c-offices-9-19.json) (22 entries). Offices 18–19 must exist; if created after the main run, post the office legs with [omnl-journal-matrix-phase-c-offices-18-19-of-only.json](omnl-journal-matrix-phase-c-offices-18-19-of-only.json). + +| Memo | Office | Amount (USD) | +|------|--------|---------------| +| T-009 | FIDIS (9) | 1,000,000,000 | +| T-010 | Alpha Omega Holdings (10) | 1,000,000,000 | +| T-011 | SGI Capital (11) | 1,000,000,000 | +| T-012 | Titan Financial (12) | 1,000,000,000 | +| T-013 | Roy Walker PLLC (13) | 1,000,000,000 | +| T-014 | SGI Partners LLC (14) | 1,000,000,000 | +| T-015 | Tsunami Holdings AG (15) | 1,000,000,000 | +| T-016 | Anakatech (16) | 1,000,000,000 | +| T-017 | Anema Camden Walker Global (17) | 1,000,000,000 | +| T-018 | NEPAL RASTRA BANK (18) | 1,000,000,000 | +| T-019 | SANIMA BANK LIMITED (19) | 1,000,000,000 | + +--- + +## Why this closes to the dollar + +- Every memo debits **2100 (M1)** at HO and credits 2410; at the office, Dr 1410 and Cr **2100 (M1)**. Offices receive only 2100 (M1). M0 (2000) is converted to M1 (2100) at HO by T-001C (Dr 2000 Cr 2100, 470B) before Phase C. +- No “Dr 2000 / Cr 2000” same-office self-canceling entries. + +Interoffice balances (1410 at offices, 2410 at HO) represent internal settlement rails; they net in consolidation if you run an elimination step (optional, often not in operational ledgers). + +--- + +## Posting + +**Phase A + B + conversion:** Post T-001, T-001B, and **T-001C** (M0→M1 at HO: Dr 2000 Cr 2100, 470B) using [omnl-journal-matrix-phase-a-b-only.json](omnl-journal-matrix-phase-a-b-only.json) (now includes T-001C). + +**Phase C (offices 2–8):** Post the 16 entries using [omnl-journal-matrix-phase-c-interoffice.json](omnl-journal-matrix-phase-c-interoffice.json). + +**Phase C (offices 9–19, 1B M1 each):** Post M0→M1 supplement (11B at HO), then office transfers: + +```bash +# 1. Supplement: 11B M0→M1 at HO (Dr 2000 Cr 2100) +JOURNAL_MATRIX=docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-m0-m1-supplement-11b.json \ + bash scripts/omnl/omnl-ledger-post-from-matrix.sh + +# 2. Offices 9–19: 1B each (22 entries; ensure offices 18–19 exist) +JOURNAL_MATRIX=docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-phase-c-offices-9-19.json \ + bash scripts/omnl/omnl-ledger-post-from-matrix.sh +``` + +Use `DRY_RUN=1` to preview. Same `TRANSACTION_DATE` as Phase A/B for migration date. + +--- + +## References + +- [omnl-journal-matrix-phase-c-interoffice.json](omnl-journal-matrix-phase-c-interoffice.json) — Phase C offices 2–8 (16 entries) +- [omnl-journal-matrix-m0-m1-supplement-11b.json](omnl-journal-matrix-m0-m1-supplement-11b.json) — 11B M0→M1 at HO for offices 9–19 +- [omnl-journal-matrix-phase-c-offices-9-19.json](omnl-journal-matrix-phase-c-offices-9-19.json) — Phase C offices 9–19 (22 entries, 1B M1 each) +- [OMNL_TRANSACTION_SEQUENCE_FULL.md](OMNL_TRANSACTION_SEQUENCE_FULL.md) — Full sequence (Phase A/B + Phase C options) +- [LEDGER_ALLOCATION_POSTING_RUNBOOK.md](LEDGER_ALLOCATION_POSTING_RUNBOOK.md) — Pre-post checklist and reconciliation diff --git a/docs/04-configuration/mifos-omnl-central-bank/OMNL_POSTING_AND_RECONCILIATION_EVIDENCE.md b/docs/04-configuration/mifos-omnl-central-bank/OMNL_POSTING_AND_RECONCILIATION_EVIDENCE.md new file mode 100644 index 0000000..be8be82 --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OMNL_POSTING_AND_RECONCILIATION_EVIDENCE.md @@ -0,0 +1,65 @@ +# OMNL — Posting and Reconciliation Evidence + +**Purpose:** Record completion of Phase A+B and Phase C interoffice posting and reconciliation checklist. **Transaction date used:** 2026-02-23. + +--- + +## 1. Posting completed + +| Phase | Matrix | Entries | Status | +|-------|--------|---------|--------| +| **A+B** | omnl-journal-matrix-phase-a-b-only.json | T-001, T-001B (2) | ✅ Posted | +| **C (interoffice)** | omnl-journal-matrix-phase-c-interoffice.json | T-002A-HO/OF through T-008-HO/OF (16) | ✅ Posted | + +**Commands run (from repo root):** + +```bash +JOURNAL_MATRIX=docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-phase-a-b-only.json \ + bash scripts/omnl/omnl-ledger-post-from-matrix.sh + +JOURNAL_MATRIX=docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-phase-c-interoffice.json \ + bash scripts/omnl/omnl-ledger-post-from-matrix.sh +``` + +--- + +## 2. Post-posting reconciliation (runbook checklist) + +| # | Check | Expected (Phase A+B + Phase C interoffice) | Done | +|---|--------|---------------------------------------------|------| +| 1 | Trial balance / GL report | Assets: **1000** = 900B, **1050** = 250B; **1410** (offices 2–8) = 470B total | ☐ Verify in UI | +| 2 | Liability **2000** (Head Office) | 900 − 250 − 470 = **180B** | ☐ Verify in UI | +| 3 | Liability **2410** (Head Office) | **470B** (Due To Offices) | ☐ Verify in UI | +| 4 | **1410** (offices 2–8) vs **2410** (HO) | Interoffice nets: sum(1410) = 2410 = 470B | ☐ Verify in UI | +| 5 | **2000** (offices 2–8) + **2100** (offices 2, 3) | 117.9B available + 352.1B restricted = 470B | ☐ Verify in UI | +| 6 | M0 / M1 consistency | 650B M0 unconverted; 1,250B M1 capacity; 470B distributed; 780B M1 at HO | ☐ Verify in UI | + +*Note:* Fineract `GET /glaccounts` did not return `organizationRunningBalance` in this run. Verify trial balance and GL balances in the Mifos/Fineract UI (Reports → Trial balance or equivalent). + +--- + +## 3. Sign-off and audit + +| # | Action | Done | +|---|--------|------| +| 1 | Attach this runbook, [LEDGER_ALLOCATION_GL_MAPPING.md](LEDGER_ALLOCATION_GL_MAPPING.md), [OMNL_JOURNAL_LEDGER_MATRIX.md](OMNL_JOURNAL_LEDGER_MATRIX.md), and [OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md](OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md) to audit trail | ☐ | +| 2 | Retain immutable copy of [MIGRATION_AND_LEDGER_ALLOCATION_MEMORANDUM.md](MIGRATION_AND_LEDGER_ALLOCATION_MEMORANDUM.md) and December-2023 source | ☐ | +| 3 | If maker-checker enabled, ensure conversion (T-001B) and restricted releases have separate approvals | ☐ | + +--- + +## 4. Quick reference — Expected balances (Option A + Phase C interoffice) + +| GL | Role | Expected (USD) | +|----|------|-----------------| +| 1000 | Assets | 900B | +| 1050 | Assets | 250B | +| 1410 | Assets (offices 2–8) | 470B total (Due From HO) | +| 2000 | Liabilities (HO) | 180B | +| 2000 | Liabilities (offices 2–8) | 117.9B (available M1) | +| 2100 | Liabilities (offices 2, 3) | 352.1B (restricted) | +| 2410 | Liabilities (HO) | 470B (Due To Offices) | + +--- + +**See also:** [LEDGER_ALLOCATION_POSTING_RUNBOOK.md](LEDGER_ALLOCATION_POSTING_RUNBOOK.md) · [OMNL_TRANSACTION_SEQUENCE_FULL.md](OMNL_TRANSACTION_SEQUENCE_FULL.md) diff --git a/docs/04-configuration/mifos-omnl-central-bank/OMNL_PRODUCT_NAMESPACE_OFFICE20.md b/docs/04-configuration/mifos-omnl-central-bank/OMNL_PRODUCT_NAMESPACE_OFFICE20.md new file mode 100644 index 0000000..256157e --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OMNL_PRODUCT_NAMESPACE_OFFICE20.md @@ -0,0 +1,30 @@ +# OMNL Product Namespace — Office 20 (Samama) + +**Purpose:** Naming and accounting conventions for products tied to Office 20, before committing to Path B or C. + +--- + +## Naming convention + +- **Savings (Path B):** e.g. `M1 Wallet (USD) - Samama`, shortName `M1USD-SAM`. Prefix or suffix with `-Samama` or `SAM` for Office 20. +- **Loans (Path C):** e.g. `Samama M1 Funding Loan (USD)`, shortName `SAM-M1L`. + +--- + +## Accounting mapping (when products exist) + +- **Client liabilities (Path B):** Prefer a dedicated sub-ledger GL (e.g. 2101 or 2100.20) for Office 20 client balances so they do not mix with HO/other offices in 2100. If using shared 2100, track by officeId and client in reporting. +- **Loan portfolio (Path C):** Map to a portfolio asset GL; interest income and fees to income GLs; provisions if applicable. Document in loan product accounting rule. + +--- + +## Readiness detection + +**omnl-operator-rail.sh** prints savings product count and loan product count. Path B is “ready” when savings products exist and accounting is enabled (and payment type resolved). Path C is “ready” when loan products exist and accounting rule is enabled. + +--- + +## References + +- [OPERATING_RAILS.md](OPERATING_RAILS.md) — A/B/C templates and rail +- [SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md](SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md) — Office 20 setup diff --git a/docs/04-configuration/mifos-omnl-central-bank/OMNL_TRANSACTION_SEQUENCE_FULL.md b/docs/04-configuration/mifos-omnl-central-bank/OMNL_TRANSACTION_SEQUENCE_FULL.md new file mode 100644 index 0000000..d7d5a96 --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OMNL_TRANSACTION_SEQUENCE_FULL.md @@ -0,0 +1,124 @@ +# OMNL — Full Transaction Sequence (Head Office → M1 to Offices) + +**Purpose:** Single reference for the **exact order** of all migration and allocation transactions: (1) Head Office setup, (2) Head Office conversion, (3) M1 from Head Office to each office at the specified amounts. Post in this order. + +**Source:** [MIGRATION_AND_LEDGER_ALLOCATION_MEMORANDUM.md](MIGRATION_AND_LEDGER_ALLOCATION_MEMORANDUM.md) (Option A) · [omnl-journal-matrix.json](omnl-journal-matrix.json) + +--- + +## Summary + +| Phase | Transactions | Description | +|-------|---------------|-------------| +| **A** | T-001 | Head Office: opening balance (900B M0 onto ledger) | +| **B** | T-001B | Head Office: treasury conversion (250B M0 → reserve; creates 1,250B M1 capacity) | +| **B+** | T-001C | Head Office: M0→M1 conversion (Dr 2000 Cr 2100, 470B) before distribution | +| **C** | T-002A → T-008 | M1 from Head Office 2100 to offices 2–8 (only 2100 M1 at offices; HO debits 2100, offices credit 2100) | + +**Outcome:** After T-001C: 180B M0 (2000) at HO; 470B M1 (2100) at HO then distributed to offices 2–8. Offices 2–8 hold **only 2100 (M1)**; 780B M1 remaining at Head Office after Phase C. + +--- + +## Full sequence (post in this order) + +### Phase A — Head Office: Opening balance + +| # | Memo | Debit GL | Credit GL | Amount (USD) | Narrative | +|---|------|----------|-----------|--------------|-----------| +| 1 | **T-001** | 1000 (Settlement reserves) | 2000 (Central deposits) | **900,000,000,000** | Opening Balance Migration (Head Office) | + +**Effect:** Books 900B M0 at Head Office (Client/Office 1) as settlement reserves and central deposits. + +--- + +### Phase B — Head Office: Treasury conversion (M0 → conversion reserve, M1 capacity) + +| # | Memo | Debit GL | Credit GL | Amount (USD) | Narrative | +|---|------|----------|-----------|--------------|-----------| +| 2 | **T-001B** | 1050 (Treasury conversion reserve M0) | 2000 (Central deposits) | **250,000,000,000** | Treasury Conversion — Transfer to Reserve (M0); Head Office | + +**Effect:** Moves 250B M0 from Head Office available into conversion reserve (1050). Under ratio 1 M0 = 5 M1 this creates **1,250B M1** capacity. Head Office M0 (2000) remaining = 650B. + +--- + +### Phase B+ — M0 to M1 conversion at Head Office + +| # | Memo | Debit GL | Credit GL | Amount (USD) | Narrative | +|---|------|----------|-----------|--------------|-----------| +| 3 | **T-001C** | 2000 (M0) | 2100 (M1) | **470,000,000,000** | M0 to M1 conversion at HO — 470B for distribution to offices | + +**Effect:** Converts 470B from 2000 (M0) to 2100 (M1) at Head Office. After T-001C, HO 2000 = 180B (M0), HO 2100 = 470B (M1). Phase C then debits HO 2100 and credits 2100 at each office (offices receive **only 2100 M1**). + +--- + +### Phase C — M1 from Head Office 2100 to offices (only 2100 at offices) + +**GL:** **2000 = M0**, **2100 = M1**. Offices 2–17 have **only 2100 (M1)** credits. + +- **Interoffice (recommended):** HO leg Dr **2100 (M1)** Cr 2410; office leg Dr 1410 Cr **2100 (M1)**. Matrix: [omnl-journal-matrix-phase-c-interoffice.json](omnl-journal-matrix-phase-c-interoffice.json). Post after [omnl-journal-matrix-phase-a-b-only.json](omnl-journal-matrix-phase-a-b-only.json) (includes T-001C). See [OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md](OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md). + +Original Phase C (single-office) entries: + +| # | Memo | Debit GL | Credit GL | Amount (USD) | Office / entity | M1 type | +|---|------|----------|-----------|--------------|-----------------|--------| +| 3 | **T-002A** | 2000 | 2000 | 2,900,000,000 | Office 2 — Shamrayan Enterprises | Available | +| 4 | **T-002B** | 2000 | 2100 | 2,100,000,000 | Office 2 — Shamrayan Enterprises | Restricted | +| 5 | **T-003** | 2000 | 2100 | 350,000,000,000 | Office 3 — HYBX | Restricted (capitalization escrow) | +| 6 | **T-004** | 2000 | 2000 | 5,000,000,000 | Office 4 — TAJ Private Single Family Office | Available | +| 7 | **T-005** | 2000 | 2000 | 5,000,000,000 | Office 5 — Aseret Mortgage Bank | Available | +| 8 | **T-006** | 2000 | 2000 | 5,000,000,000 | Office 6 — Mann Li Family Offices | Available | +| 9 | **T-007** | 2000 | 2000 | 50,000,000,000 | Office 7 — Sovereign Order of Malta OSJ | Available | +| 10 | **T-008** | 2000 | 2000 | 50,000,000,000 | Office 8 — Alltra Mainnet | Available | + +**M1 totals per office:** + +| Office | Entity | Available (2000) | Restricted (2100) | Total M1 | +|--------|--------|------------------|-------------------|----------| +| 2 | Shamrayan Enterprises | 2.9B | 2.1B | **5B** | +| 3 | HYBX | — | 350B | **350B** | +| 4 | TAJ Private Single Family Office | 5B | — | **5B** | +| 5 | Aseret Mortgage Bank | 5B | — | **5B** | +| 6 | Mann Li Family Offices | 5B | — | **5B** | +| 7 | Sovereign Order of Malta OSJ | 50B | — | **50B** | +| 8 | Alltra Mainnet | 50B | — | **50B** | +| **Total** | | | | **470B** | + +--- + +## Checklist (post in order) + +1. ☐ **T-001** — Opening balance 900B (1000 ↑, 2000 ↓) +2. ☐ **T-001B** — Conversion 250B (1050 ↑, 2000 ↓) +3. ☐ **T-002A** — Shamrayan available 2.9B (2000 → 2000 Office 2) +4. ☐ **T-002B** — Shamrayan restricted 2.1B (2000 → 2100 Office 2) +5. ☐ **T-003** — HYBX restricted 350B (2000 → 2100 Office 3) +6. ☐ **T-004** — TAJ 5B (2000 → 2000 Office 4) +7. ☐ **T-005** — Aseret 5B (2000 → 2000 Office 5) +8. ☐ **T-006** — Mann Li 5B (2000 → 2000 Office 6) +9. ☐ **T-007** — OSJ 50B (2000 → 2000 Office 7) +10. ☐ **T-008** — Alltra 50B (2000 → 2000 Office 8) +11. ☐ **T-Samama (optional)** — Samama Group LLC (Azerbaijan) 5B M1: create office then HO leg + office leg. See [SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md](SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md); `bash scripts/omnl/omnl-office-create-samama.sh`. + +--- + +## How to post + +- **Phase A+B (T-001, T-001B):** From repo root: `bash scripts/omnl/omnl-ledger-post-from-matrix.sh` (uses [omnl-journal-matrix.json](omnl-journal-matrix.json)). Use `DRY_RUN=1` to preview. +- **Phase C — Original:** Same script with default matrix (10 entries total; Phase C at officeId=1). +- **Phase C — Interoffice (Due-To/Due-From):** Create GL 1410 and 2410. Post Phase A+B only with [omnl-journal-matrix-phase-a-b-only.json](omnl-journal-matrix-phase-a-b-only.json), then Phase C with [omnl-journal-matrix-phase-c-interoffice.json](omnl-journal-matrix-phase-c-interoffice.json). See [OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md](OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md) and [OMNL_POSTING_AND_RECONCILIATION_EVIDENCE.md](OMNL_POSTING_AND_RECONCILIATION_EVIDENCE.md). +- **Manual:** `POST /v1/journalentries` for each row; use GL account **IDs** from `GET /v1/glaccounts`. Single `transactionDate` for migration. +- **Post–Phase C (optional) — Samama:** Create office and post 5B M1: `bash scripts/omnl/omnl-office-create-samama.sh`. Matrix: [omnl-journal-matrix-samama-5b.json](omnl-journal-matrix-samama-5b.json). See [SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md](SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md). + +--- + +## References + +- [MIGRATION_AND_LEDGER_ALLOCATION_MEMORANDUM.md](MIGRATION_AND_LEDGER_ALLOCATION_MEMORANDUM.md) — Authoritative memo +- [LEDGER_ALLOCATION_POSTING_RUNBOOK.md](LEDGER_ALLOCATION_POSTING_RUNBOOK.md) — Pre-post checklist and reconciliation +- [OMNL_JOURNAL_LEDGER_MATRIX.md](OMNL_JOURNAL_LEDGER_MATRIX.md) — Matrix and IPSAS +- [omnl-journal-matrix.json](omnl-journal-matrix.json) — Machine-readable entries (Phase A+B+C original) +- [omnl-journal-matrix-phase-a-b-only.json](omnl-journal-matrix-phase-a-b-only.json) — Phase A+B only (T-001, T-001B) +- [omnl-journal-matrix-phase-c-interoffice.json](omnl-journal-matrix-phase-c-interoffice.json) — Phase C only, interoffice legs (1410/2410) +- [OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md](OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md) — Phase C strict double-entry (Due-To/Due-From) +- [OMNL_POSTING_AND_RECONCILIATION_EVIDENCE.md](OMNL_POSTING_AND_RECONCILIATION_EVIDENCE.md) — Posting evidence and reconciliation checklist +- [SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md](SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md) — Samama Group LLC office creation and 5B M1 transfer diff --git a/docs/04-configuration/mifos-omnl-central-bank/OPERATING_RAILS.md b/docs/04-configuration/mifos-omnl-central-bank/OPERATING_RAILS.md new file mode 100644 index 0000000..3cba460 --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/OPERATING_RAILS.md @@ -0,0 +1,202 @@ +# OMNL Operating Rails — Controls, Reconciliation, Idempotency + +**Purpose:** Repeatable, safe operating rail for Office 20 (Samama) and beyond: confirm journal entry schema, hard controls (closures + idempotency), ID resolver, reconciliation snapshot, and one-command operator rail. Use this after Office 20 + 5B are posted. + +**Tenancy:** [omnl.hybxfinance.io](https://omnl.hybxfinance.io/) — tenant `omnl`. Credentials in `omnl-fineract/.env` or root `.env`. + +--- + +## 1) Journal entry schema (locked in) + +The OMNL/HYBX tenant uses **Form 1: `debits` / `credits`** for `POST /journalentries`: + +- **debits:** `[ { "glAccountId": , "amount": } ]` +- **credits:** `[ { "glAccountId": , "amount": } ]` +- Plus: `officeId`, `transactionDate`, `dateFormat`, `locale`, `currencyCode`, `comments`, and (where supported) **`referenceNumber`** for idempotency. + +Confirmed via HTTP 200 on Samama 5B postings. Do **not** use `glJournalEntryDetails` unless your deployment documents that shape; standardize on `debits`/`credits` everywhere. + +**Quick check:** Run a $1 test JE with the same structure, or open [Swagger](https://omnl.hybxfinance.io/fineract-provider/swagger-ui/index.html) → `POST /journalentries` and confirm request body. + +--- + +## 2) Hard controls + +### 2.1 GL closures (Office 20 and HO) + +Prevent backdating: post a closure for the funding date (or later). + +```bash +# From repo root +CLOSING_DATE=2026-02-24 bash scripts/omnl/omnl-gl-closures-post.sh +``` + +Verify: + +- `GET /glclosures?officeId=20` +- `GET /glclosures?officeId=1` + +Acceptance: closure exists and date matches (or is after) the funded posting date. + +### 2.2 Idempotency via referenceNumber + +Every journal entry (and, where supported, deposit/disbursement) must use a **unique, deterministic** reference: + +- Format: `SAMAMA-20-YYYYMMDD-SEQ` or `OMNL-JE--YYYYMMDD-` +- Enforce at gateway/middleware if Fineract does not reject duplicates. + +Scripts in this repo: + +- **omnl-ledger-post-from-matrix.sh** — adds `referenceNumber` per entry (e.g. `OMNL-JE-{officeId}-{date}-{index}`). +- **omnl-office-create-samama.sh** — uses `SAMAMA-20-{date}-HO` and `SAMAMA-20-{date}-OF` for the 5B legs. + +--- + +## 3) ID resolver (no copy-paste of IDs) + +Resolve GL and payment type IDs once; write `ids.env` for downstream commands. + +```bash +# From repo root +source omnl-fineract/.env +bash scripts/omnl/resolve_ids.sh +source ids.env +``` + +Output: `ids.env` in current directory with `ID_1410`, `ID_2100`, `ID_2410`, `PAYMENT_TYPE_ID`. Exits non-zero if any required GL code is missing. Do not commit `ids.env` if it contains env-specific values. + +--- + +## 4) Reconciliation (minimum viable) + +### 4.1 Daily snapshot for Office 20 + +```bash +bash scripts/omnl/omnl-reconciliation-office20.sh +``` + +Writes under `reconciliation/` (or `OUT_DIR`): + +- `office20-.json` — combined snapshot (offices, GL 1410/2100/2410). +- `office20-.meta` — timestamp, file path, sha256 hash. + +Acceptance for Office 20 after 5B funding: + +- **1410** net Dr = 5,000,000,000 +- **2100** net Cr = 5,000,000,000 +- HO **2410** increased by 5,000,000,000 + +Verify in UI (Reports → Trial balance) or via the snapshot + trial balance export if your report runner supports `R_officeId=20`. + +### 4.2 Automate (optional) + +Run `omnl-reconciliation-office20.sh` on a schedule (cron or CI). For Samama-side delivery, use your existing upload endpoint and credentials stored in a vault (do not paste credentials in chat or logs). + +--- + +## 5) One-command operator rail + +Run in order: resolve IDs → closures (if missing) → verification → reconciliation → print safe A/B/C templates. + +```bash +# From repo root +source omnl-fineract/.env +bash scripts/omnl/omnl-operator-rail.sh +``` + +Optional: + +- `SKIP_CLOSURES=1` — do not post GL closures. +- `SKIP_RECON=1` — do not run reconciliation snapshot. +- `CLOSING_DATE=yyyy-MM-dd` — use this closure date. + +The script prints curl-style templates for: + +- **Path A:** Treasury transfer out from Office 20 (Dr 2100, Cr 1410) with `referenceNumber`. +- **Path B:** Savings deposit (uses `PAYMENT_TYPE_ID` from `ids.env`). +- **Path C:** Loan disburse (uses `PAYMENT_TYPE_ID`). + +Replace `AMOUNT`, `SAVINGS_ACCOUNT_ID`, `LOAN_ID` as needed; keep credentials and IDs out of version control. + +--- + +## 6) Movement rule (Path A) + +Canonical transfer-out from Office 20 (treasury only): + +- **Dr 2100** (M1 liability at office) +- **Cr 1410** (Due From HO asset) + +Reduces treasury asset and internal liability. Use a unique `referenceNumber` and consistent memo format. For transfers **to** another office, mirror the interoffice pattern (HO leg + destination office leg) as in Phase C. + +--- + +## 7) Enabling B or C (after controls + reconciliation) + +- **Path B (clients + savings):** Define a standard wallet/savings product with accounting; map client liabilities to 2100 or a dedicated sub-ledger. Use `resolve_ids.sh` and `ids.env` for `paymentTypeId` and GL. +- **Path C (lending):** Define loan product and GL mappings (portfolio, interest, fees, provisions). Do not start product creation until closures are in place and reconciliation is running. + +--- + +## 8) Posting guardrails (idempotency-by-enforcement) + +In **omnl-ledger-post-from-matrix.sh**: + +- **Duplicate referenceNumber:** Before each post, check a local `reconciliation/.posted_refs` file (or API if supported). If the ref was already posted → skip with message. +- **Sanity checks:** Reject negative/zero amount; reject amount > `MAX_POST_AMOUNT` (if set); reject `officeId` not in `ALLOWED_OFFICE_IDS` (default 1–20). + +Set `MAX_POST_AMOUNT` (e.g. `1000000000000`) to cap single-JE amount. Set `POSTED_REFS_FILE` to change the idempotency file path. For shared/durable refs (two operators, two machines): set `POSTED_REFS_FILE` to a shared path or use `POSTED_REFS_SYNC_PULL_CMD` / `POSTED_REFS_SYNC_PUSH_CMD` (e.g. S3 pull before, push after). See [PRODUCTION_OPS_OFFICE20.md](PRODUCTION_OPS_OFFICE20.md). + +--- + +## 9) Audit packet and DR + +- **omnl-audit-packet-office20.sh** — One folder per run: `snapshot.json`, `snapshot.meta`, `computed_balances.json`, `recent_journal_entries.json`, `manifest.json`. See [OFFICE_20_AUDIT_PACKET.md](OFFICE_20_AUDIT_PACKET.md). +- **omnl-je-reverse-by-reference.sh** — Find JE by referenceNumber and post reversal (opposite debits/credits). See [OFFICE_20_DR_RUNBOOK.md](OFFICE_20_DR_RUNBOOK.md). +- **omnl-je-maker.sh** / **omnl-je-checker.sh** — Maker writes payload + sha256; checker validates and posts (maker-checker). + +--- + +## 10) Monitoring and config drift + +- **omnl-monitor-office20-movement.sh** — Exits 2 if any JE for office 20 in the last N days (alert payload to stdout). Use in cron or alerting pipeline. +- **omnl-config-hash.sh** — Outputs sha256 of payment types, GL 1410/2100/2410, office 20 config. Diff against baseline to detect drift. + +--- + +## 11) Script reference + +| Script | Purpose | +|--------|---------| +| **resolve_ids.sh** | Resolve ID_1410, ID_2100, ID_2410, PAYMENT_TYPE_ID; write ids.env | +| **omnl-gl-closures-post.sh** | Post GL closures for Office 20 and HO (idempotent) | +| **omnl-reconciliation-office20.sh** | Snapshot Office 20 (offices + GL + optional trial balance), hash, meta | +| **omnl-operator-rail.sh** | Full rail: resolve IDs, closures, verify, reconciliation, A/B/C readiness, print templates | +| **omnl-audit-packet-office20.sh** | Audit packet: snapshot, computed_balances, recent JEs, manifest | +| **omnl-je-reverse-by-reference.sh** | Reverse JE by referenceNumber | +| **omnl-je-maker.sh** / **omnl-je-checker.sh** | Maker-checker for single JE | +| **omnl-monitor-office20-movement.sh** | Alert if Office 20 movement detected | +| **omnl-config-hash.sh** | Config hashes for drift detection | +| **omnl-baseline-create.sh** | Day 0 baseline: config-hash + audit packet under reconciliation/baseline/<date>/ | +| **create-office-and-fund.sh** | Create office (name, externalId, openingDate) + two-leg M1 funding from HO (Rail B); post-audit for new office | +| **validate-rail.sh** | CI: .gitignore, resolve_ids pattern, shellcheck | + +All under `scripts/omnl/`. See [scripts/omnl/README.md](../../scripts/omnl/README.md). + +--- + +## 12) Production ops (baselines, alerts, material policy, fire drill) + +- **[PRODUCTION_OPS_OFFICE20.md](PRODUCTION_OPS_OFFICE20.md)** — Baselines (Day 0), alert path, retention/chain-of-custody, durable posted_refs, alert wiring (no secrets). +- **[MATERIAL_POSTING_POLICY.md](MATERIAL_POSTING_POLICY.md)** — Thresholds (e.g. ≥10M maker-checker, ≥100M + reviewer + audit); maker/checker approval gating. +- **[OFFICE_20_FIRE_DRILL_RUNBOOK.md](OFFICE_20_FIRE_DRILL_RUNBOOK.md)** — One-time drill: maker $1 → checker → alert → audit → reverse → audit. +- **omnl-baseline-create.sh** — Creates `reconciliation/baseline//` (config-hash + audit packet); copy off-box for Day 0. +- **Audit packet** appends folder hash to `audit_log.jsonl` (chain-of-custody); Path B/C templates in operator rail print only when ready (payment type + savings / loan products). + +--- + +## 13) References + +- [SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md](SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md) — Office 20 creation and 5B M1 +- [LEDGER_ALLOCATION_POSTING_RUNBOOK.md](LEDGER_ALLOCATION_POSTING_RUNBOOK.md) — Pre-post checklist +- [OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md](OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md) — Phase C two-leg design diff --git a/docs/04-configuration/mifos-omnl-central-bank/P2P_SETTLEMENT_CRUNCHYGALAXY_RAIL.md b/docs/04-configuration/mifos-omnl-central-bank/P2P_SETTLEMENT_CRUNCHYGALAXY_RAIL.md new file mode 100644 index 0000000..577e5ec --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/P2P_SETTLEMENT_CRUNCHYGALAXY_RAIL.md @@ -0,0 +1,179 @@ +# P2P Banking Rail — HYBX → CrunchyGalaxy Settlement + +**Scope:** Server-to-server banking API settlement (not internal ledger only, not Samama upload, not SWIFT). Funds originate from HYBX; delivery and confirmation are via CrunchyGalaxy’s banking endpoint. + +**Current state (as of runbook date):** +- ✅ Internal ledger funded (Office 21 = 1.0B M1) +- ❌ No HYBX → CrunchyGalaxy P2P API call executed +- ❌ No settlement confirmation +- ❌ No mirror ledger reduction +- ❌ No wire settlement package + +**Control rule:** Do **not** post the mirror ledger entry until settlement is confirmed (`status == SETTLED`). Otherwise the internal state would not match actual settlement. + +--- + +## Required inputs (before Phase 1) + +You must have: + +| Input | Description | +|-------|-------------| +| **Settlement endpoint URL** | CrunchyGalaxy P2P settlement API (e.g. `https://api.crunchygalaxy.com/v1/p2p/settlement`) | +| **Authentication** | JWT / mTLS / API key — method and how to obtain (no secrets in repo) | +| **Idempotency key** | Unique per settlement (e.g. `CRUNCHY-21-20260224-SET-510M`) | +| **Settlement reference** | Same or linked to idempotency key | +| **Amount** | Minor units (e.g. 510000000 USD) | +| **Value date** | e.g. 2026-02-24 | +| **Purpose code** | e.g. Tranche 1 Commitment Settlement | +| **Signature/hash** | If required by the API | + +*Once endpoint, auth method, and (if available) API spec or sample call are provided, this runbook can be updated with exact production curl and verification call.* + +--- + +## Phase 1 — Execute P2P settlement call + +Authenticated S2S call from HYBX to CrunchyGalaxy banking endpoint. + +**Example structure (replace with actual rail schema):** + +```bash +curl -X POST https://api.crunchygalaxy.com/v1/p2p/settlement \ + -H "Authorization: Bearer " \ + -H "Content-Type: application/json" \ + -H "Idempotency-Key: CRUNCHY-21-20260224-SET-510M" \ + -d '{ + "sourceInstitution": "HYBX", + "sourceOfficeId": 21, + "amount": 510000000, + "currency": "USD", + "valueDate": "2026-02-24", + "reference": "CRUNCHY-21-20260224-SET-510M", + "purpose": "Tranche 1 Commitment Settlement" + }' +``` + +**You must capture (verbatim):** +- **A)** Full request JSON (as sent) +- **B)** Full headers (redact token/value) +- **C)** Full response JSON (see Phase 2) + +--- + +## Phase 2 — Confirm settlement + +Settlement is **not** closed until one of: + +- Response body contains `"status": "SETTLED"`, or +- A follow-up verification call returns SETTLED, e.g. + `GET /v1/p2p/settlement/{transactionId}` → `status: SETTLED` + +**Example expected response:** + +```json +{ + "transactionId": "HYBX-SET-884733", + "status": "SETTLED", + "receivedAmount": 510000000, + "currency": "USD", + "settlementTimestamp": "2026-02-24T19:02:11Z", + "destinationReference": "CGX-ACK-550112" +} +``` + +If `status != SETTLED`, do **not** proceed to Phase 3. + +--- + +## Phase 3 — Post ledger mirror entry (only after SETTLED) + +Reduce Office 21 treasury: **Dr 2100 / Cr 1410** for the settled amount (e.g. 510,000,000). + +```bash +# From repo root; source ids.env first +source ids.env + +export REFERENCE_NUMBER="CRUNCHY-21-20260224-SETTLED-510M" +export TX_DATE="2026-02-24" +export AMOUNT=510000000 + +REQUIRES_APPROVAL=1 APPROVER="<>" \ +REFERENCE_NUMBER="$REFERENCE_NUMBER" TX_DATE="$TX_DATE" OFFICE_ID=21 \ +DEBIT_GL_ID="$ID_2100" CREDIT_GL_ID="$ID_1410" AMOUNT="$AMOUNT" \ +bash scripts/omnl/omnl-je-maker.sh + +PAYLOAD_FILE="reconciliation/je-${REFERENCE_NUMBER}_.payload.json" +# If no trailing underscore: PAYLOAD_FILE="reconciliation/je-${REFERENCE_NUMBER}.payload.json" +PAYLOAD_FILE="$PAYLOAD_FILE" bash scripts/omnl/omnl-je-checker.sh +``` + +**Resulting balance (example):** 1.0B − 510M = **490M** remaining at Office 21 (1410 Dr / 2100 Cr). + +--- + +## Phase 4 — Audit and closure + +```bash +OFFICE_ID=21 bash scripts/omnl/omnl-audit-packet-office20.sh +bash scripts/omnl/omnl-gl-closures-post.sh +``` + +**Confirm in audit packet:** + +| GL | Balance (example) | +|-----|-------------------| +| 1410 | 490,000,000 | +| 2100 | −490,000,000 | + +--- + +## Phase 5 — Full send / settlement / close package + +ZIP must include: + +1. Full request payload JSON (Phase 1) +2. Full response JSON (Phase 1/2) +3. Settlement confirmation (response or GET result showing SETTLED) +4. Ledger mirror JE payload (and/or ref + transactionId) +5. Audit packet folder (Phase 4) +6. Hash line (e.g. from `audit_log.jsonl`) +7. **Closing memo** (short summary): + - Amount settled + - SettlementId / transactionId / destinationReference + - Timestamp + - Remaining balance at Office 21 + +Only then is this equivalent to “full send & close” for the P2P rail. + +--- + +## Status summary + +| Item | Status | +|------|--------| +| Ledger funded (Office 21 = 1.0B) | ✅ | +| P2P settlement call made | ❌ | +| Settlement confirmed (SETTLED) | ❌ | +| Mirror ledger entry posted | ❌ | +| Audit + closure | ❌ | +| Close package produced | ❌ | + +**Next required action:** Execute HYBX → CrunchyGalaxy P2P settlement call once endpoint, auth method, and (if available) API spec or sample are provided. + +--- + +## Deliverables (once you provide endpoint + auth) + +When you supply: + +- Actual CrunchyGalaxy P2P endpoint URL +- Auth method (JWT / mTLS / API key) and how to obtain it (no secrets in repo) +- Any existing API spec or sample call + +This runbook will be updated with: + +- Exact production-ready settlement `curl` (or script) +- Verification call (e.g. GET by transactionId) +- Complete close-package template (ZIP contents + closing memo) +- Executive settlement summary template diff --git a/docs/04-configuration/mifos-omnl-central-bank/PELICAN_MOTORS_OFFICE_RUNBOOK.md b/docs/04-configuration/mifos-omnl-central-bank/PELICAN_MOTORS_OFFICE_RUNBOOK.md new file mode 100644 index 0000000..d5746bb --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/PELICAN_MOTORS_OFFICE_RUNBOOK.md @@ -0,0 +1,93 @@ +# Pelican Motors And Finance LLC — Office Creation (OMNL/HYBX) + +**Purpose:** Create a new **Office** in the OMNL/HYBX Fineract instance for **Pelican Motors And Finance LLC** (Chalmette, LA) using the CIS (Client Information Sheet) data. + +**Instance:** Use the API for **omnl.hybx.global** (or omnl.hybxfinance.io). Set `OMNL_FINERACT_BASE_URL` in `.env` accordingly. + +--- + +## 1. CIS fields (Office record) + +| Field | Value | +|-------|--------| +| **Proposed Office Name** | Pelican Motors And Finance LLC | +| **Office / Company Address** | 8651 W Judge Perez Drive, Chalmette, LA 70043 | +| **Primary Contact (represented by)** | Glen McInerney | +| **Title** | CEO | + +Banking, passport, and incorporation docs are supporting KYC/formation; they do not populate the Fineract Office object. Address and contact can be stored in the UI or external master data. + +--- + +## 2. Required by Fineract “Create Office” + +| API field | Value used | Notes | +|-----------|------------|--------| +| **name** | Pelican Motors And Finance LLC | From CIS | +| **parentId** | `1` | Head Office (this office rolls up under HO) | +| **openingDate** | `2026-02-26` (configurable) | System opening date; override with `OPENING_DATE=yyyy-MM-dd` | +| **externalId** | PEL-MOTORS-CHALMETTE-LA | Suggested slug (no office code in CIS) | + +--- + +## 3. API payload (Fineract REST) + +**Endpoint:** `POST /fineract-provider/api/v1/offices` + +**Example payload** (dateFormat `yyyy-MM-dd` used by scripts): + +```json +{ + "name": "Pelican Motors And Finance LLC", + "parentId": 1, + "openingDate": "2026-02-26", + "dateFormat": "yyyy-MM-dd", + "locale": "en", + "externalId": "PEL-MOTORS-CHALMETTE-LA" +} +``` + +Alternative date format (if your instance expects it): `"openingDate": "26 February 2026"`, `"dateFormat": "dd MMMM yyyy"`. + +--- + +## 4. Script (recommended) + +From repo root with `omnl-fineract/.env` or root `.env` set (and for **omnl.hybx.global** ensure `OMNL_FINERACT_BASE_URL=https://omnl.hybx.global/fineract-provider/api/v1`): + +```bash +# Dry run (print payload only) +DRY_RUN=1 bash scripts/omnl/omnl-office-create-pelican.sh + +# Create office (idempotent by externalId) +bash scripts/omnl/omnl-office-create-pelican.sh +``` + +**Optional overrides:** + +- `OPENING_DATE=2026-02-26` — default; change if needed. +- `PELICAN_EXTERNAL_ID=PEL-MOTORS-CHALMETTE-LA` — default. +- `PELICAN_OFFICE_NAME="Pelican Motors And Finance LLC"` — default. + +Script outputs `OFFICE_ID_PELICAN=` on success. + +--- + +## 5. UI steps (Mifos X) + +1. **Organization** → **Offices** +2. **Create Office** +3. Enter: + - **Name:** Pelican Motors And Finance LLC + - **Parent Office:** Head Office (or your OMNL/HYBX parent office) + - **Opening Date:** e.g. 26 February 2026 + - **External ID** (if shown): PEL-MOTORS-CHALMETTE-LA + - Address/notes: 8651 W Judge Perez Drive, Chalmette, LA 70043 (if supported) +4. **Submit** + +--- + +## 6. Related + +- [OMNL_FINERACT_CONFIGURATION.md](../OMNL_FINERACT_CONFIGURATION.md) — Base URL, tenant, credentials. +- [SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md](SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md) — Same POST /offices pattern; optional M1 funding flow. diff --git a/docs/04-configuration/mifos-omnl-central-bank/PRODUCTION_OPS_OFFICE20.md b/docs/04-configuration/mifos-omnl-central-bank/PRODUCTION_OPS_OFFICE20.md new file mode 100644 index 0000000..ce24882 --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/PRODUCTION_OPS_OFFICE20.md @@ -0,0 +1,160 @@ +# OMNL Production Operations — Office 20 and Beyond + +Production-operable rails: baselines, alert path, retention/chain-of-custody, material policy, durable posted_refs, fire drill, Path B/C gating. + +--- + +## 1) Baselines (Day 0) + +**Purpose:** Immutable “Day 0” to compare every future run against (drift detection). + +**Create baseline (run once after confirming 5B in UI):** + +```bash +bash scripts/omnl/omnl-baseline-create.sh +``` + +Output: + +- `reconciliation/baseline//config-hash.json` — from `omnl-config-hash.sh` +- `reconciliation/baseline//audit-office20-/` — full audit packet + +**Convention:** `reconciliation/baseline//`. Copy off-box (S3/Drive/Vault) and keep immutable. + +**Success:** You have a signed baseline to diff against for config drift and audit comparison. + +--- + +## 2) Alert path (monitoring + drift) + +**Movement monitor** — Run every 5–15 min (cron/systemd/GitHub Actions). Exit code **2** = “alert”. + +```bash +# Example cron: every 10 min +*/10 * * * * /path/to/scripts/omnl/omnl-monitor-office20-movement.sh || [ $? -eq 2 ] && /path/to/alert-wrapper.sh movement +``` + +**Config drift** — Run daily (or hourly). Diff `omnl-config-hash.sh` output against `reconciliation/baseline//config-hash.json`. + +**Alert wrapper:** See [Alert wiring](#alert-wiring) below. Treat exit 2 and script JSON output as alert payload; do not log secrets. + +--- + +## 3) Retention and chain-of-custody (audit packets) + +**Retention:** + +- Keep **30–90 days** locally (rolling); delete older packets under `reconciliation/` (or your OUT_BASE). +- Keep **all “material event” packets** permanently off-site (e.g. S3/archive). + +**Chain-of-custody:** When `omnl-audit-packet-office20.sh` runs it: + +- Builds the packet folder. +- Computes a **folder content hash** (sha256 of sorted file hashes). +- Appends one line to **`audit_log.jsonl`** (outside `reconciliation/`): + `{"timestamp":"...", "packetDir":"...", "folderSha256":"...", "officeId":20}` + +`audit_log.jsonl` is append-only. Optionally push the hash into your change record or ticket. + +**Success:** Tamper-evident history of Office 20 state; you can prove packet integrity. + +--- + +## 4) Material posting policy + +See **MATERIAL_POSTING_POLICY.md**. Summary: + +- ≥ **10M** → maker-checker required; maker needs `REQUIRES_APPROVAL=1` and `APPROVER=`; checker refuses without approvalMetadata in payload. +- ≥ **100M** → maker-checker + second reviewer + audit packet. +- Office 20 postings touching 1410/2100/2410 → audit packet mandatory. + +--- + +## 5) Durable `.posted_refs` (no double-post across operators) + +The duplicate guard uses a file (default `reconciliation/.posted_refs`). For production, make it **shared** so two operators on two machines cannot double-post the same ref. + +**Options:** + +| Option | How | +|--------|-----| +| **Shared path** | Set `POSTED_REFS_FILE` to a path on shared storage (NFS, shared volume). All runners use the same file. | +| **S3 (or similar)** | Set `POSTED_REFS_FILE` to a local path and set `POSTED_REFS_SYNC_CMD` to a command that pulls before and pushes after. Example: `POSTED_REFS_SYNC_CMD='aws s3 cp s3://bucket/omnl/.posted_refs $POSTED_REFS_FILE'` for pull; script runs sync after each append (or use a wrapper that syncs once at end). | +| **API** | If your platform supports “list journal entries by referenceNumber”, enforce uniqueness by checking before post (document as preferred when available). | + +**In scripts:** + +- `omnl-ledger-post-from-matrix.sh` uses `POSTED_REFS_FILE` (default `reconciliation/.posted_refs`). +- Optional sync for shared storage: + - `POSTED_REFS_SYNC_PULL_CMD` — run once before the posting loop (e.g. `aws s3 cp s3://bucket/omnl/.posted_refs $POSTED_REFS_FILE`). + - `POSTED_REFS_SYNC_PUSH_CMD` — run after each new ref is appended (e.g. `aws s3 cp $POSTED_REFS_FILE s3://bucket/omnl/.posted_refs`). + +**Success:** Two operators on two machines cannot post the same referenceNumber; refs are the single source of truth. + +--- + +## 6) Fire drill (DR + reversal + audit) + +Run once in a calm period to prove: detect → document → reverse → verify. + +1. **Maker** generates $1 payload with ref `DRILL--001`: + ```bash + source ids.env + REF="DRILL-$(date +%Y%m%d)-001" AMOUNT=1 OFFICE_ID=20 DEBIT_GL_ID=$ID_2100 CREDIT_GL_ID=$ID_1410 \ + bash scripts/omnl/omnl-je-maker.sh + ``` +2. **Checker** posts it: + `PAYLOAD_FILE=reconciliation/je-DRILL-....payload.json bash scripts/omnl/omnl-je-checker.sh` +3. **Movement monitor** — run and confirm it triggers (exit 2). +4. **Audit packet** — run and archive. +5. **Reverse** by reference: + `bash scripts/omnl/omnl-je-reverse-by-reference.sh DRILL--001` +6. **Audit packet** again — prove returned state. + +**Success:** End-to-end detect → document → reverse → verify. + +--- + +## 7) Path B/C gating (operator rail) + +The operator rail prints “Path B” (deposit) and “Path C” (disburse) templates only when ready: + +- **Path B:** Only if a payment type exists and savings products exist (and accounting enabled when we can detect it). +- **Path C:** Only if loan products exist (and loan accounting enabled when we can detect it). + +Otherwise it prints a “not ready” message and does not emit the template. This keeps the rail a safe truth tool. + +--- + +## Alert wiring + +Use a small wrapper so exit codes and JSON become alerts **without leaking secrets**. + +**Pattern:** + +1. Run the script; capture exit code and stdout/stderr. +2. If exit code = 2 (or your chosen “alert” code), send an alert. +3. Alert payload: script name, exit code, timestamp, and **only** the script’s JSON or summary line (scripts already avoid printing passwords). Do **not** include `.env`, `PASSWORD`, or raw curl. + +**Example (cron + Slack webhook):** + +```bash +# /usr/local/bin/omnl-alert-on-movement.sh +OUT=$(/path/to/scripts/omnl/omnl-monitor-office20-movement.sh 2>&1); EXIT=$? +if [ "$EXIT" = "2" ]; then + curl -s -X POST -H 'Content-Type: application/json' \ + -d "{\"text\": \"OMNL movement alert (exit $EXIT): ${OUT}\"}" \ + "$SLACK_WEBHOOK_URL" +fi +exit $EXIT +``` + +**Example (PagerDuty):** Use their CLI or API with a summary like “OMNL Office 20 movement detected” and attach the JSON in a details field, not in the title. + +**Success:** Alerts fire when movement or drift is detected; no credentials in alerts. + +--- + +## Closure delete (high-risk; avoid if possible) + +**DELETE /glclosures/{id}** reopens a period and is a high-risk operational pattern. Prefer: set closure dates so the intended posting date stays open until after you post, or use an "operations window" checklist (post first, then run closure script). If you must reopen: use a logged change record, post the JE, then re-run the closure script immediately and generate an audit packet before/after. diff --git a/docs/04-configuration/mifos-omnl-central-bank/README.md b/docs/04-configuration/mifos-omnl-central-bank/README.md index e5d7562..6e0db1f 100644 --- a/docs/04-configuration/mifos-omnl-central-bank/README.md +++ b/docs/04-configuration/mifos-omnl-central-bank/README.md @@ -15,6 +15,7 @@ Configuration documentation for Apache Fineract + Mifos X as the **OMNL** (Organ | [README.md](README.md) | This overview. | | [MIGRATION_AND_LEDGER_ALLOCATION_MEMORANDUM.md](MIGRATION_AND_LEDGER_ALLOCATION_MEMORANDUM.md) | **Migration & ledger allocation** — Opening balance, Treasury Denomination Conversion (Option A), client registry, T-001–T-001B–T-008; compliance summary (§8.5). | | [LEDGER_ALLOCATION_GL_MAPPING.md](LEDGER_ALLOCATION_GL_MAPPING.md) | GL mapping and implementation — Memo GL codes (1000, 1050, 2000, 2100, 3000) to Fineract; journal entry posting. | +| [OMNL_JOURNAL_LEDGER_MATRIX.md](OMNL_JOURNAL_LEDGER_MATRIX.md) | **Journal/ledger matrix** — Head Office + all entities; full GL; IPSAS compliance; API posting to OMNL Hybx. Machine-readable [omnl-journal-matrix.json](omnl-journal-matrix.json). | | [LEDGER_ALLOCATION_POSTING_RUNBOOK.md](LEDGER_ALLOCATION_POSTING_RUNBOOK.md) | **One-page runbook** — Pre-posting checklist, journal entry table, post-posting reconciliation, sign-off and audit. | | [FINERACT_API_REFERENCE.md](FINERACT_API_REFERENCE.md) | Fineract REST API for currency, GL, exchange rates; GRU/SDR/XAU support. | | [CHART_OF_ACCOUNTS.md](CHART_OF_ACCOUNTS.md) | OMNL CoA structure, account codes, M00/M0/M1 mapping. | @@ -22,6 +23,18 @@ Configuration documentation for Apache Fineract + Mifos X as the **OMNL** (Organ | [FX_AND_VALUATION.md](FX_AND_VALUATION.md) | XAU triangulation, rate matrix, revaluation, unrealized/realized accounts. | | [REGULATORY_AND_REPORTING.md](REGULATORY_AND_REPORTING.md) | Monetary aggregates, reserve adequacy, FX limits, audit. | | [POST_DEPLOYMENT_VALIDATION_CHECKLIST.md](POST_DEPLOYMENT_VALIDATION_CHECKLIST.md) | Post-deployment validation and sign-off. | +| [SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md](SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md) | **Samama Group LLC (Azerbaijan)** — Create office and transfer 5B USD M1 from Head Office (Phase C interoffice pattern). Script: `scripts/omnl/omnl-office-create-samama.sh`. | +| [OMNL_OFFICES_POPULATE.md](OMNL_OFFICES_POPULATE.md) | Populate entities as Offices (2–19 from [OMNL_ENTITY_MASTER_DATA.json](OMNL_ENTITY_MASTER_DATA.json)); remove as clients. | +| [OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md](OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md) | Phase C interoffice (1410/2410/2100); T-Samama 5B. | +| [OPERATING_RAILS.md](OPERATING_RAILS.md) | **Controls + reconciliation:** Journal schema, guardrails, closures, idempotency, resolve_ids, audit packet, reversal, maker-checker, monitoring, CI. | +| [OFFICE_20_AUDIT_PACKET.md](OFFICE_20_AUDIT_PACKET.md) | Office 20 audit packet layout (snapshot, computed_balances, recent JEs, manifest). | +| [OFFICE_20_DR_RUNBOOK.md](OFFICE_20_DR_RUNBOOK.md) | Disaster recovery: backups, reversal by referenceNumber, recovery steps. | +| [OMNL_PRODUCT_NAMESPACE_OFFICE20.md](OMNL_PRODUCT_NAMESPACE_OFFICE20.md) | Product naming and accounting convention for Office 20 (B/C readiness). | +| [OFFICE_2_SHAMRAYAN_RUNBOOK.md](OFFICE_2_SHAMRAYAN_RUNBOOK.md) | **Office 2 (Shamrayan Enterprises)** — Funding tranche Rail B (HO → Office 2), audit, closure, artifact packaging, upload; P2P settlement pointer. | +| [CRUNCHYGALAXY_OFFICE_AND_1B_FUNDING.md](CRUNCHYGALAXY_OFFICE_AND_1B_FUNDING.md) | **Crunchygalaxy (Office 21)** — Create office + 1.0B M1 funding (Rail B), audit, closure, packaging, upload. | +| [P2P_SETTLEMENT_CRUNCHYGALAXY_RAIL.md](P2P_SETTLEMENT_CRUNCHYGALAXY_RAIL.md) | P2P banking rail: HYBX → CrunchyGalaxy settlement (request/response/capture, mirror entry, close package). | +| [OMNL_OFFICE_ADDRESS_BOOK.md](OMNL_OFFICE_ADDRESS_BOOK.md) | **Address book:** Per-office API Banking Rail instructions and secrets reference (vault path only; no secrets in repo). | +| [OMNL_OFFICE_MASTER_RUNBOOK_INDEX.md](OMNL_OFFICE_MASTER_RUNBOOK_INDEX.md) | **Master Runbook index:** Every office has one Master Runbook and optional sub-runbooks (funding, P2P, audit, DR, upload). | ## Scripts diff --git a/docs/04-configuration/mifos-omnl-central-bank/SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md b/docs/04-configuration/mifos-omnl-central-bank/SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md new file mode 100644 index 0000000..30e5429 --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md @@ -0,0 +1,177 @@ +# Samama Group LLC — Office Creation and 5B USD M1 Transfer + +**Purpose:** Create a new **Office** in the OMNL/HYBX Fineract instance for **Samama Group LLC** (Azerbaijan) and transfer **5,000,000,000 USD M1** from Head Office to this office using the same interoffice pattern as Phase C (Due-To/Due-From). + +**Tenancy:** [omnl.hybxfinance.io](https://omnl.hybxfinance.io/) — tenant `omnl`. Credentials in `omnl-fineract/.env` or root `.env`. + +--- + +## 1. Legal entity details (for office profile) + +| Field | Value | +|-------|--------| +| **Company name** | Samama Group LLC | +| **Company registration (TIN)** | 1703722701 | +| **Legal address** | Sabail District, Nizami, Home 1, Baku City, AZ1001, Azerbaijan | +| **Legal form** | Limited Liability Company | +| **Authorized capital** | 10.00 AZN | +| **State registration date** | 10.01.2024 | +| **Fiscal year** | 01.01 – 31.12 | + +--- + +## 2. Authorized representative + +| Field | Value | +|-------|--------| +| **Director / legal representative** | Mrs. Samira Balahajiyeva (Samira Balahajiyeva Beidadash Daughter) | +| **Passport number** | C01676881 | +| **Passport issue** | 07.05.2017 | +| **Passport expiry** | 06.05.2027 | +| **Date of birth** | 08.01.1980 | +| **Nationality** | Azerbaijan | + +--- + +## 3. Banking details (settlement and ledger mapping) + +| Field | Value | +|-------|--------| +| **Primary bank** | Ziraat Bank Azerbaijan OJSC, Azadliq Avenue 111, Baku, Azerbaijan | +| **SWIFT** | TCZBAZ22 | + +**EUR:** IBAN AZ16TCZB40150978015351400107, Account 018065704, Correspondent SOGEFRPPXXX + +**USD (for 5B M1 mapping):** IBAN AZ76TCZB40150840015351400107, Account 8900492600, SWIFT TCZBAZ22 + +**AZN:** IBAN AZ91TCZB40050944015351400107 + +**Bank officers:** Eyyub Shafisoy, Sabir Salimli (eyyub.shafisoy@ziraatbank.az, sabir.salimli@ziraatbank.az) + +--- + +## 4. Technical infrastructure + +| Field | Value | +|-------|--------| +| **VPS** | 13.214.56.203, user `ubuntu`, Ubuntu 22.04.5 LTS | +| **SSH** | Port 3210 | +| **Domain** | https://siemb-samama.com | +| **Ethereum API** | Alchemy endpoint (eth-mainnet.g.alchemy.com/v2/…) | +| **File upload S2S** | https://upload.siemb-samama.com/ (samama / S@mama678) | + +--- + +## 5. Security and compliance + +- **OS:** CIS Ubuntu 22.04 LTS, CIS Nginx, CIS PostgreSQL +- **Auth:** JWT (users), Signed JWT (S2S), optional mTLS +- **Rate limits:** User API 100 req/min, S2S 1000 req/min +- **Database:** PostgreSQL, SCRAM-SHA-256, encrypted backups +- **OWASP:** API Security Top 10, input validation, scope-based authorization + +--- + +## 6. Fineract office creation (API) + +The Fineract **POST /offices** API accepts: `name`, `parentId`, `openingDate`, `externalId`, `dateFormat`, `locale`. Extended fields (address, contactPerson, bankDetails, customLedgerMapping) are **not** in the standard Fineract 1.x schema; they are documented above for reference and can be stored in the UI or external master data. + +**Minimal payload used by the script:** + +```json +{ + "name": "Samama Group LLC - Azerbaijan", + "parentId": 1, + "openingDate": "2024-01-10", + "externalId": "SAMAMA-AZ-1703722701", + "dateFormat": "yyyy-MM-dd", + "locale": "en" +} +``` + +--- + +## 7. 5B USD M1 transfer (GL and journal entries) + +Same pattern as Phase C interoffice (e.g. T-004 TAJ): **only M1 (2100)** at the office; HO debits 2100 and credits 2410; office debits 1410 and credits 2100. + +| Leg | Office | Debit | Credit | Amount (USD) | +|-----|--------|-------|--------|--------------| +| **T-Samama-HO** | Head Office (1) | 2100 (M1) | 2410 | 5,000,000,000 | +| **T-Samama-OF** | Samama (new office) | 1410 | 2100 (M1) | 5,000,000,000 | + +**Prerequisites:** + +- GL accounts **1410** (Due From Head Office) and **2410** (Due To Offices) exist (`bash scripts/omnl/omnl-gl-accounts-create.sh` or Phase C interoffice setup). +- Sufficient M1 (2100) balance at Head Office to debit 5B (e.g. after Phase A+B and T-001C). + +--- + +## 8. Execution order (prerequisites) + +1. **GL accounts** — Ensure 1000, 1050, 2000, 2100, 3000, **1410**, **2410** exist (e.g. `bash scripts/omnl/omnl-gl-accounts-create.sh`). +2. **Head Office M1** — If following the full migration, post Phase A+B and T-001C so HO has 2100 (M1) to debit; otherwise ensure sufficient 2100 balance. +3. **Create office and post 5B** — Run the script in §9 (Option A or B). + +--- + +## 9. Runbook: create office and post 5B M1 + +### Option A — One script (recommended) + +From repo root with `omnl-fineract/.env` set: + +```bash +# Preview (create office payload + journal entries, no POST) +DRY_RUN=1 bash scripts/omnl/omnl-office-create-samama.sh + +# Create Samama office (if not exists) and post 5B M1 transfer +bash scripts/omnl/omnl-office-create-samama.sh +``` + +The script: + +1. **GET /offices** and looks for `externalId=SAMAMA-AZ-1703722701`. If found, uses that office id. +2. If not found, **POST /offices** with the minimal payload above. +3. **GET /glaccounts** and resolves 2100, 2410, 1410 to GL account ids. +4. **POST /journalentries** for T-Samama-HO (officeId=1, Dr 2100 Cr 2410, 5B) and T-Samama-OF (officeId=Samama, Dr 1410 Cr 2100, 5B). + +**Optional env:** + +- `OPENING_DATE=2024-01-10` (default) +- `SAMAMA_OFFICE_NAME="Samama Group LLC - Azerbaijan"` +- `SAMAMA_EXTERNAL_ID=SAMAMA-AZ-1703722701` +- `SKIP_TRANSFER=1` — create office only, do not post journal entries +- `TRANSACTION_DATE=yyyy-MM-dd` — journal entry date (default: today) + +### Option B — Create office only, then transfer via matrix + +```bash +# 1. Create office only +SKIP_TRANSFER=1 bash scripts/omnl/omnl-office-create-samama.sh +# Note the printed OFFICE_ID_SAMAMA=... + +# 2. Edit omnl-journal-matrix-samama-5b.json: set the second entry’s "officeId" to that id (e.g. 20). + +# 3. Post the two entries from the matrix +JOURNAL_MATRIX=docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-samama-5b.json \ + bash scripts/omnl/omnl-ledger-post-from-matrix.sh +``` + +--- + +## 10. Before transferring 5B USD M1 — checklist + +1. **GL mapping:** 1410 (Due From HO), 2410 (Due To Offices), 2100 (M1) exist in Fineract. +2. **Head Office** has sufficient 2100 (M1) balance to debit 5B (Phase A+B and T-001C already posted if following full migration). +3. **Office** has valid opening date and is under parent 1. +4. **Reconciliation:** After posting, trial balance at Samama office: 1410 = 5B Dr, 2100 = 5B Cr; HO 2410 increases by 5B Cr. + +--- + +## 11. References + +- [OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md](OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md) — Phase C pattern (1410/2410/2100) +- [LEDGER_ALLOCATION_POSTING_RUNBOOK.md](LEDGER_ALLOCATION_POSTING_RUNBOOK.md) — Pre-post checklist +- [omnl-journal-matrix-samama-5b.json](omnl-journal-matrix-samama-5b.json) — Machine-readable journal entries for 5B M1 +- [scripts/omnl/README.md](../../scripts/omnl/README.md) — Script list diff --git a/docs/04-configuration/mifos-omnl-central-bank/TRANCHE_1_500M_RUNBOOK.md b/docs/04-configuration/mifos-omnl-central-bank/TRANCHE_1_500M_RUNBOOK.md new file mode 100644 index 0000000..af7ee6d --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/TRANCHE_1_500M_RUNBOOK.md @@ -0,0 +1,437 @@ +# Tranche #1 — 500M USD M1 from Samama Office (officeId=20) + +Production-safe runbook to move **500,000,000 USD M1** out of Office 20 using the same JE rails as the 5B. 500M is **material** (≥100M): maker-checker + approver metadata + audit packet + durable posted_refs required. + +**Rail choice:** **Rail A** = treasury reduction only (single JE at Office 20). **Rail B** = allocation to another office (two legs: Office 20 out, then Office X in). No other platform prep needed beyond posted_refs sync, closures, and audit packet. + +--- + +## Final confirmation before execution + +Choose one and execute: + +| Option | Use case | +|--------|----------| +| **Rail A** | 500M is economically “released” or externally settled; no other OMNL office is being credited. Single JE at Office 20 → post-audit shows 1410 and 2100 at 4.5B. | +| **Rail B** | 500M is moving inside the OMNL tenant; another office must show 1410 Dr 500M. Run Leg 1 then Leg 2 with `export X=`. | + +**Sanity check before pressing Enter (material posting ≥100M):** + +- [ ] posted_refs sync pulled (or on shared storage) +- [ ] IDs resolved (`source ids.env`) +- [ ] `REQUIRES_APPROVAL=1` and `APPROVER` set for maker +- [ ] Pre-audit packet generated +- [ ] Posting inside an open GL period +- [ ] Rail A vs Rail B (and, if Rail B, destination officeId X) decided + +If all are true, execution is operationally safe under the current rail design. + +**One-line decision:** Treasury reduction only → Rail A. Destination officeId = X → Rail B (Leg 1 at 20 → Leg 2 at X). No additional validation layers required before posting. + +**After execution:** (1) Execute the selected rail. (2) Immediately generate the post-audit packet. (3) Confirm `computed_balances.json` reflects: **Rail A** — Office 20 → 1410 = 4.5B, 2100 = 4.5B; **Rail B** — Office 20 −500M, Office X +500M (symmetric). (4) Confirm movement monitor triggers if enabled. (5) Archive the audit packet off-box. For rapid symmetry validation, paste only the relevant portion of `computed_balances.json` (no secrets, no URLs). + +--- + +## Copy-paste execution blocks + +Assumes: checklist satisfied, posting date 2026-02-24, approval required (≥100M), Office 20. Replace `<>` with the approver’s identifier. Run from repo root. + +### Rail A — Treasury reduction (single block) + +```bash +############################################## +# TRANCHE 1 – 500M (Rail A – Treasury Reduction) +############################################## + +# 1. Load environment +source omnl-fineract/.env + +# 2. Resolve GL and payment IDs +bash scripts/omnl/resolve_ids.sh +source ids.env + +# 3. Ensure GL closures (idempotent) +bash scripts/omnl/omnl-gl-closures-post.sh + +# 4. Pre-audit snapshot (state BEFORE posting) +bash scripts/omnl/omnl-audit-packet-office20.sh + +# 5. Define tranche variables +export REFERENCE_NUMBER="SAMAMA-20-20260224-TR1-500M" +export TX_DATE="2026-02-24" +export AMOUNT="500000000" + +# 6. Maker step (requires approval ≥ 10M) +REQUIRES_APPROVAL=1 APPROVER="<>" \ +REFERENCE_NUMBER="$REFERENCE_NUMBER" \ +TX_DATE="$TX_DATE" \ +OFFICE_ID=20 \ +CURRENCY=USD \ +DEBIT_GL_ID="$ID_2100" \ +CREDIT_GL_ID="$ID_1410" \ +AMOUNT="$AMOUNT" \ +bash scripts/omnl/omnl-je-maker.sh + +# 7. Checker step (POST to Fineract) +PAYLOAD_FILE="reconciliation/je-$REFERENCE_NUMBER.payload.json" \ +bash scripts/omnl/omnl-je-checker.sh + +# 8. Post-audit snapshot (state AFTER posting) +bash scripts/omnl/omnl-audit-packet-office20.sh + +############################################## +# EXPECTED RESULT (Rail A) +# Office 20: +# 1410 (Dr) = 4,500,000,000 +# 2100 (Cr) = 4,500,000,000 +############################################## +``` + +### Rail B — Allocation to Office X + +Set destination office, then run Leg 1, then Leg 2. + +```bash +export X= +``` + +**Leg 1 (Office 20 reduction):** + +```bash +export REFERENCE_NUMBER="SAMAMA-20-20260224-TR1-500M-L1" + +REQUIRES_APPROVAL=1 APPROVER="<>" \ +REFERENCE_NUMBER="$REFERENCE_NUMBER" \ +TX_DATE="2026-02-24" \ +OFFICE_ID=20 \ +CURRENCY=USD \ +DEBIT_GL_ID="$ID_2100" \ +CREDIT_GL_ID="$ID_1410" \ +AMOUNT="500000000" \ +bash scripts/omnl/omnl-je-maker.sh + +PAYLOAD_FILE="reconciliation/je-$REFERENCE_NUMBER.payload.json" \ +bash scripts/omnl/omnl-je-checker.sh +``` + +**Leg 2 (Office X allocation):** + +```bash +export REFERENCE_NUMBER="SAMAMA-$X-20260224-TR1-500M-L2" + +REQUIRES_APPROVAL=1 APPROVER="<>" \ +REFERENCE_NUMBER="$REFERENCE_NUMBER" \ +TX_DATE="2026-02-24" \ +OFFICE_ID="$X" \ +CURRENCY=USD \ +DEBIT_GL_ID="$ID_1410" \ +CREDIT_GL_ID="$ID_2100" \ +AMOUNT="500000000" \ +bash scripts/omnl/omnl-je-maker.sh + +PAYLOAD_FILE="reconciliation/je-$REFERENCE_NUMBER.payload.json" \ +bash scripts/omnl/omnl-je-checker.sh + +# Post-audit snapshot +bash scripts/omnl/omnl-audit-packet-office20.sh +``` + +**Expected result (Rail B):** Office 20 −500M on 1410 & 2100 (4.5B); Office X +500M on 1410 & 2100. + +**After execution (both rails):** (1) Confirm `computed_balances.json`. (2) Confirm movement monitor alert. (3) Archive the audit packet off-box. + +--- + +## Per-PDF completion (artifact upload to Samama) + +The PDF “File upload procedure” requires uploading artifacts to the Samama server and obtaining confirmation. To be **100% per PDF** after a tranche is posted: + +1. **Archive off-box** — Post-audit packet (and optionally pre-audit) in your own storage (done or planned). +2. **Upload to Samama** — Zip the post-audit packet folder (e.g. `audit-office20-`) and the `.meta`/hash line; upload to the Samama upload URL per the PDF (credentials in vault; do not paste in terminals). Use the upload procedure from the “File upload procedure” PDF. +3. **Log confirmation** — Record “confirmation received” from Samama (per PDF: contact them after upload for confirmation). + +**Status:** Tranche **posted on-ledger** (HTTP 200, JE in API, computed_balances 4.5B) is confirmed. **Artifact upload to Samama** is a separate step; until that and confirmation are done, you are at **posted + ready to upload**. + +--- + +### Upload + confirmation checklist (100% per PDF) + +| Step | Action | Status | +|------|--------|--------| +| Ledger posting | JE posted (ref SAMAMA-20-20260224-TR1-500M) | ✅ Complete | +| Audit packet | Post-audit folder generated | ✅ Complete | +| Closures | Re-locked after posting | ✅ Complete | +| Movement monitor | Fires on Office 20 movement | ✅ Complete | +| Off-box archive | Archive packet in your storage | ⏳ Pending until done | +| **Zip packet** | Include: snapshot.json, snapshot.meta, computed_balances.json, recent_journal_entries.json, manifest.json; optionally README.txt with folder hash or audit_log.jsonl line | — | +| **Upload** | Upload zip to `https://upload.siemb-samama.com/` (credentials from vault; do not store in scripts or history) | ❌ Not yet | +| **Contact Samama** | Per PDF: contact after upload for confirmation | ❌ Not yet | +| **Log confirmation** | Record as below | ❌ Not yet | + +**Log entry (after confirmation received):** + +``` +2026-02-24 +Ref: SAMAMA-20-20260224-TR1-500M +Upload: Completed +Confirmation: Received +``` + +Only after upload and confirmation are logged are you at **100% per PDF**. Economically and technically the tranche is complete; procedure is complete once this checklist is done. + +--- + +### 1) Prepare the ZIP (Tranche #1 post-audit folder) + +Assumes post-audit folder: `reconciliation/audit-office20-20260224-114831`. Run from repo root. + +```bash +############################################## +# TRANCHE 1 – 500M +# Artifact Packaging for Samama Upload +############################################## + +export AUDIT_FOLDER="reconciliation/audit-office20-20260224-114831" +export ZIP_NAME="SAMAMA-20-20260224-TR1-500M-AUDIT.zip" + +# Optional: README with hash reference +HASH_LINE=$(tail -n 1 audit_log.jsonl 2>/dev/null || echo "Hash not found in audit_log.jsonl") +cat > "$AUDIT_FOLDER/README.txt" <> tranche_upload_log.jsonl +``` + +--- + +### Completion state (100% per PDF) + +| Stage | Status | +|---------------------|--------| +| Ledger posting | ✅ | +| Audit packet | ✅ | +| Off-box archive | ✅ | +| Samama upload | ✅ | +| Confirmation logged | ✅ | + +At that point, Tranche #1 is **closed — fully compliant with PDF requirements**. + +For later tranches: same process with new ref (e.g. `SAMAMA-20--TR2-500M`), new audit packet, same zip/upload/contact/log. Optional: reusable `tranche-upload.sh` or SFTP automation if permitted. + +--- + +# Execute Tranche #1 — Rail A (Treasury reduction only) + +## Step 1 — Prep (required) + +```bash +source omnl-fineract/.env + +# resolve IDs and payment type +bash scripts/omnl/resolve_ids.sh +source ids.env + +# closures (idempotent) +bash scripts/omnl/omnl-gl-closures-post.sh + +# pre-audit packet (state BEFORE tranche) +bash scripts/omnl/omnl-audit-packet-office20.sh +``` + +Ensure `POSTED_REFS_SYNC_PULL_CMD` is set (or you’re on shared storage) before posting. + +--- + +## Step 2 — Maker (build payload for 500M) + +Use a fixed ref for tranche #1. Replace `<>` with the approver’s identifier. + +```bash +export REFERENCE_NUMBER="SAMAMA-20-20260224-TR1-500M" +export TX_DATE="2026-02-24" +export AMOUNT="500000000" + +REQUIRES_APPROVAL=1 APPROVER="<>" \ +REFERENCE_NUMBER="$REFERENCE_NUMBER" \ +TX_DATE="$TX_DATE" \ +OFFICE_ID=20 \ +CURRENCY=USD \ +DEBIT_GL_ID="$ID_2100" \ +CREDIT_GL_ID="$ID_1410" \ +AMOUNT="$AMOUNT" \ +bash scripts/omnl/omnl-je-maker.sh +``` + +Output: `reconciliation/je-SAMAMA-20-20260224-TR1-500M.payload.json` and `.payload.sha256`. + +--- + +## Step 3 — Checker (post payload) + +```bash +PAYLOAD_FILE="reconciliation/je-$REFERENCE_NUMBER.payload.json" \ +bash scripts/omnl/omnl-je-checker.sh +``` + +Expect: HTTP 200; posted_refs updated (and pushed if `POSTED_REFS_SYNC_PUSH_CMD` is set). + +--- + +## Step 4 — Post-audit (required for material posting) + +```bash +bash scripts/omnl/omnl-audit-packet-office20.sh +``` + +--- + +## Step 5 — Expected balances after Rail A + +Office 20 (computed + trial balance if available): + +- **1410 Dr = 4.5B** (5B − 500M) +- **2100 Cr = 4.5B** (5B − 500M) + +Verify in the new audit packet’s `computed_balances.json`. If uploading artifacts to Samama: use the upload endpoint/process from your PDF; upload the post-audit packet (zip) + `.meta`/hash. Server/API host context is in the technical PDF. + +--- + +# Rail B — Allocation to another office (destination officeId = X) + +If the tranche is **sending to Office X**, run **two legs**. Leg 1 reduces Office 20; Leg 2 credits the destination office. + +### Leg 1 (Office 20 — same pattern as Rail A, different ref) + +**Ref:** `SAMAMA-20-20260224-TR1-500M-L1` +**JE:** Dr 2100 / Cr 1410, 500M + +```bash +export REFERENCE_NUMBER="SAMAMA-20-20260224-TR1-500M-L1" +export TX_DATE="2026-02-24" +export AMOUNT="500000000" + +REQUIRES_APPROVAL=1 APPROVER="<>" \ +REFERENCE_NUMBER="$REFERENCE_NUMBER" TX_DATE="$TX_DATE" OFFICE_ID=20 \ +DEBIT_GL_ID="$ID_2100" CREDIT_GL_ID="$ID_1410" AMOUNT="$AMOUNT" \ +bash scripts/omnl/omnl-je-maker.sh + +PAYLOAD_FILE="reconciliation/je-$REFERENCE_NUMBER.payload.json" \ +bash scripts/omnl/omnl-je-checker.sh +``` + +### Leg 2 (Destination Office X — replace X with actual officeId) + +**Ref:** `SAMAMA-X-20260224-TR1-500M-L2` +**JE:** Dr 1410 / Cr 2100, 500M (credits Office X treasury) + +Set `X` to the destination officeId (e.g. `2` for Shamrayan, or the target office id). Ensure Office X is in `ALLOWED_OFFICE_IDS` and has closures if required. + +```bash +X=2 # example: destination officeId — replace with actual id + +export REFERENCE_NUMBER="SAMAMA-${X}-20260224-TR1-500M-L2" +export TX_DATE="2026-02-24" +export AMOUNT="500000000" + +REQUIRES_APPROVAL=1 APPROVER="<>" \ +REFERENCE_NUMBER="$REFERENCE_NUMBER" TX_DATE="$TX_DATE" OFFICE_ID="$X" \ +DEBIT_GL_ID="$ID_1410" CREDIT_GL_ID="$ID_2100" AMOUNT="$AMOUNT" \ +bash scripts/omnl/omnl-je-maker.sh + +PAYLOAD_FILE="reconciliation/je-$REFERENCE_NUMBER.payload.json" \ +bash scripts/omnl/omnl-je-checker.sh +``` + +After both legs: run post-audit for Office 20 and (if desired) for Office X. Office X should show 1410 Dr = 500M, 2100 Cr = 500M for this tranche. + +--- + +## Samama artifact upload (API = URL + credentials) + +If you must send audit artifacts to Samama: + +- **Endpoint:** the **URL** (e.g. `https://upload.siemb-samama.com/`) is the API/base URL. +- **Auth:** credentials from your PDF (API key, token, or user/password) are separate — store in vault; do not paste in shared terminals. + +So: **API = URL (endpoint) + key/credentials**. Use the upload URL plus the stored credentials per your PDF procedure. Recommended upload: the **audit packet folder** (or a zip) plus the packet’s `.meta`/hash line for integrity. + +--- + +## Variable summary (maker) + +| Runbook / env | Script variable | Notes | +|--------------------|-------------------|--------------------------| +| REFERENCE_NUMBER | REF | Either name works | +| TX_DATE | TRANSACTION_DATE | Either name works | +| DEBIT_GL_ID | DEBIT_GL_ID | From ids.env (e.g. 2100) | +| CREDIT_GL_ID | CREDIT_GL_ID | From ids.env (e.g. 1410) | +| AMOUNT | AMOUNT | Minor units (500000000) | +| REQUIRES_APPROVAL=1, APPROVER | Required for ≥10M | Use for 500M | + +--- + +## References + +- [MATERIAL_POSTING_POLICY.md](MATERIAL_POSTING_POLICY.md) — Thresholds and maker/checker rules +- [PRODUCTION_OPS_OFFICE20.md](PRODUCTION_OPS_OFFICE20.md) — Baselines, alerts, durable posted_refs +- [OPERATING_RAILS.md](OPERATING_RAILS.md) — JE schema, closures, idempotency diff --git a/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-m0-m1-supplement-11b.json b/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-m0-m1-supplement-11b.json new file mode 100644 index 0000000..b3bf62b --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-m0-m1-supplement-11b.json @@ -0,0 +1,17 @@ +{ + "description": "OMNL M0 to M1 supplement at HO for offices 9-19 transfer (11B). Post before phase-c-offices-9-19.", + "source": "OMNL_TRANSACTION_SEQUENCE_FULL.md", + "currencyCode": "USD", + "dateFormat": "yyyy-MM-dd", + "locale": "en", + "entries": [ + { + "memo": "T-001C-SUPPL", + "officeId": 1, + "debitGlCode": "2000", + "creditGlCode": "2100", + "amount": 11000000000, + "narrative": "M0 to M1 at HO 11B for offices 9-19" + } + ] +} diff --git a/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-phase-a-b-only.json b/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-phase-a-b-only.json new file mode 100644 index 0000000..96c90ee --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-phase-a-b-only.json @@ -0,0 +1,12 @@ +{ + "description": "OMNL Phase A+B and M0→M1 conversion. T-001, T-001B, T-001C (Dr 2000 Cr 2100, 470B). Post before Phase C interoffice.", + "source": "OMNL_JOURNAL_LEDGER_MATRIX.md", + "currencyCode": "USD", + "dateFormat": "yyyy-MM-dd", + "locale": "en", + "entries": [ + {"memo": "T-001", "officeId": 1, "debitGlCode": "1000", "creditGlCode": "2000", "amount": 900000000000, "narrative": "Opening Balance Migration (Head Office) — M0", "ipsasRef": "IPSAS 3, 28"}, + {"memo": "T-001B", "officeId": 1, "debitGlCode": "1050", "creditGlCode": "2000", "amount": 250000000000, "narrative": "Treasury Conversion — Transfer to Reserve (M0); Head Office", "ipsasRef": "IPSAS 28, 29"}, + {"memo": "T-001C", "officeId": 1, "debitGlCode": "2000", "creditGlCode": "2100", "amount": 470000000000, "narrative": "M0 to M1 conversion at HO — 470B for distribution to offices", "ipsasRef": "IPSAS 28"} + ] +} diff --git a/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-phase-c-interoffice.json b/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-phase-c-interoffice.json new file mode 100644 index 0000000..192af1e --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-phase-c-interoffice.json @@ -0,0 +1,25 @@ +{ + "description": "OMNL Phase C — M1 only. HO debits 2100 (M1); offices credit 2100 (M1) only. Post after T-001, T-001B, T-001C (M0→M1 conversion).", + "source": "OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md", + "currencyCode": "USD", + "dateFormat": "yyyy-MM-dd", + "locale": "en", + "entries": [ + { "memo": "T-002A-HO", "officeId": 1, "debitGlCode": "2100", "creditGlCode": "2410", "amount": 2900000000, "narrative": "Due To Shamrayan — M1" }, + { "memo": "T-002A-OF", "officeId": 2, "debitGlCode": "1410", "creditGlCode": "2100", "amount": 2900000000, "narrative": "Due From HO — Shamrayan M1" }, + { "memo": "T-002B-HO", "officeId": 1, "debitGlCode": "2100", "creditGlCode": "2410", "amount": 2100000000, "narrative": "Due To Shamrayan — M1 restricted" }, + { "memo": "T-002B-OF", "officeId": 2, "debitGlCode": "1410", "creditGlCode": "2100", "amount": 2100000000, "narrative": "Due From HO — Shamrayan M1 restricted" }, + { "memo": "T-003-HO", "officeId": 1, "debitGlCode": "2100", "creditGlCode": "2410", "amount": 350000000000, "narrative": "Due To HYBX — M1 escrow" }, + { "memo": "T-003-OF", "officeId": 3, "debitGlCode": "1410", "creditGlCode": "2100", "amount": 350000000000, "narrative": "Due From HO — HYBX M1 escrow" }, + { "memo": "T-004-HO", "officeId": 1, "debitGlCode": "2100", "creditGlCode": "2410", "amount": 5000000000, "narrative": "Due To TAJ — M1" }, + { "memo": "T-004-OF", "officeId": 4, "debitGlCode": "1410", "creditGlCode": "2100", "amount": 5000000000, "narrative": "Due From HO — TAJ M1" }, + { "memo": "T-005-HO", "officeId": 1, "debitGlCode": "2100", "creditGlCode": "2410", "amount": 5000000000, "narrative": "Due To Aseret — M1" }, + { "memo": "T-005-OF", "officeId": 5, "debitGlCode": "1410", "creditGlCode": "2100", "amount": 5000000000, "narrative": "Due From HO — Aseret M1" }, + { "memo": "T-006-HO", "officeId": 1, "debitGlCode": "2100", "creditGlCode": "2410", "amount": 5000000000, "narrative": "Due To Mann Li — M1" }, + { "memo": "T-006-OF", "officeId": 6, "debitGlCode": "1410", "creditGlCode": "2100", "amount": 5000000000, "narrative": "Due From HO — Mann Li M1" }, + { "memo": "T-007-HO", "officeId": 1, "debitGlCode": "2100", "creditGlCode": "2410", "amount": 50000000000, "narrative": "Due To OSJ — M1" }, + { "memo": "T-007-OF", "officeId": 7, "debitGlCode": "1410", "creditGlCode": "2100", "amount": 50000000000, "narrative": "Due From HO — OSJ M1" }, + { "memo": "T-008-HO", "officeId": 1, "debitGlCode": "2100", "creditGlCode": "2410", "amount": 50000000000, "narrative": "Due To Alltra — M1" }, + { "memo": "T-008-OF", "officeId": 8, "debitGlCode": "1410", "creditGlCode": "2100", "amount": 50000000000, "narrative": "Due From HO — Alltra M1" } + ] +} diff --git a/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-phase-c-offices-18-19-of-only.json b/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-phase-c-offices-18-19-of-only.json new file mode 100644 index 0000000..68cbb14 --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-phase-c-offices-18-19-of-only.json @@ -0,0 +1,10 @@ +{ + "description": "OMNL Phase C — Office legs only for 18 and 19 (post after offices 18-19 created). HO legs already posted.", + "currencyCode": "USD", + "dateFormat": "yyyy-MM-dd", + "locale": "en", + "entries": [ + {"memo": "T-018-OF", "officeId": 18, "debitGlCode": "1410", "creditGlCode": "2100", "amount": 1000000000, "narrative": "Due From HO — Nepal Rastra Bank M1 1B"}, + {"memo": "T-019-OF", "officeId": 19, "debitGlCode": "1410", "creditGlCode": "2100", "amount": 1000000000, "narrative": "Due From HO — Sanima Bank M1 1B"} + ] +} diff --git a/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-phase-c-offices-9-19.json b/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-phase-c-offices-9-19.json new file mode 100644 index 0000000..84f1c4a --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-phase-c-offices-9-19.json @@ -0,0 +1,31 @@ +{ + "description": "OMNL Phase C — M1 transfer to offices 9–19 (1B each). HO debits 2100, credits 2410; office debits 1410, credits 2100.", + "source": "OMNL_PHASE_C_INTEROFFICE_DUE_TO_DUE_FROM.md", + "currencyCode": "USD", + "dateFormat": "yyyy-MM-dd", + "locale": "en", + "entries": [ + {"memo": "T-009-HO", "officeId": 1, "debitGlCode": "2100", "creditGlCode": "2410", "amount": 1000000000, "narrative": "Due To FIDIS — M1 1B"}, + {"memo": "T-009-OF", "officeId": 9, "debitGlCode": "1410", "creditGlCode": "2100", "amount": 1000000000, "narrative": "Due From HO — FIDIS M1 1B"}, + {"memo": "T-010-HO", "officeId": 1, "debitGlCode": "2100", "creditGlCode": "2410", "amount": 1000000000, "narrative": "Due To Alpha Omega — M1 1B"}, + {"memo": "T-010-OF", "officeId": 10, "debitGlCode": "1410", "creditGlCode": "2100", "amount": 1000000000, "narrative": "Due From HO — Alpha Omega M1 1B"}, + {"memo": "T-011-HO", "officeId": 1, "debitGlCode": "2100", "creditGlCode": "2410", "amount": 1000000000, "narrative": "Due To SGI Capital — M1 1B"}, + {"memo": "T-011-OF", "officeId": 11, "debitGlCode": "1410", "creditGlCode": "2100", "amount": 1000000000, "narrative": "Due From HO — SGI Capital M1 1B"}, + {"memo": "T-012-HO", "officeId": 1, "debitGlCode": "2100", "creditGlCode": "2410", "amount": 1000000000, "narrative": "Due To Titan Financial — M1 1B"}, + {"memo": "T-012-OF", "officeId": 12, "debitGlCode": "1410", "creditGlCode": "2100", "amount": 1000000000, "narrative": "Due From HO — Titan Financial M1 1B"}, + {"memo": "T-013-HO", "officeId": 1, "debitGlCode": "2100", "creditGlCode": "2410", "amount": 1000000000, "narrative": "Due To Roy Walker PLLC — M1 1B"}, + {"memo": "T-013-OF", "officeId": 13, "debitGlCode": "1410", "creditGlCode": "2100", "amount": 1000000000, "narrative": "Due From HO — Roy Walker M1 1B"}, + {"memo": "T-014-HO", "officeId": 1, "debitGlCode": "2100", "creditGlCode": "2410", "amount": 1000000000, "narrative": "Due To SGI Partners LLC — M1 1B"}, + {"memo": "T-014-OF", "officeId": 14, "debitGlCode": "1410", "creditGlCode": "2100", "amount": 1000000000, "narrative": "Due From HO — SGI Partners M1 1B"}, + {"memo": "T-015-HO", "officeId": 1, "debitGlCode": "2100", "creditGlCode": "2410", "amount": 1000000000, "narrative": "Due To Tsunami Holdings AG — M1 1B"}, + {"memo": "T-015-OF", "officeId": 15, "debitGlCode": "1410", "creditGlCode": "2100", "amount": 1000000000, "narrative": "Due From HO — Tsunami M1 1B"}, + {"memo": "T-016-HO", "officeId": 1, "debitGlCode": "2100", "creditGlCode": "2410", "amount": 1000000000, "narrative": "Due To Anakatech — M1 1B"}, + {"memo": "T-016-OF", "officeId": 16, "debitGlCode": "1410", "creditGlCode": "2100", "amount": 1000000000, "narrative": "Due From HO — Anakatech M1 1B"}, + {"memo": "T-017-HO", "officeId": 1, "debitGlCode": "2100", "creditGlCode": "2410", "amount": 1000000000, "narrative": "Due To Anema Camden Walker — M1 1B"}, + {"memo": "T-017-OF", "officeId": 17, "debitGlCode": "1410", "creditGlCode": "2100", "amount": 1000000000, "narrative": "Due From HO — Anema Camden M1 1B"}, + {"memo": "T-018-HO", "officeId": 1, "debitGlCode": "2100", "creditGlCode": "2410", "amount": 1000000000, "narrative": "Due To Nepal Rastra Bank — M1 1B"}, + {"memo": "T-018-OF", "officeId": 18, "debitGlCode": "1410", "creditGlCode": "2100", "amount": 1000000000, "narrative": "Due From HO — Nepal Rastra Bank M1 1B"}, + {"memo": "T-019-HO", "officeId": 1, "debitGlCode": "2100", "creditGlCode": "2410", "amount": 1000000000, "narrative": "Due To Sanima Bank — M1 1B"}, + {"memo": "T-019-OF", "officeId": 19, "debitGlCode": "1410", "creditGlCode": "2100", "amount": 1000000000, "narrative": "Due From HO — Sanima Bank M1 1B"} + ] +} diff --git a/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-samama-5b.json b/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-samama-5b.json new file mode 100644 index 0000000..e2cada5 --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-samama-5b.json @@ -0,0 +1,25 @@ +{ + "description": "OMNL Phase C — Samama Group LLC (Azerbaijan): 5B USD M1 from Head Office. HO debits 2100, credits 2410; office leg debits 1410, credits 2100. Replace officeId in T-Samama-OF with actual Samama office id from GET /offices (externalId=SAMAMA-AZ-1703722701), or use scripts/omnl/omnl-office-create-samama.sh to create office and post in one go.", + "source": "SAMAMA_OFFICE_AND_5B_M1_TRANSFER.md", + "currencyCode": "USD", + "dateFormat": "yyyy-MM-dd", + "locale": "en", + "entries": [ + { + "memo": "T-Samama-HO", + "officeId": 1, + "debitGlCode": "2100", + "creditGlCode": "2410", + "amount": 5000000000, + "narrative": "Due To Samama Group LLC — M1 5B" + }, + { + "memo": "T-Samama-OF", + "officeId": 20, + "debitGlCode": "1410", + "creditGlCode": "2100", + "amount": 5000000000, + "narrative": "Due From HO — Samama Group LLC M1 5B" + } + ] +} diff --git a/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-shamrayan-2000-to-2100-correction.json b/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-shamrayan-2000-to-2100-correction.json new file mode 100644 index 0000000..d83ec9c --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix-shamrayan-2000-to-2100-correction.json @@ -0,0 +1,24 @@ +{ + "description": "Shamrayan (Office 2) correction: move 2.9B from 2000 (M0) to 2100 (M1). Result: 0 M0, 5B M1 at Office 2.", + "currencyCode": "USD", + "dateFormat": "yyyy-MM-dd", + "locale": "en", + "entries": [ + { + "memo": "T-002A-CORR-REV", + "officeId": 2, + "debitGlCode": "2000", + "creditGlCode": "1410", + "amount": 2900000000, + "narrative": "Reverse erroneous Cr 2000 at Shamrayan — move to 2100" + }, + { + "memo": "T-002A-CORR-M1", + "officeId": 2, + "debitGlCode": "1410", + "creditGlCode": "2100", + "amount": 2900000000, + "narrative": "Shamrayan M1 2.9B (was posted as 2000)" + } + ] +} diff --git a/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix.json b/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix.json new file mode 100644 index 0000000..cddaf0a --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/omnl-journal-matrix.json @@ -0,0 +1,99 @@ +{ + "description": "OMNL journal entries for API posting to OMNL Hybx (Fineract). Head Office and entities 2–8 per Migration Memorandum. officeId=1 for all; narrative identifies entity. IPSAS-aligned.", + "source": "OMNL_JOURNAL_LEDGER_MATRIX.md", + "currencyCode": "USD", + "dateFormat": "yyyy-MM-dd", + "locale": "en", + "entries": [ + { + "memo": "T-001", + "officeId": 1, + "debitGlCode": "1000", + "creditGlCode": "2000", + "amount": 900000000000, + "narrative": "Opening Balance Migration (Head Office)", + "ipsasRef": "IPSAS 3, 28" + }, + { + "memo": "T-001B", + "officeId": 1, + "debitGlCode": "1050", + "creditGlCode": "2000", + "amount": 250000000000, + "narrative": "Treasury Conversion — Transfer to Reserve (M0); Head Office", + "ipsasRef": "IPSAS 28, 29" + }, + { + "memo": "T-002A", + "officeId": 1, + "debitGlCode": "2000", + "creditGlCode": "2000", + "amount": 2900000000, + "narrative": "Shamrayan Available (M1) — Office 2", + "ipsasRef": "IPSAS 28" + }, + { + "memo": "T-002B", + "officeId": 1, + "debitGlCode": "2000", + "creditGlCode": "2100", + "amount": 2100000000, + "narrative": "Shamrayan Restricted — Office 2", + "ipsasRef": "IPSAS 28" + }, + { + "memo": "T-003", + "officeId": 1, + "debitGlCode": "2000", + "creditGlCode": "2100", + "amount": 350000000000, + "narrative": "HYBX Capitalization Escrow — Office 3", + "ipsasRef": "IPSAS 28" + }, + { + "memo": "T-004", + "officeId": 1, + "debitGlCode": "2000", + "creditGlCode": "2000", + "amount": 5000000000, + "narrative": "TAJ Allocation (M1) — Office 4", + "ipsasRef": "IPSAS 28" + }, + { + "memo": "T-005", + "officeId": 1, + "debitGlCode": "2000", + "creditGlCode": "2000", + "amount": 5000000000, + "narrative": "Aseret Allocation (M1) — Office 5", + "ipsasRef": "IPSAS 28" + }, + { + "memo": "T-006", + "officeId": 1, + "debitGlCode": "2000", + "creditGlCode": "2000", + "amount": 5000000000, + "narrative": "Mann Li Allocation (M1) — Office 6", + "ipsasRef": "IPSAS 28" + }, + { + "memo": "T-007", + "officeId": 1, + "debitGlCode": "2000", + "creditGlCode": "2000", + "amount": 50000000000, + "narrative": "OSJ Allocation (M1) — Office 7", + "ipsasRef": "IPSAS 28" + }, + { + "memo": "T-008", + "officeId": 1, + "debitGlCode": "2000", + "creditGlCode": "2000", + "amount": 50000000000, + "narrative": "Alltra Allocation (M1) — Office 8", + "ipsasRef": "IPSAS 28" + } + ] +} diff --git a/docs/04-configuration/mifos-omnl-central-bank/omnl-office-address-book.json b/docs/04-configuration/mifos-omnl-central-bank/omnl-office-address-book.json new file mode 100644 index 0000000..f4bf482 --- /dev/null +++ b/docs/04-configuration/mifos-omnl-central-bank/omnl-office-address-book.json @@ -0,0 +1,63 @@ +{ + "description": "OMNL Office Address Book — machine-readable. API Banking Rail: endpoint placeholders and secrets *reference* (vault path) only. No secrets stored. Use with OMNL_OFFICE_ADDRESS_BOOK.md.", + "offices": [ + { + "officeId": 1, + "entityName": "OMNL Head Office (DBIS) – Central Bank", + "externalId": null, + "masterRunbook": "OPERATING_RAILS.md", + "bankingRail": { + "role": "originator", + "settlementEndpoint": null, + "authMethod": null, + "secretsVaultPath": null, + "idempotencyKeyFormat": null, + "referenceFormat": null + } + }, + { + "officeId": 2, + "entityName": "Shamrayan Enterprises", + "externalId": null, + "masterRunbook": "OFFICE_2_SHAMRAYAN_RUNBOOK.md", + "bankingRail": { + "role": "p2p_recipient", + "settlementEndpoint": "https://banktransfer.devmindgroup.com", + "authMethod": "Bearer + API key", + "secretsVaultPath": "omnl/offices/2/p2p", + "idempotencyKeyFormat": "SHAMRAYAN-2--SET-", + "referenceFormat": "SHAMRAYAN-2--TR-