@agoric/ertp 0.16.3-mainnet1B-dev-b0c1f78.0 → 0.16.3-orchestration-dev-096c4e8.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.
Files changed (48) hide show
  1. package/package.json +26 -18
  2. package/src/amountMath.js +57 -63
  3. package/src/amountStore.js +32 -0
  4. package/src/index.js +7 -0
  5. package/src/issuerKit.js +218 -74
  6. package/src/legacy-payment-helpers.js +23 -28
  7. package/src/mathHelpers/copyBagMathHelpers.js +2 -4
  8. package/src/mathHelpers/copySetMathHelpers.js +1 -3
  9. package/src/mathHelpers/natMathHelpers.js +6 -7
  10. package/src/payment.js +5 -8
  11. package/src/paymentLedger.js +84 -91
  12. package/src/purse.js +83 -24
  13. package/src/typeGuards.js +37 -43
  14. package/src/types-ambient.js +237 -314
  15. package/src/types.js +237 -314
  16. package/CHANGELOG.md +0 -767
  17. package/src/amountMath.d.ts +0 -53
  18. package/src/amountMath.d.ts.map +0 -1
  19. package/src/displayInfo.d.ts +0 -2
  20. package/src/displayInfo.d.ts.map +0 -1
  21. package/src/index.d.ts +0 -4
  22. package/src/index.d.ts.map +0 -1
  23. package/src/issuerKit.d.ts +0 -19
  24. package/src/issuerKit.d.ts.map +0 -1
  25. package/src/legacy-payment-helpers.d.ts +0 -5
  26. package/src/legacy-payment-helpers.d.ts.map +0 -1
  27. package/src/mathHelpers/copyBagMathHelpers.d.ts +0 -5
  28. package/src/mathHelpers/copyBagMathHelpers.d.ts.map +0 -1
  29. package/src/mathHelpers/copySetMathHelpers.d.ts +0 -5
  30. package/src/mathHelpers/copySetMathHelpers.d.ts.map +0 -1
  31. package/src/mathHelpers/natMathHelpers.d.ts +0 -14
  32. package/src/mathHelpers/natMathHelpers.d.ts.map +0 -1
  33. package/src/mathHelpers/setMathHelpers.d.ts +0 -6
  34. package/src/mathHelpers/setMathHelpers.d.ts.map +0 -1
  35. package/src/payment.d.ts +0 -3
  36. package/src/payment.d.ts.map +0 -1
  37. package/src/paymentLedger.d.ts +0 -3
  38. package/src/paymentLedger.d.ts.map +0 -1
  39. package/src/purse.d.ts +0 -13
  40. package/src/purse.d.ts.map +0 -1
  41. package/src/transientNotifier.d.ts +0 -5
  42. package/src/transientNotifier.d.ts.map +0 -1
  43. package/src/typeGuards.d.ts +0 -42
  44. package/src/typeGuards.d.ts.map +0 -1
  45. package/src/types-ambient.d.ts +0 -376
  46. package/src/types-ambient.d.ts.map +0 -1
  47. package/src/types.d.ts +0 -376
  48. package/src/types.d.ts.map +0 -1
@@ -4,240 +4,166 @@
4
4
 
5
5
  /**
6
6
  * @template {AssetKind} [K=AssetKind]
7
- * @typedef {object} Amount
8
- * Amounts are descriptions of digital assets, answering the questions
9
- * "how much" and "of what kind". Amounts are values labeled with a brand.
10
- * AmountMath executes the logic of how amounts are changed when digital
11
- * assets are merged, separated, or otherwise manipulated. For
12
- * example, a deposit of 2 bucks into a purse that already has 3 bucks
13
- * gives a new purse balance of 5 bucks. An empty purse has 0 bucks. AmountMath
14
- * relies heavily on polymorphic MathHelpers, which manipulate the unbranded
15
- * portion.
16
- *
7
+ * @typedef {object} Amount Amounts are descriptions of digital assets,
8
+ * answering the questions "how much" and "of what kind". Amounts are values
9
+ * labeled with a brand. AmountMath executes the logic of how amounts are
10
+ * changed when digital assets are merged, separated, or otherwise
11
+ * manipulated. For example, a deposit of 2 bucks into a purse that already
12
+ * has 3 bucks gives a new purse balance of 5 bucks. An empty purse has 0
13
+ * bucks. AmountMath relies heavily on polymorphic MathHelpers, which
14
+ * manipulate the unbranded portion.
17
15
  * @property {Brand<K>} brand
18
16
  * @property {AssetValueForKind<K>} value
19
17
  */
