Skip to content

Orchestration Key Concepts

Here, we overview the fundamental concepts involved with building orchestration smart contracts.

Interchain Account (ICA)

Interchain Accounts (ICAs) are an IBC feature used in Agoric’s Orchestration API. They enable an Agoric smart contract to control an account on another blockchain within the Cosmos ecosystem, facilitated by Agoric Orchestration API. This feature leverages the Inter-Blockchain Communication (IBC) protocol to facilitate interactions and transactions across different blockchains seamlessly.

Photo credit: documentation

A key advantage of ICAs is that they make accounts on other chains look like any other (remotable) object. When a contract creates an ICA, it has sole access to and control over the account but can delegate certain forms of access to its clients.

For a detailed explanation of these access control rules, see Access Control with Objects.

Example ICA Usage from a Smart Contract

This sample is taken from one of the example contracts

const stackAndSwapFn = async (orch, ...) => {
  const omni = await orch.getChain('omniflixhub');
  const agoric = await orch.getChain('agoric');

  const [omniAccount, localAccount] = await Promise.all([

  const omniAddress = omniAccount.getAddress();

  // deposit funds from user seat to LocalChainAccount
  const transferMsg = orcUtils.makeOsmosisSwap({ ... });

  await localAccount
    .transferSteps(give.Stable, transferMsg)
    .then(_txResult =>
      omniAccount.delegate(offerArgs.validator, offerArgs.staked),
    .catch(e => console.error(e));


The makeChainHub utility manages the connections and metadata for various blockchain networks. It creates a new ChainHub instance implementing the ChainHubI interface.

It simplifies accessing and interacting with multiple chains, providing a unified interface for the orchestration logic to manage cross-chain operations effectively. ChainHub also allows dynamic registration and use of chain and connection information.

const chainHub = makeChainHub(remotePowers.agoricNames);

// Register a new chain with its information
chainHub.registerChain(chainKey, chainInfo);

// Register a connection between the Agoric chain and the new chain

In this example, chainHub is used to register a new chain and establish a connection between the Agoric chain and the newly registered chain.

Orchestration Account

Orchestration accounts are a key concept in the Agoric Orchestration API, represented by the OrchestrationAccountI interface. These accounts provide high-level operations for managing accounts on remote chains, allowing seamless interaction and management of interchain accounts. The orchestration accounts abstract the complexity of interchain interactions, providing a unified and simplified interface for developers.

1. Address Management

  • getAddress retrieves the address of the account on the remote chain.
const address = await orchestrationAccount.getAddress();

2. Balance Management

  • getBalances returns an array of amounts for every balance in the account.
  • getBalance retrieves the balance of a specific denom for the account.
const balances = await orchestrationAccount.getBalances();
const balance = await orchestrationAccount.getBalance('uatom');

3. Funds Transfer

  • send transfers an amount to another account on the same chain.
  • transfer transfers an amount to another account, typically on another chain.
  • transferSteps transfers an amount in multiple steps, handling complex transfer paths.
await orchestrationAccount.send(receiverAddress, amount);
await orchestrationAccount.transfer(amount, destinationAddress);
await orchestrationAccount.transferSteps(amount, transferMsg);

To see the function the Orchestration API exposes, see Orchestration API