From 6196d33b2a2a9c243517344cd0e8db266d2ed1e3 Mon Sep 17 00:00:00 2001 From: Harvmaster Date: Mon, 4 May 2026 05:04:28 +0000 Subject: [PATCH] Fix build issues --- readme.md | 29 +++++++++++++++++-- src/services/history.ts | 6 ++-- src/tui/screens/TemplateList.tsx | 10 +++---- src/tui/screens/action-wizard/flows/index.ts | 2 +- .../action-wizard/steps/RoleSelectStep.tsx | 11 ++++--- .../screens/invitations/InvitationScreen.tsx | 8 ++--- src/utils/invitation-flow.ts | 15 ++++------ src/utils/template-utils.ts | 8 +++-- 8 files changed, 56 insertions(+), 33 deletions(-) diff --git a/readme.md b/readme.md index 2be3f81..a0f06c4 100644 --- a/readme.md +++ b/readme.md @@ -5,10 +5,11 @@ ### Full Installation ```bash # Create a new directory since we are going to be pulling in engine too -mdkir xo-terminal && cd xo-terminal +mkdir xo-terminal && cd xo-terminal -# Clone the Engine Repo -git clone git@gitlab.com:GeneralProtocols/xo/engine.git +# ----- Start Engine Setup ----- +# Clone the Engine Repo (Note, this uses harvey's fork of the engine repo to access the cli-test branch) +git clone git@gitlab.com:Harvmaster/engine.git # Move into teh engine directory cd engine @@ -21,10 +22,31 @@ npm ci # Build the engine npm run build +# ----- End Engine Setup ----- # Move back to the top level directory cd .. +# ----- Start State Setup ----- +# Clone the State Repo +git clone git@gitlab.com:Harvmaster/state.git + +# Move into the state directory +cd state + +git checkout in-memory-adapter + +# Install the dependencies +npm ci + +# Build the state +npm run build +# ----- End State Setup ----- + +# Move back to the top level directory +cd .. + +# ----- Start CLI Setup ----- # Clone the CLI Repo git clone git@git.harvmaster.com:Harvmaster/xo-cli.git @@ -36,6 +58,7 @@ npm ci # Build the cli npm run build +# ----- End CLI Setup ----- ``` ### Install globally diff --git a/src/services/history.ts b/src/services/history.ts index 55f163f..e090b93 100644 --- a/src/services/history.ts +++ b/src/services/history.ts @@ -138,7 +138,7 @@ export class HistoryService { utxo.outpointIndex, ); ownOutpoints.add(outpointKey); - ownLockingBytecodes.add(utxo.lockingBytecode); + ownLockingBytecodes.add(utxo.scriptHash); outpointValueSatoshis.set(outpointKey, BigInt(utxo.valueSatoshis)); } @@ -521,7 +521,7 @@ export class HistoryService { const originKey = this.getUtxoOriginKey( utxo.templateIdentifier, utxo.outputIdentifier, - utxo.lockingBytecode, + utxo.scriptHash, ); return invitationByUtxoOrigin.get(originKey)?.invitationIdentifier; } @@ -533,7 +533,7 @@ export class HistoryService { const originKey = this.getUtxoOriginKey( utxo.templateIdentifier, utxo.outputIdentifier, - utxo.lockingBytecode, + utxo.scriptHash, ); return invitationByUtxoOrigin.get(originKey)?.roleIdentifier; } diff --git a/src/tui/screens/TemplateList.tsx b/src/tui/screens/TemplateList.tsx index 12cd8a1..2015d77 100644 --- a/src/tui/screens/TemplateList.tsx +++ b/src/tui/screens/TemplateList.tsx @@ -100,8 +100,8 @@ export function TemplateListScreen(): React.ReactElement { for (const startingAction of rawStartingActions) { const existing = actionMap.get(startingAction.action); if (existing) { - if (!existing.roles.includes(startingAction.role)) { - existing.roles.push(startingAction.role); + if (!existing.roles.includes(startingAction.role ?? '')) { + existing.roles.push(startingAction.role ?? ''); } continue; } @@ -111,7 +111,7 @@ export function TemplateListScreen(): React.ReactElement { actionIdentifier: startingAction.action, name: actionDef?.name || startingAction.action, description: actionDef?.description, - roles: [startingAction.role], + roles: [startingAction.role ?? ''], source: 'starting', }); } @@ -119,9 +119,9 @@ export function TemplateListScreen(): React.ReactElement { const ownedOutputIdentifiers = ownedOutputsByTemplate.get(templateIdentifier) ?? new Set(); for (const outputIdentifier of ownedOutputIdentifiers) { const outputDef = template.outputs?.[outputIdentifier]; - if (!outputDef || typeof outputDef.lockscript !== 'string') continue; + if (!outputDef || typeof outputDef.lockingScript !== 'string') continue; - const lockingScriptDefinition = (template.lockingScripts as Record | undefined)?.[outputDef.lockscript] as + const lockingScriptDefinition = (template.lockingScripts as Record | undefined)?.[outputDef.lockingScript] as | { roles?: Record }> } | undefined; if (!lockingScriptDefinition?.roles) continue; diff --git a/src/tui/screens/action-wizard/flows/index.ts b/src/tui/screens/action-wizard/flows/index.ts index 0a49f5b..42a71d0 100644 --- a/src/tui/screens/action-wizard/flows/index.ts +++ b/src/tui/screens/action-wizard/flows/index.ts @@ -15,7 +15,7 @@ export { DataWizardFlow } from "./DataWizardFlow.js"; */ export function createWizardFlow(action: XOTemplateAction): WizardFlow { if (action.data?.length && !action.transaction) { - return new DataWizardFlow(action.data); + return new DataWizardFlow([action.data]); } return new TransactionWizardFlow(); } diff --git a/src/tui/screens/action-wizard/steps/RoleSelectStep.tsx b/src/tui/screens/action-wizard/steps/RoleSelectStep.tsx index f63d717..d9ce47f 100644 --- a/src/tui/screens/action-wizard/steps/RoleSelectStep.tsx +++ b/src/tui/screens/action-wizard/steps/RoleSelectStep.tsx @@ -61,13 +61,16 @@ export function RoleSelectStep({ {availableRoles.length === 0 ? ( No roles available ) : ( - availableRoles.map((roleId, index) => { + availableRoles.map((roleId: string, index: number) => { const isCursor = selectedRoleIndex === index && focusArea === 'content'; const roleDef = template.roles?.[roleId]; const actionRole = action?.roles?.[roleId]; const requirements = actionRole?.requirements; + const actionRequirements = action?.requirements; + const actionRoleRequirements = actionRole && actionRequirements && actionRequirements.participants?.find((participant) => participant.role === roleId); + return ( )} - {requirements.slots && requirements.slots.min > 0 && ( + {actionRoleRequirements && actionRoleRequirements.slots && actionRoleRequirements.slots.min > 0 && ( - {requirements.slots.min} input slot - {requirements.slots.min !== 1 ? 's' : ''} + {actionRoleRequirements.slots.min} input slot + {actionRoleRequirements.slots.min !== 1 ? 's' : ''} )} diff --git a/src/tui/screens/invitations/InvitationScreen.tsx b/src/tui/screens/invitations/InvitationScreen.tsx index 7ebaeca..593da0d 100644 --- a/src/tui/screens/invitations/InvitationScreen.tsx +++ b/src/tui/screens/invitations/InvitationScreen.tsx @@ -351,10 +351,10 @@ export function InvitationScreen(): React.ReactElement { const seenLockingBytecodes = new Set(); for (const utxo of utxos) { - const lockingBytecodeHex = utxo.lockingBytecode - ? typeof utxo.lockingBytecode === 'string' - ? utxo.lockingBytecode - : Buffer.from(utxo.lockingBytecode).toString('hex') + const lockingBytecodeHex = utxo.scriptHash + ? typeof utxo.scriptHash === 'string' + ? utxo.scriptHash + : Buffer.from(utxo.scriptHash).toString('hex') : undefined; if (lockingBytecodeHex && seenLockingBytecodes.has(lockingBytecodeHex)) continue; diff --git a/src/utils/invitation-flow.ts b/src/utils/invitation-flow.ts index 0ddff14..bb2bf59 100644 --- a/src/utils/invitation-flow.ts +++ b/src/utils/invitation-flow.ts @@ -45,7 +45,8 @@ export const resolveActionRoles = ( const starts = template.start ?? []; const roleIds = starts .filter((entry) => entry.action === actionIdentifier) - .map((entry) => entry.role); + .map((entry) => entry.role) + .filter((roleId) => roleId !== undefined); return [...new Set(roleIds)]; }; @@ -60,17 +61,11 @@ export const roleRequiresInputs = ( if (!action) return false; const actionRole = action.roles?.[roleIdentifier]; - const roleSlotsMin = actionRole?.requirements?.slots?.min ?? 0; + const actionRequirements = action.requirements; + const actionRoleRequirements = actionRole && actionRequirements && actionRequirements.participants?.find((participant) => participant.role === roleIdentifier); + const roleSlotsMin = actionRoleRequirements && actionRoleRequirements.slots && actionRoleRequirements.slots.min > 0 ? actionRoleRequirements.slots.min : 0; if (roleSlotsMin > 0) return true; - // Some templates specify slot/input requirements at action.requirements.roles - // instead of role.requirements. Respect those as well. - const roleRequirement = action.requirements?.roles?.find( - (requirement) => requirement.role === roleIdentifier, - ); - const actionLevelSlotsMin = roleRequirement?.slots?.min ?? 0; - if (actionLevelSlotsMin > 0) return true; - const transactionIdentifier = action.transaction; const transaction = transactionIdentifier ? template.transactions?.[transactionIdentifier] diff --git a/src/utils/template-utils.ts b/src/utils/template-utils.ts index 8591e0e..2d18a01 100644 --- a/src/utils/template-utils.ts +++ b/src/utils/template-utils.ts @@ -188,11 +188,13 @@ export function getRolesForAction( ); return startEntries.map((entry) => { - const roleDef = template.roles?.[entry.role]; + const roleDef = template.roles?.[entry.role || '']; const roleObj = typeof roleDef === "object" ? roleDef : null; + + // TODO: This is ugly. Lot of conditionals. Need to take a much closer look at this. return { - roleId: entry.role, - name: roleObj?.name || entry.role, + roleId: entry.role || '', + name: roleObj?.name || entry.role || '', description: roleObj?.description, }; });