Skip to content

Commit

Permalink
docs: updated chainHub sections
Browse files Browse the repository at this point in the history
  • Loading branch information
amessbee committed Sep 12, 2024
1 parent c623eaa commit 1b0bf9c
Showing 1 changed file with 37 additions and 57 deletions.
94 changes: 37 additions & 57 deletions main/guides/orchestration/getting-started/key-concepts.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# 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, ChainHub, and Interchain Accounts (ICA).
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
Expand Down Expand Up @@ -32,7 +32,7 @@ See [getBrandInfo](https://agoric-sdk.pages.dev/interfaces/_agoric_orchestration
const brandInfo = orchestrator.getBrandInfo('denom');
```

- `asAmount`converts a denom amount to an `Amount` with a brand. See [asAmount](https://agoric-sdk.pages.dev/interfaces/_agoric_orchestration.Orchestrator#asAmount).
- `asAmount` converts a denom amount to an `Amount` with a brand. See [asAmount](https://agoric-sdk.pages.dev/interfaces/_agoric_orchestration.Orchestrator#asAmount).

```javascript
const amount = orchestrator.asAmount({ denom: 'uatom', value: 1000n });
Expand Down Expand Up @@ -81,15 +81,43 @@ await orchestrationAccount.deposit(payment);

## ChainHub

The `makeChainHub` utility manages the connections and metadata for various blockchain
networks. It creates a new `ChainHub` instance implementing the [`ChainHubI`](https://github.com/Agoric/agoric-sdk/blob/000693442f821c1fcea007a2df740733b1f75ebe/packages/orchestration/src/exos/chain-hub.js#L70-L80C4) 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.
ChainHub is a centeralized 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](/glossary/#zone) is provided). The resulting object is an [Exo](/glossary/#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 API.


### Registration APIs

- `registerChain` register a new chain with `chainHub`. The name will override
a name in well known chain names. If a durable zone was not provided,
registration will not survive a reincarnation of the vat, and will have to be
registered again.
- `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 give 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.

```javascript
const chainHub = makeChainHub(remotePowers.agoricNames);
const chainHub = makeChainHub(privateArgs.agoricNames, vowTools);

// Register a new chain with its information
chainHub.registerChain(chainKey, chainInfo);
Expand All @@ -101,51 +129,3 @@ chainHub.registerConnection(
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.

## Interchain Account (ICA)

[Interchain Accounts](/glossary/#interchain-account-ica) (ICAs) are an IBC feature utilized
within Agoric’s Orchestration API. They enable an Agoric smart contract to control an
account on another blockchain in the Cosmos ecosystem. The [Inter-Blockchain Communication (IBC)](/glossary/#ibc) protocol facilitates seamless interactions and transactions across
different blockchains.

#### Benefits of ICAs
- **Cross-chain Control**: ICAs allow a contract to manage accounts on other chains,
treating them like any other (remotable) object.
- **Access Control**: Only the contract that creates the ICA has full control over it but
can delegate specific access permissions to clients.

For more details on access control, refer to [Access Control with Objects](/guides/zoe/contract-access-control).


### Example: ICA Usage in a Smart Contract

Here’s an example of ICA usage from one of the [sample contracts](https://github.com/Agoric/agoric-sdk/blob/master/packages/orchestration/src/examples/swapExample.contract.js):

```javascript
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);
}
};
```

0 comments on commit 1b0bf9c

Please sign in to comment.