Repository: Agoric/agoric-sdk
Pull request #10480: convert fast-usdc contract to .ts
Author: login: turadg
Labels: name: automerge:rebase
description: Automatically rebase updates, then merge
Created: 2024-11-14T01:51:50Z | Merged: 2025-03-24T22:56:31Z

refs: #5760

## Description

Convert some `.js` files of the fast-usdc packages to `.ts`.

I'd like to migrate to `.ts` incrementally because this package is in active development and if I were to migrate the whole thing now there would be lots of merge conflicts.

### Security Considerations

As usual, readers must keep in mind that the types are advisory and be sure that adequate runtime validation is also in place.

### Scaling Considerations
none

### Documentation Considerations
Once this is working, we should convert the demo dapps to it to make them more accessible.

### Testing Considerations
CI should cover it.

### Upgrade Considerations
Should have no runtime impacts.


Diff:
diff --git a/packages/fast-usdc-contract/src/exos/advancer.js b/packages/fast-usdc-contract/src/exos/advancer.js
index 0411a58b72e..25716375160 100644
--- a/packages/fast-usdc-contract/src/exos/advancer.js
+++ b/packages/fast-usdc-contract/src/exos/advancer.js
@@ -27,7 +27,7 @@ import { makeFeeTools } from '@agoric/fast-usdc/src/utils/fees.js';
  * @import {VowTools} from '@agoric/vow';
  * @import {Zone} from '@agoric/zone';
  * @import {AddressHook, EvmHash, FeeConfig, LogFn, NobleAddress, EvidenceWithRisk} from '@agoric/fast-usdc/src/types.js';
- * @import {StatusManager} from './status-manager.js';
+ * @import {StatusManager} from './status-manager.ts';
  * @import {LiquidityPoolKit} from './liquidity-pool.js';
  */
 
diff --git a/packages/fast-usdc-contract/src/exos/operator-kit.js b/packages/fast-usdc-contract/src/exos/operator-kit.ts
similarity index 52%
rename from packages/fast-usdc-contract/src/exos/operator-kit.js
rename to packages/fast-usdc-contract/src/exos/operator-kit.ts
index b8c6dbdd31e..965df7ff312 100644
--- a/packages/fast-usdc-contract/src/exos/operator-kit.js
+++ b/packages/fast-usdc-contract/src/exos/operator-kit.ts
@@ -1,43 +1,45 @@
+import { OperatorKitI } from '@agoric/fast-usdc/src/operator-kit-interface.js';
 import { makeTracer } from '@agoric/internal';
+import type { Zone } from '@agoric/zone';
 import { Fail } from '@endo/errors';
-import { OperatorKitI } from '@agoric/fast-usdc/src/operator-kit-interface.js';
-
-const trace = makeTracer('TxOperator');
+import type {
+  CctpTxEvidence,
+  RiskAssessment,
+} from '@agoric/fast-usdc/src/types.js';
 
-/**
- * @import {Zone} from '@agoric/zone';
- * @import {CctpTxEvidence, RiskAssessment} from '@agoric/fast-usdc/src/types.js';
- */
+const trace: (...args: unknown[]) => void = makeTracer('TxOperator');
 
-/**
- * @typedef {object} OperatorPowers
- * @property {(evidence: CctpTxEvidence, riskAssessment: RiskAssessment, operatorId: string) => void} attest
- */
+interface OperatorPowers {
+  attest: (
+    evidence: CctpTxEvidence,
+    riskAssessment: RiskAssessment,
+    operatorId: string,
+  ) => void;
+}
 
-/**
- * @typedef {object} OperatorStatus
- * @property {boolean} [disabled]
- * @property {string} operatorId
- */
+interface OperatorStatus {
+  disabled?: boolean;
+  operatorId: string;
+}
 
-/**
- * @typedef {Readonly<{ operatorId: string, powers: OperatorPowers }> & {disabled: boolean}} State
- */
+interface State {
+  operatorId: string;
+  powers: OperatorPowers;
+  disabled: boolean;
+}
 
-/**
- * @param {Zone} zone
- * @param {{ makeInertInvitation: Function }} staticPowers
- */
-export const prepareOperatorKit = (zone, staticPowers) =>
+export const prepareOperatorKit = (
+  zone: Zone,
+  staticPowers: { makeInertInvitation: () => Promise<Invitation> },
+) =>
   zone.exoClassKit(
     'Operator Kit',
     OperatorKitI,
     /**
-     * @param {string} operatorId
-     * @param {OperatorPowers} powers facet of the durable transaction feed
-     * @returns {State}
+     * @param operatorId
+     * @param powers facet of the durable transaction feed
      */
-    (operatorId, powers) => {
+    (operatorId: string, powers: OperatorPowers): State => {
       return {
         operatorId,
         powers,
@@ -64,33 +66,34 @@ export const prepareOperatorKit = (zone, staticPowers) =>
          * place, rather than as a means of performing it as in the
          * fluxAggregator contract used for price oracles.
          *
-         * @param {CctpTxEvidence} evidence
-         * @param {RiskAssessment} [riskAssessment]
-         * @returns {Promise<Invitation>}
+         * @param evidence
+         * @param riskAssessment
          */
-        async SubmitEvidence(evidence, riskAssessment) {
+        async SubmitEvidence(
+          evidence: CctpTxEvidence,
+          riskAssessment: RiskAssessment,
+        ): Promise<Invitation> {
           const { operator } = this.facets;
           operator.submitEvidence(evidence, riskAssessment);
-          return staticPowers.makeInertInvitation(
-            'evidence was pushed in the invitation maker call',
-          );
+          return staticPowers.makeInertInvitation();
         },
       },
       operator: {
         /**
          * submit evidence from this operator
          *
-         * @param {CctpTxEvidence} evidence
-         * @param {RiskAssessment} [riskAssessment]
-         * @returns {void}
+         * @param evidence
+         * @param riskAssessment
          */
-        submitEvidence(evidence, riskAssessment = {}) {
+        submitEvidence(
+          evidence: CctpTxEvidence,
+          riskAssessment: RiskAssessment = {},
+        ): void {
           const { state } = this;
           !state.disabled || Fail`submitEvidence for disabled operator`;
           state.powers.attest(evidence, riskAssessment, state.operatorId);
         },
-        /** @returns {OperatorStatus} */
-        getStatus() {
+        getStatus(): OperatorStatus {
           const { state } = this;
           return {
             operatorId: state.operatorId,
@@ -101,4 +104,4 @@ export const prepareOperatorKit = (zone, staticPowers) =>
     },
   );
 
-/** @typedef {ReturnType<ReturnType<typeof prepareOperatorKit>>} OperatorKit */
+export type OperatorKit = ReturnType<ReturnType<typeof prepareOperatorKit>>;
diff --git a/packages/fast-usdc-contract/src/exos/settler.js b/packages/fast-usdc-contract/src/exos/settler.js
index 1226d6679c1..912f85e9e9e 100644
--- a/packages/fast-usdc-contract/src/exos/settler.js
+++ b/packages/fast-usdc-contract/src/exos/settler.js
@@ -26,7 +26,7 @@ import { asMultiset } from '../utils/store.js';
  * @import {HostOf, HostInterface} from '@agoric/async-flow';
  * @import {TargetRegistration} from '@agoric/vats/src/bridge-target.js';
  * @import {NobleAddress, FeeConfig, EvmHash, LogFn, CctpTxEvidence} from '@agoric/fast-usdc/src/types.js';
- * @import {StatusManager} from './status-manager.js';
+ * @import {StatusManager} from './status-manager.ts';
  * @import {LiquidityPoolKit} from './liquidity-pool.js';
  */
 
diff --git a/packages/fast-usdc-contract/src/exos/status-manager.js b/packages/fast-usdc-contract/src/exos/status-manager.ts
similarity index 71%
rename from packages/fast-usdc-contract/src/exos/status-manager.js
rename to packages/fast-usdc-contract/src/exos/status-manager.ts
index d845059d8ed..0c3c35e3c7f 100644
--- a/packages/fast-usdc-contract/src/exos/status-manager.js
+++ b/packages/fast-usdc-contract/src/exos/status-manager.ts
@@ -1,9 +1,4 @@
-import { makeTracer } from '@agoric/internal';
-import { appendToStoredArray } from '@agoric/store/src/stores/store-utils.js';
-import { AmountKeywordRecordShape } from '@agoric/zoe/src/typeGuards.js';
-import { Fail, makeError, q } from '@endo/errors';
-import { E } from '@endo/eventual-send';
-import { M } from '@endo/patterns';
+import type { NatValue } from '@agoric/ertp';
 import {
   PendingTxStatus,
   TerminalTxStatus,
@@ -14,51 +9,56 @@ import {
   EvmHashShape,
   PendingTxShape,
 } from '@agoric/fast-usdc/src/type-guards.js';
+import type {
+  CctpTxEvidence,
+  EvmHash,
+  LogFn,
+  NobleAddress,
+  PendingTx,
+  TransactionRecord,
+} from '@agoric/fast-usdc/src/types.js';
+import type { RepayAmountKWR } from '@agoric/fast-usdc/src/utils/fees.js';
+import { makeTracer } from '@agoric/internal';
+import type {
+  Marshaller,
+  StorageNode,
+} from '@agoric/internal/src/lib-chainStorage.js';
+import type { MapStore, SetStore } from '@agoric/store';
+import { appendToStoredArray } from '@agoric/store/src/stores/store-utils.js';
+import { AmountKeywordRecordShape } from '@agoric/zoe/src/typeGuards.js';
+import type { Zone } from '@agoric/zone';
+import { Fail, makeError, q } from '@endo/errors';
+import { E, type ERef } from '@endo/far';
+import { M } from '@endo/patterns';
 
-/**
- * @import {NatValue} from '@agoric/ertp';
- * @import {MapStore, SetStore} from '@agoric/store';
- * @import {Zone} from '@agoric/zone';
- * @import {CctpTxEvidence, NobleAddress, PendingTx, EvmHash, LogFn, TransactionRecord, EvidenceWithRisk, RiskAssessment} from '@agoric/fast-usdc/src/types.js';
- * @import {RepayAmountKWR} from '@agoric/fast-usdc/src/utils/fees.js';
- */
+/** The string template is for developer visibility but not meant to ever be parsed. */
+type PendingTxKey = `pendingTx:${bigint}:${NobleAddress}`;
 
-/**
- * @typedef {`pendingTx:${bigint}:${NobleAddress}`} PendingTxKey
- * The string template is for developer visibility but not meant to ever be parsed.
- */
+interface StatusManagerPowers {
+  log?: LogFn;
+  marshaller: ERef<Marshaller>;
+}
 
 /**
  * Create the key for the pendingTxs MapStore.
  *
  * The key is a composite but not meant to be parsable.
- *
- * @param {NobleAddress} nfa Noble Forwarding Account (implies EUD)
- * @param {bigint} amount
- * @returns {PendingTxKey}
+ * @param nfa
+ * @param amount
  */
-const makePendingTxKey = (nfa, amount) =>
+const makePendingTxKey = (nfa: NobleAddress, amount: bigint): PendingTxKey =>
   // amount can't contain colon
   `pendingTx:${amount}:${nfa}`;
 
 /**
  * Get the key for the pendingTxs MapStore.
- *
- * @param {CctpTxEvidence} evidence
- * @returns {PendingTxKey}
+ * @param evidence
  */
-const pendingTxKeyOf = evidence => {
+const pendingTxKeyOf = (evidence: CctpTxEvidence): PendingTxKey => {
   const { amount, forwardingAddress } = evidence.tx;
   return makePendingTxKey(forwardingAddress, amount);
 };
 
-/**
- * @typedef {{
- *  log?: LogFn;
- *  marshaller: ERef<Marshaller>;
- * }} StatusManagerPowers
- */
-
 export const stateShape = harden({
   pendingSettleTxs: M.remotable(),
   seenTxs: M.remotable(),
@@ -71,28 +71,27 @@ export const stateShape = harden({
  * and `Settler`.
  *
  * XXX consider separate facets for `Advancing` and `Settling` capabilities.
- *
- * @param {Zone} zone
- * @param {ERef<StorageNode>} txnsNode
- * @param {StatusManagerPowers} caps
+ * @param zone
+ * @param txnsNode
+ * @param root0
+ * @param root0.marshaller
+ * @param root0.log
  */
 export const prepareStatusManager = (
-  zone,
-  txnsNode,
-  {
-    marshaller,
-    // eslint-disable-next-line no-unused-vars
-    log = makeTracer('StatusManager', true),
-  } = /** @type {StatusManagerPowers} */ ({}),
+  zone: Zone,
+  txnsNode: ERef<StorageNode>,
+  { marshaller, log = makeTracer('StatusManager', true) }: StatusManagerPowers,
 ) => {
   /**
    * Keyed by a tuple of the Noble Forwarding Account and amount.
-   * @type {MapStore<PendingTxKey, PendingTx[]>}
    */
-  const pendingSettleTxs = zone.mapStore('PendingSettleTxs', {
-    keyShape: M.string(),
-    valueShape: M.arrayOf(PendingTxShape),
-  });
+  const pendingSettleTxs: MapStore<PendingTxKey, PendingTx[]> = zone.mapStore(
+    'PendingSettleTxs',
+    {
+      keyShape: M.string(),
+      valueShape: M.arrayOf(PendingTxShape),
+    },
+  );
 
   /**
    * Transactions seen *ever* by the contract.
@@ -103,28 +102,23 @@ export const prepareStatusManager = (
    * Note that `blockTimestamp` can drift between chains. Fortunately all CCTP
    * chains use the same Unix epoch and won't drift more than minutes apart,
    * which is more than enough precision for pruning old transaction.
-   *
-   * @type {MapStore<EvmHash, NatValue>}
    */
-  const seenTxs = zone.mapStore('SeenTxs', {
+  const seenTxs: MapStore<EvmHash, NatValue> = zone.mapStore('SeenTxs', {
     keyShape: M.string(),
     valueShape: M.nat(),
   });
 
   /**
    * Transactions that have completed, but are still in vstorage.
-   *
-   * @type {SetStore<EvmHash>}
    */
-  const storedCompletedTxs = zone.setStore('StoredCompletedTxs', {
-    keyShape: M.string(),
-  });
+  const storedCompletedTxs: SetStore<EvmHash> = zone.setStore(
+    'StoredCompletedTxs',
+    {
+      keyShape: M.string(),
+    },
+  );
 
-  /**
-   * @param {EvmHash} txId
-   * @param {TransactionRecord} record
-   */
-  const publishTxnRecord = (txId, record) => {
+  const publishTxnRecord = (txId: EvmHash, record: TransactionRecord): void => {
     const txNode = E(txnsNode).makeChildNode(txId, {
       sequence: true, // avoid overwriting other output in the block
     });
@@ -144,11 +138,7 @@ export const prepareStatusManager = (
     );
   };
 
-  /**
-   * @param {CctpTxEvidence['txHash']} hash
-   * @param {CctpTxEvidence} evidence
-   */
-  const publishEvidence = (hash, evidence) => {
+  const publishEvidence = (hash: EvmHash, evidence: CctpTxEvidence): void => {
     // Don't await, just writing to vstorage.
     publishTxnRecord(hash, harden({ evidence, status: TxStatus.Observed }));
   };
@@ -158,12 +148,15 @@ export const prepareStatusManager = (
    * and adds entry to `seenTxs` set.
    *
    * Also records the CctpTxEvidence and status in `pendingTxs`.
-   *
-   * @param {CctpTxEvidence} evidence
-   * @param {PendingTxStatus} status
-   * @param {string[]} [risksIdentified]
+   * @param evidence
+   * @param status
+   * @param risksIdentified
    */
-  const initPendingTx = (evidence, status, risksIdentified) => {
+  const initPendingTx = (
+    evidence: CctpTxEvidence,
+    status: PendingTxStatus,
+    risksIdentified?: string[],
+  ): void => {
     const { txHash } = evidence;
     if (seenTxs.has(txHash)) {
       throw makeError(`Transaction already seen: ${q(txHash)}`);
@@ -186,11 +179,15 @@ export const prepareStatusManager = (
 
   /**
    * Update the pending transaction status.
-   *
-   * @param {{nfa: NobleAddress, amount: bigint}} keyParts
-   * @param {PendingTxStatus} status
+   * @param root0
+   * @param root0.nfa
+   * @param root0.amount
+   * @param status
    */
-  function setPendingTxStatus({ nfa, amount }, status) {
+  function setPendingTxStatus(
+    { nfa, amount }: { nfa: NobleAddress; amount: bigint },
+    status: PendingTxStatus,
+  ): void {
     const key = makePendingTxKey(nfa, amount);
     pendingSettleTxs.has(key) || Fail`no advancing tx with ${{ nfa, amount }}`;
     const pending = pendingSettleTxs.get(key);
@@ -241,10 +238,9 @@ export const prepareStatusManager = (
        *
        * NB: this acts like observe() but subsequently records an ADVANCING
        * state
-       *
-       * @param {CctpTxEvidence} evidence
+       * @param evidence
        */
-      advance(evidence) {
+      advance(evidence: CctpTxEvidence): void {
         initPendingTx(evidence, PendingTxStatus.Advancing);
       },
 
@@ -253,11 +249,10 @@ export const prepareStatusManager = (
        *
        * NB: this acts like observe() but subsequently records an
        * ADVANCE_SKIPPED state along with risks identified
-       *
-       * @param {CctpTxEvidence} evidence
-       * @param {string[]} risksIdentified
+       * @param evidence
+       * @param risksIdentified
        */
-      skipAdvance(evidence, risksIdentified) {
+      skipAdvance(evidence: CctpTxEvidence, risksIdentified: string[]): void {
         initPendingTx(
           evidence,
           PendingTxStatus.AdvanceSkipped,
@@ -268,12 +263,16 @@ export const prepareStatusManager = (
       /**
        * Record result of an ADVANCING transaction
        *
-       * @param {NobleAddress} nfa Noble Forwarding Account
-       * @param {import('@agoric/ertp').NatValue} amount
-       * @param {boolean} success - Advanced vs. AdvanceFailed
+       * @param nfa
+       * @param amount
+       * @param success
        * @throws {Error} if nothing to advance
        */
-      advanceOutcome(nfa, amount, success) {
+      advanceOutcome(
+        nfa: NobleAddress,
+        amount: bigint,
+        success: boolean,
+      ): void {
         setPendingTxStatus(
           { nfa, amount },
           success ? PendingTxStatus.Advanced : PendingTxStatus.AdvanceFailed,
@@ -286,11 +285,10 @@ export const prepareStatusManager = (
        *
        * Does not add or amend `pendingSettleTxs` as this has
        * already settled.
-       *
-       * @param {EvmHash} txHash
-       * @param {boolean} success whether the Transfer succeeded
+       * @param txHash
+       * @param success
        */
-      advanceOutcomeForMintedEarly(txHash, success) {
+      advanceOutcomeForMintedEarly(txHash: EvmHash, success: boolean): void {
         publishTxnRecord(
           txHash,
           harden({
@@ -304,10 +302,9 @@ export const prepareStatusManager = (
       /**
        * If minted before observed and the evidence is eventually
        * reported, publish the evidence without adding to `pendingSettleTxs`
-       *
-       * @param {CctpTxEvidence} evidence
+       * @param evidence
        */
-      advanceOutcomeForUnknownMint(evidence) {
+      advanceOutcomeForUnknownMint(evidence: CctpTxEvidence): void {
         const { txHash } = evidence;
         // unexpected path, since `hasBeenObserved` will be called before this
         if (seenTxs.has(txHash)) {
@@ -319,23 +316,22 @@ export const prepareStatusManager = (
 
       /**
        * Add a new transaction with OBSERVED status
-       * @param {CctpTxEvidence} evidence
+       * @param evidence
        */
-      observe(evidence) {
+      observe(evidence: CctpTxEvidence): void {
         initPendingTx(evidence, PendingTxStatus.Observed);
       },
 
       /**
        * Note: ADVANCING state implies tx has been OBSERVED
-       *
-       * @param {CctpTxEvidence} evidence
+       * @param evidence
        */
-      hasBeenObserved(evidence) {
+      hasBeenObserved(evidence: CctpTxEvidence): boolean {
         return seenTxs.has(evidence.txHash);
       },
 
       // UNTIL https://github.com/Agoric/agoric-sdk/issues/7405
-      deleteCompletedTxs() {
+      deleteCompletedTxs(): void {
         for (const txHash of storedCompletedTxs.values()) {
           // As of now, setValue('') on a non-sequence node will delete it
           const txNode = E(txnsNode).makeChildNode(txHash, {
@@ -352,12 +348,14 @@ export const prepareStatusManager = (
        * forwarding account and amount. Since multiple pending transactions may exist with
        * identical (account, amount) pairs, we process them in FIFO order.
        *
-       * @param {NobleAddress} nfa
-       * @param {bigint} amount
-       * @returns {Pick<PendingTx, 'status' | 'txHash'> | undefined} undefined if no pending
-       *   transactions exist for this address and amount combination.
+       * @param nfa
+       * @param amount
+       * @returns undefined if no pending transactions exist for this address and amount combination.
        */
-      dequeueStatus(nfa, amount) {
+      dequeueStatus(
+        nfa: NobleAddress,
+        amount: bigint,
+      ): { txHash: EvmHash; status: PendingTxStatus } | undefined {
         const key = makePendingTxKey(nfa, amount);
         if (!pendingSettleTxs.has(key)) return undefined;
         const pending = pendingSettleTxs.get(key);
@@ -379,21 +377,19 @@ export const prepareStatusManager = (
 
       /**
        * Mark a transaction as `DISBURSED`
-       *
-       * @param {EvmHash} txHash
-       * @param {RepayAmountKWR} split
+       * @param txHash
+       * @param split
        */
-      disbursed(txHash, split) {
+      disbursed(txHash: EvmHash, split: RepayAmountKWR): void {
         publishTxnRecord(txHash, harden({ split, status: TxStatus.Disbursed }));
       },
 
       /**
        * Mark a transaction as `FORWARDED` or `FORWARD_FAILED`
-       *
-       * @param {EvmHash} txHash
-       * @param {boolean} success
+       * @param txHash
+       * @param success
        */
-      forwarded(txHash, success) {
+      forwarded(txHash: EvmHash, success: boolean): void {
         publishTxnRecord(
           txHash,
           harden({
@@ -406,12 +402,10 @@ export const prepareStatusManager = (
        * Lookup all pending entries for a given address and amount
        *
        * XXX only used in tests. should we remove?
-       *
-       * @param {NobleAddress} nfa
-       * @param {bigint} amount
-       * @returns {PendingTx[]}
+       * @param nfa
+       * @param amount
        */
-      lookupPending(nfa, amount) {
+      lookupPending(nfa: NobleAddress, amount: bigint): PendingTx[] {
         const key = makePendingTxKey(nfa, amount);
         if (!pendingSettleTxs.has(key)) {
           return harden([]);
@@ -424,4 +418,4 @@ export const prepareStatusManager = (
 };
 harden(prepareStatusManager);
 
-/** @typedef {ReturnType<typeof prepareStatusManager>} StatusManager */
+export type StatusManager = ReturnType<typeof prepareStatusManager>;
diff --git a/packages/fast-usdc-contract/src/exos/transaction-feed.js b/packages/fast-usdc-contract/src/exos/transaction-feed.ts
similarity index 75%
rename from packages/fast-usdc-contract/src/exos/transaction-feed.js
rename to packages/fast-usdc-contract/src/exos/transaction-feed.ts
index e9095408cde..d87ad5705a6 100644
--- a/packages/fast-usdc-contract/src/exos/transaction-feed.js
+++ b/packages/fast-usdc-contract/src/exos/transaction-feed.ts
@@ -8,21 +8,24 @@ import {
   RiskAssessmentShape,
 } from '@agoric/fast-usdc/src/type-guards.js';
 import { INVITATION_MAKERS_DESC } from '@agoric/fast-usdc/src/operator-kit-interface.js';
+import type { Zone } from '@agoric/zone';
+import type { MapStore } from '@agoric/store';
+import type {
+  CctpTxEvidence,
+  EvidenceWithRisk,
+  RiskAssessment,
+} from '@agoric/fast-usdc/src/types.js';
 import { defineInertInvitation } from '../utils/zoe.js';
-import { prepareOperatorKit } from './operator-kit.js';
+import { prepareOperatorKit } from './operator-kit.ts';
 
-/**
- * @import {Zone} from '@agoric/zone';
- * @import {MapStore} from '@agoric/store';
- * @import {OperatorKit} from './operator-kit.js';
- * @import {CctpTxEvidence, EvidenceWithRisk, RiskAssessment} from '@agoric/fast-usdc/src/types.js';
- */
+import type { OperatorKit } from './operator-kit.ts';
 
 const trace = makeTracer('TxFeed', true);
 
-/**
- * @typedef {Pick<OperatorKit, 'invitationMakers' | 'operator'>} OperatorOfferResult
- */
+export type OperatorOfferResult = Pick<
+  OperatorKit,
+  'invitationMakers' | 'operator'
+>;
 
 const TransactionFeedKitI = harden({
   operatorPowers: M.interface('Transaction Feed Admin', {
@@ -45,13 +48,11 @@ const TransactionFeedKitI = harden({
   }),
 });
 
-/**
- * @param {MapStore<string, RiskAssessment>[]} riskStores
- * @param {string} txHash
- */
-const allRisksIdentified = (riskStores, txHash) => {
-  /**  @type {Set<string>} */
-  const setOfRisks = new Set();
+const allRisksIdentified = (
+  riskStores: MapStore<string, RiskAssessment>[],
+  txHash: string,
+) => {
+  const setOfRisks = new Set() as Set<string>;
   for (const store of riskStores) {
     const next = store.get(txHash);
     for (const risk of next.risksIdentified ?? []) {
@@ -74,17 +75,16 @@ harden(stateShape);
  * It receives attestations, records their evidence, and when enough oracles
  * agree, publishes the results for the advancer to act on.
  *
- * @param {Zone} zone
- * @param {ZCF} zcf
+ * @param zone
+ * @param zcf
  */
-export const prepareTransactionFeedKit = (zone, zcf) => {
-  const kinds = zone.mapStore('Kinds');
+export const prepareTransactionFeedKit = (zone: Zone, zcf: ZCF) => {
+  const kinds = zone.mapStore<string, unknown>('Kinds');
   const makeDurablePublishKit = prepareDurablePublishKit(
     kinds,
     'Transaction Feed',
   );
-  /** @type {PublishKit<EvidenceWithRisk>} */
-  const { publisher, subscriber } = makeDurablePublishKit();
+  const { publisher, subscriber } = makeDurablePublishKit<EvidenceWithRisk>();
 
   const makeInertInvitation = defineInertInvitation(zcf, 'submitting evidence');
 
@@ -96,12 +96,13 @@ export const prepareTransactionFeedKit = (zone, zcf) => {
     'Fast USDC Feed',
     TransactionFeedKitI,
     () => {
-      /** @type {MapStore<string, OperatorKit>} */
-      const operators = zone.mapStore('operators');
-      /** @type {MapStore<string, MapStore<string, CctpTxEvidence>>} */
-      const pending = zone.mapStore('pending');
-      /** @type {MapStore<string, MapStore<string, RiskAssessment>>} */
-      const risks = zone.mapStore('risks');
+      const operators = zone.mapStore<string, OperatorKit>('operators');
+      const pending = zone.mapStore<string, MapStore<string, CctpTxEvidence>>(
+        'pending',
+      );
+      const risks = zone.mapStore<string, MapStore<string, RiskAssessment>>(
+        'risks',
+      );
       return { operators, pending, risks };
     },
     {
@@ -111,27 +112,20 @@ export const prepareTransactionFeedKit = (zone, zcf) => {
          * oracle network, with the able to submit data to submit evidence of
          * CCTP transactions.
          *
-         * @param {string} operatorId unique per contract instance
-         * @returns {Promise<Invitation<OperatorOfferResult>>}
+         * @param operatorId unique per contract instance
          */
-        makeOperatorInvitation(operatorId) {
+        makeOperatorInvitation(
+          operatorId: string,
+        ): Promise<Invitation<OperatorOfferResult>> {
           const { creator } = this.facets;
           trace('makeOperatorInvitation', operatorId);
 
-          return zcf.makeInvitation(
-            /** @type {OfferHandler<OperatorOfferResult>} */
-            seat => {
-              seat.exit();
-              return creator.initOperator(operatorId);
-            },
-            INVITATION_MAKERS_DESC,
-          );
+          return zcf.makeInvitation(seat => {
+            seat.exit();
+            return creator.initOperator(operatorId);
+          }, INVITATION_MAKERS_DESC);
         },
-        /**
-         * @param {string} operatorId
-         * @returns {OperatorOfferResult}
-         */
-        initOperator(operatorId) {
+        initOperator(operatorId: string): OperatorOfferResult {
           const { operators, pending, risks } = this.state;
           trace('initOperator', operatorId);
 
@@ -154,8 +148,7 @@ export const prepareTransactionFeedKit = (zone, zcf) => {
           };
         },
 
-        /** @param {string} operatorId */
-        removeOperator(operatorId) {
+        removeOperator(operatorId: string) {
           const { operators, pending, risks } = this.state;
           trace('removeOperator', operatorId);
           const operatorKit = operators.get(operatorId);
@@ -171,11 +164,15 @@ export const prepareTransactionFeedKit = (zone, zcf) => {
          *
          * NB: the operatorKit is responsible for revoking access.
          *
-         * @param {CctpTxEvidence} evidence
-         * @param {RiskAssessment} riskAssessment
-         * @param {string} operatorId
+         * @param evidence
+         * @param riskAssessment
+         * @param operatorId
          */
-        attest(evidence, riskAssessment, operatorId) {
+        attest(
+          evidence: CctpTxEvidence,
+          riskAssessment: RiskAssessment,
+          operatorId: string,
+        ) {
           const { operators, pending, risks } = this.state;
           trace('attest', operatorId, evidence);
 
@@ -273,4 +270,6 @@ export const prepareTransactionFeedKit = (zone, zcf) => {
 };
 harden(prepareTransactionFeedKit);
 
-/** @typedef {ReturnType<ReturnType<typeof prepareTransactionFeedKit>>} TransactionFeedKit */
+export type TransactionFeedKit = ReturnType<
+  ReturnType<typeof prepareTransactionFeedKit>
+>;
diff --git a/packages/fast-usdc-contract/src/fast-usdc.contract.js b/packages/fast-usdc-contract/src/fast-usdc.contract.ts
similarity index 77%
rename from packages/fast-usdc-contract/src/fast-usdc.contract.js
rename to packages/fast-usdc-contract/src/fast-usdc.contract.ts
index 09b500559f3..aff31100127 100644
--- a/packages/fast-usdc-contract/src/fast-usdc.contract.js
+++ b/packages/fast-usdc-contract/src/fast-usdc.contract.ts
@@ -1,30 +1,51 @@
 import { AssetKind } from '@agoric/ertp';
+import {
+  FastUSDCTermsShape,
+  FeeConfigShape,
+} from '@agoric/fast-usdc/src/type-guards.js';
 import { makeTracer } from '@agoric/internal';
 import { observeIteration, subscribeEach } from '@agoric/notifier';
 import {
   CosmosChainInfoShape,
   DenomDetailShape,
   DenomShape,
+  type IBCConnectionInfo,
   OrchestrationPowersShape,
   registerChainsAndAssets,
   withOrchestration,
+  type OrchestrationAccount,
+  type OrchestrationPowers,
+  type OrchestrationTools,
+  type CosmosChainInfo,
+  type Denom,
+  type DenomDetail,
 } from '@agoric/orchestration';
 import { makeZoeTools } from '@agoric/orchestration/src/utils/zoe-tools.js';
 import { provideSingleton } from '@agoric/zoe/src/contractSupport/durability.js';
 import { prepareRecorderKitMakers } from '@agoric/zoe/src/contractSupport/recorder.js';
 import { Fail } from '@endo/errors';
-import { E } from '@endo/far';
+import { E, type ERef } from '@endo/far';
 import { M } from '@endo/patterns';
-import {
-  FastUSDCTermsShape,
-  FeeConfigShape,
-} from '@agoric/fast-usdc/src/type-guards.js';
+
+import type { HostInterface } from '@agoric/async-flow';
+import type {
+  ContractRecord,
+  FastUsdcTerms,
+  FeeConfig,
+} from '@agoric/fast-usdc/src/types.js';
+import type { Remote } from '@agoric/internal';
+import type {
+  Marshaller,
+  StorageNode,
+} from '@agoric/internal/src/lib-chainStorage.js';
+import type { Zone } from '@agoric/zone';
 import { prepareAdvancer } from './exos/advancer.js';
 import { prepareLiquidityPoolKit } from './exos/liquidity-pool.js';
 import { prepareSettler } from './exos/settler.js';
-import { prepareStatusManager } from './exos/status-manager.js';
-import { prepareTransactionFeedKit } from './exos/transaction-feed.js';
-import * as flows from './fast-usdc.flows.js';
+import { prepareStatusManager } from './exos/status-manager.ts';
+import type { OperatorOfferResult } from './exos/transaction-feed.ts';
+import { prepareTransactionFeedKit } from './exos/transaction-feed.ts';
+import * as flows from './fast-usdc.flows.ts';
 
 const trace = makeTracer('FastUsdc');
 
@@ -32,20 +53,7 @@ const TXNS_NODE = 'txns';
 const FEE_NODE = 'feeConfig';
 const ADDRESSES_BAGGAGE_KEY = 'addresses';
 
-/**
- * @import {HostInterface} from '@agoric/async-flow';
- * @import {CosmosChainInfo, Denom, DenomDetail, OrchestrationAccount, IBCConnectionInfo} from '@agoric/orchestration';
- * @import {OrchestrationPowers, OrchestrationTools} from '@agoric/orchestration/src/utils/start-helper.js';
- * @import {Remote} from '@agoric/internal';
- * @import {Marshaller, StorageNode} from '@agoric/internal/src/lib-chainStorage.js'
- * @import {Zone} from '@agoric/zone';
- * @import {OperatorOfferResult} from './exos/transaction-feed.js';
- * @import {ContractRecord, FastUsdcTerms, FeeConfig} from '@agoric/fast-usdc/src/types.js';
- */
-
-/** @type {ContractMeta<typeof start>} */
 export const meta = {
-  // @ts-expect-error TypedPattern not recognized as record
   customTermsShape: FastUSDCTermsShape,
   privateArgsShape: {
     // @ts-expect-error TypedPattern not recognized as record
@@ -56,43 +64,40 @@ export const meta = {
     marshaller: M.remotable(),
     poolMetricsNode: M.remotable(),
   },
-};
+} as ContractMeta<typeof start>;
 harden(meta);
 
-/**
- * @param {Remote<StorageNode>} node
- * @param {ERef<Marshaller>} marshaller
- * @param {FeeConfig} feeConfig
- */
-const publishFeeConfig = (node, marshaller, feeConfig) => {
+const publishFeeConfig = (
+  node: Remote<StorageNode>,
+  marshaller: ERef<Marshaller>,
+  feeConfig: FeeConfig,
+) => {
   const feeNode = E(node).makeChildNode(FEE_NODE);
   void E.when(E(marshaller).toCapData(feeConfig), value =>
     E(feeNode).setValue(JSON.stringify(value)),
   );
 };
 
-/**
- * @param {Remote<StorageNode>} contractNode
- * @param {ContractRecord} addresses
- */
-const publishAddresses = (contractNode, addresses) => {
+const publishAddresses = (
+  contractNode: Remote<StorageNode>,
+  addresses: ContractRecord,
+) => {
   return E(contractNode).setValue(JSON.stringify(addresses));
 };
 
-/**
- * @param {ZCF<FastUsdcTerms>} zcf
- * @param {OrchestrationPowers & {
- *   assetInfo: [Denom, DenomDetail & { brandKey?: string}][];
- *   chainInfo: Record<string, CosmosChainInfo>;
- *   feeConfig: FeeConfig;
- *   marshaller: Marshaller;
- *   poolMetricsNode: Remote<StorageNode>;
- *   storageNode: Remote<StorageNode>;
- * }} privateArgs
- * @param {Zone} zone
- * @param {OrchestrationTools} tools
- */
-export const contract = async (zcf, privateArgs, zone, tools) => {
+export const contract = async (
+  zcf: ZCF<FastUsdcTerms>,
+  privateArgs: OrchestrationPowers & {
+    assetInfo: [Denom, DenomDetail & { brandKey?: string }][];
+    chainInfo: Record<string, CosmosChainInfo>;
+    feeConfig: FeeConfig;
+    marshaller: Marshaller;
+    storageNode: StorageNode;
+    poolMetricsNode: Remote<StorageNode>;
+  },
+  zone: Zone,
+  tools: OrchestrationTools,
+) => {
   assert(tools, 'no tools');
   const terms = zcf.getTerms();
   assert('USDC' in terms.brands, 'no USDC brand');
@@ -149,27 +154,25 @@ export const contract = async (zcf, privateArgs, zone, tools) => {
   const { makeLocalAccount, makeNobleAccount } = orchestrateAll(flows, {});
 
   const creatorFacet = zone.exo('Fast USDC Creator', undefined, {
-    /** @type {(operatorId: string) => Promise<Invitation<OperatorOfferResult>>} */
-    async makeOperatorInvitation(operatorId) {
+    async makeOperatorInvitation(
+      operatorId: string,
+    ): Promise<Invitation<OperatorOfferResult>> {
       return feedKit.creator.makeOperatorInvitation(operatorId);
     },
-    /** @type {(operatorId: string) => void} */
-    removeOperator(operatorId) {
+    removeOperator(operatorId: string): void {
       return feedKit.creator.removeOperator(operatorId);
     },
     async getContractFeeBalance() {
       return poolKit.feeRecipient.getContractFeeBalance();
     },
-    /** @type {() => Promise<Invitation<unknown>>} */
-    async makeWithdrawFeesInvitation() {
+    async makeWithdrawFeesInvitation(): Promise<Invitation<unknown>> {
       return poolKit.feeRecipient.makeWithdrawFeesInvitation();
     },
-    /**
-     * @param {string} [agoricChainId]
-     * @param {string} [nobleChainId]
-     * @param {IBCConnectionInfo} [agoricToNoble]
-     */
-    async connectToNoble(agoricChainId, nobleChainId, agoricToNoble) {
+    async connectToNoble(
+      agoricChainId?: string,
+      nobleChainId?: string,
+      agoricToNoble?: IBCConnectionInfo,
+    ) {
       const shouldUpdate = agoricChainId && nobleChainId && agoricToNoble;
       if (shouldUpdate) {
         trace('connectToNoble', agoricChainId, nobleChainId, agoricToNoble);
@@ -227,8 +230,7 @@ export const contract = async (zcf, privateArgs, zone, tools) => {
     getStaticInfo() {
       baggage.has(ADDRESSES_BAGGAGE_KEY) ||
         Fail`no addresses. creator must 'publishAddresses' first`;
-      /** @type {ContractRecord} */
-      const addresses = baggage.get(ADDRESSES_BAGGAGE_KEY);
+      const addresses: ContractRecord = baggage.get(ADDRESSES_BAGGAGE_KEY);
       return harden({
         [ADDRESSES_BAGGAGE_KEY]: addresses,
       });
@@ -282,10 +284,12 @@ export const contract = async (zcf, privateArgs, zone, tools) => {
     makeLocalAccount(),
   );
   // when() is OK here since this clearly resolves promptly.
-  /** @type {[HostInterface<OrchestrationAccount<{chainId: 'agoric-3';}>>, HostInterface<OrchestrationAccount<{chainId: 'agoric-3';}>>]} */
-  const [poolAccount, settlementAccount] = await vowTools.when(
+  const [poolAccount, settlementAccount] = (await vowTools.when(
     vowTools.all([poolAccountV, settleAccountV]),
-  );
+  )) as [
+    HostInterface<OrchestrationAccount<{ chainId: 'agoric-any' }>>,
+    HostInterface<OrchestrationAccount<{ chainId: 'agoric-any' }>>,
+  ];
   trace('settlementAccount', settlementAccount);
   trace('poolAccount', poolAccount);
   const settlementAddress = await E(settlementAccount).getAddress();
@@ -332,4 +336,5 @@ harden(contract);
 
 export const start = withOrchestration(contract);
 harden(start);
-/** @typedef {typeof start} FastUsdcSF */
+
+export type FastUsdcSF = typeof start;
diff --git a/packages/fast-usdc-contract/src/fast-usdc.flows.js b/packages/fast-usdc-contract/src/fast-usdc.flows.js
deleted file mode 100644
index a9aedd6228e..00000000000
--- a/packages/fast-usdc-contract/src/fast-usdc.flows.js
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- * @import {Orchestrator, OrchestrationFlow} from '@agoric/orchestration';
- */
-
-/**
- * @satisfies {OrchestrationFlow}
- * @param {Orchestrator} orch
- */
-export const makeLocalAccount = async orch => {
-  const agoricChain = await orch.getChain('agoric');
-  return agoricChain.makeAccount();
-};
-harden(makeLocalAccount);
-
-/**
- * @satisfies {OrchestrationFlow}
- * @param {Orchestrator} orch
- */
-export const makeNobleAccount = async orch => {
-  const nobleChain = await orch.getChain('noble');
-  return nobleChain.makeAccount();
-};
-harden(makeNobleAccount);
diff --git a/packages/fast-usdc-contract/src/fast-usdc.flows.ts b/packages/fast-usdc-contract/src/fast-usdc.flows.ts
new file mode 100644
index 00000000000..dd454757a6d
--- /dev/null
+++ b/packages/fast-usdc-contract/src/fast-usdc.flows.ts
@@ -0,0 +1,13 @@
+import type { OrchestrationFlow, Orchestrator } from '@agoric/orchestration';
+
+export const makeLocalAccount = (async (orch: Orchestrator) => {
+  const agoricChain = await orch.getChain('agoric');
+  return agoricChain.makeAccount();
+}) satisfies OrchestrationFlow;
+harden(makeLocalAccount);
+
+export const makeNobleAccount = (async (orch: Orchestrator) => {
+  const nobleChain = await orch.getChain('noble');
+  return nobleChain.makeAccount();
+}) satisfies OrchestrationFlow;
+harden(makeNobleAccount);
diff --git a/packages/fast-usdc-contract/test/exos/advancer.test.ts b/packages/fast-usdc-contract/test/exos/advancer.test.ts
index f9afffd3746..fa74174a4d7 100644
--- a/packages/fast-usdc-contract/test/exos/advancer.test.ts
+++ b/packages/fast-usdc-contract/test/exos/advancer.test.ts
@@ -27,7 +27,7 @@ import {
   makeAdvanceDetailsShape,
   type SettlerKit,
 } from '../../src/exos/settler.js';
-import { prepareStatusManager } from '../../src/exos/status-manager.js';
+import { prepareStatusManager } from '../../src/exos/status-manager.ts';
 import type { LiquidityPoolKit } from '../../src/exos/liquidity-pool.js';
 import {
   makeTestFeeConfig,
diff --git a/packages/fast-usdc-contract/test/exos/settler.test.ts b/packages/fast-usdc-contract/test/exos/settler.test.ts
index acf6d0c22cf..480be86121d 100644
--- a/packages/fast-usdc-contract/test/exos/settler.test.ts
+++ b/packages/fast-usdc-contract/test/exos/settler.test.ts
@@ -20,7 +20,7 @@ import {
   stateShape,
   type SettlerKit,
 } from '../../src/exos/settler.js';
-import { prepareStatusManager } from '../../src/exos/status-manager.js';
+import { prepareStatusManager } from '../../src/exos/status-manager.ts';
 import {
   MockCctpTxEvidences,
   MockVTransferEvents,
diff --git a/packages/fast-usdc-contract/test/exos/status-manager.test.ts b/packages/fast-usdc-contract/test/exos/status-manager.test.ts
index 767f0a6360c..429e86bc0f6 100644
--- a/packages/fast-usdc-contract/test/exos/status-manager.test.ts
+++ b/packages/fast-usdc-contract/test/exos/status-manager.test.ts
@@ -11,7 +11,7 @@ import {
   prepareStatusManager,
   stateShape,
   type StatusManager,
-} from '../../src/exos/status-manager.js';
+} from '../../src/exos/status-manager.ts';
 import { commonSetup, provideDurableZone } from '../supports.js';
 
 type Common = EReturn<typeof commonSetup>;
diff --git a/packages/fast-usdc-contract/test/exos/transaction-feed.test.ts b/packages/fast-usdc-contract/test/exos/transaction-feed.test.ts
index f016f548c2c..3235784bb44 100644
--- a/packages/fast-usdc-contract/test/exos/transaction-feed.test.ts
+++ b/packages/fast-usdc-contract/test/exos/transaction-feed.test.ts
@@ -9,7 +9,7 @@ import {
   prepareTransactionFeedKit,
   stateShape,
   type TransactionFeedKit,
-} from '../../src/exos/transaction-feed.js';
+} from '../../src/exos/transaction-feed.ts';
 
 const nullZcf = null as any;
 
diff --git a/packages/fast-usdc-contract/test/fast-usdc.contract.test.ts b/packages/fast-usdc-contract/test/fast-usdc.contract.test.ts
index 05b3b562436..68ff74c84ac 100644
--- a/packages/fast-usdc-contract/test/fast-usdc.contract.test.ts
+++ b/packages/fast-usdc-contract/test/fast-usdc.contract.test.ts
@@ -42,13 +42,13 @@ import type {
 } from '@agoric/fast-usdc/src/types.js';
 import { makeFeeTools } from '@agoric/fast-usdc/src/utils/fees.js';
 import { MockCctpTxEvidences } from '@agoric/fast-usdc/tools/mock-evidence.js';
-import type { FastUsdcSF } from '../src/fast-usdc.contract.js';
-import type { OperatorOfferResult } from '../src/exos/transaction-feed.js';
+import type { FastUsdcSF } from '../src/fast-usdc.contract.ts';
+import type { OperatorOfferResult } from '../src/exos/transaction-feed.ts';
 import { commonSetup, uusdcOnAgoric } from './supports.js';
 
 const dirname = path.dirname(new URL(import.meta.url).pathname);
 
-const contractFile = `${dirname}/../src/fast-usdc.contract.js`;
+const contractFile = `${dirname}/../src/fast-usdc.contract.ts`;
 
 const agToNoble = fetchedChainInfo.agoric.connections['noble-1'];
 
diff --git a/packages/fast-usdc-deploy/src/fast-usdc-fee-config.build.js b/packages/fast-usdc-deploy/src/fast-usdc-fee-config.build.js
index 6db68aec5a6..c6a15d92b65 100644
--- a/packages/fast-usdc-deploy/src/fast-usdc-fee-config.build.js
+++ b/packages/fast-usdc-deploy/src/fast-usdc-fee-config.build.js
@@ -29,7 +29,7 @@ export const proposalBuilder = async (
         options,
         installKeys: {
           fastUsdc: publishRef(
-            install('@aglocal/fast-usdc-contract/src/fast-usdc.contract.js'),
+            install('@aglocal/fast-usdc-contract/src/fast-usdc.contract.ts'),
           ),
         },
       },
diff --git a/packages/fast-usdc-deploy/src/fast-usdc-reconfigure.build.js b/packages/fast-usdc-deploy/src/fast-usdc-reconfigure.build.js
index c1a0d9e50b2..d197cfbe5ab 100644
--- a/packages/fast-usdc-deploy/src/fast-usdc-reconfigure.build.js
+++ b/packages/fast-usdc-deploy/src/fast-usdc-reconfigure.build.js
@@ -31,7 +31,7 @@ export const proposalBuilder = async ({ publishRef, install }, options) => {
         options,
         installKeys: {
           fastUsdc: publishRef(
-            install('@aglocal/fast-usdc-contract/src/fast-usdc.contract.js'),
+            install('@aglocal/fast-usdc-contract/src/fast-usdc.contract.ts'),
           ),
         },
       },
diff --git a/packages/fast-usdc-deploy/src/fast-usdc-settler-ref.build.js b/packages/fast-usdc-deploy/src/fast-usdc-settler-ref.build.js
index 2389ef16df8..93267b21ca0 100644
--- a/packages/fast-usdc-deploy/src/fast-usdc-settler-ref.build.js
+++ b/packages/fast-usdc-deploy/src/fast-usdc-settler-ref.build.js
@@ -29,7 +29,7 @@ export const proposalBuilder = async (
         options,
         installKeys: {
           fastUsdc: publishRef(
-            install('@aglocal/fast-usdc-contract/src/fast-usdc.contract.js'),
+            install('@aglocal/fast-usdc-contract/src/fast-usdc.contract.ts'),
           ),
         },
       },
diff --git a/packages/fast-usdc-deploy/src/start-fast-usdc.build.js b/packages/fast-usdc-deploy/src/start-fast-usdc.build.js
index cafa49b1d61..83c0461b93d 100644
--- a/packages/fast-usdc-deploy/src/start-fast-usdc.build.js
+++ b/packages/fast-usdc-deploy/src/start-fast-usdc.build.js
@@ -87,7 +87,7 @@ export const defaultProposalBuilder = async (
         options: toExternalConfig(config, crossVatContext, FastUSDCConfigShape),
         installKeys: {
           fastUsdc: publishRef(
-            install('@aglocal/fast-usdc-contract/src/fast-usdc.contract.js'),
+            install('@aglocal/fast-usdc-contract/src/fast-usdc.contract.ts'),
           ),
         },
       },
diff --git a/packages/fast-usdc-deploy/src/start-fast-usdc.core.js b/packages/fast-usdc-deploy/src/start-fast-usdc.core.js
index b8eb6022e5e..74022703a35 100644
--- a/packages/fast-usdc-deploy/src/start-fast-usdc.core.js
+++ b/packages/fast-usdc-deploy/src/start-fast-usdc.core.js
@@ -15,7 +15,7 @@ import {
  * @import {ManifestBundleRef} from '@agoric/deploy-script-support/src/externalTypes.js'
  * @import {BootstrapManifest} from '@agoric/vats/src/core/lib-boot.js'
  * @import {LegibleCapData} from './utils/config-marshal.js'
- * @import {FastUsdcSF} from '@aglocal/fast-usdc-contract/src/fast-usdc.contract.js'
+ * @import {FastUsdcSF} from '@aglocal/fast-usdc-contract/src/fast-usdc.contract.ts'
  * @import {FastUSDCConfig} from '@agoric/fast-usdc/src/types.js'
  */
 
@@ -160,7 +160,7 @@ export const startFastUSDC = async (
     brands: { PoolShares: shareBrand },
   } = await E(zoe).getTerms(instance);
   /** @type {{ PoolShares: Issuer<'nat'> }} */
-  // @ts-expect-error see zcf.makeZCFMint(...) in fast-usdc.contract.js
+  // @ts-expect-error see zcf.makeZCFMint(...) in fast-usdc.contract.ts
   const { PoolShares: shareIssuer } = fastUsdcIssuers;
   produceShareIssuer.resolve(shareIssuer);
   produceShareBrand.resolve(shareBrand);


Reviews:
user: login: dckc
state: COMMENTED
author_association: MEMBER
submitted_at: 2024-11-14T02:52:20Z
user: login: dckc
state: COMMENTED
author_association: MEMBER
submitted_at: 2024-11-14T02:54:03Z
user: login: dckc
state: COMMENTED
author_association: MEMBER
submitted_at: 2024-11-14T02:56:09Z
user: login: dckc
state: COMMENTED
author_association: MEMBER
submitted_at: 2024-11-14T02:59:00Z
user: login: turadg
state: COMMENTED
author_association: MEMBER
submitted_at: 2024-11-14T15:14:56Z
user: login: kriskowal
state: COMMENTED
author_association: MEMBER
submitted_at: 2024-11-15T18:18:26Z
user: login: turadg
state: COMMENTED
author_association: MEMBER
submitted_at: 2024-11-15T18:21:10Z
user: login: turadg
state: COMMENTED
author_association: MEMBER
submitted_at: 2024-11-24T05:15:33Z
user: login: 0xpatrickdev
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2024-11-25T17:29:03Z
user: login: turadg
state: COMMENTED
author_association: MEMBER
submitted_at: 2024-11-25T17:34:26Z
user: login: turadg
state: COMMENTED
author_association: MEMBER
submitted_at: 2024-11-25T17:36:37Z
user: login: dckc
state: COMMENTED
author_association: MEMBER
submitted_at: 2024-11-27T18:07:58Z
user: login: dckc
body: looks pretty good so far
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-24T19:55:24Z
user: login: turadg
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-24T20:12:52Z
user: login: turadg
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-24T20:15:01Z
user: login: turadg
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-24T20:20:37Z
user: login: dckc
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-24T20:22:40Z
user: login: turadg
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-03-24T20:42:36Z
user: login: dckc
body: looks like this is ready to go
(once ci is green, of course)
state: APPROVED
author_association: MEMBER
submitted_at: 2025-03-24T22:00:54Z
user: login: 0xpatrickdev
body: 👏
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-03-24T22:35:25Z

Review comments:
diff_hunk: @@ -21,22 +18,18 @@ const TransactionFeedKitI = harden({
   }),
 });
 
-/**
- * @param {Zone} zone
- */
-export const prepareTransactionFeedKit = zone => {
+export const prepareTransactionFeedKit = (zone: Zone) => {
   const kinds = zone.mapStore('Kinds');
   const makeDurablePublishKit = prepareDurablePublishKit(
     kinds,
     'Transaction Feed',
   );
-  /** @type {PublishKit<CctpTxEvidence>} */
-  const { publisher, subscriber } = makeDurablePublishKit();
+  const { publisher, subscriber } =
+    makeDurablePublishKit() as PublishKit<CctpTxEvidence>;
 
path: packages/fast-usdc/src/exos/transaction-feed.ts
user: login: dckc
body: Is this a substantive change in static type checking?

Does casting with `as` require assignment compatibility? I think `@type` does.
created_at: 2024-11-14T02:52:19Z
author_association: MEMBER
diff_hunk: @@ -21,22 +18,18 @@ const TransactionFeedKitI = harden({
   }),
 });
 
-/**
- * @param {Zone} zone
- */
-export const prepareTransactionFeedKit = zone => {
+export const prepareTransactionFeedKit = (zone: Zone) => {
   const kinds = zone.mapStore('Kinds');
   const makeDurablePublishKit = prepareDurablePublishKit(
     kinds,
     'Transaction Feed',
   );
-  /** @type {PublishKit<CctpTxEvidence>} */
-  const { publisher, subscriber } = makeDurablePublishKit();
+  const { publisher, subscriber } =
+    makeDurablePublishKit() as PublishKit<CctpTxEvidence>;
 
path: packages/fast-usdc/src/exos/transaction-feed.ts
user: login: dckc
body: Should it use `makeDurablePublishKit<CctpTxEvidence>()` instead?
created_at: 2024-11-14T02:54:03Z
author_association: MEMBER
diff_hunk: @@ -8,7 +8,7 @@ import type { Zone } from '@agoric/zone';
 import type { VowTools } from '@agoric/vow';
 import { prepareAdvancer } from '../../src/exos/advancer.js';
 import { prepareStatusManager } from '../../src/exos/status-manager.js';
-import { prepareTransactionFeedKit } from '../../src/exos/transaction-feed.js';
+import { prepareTransactionFeedKit } from '../../src/exos/transaction-feed.ts';
path: packages/fast-usdc/test/exos/advancer.test.ts
user: login: dckc
body: It looks like the build step does just a bit more than erase types.

I guess bundleSource groks, though
created_at: 2024-11-14T02:56:08Z
author_association: MEMBER
diff_hunk: @@ -102,10 +101,9 @@ export const contract = async (zcf, privateArgs, zone, tools) => {
      *
      * Provide an API call in the form of an invitation maker, so that the
      * capability is available in the smart-wallet bridge.
-     *
-     * @param {CctpTxEvidence} evidence
+     * @param evidence
path: packages/fast-usdc/src/fast-usdc.contract.ts
user: login: dckc
body: Is this `@param` still necessary?
Perhaps only until we tell eslint otherwise?
created_at: 2024-11-14T02:59:00Z
author_association: MEMBER
diff_hunk: @@ -102,10 +101,9 @@ export const contract = async (zcf, privateArgs, zone, tools) => {
      *
      * Provide an API call in the form of an invitation maker, so that the
      * capability is available in the smart-wallet bridge.
-     *
-     * @param {CctpTxEvidence} evidence
+     * @param evidence
path: packages/fast-usdc/src/fast-usdc.contract.ts
user: login: turadg
body: Right. Our eslint config is that if there's a jsdoc comment on a function it must have params. I'd like to leave changing out that as out of scope of this PR. 
created_at: 2024-11-14T15:14:56Z
author_association: MEMBER
diff_hunk: @@ -102,10 +101,9 @@ export const contract = async (zcf, privateArgs, zone, tools) => {
      *
      * Provide an API call in the form of an invitation maker, so that the
      * capability is available in the smart-wallet bridge.
-     *
-     * @param {CctpTxEvidence} evidence
+     * @param evidence
path: packages/fast-usdc/src/fast-usdc.contract.ts
user: login: kriskowal
body: It’s not awful to have a place to document the meaning of the param for tsdoc. We just don’t have to note the type.
created_at: 2024-11-15T18:18:25Z
author_association: MEMBER
diff_hunk: @@ -21,22 +18,18 @@ const TransactionFeedKitI = harden({
   }),
 });
 
-/**
- * @param {Zone} zone
- */
-export const prepareTransactionFeedKit = zone => {
+export const prepareTransactionFeedKit = (zone: Zone) => {
   const kinds = zone.mapStore('Kinds');
   const makeDurablePublishKit = prepareDurablePublishKit(
     kinds,
     'Transaction Feed',
   );
-  /** @type {PublishKit<CctpTxEvidence>} */
-  const { publisher, subscriber } = makeDurablePublishKit();
+  const { publisher, subscriber } =
+    makeDurablePublishKit() as PublishKit<CctpTxEvidence>;
 
path: packages/fast-usdc/src/exos/transaction-feed.ts
user: login: turadg
body: Once that type is generic, yes
created_at: 2024-11-15T18:21:10Z
author_association: MEMBER
diff_hunk: @@ -21,22 +18,18 @@ const TransactionFeedKitI = harden({
   }),
 });
 
-/**
- * @param {Zone} zone
- */
-export const prepareTransactionFeedKit = zone => {
+export const prepareTransactionFeedKit = (zone: Zone) => {
   const kinds = zone.mapStore('Kinds');
   const makeDurablePublishKit = prepareDurablePublishKit(
     kinds,
     'Transaction Feed',
   );
-  /** @type {PublishKit<CctpTxEvidence>} */
-  const { publisher, subscriber } = makeDurablePublishKit();
+  const { publisher, subscriber } =
+    makeDurablePublishKit() as PublishKit<CctpTxEvidence>;
 
path: packages/fast-usdc/src/exos/transaction-feed.ts
user: login: turadg
body: Done now
created_at: 2024-11-24T05:15:33Z
author_association: MEMBER
diff_hunk: @@ -31,18 +27,18 @@ const TransactionFeedKitI = harden({
   }),
 });
 
-/**
- * @param {Zone} zone
- * @param {ZCF} zcf
- */
-export const prepareTransactionFeedKit = (zone, zcf) => {
-  const kinds = zone.mapStore('Kinds');
+interface State {
+  operators: MapStore<string, OperatorKit>;
+  pending: MapStore<string, MapStore<string, CctpTxEvidence>>;
+}
+
+export const prepareTransactionFeedKit = (zone: Zone, zcf: ZCF) => {
+  const kinds = zone.mapStore<string, unknown>('Kinds');
path: packages/fast-usdc/src/exos/transaction-feed.ts
user: login: 0xpatrickdev
body: Why is this unknown?
created_at: 2024-11-25T17:22:07Z
author_association: CONTRIBUTOR
diff_hunk: @@ -71,24 +68,21 @@ export const prepareTransactionFeedKit = (zone, zcf) => {
          * oracle network, with the able to submit data to submit evidence of
          * CCTP transactions.
          *
-         * @param {string} operatorId unique per contract instance
-         * @returns {Promise<Invitation<OperatorKit>>}
+         * @param operatorId unique per contract instance
          */
-        makeOperatorInvitation(operatorId) {
+        makeOperatorInvitation(
+          operatorId: string,
+        ): Promise<Invitation<OperatorKit>> {
path: packages/fast-usdc/src/exos/transaction-feed.ts
user: login: 0xpatrickdev
body: Why type the return? It seems the same value is inferred
created_at: 2024-11-25T17:24:35Z
author_association: CONTRIBUTOR
diff_hunk: @@ -71,24 +68,21 @@ export const prepareTransactionFeedKit = (zone, zcf) => {
          * oracle network, with the able to submit data to submit evidence of
          * CCTP transactions.
          *
-         * @param {string} operatorId unique per contract instance
-         * @returns {Promise<Invitation<OperatorKit>>}
+         * @param operatorId unique per contract instance
          */
-        makeOperatorInvitation(operatorId) {
+        makeOperatorInvitation(
+          operatorId: string,
+        ): Promise<Invitation<OperatorKit>> {
path: packages/fast-usdc/src/exos/transaction-feed.ts
user: login: turadg
body: Just moved from what was there. I'll leave since it doesn't hurt to be explicit
created_at: 2024-11-25T17:34:26Z
author_association: MEMBER
diff_hunk: @@ -31,18 +27,18 @@ const TransactionFeedKitI = harden({
   }),
 });
 
-/**
- * @param {Zone} zone
- * @param {ZCF} zcf
- */
-export const prepareTransactionFeedKit = (zone, zcf) => {
-  const kinds = zone.mapStore('Kinds');
+interface State {
+  operators: MapStore<string, OperatorKit>;
+  pending: MapStore<string, MapStore<string, CctpTxEvidence>>;
+}
+
+export const prepareTransactionFeedKit = (zone: Zone, zcf: ZCF) => {
+  const kinds = zone.mapStore<string, unknown>('Kinds');
path: packages/fast-usdc/src/exos/transaction-feed.ts
user: login: turadg
body: I just didn't know what to type it and this worked
created_at: 2024-11-25T17:36:36Z
author_association: MEMBER
diff_hunk: @@ -8,65 +8,62 @@ import { observeIteration, subscribeEach } from '@agoric/notifier';
 import {
   OrchestrationPowersShape,
   withOrchestration,
+  type Denom,
+  type OrchestrationAccount,
+  type OrchestrationPowers,
+  type OrchestrationTools,
 } from '@agoric/orchestration';
+import { makeZoeTools } from '@agoric/orchestration/src/utils/zoe-tools.js';
 import { provideSingleton } from '@agoric/zoe/src/contractSupport/durability.js';
 import { prepareRecorderKitMakers } from '@agoric/zoe/src/contractSupport/recorder.js';
-import { makeZoeTools } from '@agoric/orchestration/src/utils/zoe-tools.js';
 import { depositToSeat } from '@agoric/zoe/src/contractSupport/zoeHelpers.js';
 import { E } from '@endo/far';
 import { M, objectMap } from '@endo/patterns';
+import type { Zone } from '@agoric/zone';
path: packages/fast-usdc/src/fast-usdc.contract.ts
user: login: dckc
body: I was concerned that conversion to .ts would mean that type imports have to be changed from devDependencies to dependencies, but I don't see a change to `package.json` for `@agoric/zone`, so evidently not. Interesting.
created_at: 2024-11-27T18:07:58Z
author_association: MEMBER
diff_hunk: @@ -1,43 +1,45 @@
+import { OperatorKitI } from '@agoric/fast-usdc/src/operator-kit-interface.js';
 import { makeTracer } from '@agoric/internal';
+import type { Zone } from '@agoric/zone';
 import { Fail } from '@endo/errors';
-import { OperatorKitI } from '@agoric/fast-usdc/src/operator-kit-interface.js';
-
-const trace = makeTracer('TxOperator');
+import type {
+  CctpTxEvidence,
+  RiskAssessment,
+} from '@agoric/fast-usdc/src/types.js';
 
-/**
- * @import {Zone} from '@agoric/zone';
- * @import {CctpTxEvidence, RiskAssessment} from '@agoric/fast-usdc/src/types.js';
- */
+const trace: (message: string) => void = makeTracer('TxOperator');
path: packages/fast-usdc-contract/src/exos/operator-kit.ts
user: login: dckc
body: I guess this type suffices for the usage in this file, but I'd expect:

```suggestion
const trace: (...args: unknown[]) => void = makeTracer('TxOperator');
```
created_at: 2025-03-24T19:40:55Z
author_association: MEMBER
diff_hunk: @@ -64,33 +66,34 @@ export const prepareOperatorKit = (zone, staticPowers) =>
          * place, rather than as a means of performing it as in the
          * fluxAggregator contract used for price oracles.
          *
-         * @param {CctpTxEvidence} evidence
-         * @param {RiskAssessment} [riskAssessment]
-         * @returns {Promise<Invitation>}
+         * @param evidence
+         * @param riskAssessment
          */
-        async SubmitEvidence(evidence, riskAssessment) {
+        async SubmitEvidence(
+          evidence: CctpTxEvidence,
+          riskAssessment: RiskAssessment,
+        ): Promise<Invitation> {
           const { operator } = this.facets;
           operator.submitEvidence(evidence, riskAssessment);
-          return staticPowers.makeInertInvitation(
-            'evidence was pushed in the invitation maker call',
path: packages/fast-usdc-contract/src/exos/operator-kit.ts
user: login: dckc
body: so this arg was bogus? interesting.
created_at: 2025-03-24T19:42:45Z
author_association: MEMBER
diff_hunk: @@ -32,20 +53,7 @@ const TXNS_NODE = 'txns';
 const FEE_NODE = 'feeConfig';
 const ADDRESSES_BAGGAGE_KEY = 'addresses';
 
-/**
- * @import {HostInterface} from '@agoric/async-flow';
- * @import {CosmosChainInfo, Denom, DenomDetail, OrchestrationAccount, IBCConnectionInfo} from '@agoric/orchestration';
- * @import {OrchestrationPowers, OrchestrationTools} from '@agoric/orchestration/src/utils/start-helper.js';
- * @import {Remote} from '@agoric/internal';
- * @import {Marshaller, StorageNode} from '@agoric/internal/src/lib-chainStorage.js'
- * @import {Zone} from '@agoric/zone';
- * @import {OperatorOfferResult} from './exos/transaction-feed.js';
- * @import {ContractRecord, FastUsdcTerms, FeeConfig} from '@agoric/fast-usdc/src/types.js';
- */
-
-/** @type {ContractMeta<typeof start>} */
 export const meta = {
-  // @ts-expect-error TypedPattern not recognized as record
path: packages/fast-usdc-contract/src/fast-usdc.contract.ts
user: login: dckc
body: I wonder why this `@ts-expect-error` can go away.

Is it because of the use of `as` rather than `const meta: ContractMeta<typeof start> = ...`? I'd rather not use `as` in that case.

not critical, I suppose.
created_at: 2025-03-24T19:47:54Z
author_association: MEMBER
diff_hunk: @@ -282,10 +284,12 @@ export const contract = async (zcf, privateArgs, zone, tools) => {
     makeLocalAccount(),
   );
   // when() is OK here since this clearly resolves promptly.
-  /** @type {[HostInterface<OrchestrationAccount<{chainId: 'agoric-3';}>>, HostInterface<OrchestrationAccount<{chainId: 'agoric-3';}>>]} */
-  const [poolAccount, settlementAccount] = await vowTools.when(
+  const [poolAccount, settlementAccount] = (await vowTools.when(
     vowTools.all([poolAccountV, settleAccountV]),
-  );
+  )) as [
+    HostInterface<OrchestrationAccount<{ chainId: 'agoric-3' }>>,
+    HostInterface<OrchestrationAccount<{ chainId: 'agoric-3' }>>,
path: packages/fast-usdc-contract/src/fast-usdc.contract.ts
user: login: dckc
body: using `agoric-3` as static type info sure feels odd when that's not necessarily the runtime value
(_It predates this change, though, so... oh well._)

created_at: 2025-03-24T19:50:13Z
author_association: MEMBER
diff_hunk: @@ -1,6 +1,9 @@
 {
   "extends": "../../tsconfig.json",
-  "compilerOptions": {},
+  "compilerOptions": {
+    "allowImportingTsExtensions": true,
+    "rewriteRelativeImportExtensions": true
path: packages/fast-usdc/tsconfig.json
user: login: dckc
body: we don't need these compilerOptions in the other Fast USDC packages?

created_at: 2025-03-24T19:52:47Z
author_association: MEMBER
diff_hunk: @@ -64,33 +66,34 @@ export const prepareOperatorKit = (zone, staticPowers) =>
          * place, rather than as a means of performing it as in the
          * fluxAggregator contract used for price oracles.
          *
-         * @param {CctpTxEvidence} evidence
-         * @param {RiskAssessment} [riskAssessment]
-         * @returns {Promise<Invitation>}
+         * @param evidence
+         * @param riskAssessment
          */
-        async SubmitEvidence(evidence, riskAssessment) {
+        async SubmitEvidence(
+          evidence: CctpTxEvidence,
+          riskAssessment: RiskAssessment,
+        ): Promise<Invitation> {
           const { operator } = this.facets;
           operator.submitEvidence(evidence, riskAssessment);
-          return staticPowers.makeInertInvitation(
-            'evidence was pushed in the invitation maker call',
path: packages/fast-usdc-contract/src/exos/operator-kit.ts
user: login: turadg
body: yeah, not caught in .js syntax for some reason. rather that investigate I'd prefer to move to .ts to avoid such complexities
created_at: 2025-03-24T20:12:52Z
author_association: MEMBER
diff_hunk: @@ -1,6 +1,9 @@
 {
   "extends": "../../tsconfig.json",
-  "compilerOptions": {},
+  "compilerOptions": {
+    "allowImportingTsExtensions": true,
+    "rewriteRelativeImportExtensions": true
path: packages/fast-usdc/tsconfig.json
user: login: turadg
body: good question.`allowImportingTsExtensions` is already true everywhere, so I'm removing it. 
`rewriteRelativeImportExtensions` is necessary only for published packages (so the dist has `.js` files and imports instead)
created_at: 2025-03-24T20:15:00Z
author_association: MEMBER
diff_hunk: @@ -1,6 +1,9 @@
 {
   "extends": "../../tsconfig.json",
-  "compilerOptions": {},
+  "compilerOptions": {
+    "allowImportingTsExtensions": true,
+    "rewriteRelativeImportExtensions": true
path: packages/fast-usdc/tsconfig.json
user: login: turadg
body: I shouldn't have made any changes to this package tho. Right now I just want to update unpublished packages. I'll remove that commit and force push. 
created_at: 2025-03-24T20:20:36Z
author_association: MEMBER
diff_hunk: @@ -1,6 +1,9 @@
 {
   "extends": "../../tsconfig.json",
-  "compilerOptions": {},
+  "compilerOptions": {
+    "allowImportingTsExtensions": true,
+    "rewriteRelativeImportExtensions": true
path: packages/fast-usdc/tsconfig.json
user: login: dckc
body: > ... so the dist has `.js` files ...

are those dist files generated with `ts-blank-space`?

or are we publishing the stuff that `tsc` generates? does it have `var` and cjs and such?
created_at: 2025-03-24T20:22:40Z
author_association: MEMBER
diff_hunk: @@ -1,6 +1,9 @@
 {
   "extends": "../../tsconfig.json",
-  "compilerOptions": {},
+  "compilerOptions": {
+    "allowImportingTsExtensions": true,
+    "rewriteRelativeImportExtensions": true
path: packages/fast-usdc/tsconfig.json
user: login: turadg
body: when there is a `dist` generated, it's with `tsc`. e.g. https://github.com/Agoric/agoric-sdk/blob/85e8b186d36f3a7ed4d83b223414ca2600284693/packages/orchestration/package.json#L14-L16
created_at: 2025-03-24T20:42:36Z
author_association: MEMBER

PR comments:
user: login: cloudflare-workers-and-pages[bot]
created_at: 2024-11-24T01:51:37Z
body: ## Deploying agoric-sdk with &nbsp;<a href="https://pages.dev"><img alt="Cloudflare Pages" src="https://user-images.githubusercontent.com/23264/106598434-9e719e00-654f-11eb-9e59-6167043cfa01.png" width="16"></a> &nbsp;Cloudflare Pages

<table><tr><td><strong>Latest commit:</strong> </td><td>
<code>60256aa</code>
</td></tr>
<tr><td><strong>Status:</strong></td><td>&nbsp;✅&nbsp; Deploy successful!</td></tr>
<tr><td><strong>Preview URL:</strong></td><td>
<a href='https://0b699b6a.agoric-sdk.pages.dev'>https://0b699b6a.agoric-sdk.pages.dev</a>
</td></tr>
<tr><td><strong>Branch Preview URL:</strong></td><td>
<a href='https://ta-fu-ts.agoric-sdk.pages.dev'>https://ta-fu-ts.agoric-sdk.pages.dev</a>
</td></tr>
</table>

[View logs](https://dash.cloudflare.com/0c4635effffcd7f36d1b9f0425a4367a/pages/view/agoric-sdk/0b699b6a-5700-4f1a-ae92-95fb79ebe3c7)

author_association: NONE
user: login: github-actions[bot]
created_at: 2024-11-24T04:44:24Z
body: Base branch is changed to master. Please re-run the integration tests by adding 'force:integration' label.
author_association: NONE
user: login: turadg
created_at: 2024-11-25T18:00:52Z
body: I'll hold off until in-flight FU PRs are landed so this doesn't create merge conflicts for them
author_association: MEMBER
user: login: turadg
created_at: 2025-01-24T23:17:31Z
body: Punting this to https://github.com/Agoric/agoric-sdk/issues/10811
author_association: MEMBER
user: login: mergify[bot]
created_at: 2025-03-24T21:31:53Z
body: This pull request has been removed from the queue for the following reason: <code>checks failed</code>.

The merge conditions cannot be satisfied due to failing checks:
- ❌ [integration-test-result](https://github.com/Agoric/agoric-sdk/runs/39325223677)
- ☑️ [linear-history](https://github.com/Agoric/agoric-sdk/actions/runs/14045473450/job/39325213379)
- ☑️ [linear-history](https://github.com/Agoric/agoric-sdk/actions/runs/14045471424/job/39325208721)
- ☑️ [linear-history](https://github.com/Agoric/agoric-sdk/actions/runs/14045470517/job/39325206111)
- ☑️ [no-fixup-commits](https://github.com/Agoric/agoric-sdk/actions/runs/14045471424/job/39325207812)
- ☑️ [no-fixup-commits](https://github.com/Agoric/agoric-sdk/actions/runs/14045470517/job/39325205329)


You may have to fix your CI before adding the pull request to the queue again.

If you want to requeue this pull request, you can post a `@mergifyio requeue` comment.

author_association: CONTRIBUTOR
user: login: mergify[bot]
created_at: 2025-03-24T22:06:13Z
body: This pull request has been removed from the queue for the following reason: <code>checks failed</code>.

The merge conditions cannot be satisfied due to failing checks:
- 🛑 [integration-test-result](https://github.com/Agoric/agoric-sdk/runs/39328042709)
- ☑️ [linear-history](https://github.com/Agoric/agoric-sdk/actions/runs/14046397277/job/39328035448)


You may have to fix your CI before adding the pull request to the queue again.

If you want to requeue this pull request, you can post a `@mergifyio requeue` comment.

author_association: CONTRIBUTOR
user: login: turadg
created_at: 2025-03-24T22:24:34Z
body: @mergify requeue
author_association: MEMBER
user: login: mergify[bot]
created_at: 2025-03-24T22:24:38Z
body: > requeue

#### ☑️ This pull request is already queued



<!---
DO NOT EDIT
-*- Mergify Payload -*-
{"command": "requeue", "conclusion": "neutral", "action_is_running": true}
-*- Mergify Payload End -*-
-->
author_association: CONTRIBUTOR