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: cosmos.network 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 stakeAndSwapFn = async (orch, ...) => {
...
const omni = await orch.getChain('omniflixhub');
const agoric = await orch.getChain('agoric');
const [omniAccount, localAccount] = await Promise.all([
omni.makeAccount(),
agoric.makeAccount(),
]);
const omniAddress = omniAccount.getAddress();
// deposit funds from user seat to LocalChainAccount
...
const transferMsg = orcUtils.makeOsmosisSwap({ ... });
try {
await localAccount.transferSteps(give.Stable, transferMsg);
await omniAccount.delegate(offerArgs.validator, offerArgs.staked);
} catch (e) {
console.error(e);
}
};ChainHub
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
chainHub.registerConnection(
agoricChainInfo.chainId,
chainInfo.chainId,
connectionInfo,
);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
getAddressretrieves the address of the account on the remote chain.
const address = await orchestrationAccount.getAddress();2. Balance Management
getBalancesreturns an array of amounts for every balance in the account.getBalanceretrieves the balance of a specific denom for the account.
const balances = await orchestrationAccount.getBalances();
const balance = await orchestrationAccount.getBalance('uatom');3. Funds Transfer
sendtransfers an amount to another account on the same chain.transfertransfers an amount to another account, typically on another chain.transferStepstransfers 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