Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(SwingSet): Add a tool for classifying unsettled promises #8499

Merged
merged 8 commits into from
Jan 5, 2024

Conversation

gibson042
Copy link
Member

Ref #8336

Description

Usage: packages/SwingSet/misc-tools/classify-promises.js /path/to/mezzanine-db.sqlite
Classifies unsettled promises into known patterns.

ENVIRONMENT
  WALLET_FACTORY_VAT_ID='v43'
  ZOE_VAT_ID='v9'
  VAT_ADMIN_SERVICE_KREF='ko25'
  ZOE_SERVICE_KREF='ko65'

Status as of opening draft PR: 348 / 414 (84%)

$ packages/SwingSet/misc-tools/classify-promises.js /mnt/Downloads/run-9-slog.sqlite | wc -l
414
$ packages/SwingSet/misc-tools/classify-promises.js /mnt/Downloads/run-9-slog.sqlite | grep unknown | \
  jq -c '{ decider, subscriber, type }' | sort | uniq -c
      1 {"decider":"v14","subscriber":"v28","type":"unknown - not send+subscribe"}
      9 {"decider":"v14","subscriber":"v28","type":"unknown E(...).getUpdateSince(...)"}
      1 {"decider":"v14","subscriber":"v43","type":"unknown - not send+subscribe"}
      3 {"decider":"v29","subscriber":"v46","type":"unknown E(...).getUpdateSince(...)"}
     23 {"decider":"v43","subscriber":"v10","type":"unknown send result E(...).fromBridge(...)"}
      1 {"decider":"v45","subscriber":"v48","type":"unknown - not send+subscribe"}
      1 {"decider":"v46","subscriber":"v45","type":"unknown E(...).getUpdateSince(...)"}
      2 {"decider":"v46","subscriber":"v48","type":"unknown E(...).getUpdateSince(...)"}
      1 {"decider":"v5","subscriber":"v23","type":"unknown E(...).getUpdateSince(...)"}
      1 {"decider":"v5","subscriber":"v48","type":"unknown E(...).getUpdateSince(...)"}
     23 {"decider":"v9","subscriber":"v63","type":"unknown E(...).getUpdateSince(...)"}

Security Considerations

n/a

Scaling Considerations

Queries against the "mezzanine" database have not been optimized, but performance seems reasonable with the given data set (on my machine, about 5 seconds to classify all unsettled mainnet promises).

Documentation Considerations

