diff --git a/main/.vitepress/config.mjs b/main/.vitepress/config.mjs
index 2f6220b27..8077fa538 100644
--- a/main/.vitepress/config.mjs
+++ b/main/.vitepress/config.mjs
@@ -126,13 +126,9 @@ export default defineConfig({
collapsed: true,
items: [
{
- text: 'Key Concepts',
+ text: 'Key Concepts and APIs',
link: '/guides/orchestration/getting-started/key-concepts',
},
- {
- text: 'API',
- link: '/guides/orchestration/getting-started/api',
- },
{
text: 'Contract Walkthroughs',
link: '/guides/orchestration/getting-started/contract-walkthroughs',
@@ -453,6 +449,35 @@ export default defineConfig({
},
],
},
+ {
+ text: 'Orchestration',
+ link: '/guides/orchestration/',
+ collapsed: true,
+ items: [
+ {
+ text: 'Key Concepts and APIs',
+ link: '/guides/orchestration/getting-started/key-concepts',
+ },
+ {
+ text: 'Contract Walkthroughs',
+ link: '/guides/orchestration/getting-started/contract-walkthroughs',
+ items: [
+ {
+ text: 'Cross-Chain Swap Example',
+ link: '/guides/orchestration/getting-started/contract-walkthrough/cross-chain-swap',
+ },
+ {
+ text: 'Cross-Chain Unbond Example',
+ link: '/guides/orchestration/getting-started/contract-walkthrough/cross-chain-unbond',
+ },
+ {
+ text: 'Orchestration Basics',
+ link: '/guides/orchestration/getting-started/contract-walkthrough/orchestration-basics',
+ }
+ ]
+ },
+ ]
+ },
{
text: 'JavaScript Framework',
ariaLabel: 'JavaScript Framework',
diff --git a/main/guides/orchestration/getting-started/api.md b/main/guides/orchestration/getting-started/api.md
deleted file mode 100644
index 47ffb1271..000000000
--- a/main/guides/orchestration/getting-started/api.md
+++ /dev/null
@@ -1,101 +0,0 @@
-# Orchestration API
-
-The Agoric [Orchestration](/glossary/#orchestration) API enables developers to seamlessly manage and interact with accounts across multiple blockchain networks, simplifying the complexities of cross-chain operations.
-
-See [Orchestration API Spec](https://agoric-sdk.pages.dev/modules/_agoric_orchestration)
-
-## Orchestrator Interface
-
-The [`Orchestrator`](https://agoric-sdk.pages.dev/interfaces/_agoric_orchestration.Orchestrator) interface provides a set of high-level methods to manage and interact with interchain accounts. Below are the primary methods:
-
-### getChain
-
-Retrieves the chain information and provides access to chain-specific methods. See [getChain](https://agoric-sdk.pages.dev/interfaces/_agoric_orchestration.Orchestrator#getChain).
-
-```js
-const chain = await orchestrator.getChain('chainName');
-```
-
-### makeLocalAccount
-
-Creates a new `LocalChainAccount`. See [makeLocalAccount](https://agoric-sdk.pages.dev/interfaces/_agoric_orchestration.Orchestrator#makeLocalAccount).
-
-```js
-const localAccount = await orchestrator.makeLocalAccount();
-```
-
-### 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](https://agoric-sdk.pages.dev/interfaces/_agoric_orchestration.Orchestrator#getBrandInfo).
-
-```js
-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).
-
-```js
-const amount = orchestrator.asAmount({ denom: 'uatom', value: 1000n });
-```
-
-## OrchestrationAccount
-
-An [`OrchestrationAccount`](https://agoric-sdk.pages.dev/types/_agoric_orchestration.OrchestrationAccount) is a type alias that combines the [`OrchestrationAccountI`](https://agoric-sdk.pages.dev/interfaces/_agoric_orchestration.OrchestrationAccountI) interface with additional methods. Below are the primary methods available:
-
-### getAddress
-
-Retrieves the address of the account on the remote chain. See [getAddress](https://agoric-sdk.pages.dev/interfaces/_agoric_orchestration.OrchestrationAccountI#getAddress).
-
-```js
-const address = await orchestrationAccount.getAddress();
-```
-
-### getBalances
-
-Returns an array of amounts for every balance in the account. See [getBalances](https://agoric-sdk.pages.dev/interfaces/_agoric_orchestration.OrchestrationAccountI#getBalances).
-
-```js
-const balances = await orchestrationAccount.getBalances();
-```
-
-### getBalance
-
-Retrieves the balance of a specific denom for the account. See [getBalance](https://agoric-sdk.pages.dev/interfaces/_agoric_orchestration.OrchestrationAccountI#getBalance).
-
-```js
-const balance = await orchestrationAccount.getBalance('uatom');
-```
-
-### send
-
-Transfers an amount to another account on the same chain. The promise settles when the transfer is complete. See [send](https://agoric-sdk.pages.dev/interfaces/_agoric_orchestration.OrchestrationAccountI#send).
-
-```js
-await orchestrationAccount.send(receiverAddress, amount);
-```
-
-### transfer
-
-Transfers an amount to another account, typically on another chain. The promise settles when the transfer is complete. See [transfer](https://agoric-sdk.pages.dev/interfaces/_agoric_orchestration.OrchestrationAccountI#transfer).
-
-```js
-await orchestrationAccount.transfer(amount, destinationAddress);
-```
-
-### transferSteps
-
-Transfers an amount to another account in multiple steps. The promise settles when the entire path of the transfer is complete. See [transferSteps](https://agoric-sdk.pages.dev/interfaces/_agoric_orchestration.OrchestrationAccountI#transferSteps).
-
-```js
-await orchestrationAccount.transferSteps(amount, transferMsg);
-```
-
-### deposit
-
-Deposits payment from Zoe to the account. For remote accounts, an IBC Transfer will be executed to transfer funds there.
-
-```js
-await orchestrationAccount.deposit(payment);
-```
diff --git a/main/guides/orchestration/getting-started/key-concepts.md b/main/guides/orchestration/getting-started/key-concepts.md
index 735e7d060..411f356fa 100644
--- a/main/guides/orchestration/getting-started/key-concepts.md
+++ b/main/guides/orchestration/getting-started/key-concepts.md
@@ -1,79 +1,59 @@
-# Orchestration Key Concepts
+# Orchestration Key Concepts and APIs
-Here, we overview the fundamental concepts involved with building orchestration smart contracts.
+This document provides an overview of the fundamental concepts involved in building orchestration smart contracts,
+focusing on Orchestrator Interface, Orchestration Accounts, and ChainHub.
-### Interchain Account (ICA)
+## Orchestrator Interface
-[Interchain Accounts](/glossary/#interchain-account-ica) (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](/glossary/#orchestration) API. This feature leverages the [Inter-Blockchain Communication (IBC)](/glossary/#ibc) protocol to facilitate interactions and transactions across different blockchains seamlessly.
+The [`Orchestrator`](https://agoric-sdk.pages.dev/interfaces/_agoric_orchestration.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
-Photo credit: [cosmos.network documentation](https://tutorials.cosmos.network/academy/3-ibc/8-ica.html)
+- `getChain` retrieves a chain object for the given `chainName` to get access to chain-specific methods. See [getChain](https://agoric-sdk.pages.dev/interfaces/_agoric_orchestration.Orchestrator#getChain).
-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](/guides/zoe/contract-access-control).
+```js
+const chain = await orchestrator.getChain('chainName');
+```
-### Example ICA Usage from a Smart Contract
+### Brand Utility Functions
-This sample is taken from one of the [example contracts](https://github.com/Agoric/agoric-sdk/blob/master/packages/orchestration/src/examples/swapExample.contract.js)
+- `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](https://agoric-sdk.pages.dev/interfaces/_agoric_orchestration.Orchestrator#getBrandInfo).
```js
-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);
- }
-};
+const brandInfo = orchestrator.getBrandInfo('denom');
```
-### 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.
+- `asAmount` converts a denom amount to an `Amount` with a brand. See [asAmount](https://agoric-sdk.pages.dev/interfaces/_agoric_orchestration.Orchestrator#asAmount).
```js
-const chainHub = makeChainHub(remotePowers.agoricNames);
+const amount = orchestrator.asAmount({ denom: 'uatom', value: 1000n });
+```
-// Register a new chain with its information
-chainHub.registerChain(chainKey, chainInfo);
+## Orchestration Account
-// Register a connection between the Agoric chain and the new chain
-chainHub.registerConnection(
- agoricChainInfo.chainId,
- chainInfo.chainId,
- connectionInfo
-);
-```
+Orchestration accounts are a key concept in the Agoric Orchestration API, represented by the [`OrchestrationAccountI`](https://agoric-sdk.pages.dev/interfaces/_agoric_orchestration.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.
-In this example, `chainHub` is used to register a new chain and establish a connection between the Agoric chain and the newly registered chain.
+### Account Creation
-### Orchestration Account
+- `makeAccount` (for a chain object) creates a new account on local and/or remote chain as below.
-Orchestration accounts are a key concept in the Agoric Orchestration API, represented by the [`OrchestrationAccountI`](https://agoric-sdk.pages.dev/interfaces/_agoric_orchestration.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.
+```js
+const [agoric, remoteChain] = await Promise.all([
+ orch.getChain('agoric'),
+ orch.getChain(chainName)
+]);
+const [localAccount, remoteAccount] = await Promise.all([
+ agoric.makeAccount(),
+ remoteChain.makeAccount()
+]);
+```
-**1. Address Management**
+### Address Management
- `getAddress` retrieves the address of the account on the remote chain.
@@ -81,7 +61,7 @@ Orchestration accounts are a key concept in the Agoric Orchestration API, repres
const address = await orchestrationAccount.getAddress();
```
-**2. Balance Management**
+### 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.
@@ -91,16 +71,59 @@ const balances = await orchestrationAccount.getBalances();
const balance = await orchestrationAccount.getBalance('uatom');
```
-**3. Funds Transfer**
+### 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);
```
-To see the function the Orchestration API exposes, see [Orchestration API](/guides/orchestration/getting-started/api.html)
+## 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](/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 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` 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
+);
+```