@agoric/deploy-script-support
Version:
Helpers and other support for writing deploy scripts
126 lines (112 loc) • 3.46 kB
JavaScript
// @ts-check
import { assert } from '@endo/errors';
import { E, passStyleOf } from '@endo/far';
/**
* @import {Petname} from '@agoric/deploy-script-support/src/externalTypes.js';
* @import {Amount, Brand, Issuer, Payment, Purse} from '@agoric/ertp';
* @import {IssuerKeywordRecord, Keyword} from '@agoric/zoe';
*/
/**
* @template T
* @typedef {object} PetnameManager
* @property {(petname: Petname, object: T) => Promise<void>} rename
* @property {(petname: Petname) => T} get
* @property { () => Array<[Petname, T]>} getAll
* @property {(petname: Petname, object: T) => Promise<void>} add
*/
/**
* @typedef {PetnameManager<Installation>} InstallationManager
* @typedef {PetnameManager<Instance>} InstanceManager
* @typedef {PetnameManager<Issuer>} IssuerManager
*/
/**
* @param {ERef<IssuerManager>} issuerManager
* @param {ERef<InstanceManager>} instanceManager
* @param {ERef<ZoeService>} zoe
* @param {ERef<Purse>} zoeInvitationPurse
*/
export const makeStartInstance = (
issuerManager,
instanceManager,
zoe,
zoeInvitationPurse,
) => {
const makeIssuerKeywordRecord = issuerPetnameKeywordRecord => {
return Object.fromEntries(
Object.entries(issuerPetnameKeywordRecord).map(
([keyword, issuerPetname]) => {
const issuerP = E(issuerManager).get(issuerPetname);
return [keyword, issuerP];
},
),
);
};
const getIssuerKeywordRecord = (
issuerKeywordRecord,
issuerPetnameKeywordRecord,
) => {
if (issuerKeywordRecord !== undefined) {
return issuerKeywordRecord;
}
return makeIssuerKeywordRecord(issuerPetnameKeywordRecord);
};
/**
* @template {Installation} I
* @param {{
* instancePetname: Petname,
* installation: I | PromiseLike<I>,
* issuerKeywordRecord?: IssuerKeywordRecord,
* issuerPetnameKeywordRecord?: Record<Keyword,Petname>,
* terms?: object,
* }} config
*/
const startInstance = async config => {
const {
instancePetname,
installation,
issuerKeywordRecord,
issuerPetnameKeywordRecord,
terms,
} = config;
console.log(`- Creating Contract Instance: ${instancePetname}`);
const issuerKeywordRecordToUse = getIssuerKeywordRecord(
issuerKeywordRecord,
issuerPetnameKeywordRecord,
);
const startInstanceResult = await E(zoe).startInstance(
installation,
issuerKeywordRecordToUse,
terms,
);
const {
creatorFacet,
publicFacet,
instance,
creatorInvitation,
adminFacet,
} = startInstanceResult;
console.log(`-- Registering Contract Instance: ${instancePetname}`);
await E(instanceManager).add(instancePetname, instance);
if (passStyleOf(creatorInvitation) === 'remotable') {
assert(
creatorInvitation,
`creatorInvitation must be defined to be deposited`,
);
console.log(`-- Adding Invitation for: ${instancePetname}`);
const invitationAmount =
await E(zoeInvitationPurse).deposit(creatorInvitation);
console.log(`- Created Contract Instance: ${instancePetname}`);
const creatorInvitationDetails = invitationAmount.value[0];
return {
creatorFacet,
publicFacet,
instance,
adminFacet,
creatorInvitationDetails,
};
}
console.log(`- Created Contract Instance: ${instancePetname}`);
return startInstanceResult;
};
return startInstance;
};