agoric 0.22.0-u19.3 → 0.22.0-u21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,79 +2,6 @@
2
2
 
3
3
  If you just want to use the Agoric CLI for your own smart contract, please see the [Getting Started website](https://agoric.com/documentation/getting-started/) for information.
4
4
 
5
- ## Relaying via IBC
6
-
7
- The CLI integrates support for the [Confio
8
- ts-relayer](https://github.com/confio/ts-relayer#quick-start) via the
9
- `agoric ibc-setup` and `agoric ibc-relayer` commands.
10
-
11
- Run `agoric start --reset -v local-chain` in a project directory. In the
12
- meantime, you can configure the relayer (note that `--registry-from .` means to use `./registry.yaml`):
13
-
14
- ```console
15
- $ agoric ibc-setup init --registry-from . --src local --dest ollinet
16
- ...
17
- $ agoric ibc-setup keys list
18
- ollinet: agoric1fwk40de0xu7gtlk8z858q2f5lfcqv33ml8qdg4
19
- local: agoric1rvyry6jqmcrrm4ay9tu23rer7que8kdj4206zk
20
- $
21
- ```
22
-
23
- Once your chain has booted, send some `uist` tokens to your `local` relayer
24
- account printed above:
25
-
26
- ```console
27
- $ agd --home=_agstate/keys tx --keyring-backend=test bank send provision agoric1rvyry6jqmcrrm4ay9tu23rer7que8kdj4206zk 20000000uist --from=provision --chain-id=agoriclocal --yes
28
- ...
29
- $
30
- ```
31
-
32
- Go to https://ollinet.faucet.agoric.net and fund your `ollinet` relayer account
33
- printed above with BLD/IBC toy tokens.
34
-
35
- Check your relayer balances. Both `local` and `ollinet` relayer accounts should
36
- show `ubld` and `uist`:
37
-
38
- ```console
39
- $ agoric ibc-setup balances
40
- CHAIN AMOUNT
41
- ollinet 74972124ubld
42
- local 20000000uist
43
- $
44
- ```
45
-
46
- Create an ICS-20 fungible token transfer channel:
47
-
48
- ```console
49
- $ agoric ibc-setup ics20 -v
50
- ...
51
- Created channel:
52
- agoriclocal: transfer/channel-0 (connection-0)
53
- agoricollinet-55: transfer/channel-33 (connection-12)
54
- $
55
- ```
56
-
57
- Now that the channel exists, you can relay packets along it just by using:
58
-
59
- ```console
60
- $ agoric ibc-relayer start -v --poll 15
61
- ```
62
-
63
- Leave this running in the background, and use the above `transfer/channel-0` or
64
- `transfer/channel-33` to send tokens back and forth. The following
65
- example uses the `tx ibc-transfer transfer` command, and then
66
- `transfer channel-0` to indicate the `transfer/channel-0` portID/channelID. It really wants you to know this is about token *transfer*.
67
-
68
- ```console
69
- $ agd --home=_agstate/keys tx ibc-transfer transfer --keyring-backend=test \
70
- transfer channel-0 \
71
- agoric1fwk40de0xu7gtlk8z858q2f5lfcqv33ml8qdg4 200uist \
72
- --from=provision --chain-id=agoriclocal --yes
73
- ...
74
- # Watch the ibc-relayer send a packet and its acknowledgement, then...
75
- $ agd query bank balances agoric1rvyry6jqmcrrm4ay9tu23rer7que8kdj4206zk
76
- ```
77
-
78
5
  ## Developing Agoric CLI
79
6
 
80
7
  **NOTE: these steps are only for modifying the Agoric CLI. See the above for using it to create your own smart contracts.**
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "agoric",
3
- "version": "0.22.0-u19.3",
3
+ "version": "0.22.0-u21.0",
4
4
  "description": "Manage the Agoric Javascript smart contract platform",
5
5
  "type": "module",
6
6
  "main": "src/main.js",
7
7
  "bin": {
8
- "agoric": "src/entrypoint.js",
9
- "agops": "src/bin-agops.js"
8
+ "agops": "src/bin-agops.js",
9
+ "agoric": "src/entrypoint.js"
10
10
  },
11
11
  "exports": {
12
12
  "./src/entrypoint.js": "./src/entrypoint.js",
@@ -25,57 +25,56 @@
25
25
  "test:xs": "exit 0",
26
26
  "integration-test": "ava --config .ava-integration-test.config.js",
27
27
  "lint-fix": "yarn lint:eslint --fix",
28
- "lint": "run-s --continue-on-error lint:*",
29
- "lint:types": "tsc",
30
- "lint:eslint": "eslint ."
28
+ "lint": "yarn run -T run-s --continue-on-error 'lint:*'",
29
+ "lint:types": "yarn run -T tsc",
30
+ "lint:eslint": "yarn run -T eslint ."
31
31
  },
32
32
  "devDependencies": {
33
- "@agoric/cosmic-swingset": "^0.42.0-u19.3",
34
- "@agoric/deploy-script-support": "^0.10.4-u19.2",
33
+ "@agoric/cosmic-swingset": "workspace:*",
34
+ "@agoric/deploy-script-support": "workspace:*",
35
35
  "ava": "^5.3.0",
36
36
  "c8": "^10.1.2"
37
37
  },
38
38
  "dependencies": {
39
- "@agoric/access-token": "^0.4.22-u19.0",
40
- "@agoric/cache": "^0.3.3-u19.2",
41
- "@agoric/casting": "^0.4.3-u19.2",
42
- "@agoric/client-utils": "^0.2.0-u19.2",
43
- "@agoric/cosmic-proto": "^0.5.0-u19.2",
44
- "@agoric/ertp": "^0.16.3-u19.2",
45
- "@agoric/governance": "^0.10.4-u19.2",
46
- "@agoric/inter-protocol": "^0.17.0-u19.2",
47
- "@agoric/internal": "^0.4.0-u19.2",
48
- "@agoric/network": "^0.2.0-u19.2",
49
- "@agoric/smart-wallet": "^0.5.4-u19.2",
50
- "@agoric/store": "^0.9.3-u19.0",
51
- "@agoric/swingset-vat": "^0.33.0-u19.2",
52
- "@agoric/vats": "^0.16.0-u19.2",
53
- "@agoric/zoe": "^0.27.0-u19.2",
54
- "@agoric/zone": "^0.3.0-u19.2",
55
- "@confio/relayer": "^0.11.3",
56
- "@cosmjs/crypto": "^0.32.3",
57
- "@cosmjs/encoding": "^0.32.3",
58
- "@cosmjs/math": "^0.32.3",
59
- "@cosmjs/proto-signing": "^0.32.3",
60
- "@cosmjs/stargate": "^0.32.3",
61
- "@endo/bundle-source": "^3.5.1",
62
- "@endo/captp": "^4.4.4",
63
- "@endo/compartment-mapper": "^1.5.0",
39
+ "@agoric/access-token": "workspace:*",
40
+ "@agoric/cache": "workspace:*",
41
+ "@agoric/casting": "workspace:*",
42
+ "@agoric/client-utils": "workspace:*",
43
+ "@agoric/cosmic-proto": "workspace:*",
44
+ "@agoric/ertp": "workspace:*",
45
+ "@agoric/governance": "workspace:*",
46
+ "@agoric/inter-protocol": "workspace:*",
47
+ "@agoric/internal": "workspace:*",
48
+ "@agoric/network": "workspace:*",
49
+ "@agoric/smart-wallet": "workspace:*",
50
+ "@agoric/store": "workspace:*",
51
+ "@agoric/swingset-vat": "workspace:*",
52
+ "@agoric/vats": "workspace:*",
53
+ "@agoric/zoe": "workspace:*",
54
+ "@agoric/zone": "workspace:*",
55
+ "@cosmjs/crypto": "^0.33.0",
56
+ "@cosmjs/encoding": "^0.33.0",
57
+ "@cosmjs/math": "^0.33.0",
58
+ "@cosmjs/proto-signing": "^0.33.0",
59
+ "@cosmjs/stargate": "^0.33.0",
60
+ "@endo/base64": "^1.0.9",
61
+ "@endo/bundle-source": "^4.0.0",
62
+ "@endo/captp": "^4.4.5",
63
+ "@endo/compartment-mapper": "^1.6.0",
64
64
  "@endo/env-options": "^1.1.8",
65
- "@endo/errors": "^1.2.9",
66
- "@endo/far": "^1.1.10",
67
- "@endo/init": "^1.1.8",
68
- "@endo/marshal": "^1.6.3",
69
- "@endo/nat": "^5.0.14",
70
- "@endo/patterns": "^1.4.8",
71
- "@endo/promise-kit": "^1.1.9",
65
+ "@endo/errors": "^1.2.10",
66
+ "@endo/far": "^1.1.11",
67
+ "@endo/init": "^1.1.9",
68
+ "@endo/marshal": "^1.6.4",
69
+ "@endo/nat": "^5.1.0",
70
+ "@endo/patterns": "^1.5.0",
71
+ "@endo/promise-kit": "^1.1.10",
72
72
  "@endo/zip": "^1.0.9",
73
73
  "@iarna/toml": "^2.2.3",
74
74
  "anylogger": "^0.21.0",
75
75
  "chalk": "^5.2.0",
76
76
  "commander": "^12.1.0",
77
77
  "deterministic-json": "^1.0.5",
78
- "esm": "agoric-labs/esm#Agoric-built",
79
78
  "inquirer": "^8.2.2",
80
79
  "opener": "^1.5.2",
81
80
  "tmp": "^0.2.1",
@@ -100,7 +99,7 @@
100
99
  "workerThreads": false
101
100
  },
102
101
  "typeCoverage": {
103
- "atLeast": 78.73
102
+ "atLeast": 79.15
104
103
  },
105
- "gitHead": "f0ae74b84cb6de3724bfdcd18b4bea7e8199dee1"
104
+ "gitHead": "e4dd46857133403d584bcf822a81817b355532f9"
106
105
  }
package/src/bin-agops.js CHANGED
@@ -3,8 +3,6 @@
3
3
  // @ts-check
4
4
  // @jessie-check
5
5
 
6
- import '@endo/init/pre.js';
7
-
8
6
  import '@endo/init';
9
7
 
10
8
  import { E } from '@endo/far';
@@ -255,8 +255,14 @@ export function finishCosmosGenesis({ genesisJson, exportedGenesisJson }) {
255
255
 
256
256
  // Set the denomination for different modules.
257
257
  genesis.app_state.mint.params.mint_denom = MINT_DENOM;
258
- genesis.app_state.gov.deposit_params.min_deposit = GOV_DEPOSIT_COINS;
259
- genesis.app_state.gov.voting_params.voting_period = GOV_VOTING_PERIOD;
258
+
259
+ {
260
+ const gov = genesis.app_state.gov;
261
+ const depositParams = gov.params ?? gov.deposit_params;
262
+ const votingParams = gov.params ?? gov.voting_params;
263
+ depositParams.min_deposit = GOV_DEPOSIT_COINS;
264
+ votingParams.voting_period = GOV_VOTING_PERIOD;
265
+ }
260
266
 
261
267
  // Reduce the cost of a transaction.
262
268
  genesis.app_state.auth.params.tx_size_cost_per_byte = '1';
@@ -11,6 +11,7 @@ import { outputActionAndHint } from '../lib/wallet.js';
11
11
 
12
12
  /**
13
13
  * @import {ParamTypesMap, ParamTypesMapFromRecord} from '@agoric/governance/src/contractGovernance/typedParamManager.js'
14
+ * @import {AuctionParamRecord} from '@agoric/inter-protocol/src/auction/params.js';
14
15
  * @import {ParamValueForType} from '@agoric/governance/src/types.js'
15
16
  */
16
17
 
@@ -23,7 +24,6 @@ const networkConfig = await fetchEnvNetworkConfig({ env: process.env, fetch });
23
24
  * }} ParamValues