Admittedly a bit sparse, but this is a special-purpose internal tool. build-mezzanine-db.js itself is also missing from the repository (I've used a direct copy from @warner).

Testing Considerations

Also lacking (and for the same reason).

Upgrade Considerations

This tool supports identification of issues that must be resolved before upgrading vats.

@gibson042 gibson042 requested a review from warner November 6, 2023 15:24
@gibson042 gibson042 marked this pull request as draft November 6, 2023 15:24
@gibson042 gibson042 force-pushed the gibson-8336-classify-promises branch 3 times, most recently from f307e28 to 615fb90 Compare November 6, 2023 19:55
@gibson042
Copy link
Member Author

OK, I think this now provides enough information to provide a complete analysis.

$ packages/SwingSet/misc-tools/classify-promises.js /mnt/Downloads/run-9-slog.sqlite | \
  jq -c '{ decider, subscriber, type, details: (try (.details | keys_unsorted)) }' | sort | uniq -c | \
  sed 's/\([{,}]\)"\([^"]*\)":/\1 \2: /g; s/\(.\)$/ \1/; s/"v[0-9]"/ &/g;' 
      9 { decider: "v14", subscriber: "v28", type: "unknown E(<Alleged: PublishKit subscriber>).getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }
      1 { decider: "v14", subscriber: "v28", type: "unknown PublishKit tail", details: ["subscribeRequest","containingResult"] }
      1 { decider: "v14", subscriber: "v43", type: "unknown PublishKit tail", details: ["subscribeRequest","containingResult"] }
     13 { decider:  "v2", subscriber:  "v9", type: "Zoe E(contractInstanceAdminNode).done()", details: ["vatName"] }
     12 { decider:  "v2", subscriber:  "v9", type: "Zoe E(governor contractInstanceAdminNode).done()", details: ["subject"] }
      8 { decider:  "v2", subscriber:  "v9", type: "Zoe E(mintHolder contractInstanceAdminNode).done()", details: ["for"] }
      6 { decider:  "v2", subscriber:  "v9", type: "Zoe E(psm contractInstanceAdminNode).done()", details: ["pair"] }
     11 { decider:  "v2", subscriber:  "v9", type: "Zoe E(voteCounter contractInstanceAdminNode).done()", details: ["deadline"] }
      3 { decider: "v29", subscriber: "v46", type: "unknown E(<Alleged: QuoteNotifier>).getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }
     23 { decider: "v43", subscriber: "v10", type: "wallet spend action: executeOffer", details: ["blockHeight","blockTime","owner","spendAction","type"] }
      1 { decider: "v45", subscriber: "v48", type: "unknown PublishKit tail", details: ["subscribeRequest","containingResult"] }
      1 { decider: "v46", subscriber: "v45", type: "unknown E(<Alleged: QuoteNotifier>).getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }
      2 { decider: "v46", subscriber: "v48", type: "unknown E(<Alleged: QuoteNotifier>).getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }
      1 { decider:  "v5", subscriber: "v23", type: "unknown E(<Alleged: timerNotifier notifier>).getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }
      1 { decider:  "v5", subscriber: "v48", type: "unknown E(<Alleged: timerNotifier notifier>).getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }
     24 { decider:  "v9", subscriber: "v43", type: "E(invitation)[getPayouts](...)", details: ["invitationSourceVatID","invitationCreatorKref","invitationKpid"] }
     24 { decider:  "v9", subscriber: "v43", type: "E(invitation)[numWantsSatisfied](...)", details: ["invitationSourceVatID","invitationCreatorKref","invitationKpid"] }
    250 { decider:  "v9", subscriber: "v43", type: "WalletFactory E(likelyPurse).getCurrentAmountNotifier(...) .getUpdateSince(...)", details: ["likelyPurseKref"] }
     23 { decider:  "v9", subscriber: "v63", type: "E(zoeInstanceAdmin).getExitSubscriber(likelySeatHandle) .getUpdateSince(...)", details: ["contractBundleID"] }

@gibson042 gibson042 marked this pull request as ready for review November 6, 2023 21:16
@gibson042
Copy link
Member Author

gibson042 commented Dec 6, 2023

Promise Analysis

v14-bank-v28-provisionpool

  9 { decider: "v14", subscriber: "v28", type: "unknown E(<Alleged: PublishKit subscriber>).getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }

consume: https://github.com/Agoric/agoric-sdk/blob/release-mainnet1B/packages/vats/src/provisionPoolKit.js#L351
produce: https://github.com/Agoric/agoric-sdk/blob/release-mainnet1B/packages/ERTP/src/purse.js#L81
v28-provisionPool instantiates a "latest" notifier for each asset type from v14-bank, but if the latter is upgraded then the exported E(exchangePurse).getCurrentAmountNotifier() (backed by a transient notifier kit notifier) will be dropped and the observeNotifier will break. This can be fixed by instead reissuing the call to getCurrentAmountNotifier() upon disconnection, but until it is fixed, vat-bank cannot be restarted.


  1 { decider: "v14", subscriber: "v28", type: "unknown PublishKit tail", details: ["subscribeRequest","containingResult"] }
  1 { decider: "v14", subscriber: "v43", type: "unknown PublishKit tail", details: ["subscribeRequest","containingResult"] }

The associated head value for each of these is an identical { brand: ATOM, denom: "ibc/…", issuer: ATOM, issuerName: "ATOM", proposedName: "ATOM" }, and the subscription originates in v28-provisionPool.
consume is probably https://github.com/Agoric/agoric-sdk/blob/release-mainnet1B/packages/vats/src/provisionPoolKit.js#L343 observeIteration(subscribeEach(E(poolBank).getAssetSubscription()), …).
produce is probably https://github.com/Agoric/agoric-sdk/blob/release-mainnet1B/packages/vats/src/vat-bank.js#L449 provideAssetSubscription(this.state.brandToAssetDescriptor, this.state.assetSubscriber).
This combination appears robust against the publisher (vat-bank) restarting, and safety against the subscriber restarting also appears good if start is called in each incarnation (which it seems to be).

Testing should cover recognition of new bank assets in the subscribing vats (e.g., producer restart: restart vat-provisionPool, then add an asset to vat-bank and confirm a reaction in the consuming provisionPool).

v2-vat-admin-v9-zoe

 13 { decider:  "v2", subscriber:  "v9", type: "Zoe E(contractInstanceAdminNode).done()", details: ["vatName"] }
 12 { decider:  "v2", subscriber:  "v9", type: "Zoe E(governor contractInstanceAdminNode).done()", details: ["subject"] }
  8 { decider:  "v2", subscriber:  "v9", type: "Zoe E(mintHolder contractInstanceAdminNode).done()", details: ["for"] }
  6 { decider:  "v2", subscriber:  "v9", type: "Zoe E(psm contractInstanceAdminNode).done()", details: ["pair"] }
 11 { decider:  "v2", subscriber:  "v9", type: "Zoe E(voteCounter contractInstanceAdminNode).done()", details: ["deadline"] }

produce: https://github.com/Agoric/agoric-sdk/blob/release-mainnet1B/packages/SwingSet/src/vats/vat-admin/vat-vat-admin.js#L270-L281 returns the promise from runningVats.get(state.vatID), where runningVats is a heap Map<VatID, PromiseKit> that is initialized with fresh data from baggage on restart
consume: https://github.com/Agoric/agoric-sdk/blob/release-mainnet1B/packages/zoe/src/zoeService/startInstance.js#L277-L283 is E.when(E(adminNode).done(), <exitAllSeats>, <failAllSeats>)
This is #8263, an open hazard. vat-vatadmin cannot be upgraded before Zoe.
More important still is #8387, Zoe forgetting about these promises when restarting.

v29-pricefeed-v46-scaledpriceauthority

  3 { decider: "v29", subscriber: "v46", type: "unknown E(<Alleged: QuoteNotifier>).getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }

v46 is scaledPriceAuthority-ATOM and v29 is ATOM-USD_price_feed. Both vats are explicitly non-upgradable, and talk to each other. They probably just need to be replaced, but cf. https://github.com/Agoric/agoric-sdk/blob/release-mainnet1B/packages/zoe/src/contractSupport/priceAuthorityInitial.js#L83 .

  • no tickets filed yet

v43-wallet-v10-bridge

 23 { decider: "v43", subscriber: "v10", type: "wallet spend action: executeOffer", details: ["blockHeight","blockTime","owner","spendAction","type"] }

produce/consume: https://github.com/Agoric/agoric-sdk/blob/release-mainnet1B/packages/vats/src/bridge.js#L151 is void this.state.scopedManagers.get(srcID).fromBridge(obj), where srcID is "wallet" and obj is { type: "WALLET_SPEND_ACTION", owner: string, spendAction: "<JSON-serialized board-compatible CapData>", … } and fromBridge is E(inboundHandler).fromBridge(obj) which is https://github.com/Agoric/agoric-sdk/blob/release-mainnet1B/packages/smart-wallet/src/walletFactory.js#L200 E(wallet).handleBridgeAction(actionCapData, canSpend) which goes into https://github.com/Agoric/agoric-sdk/blob/release-mainnet1B/packages/smart-wallet/src/smartWallet.js smart wallet handling.

This should be fine as long as the unhandled rejection does not crash the bridge vat, but we should dig in on the spendAction details to investigate potential long-unsettled promises.

  • no tickets filed yet

v45-auctioneer-v48-vaultfactory

  1 { decider: "v45", subscriber: "v48", type: "unknown PublishKit tail", details: ["subscribeRequest","containingResult"] }

v45 is auctioneer; v48 is vaultFactory. The associated head value is { current: { AuctionStartDelay: { type: "relativeTime", value: <TimerBrandAmount> }, ClockStep: <ibid>, PriceLockPeriod: <ibid>, StartFrequency: <ibid>, DiscountStep: { type: "nat", value: <bigint> }, LowestRate: <ibid>, StartingRate: <ibid>, Electorate: { type: "invitation", value: <ZoeInvitationBrandAmount> } } }.

It looks like governance is non-durable, and therefore restarting the producer permanently breaks the consumer. This needs followup. cf. https://github.com/Agoric/agoric-sdk/blob/release-mainnet1B/packages/inter-protocol/src/vaultFactory/liquidation.js#L211

v46-scaledpriceauthority-v45-auctioneer-v48-vaultfactory

  1 { decider: "v46", subscriber: "v45", type: "unknown E(<Alleged: QuoteNotifier>).getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }
  2 { decider: "v46", subscriber: "v48", type: "unknown E(<Alleged: QuoteNotifier>).getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }

v45-auctioneer and v48-vaultFactory need to be taught about a replacement price authority before we can replace v46 and v29. Ticket TBD.

  • no tickets filed yet

v5-timer-v23-feedistributor-v48-vaultfactory

  1 { decider:  "v5", subscriber: "v23", type: "unknown E(<Alleged: timerNotifier notifier>).getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }
  1 { decider:  "v5", subscriber: "v48", type: "unknown E(<Alleged: timerNotifier notifier>).getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }

v48 is vaultFactory, which at https://github.com/Agoric/agoric-sdk/blob/release-mainnet1B/packages/inter-protocol/src/vaultFactory/vaultManager.js#L360-L368 consumes like void observeNotifier(periodNotifier = <E(timerService).makeNotifier(…)>, …) and will reissue getUpdateSince() against a non-rejected reference to the timer notifier (which is itself durable).

v23 is feeDistributor, and https://github.com/Agoric/agoric-sdk/blob/release-mainnet1B/packages/inter-protocol/src/feeDistributor.js#L92-L98 follows the same pattern.

Both vats appear to be non-upgradeable, because the exported facets are non-durable (e.g., trace through feeDistributor start).

vaultFactory appears prepared for upgrade, however we should find a way to test it

v23-feeDistributor does not appear to be upgradable. If #8730 reveals that the feeDistributor would break upon v5-timer upgrade, we must find a way to replace the feeDistributor service entirely before we can upgrade v5-timer.

v9-zoe-v43-wallet

 24 { decider:  "v9", subscriber: "v43", type: "E(invitation)[getPayouts](...)", details: ["invitationSourceVatID","invitationCreatorKref","invitationKpid"] }
 24 { decider:  "v9", subscriber: "v43", type: "E(invitation)[numWantsSatisfied](...)", details: ["invitationSourceVatID","invitationCreatorKref","invitationKpid"] }

produce: https://github.com/Agoric/agoric-sdk/blob/release-mainnet1B/packages/zoe/src/zoeService/zoeSeat.js#L318 and https://github.com/Agoric/agoric-sdk/blob/release-mainnet1B/packages/zoe/src/zoeService/zoeSeat.js#L265-L273 are both E.when(state.subscriber.subscribeAfter(), …), where the subscriber is from a durable publish kit.
consume: https://github.com/Agoric/agoric-sdk/blob/release-mainnet1B/packages/smart-wallet/src/offers.js#L143-L162 are E.when(E(seatRef).<methodName>(), …), which has no recovery upon disconnection from Zoe upgrade (#8292). It is also affected by #8445, in which offer tracking is lost on subscriber restart.


250 { decider:  "v9", subscriber: "v43", type: "WalletFactory E(likelyPurse).getCurrentAmountNotifier(...) .getUpdateSince(...)", details: ["likelyPurseKref"] }

produce: https://github.com/Agoric/agoric-sdk/blob/release-mainnet1B/packages/ERTP/src/purse.js#L80 (but see also https://github.com/Agoric/agoric-sdk/blob/release-mainnet1B/packages/vats/src/virtual-purse.js#L238 for vat-bank) is <makeTransientNotifier().provideNotifier>(this.facets.purse), which is <provideLazy(makeScalarBigWeakMapStore('transientNotifierKits'), this.facets.purse, () => makeNotifierKit(this.facets.purse.getCurrentAmount()))>.notifier
consume: https://github.com/Agoric/agoric-sdk/blob/release-mainnet1B/packages/smart-wallet/src/smartWallet.js#L436 and https://github.com/Agoric/agoric-sdk/blob/release-mainnet1B/packages/wallet/api/src/lib-wallet.js#L834 are both observeNotifier(E(purse).getCurrentAmountNotifier(), {…}), which holds the notifier and resends .getUpdateSince(localUpdateCount) to it any such call fails with a disconnection (but note that .getCurrentAmountNotifier() itself is not resent)

v9-zoe-v63-KREAd

 23 { decider:  "v9", subscriber: "v63", type: "E(zoeInstanceAdmin).getExitSubscriber(likelySeatHandle) .getUpdateSince(...)", details: ["contractBundleID"] }

produce: https://github.com/Agoric/agoric-sdk/blob/release-mainnet1B/packages/zoe/src/zoeService/startInstance.js#L151 is state.seatHandleToSeatAdmin.get(seatHandle).getExitSubscriber(), where seatHandleToZoeSeatAdmin is a durable WeakMapStore<SeatHandle, ZoeSeatAdmin> in the Zoe vat and ZoeSeatAdmin getExitSubscriber is the subscriber is from a durable publish kit associated with Zoe seat exit
consume: KREAd code TBD, but they are safe if and only if they use observeNotifier or some other code that looks for disconnection—if not, then upgrading Zoe may confuse them into mistakenly concluding that a seat has failed.

@gibson042
Copy link
Member Author

gibson042 commented Dec 13, 2023

Differences from run 9 to run 14: git diff --no-index --word-diff-regex='[[:alnum:]_]+|.' --word-diff=plain run-{9,14}-summary.txt | sed -r '1,/@@/d; s#^[[:space:]]+##; s#[[]-#❌<del>#g; s#-[]]#</del>❌#g; s#[{][+]#🟩<ins>#g; s#[+][}]#</ins>🟩#g; s#[]][(]#]\\(#g;'

$ git diff --no-index --word-diff-regex='[[:alnum:]_]+|.' --word-diff=plain run-{9,14}-summary.txt | sed -r '1,/@@/d; s#^[[:space:]]+##; s#<#\<#g; s#[[]-#❌#g; s#-[]]#❌#g; s#[{][+]#🟩#g; s#[+][}]#🟩#g;'
❌ 9❌🟩11🟩 { decider: "v14", subscriber: "v28", type: "unknown E().getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }
1 { decider: "v14", subscriber: "v28", type: "unknown PublishKit tail", details: ["subscribeRequest","containingResult"] }
1 { decider: "v14", subscriber: "v43", type: "unknown PublishKit tail", details: ["subscribeRequest","containingResult"] }
❌13❌🟩15🟩 { decider:  "v2", subscriber:  "v9", type: "Zoe E(contractInstanceAdminNode).done()", details: ["vatName"] }
❌12❌🟩15🟩 { decider:  "v2", subscriber:  "v9", type: "Zoe E(governor contractInstanceAdminNode).done()", details: ["subject"] }
❌ 8❌🟩11🟩 { decider:  "v2", subscriber:  "v9", type: "Zoe E(mintHolder contractInstanceAdminNode).done()", details: ["for"] }
❌6❌🟩8🟩 { decider:  "v2", subscriber:  "v9", type: "Zoe E(psm contractInstanceAdminNode).done()", details: ["pair"] }
❌11❌🟩22🟩 { decider:  "v2", subscriber:  "v9", type: "Zoe E(voteCounter contractInstanceAdminNode).done()", details: ["deadline"] }
3 { decider: "v29", subscriber: "v46", type: "unknown E().getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }
❌23❌🟩22🟩 { decider: "v43", subscriber: "v10", type: "wallet spend action: executeOffer", details: ["blockHeight","blockTime","owner","spendAction","type"] }
1 { decider: "v45", subscriber: "v48", type: "unknown PublishKit tail", details: ["subscribeRequest","containingResult"] }
1 { decider: "v46", subscriber: "v45", type: "unknown E().getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }
2 { decider: "v46", subscriber: "v48", type: "unknown E().getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }
1 { decider:  "v5", subscriber: "v23", type: "unknown E().getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }
❌1❌🟩2🟩 { decider:  "v5", subscriber: "v48", type: "unknown E().getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }
❌24❌🟩 3 { decider: "v68", subscriber: "v69", type: "unknown E().getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }🟩
🟩      1 { decider: "v69", subscriber: "v45", type: "unknown E().getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }🟩
🟩      2 { decider: "v69", subscriber: "v48", type: "unknown E().getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }🟩
🟩     23🟩 { decider:  "v9", subscriber: "v43", type: "E(❌invitation❌🟩ZoeSeat🟩)[getPayouts](...)", details: ["invitationSourceVatID","invitationCreatorKref","invitationKpid"] }
❌24❌🟩23🟩 { decider:  "v9", subscriber: "v43", type: "E(❌invitation❌🟩ZoeSeat🟩)[numWantsSatisfied](...)", details: ["invitationSourceVatID","invitationCreatorKref","invitationKpid"] }
❌250❌🟩415🟩 { decider:  "v9", subscriber: "v43", type: "WalletFactory E(likelyPurse).getCurrentAmountNotifier(...) .getUpdateSince(...)", details: ["likelyPurseKref"] }
❌23❌🟩22🟩 { decider:  "v9", subscriber: "v63", type: "E(zoeInstanceAdmin).getExitSubscriber(likelySeatHandle) .getUpdateSince(...)", details: ["contractBundleID"] }

Mostly just changes in the count per category, but also the addition of three new categories involving v69-scaledPriceAuthority-stATOM in patterns matching those associated with v46-scaledPriceAuthority-ATOM:

  • 3 { decider: "v68", subscriber: "v69", type: "unknown E(<Alleged: QuoteNotifier>).getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }
    • v69-scaledPriceAuthority-stATOM subscribing to v68-stATOM-USD_price_feed, analogous to the decider: "v29", subscriber: "v46" pair.
  • 1 { decider: "v69", subscriber: "v45", type: "unknown E(<Alleged: QuoteNotifier>).getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }
    • v45-auctioneer subscribes to v69-scaledPriceAuthority-stATOM just like it subscribes to v46-scaledPriceAuthority-ATOM.
  • 2 { decider: "v69", subscriber: "v48", type: "unknown E(<Alleged: QuoteNotifier>).getUpdateSince(...)", details: ["targetKref","failure","krefHistory","syscalls","request","useRecord"] }
    • v48-vaultFactory subscribes to v69-scaledPriceAuthority-stATOM just like it subscribes to v46-scaledPriceAuthority-ATOM.

@gibson042
Copy link
Member Author

Details of the 605 unsettled cross-vat promises as of run 14: run-14-promises.jsonl.txt

Copy link
Member

@warner warner left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

tool worked for me, let's land it

@gibson042 gibson042 force-pushed the gibson-8336-classify-promises branch from 5b7d00c to ae7c433 Compare January 5, 2024 18:30
@gibson042 gibson042 added the automerge:rebase Automatically rebase updates, then merge label Jan 5, 2024
@Chris-Hibbert
Copy link
Contributor

#8735 addresses v46-scaledpriceauthority-v45-auctioneer-v48-vaultfactory.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
automerge:rebase Automatically rebase updates, then merge
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants