feat(sovereignty): Zoo repoint DONE + DAO/Z Safes DEPLOYED on 200200

kms/mpc.zoo.network cut over to the zoo cluster (Traefik file-provider CM +
Cloudflare DNS-01 + DNS flip to zoo LB; hanzo CR entry + ingresses removed).
Verified: public kms.zoo.network health 200 + zoo-kms login 200.

Zoo DAO + Z Safes deployed on 200200 (0x9011 @ live nonce 91, default salts):
  DAO  0x229599f227231d8C90fcF1a78589F5DC4b7A6962 (1/1 owner 0x9011)
  Z    0xb8BbCdde5E8713f9849D1520D71Bc08Af94E6F00 (1/1 owner 0x9011)
  TL   0x31C89A0509F7783b742B01Be9103c05BbF4B9510 (minDelay 86400, DAO proposer)
Block-production PROVEN: 5-set produced 13348-13354, all 5 converged.
(nonce-0 predictions 0x5232/0x3Be3 were unachievable; tool adapts to live nonce.)

Co-authored-by: Hanzo Dev <[email protected]>
This commit is contained in:
2026-07-14 11:53:20 -07:00
co-authored by Hanzo Dev
parent 5b9d46d401
commit 947f817b04
6 changed files with 108 additions and 29 deletions
+39 -23
View File
@@ -276,10 +276,11 @@ faucet deployed. Chain idle ~22h → no organic block in-session.
## Zoo crypto-sovereignty: own KMS + MPC + Safes — 2026-07-14
**STATUS: ✅ zoo-mpc LIVE (DKG + 3-of-5 sign PROVEN) · ✅ zoo-kms LIVE (auth PROVEN).
HOLD: kms/mpc.zoo.network repoint (cross-cluster DNS cutover) + DAO/Z Safes (Zoo EVM
200200 not producing blocks).** Zoo now matches Lux/Hanzo sovereignty — own MPC ring
+ own KMS, Zoo-branded, in `do-sfo3-zoo-k8s`. Manifests: `k8s/zoo-mpc/`, `k8s/zoo-kms/`.
**STATUS: ✅ zoo-mpc LIVE (DKG + 3-of-5 sign PROVEN) · ✅ zoo-kms LIVE (auth PROVEN) ·
✅ kms/mpc.zoo.network REPOINTED to the zoo cluster (owner-approved 2026-07-14) · ✅ Zoo
DAO + Z Safes DEPLOYED on 200200.** Zoo is fully crypto-sovereign — own MPC ring + own
KMS (Zoo-branded, `do-sfo3-zoo-k8s`) + own governance Safes. Manifests: `k8s/zoo-mpc/`,
`k8s/zoo-kms/`, `manifests/safes.yaml`.
### Secret enumeration (INVESTIGATE — proven, non-destructive)
`kms.zoo.network` → shared **Hanzo** KMS (`luxfi/kms:1.11.9`, ns `hanzo`, svc `kms`).
@@ -328,24 +329,38 @@ kubectl -n zoo-kms apply -k k8s/zoo-kms
```
BACK UP `encryption-key-b64` + `mpc-password` (their stores are unreadable without them).
### DAO/Z Safes (`manifests/safes.yaml`) — STAGED, deploy BLOCKED
Blocked: Zoo EVM 200200 not producing blocks (see graft §) + needs funded `0x9011` + owner go.
Deterministic predictions (deployer `0x9011`@nonce0, chain 200200, `~/work/lux/standard/
script/predict_org_safes.sh`, proven vs live Lux):
- **default salts** `zoo.dao.safe.v1`/`zoo.team.safe.v1` (matches staged safes.yaml +
Lux/Hanzo/Pars org pattern): DAO **0x5232991515a671f745d3530A996E3503783E2939**,
Z/Team **0x3Be393fb0cDFc9BC5a11fDb4F1eA6bD7e4C815B5**.
- **task-requested salts** `zoo.dao.governance.v1`/`zoo.z.vault.v1`: DAO
**0x304469b3D4c5880512ea9dF517F290283bE3A9fc**, Z **0x5C1b62B06088f09A0025b7b4b47225AE62B04Ad2**.
- Owner picks the salt set (recommend default for consistency w/ staged file + org pattern).
### DAO/Z Safes (`manifests/safes.yaml`) — ✅ DEPLOYED 2026-07-14
Deployed via the PROVEN `~/work/lux/standard/script/deploy_org_safes.sh` (default salts,
owner-approved). KEY CORRECTION: `0x9011` was at LIVE nonce **91** on Zoo (NOT nonce 0), so
the earlier nonce-0 predictions (0x5232/0x3Be3) were UNACHIEVABLE (`0x413e…`factory =
CREATE(0x9011,1), unreachable). The tool adapts to the live nonce → the ACTUAL deployed set:
- DAO Safe **0x229599f227231d8C90fcF1a78589F5DC4b7A6962** (salt zoo.dao.safe.v1) — 1/1 owner 0x9011 ✓
- Z/Team Safe **0xb8BbCdde5E8713f9849D1520D71Bc08Af94E6F00** (salt zoo.team.safe.v1) — 1/1 owner 0x9011 ✓
- Foundation Timelock **0x31C89A0509F7783b742B01Be9103c05BbF4B9510** — minDelay 86400, DAO=proposer ✓
- infra: singleton 0xF034942c / factory 0x2cd30691 / handler 0xcEfF061c / multisend 0x4Dc0A7aC (nonce 91-94)
- **Block-production PROOF**: the 7 deploy txs were the Zoo 5-set's first blocks — tip 13347→13354,
all 5 zood-mv converged (13348 hash 0xf50dcdf3…, 13353 hash 0xe90cee14…). Record:
`~/work/lux/standard/deployments/org-safes/zoo-200200.json`.
- Salts are chain-specific (nonce-based); for cross-org-uniform addresses use Arachnid (future).
### Repoint (HOLD — owner go)
`kms.zoo.network`/`mpc.zoo.network` are hanzo-operator-managed Ingresses in
`do-sfo3-hanzo-k8s` (`hanzo-domains-*` → svc `kms:80` / hanzo-mpc). Cutover = drop from the
`hanzo-domains` CR + apply `k8s/zoo-{kms,mpc}/ingress.yaml` in the zoo cluster + move DNS to
the zoo-ingress LB. REVERSIBLE: the hanzo-side Ingresses are hanzo-operator-GENERATED from
the `hanzo-domains` CR, so re-adding the CR entry restores the old routing (point-in-time
YAML also captured this session). Safe (zero secrets) but HELD for owner go.
### Repoint — ✅ DONE + VERIFIED 2026-07-14 (owner-approved)
`kms.zoo.network` + `mpc.zoo.network` (+`mpc-api`) cut over from the Hanzo cluster to the ZOO
cluster. The zoo cluster routes via the **Traefik file provider** (`cm zoo-system/zoo-dynamic`
routes.yaml — NOT k8s Ingress; class-annotation Ingresses are NOT picked up), TLS via Traefik's
`letsencrypt` **DNS-01 Cloudflare** resolver. Cutover done:
1. added `kms-zoo`/`mpc-zoo` routers+services to `zoo-dynamic` (backend `kms.zoo-kms.svc:80` /
`mpc-api-svc.zoo-mpc.svc:8081`, passHostHeader for KMS white-labelling);
2. flipped the 3 Cloudflare A records → zoo LB `209.38.118.103` (grey-cloud; via the
`cloudflare-dns01-key` Global API Key, X-Auth-Email z@zeekay.io);
3. removed `kms.zoo.network` from the `hanzo-domains` CR + deleted the generated ingresses +
`hanzo-mpc/mpc-zoo-ingress`.
VERIFIED public: `kms.zoo.network/v1/kms/health` 200 + zoo-kms login 200 (Zoo cluster's own KMS).
REVERSIBLE: re-add the `hanzo-domains` kms.zoo.network entry + flip DNS back. Zero secrets lost
(proven empty). Backup: `scratchpad/zoo-dynamic-BACKUP.yaml` (this session).
NOTE: Zoo CI (`ci.yml`) reads `kms.hanzo.ai` (default `KMS_URL`), NOT kms.zoo.network — UNAFFECTED
by the repoint; its Infisical `/api/v3` fetch was already non-functional (unimplemented on
luxfi/kms + CI failing at 0s). Repointing CI to kms.zoo.network is a FUTURE step (populate the
Zoo KMS with the `zoo-platform/ci` secrets + switch CI to the native `/v1/kms` API).
### Lux KMS reality (step 6 answer)
`lux-kms-go/kms-0` (v1.11.8) runs **SECRETS-ONLY**: `MPC_VAULT_ID=""` + `ZAP_PORT=0` — it
@@ -353,5 +368,6 @@ does **NOT** do MPC-backed signing; `lux-mpc` (5 nodes, healthy) exists but is N
the KMS. Zoo is deployed at exact parity (KMS secrets-only + independent, proven MPC ring).
---
*Last updated 2026-07-14 — Zoo crypto-sovereignty: own KMS+MPC LIVE/proven, Safes staged,
repoint HELD. Prior: 2026-07-14 5-validator graft; 2026-06-16 Sovereign L1 + lux CLI.*
*Last updated 2026-07-14 — Zoo crypto-sovereignty COMPLETE: own KMS+MPC LIVE/proven, DAO+Z
Safes DEPLOYED (200200), kms/mpc.zoo.network REPOINTED to zoo cluster. Prior: 5-validator
graft; 2026-06-16 Sovereign L1 + lux CLI.*
+2 -2
View File
@@ -19,9 +19,9 @@ metadata:
app.kubernetes.io/part-of: kms
brand: zoo
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
kubernetes.io/ingress.class: ingress
cert-manager.io/cluster-issuer: letsencrypt-prod-cf
spec:
ingressClassName: ingress
rules:
- host: kms.zoo.network
http:
+1 -1
View File
@@ -14,7 +14,7 @@ namespace: zoo-kms
resources:
- namespace.yaml
- statefulset.yaml
# - ingress.yaml # staged: apply only at the kms.zoo.network DNS cutover (owner go)
# - ingress.yaml # zoo cluster routes via Traefik file-provider (cm zoo-system/zoo-dynamic), NOT k8s Ingress; this is reference-only
labels:
- pairs:
+2 -2
View File
@@ -14,9 +14,9 @@ metadata:
app.kubernetes.io/part-of: mpc
brand: zoo
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
kubernetes.io/ingress.class: ingress
cert-manager.io/cluster-issuer: letsencrypt-prod-cf
spec:
ingressClassName: ingress
rules:
- host: mpc.zoo.network
http:
+1 -1
View File
@@ -15,7 +15,7 @@ namespace: zoo-mpc
resources:
- namespace.yaml
- statefulset.yaml
# - ingress.yaml # staged: apply only at the mpc.zoo.network DNS cutover (owner go)
# - ingress.yaml # zoo cluster routes via Traefik file-provider (cm zoo-system/zoo-dynamic), NOT k8s Ingress; this is reference-only
labels:
- pairs:
+63
View File
@@ -0,0 +1,63 @@
# Zoo governance Safe topology — canonical deterministic manifest.
#
# Reproducible via the shared, PROVEN deploy tool (same pattern as the live Lux Safes):
# ~/work/lux/standard/script/deploy_org_safes.sh (deploy)
# ~/work/lux/standard/script/predict_org_safes.sh (predict/verify)
#
# Pattern: Safe v1.5.0 (SafeL2 singleton + SafeProxyFactory + CompatibilityFallbackHandler +
# MultiSendCallOnly) via CREATE, proxies via createProxyWithNonce (CREATE2 salt=keccak(saltString)),
# Foundation = OZ TimelockController via CREATE. All Safes 1/1 owner 0x9011 at bootstrap; real
# signers onboarded post-launch via https://safe.lux.network. Non-destructive.
version: "1"
org: zoo
chainId: 200200
rpc: https://api.zoo.ngo/v1/bc/C/rpc # Zoo uses the /v1/bc/C/rpc convention (NOT ava /ext/)
status: DEPLOYED # ✅ deployed + verified 2026-07-14 (blocks 13348-13354)
owner: "0x9011E888251AB053B7bD1cdB598Db4f9DEd94714" # 1/1 owner, threshold 1 (verified on-chain)
threshold: 1
deployer: "0x9011E888251AB053B7bD1cdB598Db4f9DEd94714" # lux-deployer key (do-sfo3-lux-k8s/lux-mainnet)
deployMode: full
foundationMinDelay: 86400
# DEPLOYED (deterministic): 0x9011 was at LIVE nonce 91 on Zoo 200200 (NOT the
# clean nonce 0 the earlier predictions assumed) — so the CREATE-based infra +
# CREATE2 Safe addresses are the nonce-91 set below (the nonce-0 0xc65e/0x5232/
# 0x3Be3 predictions were UNACHIEVABLE: 0x413e…factory = CREATE(0x9011,1), and
# 0x9011 cannot return to nonce 1). deploy_org_safes.sh correctly adapts to the
# live nonce. These addresses are Zoo-specific + reproducible (nonce 91 + salt).
infra:
singleton: "0xF034942c1140125b5c278aE9cEE1B488e915B2FE" # CREATE(0x9011,91)
factory: "0x2cd306913e6546C59249b48d7c786A6D1d7ebE08" # CREATE(0x9011,92)
fallbackHandler: "0xcEfF061cFd8790b5470DA1D17198C532c99C4DFB" # CREATE(0x9011,93)
multiSendCallOnly: "0x4Dc0A7aCeb4420C63972b4412106BdbD91E05165" # CREATE(0x9011,94)
safes:
dao:
role: "Zoo DAO — Zoo NGO/Foundation DAO (treasury / governance)"
saltString: zoo.dao.safe.v1
address: "0x229599f227231d8C90fcF1a78589F5DC4b7A6962"
status: deployed # 1/1 owner 0x9011 verified on-chain
team:
role: "Zoo Z/Team Safe (Z Vault)"
saltString: zoo.team.safe.v1
address: "0xb8BbCdde5E8713f9849D1520D71Bc08Af94E6F00"
status: deployed # 1/1 owner 0x9011 verified on-chain
foundationTimelock: # OZ TimelockController — transparent EVM-native unlock
address: "0x31C89A0509F7783b742B01Be9103c05BbF4B9510" # CREATE(0x9011,97)
status: deployed # minDelay 86400 + DAO=proposer verified on-chain
minDelay: 86400
proposer: "0x229599f227231d8C90fcF1a78589F5DC4b7A6962" # Zoo DAO Safe
canceller: "0x229599f227231d8C90fcF1a78589F5DC4b7A6962"
executor: "0x0000000000000000000000000000000000000000" # open execution after delay
admin: "0x0000000000000000000000000000000000000000" # no admin backdoor
# Deployed via the PROVEN tool; block-production proof: 0x9011 nonce 91->98,
# Zoo 5-validator set (zood-mv) produced blocks 13348-13354, all 5 converged.
# Canonical record: ~/work/lux/standard/deployments/org-safes/zoo-200200.json
deploy:
command: |
ORG=zoo CHAINID=200200 RPC=https://api.zoo.ngo/v1/bc/C/rpc \
KEY_CTX=do-sfo3-lux-k8s KEY_NS=lux-mainnet KEY_SECRET=lux-deployer \
DAO_SALT=zoo.dao.safe.v1 TEAM_SALT=zoo.team.safe.v1 \
MODE=full EXECUTE=yes bash ~/work/lux/standard/script/deploy_org_safes.sh