24
25
  */
25
26
 
26
- /** @typedef {ReturnType<import('@agoric/inter-protocol/src/auction/params.js').makeAuctioneerParams>} AuctionParamRecord */
27
27
  /** @typedef {ParamValues<ParamTypesMapFromRecord<AuctionParamRecord>>} AuctionParams */
28
28
 
29
29
  /**
@@ -51,6 +51,7 @@ export const makePerfCommand = logger => {
51
51
  'address literal or name',
52
52
  normalizeAddress,
53
53
  )
54
+ .option('--verbose')
54
55
  .action(async function (opts) {
55
56
  const sharedOpts = perf.opts();
56
57
  logger.warn({ sharedOpts, opts });
@@ -63,15 +64,13 @@ export const makePerfCommand = logger => {
63
64
 
64
65
  const spec = `:published.wallet.${opts.from}`;
65
66
 
66
- const leaderOptions = makeLeaderOptions({
67
- sleep: SLEEP_SECONDS,
68
- jitter: 0,
69
- log: () => undefined,
70
- });
71
-
72
67
  const leader = makeLeaderFromRpcAddresses(
73
68
  networkConfig.rpcAddrs,
74
- leaderOptions,
69
+ makeLeaderOptions({
70
+ sleep: SLEEP_SECONDS,
71
+ jitter: 0,
72
+ log: console.warn,
73
+ }),
75
74
  );
76
75
 
77
76
  logger.warn('Following', spec);
@@ -86,9 +85,10 @@ export const makePerfCommand = logger => {
86
85
  if (status.error) {
87
86
  console.error(status.error);
88
87
  exit(1);
89
- } else if (status.numWantsSatisfied)
88
+ } else if (status.numWantsSatisfied) {
90
89
  process.stdout.write(`satisfied: ${status.numWantsSatisfied}\n`);
91
- exit(0);
90
+ exit(0);
91
+ }
92
92
  }
93
93
  }
94
94
  };
@@ -102,7 +102,11 @@ export const makePerfCommand = logger => {
102
102
  if (sharedOpts.home) {
103
103
  cmd.push(`--home=${sharedOpts.home}`);
104
104
  }
105
- execSwingsetTransaction(cmd, { from: opts.from, ...networkConfig });
105
+ execSwingsetTransaction(cmd, {
106
+ from: opts.from,
107
+ verbose: opts.verbose,
108
+ ...networkConfig,
109
+ });
106
110
  });
107
111
 
108
112
  return perf;
@@ -278,15 +278,13 @@ export const makeWalletCommand = async command => {
278
278
  .action(async function ({ from }) {
279
279
  const spec = `:published.wallet.${from}`;
280
280
 
281
- const leaderOptions = makeLeaderOptions({
282
- sleep: SLEEP_SECONDS,
283
- jitter: 0,
284
- log: () => undefined,
285
- });
286
-
287
281
  const leader = makeLeaderFromRpcAddresses(
288
282
  networkConfig.rpcAddrs,
289
- leaderOptions,
283
+ makeLeaderOptions({
284
+ sleep: SLEEP_SECONDS,
285
+ jitter: 0,
286
+ log: console.warn,
287
+ }),
290
288
  );
291
289
 
292
290
  console.warn('Following', spec);
package/src/entrypoint.js CHANGED
@@ -2,8 +2,6 @@
2
2
  /* eslint-env node */
