@agoric/orchestration 0.1.1-dev-6d71e87.0 → 0.1.1-dev-b9091ce.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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agoric/orchestration",
3
- "version": "0.1.1-dev-6d71e87.0+6d71e87",
3
+ "version": "0.1.1-dev-b9091ce.0+b9091ce",
4
4
  "description": "Chain abstraction for Agoric's orchestration clients",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -33,19 +33,19 @@
33
33
  },
34
34
  "homepage": "https://github.com/Agoric/agoric-sdk#readme",
35
35
  "dependencies": {
36
- "@agoric/async-flow": "0.1.1-dev-6d71e87.0+6d71e87",
37
- "@agoric/cosmic-proto": "0.4.1-dev-6d71e87.0+6d71e87",
38
- "@agoric/ertp": "0.16.3-dev-6d71e87.0+6d71e87",
39
- "@agoric/internal": "0.3.3-dev-6d71e87.0+6d71e87",
40
- "@agoric/network": "0.1.1-dev-6d71e87.0+6d71e87",
41
- "@agoric/notifier": "0.6.3-dev-6d71e87.0+6d71e87",
42
- "@agoric/store": "0.9.3-dev-6d71e87.0+6d71e87",
43
- "@agoric/time": "0.3.3-dev-6d71e87.0+6d71e87",
44
- "@agoric/vat-data": "0.5.3-dev-6d71e87.0+6d71e87",
45
- "@agoric/vats": "0.15.2-dev-6d71e87.0+6d71e87",
46
- "@agoric/vow": "0.1.1-dev-6d71e87.0+6d71e87",
47
- "@agoric/zoe": "0.26.3-dev-6d71e87.0+6d71e87",
48
- "@agoric/zone": "0.2.3-dev-6d71e87.0+6d71e87",
36
+ "@agoric/async-flow": "0.1.1-dev-b9091ce.0+b9091ce",
37
+ "@agoric/cosmic-proto": "0.4.1-dev-b9091ce.0+b9091ce",
38
+ "@agoric/ertp": "0.16.3-dev-b9091ce.0+b9091ce",
39
+ "@agoric/internal": "0.3.3-dev-b9091ce.0+b9091ce",
40
+ "@agoric/network": "0.1.1-dev-b9091ce.0+b9091ce",
41
+ "@agoric/notifier": "0.6.3-dev-b9091ce.0+b9091ce",
42
+ "@agoric/store": "0.9.3-dev-b9091ce.0+b9091ce",
43
+ "@agoric/time": "0.3.3-dev-b9091ce.0+b9091ce",
44
+ "@agoric/vat-data": "0.5.3-dev-b9091ce.0+b9091ce",
45
+ "@agoric/vats": "0.15.2-dev-b9091ce.0+b9091ce",
46
+ "@agoric/vow": "0.1.1-dev-b9091ce.0+b9091ce",
47
+ "@agoric/zoe": "0.26.3-dev-b9091ce.0+b9091ce",
48
+ "@agoric/zone": "0.2.3-dev-b9091ce.0+b9091ce",
49
49
  "@cosmjs/encoding": "^0.32.4",
50
50
  "@endo/base64": "^1.0.9",
51
51
  "@endo/errors": "^1.2.10",
@@ -56,7 +56,7 @@
56
56
  "bs58": "^6.0.0"
57
57
  },
58
58
  "devDependencies": {
59
- "@agoric/swingset-liveslots": "0.10.3-dev-6d71e87.0+6d71e87",
59
+ "@agoric/swingset-liveslots": "0.10.3-dev-b9091ce.0+b9091ce",
60
60
  "@chain-registry/client": "^1.47.4",
61
61
  "@cosmjs/amino": "^0.33.0",
62
62
  "@cosmjs/proto-signing": "^0.33.0",
@@ -99,5 +99,5 @@
99
99
  "typeCoverage": {
100
100
  "atLeast": 97.7
101
101
  },
102
- "gitHead": "6d71e877bc133484d89e4e44ec534d5283a30eb3"
102
+ "gitHead": "b9091ce4718c00fc3981445b2d76afb1c0134540"
103
103
  }