20
18
 
21
19
  /**
22
- * @typedef {NatValue | SetValue | CopySet | CopyBag} AmountValue
23
- * An `AmountValue` describes a set or quantity of assets that can be owned or
24
- * shared.
25
- *
26
- * A fungible `AmountValue` uses a non-negative bigint to represent a quantity
27
- * of that many assets.
28
- *
29
- * A non-fungible `AmountValue` uses an array or CopySet of `Key`s to represent
30
- * a set of whatever asset each key represents. A `Key` is a passable value
31
- * that can be used as an element in a set (SetStore or CopySet) or as the
32
- * key in a map (MapStore or CopyMap).
33
- *
34
- * `SetValue` is for the deprecated set representation, using an array directly
35
- * to represent the array of its elements. `CopySet` is the proper
36
- * representation using a CopySet.
37
- *
38
- * A semi-fungible `CopyBag` is represented as a
39
- * `CopyBag` of `Key` objects. "Bag" is synonymous with MultiSet, where an
40
- * element of a bag can be present once or more times, i.e., some positive
41
- * bigint number of times, representing that quantity of the asset represented
42
- * by that key.
20
+ * @typedef {NatValue | SetValue | CopySet | import('@endo/patterns').CopyBag} AmountValue
21
+ * An `AmountValue` describes a set or quantity of assets that can be owned or
22
+ * shared.
23
+ *
24
+ * A fungible `AmountValue` uses a non-negative bigint to represent a quantity
25
+ * of that many assets.
26
+ *
27
+ * A non-fungible `AmountValue` uses an array or CopySet of `Key`s to represent
28
+ * a set of whatever asset each key represents. A `Key` is a passable value
29
+ * that can be used as an element in a set (SetStore or CopySet) or as the key
30
+ * in a map (MapStore or CopyMap).
31
+ *
32
+ * `SetValue` is for the deprecated set representation, using an array directly
33
+ * to represent the array of its elements. `CopySet` is the proper
34
+ * representation using a CopySet.
35
+ *
36
+ * A semi-fungible `CopyBag` is represented as a `CopyBag` of `Key` objects.
37
+ * "Bag" is synonymous with MultiSet, where an element of a bag can be present
38
+ * once or more times, i.e., some positive bigint number of times,
39
+ * representing that quantity of the asset represented by that key.
43
40
  */
44
41
 
45
42
  /**
46
- * @typedef {'nat' | 'set' | 'copySet' | 'copyBag' } AssetKind
47
- *
48
- * See doc-comment for `AmountValue`.
43
+ * @typedef {'nat' | 'set' | 'copySet' | 'copyBag'} AssetKind See doc-comment
44
+ * for `AmountValue`.
49
45
  */
50
46
 
51
47
  /**
52
48
  * @template {AssetKind} K
53
- * @typedef {K extends 'nat' ? NatValue :
54
- * K extends 'set' ? SetValue :
55
- * K extends 'copySet' ? CopySet:
56
- * K extends 'copyBag' ? CopyBag :
57
- * never
58
- * } AssetValueForKind
49
+ * @typedef {K extends 'nat'
50
+ * ? NatValue
51
+ * : K extends 'set'
52
+ * ? SetValue
53
+ * : K extends 'copySet'
54
+ * ? CopySet
55
+ * : K extends 'copyBag'
56
+ * ? import('@endo/patterns').CopyBag
57
+ * : never} AssetValueForKind
59
58
  */
60
59
 
61
60
  /**
62
61
  * @template {AmountValue} V
63
- * @typedef {V extends NatValue ? 'nat' :
64
- * V extends SetValue ? 'set' :
65
- * V extends CopySet ? 'copySet' :
66
- * V extends CopyBag ? 'copyBag' :
67
- * never} AssetKindForValue
62
+ * @typedef {V extends NatValue
63
+ * ? 'nat'
64
+ * : V extends SetValue
65
+ * ? 'set'
66
+ * : V extends CopySet
67
+ * ? 'copySet'
68
+ * : V extends import('@endo/patterns').CopyBag
69
+ * ? 'copyBag'
70
+ * : never} AssetKindForValue
68
71
  */
69
72
 
