From 7baec6736b9e460c4d5c895646ffc28e7a445be3 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 5 May 2025 12:21:50 +0300 Subject: [PATCH] fix: small fixes and refactor --- .../cwait/src/onchain/constructCwebMain.ts | 4 + packages/cwait/src/onchain/context/context.ts | 4 +- .../cwait/src/onchain/context/extractOps.ts | 2 +- packages/cwait/src/onchain/executor.ts | 2 +- packages/cwait/src/onchain/global.ts | 2 +- packages/cwait/src/onchain/index.ts | 4 +- .../onchain/mutex/claims/mutexBlockLock.ts | 2 +- .../onchain/mutex/claims/mutexBlockUnlock.ts | 2 +- .../src/onchain/mutex/claims/mutexExecOps.ts | 2 +- .../src/onchain/mutex/claims/mutexLock.ts | 4 +- .../features/cwait}/cwait.ts | 17 ++-- .../features/cwait/index.ts | 1 + .../promisifiedFeatures/features/index.ts | 3 + .../features/mutex/index.ts | 1 + .../features/mutex/lock.ts | 78 +++++++++++++++++++ .../features}/ops/block.ts | 7 +- .../features}/ops/index.ts | 0 .../features}/ops/rangeRead.ts | 11 ++- .../features}/ops/read.ts | 11 ++- .../features}/ops/store.ts | 7 +- .../features}/ops/take.ts | 9 +-- .../src/onchain/promisifiedFeatures/index.ts | 2 + .../runtime/awaitedTasks.ts} | 2 +- .../promisifiedFeatures/runtime/index.ts | 2 + .../runtime/resolvedOps.ts} | 2 +- .../cwait/src/onchain/promisifiedOps/index.ts | 4 - .../src/onchain/promisifiedOps/ops/lock.ts | 42 ---------- .../src/onchain/promisifiedOps/ops/unlock.ts | 38 --------- .../utils/constructTx/prepareInThreadTxs.ts | 32 ++++---- .../utils/constructTx/prepareOutThreadTxs.ts | 22 ++++-- .../onchain/utils/constructTx/prepareTxs.ts | 2 +- packages/ui/.env | 2 +- 32 files changed, 166 insertions(+), 157 deletions(-) rename packages/cwait/src/onchain/{promisifiedOps => promisifiedFeatures/features/cwait}/cwait.ts (81%) create mode 100644 packages/cwait/src/onchain/promisifiedFeatures/features/cwait/index.ts create mode 100644 packages/cwait/src/onchain/promisifiedFeatures/features/index.ts create mode 100644 packages/cwait/src/onchain/promisifiedFeatures/features/mutex/index.ts create mode 100644 packages/cwait/src/onchain/promisifiedFeatures/features/mutex/lock.ts rename packages/cwait/src/onchain/{promisifiedOps => promisifiedFeatures/features}/ops/block.ts (82%) rename packages/cwait/src/onchain/{promisifiedOps => promisifiedFeatures/features}/ops/index.ts (100%) rename packages/cwait/src/onchain/{promisifiedOps => promisifiedFeatures/features}/ops/rangeRead.ts (81%) rename packages/cwait/src/onchain/{promisifiedOps => promisifiedFeatures/features}/ops/read.ts (77%) rename packages/cwait/src/onchain/{promisifiedOps => promisifiedFeatures/features}/ops/store.ts (83%) rename packages/cwait/src/onchain/{promisifiedOps => promisifiedFeatures/features}/ops/take.ts (79%) create mode 100644 packages/cwait/src/onchain/promisifiedFeatures/index.ts rename packages/cwait/src/onchain/{promisifiedOps/awaited.ts => promisifiedFeatures/runtime/awaitedTasks.ts} (88%) create mode 100644 packages/cwait/src/onchain/promisifiedFeatures/runtime/index.ts rename packages/cwait/src/onchain/{promisifiedOps/resolved.ts => promisifiedFeatures/runtime/resolvedOps.ts} (94%) delete mode 100644 packages/cwait/src/onchain/promisifiedOps/index.ts delete mode 100644 packages/cwait/src/onchain/promisifiedOps/ops/lock.ts delete mode 100644 packages/cwait/src/onchain/promisifiedOps/ops/unlock.ts diff --git a/packages/cwait/src/onchain/constructCwebMain.ts b/packages/cwait/src/onchain/constructCwebMain.ts index 88e208b..3ac7eaa 100644 --- a/packages/cwait/src/onchain/constructCwebMain.ts +++ b/packages/cwait/src/onchain/constructCwebMain.ts @@ -12,6 +12,10 @@ export const constructCwebMain = (methods: Record Pr const module: ContractHandlers = { handlers: {} }; Object.entries(methods).forEach(([name, handler]) => { + if (name.startsWith('_')) { + throw new Error('Do not start method names with "_" because they are reserved for internal use'); + } + addMethodHandler(module, name, executor(handler)); }); diff --git a/packages/cwait/src/onchain/context/context.ts b/packages/cwait/src/onchain/context/context.ts index a056d0e..cbadb3f 100644 --- a/packages/cwait/src/onchain/context/context.ts +++ b/packages/cwait/src/onchain/context/context.ts @@ -10,8 +10,8 @@ import { import { CwebTake } from '@coinweb/contract-kit/dist/types/operations/take'; import { getCallParameters, getContractIssuer } from 'lib/onchain'; -import { pushAwaitedOp } from '../../../dist/onchain/ops'; import { ExecutorMethodArgs, ResolvedOp } from '../../types'; +import { pushAwaitedTask } from '../promisifiedFeatures'; import { uuid } from '../utils'; import { extractOps } from './extractOps'; @@ -102,7 +102,7 @@ export const handleContext = (ctx: Context) => { }; if (executionOpsTakeOp) { - pushAwaitedOp(executionOpsTakeOp); + pushAwaitedTask(executionOpsTakeOp); } return !!executionOpsTakeOp; //This is a flag to check if the execution should restart / TODO: refactor; diff --git a/packages/cwait/src/onchain/context/extractOps.ts b/packages/cwait/src/onchain/context/extractOps.ts index d2d3d86..6321561 100644 --- a/packages/cwait/src/onchain/context/extractOps.ts +++ b/packages/cwait/src/onchain/context/extractOps.ts @@ -2,7 +2,7 @@ import { constructTake, extractRead, GRead, GTake, ResolvedOperation, ResolvedRe import { CwebTake } from '@coinweb/contract-kit/dist/types/operations/take'; import { ResolvedOp, TypedClaim } from '../../types'; -import { resultKey } from '../claims/result'; +import { resultKey } from '../claims'; import { mutexBlockLockKey, mutexBlockUnlockKey, mutexExecOpsKey, MutexExecOpsResult } from '../mutex'; import { isResolvedBlockOp, isResolvedReadOp, isResolvedTakeOp } from '../utils'; diff --git a/packages/cwait/src/onchain/executor.ts b/packages/cwait/src/onchain/executor.ts index eb8a1dd..635fe4d 100644 --- a/packages/cwait/src/onchain/executor.ts +++ b/packages/cwait/src/onchain/executor.ts @@ -2,7 +2,7 @@ import { Context, NewTx, getMethodArguments, isSelfCall } from '@coinweb/contract-kit'; import { context, getRawContext, handleContext } from './context'; -import { pushResolvedOp } from './promisifiedOps/resolved'; +import { pushResolvedOp } from './promisifiedFeatures/runtime/resolvedOps'; import { constructTx } from './utils'; let abortExecution: ((result: boolean) => void) | null = null; diff --git a/packages/cwait/src/onchain/global.ts b/packages/cwait/src/onchain/global.ts index 484d929..b2c8c6a 100644 --- a/packages/cwait/src/onchain/global.ts +++ b/packages/cwait/src/onchain/global.ts @@ -1,4 +1,4 @@ -import { markTaskBatch } from './promisifiedOps/awaited'; +import { markTaskBatch } from './promisifiedFeatures/runtime/awaitedTasks'; import { getBatchId } from './utils'; export const opMarker = Symbol('opMarker'); diff --git a/packages/cwait/src/onchain/index.ts b/packages/cwait/src/onchain/index.ts index 7be55b9..b31def1 100644 --- a/packages/cwait/src/onchain/index.ts +++ b/packages/cwait/src/onchain/index.ts @@ -1,3 +1,3 @@ export * from './context'; -export * from './executor'; -export * from './promisifiedOps'; +export * from './promisifiedFeatures/features'; +export * from './constructCwebMain'; diff --git a/packages/cwait/src/onchain/mutex/claims/mutexBlockLock.ts b/packages/cwait/src/onchain/mutex/claims/mutexBlockLock.ts index 5985ead..0f6484e 100644 --- a/packages/cwait/src/onchain/mutex/claims/mutexBlockLock.ts +++ b/packages/cwait/src/onchain/mutex/claims/mutexBlockLock.ts @@ -8,7 +8,7 @@ import { ContractIssuer, } from '@coinweb/contract-kit'; -export const mutexBlockLockKey = 'mutex_block_lock'; +export const mutexBlockLockKey = '_mutex_block_lock'; export const constructMutexBlockLockClaimKey = (lockId: string) => constructClaimKey([mutexBlockLockKey], [lockId]); diff --git a/packages/cwait/src/onchain/mutex/claims/mutexBlockUnlock.ts b/packages/cwait/src/onchain/mutex/claims/mutexBlockUnlock.ts index 6f7f7fd..11eab3f 100644 --- a/packages/cwait/src/onchain/mutex/claims/mutexBlockUnlock.ts +++ b/packages/cwait/src/onchain/mutex/claims/mutexBlockUnlock.ts @@ -10,7 +10,7 @@ import { GStore, } from '@coinweb/contract-kit'; -export const mutexBlockUnlockKey = 'mutex_block_unlock'; +export const mutexBlockUnlockKey = '_mutex_block_unlock'; export const constructMutexBlockUnlockClaimKey = (uniqueId: string) => constructClaimKey([mutexBlockUnlockKey], [uniqueId]); diff --git a/packages/cwait/src/onchain/mutex/claims/mutexExecOps.ts b/packages/cwait/src/onchain/mutex/claims/mutexExecOps.ts index a3cd931..0770554 100644 --- a/packages/cwait/src/onchain/mutex/claims/mutexExecOps.ts +++ b/packages/cwait/src/onchain/mutex/claims/mutexExecOps.ts @@ -14,7 +14,7 @@ import { toHex } from 'lib/shared'; import { MutexExecOpsResult } from '../types'; -export const mutexExecOpsKey = 'mutex_exec_ops'; +export const mutexExecOpsKey = '_mutex_exec_ops'; export const constructMutexExecOpsClaimKey = (execId: string) => constructClaimKey([mutexExecOpsKey], [execId]); diff --git a/packages/cwait/src/onchain/mutex/claims/mutexLock.ts b/packages/cwait/src/onchain/mutex/claims/mutexLock.ts index 725d80d..5441d8e 100644 --- a/packages/cwait/src/onchain/mutex/claims/mutexLock.ts +++ b/packages/cwait/src/onchain/mutex/claims/mutexLock.ts @@ -6,13 +6,13 @@ import { ContractIssuer, GRead, } from '@coinweb/contract-kit'; -import { CwebRead } from '@coinweb/contract-kit/dist/esm/operations/read'; +import { CwebRead } from '@coinweb/contract-kit/dist/types/operations/read'; import { toHex } from 'lib/shared'; import { rangeReadLimit } from '../settings'; import { LockedKey, MutexLockState } from '../types'; -export const mutexLockKey = 'mutex_lock'; +export const mutexLockKey = '_mutex_lock'; export const constructMutexLockFirstPart = () => [mutexLockKey]; diff --git a/packages/cwait/src/onchain/promisifiedOps/cwait.ts b/packages/cwait/src/onchain/promisifiedFeatures/features/cwait/cwait.ts similarity index 81% rename from packages/cwait/src/onchain/promisifiedOps/cwait.ts rename to packages/cwait/src/onchain/promisifiedFeatures/features/cwait/cwait.ts index 4af8ba2..cfe97cf 100644 --- a/packages/cwait/src/onchain/promisifiedOps/cwait.ts +++ b/packages/cwait/src/onchain/promisifiedFeatures/features/cwait/cwait.ts @@ -1,14 +1,13 @@ import { constructStore } from '@coinweb/contract-kit/dist/esm/operations/store'; -import { constructResultClaim } from '../claims/result'; -import { context } from '../context'; -import { stopExecution } from '../executor'; -import { opMarker } from '../global'; -import { isResolvedChildOp, isResolvedExecOp, isResolvedSlotOp } from '../utils'; -import { uuid } from '../utils'; - -import { getAwaitedTasks, pushAwaitedTask } from './awaited'; -import { getUsedOps, saveUsedOps, shiftResolvedOp } from './resolved'; +import { constructResultClaim } from '../../../claims/result'; +import { context } from '../../../context'; +import { stopExecution } from '../../../executor'; +import { opMarker } from '../../../global'; +import { isResolvedChildOp, isResolvedExecOp, isResolvedSlotOp } from '../../../utils'; +import { uuid } from '../../../utils'; +import { getAwaitedTasks, pushAwaitedTask } from '../../runtime/awaitedTasks'; +import { getUsedOps, saveUsedOps, shiftResolvedOp } from '../../runtime/resolvedOps'; let isRootDetected = false; diff --git a/packages/cwait/src/onchain/promisifiedFeatures/features/cwait/index.ts b/packages/cwait/src/onchain/promisifiedFeatures/features/cwait/index.ts new file mode 100644 index 0000000..e66ae58 --- /dev/null +++ b/packages/cwait/src/onchain/promisifiedFeatures/features/cwait/index.ts @@ -0,0 +1 @@ +export * from './cwait'; diff --git a/packages/cwait/src/onchain/promisifiedFeatures/features/index.ts b/packages/cwait/src/onchain/promisifiedFeatures/features/index.ts new file mode 100644 index 0000000..e13c3d1 --- /dev/null +++ b/packages/cwait/src/onchain/promisifiedFeatures/features/index.ts @@ -0,0 +1,3 @@ +export * from './cwait'; +export * from './mutex'; +export * from './ops'; diff --git a/packages/cwait/src/onchain/promisifiedFeatures/features/mutex/index.ts b/packages/cwait/src/onchain/promisifiedFeatures/features/mutex/index.ts new file mode 100644 index 0000000..8fa8b1b --- /dev/null +++ b/packages/cwait/src/onchain/promisifiedFeatures/features/mutex/index.ts @@ -0,0 +1 @@ +export * from './lock'; diff --git a/packages/cwait/src/onchain/promisifiedFeatures/features/mutex/lock.ts b/packages/cwait/src/onchain/promisifiedFeatures/features/mutex/lock.ts new file mode 100644 index 0000000..60c8b33 --- /dev/null +++ b/packages/cwait/src/onchain/promisifiedFeatures/features/mutex/lock.ts @@ -0,0 +1,78 @@ +import { getTime } from 'lib/onchain'; + +import { opMarker } from '../../../global'; +import { LockedKey } from '../../../mutex'; +import { isResolvedLockOp, isResolvedSlotOp, isResolvedUnlockOp, uuid } from '../../../utils'; +import { pushAwaitedTask, shiftResolvedOp } from '../../runtime'; + +const unlock = (lockId: string, timestamp: number) => { + console.log('lockOp'); + let opMarkerValue = false; + + const result = new Promise((resolve, reject) => { + try { + const { op, isOp } = shiftResolvedOp(); + + if (!isOp) { + pushAwaitedTask({ UnlockOp: { lockId, timestamp } }); + opMarkerValue = true; + } else { + if (isResolvedSlotOp(op)) { + console.log('unlockOp-slotOp'); + return; + } + + if (!isResolvedUnlockOp(op)) { + console.log('unlockOp-error'); + throw new Error('Unlock operation not found'); + } + + resolve(); + } + } catch (error) { + reject(error); + } + }); + + (result as Promise & { [opMarker]: boolean })[opMarker] = opMarkerValue; + + return result; +}; + +export const lock = (keys: LockedKey[] | LockedKey) => { + console.log('lockOp'); + let opMarkerValue = false; + + const result = new Promise<() => Promise>((resolve, reject) => { + try { + const { op, isOp } = shiftResolvedOp(); + + if (!isOp) { + pushAwaitedTask({ + LockOp: { lockId: uuid(), keys: Array.isArray(keys) ? keys : [keys], timestamp: getTime() }, + }); + opMarkerValue = true; + } else { + if (isResolvedSlotOp(op)) { + console.log('lockOp-slotOp'); + return; + } + + if (!isResolvedLockOp(op)) { + console.log('lockOp-error'); + throw new Error('Lock operation not found'); + } + + const result = op.LockOp; + + resolve(() => unlock(result.lockId, result.timestamp)); + } + } catch (error) { + reject(error); + } + }); + + (result as Promise<() => Promise> & { [opMarker]: boolean })[opMarker] = opMarkerValue; + + return result; +}; diff --git a/packages/cwait/src/onchain/promisifiedOps/ops/block.ts b/packages/cwait/src/onchain/promisifiedFeatures/features/ops/block.ts similarity index 82% rename from packages/cwait/src/onchain/promisifiedOps/ops/block.ts rename to packages/cwait/src/onchain/promisifiedFeatures/features/ops/block.ts index 56d1086..9ec99b8 100644 --- a/packages/cwait/src/onchain/promisifiedOps/ops/block.ts +++ b/packages/cwait/src/onchain/promisifiedFeatures/features/ops/block.ts @@ -1,9 +1,8 @@ import { BlockFilter, constructBlock, extractBlock } from '@coinweb/contract-kit'; -import { opMarker } from '../../global'; -import { isResolvedBlockOp, isResolvedSlotOp } from '../../utils'; -import { pushAwaitedTask } from '../awaited'; -import { shiftResolvedOp } from '../resolved'; +import { opMarker } from '../../../global'; +import { isResolvedBlockOp, isResolvedSlotOp } from '../../../utils'; +import { pushAwaitedTask, shiftResolvedOp } from '../../runtime'; export const blockOp = (filters: BlockFilter[]) => { console.log('blockOp'); diff --git a/packages/cwait/src/onchain/promisifiedOps/ops/index.ts b/packages/cwait/src/onchain/promisifiedFeatures/features/ops/index.ts similarity index 100% rename from packages/cwait/src/onchain/promisifiedOps/ops/index.ts rename to packages/cwait/src/onchain/promisifiedFeatures/features/ops/index.ts diff --git a/packages/cwait/src/onchain/promisifiedOps/ops/rangeRead.ts b/packages/cwait/src/onchain/promisifiedFeatures/features/ops/rangeRead.ts similarity index 81% rename from packages/cwait/src/onchain/promisifiedOps/ops/rangeRead.ts rename to packages/cwait/src/onchain/promisifiedFeatures/features/ops/rangeRead.ts index 57137ab..ea1673b 100644 --- a/packages/cwait/src/onchain/promisifiedOps/ops/rangeRead.ts +++ b/packages/cwait/src/onchain/promisifiedFeatures/features/ops/rangeRead.ts @@ -1,12 +1,11 @@ import { Claim, ClaimKey, constructRangeRead, extractRead } from '@coinweb/contract-kit'; import { ClaimRange } from '@coinweb/contract-kit/dist/types/operations/read'; -import { TypedClaim } from '../../../types'; -import { context } from '../../context'; -import { opMarker } from '../../global'; -import { isResolvedReadOp, isResolvedSlotOp } from '../../utils'; -import { pushAwaitedTask } from '../awaited'; -import { shiftResolvedOp } from '../resolved'; +import { TypedClaim } from '../../../../types'; +import { context } from '../../../context'; +import { opMarker } from '../../../global'; +import { isResolvedReadOp, isResolvedSlotOp } from '../../../utils'; +import { pushAwaitedTask, shiftResolvedOp } from '../../runtime'; export const rangeReadOp = ( firstPart: ClaimKey['first_part'], diff --git a/packages/cwait/src/onchain/promisifiedOps/ops/read.ts b/packages/cwait/src/onchain/promisifiedFeatures/features/ops/read.ts similarity index 77% rename from packages/cwait/src/onchain/promisifiedOps/ops/read.ts rename to packages/cwait/src/onchain/promisifiedFeatures/features/ops/read.ts index 72f0320..af4fcf4 100644 --- a/packages/cwait/src/onchain/promisifiedOps/ops/read.ts +++ b/packages/cwait/src/onchain/promisifiedFeatures/features/ops/read.ts @@ -1,11 +1,10 @@ import { Claim, ClaimKey, constructRead, extractRead } from '@coinweb/contract-kit'; -import { TypedClaim } from '../../../types'; -import { context } from '../../context'; -import { opMarker } from '../../global'; -import { isResolvedReadOp, isResolvedSlotOp } from '../../utils'; -import { pushAwaitedTask } from '../awaited'; -import { shiftResolvedOp } from '../resolved'; +import { TypedClaim } from '../../../../types'; +import { context } from '../../../context'; +import { opMarker } from '../../../global'; +import { isResolvedReadOp, isResolvedSlotOp } from '../../../utils'; +import { pushAwaitedTask, shiftResolvedOp } from '../../runtime'; export const readOp = (key: ClaimKey) => { console.log('readOp'); diff --git a/packages/cwait/src/onchain/promisifiedOps/ops/store.ts b/packages/cwait/src/onchain/promisifiedFeatures/features/ops/store.ts similarity index 83% rename from packages/cwait/src/onchain/promisifiedOps/ops/store.ts rename to packages/cwait/src/onchain/promisifiedFeatures/features/ops/store.ts index 15857ec..d949996 100644 --- a/packages/cwait/src/onchain/promisifiedOps/ops/store.ts +++ b/packages/cwait/src/onchain/promisifiedFeatures/features/ops/store.ts @@ -1,10 +1,9 @@ import { Claim, constructStore } from '@coinweb/contract-kit'; import { extractStore } from '@coinweb/contract-kit/dist/esm/operations/store'; -import { opMarker } from '../../global'; -import { isResolvedSlotOp, isResolvedStoreOp } from '../../utils'; -import { pushAwaitedTask } from '../awaited'; -import { shiftResolvedOp } from '../resolved'; +import { opMarker } from '../../../global'; +import { isResolvedSlotOp, isResolvedStoreOp } from '../../../utils'; +import { pushAwaitedTask, shiftResolvedOp } from '../../runtime'; export const storeOp = (claim: Claim, storeCweb?: bigint) => { console.log('storeOp'); diff --git a/packages/cwait/src/onchain/promisifiedOps/ops/take.ts b/packages/cwait/src/onchain/promisifiedFeatures/features/ops/take.ts similarity index 79% rename from packages/cwait/src/onchain/promisifiedOps/ops/take.ts rename to packages/cwait/src/onchain/promisifiedFeatures/features/ops/take.ts index 2f4dcdd..95fa14c 100644 --- a/packages/cwait/src/onchain/promisifiedOps/ops/take.ts +++ b/packages/cwait/src/onchain/promisifiedFeatures/features/ops/take.ts @@ -1,10 +1,9 @@ import { Claim, ClaimKey, constructTake, extractTake } from '@coinweb/contract-kit'; -import { TypedClaim } from '../../../types'; -import { opMarker } from '../../global'; -import { isResolvedSlotOp, isResolvedTakeOp } from '../../utils'; -import { pushAwaitedTask } from '../awaited'; -import { shiftResolvedOp } from '../resolved'; +import { TypedClaim } from '../../../../types'; +import { opMarker } from '../../../global'; +import { isResolvedSlotOp, isResolvedTakeOp } from '../../../utils'; +import { pushAwaitedTask, shiftResolvedOp } from '../../runtime'; export const takeOp = (key: ClaimKey) => { console.log('takeOp'); diff --git a/packages/cwait/src/onchain/promisifiedFeatures/index.ts b/packages/cwait/src/onchain/promisifiedFeatures/index.ts new file mode 100644 index 0000000..a66d282 --- /dev/null +++ b/packages/cwait/src/onchain/promisifiedFeatures/index.ts @@ -0,0 +1,2 @@ +export * from './runtime'; +export * from './features'; diff --git a/packages/cwait/src/onchain/promisifiedOps/awaited.ts b/packages/cwait/src/onchain/promisifiedFeatures/runtime/awaitedTasks.ts similarity index 88% rename from packages/cwait/src/onchain/promisifiedOps/awaited.ts rename to packages/cwait/src/onchain/promisifiedFeatures/runtime/awaitedTasks.ts index 23c1dbc..ad3a820 100644 --- a/packages/cwait/src/onchain/promisifiedOps/awaited.ts +++ b/packages/cwait/src/onchain/promisifiedFeatures/runtime/awaitedTasks.ts @@ -1,4 +1,4 @@ -import { PreparedOp, Task } from '../../types'; +import { PreparedOp, Task } from '../../../types'; const awaitedTasks: Task[] = []; diff --git a/packages/cwait/src/onchain/promisifiedFeatures/runtime/index.ts b/packages/cwait/src/onchain/promisifiedFeatures/runtime/index.ts new file mode 100644 index 0000000..7478a6d --- /dev/null +++ b/packages/cwait/src/onchain/promisifiedFeatures/runtime/index.ts @@ -0,0 +1,2 @@ +export * from './awaitedTasks'; +export * from './resolvedOps'; diff --git a/packages/cwait/src/onchain/promisifiedOps/resolved.ts b/packages/cwait/src/onchain/promisifiedFeatures/runtime/resolvedOps.ts similarity index 94% rename from packages/cwait/src/onchain/promisifiedOps/resolved.ts rename to packages/cwait/src/onchain/promisifiedFeatures/runtime/resolvedOps.ts index b53ff78..8c7f236 100644 --- a/packages/cwait/src/onchain/promisifiedOps/resolved.ts +++ b/packages/cwait/src/onchain/promisifiedFeatures/runtime/resolvedOps.ts @@ -1,4 +1,4 @@ -import { ResolvedOp } from '../../types'; +import { ResolvedOp } from '../../../types'; const resolvedOps: ResolvedOp[] = []; diff --git a/packages/cwait/src/onchain/promisifiedOps/index.ts b/packages/cwait/src/onchain/promisifiedOps/index.ts deleted file mode 100644 index 672baa5..0000000 --- a/packages/cwait/src/onchain/promisifiedOps/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * from './awaited'; -export * from './cwait'; -export * from './ops'; -export * from './resolved'; diff --git a/packages/cwait/src/onchain/promisifiedOps/ops/lock.ts b/packages/cwait/src/onchain/promisifiedOps/ops/lock.ts deleted file mode 100644 index 7bb3fd6..0000000 --- a/packages/cwait/src/onchain/promisifiedOps/ops/lock.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { ResolvedLockOp } from '../../../types'; -import { opMarker } from '../../global'; -import { LockedKey } from '../../mutex'; -import { isResolvedLockOp, isResolvedSlotOp, uuid } from '../../utils'; -import { pushAwaitedTask } from '../awaited'; -import { shiftResolvedOp } from '../resolved'; - -export const lockOp = (keys: LockedKey[] | LockedKey) => { - console.log('lockOp'); - let opMarkerValue = false; - - const result = new Promise((resolve, reject) => { - try { - const { op, isOp } = shiftResolvedOp(); - - if (!isOp) { - pushAwaitedTask({ LockOp: { lockId: uuid(), keys: Array.isArray(keys) ? keys : [keys] } }); - opMarkerValue = true; - } else { - if (isResolvedSlotOp(op)) { - console.log('storeOp-slotOp'); - return; - } - - if (!isResolvedLockOp(op)) { - console.log('lockOp-error'); - throw new Error('Lock operation not found'); - } - - const result = op.LockOp; - - resolve(result); - } - } catch (error) { - reject(error); - } - }); - - (result as Promise & { [opMarker]: boolean })[opMarker] = opMarkerValue; - - return result; -}; diff --git a/packages/cwait/src/onchain/promisifiedOps/ops/unlock.ts b/packages/cwait/src/onchain/promisifiedOps/ops/unlock.ts deleted file mode 100644 index 404792a..0000000 --- a/packages/cwait/src/onchain/promisifiedOps/ops/unlock.ts +++ /dev/null @@ -1,38 +0,0 @@ -import { opMarker } from '../../global'; -import { isResolvedSlotOp, isResolvedUnlockOp } from '../../utils'; -import { pushAwaitedTask } from '../awaited'; -import { shiftResolvedOp } from '../resolved'; - -export const unlock = (lockId: string) => { - console.log('lockOp'); - let opMarkerValue = false; - - const result = new Promise((resolve, reject) => { - try { - const { op, isOp } = shiftResolvedOp(); - - if (!isOp) { - pushAwaitedTask({ UnlockOp: { lockId } }); - opMarkerValue = true; - } else { - if (isResolvedSlotOp(op)) { - console.log('unlockOp-slotOp'); - return; - } - - if (!isResolvedUnlockOp(op)) { - console.log('unlockOp-error'); - throw new Error('Unlock operation not found'); - } - - resolve(); - } - } catch (error) { - reject(error); - } - }); - - (result as Promise & { [opMarker]: boolean })[opMarker] = opMarkerValue; - - return result; -}; diff --git a/packages/cwait/src/onchain/utils/constructTx/prepareInThreadTxs.ts b/packages/cwait/src/onchain/utils/constructTx/prepareInThreadTxs.ts index a7633ff..bff28e6 100644 --- a/packages/cwait/src/onchain/utils/constructTx/prepareInThreadTxs.ts +++ b/packages/cwait/src/onchain/utils/constructTx/prepareInThreadTxs.ts @@ -152,6 +152,22 @@ export const prepareInThreadTxs = ({ resolvedChildOps.push({ SlotOp: { ok: true } }); }); + if (preparedExecOps.length > 0) { + const execId = uuid(); + + const { callInfo, fee, ops } = constructExecOpsCall({ + issuer: context.issuer, + ops: preparedExecOps, + processId: context.thisId, + execId, + }); + + childCalls.push({ callInfo }); + txFee += fee; + + callArgs.push(...ops); + } + const returnTxs: NewTx[] = []; if (callArgs.length) { @@ -230,21 +246,5 @@ export const prepareInThreadTxs = ({ } } - if (preparedExecOps.length > 0) { - const execId = uuid(); - - const { callInfo, fee, ops } = constructExecOpsCall({ - issuer: context.issuer, - ops: preparedExecOps, - processId: context.thisId, - execId, - }); - - childCalls.push({ callInfo }); - txFee += fee; - - callArgs.push(...ops); - } - return { txs: returnTxs, calls: callsPrepared, txFee }; }; diff --git a/packages/cwait/src/onchain/utils/constructTx/prepareOutThreadTxs.ts b/packages/cwait/src/onchain/utils/constructTx/prepareOutThreadTxs.ts index d04bd3a..27f879c 100644 --- a/packages/cwait/src/onchain/utils/constructTx/prepareOutThreadTxs.ts +++ b/packages/cwait/src/onchain/utils/constructTx/prepareOutThreadTxs.ts @@ -35,7 +35,7 @@ export const prepareOutThreadTxs = ({ const preparedCalls: FullCallInfo[] = []; const preparedOps: PreparedOperation[] = []; - const preparedStoreAndTakes: (PreparedExtendedStoreOp | GTake)[] = []; + const preparedExecOps: (PreparedExtendedStoreOp | GTake)[] = []; let txFee = 0n; let callsPrepared = 0; @@ -77,7 +77,7 @@ export const prepareOutThreadTxs = ({ } case isPreparedStoreOp(op): case isPreparedTakeOp(op): { - preparedStoreAndTakes.push(op); + preparedExecOps.push(op); break; } case isPreparedLockOp(op): { @@ -107,10 +107,10 @@ export const prepareOutThreadTxs = ({ siblingCallResolvedOps.push({ SlotOp: { ok: true } }); }); - if (preparedStoreAndTakes.length > 0) { + if (preparedExecOps.length > 0) { const { callInfo, fee } = constructExecOpsCall({ issuer: context.issuer, - ops: preparedStoreAndTakes, + ops: preparedExecOps, processId: context.thisId, }); @@ -118,9 +118,17 @@ export const prepareOutThreadTxs = ({ txFee += fee; } + if (preparedCalls.length > 0 || preparedOps.length > 0) { + return { + txs: [constructContinueTx(getRawContext(), preparedOps, preparedCalls)], + txFee, + calls: callsPrepared, + }; + } + return { - txs: [constructContinueTx(getRawContext(), preparedOps, preparedCalls)], - txFee, - calls: callsPrepared, + txs: [], + txFee: 0n, + calls: 0, }; }; diff --git a/packages/cwait/src/onchain/utils/constructTx/prepareTxs.ts b/packages/cwait/src/onchain/utils/constructTx/prepareTxs.ts index 7e6ec95..eae399a 100644 --- a/packages/cwait/src/onchain/utils/constructTx/prepareTxs.ts +++ b/packages/cwait/src/onchain/utils/constructTx/prepareTxs.ts @@ -1,7 +1,7 @@ import { constructContinueTx, NewTx, passCwebFrom, sendCwebInterface } from '@coinweb/contract-kit'; import { context, getRawContext } from '../../context'; -import { getAwaitedTasks } from '../../promisifiedOps'; +import { getAwaitedTasks } from '../../promisifiedFeatures'; import { prepareInThreadTxs } from './prepareInThreadTxs'; import { prepareOutThreadTxs } from './prepareOutThreadTxs'; diff --git a/packages/ui/.env b/packages/ui/.env index 2964227..1f58cad 100644 --- a/packages/ui/.env +++ b/packages/ui/.env @@ -1,4 +1,4 @@ VITE_API_URL='https://api-cloud.coinweb.io/wallet' VITE_EXPLORER_URL='https://explorer.coinweb.io' -VITE_CONTRACT_ADDRESS="0xbf9ca1687e3441bed1afd495405778a9c06c2f5173829d47d9b87dfb150063d8" +VITE_CONTRACT_ADDRESS="0xa99515a81ee23d07dd08a72ec06646374d28df16de9ccdde16ed7e421ad26c83"