3
3
  // @jessie-check
4
4
 
5
- import '@endo/init/pre.js';
6
- import 'esm';
7
5
  import '@endo/init/legacy.js';
8
6
 
9
7
  import path from 'path';
package/src/follow.js CHANGED
@@ -126,16 +126,17 @@ export default async function followerMain(progname, rawArgs, powers, opts) {
126
126
  });
127
127
  }
128
128
 
129
- const leaderOptions = makeLeaderOptions({
130
- sleep,
131
- jitter,
132
- log: verbose ? console.warn : () => undefined,
133
- });
134
-
135
129
  const [_cmd, ...specs] = rawArgs;
136
130
 
137
131
  verbose && console.warn('Creating leader for', bootstrap);
138
- const leader = makeLeader(bootstrap, leaderOptions);
132
+ const leader = makeLeader(
133
+ bootstrap,
134
+ makeLeaderOptions({
135
+ sleep,
136
+ jitter,
137
+ log: verbose ? console.warn : () => undefined,
138
+ }),
139
+ );
139
140
  const iterate = opts.lossy ? iterateLatest : iterateEach;
140
141
  await Promise.all(
141
142
  specs.map(async spec => {
package/src/install.js CHANGED
@@ -32,7 +32,7 @@ export default async function installMain(progname, rawArgs, powers, opts) {
32
32
  const rimraf = file => pspawn('rm', ['-rf', file]);
33
33
 
34
34
  async function getWorktreePackagePaths(cwd = '.', map = new Map()) {
35
- for (const { name, location } of listWorkspaces({ execFileSync })) {
35
+ for (const { name, location } of listWorkspaces({ execFileSync }, cwd)) {
36
36
  map.set(name, path.resolve(cwd, location));
37
37
  }
38
38
  return map;
package/src/lib/chain.js CHANGED
@@ -216,7 +216,7 @@ export const pollTx = async (txhash, opts) => {
216
216
  ...nodeArgs,
217
217
  ...outJson,
218
218
  ],
219
- { stdio: ['ignore', 'pipe', 'ignore'] },
219
+ { stdio: ['ignore', 'pipe', 'pipe'] },
220
220
  );
221
221
  // XXX this type is defined in a .proto file somewhere
222
222
  /** @type {{ height: string, txhash: string, code: number, timestamp: string }} */
@@ -8,13 +8,15 @@
8
8
  * Omits the root
9
9
  *
10
10
  * @param {{ execFileSync: execFileSync }} io
11
+ * @param {string} [root]
11
12
  * @returns {Array<{ location: string, name: string }>}
12
13
  */
13
- export const listWorkspaces = ({ execFileSync }) => {
14
+ export const listWorkspaces = ({ execFileSync }, root) => {
14
15
  const out = execFileSync('npm', ['query', '.workspace'], {
15
16
  stdio: ['ignore', 'pipe', 'inherit'],
16
17
  shell: true,
17
18
  encoding: 'utf-8',
19
+ cwd: root,
18
20
  });
19
21
  /** @type {Array<{ location: string, name: string, description: string }>} */
20
22
  const result = JSON.parse(out);
package/src/main.js CHANGED
@@ -87,19 +87,6 @@ const main = async (progname, rawArgs, powers) => {
87
87
  return subMain(cosmosMain, ['cosmos', ...command], opts);
88
88
  });
89
89
 
90
- const ibcSetup = path.join(
91
- dirname,
92
- '..',
93
- 'node_modules',
94
- '.bin',
95
- 'ibc-setup',
96
- );
97
- program.command(
98
- 'ibc-setup <command...>',
99
- 'set up Inter Blockchain Communication',
100
- { executableFile: ibcSetup },
101
- );
102
-
103
90
  baseCmd('open')
104
91
  .description('launch the Agoric UI')
105
92
  .option(
@@ -184,21 +171,6 @@ const main = async (progname, rawArgs, powers) => {
184
171
  return subMain(setDefaultsMain, ['set-defaults', prog, configDir], opts);
185
172
  });
186
173
 
187
- const ibcRelayer = path.join(
188
- dirname,
189
- '..',
190
- 'node_modules',
191
- '.bin',
192
- 'ibc-relayer',
193
- );
194
- program.command(
195
- 'ibc-relayer',
196
- 'run an Inter Blockchain Communications relayer',
197
- {
198
- executableFile: ibcRelayer,
199
- },
200
- );
201
-
202
174
  baseCmd('install [force-sdk-version]')
203
175
  .description('install Dapp dependencies')
204
176
  .action(async (forceSdkVersion, _options, cmd) => {
@@ -210,17 +182,13 @@ const main = async (progname, rawArgs, powers) => {
210
182
  baseCmd('follow <path-spec...>')
211
183
  .description('follow an Agoric Casting leader')
212
184
  .option(
213
- '--proof <strict | optimistic | none>',
214
- 'set proof mode',
185
+ '--proof <none>',
186
+ `set proof mode (currently only 'none' is supported)`,
215
187
  value => {
216
- assert(
217
- ['strict', 'optimistic', 'none'].includes(value),
218
- X`--proof must be one of 'strict', 'optimistic', or 'none'`,
219
- TypeError,
220
- );
188
+ assert.equal(value, 'none', X`--proof can only be 'none'`, TypeError);
221
189
  return value;
222
190
  },
223
- 'optimistic',
191
+ 'none',
224
192
  )
225
193
  .option(
226
194
  '--sleep <seconds>',
package/src/scripts.js CHANGED
@@ -2,15 +2,11 @@
2
2
  /* eslint-env node */
3
3
  import bundleSource from '@endo/bundle-source';
4
4
  import { E } from '@endo/captp';
5
- import { search as readContainingPackageDescriptor } from '@endo/compartment-mapper';
6
5
 
7
- import createEsmRequire from 'esm';
8
6
  import { createRequire } from 'module';
9
7
  import path from 'path';
10
- import url from 'url';
11
8
 
12
9
  const require = createRequire(import.meta.url);
13
- const esmRequire = createEsmRequire(/** @type {NodeModule} */ ({}));
14
10
 
15
11
  const PATH_SEP_RE = new RegExp(`${path.sep.replace(/\\/g, '\\\\')}`, 'g');
16
12
 
@@ -133,31 +129,8 @@ export { bootPlugin } from ${JSON.stringify(absPath)};
133
129
  // Use a dynamic import to load the deploy script.
134
130
  // It is unconfined.
135
131
 
136
- // Use Node.js ESM support if package.json of template says "type":
137
- // "module".
138
- const read = async location => fs.readFile(url.fileURLToPath(location));
139
- const { packageDescriptorText } = await readContainingPackageDescriptor(
140
- read,
141
- url.pathToFileURL(moduleFile).href,
142
- ).catch(cause => {
143
- throw Error(
144
- `Expected a package.json beside deploy script ${moduleFile}, ${cause}`,
145
- { cause },
146
- );
147
- });
148
- const packageDescriptor = JSON.parse(packageDescriptorText);
149
- const nativeEsm = packageDescriptor.type === 'module';
150
- console.log(
151
- `Deploy script will run with ${
152
- nativeEsm ? 'Node.js ESM' : 'standardthings/esm emulation'
153
- }`,
154
- );
155
-
156
132
  const modulePath = pathResolve(moduleFile);
157
- let mainNS = await (nativeEsm && import(modulePath));
158
- if (!mainNS) {
159
- mainNS = esmRequire(modulePath);
160
- }
133
+ const mainNS = await import(modulePath);
161
134
 
162
135
  const allEndowments = harden({
163
136
  home: bootP,
@@ -1,11 +1,16 @@
1
1
  // DO NOT EDIT - automatically generated by get-sdk-package-names.js
2
2
  // prettier-ignore
3
3
  export default [
4
+ "@aglocal/benchmark",
5
+ "@aglocal/boot",
6
+ "@aglocal/deployment",
7
+ "@aglocal/fast-usdc-contract",
8
+ "@aglocal/fast-usdc-deploy",
9
+ "@aglocal/portfolio-contract",
10
+ "@aglocal/swingset-runner",
4
11
  "@agoric/access-token",
5
12
  "@agoric/async-flow",
6
13
  "@agoric/base-zone",
7
- "@agoric/benchmark",
8
- "@agoric/boot",
9
14
  "@agoric/builders",
10
15
  "@agoric/cache",
11
16
  "@agoric/casting",
@@ -15,7 +20,6 @@ export default [
15
20
  "@agoric/cosmos",
16
21
  "@agoric/create-dapp",
17
22
  "@agoric/deploy-script-support",
18
- "@agoric/deployment",
19
23
  "@agoric/ertp",
20
24
  "@agoric/eslint-config",
21
25
  "@agoric/fast-usdc",
@@ -36,7 +40,6 @@ export default [
36
40
  "@agoric/store",
37
41
  "@agoric/swing-store",
38
42
  "@agoric/swingset-liveslots",
39
- "@agoric/swingset-runner",
40
43
  "@agoric/swingset-vat",
41
44
  "@agoric/swingset-xsnap-supervisor",
42
45
  "@agoric/telemetry",
@@ -108,12 +108,30 @@ export const gettingStartedWorkflowTest = async (t, options = {}) => {
108
108
  });
109
109
  }
110
110
 
111
- function yarn(args) {
112
- return pspawnStdout('yarn', args, {
111
+ /**
112
+ * @param {string[]} args
113
+ * @returns {{childProcess?: import('child_process').ChildProcess} & Promise<void>}
114
+ */
115
+ function yarn(...args) {
116
+ const ps = pspawnStdout('yarn', args, {
113
117
  stdio: ['ignore', 'pipe', 'inherit'],
114
118
  env: { ...process.env },
115
119
  detached: true,
116
120
  });
121
+ /** @type {{childProcess?: import('child_process').ChildProcess} & Promise<void>} */
122
+ const p = new Promise((resolve, reject) => {
123
+ ps.then(code => {
124
+ if (code !== 0) {
125
+ reject(
126
+ new Error(`yarn ${args.join(' ')} failed with exit code ${code}`),
127
+ );
128
+ } else {
129
+ resolve();
130
+ }
131
+ }).catch(reject);
132
+ });
133
+ p.childProcess = ps.childProcess;
134
+ return p;
117
135
  }
118
136
 
119
137
  const olddir = process.cwd();
@@ -170,12 +188,12 @@ export const gettingStartedWorkflowTest = async (t, options = {}) => {
170
188
  } else {
171
189
  // ==============
172
190
  // yarn install
173
- t.is(await yarn(['install', ...installOptions]), 0, 'yarn install works');
191
+ await yarn('install', ...installOptions);
174
192
  }
175
193
 
176
194
  // ==============
177
195
  // yarn start:docker
178
- t.is(await yarn(['start:docker']), 0, 'yarn start:docker works');
196
+ await yarn('start:docker');
179
197
 
180
198
  // ==============
181
199
  // wait for the chain to start
@@ -205,11 +223,11 @@ export const gettingStartedWorkflowTest = async (t, options = {}) => {
205
223
 
206
224
  // ==============
207
225
  // yarn start:contract
208
- t.is(await yarn(['start:contract']), 0, 'yarn start:contract works');
226
+ await yarn('start:contract');
209
227
 
210
228
  // ==============
211
229
  // yarn start:ui
212
- const startUiP = yarn(['start:ui']);
230
+ const startUiP = yarn('start:ui');
213
231
  finalizers.push(() => pkill(startUiP.childProcess, 'SIGINT'));
214
232
  const uiListening = makePromiseKit();
215
233
  let retries = 0;