70
73
  /**
71
74
  * @template {AssetKind} [K=AssetKind]
72
75
  * @typedef {object} DisplayInfo
73
- * @property {number} [decimalPlaces] Tells the display software how
74
- * many decimal places to move the decimal over to the left, or in
75
- * other words, which position corresponds to whole numbers. We
76
- * require fungible digital assets to be represented in integers, in
77
- * the smallest unit (i.e. USD might be represented in mill, a
78
- * thousandth of a dollar. In that case, `decimalPlaces` would be
79
- * 3.) This property is optional, and for non-fungible digital
80
- * assets, should not be specified. The decimalPlaces property
81
- * should be used for *display purposes only*. Any other use is an
76
+ * @property {number} [decimalPlaces] Tells the display software how many
77
+ * decimal places to move the decimal over to the left, or in other words,
78
+ * which position corresponds to whole numbers. We require fungible digital
79
+ * assets to be represented in integers, in the smallest unit (i.e. USD might
80
+ * be represented in mill, a thousandth of a dollar. In that case,
81
+ * `decimalPlaces` would be 3.) This property is optional, and for
82
+ * non-fungible digital assets, should not be specified. The decimalPlaces
83
+ * property should be used for _display purposes only_. Any other use is an
82
84
  * anti-pattern.
83
- * @property {K} assetKind - the kind of asset, either
84
- * AssetKind.NAT (fungible) or
85
- * AssetKind.SET or AssetKind.COPY_SET (non-fungible)
85
+ * @property {K} assetKind - the kind of asset, either AssetKind.NAT (fungible)
86
+ * or AssetKind.SET or AssetKind.COPY_SET (non-fungible)
86
87
  */
87
88
 
88
89
  /**
89
90
  * @template {AssetKind} [K=AssetKind]
90
- * @typedef {object} Brand
91
- * The brand identifies the kind of issuer, and has a function to get the
92
- * alleged name for the kind of asset described. The alleged name (such
93
- * as 'BTC' or 'moola') is provided by the maker of the issuer and should
94
- * not be trusted as accurate.
95
- *
96
- * Every amount created by a particular AmountMath will share the same brand,
97
- * but recipients cannot rely on the brand to verify that a purported amount
98
- * represents the issuer they intended, since the same brand can be reused by
99
- * a misbehaving issuer.
100
- *
91
+ * @typedef {object} Brand The brand identifies the kind of issuer, and has a
92
+ * function to get the alleged name for the kind of asset described. The
93
+ * alleged name (such as 'BTC' or 'moola') is provided by the maker of the
94
+ * issuer and should not be trusted as accurate.
95
+ *
96
+ * Every amount created by a particular AmountMath will share the same brand,
97
+ * but recipients cannot rely on the brand to verify that a purported amount
98
+ * represents the issuer they intended, since the same brand can be reused by
99
+ * a misbehaving issuer.
101
100
  * @property {(allegedIssuer: ERef<Issuer>) => Promise<boolean>} isMyIssuer
102
- * Should be used with `issuer.getBrand` to ensure an issuer and brand match.
101
+ * Should be used with `issuer.getBrand` to ensure an issuer and brand match.
103
102
  * @property {() => string} getAllegedName
104
- * @property {() => DisplayInfo<K>} getDisplayInfo
105
- * Give information to UI on how to display the amount.
103
+ * @property {() => DisplayInfo<K>} getDisplayInfo Give information to UI on how
104
+ * to display the amount.
106
105
  * @property {() => Pattern} getAmountShape
107
106
  */
108
107
 
109
108
  // /////////////////////////// Issuer //////////////////////////////////////////
110
109
 
111
110
  /**
112
- * @callback IssuerIsLive
113
- *
114
- * Return true if the payment continues to exist.
115
- *
116
- * If the payment is a promise, the operation will proceed upon
117
- * resolution.
111
+ * @callback IssuerIsLive Return true if the payment continues to exist.
118
112
  *
113
+ * If the payment is a promise, the operation will proceed upon fulfillment.
119
114
  * @param {ERef<Payment>} payment
120
115
  * @returns {Promise<boolean>}
121
116
  */
122
117
  /**
123
118
  * @template {AssetKind} K
124
- * @callback IssuerGetAmountOf
125
- *
126
- * Get the amount of digital assets in the payment. Because the
127
- * payment is not trusted, we cannot call a method on it directly, and
128
- * must use the issuer instead.
129
- *
130
- * If the payment is a promise, the operation will proceed upon
131
- * resolution.
119
+ * @callback IssuerGetAmountOf Get the amount of digital assets in the payment.
120
+ * Because the payment is not trusted, we cannot call a method on it directly,
121
+ * and must use the issuer instead.
132
122
  *
123
+ * If the payment is a promise, the operation will proceed upon fulfillment.
133
124
  * @param {ERef<Payment>} payment
134
125
  * @returns {Promise<Amount<K>>}
135
126
  */
136
127
 
