Skip to main content
Use this checklist when planning and executing a migration from Ethereum to Canton. Each section covers a key area with specific action items.

Before You Start

  • Identify state model dependencies: Does your app rely on global state queries?
  • Map multi-party relationships: Who are the parties in your contracts?
  • Evaluate privacy requirements: Do you need sub-transaction privacy?
  • Review integration points: What systems connect to your smart contracts?
If your app heavily relies on global state queries (e.g., “show all NFTs”), you’ll need to redesign this functionality using party-scoped queries or off-ledger indexing.

Smart Contract Migration

Phase 1: Model Your Parties

1

Identify all actors

List everyone who interacts with your contracts and map them to Canton parties:
  • Contract owneradmin : Party (signatory for admin contracts)
  • Usersuser : Party (each user is a distinct party)
  • Operatorsoperator : Party (may be signatory or controller)
2

Define party relationships

For each contract, determine:
  • Who must agree to create it? → Signatories
  • Who should see it? → Observers
  • Who can act on it? → Controllers (per choice)
3

Plan party hosting

Decide where parties will be hosted:
  • User parties: Often on the application provider’s validator
  • Admin parties: On your organization’s validator
  • External parties: On their own validators

Phase 2: Translate Contracts

The key insight: Instead of one contract with a mapping, you have many contracts—one per holding.

Phase 3: Handle State Differently

  • Replace global queries: Design party-scoped query patterns
  • Plan for contract keys: Use keys for lookups instead of addresses
  • Accept contract ID changes: IDs change on every update; use keys for stable references
Canton has no equivalent to Ethereum’s eth_getLogs or event filtering across all contracts. Plan your indexing strategy early.

Integration Migration

API Changes

Authentication Changes

Ethereum authenticates via private key signatures and derives identity from msg.sender. In Canton, identity comes from party authentication with JWT tokens. Where Ethereum allows anyone to call a public function, Canton restricts access to authenticated parties only.

Indexing Strategy

Since there’s no global state query:
  • Use the Participant Query Store (PQS) for SQL-based querying
  • Stream transactions to your own database
  • Design contracts with query-friendly keys

Testing Migration

Unit Tests

  • Replace Hardhat/Foundry tests with Daml Script tests
  • Test authorization rules (who can exercise what)
  • Test multi-party workflows (propose-accept patterns)

Integration Tests

  • Test against LocalNet (CN Quickstart provides this)
  • Verify API integration works
  • Test error scenarios and rollback behavior

Deployment Migration

Network Selection

  • LocalNet — development and testing
  • DevNet — integration testing
  • TestNet — pre-production validation
  • MainNet — production

Deployment Checklist

  • Package your Daml code: dpm build
  • Upload to validator: Via admin or LAPI APIs
  • Allocate parties: Create party identities
  • Initialize contracts: Create initial state
  • Configure applications: Point to Ledger API

Operational Changes

Monitoring

Where Ethereum has block explorers, Canton uses validator logs and metrics. Transaction hash lookups become transaction ID queries. Gas tracking maps to traffic unit tracking.

Key Management

Ethereum EOA private keys correspond to Canton party keys, which can live on the validator or be held externally. Hardware wallets map to HSM and KMS integrations. Multisig wallets are replaced by multi-signatory contracts, where authorization is enforced at the Daml level.

Common Migration Pitfalls

Avoid these common mistakes when migrating from Ethereum.

Migration Phases

Next Steps

Module 3: Daml Development

Start building with Daml.

CN Quickstart

Get hands-on with a working example.