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 stackAndSwapFn = 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({ ... });
await localAccount
.transferSteps(give.Stable, transferMsg)
.then(_txResult =>
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 simplifies accessing and interacting with multiple chains, providing a unified interface for the orchestration logic to manage cross-chain operations effectively. ChainHub also allows for dynamic registration and usage of chains.
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.
- Address Management
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.
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.
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