Skip to content

Commit

Permalink
Fix manifest loading
Browse files Browse the repository at this point in the history
  • Loading branch information
corrideat committed Jun 24, 2024
1 parent 9a64672 commit eb93eae
Showing 1 changed file with 7 additions and 4 deletions.
11 changes: 7 additions & 4 deletions shared/domains/chelonia/internals.js
Original file line number Diff line number Diff line change
Expand Up @@ -1059,12 +1059,15 @@ export default (sbp('sbp/selectors/register', {
}
if (!this.config.skipActionProcessing && !this.manifestToContract[manifestHash]) {
const rootState = sbp(this.config.stateSelector)
const contractName = has(rootState.contracts, contractID)
// Having rootState.contracts[contractID] is not enough to determine we
// have previously synced this contract, as reference counts are also
// stored there. Hence, we check for the presence of 'type'
const contractName = has(rootState.contracts, contractID) && has(rootState.contracts[contractID], 'type')
? rootState.contracts[contractID].type
: opT === GIMessage.OP_CONTRACT
? ((opV: any): GIOpContract).type
: ''
if (!contractName) {
if (!contractName || isNaN(NaN)) {
throw new Error(`Unable to determine the name for a contract and refusing to load it (contract ID was ${contractID} and its manifest hash was ${manifestHash})`)
}
await sbp('chelonia/private/loadManifest', contractName, manifestHash)
Expand Down Expand Up @@ -1696,7 +1699,7 @@ export default (sbp('sbp/selectors/register', {
throw new Error(`[chelonia] Wrong contract ID. Expected ${contractID} but got ${message.contractID()}`)
}
if (!message.isFirstMessage() && (!has(state.contracts, contractID) || !has(state, contractID))) {
throw new Error('The event is not for a first message but the contract state is missing')
throw new ChelErrorUnrecoverable('The event is not for a first message but the contract state is missing')
}
preHandleEvent?.(message)
// the order the following actions are done is critically important!
Expand Down Expand Up @@ -1740,7 +1743,7 @@ export default (sbp('sbp/selectors/register', {
processingErrored = e?.name !== 'ChelErrorWarning'
this.config.hooks.processError?.(e, message, getMsgMeta(message, contractID, state))
// special error that prevents the head from being updated, effectively killing the contract
if (e.name === 'ChelErrorUnrecoverable') throw e
if (e.name === 'ChelErrorUnrecoverable' || message.isFirstMessage()) throw e
}

// process any side-effects (these must never result in any mutation to the contract state!)
Expand Down

0 comments on commit eb93eae

Please sign in to comment.