137
128
  /**
138
- * @callback IssuerBurn
139
- *
140
- * Burn all of the digital assets in the
141
- * payment. `optAmount` is optional. If `optAmount` is present, the
142
- * code will insist that the amount of the digital assets in the
143
- * payment is equal to `optAmount`, to prevent sending the wrong
144
- * payment and other confusion.
145
- *
146
- * If the payment is a promise, the operation will proceed upon
147
- * resolution.
148
- *
129
+ * @callback IssuerBurn Burn all of the digital assets in the payment.
130
+ * `optAmountShape` is optional. If the `optAmountShape` pattern is present,
131
+ * the amount of the digital assets in the payment must match
132
+ * `optAmountShape`, to prevent sending the wrong payment and other
133
+ * confusion.
134
+ *
135
+ * If the payment is a promise, the operation will proceed upon fulfillment.
136
+ *
137
+ * As always with optional `Pattern` arguments, keep in mind that technically
138
+ * the value `undefined` itself is a valid `Key` and therefore a valid
139
+ * `Pattern`. But in optional pattern position, a top level `undefined` will
140
+ * be interpreted as absence. If you want to express a `Pattern` that will
141
+ * match only `undefined`, use `M.undefined()` instead.
149
142
  * @param {ERef<Payment>} payment
150
143
  * @param {Pattern} [optAmountShape]
151
144
  * @returns {Promise<Amount>}
152
145
  */
153
146
 
154
- /**
155
- * @template {AssetKind} K
156
- * @callback IssuerClaim
157
- *
158
- * Transfer all digital assets from the payment to a new payment and
159
- * delete the original. `optAmount` is optional. If `optAmount` is
160
- * present, the code will insist that the amount of digital assets in
161
- * the payment is equal to `optAmount`, to prevent sending the wrong
162
- * payment and other confusion.
163
- *
164
- * If the payment is a promise, the operation will proceed upon
165
- * resolution.
166
- *
167
- * @param {ERef<Payment<K>>} payment
168
- * @param {Pattern} [optAmountShape]
169
- * @returns {Promise<Payment<K>>}
170
- */
171
-
172
- /**
173
- * @template {AssetKind} K
174
- * @callback IssuerCombine
175
- *
176
- * Combine multiple payments into one payment.
177
- *
178
- * If any of the payments is a promise, the operation will proceed
179
- * upon resolution.
180
- *
181
- * @param {ERef<Payment<K>>[]} paymentsArray
182
- * @param {Amount<K>} [optTotalAmount]
183
- * @returns {Promise<Payment<K>>}
184
- */
185
-
186
- /**
187
- * @template {AssetKind} K
188
- * @callback IssuerSplit
189
- *
190
- * Split a single payment into two payments,
191
- * A and B, according to the paymentAmountA passed in.
192
- *
193
- * If the payment is a promise, the operation will proceed upon
194
- * resolution.
195
- *
196
- * @param {ERef<Payment<K>>} payment
197
- * @param {Amount<K>} paymentAmountA
198
- * @returns {Promise<Payment<K>[]>}
199
- */
200
-
201
- /**
202
- * @callback IssuerSplitMany
203
- *
204
- * Split a single payment into many payments, according to the amounts
205
- * passed in.
206
- *
207
- * If the payment is a promise, the operation will proceed upon
208
- * resolution.
209
- *
210
- * @param {ERef<Payment>} payment
211
- * @param {Amount[]} amounts
212
- * @returns {Promise<Payment[]>}
213
- */
214
-
215
147
  /**
216
148
  * @template {AssetKind} [K=AssetKind]
217
- * @typedef {object} Issuer
218
- *
219
- * The issuer cannot mint a new amount, but it can create empty purses
220
- * and payments. The issuer can also transform payments (splitting
221
- * payments, combining payments, burning payments, and claiming
222
- * payments exclusively). The issuer should be gotten from a trusted
223
- * source and then relied upon as the decider of whether an untrusted
224
- * payment is valid.
225
- *
226
- * @property {() => Brand<K>} getBrand Get the Brand for this Issuer. The
227
- * Brand indicates the type of digital asset and is shared by the
228
- * mint, the issuer, and any purses and payments of this particular
229
- * kind. The brand is not closely held, so this function should not be
230
- * trusted to identify an issuer alone. Fake digital assets and amount
231
- * can use another issuer's brand.
232
- *
233
- * @property {() => string} getAllegedName Get the allegedName for
234
- * this mint/issuer
235
- * @property {() => AssetKind} getAssetKind Get the kind of
236
- * MathHelpers used by this Issuer.
237
- * @property {() => DisplayInfo<K>} getDisplayInfo Give information to UI
238
- * on how to display amounts for this issuer.
239
- * @property {() => Purse<K>} makeEmptyPurse Make an empty purse of this
240
- * brand.
149
+ * @typedef {object} Issuer The issuer cannot mint a new amount, but it can
150
+ * create empty purses and payments. The issuer can also transform payments
151
+ * (splitting payments, combining payments, burning payments, and claiming
152
+ * payments exclusively). The issuer should be gotten from a trusted source
153
+ * and then relied upon as the decider of whether an untrusted payment is
154
+ * valid.
155
+ * @property {() => Brand<K>} getBrand Get the Brand for this Issuer. The Brand
156
+ * indicates the type of digital asset and is shared by the mint, the issuer,
157
+ * and any purses and payments of this particular kind. The brand is not
158
+ * closely held, so this function should not be trusted to identify an issuer
159
+ * alone. Fake digital assets and amount can use another issuer's brand.
160
+ * @property {() => string} getAllegedName Get the allegedName for this
161
+ * mint/issuer
162
+ * @property {() => AssetKind} getAssetKind Get the kind of MathHelpers used by
163
+ * this Issuer.
164
+ * @property {() => DisplayInfo<K>} getDisplayInfo Give information to UI on how
165
+ * to display amounts for this issuer.
166
+ * @property {() => Purse<K>} makeEmptyPurse Make an empty purse of this brand.
241
167
  * @property {IssuerIsLive} isLive
242
168
  * @property {IssuerGetAmountOf<K>} getAmountOf
243
169
  * @property {IssuerBurn} burn
@@ -247,7 +173,9 @@
247
173
  * @template {AssetKind} [K=AssetKind]
248
174
  * @typedef {object} PaymentLedger
249
175
  * @property {Mint<K>} mint
250
- * @property {Purse<K>} mintRecoveryPurse
176
+ * @property {Purse<K>} mintRecoveryPurse Externally useful only if this issuer
177
+ * uses recovery sets. Can be used to get the recovery set associated with
178
+ * minted payments that are still live.
251
179
  * @property {Issuer<K>} issuer
252
180
  * @property {Brand<K>} brand
253
181
  */
