From 96921eccc70bab359c3c4e3107852b60e89a99c9 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 29 Nov 2023 00:26:39 -0600 Subject: [PATCH 1/9] chore: prune validator sync docs (TODO: redirect to forum) --- main/.vuepress/config.js | 1 - 1 file changed, 1 deletion(-) diff --git a/main/.vuepress/config.js b/main/.vuepress/config.js index ec8b81e2d..274c3871a 100644 --- a/main/.vuepress/config.js +++ b/main/.vuepress/config.js @@ -122,7 +122,6 @@ module.exports = { '/guides/getting-started/start-a-project.html', '/guides/getting-started/contract-rpc.html', '/guides/getting-started/deploying.html', - '/guides/getting-started/syncing-up.html', ], }, { From ab0558be1f375a578358d2a36103e0dc70e82257 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 29 Nov 2023 00:25:40 -0600 Subject: [PATCH 2/9] docs(getting-started): install from node; skip ag-solo --- main/guides/getting-started/README.md | 220 +++++++++++++++----------- 1 file changed, 128 insertions(+), 92 deletions(-) diff --git a/main/guides/getting-started/README.md b/main/guides/getting-started/README.md index ee83b7c56..e72a0ed0a 100644 --- a/main/guides/getting-started/README.md +++ b/main/guides/getting-started/README.md @@ -1,9 +1,8 @@ -# Installing the Agoric SDK +# Starting a Basic Dapp -To write JavaScript smart contracts using the Agoric Zoe framework, first install the Agoric Software -Development Kit (SDK). +Welcome! We'll start with a basic _dapp_; that is: a JavaScript contract and UI. -After installing the Agoric SDK, you can proceed to [starting a project](./start-a-project.md). +But first, note that help is not far away: ## Getting Support @@ -11,153 +10,190 @@ After installing the Agoric SDK, you can proceed to [starting a project](./start - Join weekly [Office Hours](https://github.com/Agoric/agoric-sdk/wiki/Office-Hours) - Search and post [Q & A](https://github.com/Agoric/agoric-sdk/discussions/categories/q-a) in [agoric-sdk discussions](https://github.com/Agoric/agoric-sdk/discussions) -## Quick Start +## Platform Requirements -If you're on a [supported platform](#platform-linux-shell-or-equivalent) (MacOS, Linux, or WSL) and you're familar with JavaScript development tools such as `node`, `yarn`, and `git`: +We support any long-term support (LTS) versions of Node.js. +Download and install from [Node.js](https://nodejs.org/) if you don't +already have `node`. Check to make sure: ```shell -go version # Version 1.20.3 or higher node --version # LTS version such as 18.16.0 -npm install --global yarn # Install yarn for package management -git clone --branch community-dev https://github.com/Agoric/agoric-sdk # Clone the "community-dev" branch -cd agoric-sdk -yarn install # Asks yarn to install all the dependant node packages -yarn build # Builds the agoric-sdk packages -(cd packages/cosmic-swingset && make) # Builds the cosmic-swingset package -yarn link-cli ~/bin/agoric # Creates an executable script -agoric --version # Prints the version number of the SDK ``` -Now you are ready proceed to [starting a project](./start-a-project.md). +We use the `yarn` package manager. [Installing with corepack](https://yarnpkg.com/corepack) is what the `yarn` maintainers recommend: -_If you get "command not found", see [troubleshooting below](#install-agoric-cli)._ - -::: tip Watch: Prepare Your Agoric Environment (November 2020) -This presentation is a good overview of the Agoric SDK setup process, -though a few details are out of date: - -- node version: 12.x is too old; use the LTS version 18.16.0 or a later LTS version -- skip `git checkout hackathon-2020-11`; use the `community-dev` branch - - - -**Note:** Video omits adding the Agoric SDK to your PATH. -::: - -## Platform: Linux Shell or Equivalent +```sh +corepack enable +yarn --version # 1.x +``` The Agoric SDK is supported on Linux, MacOS, and Windows Subsystem for Linux (WSL). -- To open a terminal on MacOS, see **Applications>Utilities>terminal** in the **Finder**. -- To launch a terminal on Linux, use the **Terminal** application. -- To access WSL from Windows, visit the [WSL documentation](https://docs.microsoft.com/en-us/windows/wsl/). - ::: tip Mac Dev Tools On a Mac, you must first install [Xcode](https://apps.apple.com/us/app/xcode/id497799835) ::: -## Install Go +We support running a local Agoric blockchain with [docker-compose](https://docs.docker.com/compose/). -Download Go from [go.dev/doc/install](https://go.dev/doc/install) and follow the instructions for your platform. +Our user interfaces integrate with the [keplr](https://www.keplr.app/) wallet. -```shell -go version # Version 1.20.3 or higher +## Create a project with the basic starter kit + +Choose a name such as `demo` and then: + +```sh +yarn create @agoric/dapp demo ``` -## Install Node.js +::: tip TODO: make dapp-game-places the default -Download Node.js from [Node.js](https://nodejs.org/) and follow the instructions for your platform. -We recommend installing the LTS version of node 18. +Until `dapp-game-places` is the default, use `--dapp-base` etc. +to refer to it: + +```sh +yarn create @agoric/dapp \ + --dapp-base https://github.com/agoric-labs/ \ + --dapp-template dapp-game-places \ + demo -```shell -node --version # LTS version such as 18.16.0 ``` -**Note:** Agoric will support all long-term support (LTS) versions of Node.js. +::: -## Install the Yarn Package Manager +### Project structure -Follow [Yarn Installation](https://classic.yarnpkg.com/en/docs/install) -instructions. For example: +The `demo` directory now has: -```shell -npm install --global yarn -yarn --version # 1.22.10 or higher -``` +- **README.md** +- **package.json** as usual for a JavaScript project, along with **yarn.lock** +- **contract/** - smart contract source code, tests, etc. +- **ui/** - web UI +- **docker-compose.yml** - for running a local Agoric blockchain -## Install Git +::: tip TODO: prune api, agstate -Follow [Git installation instructions](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) or use your platform's package manager. +Disregard these contents, for now: -```shell -npm install --global git -git --version # 2.25.0 or higher +- **\_agstate** +- **api** + ::: + + node_modules + +## Install dependencies + +The UI depends on the React framework, and the contract depends on +the Agoric framework. The packages in this project also have +development dependencies for testing, code formatting, and static analysis. + +```sh +cd demo +yarn install # may take several minutes ``` -## Clone the Agoric SDK +::: tip Troubleshooting `yarn install` -```shell -git clone --branch community-dev https://github.com/Agoric/agoric-sdk -cd agoric-sdk +If you run into errors during install or build, make sure you have the relevant developer tools installed. For example, on Debian or Ubuntu Linux, you can run `sudo apt get install build-essential` to install these tools. + +Also, check that you are on a +[supported platform](#platform-linux-shell-or-equivalent) and +not native Windows. +::: + +## Start a local Agoric blockchain + +To run a local Agoric blockchain with [docker-compose](https://docs.docker.com/compose/): + +```sh +yarn start:docker ``` -Cloning and installing the Agoric SDK can take a while. Please be patient. +::: tip Note: large docker image -## Install NPM Dependencies +The docker image used here is several gigabytes. +The fist time you pull it may take several minutes. -```shell -yarn install +::: + +Look at the logs from the blockchain until it is steadily making blocks: + +```sh +yarn docker:logs ``` -**Note:** If you run into errors during install or build, make sure you have the relevant developer tools installed. For example, on Debian or Ubuntu Linux, you can run `sudo apt get install build-essential` to install these tools. +## Deploy the Contract and Start the UI -## Build Packages +Let's start it up: -```shell -yarn build +```sh +yarn start ``` -**Note:** If this `yarn build` step fails, check that you are on a -[supported platform](#platform-linux-shell-or-equivalent) and -not native Windows. +::: tip TODO: integrated `yarn start` script -## Build the Cosmic Swingset Package +For now, use the [Agoric Gov Proposal Builder](https://cosgov.org/) +for deployment: -```shell -(cd packages/cosmic-swingset && make) +1. Make the contract and proposal bundles. + +```sh +(cd contract; yarn build:proposal) ``` -## Install Agoric CLI +Note the long `b1-xxx.json` bundle filenames +as well as `start-game1-permit.json` +and `start-game1.js`. -Use `yarn link-cli` to install the Agoric CLI (Command Line Interface) in a convenient place of your choosing such as: +2. Use the [Install Bundle](https://cosgov.org/?msgType=installBundle&network=local) tab to install the 2 bundles. + It will likely say **insufficient balance**. + To get enough IST: -```shell -yarn link-cli ~/bin/agoric +```sh +yarn docker:make mint4k ``` -or: +2. Get ready to vote. To query the status of proposals, use -```shell -sudo yarn link-cli /usr/local/bin/agoric +```sh +yarn docker:make gov-q ``` -**Note:** Run `echo $PATH` to see directories in your current path, separated by colons. These are good candidates for where to have `yarn link-cli` place the executable. +Then, don't execute this command, but get it ready: -::: tip Troubleshooting "command not found" -Watch: +```sh +yarn docker:make vote PROPOSAL=N +``` -- [Linux add to \$PATH: Fix "command not found" error (Linux & Mac)](https://www.youtube.com/watch?v=gkqsLRDnqlA) 6:19 Mar 2018. - ::: +3. Use the [CoreEval Proposal](https://cosgov.org/?msgType=coreEvalProposal&network=local) tab to make a proposal to + start the contract using the permit and script. + Note the **10 second voting period**, + When you **Sign & Submit** the proposal, you can replace `N` + above with the proposal number that pops up. + + To verify that the proposal executed correctly: -## Check the Agoric Version +```sh +docker-compose logs | less -R +``` -To check that it's installed correctly: +The logs should include some `console.log` output with no errors. -```shell -agoric --version # v0.18.2 "community-dev" branch +**TODO: what console output exactly?** + +4. Start the UI + +```sh +(cd ui; yarn dev) ``` -If the install was successful, you are ready to proceed to [starting a project](./start-a-project.md). +::: + +Use `yarn docker:bash` to print account info, including `user1`. +Add that account to keplr using its mnemonic. +Then hit **Connect Wallet**. The UI should show your address. +Then **Make Offer**. Keplr should show an offer to **give** 0.25 IST +and **want** a few places. Sign and broadcast the offer. +After a few seconds, the UI should show the places. From b1843795486daebc664c7c573b63314255065242 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 29 Nov 2023 00:34:20 -0600 Subject: [PATCH 3/9] test(zoe): snippets for learning zoe lessons 1, 2, 3 --- snippets/zoe/contracts/test-zoe-hello.js | 32 ++++++++++++++++++++++++ snippets/zoe/src/01-hello.js | 16 ++++++++++++ snippets/zoe/src/02-state.js | 16 ++++++++++++ snippets/zoe/src/03-access.js | 20 +++++++++++++++ 4 files changed, 84 insertions(+) create mode 100644 snippets/zoe/contracts/test-zoe-hello.js create mode 100644 snippets/zoe/src/01-hello.js create mode 100644 snippets/zoe/src/02-state.js create mode 100644 snippets/zoe/src/03-access.js diff --git a/snippets/zoe/contracts/test-zoe-hello.js b/snippets/zoe/contracts/test-zoe-hello.js new file mode 100644 index 000000000..8fc76b137 --- /dev/null +++ b/snippets/zoe/contracts/test-zoe-hello.js @@ -0,0 +1,32 @@ +// TODO: convince prettier that harden() is a global +/* global harden */ + +import '@endo/init'; +import { E } from '@endo/far'; +import test from 'ava'; +import { start as startHello } from '../src/01-hello.js'; +import { start as startState } from '../src/02-state.js'; +import { start as startAccess } from '../src/03-access.js'; + +const mockZcf = harden({}); + +test('contract greet greets by name', async t => { + const { publicFacet } = startHello(mockZcf); + const actual = await E(publicFacet).greet('Bob'); + t.is(actual, 'Hello, Bob!'); +}); + +test('state', async t => { + const { publicFacet } = startState(mockZcf); + t.is(await E(publicFacet).get(), 'Hello, World!'); + await E(publicFacet).set(2); + t.is(await E(publicFacet).get(), 2); +}); + +test('access', async t => { + const { publicFacet, creatorFacet } = startAccess(mockZcf); + t.is(await E(publicFacet).get(), 'Hello, World!'); + await t.throwsAsync(E(publicFacet).set(2), { message: /no method/ }); + await E(creatorFacet).set(2); + t.is(await E(publicFacet).get(), 2); +}); diff --git a/snippets/zoe/src/01-hello.js b/snippets/zoe/src/01-hello.js new file mode 100644 index 000000000..d8ea3ffb5 --- /dev/null +++ b/snippets/zoe/src/01-hello.js @@ -0,0 +1,16 @@ +import { Far } from '@endo/far'; + +// A Zoe contract is a module that exports a start function +// that defines the contract's API. +export const start = _z => { + // publicFacet provides public API methods + // Mark it Far() to allow callers from outside the contract + // and give it a suggestive interface name for debugging. + const publicFacet = Far('Hello', { + greet: who => { + return `Hello, ${who}!`; + }, + }); + + return { publicFacet }; +}; diff --git a/snippets/zoe/src/02-state.js b/snippets/zoe/src/02-state.js new file mode 100644 index 000000000..d0eeb4395 --- /dev/null +++ b/snippets/zoe/src/02-state.js @@ -0,0 +1,16 @@ +import { Far } from '@endo/far'; + +export const start = _z => { + // Contracts can use ordinary variables for state + // that lasts between transactions. + let value = 'Hello, World!'; + const publicFacet = Far('ValueCell', { + get: () => value, + set: v => (value = v), + }); + + return { publicFacet }; +}; + +// p.s. Fits in a tweet! +// https://twitter.com/DeanTribble/status/1433268983977820161 diff --git a/snippets/zoe/src/03-access.js b/snippets/zoe/src/03-access.js new file mode 100644 index 000000000..4bda18ed2 --- /dev/null +++ b/snippets/zoe/src/03-access.js @@ -0,0 +1,20 @@ +import { Far } from '@endo/far'; + +export const start = _z => { + let value = 'Hello, World!'; + + // We can limit the public API to read-only + // by omitting the set() method + const publicFacet = Far('ValueView', { + get: () => value, + }); + + // The creatorFacet is provided only to the + // caller of E(zoe).startInstance() + const creatorFacet = Far('ValueCell', { + get: () => value, + set: v => (value = v), + }); + + return { publicFacet, creatorFacet }; +}; From 718bc8de90816f68fe4cbd4d955c662f2b03cff2 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Tue, 5 Dec 2023 23:07:08 -0600 Subject: [PATCH 4/9] docs: use `yarn start:contract`; add screenshots etc. --- main/guides/getting-started/README.md | 183 +++++++++++++++++--------- 1 file changed, 124 insertions(+), 59 deletions(-) diff --git a/main/guides/getting-started/README.md b/main/guides/getting-started/README.md index e72a0ed0a..922673fa7 100644 --- a/main/guides/getting-started/README.md +++ b/main/guides/getting-started/README.md @@ -1,8 +1,20 @@ # Starting a Basic Dapp -Welcome! We'll start with a basic _dapp_; that is: a JavaScript contract and UI. +Welcome! We'll start with a basic _dapp_; that is: a JavaScript contract and associated UI. + +Vite + React + Agoric page with Connect Wallet button + +```js +/** @param {ZCF<{joinPrice: Amount}>} zcf */ +export const start = async zcf => { + const { joinPrice } = zcf.getTerms(); +... +} +``` -But first, note that help is not far away: +As we begin, note that help is not far away: ## Getting Support @@ -12,6 +24,13 @@ But first, note that help is not far away: ## Platform Requirements +The Agoric SDK is supported on Linux, MacOS, and Windows Subsystem for Linux (WSL). + +::: tip Mac Dev Tools +On a Mac, be sure to install +[Xcode](https://apps.apple.com/us/app/xcode/id497799835). +::: + We support any long-term support (LTS) versions of Node.js. Download and install from [Node.js](https://nodejs.org/) if you don't already have `node`. Check to make sure: @@ -27,16 +46,10 @@ corepack enable yarn --version # 1.x ``` -The Agoric SDK is supported on Linux, MacOS, and Windows Subsystem for Linux (WSL). - -::: tip Mac Dev Tools -On a Mac, you must first install -[Xcode](https://apps.apple.com/us/app/xcode/id497799835) -::: - -We support running a local Agoric blockchain with [docker-compose](https://docs.docker.com/compose/). +For this getting started exercise, you will need: -Our user interfaces integrate with the [keplr](https://www.keplr.app/) wallet. +- [docker compose](https://docs.docker.com/compose/) +- [Keplr wallet](https://www.keplr.app/) wallet. ## Create a project with the basic starter kit @@ -77,9 +90,8 @@ Disregard these contents, for now: - **\_agstate** - **api** - ::: - node_modules +::: ## Install dependencies @@ -116,84 +128,137 @@ The fist time you pull it may take several minutes. ::: -Look at the logs from the blockchain until it is steadily making blocks: +Look at the logs from the blockchain: ```sh yarn docker:logs ``` -## Deploy the Contract and Start the UI - -Let's start it up: +After an initial flurry, when it is steadily making blocks, you should see: -```sh -yarn start +``` +agd_1 | 2023-12-05T20:52:42.933Z block-manager: block 956 begin +agd_1 | 2023-12-05T20:52:42.936Z block-manager: block 956 commit +agd_1 | 2023-12-05T20:52:43.944Z block-manager: block 957 begin +agd_1 | 2023-12-05T20:52:43.946Z block-manager: block 957 commit ``` -::: tip TODO: integrated `yarn start` script +Use control-C to stop viewing the logs and return to a shell prompt. -For now, use the [Agoric Gov Proposal Builder](https://cosgov.org/) -for deployment: +::: tip Note: logs include benign error messages -1. Make the contract and proposal bundles. +You can disregard messages such as: -```sh -(cd contract; yarn build:proposal) -``` +- `v5: TypeError: target has no method "getDisplayInfo"` -Note the long `b1-xxx.json` bundle filenames -as well as `start-game1-permit.json` -and `start-game1.js`. +These are artifacts of replaying historical events. -2. Use the [Install Bundle](https://cosgov.org/?msgType=installBundle&network=local) tab to install the 2 bundles. - It will likely say **insufficient balance**. - To get enough IST: +::: -```sh -yarn docker:make mint4k -``` +## Deploy the Contract -2. Get ready to vote. To query the status of proposals, use +Let's deploy the contract: ```sh -yarn docker:make gov-q +yarn start:contract ``` -Then, don't execute this command, but get it ready: +This `start:contract` script will do a number of things that we will cover in more detail later: -```sh -yarn docker:make vote PROPOSAL=N -``` +1. Bundle the contract with `agoric run ...` +2. Collect some ATOM with `agd tx bank send ...`. +3. Use the ATOM to open a vault to mint enough IST to pay to install the bundles on chain with `agops vaults open ...`. +4. Install the bundles on chain with `agd tx swingset install-bundle ...`. +5. Collect enough BLD to pay for a governance deposit with `agd tx bank send ...` +6. Make a governance proposal to start the contract with `agd tx gov submit-proposal swingset-core-eval ...`. +7. Vote for the proposal; wait for it to pass. +8. Print key material for an account you can use. -3. Use the [CoreEval Proposal](https://cosgov.org/?msgType=coreEvalProposal&network=local) tab to make a proposal to - start the contract using the permit and script. - Note the **10 second voting period**, - When you **Sign & Submit** the proposal, you can replace `N` - above with the proposal number that pops up. +## Set up Keplr wallet and import account - To verify that the proposal executed correctly: +Install the [Keplr Wallet](https://www.keplr.app/) if you have not done so already. Then copy the _mnemonic phrase_ printed at the end of the previous step; for example copy `congress` thru `switch` in the following: -```sh -docker-compose logs | less -R ``` +Import the following mnemonic into Keplr: +congress goose visual acid shine view pair fruit chaos boost cigar upgrade certain warrior color omit perfect clutch little bulb divorce split fashion switch + +The resulting address should be: agoric1a3zu5aqw255q0tuxzy9aftvgheekw2wedz3xwq +``` + +::: warning Keep your own mnemonic confidential! -The logs should include some `console.log` output with no errors. +For any mnemonic phrase you use to secure your own assets, **take care to keep it strictly confidential!** The mnemonic here is only for testing. +Using a **separate browser profile** is a good way to avoid accidentally +using the wrong account when testing vs. with real assets. -**TODO: what console output exactly?** +::: -4. Start the UI +Import it into Keplr: + +1. Inside your Keplr wallet browser extension, press the ‘Accounts’ icon on the top right corner and then click the ‘Add Wallet button. + + + +2. Choose **Import an existing wallet**. + +3. Choose **Use recover phrase or private key**. + +4. Paste the mnemonic. Hit **Import**. + + + +5. Enter a **Wallet Name** such as `user1`. Hit **Next**. + +6. On the **Select Chains** page, hit **Save** (_choice of chain does not matter at this point._) + +::: tip See also Keplr docs + +The figures above are from... + +- [Connect Additional Keplr Accounts](https://help.keplr.app/articles/how-to-connect-additional-keplr-accounts) +- [Four Ways to Create a Keplr Account](https://help.keplr.app/articles/four-ways-to-create-a-keplr-account#:~:text=Import%20an%20Existing%20Account%20via%20Mnemonic%20Phrase) + +::: + +## Start the Dapp UI + +To start the Dapp UI: ```sh -(cd ui; yarn dev) +yarn start:ui ``` -::: +The result includes a link: + +``` + VITE v4.5.0 ready in 132 ms + + ➜ Local: http://localhost:5173/ + ➜ Network: use --host to expose + ➜ press h to show help +``` -Use `yarn docker:bash` to print account info, including `user1`. -Add that account to keplr using its mnemonic. +Follow that link to get the Dapp UI: -Then hit **Connect Wallet**. The UI should show your address. +Vite + React + Agoric page with Connect Wallet button + +Then hit **Connect Wallet**. The UI should show your address and your IST balance, after you approve an **Add Agoric local to Keplr** dialog. + +## Make an Offer + +Then hit **Make Offer**. Keplr should show an offer to **give** 0.25 IST +and **want** a few places. Approve the offer to sign and broadcast it to the (local) blockchain. + +Confirm Transaction with Give / Want offer details -Then **Make Offer**. Keplr should show an offer to **give** 0.25 IST -and **want** a few places. Sign and broadcast the offer. After a few seconds, the UI should show the places. + +Purses display updated with wanted Places + +Congratulations! You are on your way to building dapps on Agoric. From 289c07410d188da3644f28ecfe5fc9fec6ed6567 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Wed, 6 Dec 2023 21:48:36 -0600 Subject: [PATCH 5/9] docs(agoric-cli): add agoric run; deprecate beta features - CLI Commands -> CLI Reference - prune initial "in this order" section in favor of list from `agoric help` - agoric run: brief usage; cite writeCoreProposals discussion - init: deprecate in favor of `yarn create @agoric/dapp` - Syntax -> Usage - markdown lint: `-` rather than `*` for lists; `_` rather than `*` for italic - install: deprecate This is supposed to be able to install from npm. I thought `agoric install agoric-upgrade-11wf` was supposed to do it, but I got an endless series of questions about what versions to use. If we have a form that's tested in ci, I'm not aware of it. Until we do, let's deprecate this. - start local-chain: document briefly - start: deprecate as beta feature - deploy: deprecate as beta feature - open: deprecate as beta feature --- main/guides/agoric-cli/README.md | 189 ++++++++++++++++++------------- 1 file changed, 112 insertions(+), 77 deletions(-) diff --git a/main/guides/agoric-cli/README.md b/main/guides/agoric-cli/README.md index f7d32ce9c..683d86e18 100644 --- a/main/guides/agoric-cli/README.md +++ b/main/guides/agoric-cli/README.md @@ -1,36 +1,72 @@ -# Agoric CLI Commands +# Agoric CLI Reference -In general, you'll want to issue the Agoric CLI (Command Line Interface) commands in this order: +## agoric help + +Displays the Agoric CLI commands and arguments with brief descriptions. + +**Usage**: + +```sh +agoric [command] +``` + +By default, lists all commands: + +``` + cosmos client for an Agoric Cosmos chain + ibc-setup set up Inter Blockchain Communication + open [options] launch the Agoric UI + init [options] create a new Dapp directory named + set-defaults [options] update the configuration files for in + ibc-relayer run an Inter Blockchain Communications relayer + install [force-sdk-version] install Dapp dependencies + follow [options] follow an Agoric Casting leader + run