Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(orchestration): harden exported patterns #10470

Merged
merged 1 commit into from
Nov 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 10 additions & 12 deletions packages/ERTP/src/typeGuards.js
Original file line number Diff line number Diff line change
Expand Up @@ -75,10 +75,8 @@ const AmountValueShape = M.or(
CopyBagValueShape,
);

export const AmountShape = harden({
brand: BrandShape,
value: AmountValueShape,
});
export const AmountShape = { brand: BrandShape, value: AmountValueShape };
harden(AmountShape);

/**
* To be used to guard an amount pattern argument, i.e., an argument which is a
Expand All @@ -94,10 +92,8 @@ export const AmountShape = harden({
export const AmountPatternShape = M.pattern();

/** @type {TypedPattern<Ratio>} */
export const RatioShape = harden({
numerator: AmountShape,
denominator: AmountShape,
});
export const RatioShape = { numerator: AmountShape, denominator: AmountShape };
harden(RatioShape);

/**
* Returns true if value is a Nat bigint.
Expand Down Expand Up @@ -158,13 +154,14 @@ export const DisplayInfoShape = M.splitRecord(
},
);

export const IssuerKitShape = harden({
export const IssuerKitShape = {
brand: BrandShape,
mint: MintShape,
mintRecoveryPurse: PurseShape,
issuer: IssuerShape,
displayInfo: DisplayInfoShape,
});
};
harden(IssuerKitShape);

// //////////////////////// Interfaces /////////////////////////////////////////

Expand Down Expand Up @@ -235,10 +232,11 @@ export const makeIssuerInterfaces = (
receive: getInterfaceGuardPayload(PurseI).methodGuards.deposit,
});

const PurseIKit = harden({
const PurseIKit = {
purse: PurseI,
depositFacet: DepositFacetI,
});
};
harden(PurseIKit);

return harden({
IssuerI,
Expand Down
5 changes: 3 additions & 2 deletions packages/SwingSet/src/typeGuards.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,11 @@ export const ManagerType = M.or(

const Bundle = M.splitRecord({ moduleType: M.string() });

const SwingsetConfigOptions = harden({
const SwingsetConfigOptions = {
creationOptions: M.splitRecord({}, { critical: M.boolean() }),
parameters: M.recordOf(M.string(), M.any()),
});
};
harden(SwingsetConfigOptions);

const SwingSetConfigProperties = M.or(
M.splitRecord({ sourceSpec: M.string() }, SwingsetConfigOptions),
Expand Down
143 changes: 88 additions & 55 deletions packages/governance/src/typeGuards.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,26 +17,31 @@ export const ElectionTypeShape = M.or(
'offer_filter',
);

export const ClosingRuleShape = harden({
export const ClosingRuleShape = {
timer: M.eref(TimerShape),
deadline: TimestampShape,
});
};
harden(ClosingRuleShape);

// all the strings that will be in the filter after passing
export const YesOfferFilterPositionShape = harden({
export const YesOfferFilterPositionShape = {
strings: M.arrayOf(M.string()),
});
export const NoOfferFilterPositionShape = harden({
dontUpdate: M.arrayOf(M.string()),
});
export const OfferFilterPositionsShape = harden([
};
harden(YesOfferFilterPositionShape);

export const NoOfferFilterPositionShape = { dontUpdate: M.arrayOf(M.string()) };
harden(NoOfferFilterPositionShape);

export const OfferFilterPositionsShape = [
YesOfferFilterPositionShape,
NoOfferFilterPositionShape,
]);
export const OfferFilterIssueShape = harden({
strings: M.arrayOf(M.string()),
});
export const OfferFilterQuestionSpecShape = harden({
];
harden(OfferFilterPositionsShape);

export const OfferFilterIssueShape = { strings: M.arrayOf(M.string()) };
harden(OfferFilterIssueShape);

export const OfferFilterQuestionSpecShape = {
method: ChoiceMethodShape,
issue: OfferFilterIssueShape,
positions: OfferFilterPositionsShape,
Expand All @@ -46,34 +51,41 @@ export const OfferFilterQuestionSpecShape = harden({
closingRule: ClosingRuleShape,
quorumRule: QuorumRuleShape,
tieOutcome: NoOfferFilterPositionShape,
});
export const OfferFilterQuestionDetailsShape = harden({
};
harden(OfferFilterQuestionSpecShape);

export const OfferFilterQuestionDetailsShape = {
...OfferFilterQuestionSpecShape,
questionHandle: makeHandleShape('Question'),
counterInstance: InstanceHandleShape,
});
};
harden(OfferFilterQuestionDetailsShape);

// keys are parameter names, values are proposed values
export const ParamChangesSpecShape = M.recordOf(M.string(), M.any());
export const YesParamChangesPositionShape = ParamChangesSpecShape;
export const NoParamChangesPositionShape = harden({
noChange: M.arrayOf(M.string()),
});
export const ParamChangesPositionsShape = harden([
export const NoParamChangesPositionShape = { noChange: M.arrayOf(M.string()) };
harden(NoParamChangesPositionShape);

export const ParamChangesPositionsShape = [
YesParamChangesPositionShape,
NoParamChangesPositionShape,
]);
export const ParamPathShape = harden({
key: M.any(),
});
export const ParamChangesIssueShape = harden({
];
harden(ParamChangesPositionsShape);

export const ParamPathShape = { key: M.any() };
harden(ParamPathShape);

export const ParamChangesIssueShape = {
spec: {
paramPath: ParamPathShape,
changes: ParamChangesSpecShape,
},
contract: InstanceHandleShape,
});
export const ParamChangesQuestionSpecShape = harden({
};
harden(ParamChangesIssueShape);

export const ParamChangesQuestionSpecShape = {
method: 'unranked',
issue: ParamChangesIssueShape,
positions: ParamChangesPositionsShape,
Expand All @@ -83,27 +95,33 @@ export const ParamChangesQuestionSpecShape = harden({
closingRule: ClosingRuleShape,
quorumRule: 'majority',
tieOutcome: NoParamChangesPositionShape,
});
};
harden(ParamChangesQuestionSpecShape);

export const ParamChangesQuestionDetailsShape = harden({
export const ParamChangesQuestionDetailsShape = {
...ParamChangesQuestionSpecShape,
questionHandle: makeHandleShape('Question'),
counterInstance: InstanceHandleShape,
});
};
harden(ParamChangesQuestionDetailsShape);

const ApiInvocationSpecShape = harden({
const ApiInvocationSpecShape = {
apiMethodName: M.string(),
methodArgs: M.arrayOf(M.any()),
});
};
harden(ApiInvocationSpecShape);

export const YesApiInvocationPositionShape = ApiInvocationSpecShape;
export const NoApiInvocationPositionShape = harden({
dontInvoke: M.string(),
});
export const ApiInvocationPositionsShape = harden([
export const NoApiInvocationPositionShape = { dontInvoke: M.string() };
harden(NoApiInvocationPositionShape);

export const ApiInvocationPositionsShape = [
YesApiInvocationPositionShape,
NoApiInvocationPositionShape,
]);
export const ApiInvocationQuestionSpecShape = harden({
];
harden(ApiInvocationPositionsShape);

export const ApiInvocationQuestionSpecShape = {
method: 'unranked',
issue: ApiInvocationSpecShape,
positions: ApiInvocationPositionsShape,
Expand All @@ -113,39 +131,53 @@ export const ApiInvocationQuestionSpecShape = harden({
closingRule: ClosingRuleShape,
quorumRule: QuorumRuleShape,
tieOutcome: NoApiInvocationPositionShape,
});
export const ApiInvocationQuestionDetailsShape = harden({
};
harden(ApiInvocationQuestionSpecShape);

export const ApiInvocationQuestionDetailsShape = {
...ApiInvocationQuestionSpecShape,
questionHandle: makeHandleShape('Question'),
counterInstance: InstanceHandleShape,
});
};
harden(ApiInvocationQuestionDetailsShape);

const SimpleSpecShape = harden({
text: M.string(),
});
export const YesSimplePositionShape = harden({ text: M.string() });
export const NoSimplePositionShape = harden({ text: M.string() });
export const SimplePositionsShape = harden([
const SimpleSpecShape = { text: M.string() };
harden(SimpleSpecShape);

export const YesSimplePositionShape = { text: M.string() };
harden(YesSimplePositionShape);

export const NoSimplePositionShape = { text: M.string() };
harden(NoSimplePositionShape);

export const SimplePositionsShape = [
YesSimplePositionShape,
NoSimplePositionShape,
]);
];
harden(SimplePositionsShape);

export const SimpleIssueShape = SimpleSpecShape;
export const SimpleQuestionSpecShape = harden({
harden(SimpleIssueShape);

export const SimpleQuestionSpecShape = {
method: ChoiceMethodShape,
issue: SimpleIssueShape,
positions: M.arrayOf(harden({ text: M.string() })),
positions: M.arrayOf({ text: M.string() }),
electionType: M.or('election', 'survey'),
maxChoices: M.gte(1),
maxWinners: M.gte(1),
closingRule: ClosingRuleShape,
quorumRule: QuorumRuleShape,
tieOutcome: NoSimplePositionShape,
});
export const SimpleQuestionDetailsShape = harden({
};
harden(SimpleQuestionSpecShape);

export const SimpleQuestionDetailsShape = {
...SimpleQuestionSpecShape,
questionHandle: makeHandleShape('Question'),
counterInstance: InstanceHandleShape,
});
};
harden(SimpleQuestionDetailsShape);

export const QuestionSpecShape = M.or(
ApiInvocationQuestionSpecShape,
Expand Down Expand Up @@ -199,11 +231,12 @@ export const ElectorateCreatorI = M.interface('Committee AdminFacet', {
getPublicFacet: M.call().returns(ElectoratePublicShape),
});

export const QuestionStatsShape = harden({
export const QuestionStatsShape = {
spoiled: M.nat(),
votes: M.nat(),
results: M.arrayOf({ position: PositionShape, total: M.nat() }),
});
};
harden(QuestionStatsShape);

export const QuestionI = M.interface('Question', {
getVoteCounter: M.call().returns(InstanceHandleShape),
Expand Down
29 changes: 17 additions & 12 deletions packages/orchestration/src/typeGuards.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,8 @@ import { M } from '@endo/patterns';

/**
* @import {TypedPattern} from '@agoric/internal';
* @import {ChainAddress, CosmosAssetInfo, Chain, ChainInfo, CosmosChainInfo, DenomAmount, DenomDetail, DenomInfo, AmountArg, CosmosValidatorAddress} from './types.js';
* @import {ChainAddress, CosmosAssetInfo, Chain, ChainInfo, CosmosChainInfo, DenomAmount, DenomInfo, AmountArg, CosmosValidatorAddress} from './types.js';
* @import {Any as Proto3Msg} from '@agoric/cosmic-proto/google/protobuf/any.js';
* @import {Delegation} from '@agoric/cosmic-proto/cosmos/staking/v1beta1/staking.js';
* @import {TxBody} from '@agoric/cosmic-proto/cosmos/tx/v1beta1/tx.js';
* @import {TypedJson} from '@agoric/cosmic-proto';
*/
Expand All @@ -31,12 +30,11 @@ export const ChainAddressShape = {
encoding: M.string(),
value: M.string(),
};
harden(ChainAddressShape);