@@ -256,7 +184,9 @@
256
184
  * @template {AssetKind} [K=AssetKind]
257
185
  * @typedef {object} IssuerKit
258
186
  * @property {Mint<K>} mint
259
- * @property {Purse<K>} mintRecoveryPurse
187
+ * @property {Purse<K>} mintRecoveryPurse Externally useful only if this issuer
188
+ * uses recovery sets. Can be used to get the recovery set associated with
189
+ * minted payments that are still live.
260
190
  * @property {Issuer<K>} issuer
261
191
  * @property {Brand<K>} brand
262
192
  * @property {DisplayInfo} displayInfo
@@ -264,35 +194,49 @@
264
194
 
265
195
  /**
266
196
  * @typedef {object} AdditionalDisplayInfo
267
- *
268
- * @property {number} [decimalPlaces] Tells the display software how
269
- * many decimal places to move the decimal over to the left, or in
270
- * other words, which position corresponds to whole numbers. We
271
- * require fungible digital assets to be represented in integers, in
272
- * the smallest unit (i.e. USD might be represented in mill, a
273
- * thousandth of a dollar. In that case, `decimalPlaces` would be
274
- * 3.) This property is optional, and for non-fungible digital
275
- * assets, should not be specified. The decimalPlaces property
276
- * should be used for *display purposes only*. Any other use is an
197
+ * @property {number} [decimalPlaces] Tells the display software how many
198
+ * decimal places to move the decimal over to the left, or in other words,
199
+ * which position corresponds to whole numbers. We require fungible digital
200
+ * assets to be represented in integers, in the smallest unit (i.e. USD might
201
+ * be represented in mill, a thousandth of a dollar. In that case,
202
+ * `decimalPlaces` would be 3.) This property is optional, and for
203
+ * non-fungible digital assets, should not be specified. The decimalPlaces
204
+ * property should be used for _display purposes only_. Any other use is an
277
205
  * anti-pattern.
278
206
  * @property {AssetKind} [assetKind]
279
207
  */
280
208
 
281
- /**
282
- * @typedef {import('@agoric/swingset-vat').ShutdownWithFailure} ShutdownWithFailure
283
- */
209
+ /** @typedef {import('@agoric/swingset-vat').ShutdownWithFailure} ShutdownWithFailure */
284
210
 
