On this pageNavigation ▾

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
  1. token has 0 dependencies → Deployed first. Its Contract ID is recorded.
  2. vault depends on token → Deployed second. Caatinga injects token’s deployed Contract ID into vault’s initialization parameters.
  3. market depends on token and vault → 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.