diff --git a/packages/contract.cm/src/offchain/uiCommands.ts b/packages/contract.cm/src/offchain/uiCommands.ts index 49aa006..68cc41c 100644 --- a/packages/contract.cm/src/offchain/uiCommands.ts +++ b/packages/contract.cm/src/offchain/uiCommands.ts @@ -9,6 +9,7 @@ export const constructAddWordUiCommand = ({ word, contractId }: { word: string; methodName: PUBLIC_METHODS.ADD_WORD, methodArgs: [[word] satisfies AddWordArgs], cost: FEE.ADD_WORD, + withQueue: false, }), ]); }; diff --git a/packages/contract.cm/src/onchain/addWord.ts b/packages/contract.cm/src/onchain/addWord.ts index 4616960..0b4ed0d 100644 --- a/packages/contract.cm/src/onchain/addWord.ts +++ b/packages/contract.cm/src/onchain/addWord.ts @@ -4,6 +4,8 @@ import { readOp, storeOp } from 'cwait'; import { TypedClaim } from '../../../lib/dist/shared/types'; import { AddWordArgs, createWordKey, WordClaimBody } from '../offchain/shared'; +import { extraLogic } from './extraLogic'; + function hashCode(str: string): string { let hash = 0; for (let i = 0, len = str.length; i < len; i++) { @@ -21,7 +23,7 @@ export const addWord = async (...[word]: AddWordArgs) => { await storeOp(constructClaim(createWordKey(id), { word }, '0x0')); - const wordClaim = await readOp>(createWordKey(id)); + const wordClaim = await extraLogic(id); const newWord1 = (wordClaim?.body.word ?? '') + '!'; const newId1 = hashCode(newWord1); diff --git a/packages/contract.cm/src/onchain/contract.ts b/packages/contract.cm/src/onchain/contract.ts index fc869fe..1e010f2 100644 --- a/packages/contract.cm/src/onchain/contract.ts +++ b/packages/contract.cm/src/onchain/contract.ts @@ -1,20 +1,16 @@ import { SELF_REGISTER_HANDLER_NAME, ContractHandlers as CKContractHandlers } from '@coinweb/contract-kit'; import { selfRegisterHandler } from '@coinweb/self-register'; -import { addMethodHandler, ContractHandlers, executeHandler, executor, MethodCallback, selfCallWrapper } from 'cwait'; +import { addMethodHandler, ContractHandlers, executeHandler, executor } from 'cwait'; import { queue } from 'lib/onchain'; import { PUBLIC_METHODS } from '../offchain/shared'; import { addWord } from './addWord'; -const addWrappers = (method: MethodCallback): MethodCallback => { - return selfCallWrapper(method); -}; - const createModule = (): ContractHandlers => { const module: ContractHandlers = { handlers: {} }; - addMethodHandler(module, PUBLIC_METHODS.ADD_WORD, addWrappers(executor(addWord))); + addMethodHandler(module, PUBLIC_METHODS.ADD_WORD, executor(addWord)); addMethodHandler(module, SELF_REGISTER_HANDLER_NAME, selfRegisterHandler); diff --git a/packages/contract.cm/src/onchain/extraLogic.ts b/packages/contract.cm/src/onchain/extraLogic.ts new file mode 100644 index 0000000..da66a75 --- /dev/null +++ b/packages/contract.cm/src/onchain/extraLogic.ts @@ -0,0 +1,9 @@ +import { readOp, TypedClaim } from 'cwait'; + +import { createWordKey, WordClaimBody } from '../offchain'; + +export const extraLogic = async (id: string) => { + const result = await readOp>(createWordKey(id)); + + return result; +}; diff --git a/packages/cwait/src/onchain/executor.ts b/packages/cwait/src/onchain/executor.ts index 84f2990..82035cc 100644 --- a/packages/cwait/src/onchain/executor.ts +++ b/packages/cwait/src/onchain/executor.ts @@ -6,14 +6,15 @@ import { constructContinueTx, constructContractRef, constructDataUnverified, + isSelfCall, } from '@coinweb/contract-kit'; import { getCallParameters, queue } from 'lib/onchain'; import { ResolvedOp, Task } from '../types'; import { context, getRawContext, setRawContext } from './context'; -import { getAwaitedOps } from './promisifedOps/awaited'; -import { pushResolvedOp } from './promisifedOps/resolved'; +import { getAwaitedOps } from './promisifiedOps/awaited'; +import { pushResolvedOp } from './promisifiedOps/resolved'; let abortExecution: ((result: boolean) => void) | null = null; @@ -29,7 +30,12 @@ const handleState = () => { pushResolvedOp(allResolvedOps); - return { args: initialArgs, methodName: methodArgs[0] as string, ops: allResolvedOps }; + return { + args: initialArgs, + methodName: methodArgs[0] as string, + ops: allResolvedOps, + isChildCall: previousOps.length > 0, + }; }; export const executor = @@ -39,7 +45,11 @@ export const executor = console.log('executor-start'); setRawContext(ctx); - const { args, methodName, ops } = handleState(); + const { args, methodName, ops, isChildCall } = handleState(); + + if (isChildCall && !isSelfCall(ctx)) { + throw new Error('Only contract itself can call it'); + } const execution = new Promise((resolve, reject) => { abortExecution = resolve; diff --git a/packages/cwait/src/onchain/global.ts b/packages/cwait/src/onchain/global.ts index 3c34642..919289d 100644 --- a/packages/cwait/src/onchain/global.ts +++ b/packages/cwait/src/onchain/global.ts @@ -1,4 +1,4 @@ -import { markOpBatch } from './promisifedOps/awaited'; +import { markOpBatch } from './promisifiedOps/awaited'; export const opMarker = Symbol('opMarker'); diff --git a/packages/cwait/src/onchain/index.ts b/packages/cwait/src/onchain/index.ts index b391dad..7be55b9 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 './promisifedOps'; +export * from './promisifiedOps'; diff --git a/packages/cwait/src/onchain/promisifedTxs/jumpTx.ts b/packages/cwait/src/onchain/promisifedTxs/jumpTx.ts deleted file mode 100644 index e69de29..0000000 diff --git a/packages/cwait/src/onchain/promisifedTxs/tx.ts b/packages/cwait/src/onchain/promisifedTxs/tx.ts deleted file mode 100644 index e69de29..0000000 diff --git a/packages/cwait/src/onchain/promisifedOps/awaited.ts b/packages/cwait/src/onchain/promisifiedOps/awaited.ts similarity index 100% rename from packages/cwait/src/onchain/promisifedOps/awaited.ts rename to packages/cwait/src/onchain/promisifiedOps/awaited.ts diff --git a/packages/cwait/src/onchain/promisifedOps/index.ts b/packages/cwait/src/onchain/promisifiedOps/index.ts similarity index 100% rename from packages/cwait/src/onchain/promisifedOps/index.ts rename to packages/cwait/src/onchain/promisifiedOps/index.ts diff --git a/packages/cwait/src/onchain/promisifedOps/ops/block.ts b/packages/cwait/src/onchain/promisifiedOps/ops/block.ts similarity index 100% rename from packages/cwait/src/onchain/promisifedOps/ops/block.ts rename to packages/cwait/src/onchain/promisifiedOps/ops/block.ts diff --git a/packages/cwait/src/onchain/promisifedOps/ops/index.ts b/packages/cwait/src/onchain/promisifiedOps/ops/index.ts similarity index 100% rename from packages/cwait/src/onchain/promisifedOps/ops/index.ts rename to packages/cwait/src/onchain/promisifiedOps/ops/index.ts diff --git a/packages/cwait/src/onchain/promisifedOps/ops/rangeRead.ts b/packages/cwait/src/onchain/promisifiedOps/ops/rangeRead.ts similarity index 100% rename from packages/cwait/src/onchain/promisifedOps/ops/rangeRead.ts rename to packages/cwait/src/onchain/promisifiedOps/ops/rangeRead.ts diff --git a/packages/cwait/src/onchain/promisifedOps/ops/read.ts b/packages/cwait/src/onchain/promisifiedOps/ops/read.ts similarity index 100% rename from packages/cwait/src/onchain/promisifedOps/ops/read.ts rename to packages/cwait/src/onchain/promisifiedOps/ops/read.ts diff --git a/packages/cwait/src/onchain/promisifedOps/ops/store.ts b/packages/cwait/src/onchain/promisifiedOps/ops/store.ts similarity index 100% rename from packages/cwait/src/onchain/promisifedOps/ops/store.ts rename to packages/cwait/src/onchain/promisifiedOps/ops/store.ts diff --git a/packages/cwait/src/onchain/promisifedOps/ops/take.ts b/packages/cwait/src/onchain/promisifiedOps/ops/take.ts similarity index 100% rename from packages/cwait/src/onchain/promisifedOps/ops/take.ts rename to packages/cwait/src/onchain/promisifiedOps/ops/take.ts diff --git a/packages/cwait/src/onchain/promisifedOps/resolved.ts b/packages/cwait/src/onchain/promisifiedOps/resolved.ts similarity index 100% rename from packages/cwait/src/onchain/promisifedOps/resolved.ts rename to packages/cwait/src/onchain/promisifiedOps/resolved.ts diff --git a/packages/cwait/src/onchain/promisifiedTxs/index.ts b/packages/cwait/src/onchain/promisifiedTxs/index.ts new file mode 100644 index 0000000..6b03561 --- /dev/null +++ b/packages/cwait/src/onchain/promisifiedTxs/index.ts @@ -0,0 +1,2 @@ +export * from './jumpTx'; +export * from './tx'; diff --git a/packages/cwait/src/onchain/promisifiedTxs/jumpTx.ts b/packages/cwait/src/onchain/promisifiedTxs/jumpTx.ts new file mode 100644 index 0000000..6ef6f86 --- /dev/null +++ b/packages/cwait/src/onchain/promisifiedTxs/jumpTx.ts @@ -0,0 +1 @@ +export const jumpTx = () => null; diff --git a/packages/cwait/src/onchain/promisifiedTxs/tx.ts b/packages/cwait/src/onchain/promisifiedTxs/tx.ts new file mode 100644 index 0000000..62a9327 --- /dev/null +++ b/packages/cwait/src/onchain/promisifiedTxs/tx.ts @@ -0,0 +1 @@ +export const tx = () => null; diff --git a/packages/ui/.env b/packages/ui/.env index 87ff2f2..c702916 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="0x049eedf15331c4c39155b286aa6be8ce50a0bcab15eac345913fd084a1f32bdd" \ No newline at end of file +VITE_CONTRACT_ADDRESS="0xd0b364db47a35710320a815fbcae80435ae83e0a1730e70529f1b0b2a6b7bfd5" \ No newline at end of file