@@ -8,7 +8,13 @@ export function prepareIBCTransferSender(zone: import("@agoric/base-zone").Zone,
8
8
  '@type': "/ibc.applications.transfer.v1.MsgTransfer";
9
9
  }) => import("@endo/exo").GuardedKit<{
10
10
  public: {
11
- sendPacket(match: any, opts: any): Vow<{
11
+ /**
12
+ * @param {Vow<
13
+ * IBCEvent<'acknowledgementPacket'> | IBCEvent<'timeoutPacket'>
14
+ * >} match
15
+ * @param {PacketOptions} opts
16
+ */
17
+ sendPacket(match: Vow<IBCEvent<"acknowledgementPacket"> | IBCEvent<"timeoutPacket">>, opts: PacketOptions): Vow<{
12
18
  eventPattern: import("@endo/patterns").Matcher;
13
19
  resultV: Vow<void>;
14
20
  }>;
@@ -24,9 +30,17 @@ export function prepareIBCTransferSender(zone: import("@agoric/base-zone").Zone,
24
30
  * >
25
31
  * >,
26
32
  * ]} response
27
- * @param {Record<string, any>} ctx
33
+ * @param {{
34
+ * opts: PacketOptions;
35
+ * match: Vow<
36
+ * IBCEvent<'acknowledgementPacket'> | IBCEvent<'timeoutPacket'>
37
+ * >;
38
+ * }} ctx
28
39
  */
29
- onFulfilled([{ sequence }]: [JsonSafe<ResponseTo<TypedJson<"/ibc.applications.transfer.v1.MsgTransfer">>>], ctx: Record<string, any>): {
40
+ onFulfilled([{ sequence }]: [JsonSafe<ResponseTo<TypedJson<"/ibc.applications.transfer.v1.MsgTransfer">>>], ctx: {
41
+ opts: PacketOptions;
42
+ match: Vow<IBCEvent<"acknowledgementPacket"> | IBCEvent<"timeoutPacket">>;
43
+ }): {
30
44
  eventPattern: import("@endo/patterns").Matcher;
31
45
  resultV: Vow<void>;
32
46
  };
@@ -35,12 +49,18 @@ export function prepareIBCTransferSender(zone: import("@agoric/base-zone").Zone,
35
49
  onFulfilled(ackData: any): void;
36
50
  };
37
51
  }>>) => import("@endo/exo").Guarded<{
38
- sendPacket(match: any, opts: any): Vow<{
52
+ /**
53
+ * @param {Vow<
54
+ * IBCEvent<'acknowledgementPacket'> | IBCEvent<'timeoutPacket'>
55
+ * >} match
56
+ * @param {PacketOptions} opts
57
+ */
58
+ sendPacket(match: Vow<IBCEvent<"acknowledgementPacket"> | IBCEvent<"timeoutPacket">>, opts: PacketOptions): Vow<{
39
59
  eventPattern: import("@endo/patterns").Matcher;
40
60
  resultV: Vow<void>;
41
61
  }>;
42
62
  }>;
43
- export function prepareIBCReplyKit(zone: import("@agoric/base-zone").Zone, vowTools: VowTools): (replyPacketPattern: Pattern, matchV: Vow<any>, opts: PacketOptions) => {
63
+ export function prepareIBCReplyKit(zone: import("@agoric/base-zone").Zone, vowTools: VowTools): <E extends IBCEvent<"acknowledgementPacket"> | IBCEvent<"timeoutPacket"> = IBCEvent<"acknowledgementPacket"> | IBCEvent<"timeoutPacket">>(replyPacketPattern: Pattern, matchV: Vow<E>, opts: PacketOptions) => {
44
64
  eventPattern: import("@endo/patterns").Matcher;
45
65
  resultV: Vow<string>;
46
66
  };
@@ -50,12 +70,18 @@ export function prepareIBCTools(zone: import("@agoric/base-zone").Zone, vowTools
50
70
  }, transferMsg: import("@agoric/cosmic-proto/ibc/applications/transfer/v1/tx.js").MsgTransfer & {
51
71
  '@type': "/ibc.applications.transfer.v1.MsgTransfer";
52
72
  }) => import("@endo/exo").Guarded<{
53
- sendPacket(match: any, opts: any): Vow<{
73
+ /**
74
+ * @param {Vow<
75
+ * IBCEvent<'acknowledgementPacket'> | IBCEvent<'timeoutPacket'>
76
+ * >} match
77
+ * @param {PacketOptions} opts
78
+ */
79
+ sendPacket(match: Vow<IBCEvent<"acknowledgementPacket"> | IBCEvent<"timeoutPacket">>, opts: PacketOptions): Vow<{
54
80
  eventPattern: import("@endo/patterns").Matcher;
55
81
  resultV: Vow<void>;
56
82
  }>;
57
83
  }>;
58
- makeIBCReplyKit: (replyPacketPattern: Pattern, matchV: Vow<any>, opts: PacketOptions) => {
84
+ makeIBCReplyKit: <E extends IBCEvent<"acknowledgementPacket"> | IBCEvent<"timeoutPacket"> = IBCEvent<"acknowledgementPacket"> | IBCEvent<"timeoutPacket">>(replyPacketPattern: Pattern, matchV: Vow<E>, opts: PacketOptions) => {
59
85
  eventPattern: import("@endo/patterns").Matcher;
60
86
  resultV: Vow<string>;
61
87
  };
@@ -63,10 +89,11 @@ export function prepareIBCTools(zone: import("@agoric/base-zone").Zone, vowTools
63
89
  export type MakeIBCReplyKit = ReturnType<typeof prepareIBCReplyKit>;
64
90
  import type { Pattern } from '@endo/patterns';
65
91
  import type { VowTools } from '@agoric/vow';
92
+ import type { IBCEvent } from '@agoric/vats';
66
93
  import type { Vow } from '@agoric/vow';
94
+ import type { PacketOptions } from './packet-tools.js';
67
95
  import type { LocalChainAccount } from '@agoric/vats/src/localchain.js';
68
96
  import type { TypedJson } from '@agoric/cosmic-proto';
69
97
  import type { ResponseTo } from '@agoric/cosmic-proto';
70
98
  import type { JsonSafe } from '@agoric/cosmic-proto';
71
- import type { PacketOptions } from './packet-tools.js';
72
99
  //# sourceMappingURL=ibc-packet.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ibc-packet.d.ts","sourceRoot":"","sources":["ibc-packet.js"],"names":[],"mappings":"AAMA,4CAA6C,MAAM,CAAC;AAqB7C,gDAHI,GAAG,GACD,OAAO,CAgCnB;AAOM,+CAHI,OAAO,mBAAmB,EAAE,IAAI,8BAChC,QAAQ,GAAG;IAAE,eAAe,EAAE,eAAe,CAAA;CAAE,IA+FhD,GAAG,MAFA,UAAU;eA3EH,iBAAiB,CAAC,WAAW,CAAC;;;;;;;;;;;QAoB1C;;;;;;;;;;;WAWG;oCARQ,CACV,SACA,WACA,UAAkB,2CAA2C,CAAC,CACvD,CACF,CACF,OACO,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;;;;;;;;GA+CrB;;;;;GAChB;AAOM,yCAHI,OAAO,mBAAmB,EAAE,IAAI,YAChC,QAAQ,wBAyBN,OAAO,UACP,IAAI,GAAG,CAAC,QACR,aAAa;;;EAmBzB;AAQM,sCAHI,OAAO,mBAAmB,EAAE,IAAI,YAChC,QAAQ;;mBAvIC,iBAAiB,CAAC,WAAW,CAAC;;;;;;;;;0CA4GrC,OAAO,UACP,IAAI,GAAG,CAAC,QACR,aAAa;;;;EAkCzB;8BAba,UAAU,CAAC,OAAO,kBAAkB,CAAC;6BAxMpB,gBAAgB;8BAEf,aAAa;yBAAb,aAAa;uCACT,gCAAgC;+BAFlB,sBAAsB;gCAAtB,sBAAsB;8BAAtB,sBAAsB;mCAGxC,mBAAmB"}
1
+ {"version":3,"file":"ibc-packet.d.ts","sourceRoot":"","sources":["ibc-packet.js"],"names":[],"mappings":"AAMA,4CAA6C,MAAM,CAAC;AAsB7C,gDAHI,GAAG,GACD,OAAO,CAgCnB;AAOM,+CAHI,OAAO,mBAAmB,EAAE,IAAI,8BAChC,QAAQ,GAAG;IAAE,eAAe,EAAE,eAAe,CAAA;CAAE,IA0GhD,GAAG,MAFA,UAAU;eAtFH,iBAAiB,CAAC,WAAW,CAAC;;;;;QAU1C;;;;;WAKG;0BAJQ,IACV,SAAa,uBAAuB,CAAC,GAAG,SAAS,eAAe,CAAC,CAC9D,QACO,aAAa;;;;;;QAYxB;;;;;;;;;;;;;;;;WAgBG;oCAbQ,CACV,SACA,WACA,UAAkB,2CAA2C,CAAC,CACvD,CACF,CACF,OACO;YACN,IAAI,EAAE,aAAa,CAAC;YACpB,KAAK,EAAE,IACX,SAAe,uBAAuB,CAAC,GAAG,SAAS,eAAe,CAAC,CAC9D,CAAC;SACH;;;;;;;;GA+CK;IA9ET;;;;;OAKG;sBAJQ,IACV,SAAa,uBAAuB,CAAC,GAAG,SAAS,eAAe,CAAC,CAC9D,QACO,aAAa;;;;GA2E/B;AAaM,yCAHI,OAAO,mBAAmB,EAAE,IAAI,YAChC,QAAQ,IAqC6D,CAAC,SAAjE,SAAS,uBAAuB,CAAC,GAAG,SAAS,eAAe,CAAE,sFACjE,OAAO,UACP,IAAI,CAAC,CAAC,QACN,aAAa;;;EAmBzB;AAQM,sCAHI,OAAO,mBAAmB,EAAE,IAAI,YAChC,QAAQ;;mBArKC,iBAAiB,CAAC,WAAW,CAAC;;;;QAU1C;;;;;WAKG;0BAJQ,IACV,SAAa,uBAAuB,CAAC,GAAG,SAAS,eAAe,CAAC,CAC9D,QACO,aAAa;;;;;sBA2HgD,CAAC,SAAjE,SAAS,uBAAuB,CAAC,GAAG,SAAS,eAAe,CAAE,sFACjE,OAAO,UACP,IAAI,CAAC,CAAC,QACN,aAAa;;;;EAkCzB;8BAba,UAAU,CAAC,OAAO,kBAAkB,CAAC;6BAvOpB,gBAAgB;8BAEf,aAAa;8BACP,cAAc;yBADpB,aAAa;mCAGb,mBAAmB;uCADf,gCAAgC;+BAHlB,sBAAsB;gCAAtB,sBAAsB;8BAAtB,sBAAsB"}
@@ -1,4 +1,4 @@
1
- import { assertAllDefined, makeTracer } from '@agoric/internal';
1
+ import { makeTracer } from '@agoric/internal';
2
2
  import { base64ToBytes, Shape as NetworkShape } from '@agoric/network';
3
3
  import { M } from '@endo/patterns';
4
4
  import { E } from '@endo/far';
@@ -12,6 +12,7 @@ const trace = makeTracer('IBCP');
12
12
  * @import {Key, Pattern} from '@endo/patterns';
13
13
  * @import {JsonSafe, TypedJson, ResponseTo} from '@agoric/cosmic-proto';
14
14
  * @import {Vow, VowTools} from '@agoric/vow';
15
+ * @import {IBCEvent, IBCPacket} from '@agoric/vats';
15
16
  * @import {LocalChainAccount} from '@agoric/vats/src/localchain.js';
16
17
  * @import {PacketOptions} from './packet-tools.js';
17
18
  */
@@ -88,6 +89,12 @@ export const prepareIBCTransferSender = (zone, { watch, makeIBCReplyKit }) => {
88
89
  }),
89
90
  {
90
91
  public: {
92
+ /**
93
+ * @param {Vow<
94
+ * IBCEvent<'acknowledgementPacket'> | IBCEvent<'timeoutPacket'>
95
+ * >} match
96
+ * @param {PacketOptions} opts
97
+ */
91
98
  sendPacket(match, opts) {
92
99
  const { txExecutor, transferMsg } = this.state;
93
100
  return watch(
@@ -108,10 +115,15 @@ export const prepareIBCTransferSender = (zone, { watch, makeIBCReplyKit }) => {
108
115
  * >
109
116
  * >,
110
117
  * ]} response
111
- * @param {Record<string, any>} ctx
118
+ * @param {{
119
+ * opts: PacketOptions;
120
+ * match: Vow<
121
+ * IBCEvent<'acknowledgementPacket'> | IBCEvent<'timeoutPacket'>
122
+ * >;
123
+ * }} ctx
112
124
  */
113
125
  onFulfilled([{ sequence }], ctx) {
114
- const { match } = ctx;
126
+ const { match, opts } = ctx;
115
127
  const { transferMsg } = this.state;
116
128
 
117
129
  // sequence + sourceChannel uniquely identifies a transfer.
@@ -128,7 +140,7 @@ export const prepareIBCTransferSender = (zone, { watch, makeIBCReplyKit }) => {
128
140
  const { resultV: ackDataV, ...rest } = makeIBCReplyKit(
129
141
  replyPacketPattern,
130
142
  match,
131
- ctx,
143
+ { opName: 'transfer', ...opts },
132
144
  );
133
145
  const resultV = watch(ackDataV, this.facets.verifyTransferSuccess);
134
146
  return harden({ resultV, ...rest });
@@ -160,6 +172,12 @@ export const prepareIBCTransferSender = (zone, { watch, makeIBCReplyKit }) => {
160
172
  harden(prepareIBCTransferSender);
161
173
 
162
174
  /**
175
+ * `makeIBCReplyKit` creates a pattern for `acknowledgementPacket` and
176
+ * `timeoutPacket` {@link IBCEvent}s using the provided {@link IBCPacket}
177
+ * pattern.
178
+ *
179
+ * Returns a vow that settles when a match is found.
180
+ *
163
181
  * @param {import('@agoric/base-zone').Zone} zone
164
182
  * @param {VowTools} vowTools
165
183
  */
@@ -168,14 +186,26 @@ export const prepareIBCReplyKit = (zone, vowTools) => {
168
186
  const ibcWatcher = zone.exo(
169
187
  'ibcResultWatcher',
170
188
  M.interface('processIBCWatcher', {
171
- onFulfilled: M.call(M.record(), M.record()).returns(Vow$(M.string())),
189
+ onFulfilled: M.call(
190
+ M.splitRecord({ event: M.string() }, { acknowledgement: M.string() }),
191
+ M.splitRecord({}, { opName: M.string(), timeout: M.record() }),
192
+ ).returns(Vow$(M.string())),
172
193
  }),
173
194
  {
174
- onFulfilled({ event, acknowledgement }, { opName = 'unknown' }) {
175
- assertAllDefined({ event, acknowledgement });
195
+ /**
196
+ * @param {IBCEvent<'acknowledgementPacket'>
197
+ * | IBCEvent<'timeoutPacket'>} ibcEvent
198
+ * @param {PacketOptions} ctx
199
+ */
200
+ onFulfilled(ibcEvent, { opName = 'unknown' }) {
201
+ const { event } = ibcEvent;
176
202
  switch (event) {
177
- case 'acknowledgementPacket':
203
+ case 'acknowledgementPacket': {
204
+ const { acknowledgement } = ibcEvent;
205
+ acknowledgement ||
206
+ Fail`acknowledgementPacket missing 'acknowledgement'`;
178
207
  return base64ToBytes(acknowledgement);
208
+ }
179
209
  case 'timeoutPacket':
180
210
  throw Fail`${bare(opName)} operation received timeout packet`;
181
211
  default:
@@ -186,8 +216,9 @@ export const prepareIBCReplyKit = (zone, vowTools) => {
186
216
  );
187
217
 
188
218
  /**
219
+ * @template {IBCEvent<'acknowledgementPacket'> | IBCEvent<'timeoutPacket'>} [E=IBCEvent<'acknowledgementPacket'>| IBCEvent<'timeoutPacket'>]
189
220
  * @param {Pattern} replyPacketPattern
190
- * @param {Vow<any>} matchV
221
+ * @param {Vow<E>} matchV
191
222
  * @param {PacketOptions} opts
192
223
  */
193
224
  const makeIBCReplyKit = (replyPacketPattern, matchV, opts) => {
@@ -29,7 +29,7 @@ export type MatchEvent = (pattern: EVow<Pattern>) => Vow<{
29
29
  match: Vow<any>;
30
30
  }>;
31
31
  export type PacketSender = {
32
- sendPacket: (opts: PacketOptions) => Vow<{
32
+ sendPacket: (match: Vow<IBCEvent<"acknowledgementPacket"> | IBCEvent<"timeoutPacket">>, opts: PacketOptions) => Vow<{
33
33
  eventPattern: Pattern;
34
34
  resultV: Vow<any>;
35
35
  }>;
@@ -48,4 +48,5 @@ import type { EVow } from '@agoric/vow';
48
48
  import type { VowResolver } from '@agoric/vow';
49
49
  import type { Vow } from '@agoric/vow';
50
50
  import type { Remote } from '@agoric/vow';
51
+ import type { IBCEvent } from '@agoric/vats';
51
52
  //# sourceMappingURL=packet-tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"packet-tools.d.ts","sourceRoot":"","sources":["packet-tools.js"],"names":[],"mappings":"AA+DO,yCAHI,OAAO,mBAAmB,EAAE,IAAI,YAChC,QAAQ;;;;;;;;IAiFX;;OAEG;8BADQ,IAAI,CAAC,SAAS,CAAC;;;;8BAnHvB,KAAK,OAAO,CAAC,GACX,IAAI;QAAE,QAAQ,EAAE,YAAY,GAAG,CAAC,CAAC;QAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAA;KAAE,CAAC;IAsIzD;;;;OAIG;qCAHQ,OAAO,YAAY,CAAC,SACpB,aAAa,GACX,IAAI,GAAG,CAAC;GAyM5B;mCAnVU,KAAK,OAAO,CAAC,KACX,IAAI;IAAE,QAAQ,EAAE,YAAY,GAAG,CAAC,CAAC;IAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAA;CAAE,CAAC;;gBAKnD,CACT,IAAI,EAAE,aAAa,KAChB,IAAI;QAAE,YAAY,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,IAAI,GAAG,CAAC,CAAA;KAAE,CAAC;;;;;;4BAU5C,IAAI,CAChB,OAAW,eAAe,EAAE,qBAAqB,EACjD,eAAmB,GAAG,kBAAkB,CACrC;0BAkUS,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC;8BA/VZ,aAAa;6BAD9C,gBAAgB;+BAIM,mCAAmC;wCAAnC,mCAAmC;0BAHxB,aAAa;iCAAb,aAAa;yBAAb,aAAa;4BAAb,aAAa"}
1
+ {"version":3,"file":"packet-tools.d.ts","sourceRoot":"","sources":["packet-tools.js"],"names":[],"mappings":"AAgEO,yCAHI,OAAO,mBAAmB,EAAE,IAAI,YAChC,QAAQ;;;;;;;;IAiFX;;OAEG;8BADQ,IAAI,CAAC,SAAS,CAAC;;;;8BApHvB,KAAK,OAAO,CAAC,GACX,IAAI;QAAE,QAAQ,EAAE,YAAY,GAAG,CAAC,CAAC;QAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAA;KAAE,CAAC;IAuIzD;;;;OAIG;qCAHQ,OAAO,YAAY,CAAC,SACpB,aAAa,GACX,IAAI,GAAG,CAAC;GAqN5B;mCAhWU,KAAK,OAAO,CAAC,KACX,IAAI;IAAE,QAAQ,EAAE,YAAY,GAAG,CAAC,CAAC;IAAC,KAAK,EAAE,IAAI,GAAG,CAAC,CAAA;CAAE,CAAC;;gBAKnD,CACT,KAAK,EAAE,IAAI,SAAS,uBAAuB,CAAC,GAAG,SAAS,eAAe,CAAC,CAAC,EACzE,IAAI,EAAE,aAAa,KAChB,IAAI;QAAE,YAAY,EAAE,OAAO,CAAC;QAAC,OAAO,EAAE,IAAI,GAAG,CAAC,CAAA;KAAE,CAAC;;;;;;4BAU5C,IAAI,CAChB,OAAW,eAAe,EAAE,qBAAqB,EACjD,eAAmB,GAAG,kBAAkB,CACrC;0BA8US,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC;8BA5WZ,aAAa;6BAD9C,gBAAgB;+BAIM,mCAAmC;wCAAnC,mCAAmC;0BAHxB,aAAa;iCAAb,aAAa;yBAAb,aAAa;4BAAb,aAAa;8BAE1B,cAAc"}
@@ -20,7 +20,7 @@ const just = obj => {
20
20
  * @import {Pattern} from '@endo/patterns';
21
21
  * @import {EVow, Remote, Vow, VowResolver, VowTools} from '@agoric/vow';
22
22
  * @import {LocalChainAccount} from '@agoric/vats/src/localchain.js';
23
- * @import {VTransferIBCEvent} from '@agoric/vats';
23
+ * @import {IBCEvent, VTransferIBCEvent} from '@agoric/vats';
24
24
  * @import {TargetApp, TargetRegistration} from '@agoric/vats/src/bridge-target.js';
25
25
  */
26
26
 
@@ -33,6 +33,7 @@ const just = obj => {
33
33
  /**
34
34
  * @typedef {object} PacketSender
35
35
  * @property {(
36
+ * match: Vow<IBCEvent<'acknowledgementPacket'> | IBCEvent<'timeoutPacket'>>,
36
37
  * opts: PacketOptions,
37
38
  * ) => Vow<{ eventPattern: Pattern; resultV: Vow<any> }>} sendPacket
38
39
  */
@@ -241,6 +242,18 @@ export const preparePacketTools = (zone, vowTools) => {
241
242
  },
242
243
  },
243
244
  sendPacketWatcher: {
245
+ /**
246
+ * @param {[
247
+ * {
248
+ * resolver: VowResolver<any>;
249
+ * match: Vow<
250
+ * IBCEvent<'acknowledgementPacket'> | IBCEvent<'timeoutPacket'>
251
+ * >;
252
+ * },
253
+ * Remote<PacketSender>,
254
+ * ]} result
255
+ * @param {{ opts: PacketOptions }} ctx
256
+ */
244
257
  onFulfilled([{ match }, sender], ctx) {
245
258
  return watch(E(sender).sendPacket(match, ctx.opts));
246
259
  },
@@ -5,7 +5,7 @@ import { Any } from '@agoric/cosmic-proto/google/protobuf/any.js';
5
5
  import type { PacketSDKType } from '@agoric/cosmic-proto/ibc/core/channel/v1/channel.js';
6
6
  import { RequestQuery, ResponseQuery } from '@agoric/cosmic-proto/tendermint/abci/types.js';
7
7
  import type { IBCChannelID, IBCEvent, VTransferIBCEvent } from '@agoric/vats';
8
- import type { AccountId, CosmosChainAddress } from '../src/orchestration-api.js';
8
+ import type { CosmosChainAddress, Denom } from '../src/orchestration-api.js';
9
9
  interface EncoderCommon<T> {
10
10
  encode: (message: T) => {
11
11
  finish: () => Uint8Array;
@@ -62,18 +62,59 @@ export declare const parseOutgoingTxPacket: (b64: string) => TxBody;
62
62
  * @returns {string}
63
63
  */
64
64
  export declare function buildQueryPacketString(msgs: Any[], opts?: Partial<Omit<RequestQuery, 'path' | 'data'>>): string;
65
- type BuildVTransferEventParams = {
66
- event?: VTransferIBCEvent['event'];
67
- sender?: CosmosChainAddress['value'];
68
- receiver?: AccountId | CosmosChainAddress['value'];
69
- target?: CosmosChainAddress['value'];
65
+ /**
66
+ * Fields that are common to every vtransfer IBC event.
67
+ */
68
+ type BuildVTransferEventBaseParams = {
69
+ /**
70
+ * defaults to `cosmos1AccAddress` – set to `agoric1fakeLCAAddress` to
71
+ * simulate an outgoing transfer.
72
+ */
73
+ sender?: CosmosChainAddress['value'] | string;
74
+ /**
75
+ * defaults to `agoric1fakeLCAAddress` – set differently to simulate
76
+ * an outgoing transfer.
77
+ */
78
+ receiver?: CosmosChainAddress['value'] | string;
79
+ target?: CosmosChainAddress['value'] | string;
70
80
  amount?: bigint;
71
- denom?: string;
81
+ denom?: Denom;
72
82
  destinationChannel?: IBCChannelID;
73
83
  sourceChannel?: IBCChannelID;
84
+ /** supports `bigint` or `string` so tests can pass encoded numbers */
74
85
  sequence?: PacketSDKType['sequence'] | JsonSafe<PacketSDKType['sequence']>;
75
86
  memo?: string;
76
87
  };
88
+ /**
89
+ * Parameters allowed for the ACK-carrying events.
90
+ */
91
+ type VTransferAckParams = BuildVTransferEventBaseParams & {
92
+ event?: 'acknowledgementPacket' | 'writeAcknowledgement';
93
+ /**
94
+ * if present, helper encodes `{ error: acknowledgementError }`
95
+ * instead of the success result
96
+ */
97
+ acknowledgementError?: string;
98
+ /** override the default `"agoric123"` relayer address */
99
+ relayer?: string;
100
+ };
101
+ /**
102
+ * Parameters allowed for a timeout event (no ack/relayer).
103
+ */
104
+ type VTransferTimeoutParams = BuildVTransferEventBaseParams & {
105
+ event: 'timeoutPacket';
106
+ acknowledgementError?: never;
107
+ relayer?: never;
108
+ };
109
+ type VTransferParams = VTransferAckParams | VTransferTimeoutParams;
110
+ /** helper to turn param object into correct return */
111
+ type ExtractEvent<P> = P extends {
112
+ event: infer Ev;
113
+ } ? Ev extends undefined ? 'acknowledgementPacket' : Ev : 'acknowledgementPacket';
114
+ type BuildVTransferEventResult<P extends VTransferParams> = VTransferByEvent<ExtractEvent<P>>;
115
+ type VTransferByEvent<E extends VTransferIBCEvent['event']> = Extract<VTransferIBCEvent, {
116
+ event: E;
117
+ }>;
77
118
  /**
78
119
  * `buildVTransferEvent` can be used with `transferBridge` to simulate incoming
79
120
  * and outgoing IBC fungible tokens transfers to a LocalChain account.
@@ -96,10 +137,8 @@ type BuildVTransferEventParams = {
96
137
  *
97
138
  * XXX integrate vlocalchain and vtransfer ScopedBridgeManagers
98
139
  * in test supports.
99
- *
100
- * @param {{BuildVTransferEventParams}} args
101
140
  */
102
- export declare const buildVTransferEvent: ({ event, sender, receiver, target, amount, denom, destinationChannel, sourceChannel, sequence, memo, }?: BuildVTransferEventParams) => VTransferIBCEvent;
141
+ export declare function buildVTransferEvent<P extends VTransferParams>(params: P): BuildVTransferEventResult<P>;
103
142
  export declare function createMockAckMap(mockMap: Record<string, {
104
143
  msg: string;
105
144
  ack: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ibc-mocks.d.ts","sourceRoot":"","sources":["ibc-mocks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ibc-mocks.d.ts","sourceRoot":"","sources":["ibc-mocks.ts"],"names":[],"mappings":"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"}
@@ -21,10 +21,7 @@ import type {
21
21
  } from '@agoric/vats';
22
22
  import { LOCALCHAIN_DEFAULT_ADDRESS } from '@agoric/vats/tools/fake-bridge.js';
23
23
  import { atob, btoa, decodeBase64, encodeBase64 } from '@endo/base64';
24
- import type {
25
- AccountId,
26
- CosmosChainAddress,
27
- } from '../src/orchestration-api.js';
24
+ import type { CosmosChainAddress, Denom } from '../src/orchestration-api.js';
28
25
  import { makeQueryPacket, makeTxPacket } from '../src/utils/packet.js';
29
26
 
30
27
  interface EncoderCommon<T> {
@@ -155,22 +152,78 @@ export function buildQueryPacketString(
155
152
  return btoa(makeQueryPacket(msgs.map(msg => toRequestQueryJson(msg, opts))));
156
153
  }
157
154
 
158
- type BuildVTransferEventParams = {
159
- event?: VTransferIBCEvent['event'];
160
- /* defaults to cosmos1AccAddress. set to `agoric1fakeLCAAddress` to simulate an outgoing transfer event */
161
- sender?: CosmosChainAddress['value'];
162
- /* defaults to agoric1fakeLCAAddress. set to a different value to simulate an outgoing transfer event */
163
- receiver?: AccountId | CosmosChainAddress['value'];
164
- target?: CosmosChainAddress['value'];
155
+ /**
156
+ * Fields that are common to every vtransfer IBC event.
157
+ */
158
+ type BuildVTransferEventBaseParams = {
159
+ /**
160
+ * defaults to `cosmos1AccAddress` – set to `agoric1fakeLCAAddress` to
161
+ * simulate an outgoing transfer.
162
+ */
163
+ sender?: CosmosChainAddress['value'] | string;
164
+
165
+ /**
166
+ * defaults to `agoric1fakeLCAAddress` – set differently to simulate
167
+ * an outgoing transfer.
168
+ */
169
+ receiver?: CosmosChainAddress['value'] | string;
170
+
171
+ target?: CosmosChainAddress['value'] | string;
165
172
  amount?: bigint;
166
- denom?: string;
173
+ denom?: Denom;
167
174
  destinationChannel?: IBCChannelID;
168
175
  sourceChannel?: IBCChannelID;
169
- /* support bigint and string, to facilitate bootstrap testing */
176
+
177
+ /** supports `bigint` or `string` so tests can pass encoded numbers */
170
178
  sequence?: PacketSDKType['sequence'] | JsonSafe<PacketSDKType['sequence']>;
171
179
  memo?: string;
172
180
  };
173
181
 
182
+ /**
183
+ * Parameters allowed for the ACK-carrying events.
184
+ */
185
+ type VTransferAckParams = BuildVTransferEventBaseParams & {
186
+ event?: 'acknowledgementPacket' | 'writeAcknowledgement';
187
+ /**
188
+ * if present, helper encodes `{ error: acknowledgementError }`
189
+ * instead of the success result
190
+ */
191
+ acknowledgementError?: string;
192
+ /** override the default `"agoric123"` relayer address */
193
+ relayer?: string;
194
+ };
195
+
196
+ /**
197
+ * Parameters allowed for a timeout event (no ack/relayer).
198
+ */
199
+ type VTransferTimeoutParams = BuildVTransferEventBaseParams & {
200
+ event: 'timeoutPacket';
201
+ acknowledgementError?: never;
202
+ relayer?: never;
203
+ };
204
+
205
+ type VTransferParams = VTransferAckParams | VTransferTimeoutParams;
206
+
207
+ /** helper to turn param object into correct return */
208
+ type ExtractEvent<P> =
209
+ // event present?
210
+ P extends { event: infer Ev }
211
+ ? // undefined means “use default”
212
+ Ev extends undefined
213
+ ? 'acknowledgementPacket'
214
+ : Ev
215
+ : // no `event` entry, use default
216
+ 'acknowledgementPacket';
217
+
218
+ type BuildVTransferEventResult<P extends VTransferParams> = VTransferByEvent<
219
+ ExtractEvent<P>
220
+ >;
221
+
222
+ type VTransferByEvent<E extends VTransferIBCEvent['event']> = Extract<
223
+ VTransferIBCEvent,
224
+ { event: E }
225
+ >;
226
+
174
227
  /**
175
228
  * `buildVTransferEvent` can be used with `transferBridge` to simulate incoming
176
229
  * and outgoing IBC fungible tokens transfers to a LocalChain account.
@@ -193,47 +246,70 @@ type BuildVTransferEventParams = {
193
246
  *
194
247
  * XXX integrate vlocalchain and vtransfer ScopedBridgeManagers
195
248
  * in test supports.
196
- *
197
- * @param {{BuildVTransferEventParams}} args
198
249
  */
199
- export const buildVTransferEvent = ({
200
- event = 'acknowledgementPacket' as const,
201
- sender = 'cosmos1AccAddress',
202
- receiver = LOCALCHAIN_DEFAULT_ADDRESS,
203
- target = LOCALCHAIN_DEFAULT_ADDRESS,
204
- amount = 10n,
205
- denom = 'uatom',
206
- destinationChannel = 'channel-0' as IBCChannelID,
207
- sourceChannel = 'channel-405' as IBCChannelID,
208
- sequence = 0n,
209
- memo = '',
210
- }: BuildVTransferEventParams = {}): VTransferIBCEvent => ({
211
- type: VTRANSFER_IBC_EVENT,
212
- blockHeight: 0,
213
- blockTime: 0,
214
- event,
215
- acknowledgement: btoa(JSON.stringify({ result: 'AQ==' })),
216
- relayer: 'agoric123',
217
- target,
218
- packet: {
219
- data: btoa(
250
+ export function buildVTransferEvent<P extends VTransferParams>(
251
+ params: P,
252
+ ): BuildVTransferEventResult<P> {
253
+ const {
254
+ event = 'acknowledgementPacket',
255
+ sender = 'cosmos1AccAddress',
256
+ receiver = LOCALCHAIN_DEFAULT_ADDRESS,
257
+ target = LOCALCHAIN_DEFAULT_ADDRESS,
258
+ amount = 10n,
259
+ denom = 'uatom',
260
+ destinationChannel = 'channel-0',
261
+ sourceChannel = 'channel-405',
262
+ sequence = 0n,
263
+ memo = '',
264
+ relayer = 'agoric123',
265
+ acknowledgementError,
266
+ } = params satisfies VTransferParams;
267
+
268
+ const base = {
269
+ type: VTRANSFER_IBC_EVENT,
270
+ blockHeight: 0,
271
+ blockTime: 0,
272
+ event,
273
+ target,
274
+ packet: {
275
+ data: btoa(
276
+ JSON.stringify(
277
+ FungibleTokenPacketData.fromPartial({
278
+ amount: String(amount),
279
+ denom,
280
+ sender,
281
+ receiver,
282
+ memo,
283
+ }),
284
+ ),
285
+ ),
286
+ destination_channel: destinationChannel as IBCChannelID,
287
+ source_channel: sourceChannel as IBCChannelID,
288
+ destination_port: 'transfer',
289
+ source_port: 'transfer',
290
+ // @ts-expect-error – supports `bigint` or `string` so tests can pass encoded numbers
291
+ sequence,
292
+ } satisfies IBCPacket,
293
+ };
294
+
295
+ /** `timeoutPacket` */
296
+ if (event === 'timeoutPacket') {
297
+ return base as BuildVTransferEventResult<P>;
298
+ }
299
+
300
+ /** `acknowledgementPacket`, `writeAcknowledgement`*/
301
+ return {
302
+ ...base,
303
+ relayer,
304
+ acknowledgement: btoa(
220
305
  JSON.stringify(
221
- FungibleTokenPacketData.fromPartial({
222
- amount: String(amount),
223
- denom,
224
- sender,
225
- receiver,
226
- memo,
227
- }),
306
+ acknowledgementError
307
+ ? { error: acknowledgementError }
308
+ : { result: 'AQ==' },
228
309
  ),
229
310
  ),
230
- destination_channel: destinationChannel,
231
- source_channel: sourceChannel,
232
- destination_port: 'transfer',
233
- source_port: 'transfer',
234
- sequence,
235
- } as IBCPacket,
236
- });
311
+ } as BuildVTransferEventResult<P>;
312
+ }
237
313
 
238
314
  export function createMockAckMap(
239
315
  mockMap: Record<string, { msg: string; ack: string }>,