@agoric/smart-wallet 0.5.3 → 0.5.4-calypso-dev-84eb287.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.
- package/package.json +34 -24
- package/src/invitations.d.ts +14 -10
- package/src/invitations.d.ts.map +1 -1
- package/src/invitations.js +32 -28
- package/src/marshal-contexts.d.ts +44 -41
- package/src/marshal-contexts.d.ts.map +1 -1
- package/src/marshal-contexts.js +65 -58
- package/src/offerWatcher.d.ts +48 -0
- package/src/offerWatcher.d.ts.map +1 -0
- package/src/offerWatcher.js +311 -0
- package/src/offers.d.ts +7 -31
- package/src/offers.d.ts.map +1 -1
- package/src/offers.js +9 -182
- package/src/proposals/upgrade-wallet-factory2-proposal.d.ts +23 -0
- package/src/proposals/upgrade-wallet-factory2-proposal.d.ts.map +1 -0
- package/src/proposals/upgrade-wallet-factory2-proposal.js +60 -0
- package/src/proposals/upgrade-walletFactory-proposal.d.ts +17 -0
- package/src/proposals/upgrade-walletFactory-proposal.d.ts.map +1 -0
- package/src/proposals/upgrade-walletFactory-proposal.js +127 -0
- package/src/smartWallet.d.ts +116 -69
- package/src/smartWallet.d.ts.map +1 -1
- package/src/smartWallet.js +830 -202
- package/src/typeGuards.d.ts +1 -1
- package/src/types.d.ts +24 -13
- package/src/utils.d.ts +17 -14
- package/src/utils.d.ts.map +1 -1
- package/src/utils.js +18 -6
- package/src/walletFactory.d.ts +26 -79
- package/src/walletFactory.d.ts.map +1 -1
- package/src/walletFactory.js +103 -42
- package/CHANGELOG.md +0 -172
- package/src/payments.d.ts +0 -20
- package/src/payments.d.ts.map +0 -1
- package/src/payments.js +0 -89
package/src/smartWallet.d.ts
CHANGED
|
@@ -1,165 +1,212 @@
|
|
|
1
|
-
export
|
|
1
|
+
export const BRAND_TO_PURSES_KEY: "brandToPurses";
|
|
2
|
+
export function prepareSmartWallet(baggage: import("@agoric/vat-data").Baggage, shared: SharedParams): (uniqueWithoutChildNodes: Omit<UniqueParams, "currentStorageNode" | "walletStorageNode"> & {
|
|
2
3
|
walletStorageNode: ERef<StorageNode>;
|
|
3
|
-
}) => Promise<{
|
|
4
|
+
}) => Promise<import("@endo/exo").Guarded<{
|
|
4
5
|
/**
|
|
5
|
-
* Umarshals the actionCapData and delegates to the appropriate action
|
|
6
|
+
* Umarshals the actionCapData and delegates to the appropriate action
|
|
7
|
+
* handler.
|
|
6
8
|
*
|
|
7
|
-
* @param {import('@endo/marshal').CapData<string>} actionCapData
|
|
8
|
-
*
|
|
9
|
+
* @param {import('@endo/marshal').CapData<string | null>} actionCapData
|
|
10
|
+
* of type BridgeAction
|
|
11
|
+
* @param {boolean} [canSpend]
|
|
9
12
|
* @returns {Promise<void>}
|
|
10
13
|
*/
|
|
11
|
-
handleBridgeAction(actionCapData: import(
|
|
12
|
-
getDepositFacet(): {
|
|
14
|
+
handleBridgeAction(actionCapData: import("@endo/marshal").CapData<string | null>, canSpend?: boolean | undefined): Promise<void>;
|
|
15
|
+
getDepositFacet(): import("@endo/exo").Guarded<{
|
|
13
16
|
/**
|
|
14
17
|
* Put the assets from the payment into the appropriate purse.
|
|
15
18
|
*
|
|
16
19
|
* If the purse doesn't exist, we hold the payment in durable storage.
|
|
17
20
|
*
|
|
18
|
-
* @param {
|
|
19
|
-
* @returns {Promise<Amount>}
|
|
21
|
+
* @param {Payment} payment
|
|
22
|
+
* @returns {Promise<Amount>}
|
|
23
|
+
* @throws if there's not yet a purse, though the payment is held to try
|
|
24
|
+
* again when there is
|
|
20
25
|
*/
|
|
21
|
-
receive(payment:
|
|
22
|
-
}
|
|
23
|
-
getOffersFacet(): {
|
|
26
|
+
receive(payment: Payment): Promise<Amount>;
|
|
27
|
+
}>;
|
|
28
|
+
getOffersFacet(): import("@endo/exo").Guarded<{
|
|
24
29
|
/**
|
|
25
|
-
* Take an offer description provided in capData, augment it with
|
|
30
|
+
* Take an offer description provided in capData, augment it with
|
|
31
|
+
* payments and call zoe.offer()
|
|
26
32
|
*
|
|
27
|
-
* @param {
|
|
28
|
-
* @returns {Promise<void>} after the offer has been both seated and
|
|
29
|
-
*
|
|
33
|
+
* @param {OfferSpec} offerSpec
|
|
34
|
+
* @returns {Promise<void>} after the offer has been both seated and
|
|
35
|
+
* exited by Zoe.
|
|
36
|
+
* @throws if any parts of the offer can be determined synchronously to
|
|
37
|
+
* be invalid
|
|
30
38
|
*/
|
|
31
|
-
executeOffer(offerSpec:
|
|
39
|
+
executeOffer(offerSpec: OfferSpec): Promise<void>;
|
|
32
40
|
/**
|
|
33
41
|
* Take an offer's id, look up its seat, try to exit.
|
|
34
42
|
*
|
|
35
|
-
* @param {
|
|
43
|
+
* @param {OfferId} offerId
|
|
36
44
|
* @returns {Promise<void>}
|
|
37
45
|
* @throws if the seat can't be found or E(seatRef).tryExit() fails.
|
|
38
46
|
*/
|
|
39
|
-
tryExitOffer(offerId:
|
|
40
|
-
}
|
|
47
|
+
tryExitOffer(offerId: OfferId): Promise<void>;
|
|
48
|
+
}>;
|
|
41
49
|
/** @deprecated use getPublicTopics */
|
|
42
|
-
getCurrentSubscriber(): Subscriber<CurrentWalletRecord>;
|
|
50
|
+
getCurrentSubscriber(): globalThis.Subscriber<CurrentWalletRecord>;
|
|
43
51
|
/** @deprecated use getPublicTopics */
|
|
44
|
-
getUpdatesSubscriber(): Subscriber<UpdateRecord>;
|
|
52
|
+
getUpdatesSubscriber(): globalThis.Subscriber<UpdateRecord>;
|
|
45
53
|
getPublicTopics(): {
|
|
46
54
|
current: {
|
|
47
55
|
description: string;
|
|
48
|
-
subscriber: Subscriber<CurrentWalletRecord>;
|
|
56
|
+
subscriber: globalThis.Subscriber<CurrentWalletRecord>;
|
|
49
57
|
storagePath: Promise<string>;
|
|
50
58
|
};
|
|
51
59
|
updates: {
|
|
52
60
|
description: string;
|
|
53
|
-
subscriber: Subscriber<UpdateRecord>;
|
|
61
|
+
subscriber: globalThis.Subscriber<UpdateRecord>;
|
|
54
62
|
storagePath: Promise<string>;
|
|
55
63
|
};
|
|
56
64
|
};
|
|
57
|
-
|
|
65
|
+
/**
|
|
66
|
+
* To be called once ever per wallet.
|
|
67
|
+
*
|
|
68
|
+
* @param {object} key
|
|
69
|
+
*/
|
|
70
|
+
repairWalletForIncarnation2(key: object): void;
|
|
71
|
+
}>>;
|
|
72
|
+
export type OfferId = number | string;
|
|
73
|
+
export type OfferSpec = {
|
|
74
|
+
id: OfferId;
|
|
75
|
+
invitationSpec: import("./invitations").InvitationSpec;
|
|
76
|
+
proposal: Proposal;
|
|
77
|
+
offerArgs?: any;
|
|
78
|
+
};
|
|
79
|
+
export type ExecutorPowers = {
|
|
80
|
+
logger: {
|
|
81
|
+
info: (...args: any[]) => void;
|
|
82
|
+
error: (...args: any[]) => void;
|
|
83
|
+
};
|
|
84
|
+
makeOfferWatcher: import("./offerWatcher.js").MakeOfferWatcher;
|
|
85
|
+
invitationFromSpec: ERef<Invitation>;
|
|
86
|
+
};
|
|
58
87
|
export type ExecuteOfferAction = {
|
|
59
|
-
method:
|
|
60
|
-
offer:
|
|
88
|
+
method: "executeOffer";
|
|
89
|
+
offer: OfferSpec;
|
|
61
90
|
};
|
|
62
91
|
export type TryExitOfferAction = {
|
|
63
|
-
method:
|
|
64
|
-
offerId:
|
|
92
|
+
method: "tryExitOffer";
|
|
93
|
+
offerId: OfferId;
|
|
65
94
|
};
|
|
66
95
|
export type BridgeAction = ExecuteOfferAction | TryExitOfferAction;
|
|
67
96
|
/**
|
|
68
|
-
* Purses is an array to support a future requirement of multiple purses per
|
|
97
|
+
* Purses is an array to support a future requirement of multiple purses per
|
|
98
|
+
* brand.
|
|
69
99
|
*
|
|
70
|
-
* Each map is encoded as an array of entries because a Map doesn't serialize
|
|
71
|
-
* We also considered having a vstorage key for each offer but for now
|
|
100
|
+
* Each map is encoded as an array of entries because a Map doesn't serialize
|
|
101
|
+
* directly. We also considered having a vstorage key for each offer but for now
|
|
102
|
+
* are sticking with this design.
|
|
72
103
|
*
|
|
73
104
|
* Cons
|
|
74
|
-
*
|
|
75
|
-
*
|
|
105
|
+
*
|
|
106
|
+
* - Reserializes previously written results when a new result is added
|
|
107
|
+
* - Optimizes reads though writes are on-chain (~100 machines) and reads are
|
|
108
|
+
* off-chain (to 1 machine)
|
|
76
109
|
*
|
|
77
110
|
* Pros
|
|
78
|
-
* - Reading all offer results happens much more (>100) often than storing a new offer result
|
|
79
|
-
* - Reserialization and writes are paid in execution gas, whereas reads are not
|
|
80
111
|
*
|
|
81
|
-
*
|
|
112
|
+
* - Reading all offer results happens much more (>100) often than storing a new
|
|
113
|
+
* offer result
|
|
114
|
+
* - Reserialization and writes are paid in execution gas, whereas reads are not
|
|
115
|
+
*
|
|
116
|
+
* This design should be revisited if ever batch querying across vstorage keys
|
|
117
|
+
* become cheaper or reads be paid.
|
|
82
118
|
*/
|
|
83
119
|
export type CurrentWalletRecord = {
|
|
84
|
-
purses:
|
|
120
|
+
purses: {
|
|
85
121
|
brand: Brand;
|
|
86
122
|
balance: Amount;
|
|
87
|
-
}
|
|
88
|
-
offerToUsedInvitation:
|
|
123
|
+
}[];
|
|
124
|
+
offerToUsedInvitation: [offerId: string, usedInvitation: Amount][];
|
|
89
125
|
offerToPublicSubscriberPaths: [offerId: string, publicTopics: {
|
|
90
126
|
[subscriberName: string]: string;
|
|
91
127
|
}][];
|
|
92
|
-
liveOffers:
|
|
128
|
+
liveOffers: [OfferId, OfferStatus][];
|
|
93
129
|
};
|
|
94
130
|
/**
|
|
95
131
|
* Record of an update to the state of this wallet.
|
|
96
132
|
*
|
|
97
|
-
* Client is responsible for coalescing updates into a current state. See
|
|
133
|
+
* Client is responsible for coalescing updates into a current state. See
|
|
134
|
+
* `coalesceUpdates` utility.
|
|
98
135
|
*
|
|
99
|
-
* The reason for this burden on the client is that publishing
|
|
100
|
-
*
|
|
136
|
+
* The reason for this burden on the client is that publishing the full history
|
|
137
|
+
* of offers with each change is untenable.
|
|
101
138
|
*
|
|
102
139
|
* `balance` update supports forward-compatibility for more than one purse per
|
|
103
|
-
* brand. An additional key will be needed to disambiguate. For now the brand
|
|
104
|
-
* the amount suffices.
|
|
140
|
+
* brand. An additional key will be needed to disambiguate. For now the brand
|
|
141
|
+
* in the amount suffices.
|
|
105
142
|
*/
|
|
106
143
|
export type UpdateRecord = {
|
|
107
|
-
updated:
|
|
108
|
-
status:
|
|
144
|
+
updated: "offerStatus";
|
|
145
|
+
status: OfferStatus;
|
|
109
146
|
} | {
|
|
110
|
-
updated:
|
|
147
|
+
updated: "balance";
|
|
111
148
|
currentAmount: Amount;
|
|
112
149
|
} | {
|
|
113
|
-
updated:
|
|
150
|
+
updated: "walletAction";
|
|
114
151
|
status: {
|
|
115
152
|
error: string;
|
|
116
153
|
};
|
|
117
154
|
};
|
|
118
155
|
/**
|
|
119
|
-
* For use by clients to describe brands to users. Includes `displayInfo` to
|
|
156
|
+
* For use by clients to describe brands to users. Includes `displayInfo` to
|
|
157
|
+
* save a remote call.
|
|
120
158
|
*/
|
|
121
159
|
export type BrandDescriptor = {
|
|
122
160
|
brand: Brand;
|
|
123
161
|
displayInfo: DisplayInfo;
|
|
124
162
|
issuer: Issuer;
|
|
125
|
-
petname: import(
|
|
163
|
+
petname: import("./types.js").Petname;
|
|
126
164
|
};
|
|
127
|
-
export type RemotePurse = import('./types').RemotePurse;
|
|
128
165
|
export type UniqueParams = {
|
|
129
166
|
address: string;
|
|
130
|
-
bank: ERef<import(
|
|
167
|
+
bank: ERef<import("@agoric/vats/src/vat-bank.js").Bank>;
|
|
131
168
|
currentStorageNode: StorageNode;
|
|
132
|
-
invitationPurse: Purse<
|
|
169
|
+
invitationPurse: Purse<"set", InvitationDetails>;
|
|
133
170
|
walletStorageNode: StorageNode;
|
|
134
171
|
};
|
|
135
|
-
export type BrandDescriptorRegistry = Pick<MapStore<Brand, BrandDescriptor>,
|
|
172
|
+
export type BrandDescriptorRegistry = Pick<MapStore<Brand, BrandDescriptor>, "has" | "get" | "values">;
|
|
136
173
|
export type SharedParams = {
|
|
137
|
-
agoricNames: ERef<import(
|
|
174
|
+
agoricNames: ERef<import("@agoric/vats").NameHub>;
|
|
138
175
|
registry: BrandDescriptorRegistry;
|
|
139
|
-
invitationIssuer: Issuer<
|
|
140
|
-
invitationBrand: Brand<
|
|
176
|
+
invitationIssuer: Issuer<"set">;
|
|
177
|
+
invitationBrand: Brand<"set">;
|
|
141
178
|
invitationDisplayInfo: DisplayInfo;
|
|
142
179
|
publicMarshaller: Marshaller;
|
|
143
180
|
zoe: ERef<ZoeService>;
|
|
181
|
+
secretWalletFactoryKey: any;
|
|
144
182
|
};
|
|
145
183
|
/**
|
|
146
|
-
* - `brandPurses` is precious
|
|
184
|
+
* - `brandPurses` is precious
|
|
185
|
+
* and closely held. defined as late as possible to reduce its scope.
|
|
186
|
+
*
|
|
147
187
|
* - `offerToInvitationMakers` is precious and closely held.
|
|
148
188
|
* - `offerToPublicSubscriberPaths` is precious and closely held.
|
|
149
|
-
* - `purseBalances` is a cache of what we've received from purses. Held so we can
|
|
189
|
+
* - `purseBalances` is a cache of what we've received from purses. Held so we can
|
|
190
|
+
* publish all balances on change.
|
|
150
191
|
*/
|
|
151
192
|
export type State = ImmutableState & MutableState;
|
|
152
193
|
export type ImmutableState = Readonly<UniqueParams & {
|
|
153
|
-
paymentQueues: MapStore<Brand,
|
|
154
|
-
offerToInvitationMakers: MapStore<string, import(
|
|
194
|
+
paymentQueues: MapStore<Brand, Payment[]>;
|
|
195
|
+
offerToInvitationMakers: MapStore<string, import("./types.js").InvitationMakers>;
|
|
155
196
|
offerToPublicSubscriberPaths: MapStore<string, Record<string, string>>;
|
|
156
|
-
offerToUsedInvitation: MapStore<string, Amount
|
|
157
|
-
purseBalances: MapStore<
|
|
158
|
-
updateRecorderKit: import(
|
|
159
|
-
currentRecorderKit: import(
|
|
160
|
-
liveOffers: MapStore<
|
|
161
|
-
liveOfferSeats:
|
|
197
|
+
offerToUsedInvitation: MapStore<string, Amount<"set">>;
|
|
198
|
+
purseBalances: MapStore<Purse, Amount>;
|
|
199
|
+
updateRecorderKit: import("@agoric/zoe/src/contractSupport/recorder.js").RecorderKit<UpdateRecord>;
|
|
200
|
+
currentRecorderKit: import("@agoric/zoe/src/contractSupport/recorder.js").RecorderKit<CurrentWalletRecord>;
|
|
201
|
+
liveOffers: MapStore<OfferId, OfferStatus>;
|
|
202
|
+
liveOfferSeats: MapStore<OfferId, UserSeat<unknown>>;
|
|
203
|
+
liveOfferPayments: MapStore<OfferId, MapStore<Brand, Payment>>;
|
|
162
204
|
}>;
|
|
205
|
+
export type PurseRecord = BrandDescriptor & {
|
|
206
|
+
purse: Purse;
|
|
207
|
+
};
|
|
163
208
|
export type MutableState = {};
|
|
164
209
|
export type SmartWallet = Awaited<ReturnType<ReturnType<typeof prepareSmartWallet>>>;
|
|
210
|
+
import type { OfferId } from './offers.js';
|
|
211
|
+
import type { OfferStatus } from './offers.js';
|
|
165
212
|
//# sourceMappingURL=smartWallet.d.ts.map
|
package/src/smartWallet.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smartWallet.d.ts","sourceRoot":"","sources":["smartWallet.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"smartWallet.d.ts","sourceRoot":"","sources":["smartWallet.js"],"names":[],"mappings":"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"}
|