Deployment Graph
In modern dApps, smart contracts rarely exist in isolation. A Liquidity Pool contract depends on Token contracts; a Governance Vault depends on Staking and Token contracts.
Caatinga handles multi-contract dependencies natively using a Topological Deployment Graph.
Defining Dependencies
Dependencies are declared in caatinga.config.ts using the dependsOn property:
export default defineConfig({
project: { name: "defi-dapp" },
contracts: {
token: {
path: "contracts/token",
},
vault: {
path: "contracts/vault",
dependsOn: ["token"],
},
market: {
path: "contracts/market",
dependsOn: ["token", "vault"],
},
},
});
Graph Resolution & Order
When you execute npx ctg deploy, Caatinga resolves the graph:
token
│
├──────→ vault
│ │
└──────→ market
tokenhas 0 dependencies → Deployed first. Its Contract ID is recorded.vaultdepends ontoken→ Deployed second. Caatinga injectstoken’s deployed Contract ID intovault’s initialization parameters.marketdepends ontokenandvault→ Deployed third once both prerequisites are confirmed on-chain.
Cycle Validation
Caatinga validates the DAG during config loading. If a cycle is detected (e.g. A depends on B and B depends on A), deployment halts immediately with error code CAATINGA_CONTRACT_DEPENDENCY_CYCLE.