/** @type {TypedPattern<Proto3Msg>} */
export const Proto3Shape = {
typeUrl: M.string(),
value: M.string(),
};
export const Proto3Shape = { typeUrl: M.string(), value: M.string() };
harden(ChainAddressShape);

/** @internal */
export const IBCTransferOptionsShape = M.splitRecord(
Expand All @@ -53,6 +51,7 @@ export const IBCTransferOptionsShape = M.splitRecord(

/** @internal */
export const IBCChannelIDShape = M.string();

/** @internal */
export const IBCChannelInfoShape = M.splitRecord({
portId: M.string(),
Expand All @@ -63,8 +62,10 @@ export const IBCChannelInfoShape = M.splitRecord({
state: M.scalar(), // XXX
version: M.string(),
});

/** @internal */
export const IBCConnectionIDShape = M.string();

/** @internal */
export const IBCConnectionInfoShape = M.splitRecord({
id: IBCConnectionIDShape,
Expand Down Expand Up @@ -115,15 +116,18 @@ export const DenomInfoShape = {
brand: M.or(M.remotable('Brand'), M.undefined()),
baseDenom: M.string(),
};
harden(DenomInfoShape);

/** @type {TypedPattern<DenomAmount>} */
export const DenomAmountShape = { denom: DenomShape, value: M.nat() };
harden(DenomAmountShape);

/** @type {TypedPattern<Amount<'nat'>>} */
export const AnyNatAmountShape = harden({
export const AnyNatAmountShape = {
brand: M.remotable('Brand'),
value: M.nat(),
});
};
harden(AnyNatAmountShape);

/** @type {TypedPattern<AmountArg>} */
export const AmountArgShape = M.or(AnyNatAmountShape, DenomAmountShape);
Expand Down Expand Up @@ -152,10 +156,11 @@ export const ICQMsgShape = M.splitRecord(
export const TypedJsonShape = M.splitRecord({ '@type': M.string() });

/** @see {Chain} */
export const chainFacadeMethods = harden({
export const chainFacadeMethods = {
getChainInfo: M.call().returns(VowShape),
makeAccount: M.call().returns(VowShape),
});
};
harden(chainFacadeMethods);

/**
* for google/protobuf/timestamp.proto, not to be confused with TimestampShape
Expand All @@ -165,6 +170,7 @@ export const chainFacadeMethods = harden({
* string
*/
export const TimestampProtoShape = { seconds: M.string(), nanos: M.number() };
harden(TimestampProtoShape);

/**
* see {@link TxBody} for more details
Expand All @@ -187,6 +193,5 @@ export const TxBodyOptsShape = M.splitRecord(
*/
export const AnyNatAmountsRecord = M.and(
M.recordOf(M.string(), AnyNatAmountShape),
M.not(harden({})),
M.not({}),
);
harden(AnyNatAmountsRecord);
Loading
Loading