From 107bf964da906399f0fbefbf0581e0d2bd35f92e Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 31 Mar 2023 11:12:19 -0500 Subject: [PATCH 1/5] fix: agops oracle: no IO (errors) at module import --- packages/agoric-cli/src/commands/oracle.js | 26 +++++++++++++--------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/packages/agoric-cli/src/commands/oracle.js b/packages/agoric-cli/src/commands/oracle.js index 34c84b8720d..54d5b744ec0 100644 --- a/packages/agoric-cli/src/commands/oracle.js +++ b/packages/agoric-cli/src/commands/oracle.js @@ -9,8 +9,6 @@ import { inspect } from 'util'; import { makeRpcUtils, storageHelper } from '../lib/rpc.js'; import { outputAction } from '../lib/wallet.js'; -const { agoricNames, fromBoard, vstorage } = await makeRpcUtils({ fetch }); - // XXX support other decimal places const COSMOS_UNIT = 1_000_000n; const scaleDecimals = num => BigInt(num * Number(COSMOS_UNIT)); @@ -43,14 +41,20 @@ export const makeOracleCommand = async logger => { `, ); - const lookupPriceAggregatorInstance = ([brandIn, brandOut]) => { - const name = `${brandIn}-${brandOut} price feed`; - const instance = agoricNames.instance[name]; - if (!instance) { - logger.debug('known instances:', agoricNames.instance); - throw new Error(`Unknown instance ${name}`); - } - return instance; + const rpcTools = async () => { + const utils = await makeRpcUtils({ fetch }); + + const lookupPriceAggregatorInstance = ([brandIn, brandOut]) => { + const name = `${brandIn}-${brandOut} price feed`; + const instance = utils.agoricNames.instance[name]; + if (!instance) { + logger.debug('known instances:', utils.agoricNames.instance); + throw new Error(`Unknown instance ${name}`); + } + return instance; + }; + + return { ...utils, lookupPriceAggregatorInstance }; }; oracle @@ -64,6 +68,7 @@ export const makeOracleCommand = async logger => { ) .option('--offerId [number]', 'Offer id', Number, Date.now()) .action(async function (opts) { + const { lookupPriceAggregatorInstance } = await rpcTools(); const instance = lookupPriceAggregatorInstance(opts.pair); /** @type {import('@agoric/smart-wallet/src/offers.js').OfferSpec} */ @@ -160,6 +165,7 @@ export const makeOracleCommand = async logger => { ) .action(async function (opts) { const { pair } = opts; + const { vstorage, fromBoard } = await rpcTools(); const capDataStr = await vstorage.readLatest( `published.priceFeed.${pair[0]}-${pair[1]}_price_feed`, From 2a7fa8cfefd99bac2bf21b3bc4661de4deaf3dcd Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 31 Mar 2023 11:16:54 -0500 Subject: [PATCH 2/5] fix: agops psm: not I/O (errors) until command action --- packages/agoric-cli/src/commands/psm.js | 64 ++++++++++++++----------- 1 file changed, 37 insertions(+), 27 deletions(-) diff --git a/packages/agoric-cli/src/commands/psm.js b/packages/agoric-cli/src/commands/psm.js index 98b1d6a4a6d..a5147db4a78 100644 --- a/packages/agoric-cli/src/commands/psm.js +++ b/packages/agoric-cli/src/commands/psm.js @@ -30,25 +30,6 @@ function collectValues(val, memo) { return memo; } -const { vstorage, fromBoard, agoricNames } = await makeRpcUtils({ fetch }); - -/** - * - * @param {[Minted: string, Anchor: string]} pair - */ -const getGovernanceState = async ([Minted, Anchor]) => { - const govContent = await vstorage.readLatest( - `published.psm.${Minted}.${Anchor}.governance`, - ); - assert(govContent, 'no gov content'); - const { current: governance } = last( - storageHelper.unserializeTxt(govContent, fromBoard), - ); - const { [`psm.${Minted}.${Anchor}`]: instance } = agoricNames.instance; - - return { instance, governance }; -}; - /** * * @param {import('anylogger').Logger} logger @@ -81,20 +62,45 @@ export const makePsmCommand = async logger => { `, ); - const lookupPsmInstance = ([minted, anchor]) => { - const name = `psm-${minted}-${anchor}`; - const instance = agoricNames.instance[name]; - if (!instance) { - logger.debug('known instances:', agoricNames.instance); - throw new Error(`Unknown instance ${name}`); - } - return instance; + const rpcTools = async () => { + const utils = await makeRpcUtils({ fetch }); + + const lookupPsmInstance = ([minted, anchor]) => { + const name = `psm-${minted}-${anchor}`; + const instance = utils.agoricNames.instance[name]; + if (!instance) { + logger.debug('known instances:', utils.agoricNames.instance); + throw new Error(`Unknown instance ${name}`); + } + return instance; + }; + + /** + * + * @param {[Minted: string, Anchor: string]} pair + */ + const getGovernanceState = async ([Minted, Anchor]) => { + const govContent = await utils.vstorage.readLatest( + `published.psm.${Minted}.${Anchor}.governance`, + ); + assert(govContent, 'no gov content'); + const { current: governance } = last( + storageHelper.unserializeTxt(govContent, utils.fromBoard), + ); + const { [`psm.${Minted}.${Anchor}`]: instance } = + utils.agoricNames.instance; + + return { instance, governance }; + }; + + return { ...utils, lookupPsmInstance, getGovernanceState }; }; psm .command('list') .description('list all PSMs in network') .action(async function () { + const { vstorage } = await rpcTools(); const mints = await vstorage.keys('published.psm'); for (const minted of mints) { const anchors = await vstorage.keys(`published.psm.${minted}`); @@ -116,6 +122,7 @@ export const makePsmCommand = async logger => { ) .action(async function (opts) { const { pair } = opts; + const { getGovernanceState } = await rpcTools(); const { governance } = await getGovernanceState(pair); console.log('psm governance params', Object.keys(governance)); console.log('MintLimit', governance.MintLimit.value); @@ -149,6 +156,7 @@ export const makePsmCommand = async logger => { .option('--offerId [string]', 'Offer id', String, `swap-${Date.now()}`) .action(async function (opts) { console.warn('running with options', opts); + const { agoricNames, lookupPsmInstance } = await rpcTools(); const instance = await lookupPsmInstance(opts.pair); const offer = Offers.psm.swap(instance, agoricNames.brand, { offerId: opts.offerId, @@ -191,6 +199,7 @@ export const makePsmCommand = async logger => { 1, ) .action(async function (opts) { + const { lookupPsmInstance } = await rpcTools(); const psmInstance = lookupPsmInstance(opts.pair); /** @type {import('@agoric/smart-wallet/src/offers.js').OfferSpec} */ @@ -242,6 +251,7 @@ export const makePsmCommand = async logger => { 1, ) .action(async function (opts) { + const { agoricNames, lookupPsmInstance } = await rpcTools(); const psmInstance = lookupPsmInstance(opts.pair); const istBrand = agoricNames.brand.IST; From d83b07d26102d6d747904e4bfe5aed518e34eb04 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 31 Mar 2023 11:18:08 -0500 Subject: [PATCH 3/5] fix: agops reserve: no I/O (errors) until command action --- packages/agoric-cli/src/commands/reserve.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/agoric-cli/src/commands/reserve.js b/packages/agoric-cli/src/commands/reserve.js index f740a04208d..a3f0e200b11 100644 --- a/packages/agoric-cli/src/commands/reserve.js +++ b/packages/agoric-cli/src/commands/reserve.js @@ -6,8 +6,6 @@ import { Command } from 'commander'; import { makeRpcUtils } from '../lib/rpc.js'; import { outputExecuteOfferAction } from '../lib/wallet.js'; -const { agoricNames } = await makeRpcUtils({ fetch }); - /** * * @param {import('anylogger').Logger} _logger @@ -36,6 +34,8 @@ export const makeReserveCommand = async _logger => { 1, ) .action(async function (opts) { + const { agoricNames } = await makeRpcUtils({ fetch }); + const reserveInstance = agoricNames.instance.reserve; assert(reserveInstance, 'missing reserve in names'); From 9f10fbd6c41030a5e80a1e6ca88424b814104708 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 31 Mar 2023 11:53:05 -0500 Subject: [PATCH 4/5] fix: agops vaults: no I/O (errors) until command action --- packages/agoric-cli/src/commands/vaults.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/agoric-cli/src/commands/vaults.js b/packages/agoric-cli/src/commands/vaults.js index 894ecbf5f39..397e75e5871 100644 --- a/packages/agoric-cli/src/commands/vaults.js +++ b/packages/agoric-cli/src/commands/vaults.js @@ -12,10 +12,6 @@ import { normalizeAddressWithOptions } from '../lib/chain.js'; import { makeRpcUtils } from '../lib/rpc.js'; import { getCurrent, outputExecuteOfferAction } from '../lib/wallet.js'; -const { agoricNames, readLatestHead } = await makeRpcUtils({ - fetch, -}); - /** * * @param {import('anylogger').Logger} logger @@ -43,6 +39,8 @@ export const makeVaultsCommand = async logger => { normalizeAddress, ) .action(async function (opts) { + const { readLatestHead } = await makeRpcUtils({ fetch }); + const current = await getCurrent(opts.from, { readLatestHead, }); @@ -66,6 +64,7 @@ export const makeVaultsCommand = async logger => { .option('--collateralBrand [string]', 'Collateral brand key', 'IbcATOM') .action(async function (opts) { logger.warn('running with options', opts); + const { agoricNames } = await makeRpcUtils({ fetch }); const offer = Offers.vaults.OpenVault(agoricNames.brand, { giveCollateral: opts.giveCollateral, @@ -95,6 +94,7 @@ export const makeVaultsCommand = async logger => { .requiredOption('--vaultId [string]', 'Key of vault (e.g. vault1)') .action(async function (opts) { logger.warn('running with options', opts); + const { agoricNames, readLatestHead } = await makeRpcUtils({ fetch }); const previousOfferId = await lookupOfferIdForVault( opts.vaultId, @@ -130,6 +130,7 @@ export const makeVaultsCommand = async logger => { .requiredOption('--vaultId [string]', 'Key of vault (e.g. vault1)') .action(async function (opts) { logger.warn('running with options', opts); + const { agoricNames, readLatestHead } = await makeRpcUtils({ fetch }); const previousOfferId = await lookupOfferIdForVault( opts.vaultId, From 58b9d4e063cd43a8c51a2b412d73f565fd0dd555 Mon Sep 17 00:00:00 2001 From: Dan Connolly Date: Fri, 31 Mar 2023 11:55:55 -0500 Subject: [PATCH 5/5] fix: agops ec: no I/O (errors) until command action --- packages/agoric-cli/src/commands/ec.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/agoric-cli/src/commands/ec.js b/packages/agoric-cli/src/commands/ec.js index 33a43380a49..3e2d19f642d 100644 --- a/packages/agoric-cli/src/commands/ec.js +++ b/packages/agoric-cli/src/commands/ec.js @@ -6,8 +6,6 @@ import { Command } from 'commander'; import { makeRpcUtils, storageHelper } from '../lib/rpc.js'; import { outputExecuteOfferAction } from '../lib/wallet.js'; -const { vstorage, fromBoard, agoricNames } = await makeRpcUtils({ fetch }); - /** * * @param {import('anylogger').Logger} _logger @@ -24,6 +22,8 @@ export const makeEconomicCommiteeCommand = async _logger => { `ecCommittee-${Date.now()}`, ) .action(async function (opts) { + const { agoricNames } = await makeRpcUtils({ fetch }); + const { economicCommittee } = agoricNames.instance; assert(economicCommittee, 'missing economicCommittee'); @@ -47,6 +47,8 @@ export const makeEconomicCommiteeCommand = async _logger => { .description('prepare an offer to accept the charter invitation') .option('--offerId [string]', 'Offer id', String, `ecCharter-${Date.now()}`) .action(async function (opts) { + const { agoricNames } = await makeRpcUtils({ fetch }); + const { econCommitteeCharter } = agoricNames.instance; assert(econCommitteeCharter, 'missing econCommitteeCharter'); @@ -79,6 +81,8 @@ export const makeEconomicCommiteeCommand = async _logger => { Number, ) .action(async function (opts) { + const { vstorage, fromBoard } = await makeRpcUtils({ fetch }); + const questionHandleCapDataStr = await vstorage.readLatest( 'published.committees.Economic_Committee.latestQuestion', );