Files
zeekay f455dd6e78 feat(resolvers): add ERC-3643 + ONCHAINID + FHE policy surfaces
- securities: add OnchainIdClaim, TransferAgentAction, FrozenAccount,
  FrozenTokens, IdentityRegistryAction resolvers covering ERC-3643 transfer-
  agent / compliance / identity-registry workflow plus ONCHAINID claim
  lifecycle (ClaimAdded/Removed/Changed). Wires #258.
- fhe: add FHEPolicy and FHEPolicyBinding resolvers so the indexer can expose
  encrypted-policy descriptors anchored on M-Chain and their bindings to on-
  chain resources per LP-114 M-Chain × F-Chain integration.
- STATE.md: per-subgraph inventory + status, sibling subgraph repo state,
  build/deploy notes, follow-on work (event-signature constants, storage
  type registration, erc3643 alias, LoadConfig TODO).
2026-04-28 13:31:26 -07:00

143 lines
7.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# lux/graph — Subgraph State
`lux/graph` is the standalone Go GraphQL indexer (`graph` binary, also runnable
as a Lux VM plugin). It reads any EVM RPC, indexes events into local
SQLite/ZapDB, and serves a Graph-compatible GraphQL API. The "subgraphs" in
this repo are Go resolver packages under `resolvers/<topic>/` plus the central
event-signature table in `indexer/events.go`. There are no `subgraph.yaml`
manifests in this repo — those live in the sibling `uni-v2-subgraph`,
`uni-v3-subgraph`, `uni-v4-subgraph` repos that target this indexer.
## Resolver Subgraphs
| Subgraph | Path | Built-in alias(es) | Status |
| --- | --- | --- | --- |
| ai (A-Chain) | `resolvers/ai/` | `ai`, `achain` | current |
| amm | (handled by `engine.registerAMMResolvers`) | `amm`, `amm-v2`, `uniswap-v2`, `amm-v3`, `uniswap-v3`, `amm-v4`, `uniswap-v4`, `v4` | current |
| bridge (B-Chain) | `resolvers/bridge/` | `bridge`, `bchain` | current |
| dao | `resolvers/dao/` | `dao` | current |
| derivatives | `resolvers/derivatives/` | `derivatives`, `futures`, `options` | current |
| dex (D-Chain CLOB) | `resolvers/dex/` | `dex` | current |
| did | `resolvers/did/` | `did`, `did-registry` | current |
| exchange (X-Chain) | `resolvers/exchange/` | `exchange`, `xchain` | current |
| fhe (T-Chain) | `resolvers/fhe/` | `fhe`, `threshold` | UPDATED 2026-04-28 |
| governance | `resolvers/governance/` | `governance` | current |
| identity (I-Chain) | `resolvers/identity/` | `identity`, `ichain` | current |
| key (K-Chain) | `resolvers/key/` | `key`, `kchain` | current |
| liquid (liquid staking) | `resolvers/liquid/` | `liquid`, `liquid-staking` | current |
| liquidity (omnichain) | `resolvers/liquidity/` | `liquidity`, `liquidity-protocol`, `omnichain` | current |
| liquidprotocol (teleport / liquid-vault) | `resolvers/liquidprotocol/` | `liquid-protocol`, `teleport`, `liquid-vault` | current |
| mpc (M-Chain) | `resolvers/mpc/` | `mpc`, `mchain` | current |
| oracle (O-Chain) | `resolvers/oracle/` | `oracle`, `ochain` | current |
| platform (P-Chain) | `resolvers/platform/` | `platform`, `pchain` | current |
| precompile | `resolvers/precompile/` | `precompile`, `precompiles` | current |
| prediction | `resolvers/prediction/` | `prediction`, `prediction-market` | current |
| privacy | `resolvers/privacy/` | `privacy` | current |
| quantum (Q-Chain) | `resolvers/quantum/` | `quantum`, `qchain` | current |
| relay (R-Chain) | `resolvers/relay/` | `relay`, `rchain` | current |
| securities | `resolvers/securities/` | `securities`, `security-token` | UPDATED 2026-04-28 |
| servicenode (S-Chain) | `resolvers/servicenode/` | `servicenode`, `schain` | current |
| treasury | `resolvers/treasury/` | `treasury` | current |
| utxo | `resolvers/utxo/` | `utxo` | current |
| zk (Z-Chain) | `resolvers/zk/` | `zk`, `zchain` | current |
Empty directories `resolvers/amm/` and `resolvers/threshold/` are intentional:
amm is registered by `engine.registerAMMResolvers`, and `threshold` is an
alias of `fhe` in `engine.LoadBuiltin`.
## Updates landed this sweep (2026-04-28)
### securities (ERC-3643 + ONCHAINID)
Added entity surfaces for ERC-3643 transfer-agent / compliance / identity-
registry workflow plus ONCHAINID claim lifecycle. New resolvers:
- `onchainIdClaim`, `onchainIdClaims` — `ClaimAdded` / `ClaimRemoved` /
`ClaimChanged` from ONCHAINID.
- `transferAgentAction`, `transferAgentActions` — `Recovery`, `AddressFrozen`,
`TokensFrozen`, `TokensUnfrozen` from ERC-3643 token agent.
- `frozenAccount`, `frozenAccounts` — current `AddressFrozen` snapshots.
- `frozenTokens`, `frozenTokensList` — per-holder partial freeze amounts.
- `identityRegistryAction`, `identityRegistryActions` — `IdentityRegistered`,
`IdentityRemoved`, `IdentityStored`, `CountryUpdated` from
IdentityRegistry contract.
Backing entity types for the storage layer: `OnchainIdClaim`,
`TransferAgentAction`, `FrozenAccount`, `FrozenTokens`,
`IdentityRegistryAction`.
### fhe (LP-114 M-Chain × F-Chain policy gating)
Added `FHEPolicy` and `FHEPolicyBinding` entity surfaces so the indexer can
expose encrypted-policy descriptors anchored on M-Chain and their bindings to
on-chain resources. New resolvers: `fhePolicy`, `fhePolicies`,
`fhePolicyBinding`, `fhePolicyBindings`.
## Sibling subgraph repos (deploy via The Graph protocol)
These three sibling repos define `subgraph.yaml` manifests targeting the same
indexer. They live next to `lux/graph` under `~/work/lux/`:
| Repo | Path | Network | Factory address | spec | Last commit |
| --- | --- | --- | --- | --- | --- |
| uni-v2-subgraph | `~/work/lux/uni-v2-subgraph` | `liquidity` | `0xD173926A10A0C4eCd3A51B1422270b65Df0551c1` | `0.0.4` | `9ffaaac feat: update subgraph config and package dependencies` |
| uni-v3-subgraph | `~/work/lux/uni-v3-subgraph` | `liquidity` | `0x80bBc7C4C7a59C899D1B37BC14539A22D5830a84` | `0.0.4` | `5d56a82 feat: update subgraph config and package dependencies` |
| uni-v4-subgraph | `~/work/lux/uni-v4-subgraph` | `liquidity` | `0x0000000000000000000000000000000000009010` (PoolManager) | `0.0.4` | `578adf5 feat: update subgraph config and package dependencies` |
Mainnet factory addresses match `indexer/events.go::LuxMainnet`. The subgraph
manifests use `network: liquidity` for the deploy target name (the Lux DEX
network identifier in the hosted graph node), not the Liquidity company.
## Build status
Build verification deferred this sweep due to a pre-existing `go.sum`
checksum mismatch on `github.com/luxfi/[email protected]` and
`github.com/hanzoai/[email protected]` — the mismatch lives in transitive
deps and is unrelated to the resolver edits in this branch (the securities
and fhe packages only import `context`, `fmt`,
`github.com/luxfi/graph/storage`). `gofmt` is clean on both edited files.
To repair the build locally:
```
GOWORK=off GOSUMDB=off go mod tidy
```
Then `make build` should produce `bin/graph`.
## Deploy state
The `graph` binary deploys via the canonical docker-build reusable workflow on
tag push (`ci/canonical-docker-build` branch on `main` history; image
`ghcr.io/luxfi/graph:<semver>`). No deploy keys for The Graph hosted service
are wired into this repo — the sibling subgraph repos handle hosted-service
deploys via their own `package.json` `deploy` script and require an env-side
`GRAPH_DEPLOY_KEY` to run `graph deploy --product hosted-service luxfi/<name>`.
## Follow-on work
- Wire concrete event-signature constants for ERC-3643 + ONCHAINID into
`indexer/events.go` (mirror the `SigPairCreated` / `SigSwapV2` pattern). The
resolver layer is in place; the indexer still needs the topic-0 hashes:
- `Transfer(address,address,uint256)` — already covered by `SigTransfer`.
- `AddressFrozen(address indexed,bool indexed,address indexed)`,
`TokensFrozen(address indexed,uint256)`,
`TokensUnfrozen(address indexed,uint256)`,
`RecoverySuccess(address,address,address)`.
- `ClaimAdded(bytes32 indexed,uint256 indexed,uint256,address,bytes,bytes,string)`,
`ClaimRemoved(...)`, `ClaimChanged(...)`.
- `IdentityRegistered(address indexed,address indexed)`,
`IdentityRemoved(address indexed,address indexed)`,
`IdentityStored(address indexed,address indexed)`,
`CountryUpdated(address indexed,uint16 indexed)`.
- Add storage-layer entity registrations for the new types so
`s.GetByType` / `s.ListByType` resolve them. The storage layer auto-handles
any `(type, id)` pair, but indexes will speed up list queries.
- Add a built-in alias `"erc3643"` to `engine.LoadBuiltin` that calls
`securities.Register` (currently the alias is `securities` /
`security-token`).
- Resolve `LoadConfig` TODO at `engine/engine.go:258` once the subgraph.yaml
parser lands (separate work item).
- Replace the empty `resolvers/amm/` and `resolvers/threshold/` directories
with package documentation so the layout is self-explanatory.