285
211
  /**
286
212
  * @template {AssetKind} [K=AssetKind]
287
- * @typedef {object} Mint
288
- * Holding a Mint carries the right to issue new digital assets. These
289
- * assets all have the same kind, which is called a Brand.
290
- *
213
+ * @typedef {object} Mint Holding a Mint carries the right to issue new digital
214
+ * assets. These assets all have the same kind, which is called a Brand.
291
215
  * @property {() => Issuer<K>} getIssuer Gets the Issuer for this mint.
292
- * @property {(newAmount: Amount<K>) => Payment<K>} mintPayment
293
- * Creates a new Payment containing newly minted amount.
216
+ * @property {(newAmount: Amount<K>) => Payment<K>} mintPayment Creates a new
217
+ * Payment containing newly minted amount.
294
218
  */
295
219
 
220
+ // /////////////////////////// Purse / Payment /////////////////////////////////
221
+
222
+ /**
223
+ * Issuers first became durable with mandatory recovery sets. Later they were
224
+ * made optional, but there is no support for converting from one state to the
225
+ * other. Thus, absence of a `RecoverySetsOption` state is equivalent to
226
+ * `'hasRecoverySets'`. In the absence of a `recoverySetsOption` parameter,
227
+ * upgradeIssuerKit defaults to the predecessor's `RecoverySetsOption` state, or
228
+ * `'hasRecoverySets'` if none.
229
+ *
230
+ * At this time, issuers started in one of the states (`'noRecoverySets'`, or
231
+ * `'hasRecoverySets'`) cannot be converted to the other on upgrade. If this
232
+ * transition is needed, it can likely be supported in a future upgrade. File an
233
+ * issue on github and explain what you need and why.
234
+ *
235
+ * @typedef {'hasRecoverySets' | 'noRecoverySets'} RecoverySetsOption
236
+ */
237
+
238
+ // /////////////////////////// Purse / Payment /////////////////////////////////
239
+
296
240
  /**
297
241
  * @callback DepositFacetReceive
298
242
  * @param {Payment} payment
@@ -302,12 +246,12 @@
302
246
 
303
247
  /**
304
248
  * @typedef {object} DepositFacet
305
- * @property {DepositFacetReceive} receive
306
- * Deposit all the contents of payment into the purse that made this facet,
307
- * returning the amount. If the optional argument `optAmount` does not equal the
308
- * amount of digital assets in the payment, throw an error.
249
+ * @property {DepositFacetReceive} receive Deposit all the contents of payment
250
+ * into the purse that made this facet, returning the amount. If the optional
251
+ * argument `optAmount` does not equal the amount of digital assets in the
252
+ * payment, throw an error.
309
253
  *
310
- * If payment is a promise, throw an error.
254
+ * If payment is a promise, throw an error.
311
255
  */
312
256
 
