UNPKG

@agoric/deploy-script-support

Version:

Helpers and other support for writing deploy scripts

167 lines (155 loc) 4.93 kB
// @ts-check /// <reference path="../../zoe/exported.js" /> import { E } from '@endo/far'; import bundleSource from '@endo/bundle-source'; import fs from 'fs/promises'; import os from 'os'; import { makeInstall } from './install.js'; import { makeOfferAndFindInvitationAmount } from './offer.js'; import { makeStartInstance } from './startInstance.js'; import { makeCacheAndGetBundleSpec } from './cachedBundleSpec.js'; import { makeDepositInvitation } from './depositInvitation.js'; import { makeSaveIssuer } from './saveIssuer.js'; import { makeGetBundlerMaker } from './getBundlerMaker.js'; import { assertOfferResult } from './assertOfferResult.js'; import { installInPieces } from './installInPieces.js'; import { makeWriteCoreEval } from './writeCoreEvalParts.js'; export * from '@agoric/internal/src/node/createBundles.js'; export { parseScriptArgs } from './parseCoreEvalArgs.js'; // These are also hard-coded in lib-wallet.js. // TODO: Add methods to the wallet to access these without hard-coding // on this end. const ZOE_INVITE_PURSE_PETNAME = 'Default Zoe invite purse'; /** * @template {Record<PropertyKey, any>} T * * Lazily populate the returned object's properties from the properties of a * source object. Each `sourceObject` property value is sampled at most once. * * @param {T} sourceObject * @returns {T} */ const makeLazyObject = sourceObject => { const lazyObject = new Proxy( {}, { get(t, key) { if (!(key in t)) { if (key in sourceObject) { t[key] = sourceObject[key]; } } return t[key]; }, }, ); return /** @type {T} */ (lazyObject); }; /** * @param {Promise<import('./externalTypes.js').CommonHome | import('./externalTypes.js').AgSoloHome>} homePromise * @param {import('./externalTypes.js').DeployScriptEndownments} endowments */ export const makeHelpers = async (homePromise, endowments) => { // Endowments provided via `agoric run` or `agoric deploy`. const { now, lookup, publishBundle, pathResolve, cacheDir = pathResolve(os.homedir(), '.agoric/cache'), } = endowments; // Internal-to-this-function lazy dependencies. const deps = makeLazyObject({ get cacheAndGetBundleSpec() { return makeCacheAndGetBundleSpec(cacheDir, { now, fs, pathResolve, }); }, get home() { return E.get(homePromise); }, get installationManager() { return E(deps.walletAdmin).getInstallationManager(); }, get instanceManager() { return E(deps.walletAdmin).getInstanceManager(); }, get issuerManager() { return E(deps.walletAdmin).getIssuerManager(); }, get offerAndFind() { assert('wallet' in deps.home, 'expected AgSolo home'); return makeOfferAndFindInvitationAmount( deps.walletAdmin, deps.home.zoe, deps.zoeInvitationPurse, ); }, get walletAdmin() { assert('wallet' in deps.home, 'expected AgSolo home'); return E(deps.home.wallet).getAdminFacet(); }, get zoeInvitationPurse() { // TODO: Rather than using one purse with a hard-coded petname, find // a better solution. return E(deps.walletAdmin).getPurse(ZOE_INVITE_PURSE_PETNAME); }, }); // The memo returned to our callers. const helpers = makeLazyObject({ assertOfferResult, get depositInvitation() { return makeDepositInvitation(deps.zoeInvitationPurse); }, get findInvitationAmount() { return deps.offerAndFind.findInvitationAmount; }, get install() { assert('wallet' in deps.home, 'expected AgSolo home'); return makeInstall( bundleSource, deps.home.zoe, deps.installationManager, deps.home.board, publishBundle, pathResolve, ); }, installInPieces, get offer() { return deps.offerAndFind.offer; }, get saveIssuer() { return makeSaveIssuer(deps.walletAdmin, deps.issuerManager); }, get startInstance() { assert('wallet' in deps.home, 'expected AgSolo home'); return makeStartInstance( deps.issuerManager, deps.instanceManager, deps.home.zoe, deps.zoeInvitationPurse, ); }, get getBundlerMaker() { return makeGetBundlerMaker(homePromise, { bundleSource, lookup }); }, /** @returns {import('./writeCoreEvalParts.js').WriteCoreEval} */ get writeCoreEval() { return makeWriteCoreEval(homePromise, endowments, { getBundleSpec: deps.cacheAndGetBundleSpec, getBundlerMaker: helpers.getBundlerMaker, }); }, /** @deprecated use writeCoreEval */ get writeCoreProposal() { return makeWriteCoreEval(homePromise, endowments, { getBundleSpec: deps.cacheAndGetBundleSpec, getBundlerMaker: helpers.getBundlerMaker, }); }, }); return helpers; };