@agoric/vats 0.15.2-dev-c19f1b5.0 → 0.15.2-dev-27cc9b8.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 +17 -18
- package/src/bridge-target.d.ts +193 -0
- package/src/bridge-target.d.ts.map +1 -0
- package/src/bridge-target.js +316 -0
- package/src/core/types-ambient.d.ts +3 -2
- package/src/ibc.d.ts +3 -33
- package/src/ibc.d.ts.map +1 -1
- package/src/ibc.js +3 -3
- package/src/localchain.d.ts +7 -0
- package/src/localchain.d.ts.map +1 -1
- package/src/localchain.js +11 -2
- package/src/proposals/localchain-proposal.d.ts +4 -1
- package/src/proposals/localchain-proposal.d.ts.map +1 -1
- package/src/proposals/localchain-proposal.js +5 -0
- package/src/proposals/localchain-test.d.ts.map +1 -1
- package/src/proposals/localchain-test.js +7 -4
- package/src/proposals/restart-vats-proposal.d.ts.map +1 -1
- package/src/proposals/restart-vats-proposal.js +6 -2
- package/src/proposals/transfer-proposal.d.ts +41 -0
- package/src/proposals/transfer-proposal.d.ts.map +1 -0
- package/src/proposals/transfer-proposal.js +120 -0
- package/src/proposals/vtransfer-echoer.d.ts +24 -0
- package/src/proposals/vtransfer-echoer.d.ts.map +1 -0
- package/src/proposals/vtransfer-echoer.js +42 -0
- package/src/transfer.d.ts +124 -0
- package/src/transfer.d.ts.map +1 -0
- package/src/transfer.js +271 -0
- package/src/types.d.ts +4 -3
- package/src/vat-ibc.d.ts +0 -28
- package/src/vat-ibc.d.ts.map +1 -1
- package/src/vat-localchain.d.ts +2 -0
- package/src/vat-localchain.d.ts.map +1 -1
- package/src/vat-transfer.d.ts +81 -0
- package/src/vat-transfer.d.ts.map +1 -0
- package/src/vat-transfer.js +63 -0
- package/tools/fake-bridge.d.ts +1 -0
- package/tools/fake-bridge.d.ts.map +1 -1
- package/tools/fake-bridge.js +45 -0
package/src/ibc.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { assert, details as X, Fail } from '@agoric/assert';
|
|
4
4
|
import { E } from '@endo/far';
|
|
5
5
|
|
|
6
|
-
import {
|
|
6
|
+
import { byteSourceToBase64, base64ToBytes } from '@agoric/network';
|
|
7
7
|
|
|
8
8
|
import {
|
|
9
9
|
localAddrToPortID,
|
|
@@ -132,7 +132,7 @@ export const prepareIBCConnectionHandler = zone => {
|
|
|
132
132
|
source_channel: channelID,
|
|
133
133
|
destination_port: rPortID,
|
|
134
134
|
destination_channel: rChannelID,
|
|
135
|
-
data:
|
|
135
|
+
data: byteSourceToBase64(packetBytes),
|
|
136
136
|
};
|
|
137
137
|
return protocolUtils.ibcSendPacket(packet, relativeTimeoutNs);
|
|
138
138
|
},
|
|
@@ -678,7 +678,7 @@ export const prepareIBCProtocol = (zone, powers) => {
|
|
|
678
678
|
const { packet } = watcherContext;
|
|
679
679
|
|
|
680
680
|
const realAck = ack || DEFAULT_ACKNOWLEDGEMENT;
|
|
681
|
-
const ack64 =
|
|
681
|
+
const ack64 = byteSourceToBase64(realAck);
|
|
682
682
|
this.facets.util
|
|
683
683
|
.downcall('receiveExecuted', {
|
|
684
684
|
packet,
|
package/src/localchain.d.ts
CHANGED
|
@@ -7,12 +7,14 @@
|
|
|
7
7
|
* @typedef {{
|
|
8
8
|
* system: ScopedBridgeManager<'vlocalchain'>;
|
|
9
9
|
* bank: Bank;
|
|
10
|
+
* transfer: import('./transfer.js').TransferMiddleware;
|
|
10
11
|
* }} AccountPowers
|
|
11
12
|
*/
|
|
12
13
|
/**
|
|
13
14
|
* @typedef {{
|
|
14
15
|
* system: ScopedBridgeManager<'vlocalchain'>;
|
|
15
16
|
* bankManager: BankManager;
|
|
17
|
+
* transfer: import('./transfer.js').TransferMiddleware;
|
|
16
18
|
* }} LocalChainPowers
|
|
17
19
|
*/
|
|
18
20
|
export const LocalChainAccountI: import("@endo/patterns").InterfaceGuard<{
|
|
@@ -21,6 +23,7 @@ export const LocalChainAccountI: import("@endo/patterns").InterfaceGuard<{
|
|
|
21
23
|
deposit: import("@endo/patterns").MethodGuard;
|
|
22
24
|
withdraw: import("@endo/patterns").MethodGuard;
|
|
23
25
|
executeTx: import("@endo/patterns").MethodGuard;
|
|
26
|
+
monitorTransfers: import("@endo/patterns").MethodGuard;
|
|
24
27
|
}>;
|
|
25
28
|
/**
|
|
26
29
|
* @typedef {Awaited<
|
|
@@ -74,6 +77,7 @@ export function prepareLocalChainTools(zone: import("@agoric/base-zone").Zone):
|
|
|
74
77
|
executeTx<MT extends {
|
|
75
78
|
'@type': string;
|
|
76
79
|
}[]>(messages: MT): Promise<{ [K in keyof MT]: JsonSafe<ResponseTo<MT[K]>>; }>;
|
|
80
|
+
monitorTransfers(tap: any): Promise<any>;
|
|
77
81
|
}>>;
|
|
78
82
|
/**
|
|
79
83
|
* Make a single query to the local chain. Will reject with an error if
|
|
@@ -106,6 +110,7 @@ export function prepareLocalChainTools(zone: import("@agoric/base-zone").Zone):
|
|
|
106
110
|
export type AccountPowers = {
|
|
107
111
|
system: ScopedBridgeManager<"vlocalchain">;
|
|
108
112
|
bank: Bank;
|
|
113
|
+
transfer: import("./transfer.js").TransferMiddleware;
|
|
109
114
|
};
|
|
110
115
|
export type LocalChainPowers = {
|
|
111
116
|
system: ScopedBridgeManager<"vlocalchain">;
|
|
@@ -128,6 +133,7 @@ export type LocalChainPowers = {
|
|
|
128
133
|
}): Promise<void>;
|
|
129
134
|
getBankForAddress(address: string): Promise<Bank>;
|
|
130
135
|
}>;
|
|
136
|
+
transfer: import("./transfer.js").TransferMiddleware;
|
|
131
137
|
};
|
|
132
138
|
export type LocalChainAccount = Awaited<ReturnType<Awaited<ReturnType<typeof prepareLocalChainAccount>>>>;
|
|
133
139
|
export type LocalChainTools = ReturnType<typeof prepareLocalChainTools>;
|
|
@@ -171,6 +177,7 @@ declare function prepareLocalChainAccount(zone: import("@agoric/base-zone").Zone
|
|
|
171
177
|
executeTx<MT extends {
|
|
172
178
|
'@type': string;
|
|
173
179
|
}[]>(messages: MT): Promise<{ [K in keyof MT]: JsonSafe<ResponseTo<MT[K]>>; }>;
|
|
180
|
+
monitorTransfers(tap: any): Promise<any>;
|
|
174
181
|
}>;
|
|
175
182
|
export {};
|
|
176
183
|
//# sourceMappingURL=localchain.d.ts.map
|
package/src/localchain.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localchain.d.ts","sourceRoot":"","sources":["localchain.js"],"names":[],"mappings":"AAOA;;;;GAIG;AAEH
|
|
1
|
+
{"version":3,"file":"localchain.d.ts","sourceRoot":"","sources":["localchain.js"],"names":[],"mappings":"AAOA;;;;GAIG;AAEH;;;;;;GAMG;AAEH;;;;;;GAMG;AAEH;;;;;;;GASG;AAgFH;;;;GAIG;AAEH;;;;GAIG;AAwEI,6CADK,OAAO,mBAAmB,EAAE,IAAI;;QAxDtC;;;;;WAKG;;;YA7FH,kCAAkC;8BAAtB,KAAK,CAAC,KAAK,CAAC;YAMxB;;;;;;;;;eASG;6BAJQ,OAAO,CAAC,KAAK,CAAC,mBACd,OAAO,GAEL,OAAO,CAAC,MAAM,CAAC;YAS5B;;;;;eAKG;6BAFQ,MAAM,CAAC,KAAK,CAAC,GACX,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAOpC;;;;;;;;eAQG;sBADyD,EAAE;;2BAAF,EAAE,AADjD;;;QA8Db;;;;;;;WAOG;uBAFQ,OAAO,sBAAsB,EAAE,SAAS,GACtC,OAAO,CAAC,OAAO,sBAAsB,EAAE,SAAS,CAAC;QAa9D;;;;;;;;;;;;WAYG;4BAPQ,OAAO,sBAAsB,EAAE,SAAS,EAAE,GACxC,OAAO,CACnB;YACA,KAAW,CAAC,EAAE,MAAM,CAAC;YACrB,KAAW,EAAE,OAAO,sBAAsB,EAAE,SAAS,CAAC;SACjD,EAAE,CACJ;;EAkBT;;;;cA5Lc,OAAO,eAAe,EAAE,kBAAkB;;;;;;gEAiM++X,cAAc;;;;;;;;;;;;+EAAiiD,cAAc,GAAE;YAAE,OAAQ,CAAC,EAAC,KAAM,QAAQ,KAAK,CAAC,CAAC,CAAA;SAAE;;;cAzL3nb,OAAO,eAAe,EAAE,kBAAkB;;gCA8F5C,OAAO,CACnB,UAAc,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAAC,CAAC,CACjE;8BAuFU,UAAU,CAAC,OAAO,sBAAsB,CAAC;yBACzC,UAAU,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC;gCAzMT,sBAAsB;8BAAtB,sBAAsB;yCAElC,YAAY;0BADd,eAAe;AA+BnD,qDAAqD;AACrD,gDADY,OAAO,mBAAmB,EAAE,IAAI;;IAetC,kCAAkC;sBAAtB,KAAK,CAAC,KAAK,CAAC;IAMxB;;;;;;;;;OASG;qBAJQ,OAAO,CAAC,KAAK,CAAC,mBACd,OAAO,GAEL,OAAO,CAAC,MAAM,CAAC;IAS5B;;;;;OAKG;qBAFQ,MAAM,CAAC,KAAK,CAAC,GACX,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAOpC;;;;;;;;OAQG;cADyD,EAAE;;mBAAF,EAAE,AADjD;;GAsBhB"}
|
package/src/localchain.js
CHANGED
|
@@ -15,6 +15,7 @@ const { Fail } = assert;
|
|
|
15
15
|
* @typedef {{
|
|
16
16
|
* system: ScopedBridgeManager<'vlocalchain'>;
|
|
17
17
|
* bank: Bank;
|
|
18
|
+
* transfer: import('./transfer.js').TransferMiddleware;
|
|
18
19
|
* }} AccountPowers
|
|
19
20
|
*/
|
|
20
21
|
|
|
@@ -22,6 +23,7 @@ const { Fail } = assert;
|
|
|
22
23
|
* @typedef {{
|
|
23
24
|
* system: ScopedBridgeManager<'vlocalchain'>;
|
|
24
25
|
* bankManager: BankManager;
|
|
26
|
+
* transfer: import('./transfer.js').TransferMiddleware;
|
|
25
27
|
* }} LocalChainPowers
|
|
26
28
|
*/
|
|
27
29
|
|
|
@@ -31,6 +33,9 @@ export const LocalChainAccountI = M.interface('LocalChainAccount', {
|
|
|
31
33
|
deposit: M.callWhen(PaymentShape).optional(M.pattern()).returns(AmountShape),
|
|
32
34
|
withdraw: M.callWhen(AmountShape).returns(PaymentShape),
|
|
33
35
|
executeTx: M.callWhen(M.arrayOf(M.record())).returns(M.arrayOf(M.record())),
|
|
36
|
+
monitorTransfers: M.callWhen(M.remotable('TransferTap')).returns(
|
|
37
|
+
M.remotable('TargetRegistration'),
|
|
38
|
+
),
|
|
34
39
|
});
|
|
35
40
|
|
|
36
41
|
/** @param {import('@agoric/base-zone').Zone} zone */
|
|
@@ -105,6 +110,10 @@ const prepareLocalChainAccount = zone =>
|
|
|
105
110
|
};
|
|
106
111
|
return E(system).toBridge(obj);
|
|
107
112
|
},
|
|
113
|
+
async monitorTransfers(tap) {
|
|
114
|
+
const { address, transfer } = this.state;
|
|
115
|
+
return E(transfer).registerTap(address, tap);
|
|
116
|
+
},
|
|
108
117
|
},
|
|
109
118
|
);
|
|
110
119
|
/**
|
|
@@ -139,12 +148,12 @@ const prepareLocalChain = (zone, makeAccount) =>
|
|
|
139
148
|
* hash and block data hash.
|
|
140
149
|
*/
|
|
141
150
|
async makeAccount() {
|
|
142
|
-
const { system, bankManager } = this.state;
|
|
151
|
+
const { system, bankManager, transfer } = this.state;
|
|
143
152
|
const address = await E(system).toBridge({
|
|
144
153
|
type: 'VLOCALCHAIN_ALLOCATE_ADDRESS',
|
|
145
154
|
});
|
|
146
155
|
const bank = await E(bankManager).getBankForAddress(address);
|
|
147
|
-
return makeAccount(address, { system, bank });
|
|
156
|
+
return makeAccount(address, { system, bank, transfer });
|
|
148
157
|
},
|
|
149
158
|
/**
|
|
150
159
|
* Make a single query to the local chain. Will reject with an error if
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
export function setupLocalChainVat({ consume: { loadCriticalVat, bridgeManager: bridgeManagerP, localchainBridgeManager: localchainBridgeManagerP, bankManager, }, produce: { localchainVat, localchain, localchainBridgeManager }, }: BootstrapPowers & {
|
|
1
|
+
export function setupLocalChainVat({ consume: { loadCriticalVat, bridgeManager: bridgeManagerP, localchainBridgeManager: localchainBridgeManagerP, bankManager, transferMiddleware, }, produce: { localchainVat, localchain, localchainBridgeManager }, }: BootstrapPowers & {
|
|
2
2
|
consume: {
|
|
3
3
|
loadCriticalVat: VatLoader<any>;
|
|
4
|
+
bridgeManager: import("../types").BridgeManager;
|
|
4
5
|
localchainBridgeManager: import("../types").ScopedBridgeManager<"vlocalchain">;
|
|
6
|
+
bankManager: Promise<import("../vat-bank.js").BankManager>;
|
|
7
|
+
transferMiddleware: Promise<import("../transfer.js").TransferMiddleware>;
|
|
5
8
|
};
|
|
6
9
|
produce: {
|
|
7
10
|
localchain: Producer<any>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localchain-proposal.d.ts","sourceRoot":"","sources":["localchain-proposal.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"localchain-proposal.d.ts","sourceRoot":"","sources":["localchain-proposal.js"],"names":[],"mappings":"AA0BO,2PArBI,eAAe,GAAG;IAC5B,OAAW,EAAE;QACb,eAAqB,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;QACtC,aAAmB,EAAE,OAAO,UAAU,EAAE,aAAa,CAAC;QACtD,uBAA6B,EAAE,OAAO,UAAU,EAAE,mBAAmB,CAAC,aAAa,CAAC,CAAC;QACrF,WAAiB,EAAE,OAAO,CAAC,OAAO,gBAAgB,EAAE,WAAW,CAAC,CAAC;QACjE,kBAAwB,EAAE,OAAO,CAAC,OAAO,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;KAC1E,CAAC;IACN,OAAW,EAAE;QACb,UAAgB,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChC,aAAmB,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;QACnC,uBAA6B,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;KACxC,CAAC;CACH;IAEgD,OAAO,EAAhD;QAAE,aAAa,EAAE,YAAY,CAAA;KAAE;kBA8DzC;AAUM,2EAPI,eAAe,GAAG;IAC5B,OAAW,EAAE;QACb,UAAgB,EAAE,OAAO,kBAAkB,EAAE,UAAU,CAAC;KACnD,CAAC;CACH,YACO,MAAM,iBAOhB;AAEM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BL;6BAxGW;IACZ,UAAc,EAAE,IAAI,CAAC,OAAO,sBAAsB,EAAE,aAAa,CAAC,CAAC;CAChE"}
|
|
@@ -6,7 +6,10 @@ import { BridgeId as BRIDGE_ID } from '@agoric/internal';
|
|
|
6
6
|
* @param {BootstrapPowers & {
|
|
7
7
|
* consume: {
|
|
8
8
|
* loadCriticalVat: VatLoader<any>;
|
|
9
|
+
* bridgeManager: import('../types').BridgeManager;
|
|
9
10
|
* localchainBridgeManager: import('../types').ScopedBridgeManager<'vlocalchain'>;
|
|
11
|
+
* bankManager: Promise<import('../vat-bank.js').BankManager>;
|
|
12
|
+
* transferMiddleware: Promise<import('../transfer.js').TransferMiddleware>;
|
|
10
13
|
* };
|
|
11
14
|
* produce: {
|
|
12
15
|
* localchain: Producer<any>;
|
|
@@ -28,6 +31,7 @@ export const setupLocalChainVat = async (
|
|
|
28
31
|
bridgeManager: bridgeManagerP,
|
|
29
32
|
localchainBridgeManager: localchainBridgeManagerP,
|
|
30
33
|
bankManager,
|
|
34
|
+
transferMiddleware,
|
|
31
35
|
},
|
|
32
36
|
produce: { localchainVat, localchain, localchainBridgeManager },
|
|
33
37
|
},
|
|
@@ -71,6 +75,7 @@ export const setupLocalChainVat = async (
|
|
|
71
75
|
const newLocalChain = await E(vats.localchain).makeLocalChain({
|
|
72
76
|
system: scopedManager,
|
|
73
77
|
bankManager: await bankManager,
|
|
78
|
+
transfer: await transferMiddleware,
|
|
74
79
|
});
|
|
75
80
|
|
|
76
81
|
localchain.reset();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"localchain-test.d.ts","sourceRoot":"","sources":["localchain-test.js"],"names":[],"mappings":"AAaO,0EARI,eAAe,GAAG;IAC5B,OAAW,EAAE;QACb,UAAgB,EAAE,OAAO,kBAAkB,EAAE,UAAU,CAAC;KACnD,CAAC;CACH;IAE2C,OAAO,EAA3C;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE;
|
|
1
|
+
{"version":3,"file":"localchain-test.d.ts","sourceRoot":"","sources":["localchain-test.js"],"names":[],"mappings":"AAaO,0EARI,eAAe,GAAG;IAC5B,OAAW,EAAE;QACb,UAAgB,EAAE,OAAO,kBAAkB,EAAE,UAAU,CAAC;KACnD,CAAC;CACH;IAE2C,OAAO,EAA3C;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE;kBA+DpC;AAEM;;;;;;;;;;;;;;EAYL"}
|
|
@@ -19,13 +19,10 @@ export const testLocalChain = async (
|
|
|
19
19
|
/** @type {null | ERef<StorageNode>} */
|
|
20
20
|
let node = await chainStorage;
|
|
21
21
|
if (!node) {
|
|
22
|
+
console.error('testLocalChain no chainStorage');
|
|
22
23
|
throw new Error('no chainStorage');
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
for (const nodeName of testResultPath.split('.')) {
|
|
26
|
-
node = E(node).makeChildNode(nodeName);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
26
|
let result;
|
|
30
27
|
try {
|
|
31
28
|
const lca = await E(localchain).makeAccount();
|
|
@@ -60,6 +57,9 @@ export const testLocalChain = async (
|
|
|
60
57
|
|
|
61
58
|
const emptyQuery = await E(localchain).queryMany([]);
|
|
62
59
|
console.info('emptyQuery', emptyQuery);
|
|
60
|
+
if (emptyQuery.length !== 0) {
|
|
61
|
+
throw new Error('emptyQuery results should be empty');
|
|
62
|
+
}
|
|
63
63
|
|
|
64
64
|
result = { success: true };
|
|
65
65
|
} catch (e) {
|
|
@@ -68,6 +68,9 @@ export const testLocalChain = async (
|
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
console.warn('=== localchain test done, setting', { result });
|
|
71
|
+
for (const nodeName of testResultPath.split('.')) {
|
|
72
|
+
node = E(node).makeChildNode(nodeName);
|
|
73
|
+
}
|
|
71
74
|
await E(node).setValue(JSON.stringify(result));
|
|
72
75
|
};
|
|
73
76
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"restart-vats-proposal.d.ts","sourceRoot":"","sources":["restart-vats-proposal.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"restart-vats-proposal.d.ts","sourceRoot":"","sources":["restart-vats-proposal.js"],"names":[],"mappings":"AAiCO,yCALI,eAAe,GACzB,OAAW,wDAAwD,EAAE,qBAAqB;IAErD,OAAO,EAAlC;QAAE,IAAI,EAAE,MAAM,EAAE,CAAA;KAAE;kBAoH5B;AAGM;;;;;;;;;;;;;;;;;;;;EAoBL"}
|
|
@@ -17,9 +17,11 @@ const vatUpgradeStatus = {
|
|
|
17
17
|
board: 'covered by test-upgrade-vats: upgrade vat-board',
|
|
18
18
|
bridge: 'covered by test-upgrade-vats: upgrade vat-bridge',
|
|
19
19
|
ibc: 'upgradeable',
|
|
20
|
+
localchain: 'UNTESTED',
|
|
20
21
|
network: 'upgradeable',
|
|
21
22
|
priceAuthority: 'covered by test-upgrade-vats: upgrade vat-priceAuthority',
|
|
22
23
|
provisioning: 'UNTESTED',
|
|
24
|
+
transfer: 'UNTESTED',
|
|
23
25
|
zoe: 'tested in @agoric/zoe',
|
|
24
26
|
};
|
|
25
27
|
|
|
@@ -128,8 +130,10 @@ export const restartVats = async ({ consume }, { options }) => {
|
|
|
128
130
|
console.log('upgrading vat', name);
|
|
129
131
|
const { vatAdminSvc } = consume;
|
|
130
132
|
const info = await consume.vatUpgradeInfo;
|
|
131
|
-
const { bundleID } = info.get(name);
|
|
132
|
-
const bcap = await
|
|
133
|
+
const { bundleID, bundleName } = info.get(name);
|
|
134
|
+
const bcap = await (bundleID
|
|
135
|
+
? E(vatAdminSvc).getBundleCap(bundleID)
|
|
136
|
+
: E(vatAdminSvc).getNamedBundleCap(bundleName));
|
|
133
137
|
await E(adminNode).upgrade(bcap);
|
|
134
138
|
}
|
|
135
139
|
console.log('VAT', name, status);
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export function setupTransferMiddleware({ consume: { loadCriticalVat, bridgeManager: bridgeManagerP, vtransferBridgeManager: vtransferBridgeManagerP, }, produce: { transferMiddleware: produceTransferMiddleware, transferVat: produceTransferVat, vtransferBridgeManager: produceVtransferBridgeManager, }, }: BootstrapPowers & {
|
|
2
|
+
consume: {
|
|
3
|
+
loadCriticalVat: VatLoader<any>;
|
|
4
|
+
bridgeManager: import("../types").BridgeManager;
|
|
5
|
+
vtransferBridgeManager: import("../types").ScopedBridgeManager<"vtransfer">;
|
|
6
|
+
};
|
|
7
|
+
produce: {
|
|
8
|
+
transferMiddleware: Producer<any>;
|
|
9
|
+
transferVat: Producer<any>;
|
|
10
|
+
vtransferBridgeManager: Producer<any>;
|
|
11
|
+
};
|
|
12
|
+
}, options: {
|
|
13
|
+
options: {
|
|
14
|
+
transferRef: VatSourceRef;
|
|
15
|
+
};
|
|
16
|
+
}): Promise<void>;
|
|
17
|
+
export function getManifestForTransfer(_powers: any, { transferRef }: {
|
|
18
|
+
transferRef: any;
|
|
19
|
+
}): {
|
|
20
|
+
manifest: {
|
|
21
|
+
[x: string]: {
|
|
22
|
+
consume: {
|
|
23
|
+
loadCriticalVat: boolean;
|
|
24
|
+
bridgeManager: string;
|
|
25
|
+
vtransferBridgeManager: string;
|
|
26
|
+
};
|
|
27
|
+
produce: {
|
|
28
|
+
transferMiddleware: string;
|
|
29
|
+
transferVat: string;
|
|
30
|
+
vtransferBridgeManager: string;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
options: {
|
|
35
|
+
transferRef: any;
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
export type TransferVats = {
|
|
39
|
+
transfer: ERef<import("../vat-transfer.js").TransferVat>;
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=transfer-proposal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer-proposal.d.ts","sourceRoot":"","sources":["transfer-proposal.js"],"names":[],"mappings":"AAwBO,iTAnBI,eAAe,GAAG;IAC5B,OAAW,EAAE;QACb,eAAqB,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;QACtC,aAAmB,EAAE,OAAO,UAAU,EAAE,aAAa,CAAC;QACtD,sBAA4B,EAAE,OAAO,UAAU,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC;KAC7E,CAAC;IACN,OAAW,EAAE;QACb,kBAAwB,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;QACxC,WAAiB,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;QACjC,sBAA4B,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;KACvC,CAAC;CACH;IAE8C,OAAO,EAA9C;QAAE,WAAW,EAAE,YAAY,CAAA;KAAE;kBAiFvC;AAEM;;;;;;;;;;;;;;;;;;;;EAkBL;2BAnGW;IACZ,QAAY,EAAE,IAAI,CAAC,OAAO,oBAAoB,EAAE,WAAW,CAAC,CAAC;CAC1D"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { E } from '@endo/far';
|
|
3
|
+
import { BridgeId as BRIDGE_ID, VTRANSFER_IBC_EVENT } from '@agoric/internal';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @param {BootstrapPowers & {
|
|
7
|
+
* consume: {
|
|
8
|
+
* loadCriticalVat: VatLoader<any>;
|
|
9
|
+
* bridgeManager: import('../types').BridgeManager;
|
|
10
|
+
* vtransferBridgeManager: import('../types').ScopedBridgeManager<'vtransfer'>;
|
|
11
|
+
* };
|
|
12
|
+
* produce: {
|
|
13
|
+
* transferMiddleware: Producer<any>;
|
|
14
|
+
* transferVat: Producer<any>;
|
|
15
|
+
* vtransferBridgeManager: Producer<any>;
|
|
16
|
+
* };
|
|
17
|
+
* }} powers
|
|
18
|
+
* @param {object} options
|
|
19
|
+
* @param {{ transferRef: VatSourceRef }} options.options
|
|
20
|
+
*
|
|
21
|
+
* @typedef {{
|
|
22
|
+
* transfer: ERef<import('../vat-transfer.js').TransferVat>;
|
|
23
|
+
* }} TransferVats
|
|
24
|
+
*/
|
|
25
|
+
export const setupTransferMiddleware = async (
|
|
26
|
+
{
|
|
27
|
+
consume: {
|
|
28
|
+
loadCriticalVat,
|
|
29
|
+
bridgeManager: bridgeManagerP,
|
|
30
|
+
vtransferBridgeManager: vtransferBridgeManagerP,
|
|
31
|
+
},
|
|
32
|
+
produce: {
|
|
33
|
+
transferMiddleware: produceTransferMiddleware,
|
|
34
|
+
transferVat: produceTransferVat,
|
|
35
|
+
vtransferBridgeManager: produceVtransferBridgeManager,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
options,
|
|
39
|
+
) => {
|
|
40
|
+
const bridgeManager = await bridgeManagerP;
|
|
41
|
+
if (!bridgeManager) {
|
|
42
|
+
console.error('No bridgeManager, skipping setupTransferMiddleware');
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const { transferRef } = options.options;
|
|
47
|
+
/** @type {TransferVats} */
|
|
48
|
+
const vats = {
|
|
49
|
+
transfer: E(loadCriticalVat)('transfer', transferRef),
|
|
50
|
+
};
|
|
51
|
+
// don't proceed if loadCriticalVat fails
|
|
52
|
+
await Promise.all(Object.values(vats));
|
|
53
|
+
produceTransferVat.reset();
|
|
54
|
+
produceTransferVat.resolve(vats.transfer);
|
|
55
|
+
|
|
56
|
+
// We'll be exporting a TransferMiddleware instance that implements a
|
|
57
|
+
// vtransfer app registry supporting active and passive "taps" while handling
|
|
58
|
+
// IBC transfer protocol conformance by configuring its backing
|
|
59
|
+
// BridgeTargetKit registry to wrap each app with an interceptor.
|
|
60
|
+
// But a bridge channel scoped to vtransfer might already exist, so we make or
|
|
61
|
+
// retrieve it as appropriate, then make its intercepting BridgeTargetKit,
|
|
62
|
+
// and then finally configure the TransferMiddleware with that kit's registry.
|
|
63
|
+
const { finisher, interceptorFactory, transferMiddleware } = await E(
|
|
64
|
+
vats.transfer,
|
|
65
|
+
).makeTransferMiddlewareKit();
|
|
66
|
+
const vtransferID = BRIDGE_ID.VTRANSFER;
|
|
67
|
+
const provideBridgeTargetKit = bridge =>
|
|
68
|
+
E(vats.transfer).provideBridgeTargetKit(
|
|
69
|
+
bridge,
|
|
70
|
+
VTRANSFER_IBC_EVENT,
|
|
71
|
+
interceptorFactory,
|
|
72
|
+
);
|
|
73
|
+
/** @type {Awaited<ReturnType<typeof provideBridgeTargetKit>>} */
|
|
74
|
+
let bridgeTargetKit;
|
|
75
|
+
try {
|
|
76
|
+
const vtransferBridge = await E(bridgeManager).register(vtransferID);
|
|
77
|
+
produceVtransferBridgeManager.reset();
|
|
78
|
+
produceVtransferBridgeManager.resolve(vtransferBridge);
|
|
79
|
+
bridgeTargetKit = await provideBridgeTargetKit(vtransferBridge);
|
|
80
|
+
await E(finisher).useRegistry(bridgeTargetKit.targetRegistry);
|
|
81
|
+
await E(vtransferBridge).initHandler(bridgeTargetKit.bridgeHandler);
|
|
82
|
+
console.info('Successfully initHandler for', vtransferID);
|
|
83
|
+
} catch (e) {
|
|
84
|
+
console.error(
|
|
85
|
+
'Failed to initHandler',
|
|
86
|
+
vtransferID,
|
|
87
|
+
'reason:',
|
|
88
|
+
e,
|
|
89
|
+
'falling back to setHandler',
|
|
90
|
+
);
|
|
91
|
+
const vtransferBridge = await vtransferBridgeManagerP;
|
|
92
|
+
bridgeTargetKit = await provideBridgeTargetKit(vtransferBridge);
|
|
93
|
+
await E(finisher).useRegistry(bridgeTargetKit.targetRegistry);
|
|
94
|
+
await E(vtransferBridge).setHandler(bridgeTargetKit.bridgeHandler);
|
|
95
|
+
console.info('Successfully setHandler for', vtransferID);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
produceTransferMiddleware.reset();
|
|
99
|
+
produceTransferMiddleware.resolve(transferMiddleware);
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
export const getManifestForTransfer = (_powers, { transferRef }) => ({
|
|
103
|
+
manifest: {
|
|
104
|
+
[setupTransferMiddleware.name]: {
|
|
105
|
+
consume: {
|
|
106
|
+
loadCriticalVat: true,
|
|
107
|
+
bridgeManager: 'bridge',
|
|
108
|
+
vtransferBridgeManager: 'transfer',
|
|
109
|
+
},
|
|
110
|
+
produce: {
|
|
111
|
+
transferMiddleware: 'transfer',
|
|
112
|
+
transferVat: 'transfer',
|
|
113
|
+
vtransferBridgeManager: 'transfer',
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
options: {
|
|
118
|
+
transferRef,
|
|
119
|
+
},
|
|
120
|
+
});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export function echoVtransfer({ consume: { transferMiddleware } }: BootstrapPowers & {
|
|
2
|
+
consume: {
|
|
3
|
+
transferMiddleware: import("../transfer.js").TransferMiddleware;
|
|
4
|
+
};
|
|
5
|
+
}, { options: { target } }: {
|
|
6
|
+
options: {
|
|
7
|
+
target: string;
|
|
8
|
+
};
|
|
9
|
+
}): Promise<void>;
|
|
10
|
+
export function getManifestForVtransferEchoer(_powers: any, { target }: {
|
|
11
|
+
target: any;
|
|
12
|
+
}): {
|
|
13
|
+
manifest: {
|
|
14
|
+
[x: string]: {
|
|
15
|
+
consume: {
|
|
16
|
+
transferMiddleware: string;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
options: {
|
|
21
|
+
target: any;
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=vtransfer-echoer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vtransfer-echoer.d.ts","sourceRoot":"","sources":["vtransfer-echoer.js"],"names":[],"mappings":"AAaO,mEARI,eAAe,GAAG;IAC5B,OAAW,EAAE;QACb,kBAAwB,EAAE,OAAO,gBAAgB,EAAE,kBAAkB,CAAC;KACjE,CAAC;CACH;IAEmC,OAAO,EAAnC;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE;kBAiB5B;AAEM;;;;;;;;;;;;;EAWL"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { makeExo } from '@agoric/store';
|
|
3
|
+
import { E } from '@endo/far';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @param {BootstrapPowers & {
|
|
7
|
+
* consume: {
|
|
8
|
+
* transferMiddleware: import('../transfer.js').TransferMiddleware;
|
|
9
|
+
* };
|
|
10
|
+
* }} powers
|
|
11
|
+
* @param {object} options
|
|
12
|
+
* @param {{ target: string }} options.options
|
|
13
|
+
*/
|
|
14
|
+
export const echoVtransfer = async (
|
|
15
|
+
{ consume: { transferMiddleware } },
|
|
16
|
+
{ options: { target } },
|
|
17
|
+
) => {
|
|
18
|
+
console.warn(`=== vtransfer echoer targeting ${target}`);
|
|
19
|
+
|
|
20
|
+
// a tap that simply returns what it received
|
|
21
|
+
const tap = makeExo('echoer', undefined, {
|
|
22
|
+
// ack value must be stringlike
|
|
23
|
+
receiveUpcall: async param => JSON.stringify(param),
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
await E(transferMiddleware).registerActiveTap(target, tap);
|
|
27
|
+
|
|
28
|
+
console.warn('=== vtransfer echoer registered');
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export const getManifestForVtransferEchoer = (_powers, { target }) => ({
|
|
32
|
+
manifest: {
|
|
33
|
+
[echoVtransfer.name]: {
|
|
34
|
+
consume: {
|
|
35
|
+
transferMiddleware: 'transferMiddleware',
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
options: {
|
|
40
|
+
target,
|
|
41
|
+
},
|
|
42
|
+
});
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
export function prepareTransferTools(zone: import("@agoric/base-zone").Zone, vowTools: import("@agoric/vow").VowTools): {
|
|
2
|
+
makeTransferMiddlewareKit: () => import("@endo/exo").GuardedKit<{
|
|
3
|
+
finisher: {
|
|
4
|
+
/**
|
|
5
|
+
* @param {import('./bridge-target').TargetRegistry} registry
|
|
6
|
+
*/
|
|
7
|
+
useRegistry(registry: import("./bridge-target").TargetRegistry): void;
|
|
8
|
+
};
|
|
9
|
+
interceptorFactory: {
|
|
10
|
+
wrapApp: (tap: globalThis.ERef<TargetApp>, targetHost: globalThis.ERef<TargetHost>, isActiveTap?: boolean | undefined) => import("@endo/exo").Guarded<{
|
|
11
|
+
receiveUpcall(obj: any): Promise<import("@agoric/vow").Vow<unknown> | undefined>;
|
|
12
|
+
}>;
|
|
13
|
+
};
|
|
14
|
+
transferMiddleware: {
|
|
15
|
+
/**
|
|
16
|
+
* Register a tap to intercept the vtransfer target account address
|
|
17
|
+
* messages, without granting that tap the ability to delay or interfere
|
|
18
|
+
* with the underlying IBC transfer protocol.
|
|
19
|
+
*
|
|
20
|
+
* @type {RegisterTap}
|
|
21
|
+
*/
|
|
22
|
+
registerTap(target: string, tap: ERef<import("./bridge-target.js").TargetApp>): any;
|
|
23
|
+
/**
|
|
24
|
+
* Similar to `registerTap`, but allows the tap to inject async
|
|
25
|
+
* acknowledgements in the IBC transfer protocol.
|
|
26
|
+
*
|
|
27
|
+
* @type {RegisterTap}
|
|
28
|
+
*/
|
|
29
|
+
registerActiveTap(target: string, tap: ERef<import("./bridge-target.js").TargetApp>): any;
|
|
30
|
+
/**
|
|
31
|
+
* Unregister the target.
|
|
32
|
+
*
|
|
33
|
+
* @param {string} target String identifying the bridge target to stop
|
|
34
|
+
* tapping.
|
|
35
|
+
*/
|
|
36
|
+
unregisterTap(target: string): Promise<void>;
|
|
37
|
+
};
|
|
38
|
+
}>;
|
|
39
|
+
makeBridgeTargetKit: (manager: import("./types.js").ScopedBridgeManager<import("@agoric/internal").BridgeIdValue>, inboundEventType: string, appTransformer?: import("./bridge-target.js").AppTransformer | undefined) => import("@endo/exo").GuardedKit<{
|
|
40
|
+
bridgeHandler: {
|
|
41
|
+
fromBridge(obj: any): Promise<any>;
|
|
42
|
+
};
|
|
43
|
+
targetHost: {
|
|
44
|
+
sendDowncall(obj: any): Promise<any>;
|
|
45
|
+
};
|
|
46
|
+
targetRegistry: {
|
|
47
|
+
register(target: string, app: TargetApp, args?: unknown[] | undefined): Promise<import("./bridge-target.js").TargetRegistration>;
|
|
48
|
+
reregister(target: string, app: TargetApp, args?: unknown[] | undefined): Promise<void>;
|
|
49
|
+
unregister(target: string): Promise<void>;
|
|
50
|
+
};
|
|
51
|
+
}>;
|
|
52
|
+
};
|
|
53
|
+
export type RegisterTap = (target: string, tap: ERef<import("./bridge-target.js").TargetApp>) => any;
|
|
54
|
+
export type TransferMiddlewareKit = ReturnType<ReturnType<typeof prepareTransferMiddlewareKit>>;
|
|
55
|
+
export type TransferMiddleware = TransferMiddlewareKit["transferMiddleware"];
|
|
56
|
+
import type { TargetApp } from './bridge-target.js';
|
|
57
|
+
import type { TargetHost } from './bridge-target.js';
|
|
58
|
+
/**
|
|
59
|
+
* @callback RegisterTap
|
|
60
|
+
* @param {string} target String identifying the bridge target.
|
|
61
|
+
* @param {ERef<import('./bridge-target.js').TargetApp>} tap The "application
|
|
62
|
+
* tap" to register for the target.
|
|
63
|
+
*/
|
|
64
|
+
/**
|
|
65
|
+
* A TransferMiddlewareKit has a `transferMiddleware` facet with methods for
|
|
66
|
+
* registering and unregistering active and passive "taps" in a BridgeTargetKit
|
|
67
|
+
* registry that must use the `interceptorFactory` facet as its appTransfomer to
|
|
68
|
+
* enforce IBC transfer protocol conformance. Before registering any taps, the
|
|
69
|
+
* backing BridgeTargetKit must be set with the `finisher` facet (i.e., the
|
|
70
|
+
* expected setup pattern is to pass in `interceptorFactory` as the
|
|
71
|
+
* appTransformer argument when making a BridgeTargetKit and then to invoke
|
|
72
|
+
* `finisher.useRegistry` with the `targetRegistry` of that BridgeTargetKit
|
|
73
|
+
* before making further use of the TransferMiddlewareKit or connecting the
|
|
74
|
+
* BridgeTargetKit to a bridge).
|
|
75
|
+
*
|
|
76
|
+
* @param {import('@agoric/base-zone').Zone} zone
|
|
77
|
+
* @param {ReturnType<typeof prepareTransferInterceptor>} makeTransferInterceptor
|
|
78
|
+
*/
|
|
79
|
+
declare function prepareTransferMiddlewareKit(zone: import("@agoric/base-zone").Zone, makeTransferInterceptor: ReturnType<typeof prepareTransferInterceptor>): () => import("@endo/exo").GuardedKit<{
|
|
80
|
+
finisher: {
|
|
81
|
+
/**
|
|
82
|
+
* @param {import('./bridge-target').TargetRegistry} registry
|
|
83
|
+
*/
|
|
84
|
+
useRegistry(registry: import("./bridge-target").TargetRegistry): void;
|
|
85
|
+
};
|
|
86
|
+
interceptorFactory: {
|
|
87
|
+
wrapApp: (tap: globalThis.ERef<TargetApp>, targetHost: globalThis.ERef<TargetHost>, isActiveTap?: boolean | undefined) => import("@endo/exo").Guarded<{
|
|
88
|
+
receiveUpcall(obj: any): Promise<import("@agoric/vow").Vow<unknown> | undefined>;
|
|
89
|
+
}>;
|
|
90
|
+
};
|
|
91
|
+
transferMiddleware: {
|
|
92
|
+
/**
|
|
93
|
+
* Register a tap to intercept the vtransfer target account address
|
|
94
|
+
* messages, without granting that tap the ability to delay or interfere
|
|
95
|
+
* with the underlying IBC transfer protocol.
|
|
96
|
+
*
|
|
97
|
+
* @type {RegisterTap}
|
|
98
|
+
*/
|
|
99
|
+
registerTap(target: string, tap: ERef<import("./bridge-target.js").TargetApp>): any;
|
|
100
|
+
/**
|
|
101
|
+
* Similar to `registerTap`, but allows the tap to inject async
|
|
102
|
+
* acknowledgements in the IBC transfer protocol.
|
|
103
|
+
*
|
|
104
|
+
* @type {RegisterTap}
|
|
105
|
+
*/
|
|
106
|
+
registerActiveTap(target: string, tap: ERef<import("./bridge-target.js").TargetApp>): any;
|
|
107
|
+
/**
|
|
108
|
+
* Unregister the target.
|
|
109
|
+
*
|
|
110
|
+
* @param {string} target String identifying the bridge target to stop
|
|
111
|
+
* tapping.
|
|
112
|
+
*/
|
|
113
|
+
unregisterTap(target: string): Promise<void>;
|
|
114
|
+
};
|
|
115
|
+
}>;
|
|
116
|
+
/**
|
|
117
|
+
* @param {import('@agoric/base-zone').Zone} zone
|
|
118
|
+
* @param {import('@agoric/vow').VowTools} vowTools
|
|
119
|
+
*/
|
|
120
|
+
declare function prepareTransferInterceptor(zone: import("@agoric/base-zone").Zone, vowTools: import("@agoric/vow").VowTools): (tap: globalThis.ERef<TargetApp>, targetHost: globalThis.ERef<TargetHost>, isActiveTap?: boolean | undefined) => import("@endo/exo").Guarded<{
|
|
121
|
+
receiveUpcall(obj: any): Promise<import("@agoric/vow").Vow<unknown> | undefined>;
|
|
122
|
+
}>;
|
|
123
|
+
export {};
|
|
124
|
+
//# sourceMappingURL=transfer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["transfer.js"],"names":[],"mappings":"AAiQO,2CAHI,OAAO,mBAAmB,EAAE,IAAI,YAChC,OAAO,aAAa,EAAE,QAAQ;;;YArDjC;;eAEG;kCADQ,OAAO,iBAAiB,EAAE,cAAc;;;;;;;;YAUnD;;;;;;eAMG;gCAnDA,MAAM,OACN,IAAI,CAAC,OAAO,oBAAoB,EAAE,SAAS,CAAC;YAwD/C;;;;;eAKG;sCA9DA,MAAM,OACN,IAAI,CAAC,OAAO,oBAAoB,EAAE,SAAS,CAAC;YAmE/C;;;;;eAKG;kCAFQ,MAAM;;;;;;;;;;;0CAvBqB,SAC7C;4CAwCyB,SAAS;;;;EAYlC;mCArGU,MAAM,OACN,IAAI,CAAC,OAAO,oBAAoB,EAAE,SAAS,CAAC;oCAiFzC,UAAU,CAAC,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC;iCAC3D,qBAAqB,CAAC,oBAAoB,CAAC;+BA/OjB,oBAAoB;gCAApB,oBAAoB;AA0J5D;;;;;GAKG;AAEH;;;;;;;;;;;;;;GAcG;AACH,oDAHW,OAAO,mBAAmB,EAAE,IAAI,2BAChC,UAAU,CAAC,OAAO,0BAA0B,CAAC;;QAgBhD;;WAEG;8BADQ,OAAO,iBAAiB,EAAE,cAAc;;;;;;;;QAUnD;;;;;;WAMG;4BAnDA,MAAM,OACN,IAAI,CAAC,OAAO,oBAAoB,EAAE,SAAS,CAAC;QAwD/C;;;;;WAKG;kCA9DA,MAAM,OACN,IAAI,CAAC,OAAO,oBAAoB,EAAE,SAAS,CAAC;QAmE/C;;;;;WAKG;8BAFQ,MAAM;;GAUtB;AAlOH;;;GAGG;AACH,kDAHW,OAAO,mBAAmB,EAAE,IAAI,YAChC,OAAO,aAAa,EAAE,QAAQ;;GAuHxC"}
|