313
257
  /**
@@ -320,121 +264,100 @@
320
264
 
321
265
  /**
322
266
  * @template {AssetKind} [K=AssetKind]
323
- * @typedef {object} Purse
324
- * Purses hold amount of digital assets of the same brand, but unlike Payments,
325
- * they are not meant to be sent to others. To transfer digital assets, a
326
- * Payment should be withdrawn from a Purse. The amount of digital
327
- * assets in a purse can change through the action of deposit() and withdraw().
328
- *
329
- * The primary use for Purses and Payments is for currency-like and goods-like
330
- * digital assets, but they can also be used to represent other kinds of rights,
331
- * such as the right to participate in a particular contract.
332
- *
333
- * @property {() => Brand<K>} getAllegedBrand Get the alleged Brand for this Purse
334
- *
335
- * @property {() => Amount<K>} getCurrentAmount
336
- * Get the amount contained in this purse.
337
- *
338
- * @property {() => LatestTopic<Amount<K>>} getCurrentAmountNotifier
339
- * Get a lossy notifier for changes to this purse's balance.
340
- *
341
- * @property {PurseDeposit<K>} deposit
342
- * Deposit all the contents of payment into this purse, returning the
343
- * amount. If the optional argument `optAmount` does not equal the
344
- * amount of digital assets in the payment, throw an error.
345
- *
346
- * If payment is a promise, throw an error.
347
- *
348
- * @property {() => DepositFacet} getDepositFacet
349
- * Return an object whose `receive` method deposits to the current Purse.
350
- *
351
- * @property {(amount: Amount<K>) => Payment<K>} withdraw
352
- * Withdraw amount from this purse into a new Payment.
353
- *
354
- * @property {() => CopySet<Payment<K>>} getRecoverySet
355
- * The set of payments withdrawn from this purse that are still live. These
356
- * are the payments that can still be recovered in emergencies by, for example,
357
- * depositing into this purse. Such a deposit action is like canceling an
358
- * outstanding check because you're tired of waiting for it. Once your
359
- * cancellation is acknowledged, you can spend the assets at stake on other
360
- * things. Afterwards, if the recipient of the original check finally gets
361
- * around to depositing it, their deposit fails.
362
- *
363
- * @property {() => Amount<K>} recoverAll
364
- * For use in emergencies, such as coming back from a traumatic crash and
365
- * upgrade. This deposits all the payments in this purse's recovery set
366
- * into the purse itself, returning the total amount of assets recovered.
267
+ * @typedef {object} Purse Purses hold amount of digital assets of the same
268
+ * brand, but unlike Payments, they are not meant to be sent to others. To
269
+ * transfer digital assets, a Payment should be withdrawn from a Purse. The
270
+ * amount of digital assets in a purse can change through the action of
271
+ * deposit() and withdraw().
272
+ *
273
+ * The primary use for Purses and Payments is for currency-like and goods-like
274
+ * digital assets, but they can also be used to represent other kinds of
275
+ * rights, such as the right to participate in a particular contract.
276
+ * @property {() => Brand<K>} getAllegedBrand Get the alleged Brand for this
277
+ * Purse
278
+ * @property {() => Amount<K>} getCurrentAmount Get the amount contained in this
279
+ * purse.
280
+ * @property {() => LatestTopic<Amount<K>>} getCurrentAmountNotifier Get a lossy
281
+ * notifier for changes to this purse's balance.
282
+ * @property {PurseDeposit<K>} deposit Deposit all the contents of payment into
283
+ * this purse, returning the amount. If the optional argument `optAmount` does
284
+ * not equal the amount of digital assets in the payment, throw an error.
285
+ *
286
+ * If payment is a promise, throw an error.
287
+ * @property {() => DepositFacet} getDepositFacet Return an object whose
288
+ * `receive` method deposits to the current Purse.
289
+ * @property {(amount: Amount<K>) => Payment<K>} withdraw Withdraw amount from
290
+ * this purse into a new Payment.
291
+ * @property {() => CopySet<Payment<K>>} getRecoverySet The set of payments
292
+ * withdrawn from this purse that are still live. These are the payments that
293
+ * can still be recovered in emergencies by, for example, depositing into this
294
+ * purse. Such a deposit action is like canceling an outstanding check because
295
+ * you're tired of waiting for it. Once your cancellation is acknowledged, you
296
+ * can spend the assets at stake on other things. Afterwards, if the recipient
297
+ * of the original check finally gets around to depositing it, their deposit
298
+ * fails.
299
+ *
300
+ * Returns an empty set if this issuer does not support recovery sets.
301
+ * @property {() => Amount<K>} recoverAll For use in emergencies, such as coming
302
+ * back from a traumatic crash and upgrade. This deposits all the payments in
303
+ * this purse's recovery set into the purse itself, returning the total amount
304
+ * of assets recovered.
305
+ *
306
+ * Returns an empty amount if this issuer does not support recovery sets.
367
307
  */
368
308
 
369
309
  /**
370
310
  * @template {AssetKind} [K=AssetKind]
371
- * @typedef {object} Payment
372
- * Payments hold amount of digital assets of the same brand in transit. Payments
373
- * can be deposited in purses, split into multiple payments, combined, and
374
- * claimed (getting an exclusive payment). Payments are linear, meaning
375
- * that either a payment has the same amount of digital assets it
376
- * started with, or it is used up entirely. It is impossible to partially use a
377
- * payment.
378
- *
379
- * Payments are often received from other actors and therefore should
380
- * not be trusted themselves. To get the amount of digital assets in a payment,
381
- * use the trusted issuer: issuer.getAmountOf(payment),
382
- *
383
- * Payments can be converted to Purses by getting a trusted issuer and
384
- * calling `issuer.makeEmptyPurse()` to create a purse, then
385
- * `purse.deposit(payment)`.
386
- *
387
- * @property {() => Brand<K>} getAllegedBrand
388
- * Get the allegedBrand, indicating the type of digital asset this
389
- * payment purports to be, and which issuer to use. Because payments
390
- * are not trusted, any method calls on payments should be treated
391
- * with suspicion and verified elsewhere.
311
+ * @typedef {object} Payment Payments hold amount of digital assets of the same
312
+ * brand in transit. Payments can be deposited in purses, split into multiple
313
+ * payments, combined, and claimed (getting an exclusive payment). Payments
314
+ * are linear, meaning that either a payment has the same amount of digital
315
+ * assets it started with, or it is used up entirely. It is impossible to
316
+ * partially use a payment.
317
+ *
318
+ * Payments are often received from other actors and therefore should not be
319
+ * trusted themselves. To get the amount of digital assets in a payment, use
320
+ * the trusted issuer: issuer.getAmountOf(payment),
321
+ *
322
+ * Payments can be converted to Purses by getting a trusted issuer and calling
323
+ * `issuer.makeEmptyPurse()` to create a purse, then
324
+ * `purse.deposit(payment)`.
325
+ * @property {() => Brand<K>} getAllegedBrand Get the allegedBrand, indicating
326
+ * the type of digital asset this payment purports to be, and which issuer to
327
+ * use. Because payments are not trusted, any method calls on payments should
328
+ * be treated with suspicion and verified elsewhere.
392
329
  */
