Skip to content

Orchestration Key Concepts and APIs

This document provides an overview of the fundamental concepts involved in building orchestration smart contracts, focusing on Orchestrator Interface, Orchestration Accounts, and ChainHub.

Orchestrator Interface

The Orchestrator interface provides a set of high-level methods to manage and interact with local and remote chains. Below are the primary methods:

Access Chain Object

  • getChain retrieves a chain object for the given chainName to get access to chain-specific methods. See getChain.
js
const chain = await orchestrator.getChain('chainName');

Brand Utility Functions

  • getBrandInfo returns information about a denom, including the equivalent local Brand, the chain where the denom is held, and the chain that issues the corresponding asset. See getBrandInfo.
js
const brandInfo = orchestrator.getBrandInfo('denom');
  • asAmount converts a denom amount to an Amount with a brand. See asAmount.
js
const amount = orchestrator.asAmount({ denom: 'uatom', value: 1000n });

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.

Account Creation

  • makeAccount (for a chain object) creates a new account on local and/or remote chain as below.
js
const [agoric, remoteChain] = await Promise.all([
  orch.getChain('agoric'),
  orch.getChain(chainName)
]);
const [localAccount, remoteAccount] = await Promise.all([
  agoric.makeAccount(),
  remoteChain.makeAccount()
]);

Address Management

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

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.
js
const balances = await orchestrationAccount.getBalances();
const balance = await orchestrationAccount.getBalance('uatom');

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.
  • deposit deposits payment from Zoe to the account. For remote accounts, an IBC Transfer will be executed to transfer funds there.
js
await orchestrationAccount.send(receiverAddress, amount);
await orchestrationAccount.transfer(amount, destinationAddress);
await orchestrationAccount.transferSteps(amount, transferMsg);
await orchestrationAccount.deposit(payment);

ChainHub

ChainHub is a centralized registry of chains, connections, and denoms that simplifies accessing and interacting with multiple chains, providing a unified interface for the orchestration logic to manage cross-chain operations effectively. A chainHub instance can be created using a call to makeChainHub that makes a new ChainHub in the zone (or in the heap if no zone is provided). The resulting object is an Exo singleton. It has no precious state. Its only state is a cache of queries to agoricNames and the info provided in registration calls. When you need a newer version you can simply make a hub and repeat the registrations. ChainHub allows dynamic registration and use of chain and connection information using the following APIs:

Registration APIs

  • registerChain register a new chain with chainHub. The name will override a name in well-known chain names.
  • registerConnection registers a connections between two given chain IDs.
  • registerAsset registers an asset that may be held on a chain other than the issuing chain. Both corresponding chains should already be registered before this call.

Information Retrieval

  • getChainInfo takes a chain name to get chain info.
  • getConnectionInfo returns Vow<IBCConnectionInfo> for two given chain IDs.
  • getChainsAndConnection is used to get chain and connection info given primary and counter chain names.
  • getAsset retrieves holding, issuing chain names etc. for a denom.
  • getDenom retrieves denom (string) for a Brand.

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

js
const chainHub = makeChainHub(privateArgs.agoricNames, vowTools);

// 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
);