393
330
 
331
+ // /////////////////////////// MathHelpers /////////////////////////////////////
332
+
394
333
  /**
395
334
  * @template {AmountValue} V
396
- * @typedef {object} MathHelpers
397
- * All of the difference in how digital asset amount are manipulated can be
398
- * reduced to the behavior of the math on values. We extract this
399
- * custom logic into mathHelpers. MathHelpers are about value
400
- * arithmetic, whereas AmountMath is about amounts, which are the
401
- * values labeled with a brand. AmountMath use mathHelpers to do their value
402
- * arithmetic, and then brand the results, making a new amount.
403
- *
404
- * The MathHelpers are designed to be called only from AmountMath, and so
405
- * all methods but coerce can assume their inputs are valid. They only
406
- * need to do output validation, and only when there is a possibility of
407
- * invalid output.
408
- *
409
- * @property {(allegedValue: V) => V} doCoerce
410
- * Check the kind of this value and throw if it is not the
411
- * expected kind.
412
- *
413
- * @property {() => V} doMakeEmpty
414
- * Get the representation for the identity element (often 0 or an
415
- * empty array)
416
- *
417
- * @property {(value: V) => boolean} doIsEmpty
418
- * Is the value the identity element?
419
- *
420
- * @property {(left: V, right: V) => boolean} doIsGTE
421
- * Is the left greater than or equal to the right?
422
- *
423
- * @property {(left: V, right: V) => boolean} doIsEqual
424
- * Does left equal right?
425
- *
426
- * @property {(left: V, right: V) => V} doAdd
427
- * Return the left combined with the right.
428
- *
429
- * @property {(left: V, right: V) => V} doSubtract
430
- * Return what remains after removing the right from the left. If
431
- * something in the right was not in the left, we throw an error.
335
+ * @typedef {object} MathHelpers All of the difference in how digital asset
336
+ * amount are manipulated can be reduced to the behavior of the math on
337
+ * values. We extract this custom logic into mathHelpers. MathHelpers are
338
+ * about value arithmetic, whereas AmountMath is about amounts, which are the
339
+ * values labeled with a brand. AmountMath use mathHelpers to do their value
340
+ * arithmetic, and then brand the results, making a new amount.
341
+ *
342
+ * The MathHelpers are designed to be called only from AmountMath, and so all
343
+ * methods but coerce can assume their inputs are valid. They only need to do
344
+ * output validation, and only when there is a possibility of invalid output.
345
+ * @property {(allegedValue: V) => V} doCoerce Check the kind of this value and
346
+ * throw if it is not the expected kind.
347
+ * @property {() => V} doMakeEmpty Get the representation for the identity
348
+ * element (often 0 or an empty array)
349
+ * @property {(value: V) => boolean} doIsEmpty Is the value the identity
350
+ * element?
351
+ * @property {(left: V, right: V) => boolean} doIsGTE Is the left greater than
352
+ * or equal to the right?
353
+ * @property {(left: V, right: V) => boolean} doIsEqual Does left equal right?
354
+ * @property {(left: V, right: V) => V} doAdd Return the left combined with the
355
+ * right.
356
+ * @property {(left: V, right: V) => V} doSubtract Return what remains after
357
+ * removing the right from the left. If something in the right was not in the
358
+ * left, we throw an error.
432
359
  */
433
360
 
434
- /**
435
- * @typedef {bigint} NatValue
436
- */
361
+ /** @typedef {bigint} NatValue */
437
362
 
438
- /**
439
- * @typedef {Array<Key>} SetValue
440
- */
363
+ /** @typedef {Key[]} SetValue */