From d9670b314abe9fc6facfb455df1e546567fd5dee Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 11 Apr 2025 01:39:55 +0300 Subject: [PATCH] feat: difference awaited and non-awaited promises --- package.json | 5 +- packages/contract.cm/src/onchain/addWord.ts | 3 +- .../{store.d.ts => declarations.d.ts} | 8 ++ packages/cwait/src/onchain/executor.ts | 62 +++++++--- packages/cwait/src/onchain/global.ts | 34 ++++++ .../src/onchain/promisifedOps/awaited.ts | 21 ++-- .../src/onchain/promisifedOps/ops/block.ts | 25 ++++- .../onchain/promisifedOps/ops/rangeRead.ts | 22 +++- .../src/onchain/promisifedOps/ops/read.ts | 22 +++- .../src/onchain/promisifedOps/ops/store.ts | 25 ++++- .../src/onchain/promisifedOps/ops/take.ts | 25 ++++- .../src/onchain/promisifedOps/resolved.ts | 8 +- .../cwait/src/onchain/promisifedTxs/jumpTx.ts | 0 .../cwait/src/onchain/promisifedTxs/tx.ts | 0 packages/cwait/src/onchain/utils/callstack.ts | 10 ++ packages/cwait/src/onchain/utils/index.ts | 2 + .../cwait/src/onchain/utils/typeGuards.ts | 50 +++++++++ packages/cwait/src/types.ts | 14 ++- packages/cwait/tsconfig.json | 2 +- packages/ui/.env | 2 +- ....timestamp-1744303471285-b82e0421dcee1.mjs | 106 ++++++++++++++++++ 21 files changed, 398 insertions(+), 48 deletions(-) rename packages/cwait/src/contract-kit/{store.d.ts => declarations.d.ts} (57%) create mode 100644 packages/cwait/src/onchain/global.ts create mode 100644 packages/cwait/src/onchain/promisifedTxs/jumpTx.ts create mode 100644 packages/cwait/src/onchain/promisifedTxs/tx.ts create mode 100644 packages/cwait/src/onchain/utils/callstack.ts create mode 100644 packages/cwait/src/onchain/utils/index.ts create mode 100644 packages/cwait/src/onchain/utils/typeGuards.ts create mode 100644 packages/ui/vite.config.ts.timestamp-1744303471285-b82e0421dcee1.mjs diff --git a/package.json b/package.json index 1458a9e..0e00e51 100644 --- a/package.json +++ b/package.json @@ -8,11 +8,12 @@ "scripts": { "build": "yarn build:cm && yarn build:non-cm", "build:production": "yarn build:cm && yarn workspace dapp-ui build:production", - "build:cm": "yarn workspaces foreach -Ap --include 'packages/lib' --include 'packages/cwait' --include 'packages/*.cm' run build", + "build:lib": "yarn workspaces foreach -Ap --include 'packages/lib' --include 'packages/cwait' run build", + "build:cm": "yarn build:lib && yarn workspaces foreach -Ap --include 'packages/*.cm' run build", "build:non-cm": "yarn workspaces foreach -Ap --include 'packages/*' --exclude 'packages/*.cm' --exclude 'packages/lib' --exclude 'packages/cwait' run build", "create-index": "cweb-tool create-index -c ./.cweb-config/config.yaml --profile $REGISTRATION_PROFILE", "publish-index": "cweb-tool publish-index -c ./.cweb-config/config.yaml --profile $REGISTRATION_PROFILE", - "deploy-contracts": "yarn publish-actions", + "deploy-contracts": "yarn build:cm && yarn publish-actions", "call-contracts": "yarn call-contracts:prepare && yarn call-contracts:invoke", "call-contracts:prepare": "yarn workspaces foreach --all run prepare-for-package && yarn node ./.cweb-config/create-calls.mjs", "call-contracts:invoke": "cweb-tool call .cweb-config/calls.yaml -c ./.cweb-config/config.yaml --profile $REGISTRATION_PROFILE", diff --git a/packages/contract.cm/src/onchain/addWord.ts b/packages/contract.cm/src/onchain/addWord.ts index d88c2f9..4616960 100644 --- a/packages/contract.cm/src/onchain/addWord.ts +++ b/packages/contract.cm/src/onchain/addWord.ts @@ -32,8 +32,9 @@ export const addWord = async (...[word]: AddWordArgs) => { const newWord3 = (wordClaim?.body.word ?? '') + '!!!'; const newId3 = hashCode(newWord3); + storeOp(constructClaim(createWordKey(newId1), { word: newWord1 }, '0x0')); + await Promise.all([ - storeOp(constructClaim(createWordKey(newId1), { word: newWord1 }, '0x0')), storeOp(constructClaim(createWordKey(newId2), { word: newWord2 }, '0x0')), storeOp(constructClaim(createWordKey(newId3), { word: newWord3 }, '0x0')), ]); diff --git a/packages/cwait/src/contract-kit/store.d.ts b/packages/cwait/src/contract-kit/declarations.d.ts similarity index 57% rename from packages/cwait/src/contract-kit/store.d.ts rename to packages/cwait/src/contract-kit/declarations.d.ts index e68f2ef..4a3db87 100644 --- a/packages/cwait/src/contract-kit/store.d.ts +++ b/packages/cwait/src/contract-kit/declarations.d.ts @@ -9,3 +9,11 @@ declare module '@coinweb/contract-kit/dist/esm/context' { declare module '@coinweb/contract-kit/dist/esm/method' { export * from '@coinweb/contract-kit/dist/types/method'; } + +declare module '@coinweb/contract-kit/dist/esm/operations/block' { + export * from '@coinweb/contract-kit/dist/types/operations/block'; +} + +declare module '@coinweb/contract-kit/dist/esm/operations/call' { + export * from '@coinweb/contract-kit/dist/types/operations/call'; +} diff --git a/packages/cwait/src/onchain/executor.ts b/packages/cwait/src/onchain/executor.ts index f57fb2f..84f2990 100644 --- a/packages/cwait/src/onchain/executor.ts +++ b/packages/cwait/src/onchain/executor.ts @@ -2,24 +2,26 @@ import { Context, extractContractArgs, NewTx, - ResolvedOperation, getMethodArguments, constructContinueTx, constructContractRef, + constructDataUnverified, } 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'; -let abortExecution: (() => void) | null = null; +let abortExecution: ((result: boolean) => void) | null = null; const handleState = () => { const ctx = getRawContext(); const resolvedOps = extractContractArgs(ctx.tx); - const methodArgs = getMethodArguments(ctx) as [unknown, unknown[], ResolvedOperation[]]; + const methodArgs = getMethodArguments(ctx) as [unknown, unknown[], ResolvedOp[]]; const initialArgs = methodArgs[1] ?? []; const previousOps = methodArgs[2] ?? []; @@ -34,51 +36,85 @@ export const executor = // eslint-disable-next-line @typescript-eslint/no-explicit-any (method: (...args: any[]) => Promise) => async (ctx: Context): Promise => { + console.log('executor-start'); setRawContext(ctx); const { args, methodName, ops } = handleState(); - const execution = new Promise((resolve, reject) => { + const execution = new Promise((resolve, reject) => { abortExecution = resolve; - method(...args).then(() => resolve(), reject); + method(...args).then( + () => { + console.log('executor-resolved'); + resolve(true); + }, + () => { + console.log('executor-rejected'); + reject(); + } + ); }); //@ts-expect-error // eslint-disable-next-line @typescript-eslint/no-unsafe-call os.setTimeout(() => { - abortExecution?.(); + abortExecution?.(false); }, 0); - await execution; + const isFullyExecuted = await execution; + + console.log('executor-executed'); const { authInfo, availableCweb } = getCallParameters(ctx); const awaitedOps = getAwaitedOps(); if (!awaitedOps.length) { - return queue.gateway.unlock(ctx); + return [constructContinueTx(ctx, [constructDataUnverified({ isFullyExecuted })]), ...queue.gateway.unlock(ctx)]; } - const txFee = 700n + BigInt(awaitedOps.length) * 100n; + const callArgs: Task[] = []; + + if (!isFullyExecuted) { + callArgs.push(awaitedOps.pop()!); + } + + if (callArgs[0]?.isBatch) { + while (awaitedOps.at(-1)?.isBatch) { + callArgs.push(awaitedOps.pop()!); + } + } + + const callFee = 700n + BigInt(callArgs.length) * 100n; + const opTxFee = awaitedOps.length ? 100n + BigInt(awaitedOps.length) * 100n : 0n; return [ constructContinueTx( ctx, - [], + awaitedOps.map(({ op }) => op), [ { callInfo: { ref: constructContractRef(context.issuer, []), methodInfo: { methodName, - methodArgs: [args, ops], + methodArgs: [ + args, + [ + ...ops, + ...Array(awaitedOps.length).fill({ SlotOp: 0 } satisfies ResolvedOp), + ] satisfies ResolvedOp[], + isFullyExecuted, + callArgs, + awaitedOps, + ], }, contractInfo: { - providedCweb: availableCweb - txFee, + providedCweb: availableCweb - callFee - opTxFee, authenticated: authInfo, }, - contractArgs: awaitedOps, + contractArgs: callArgs.map(({ op }) => op), }, }, ] diff --git a/packages/cwait/src/onchain/global.ts b/packages/cwait/src/onchain/global.ts new file mode 100644 index 0000000..3c34642 --- /dev/null +++ b/packages/cwait/src/onchain/global.ts @@ -0,0 +1,34 @@ +import { markOpBatch } from './promisifedOps/awaited'; + +export const opMarker = Symbol('opMarker'); + +const wrapPromiseUtil = + // eslint-disable-next-line @typescript-eslint/no-explicit-any + any>(nativePromiseUtil: T): T => + ((values: Parameters) => { + let argsWithMarker = 0; + values.forEach((arg) => { + if (arg instanceof Promise && (arg as Promise & { [opMarker]: boolean })[opMarker]) { + argsWithMarker++; + } + }); + + if (argsWithMarker > 0) { + markOpBatch(argsWithMarker); + } + + // eslint-disable-next-line @typescript-eslint/no-unsafe-return + return nativePromiseUtil(values); + }) as T; + +const nativePromiseAll = Promise.all.bind(Promise); +const nativePromiseRace = Promise.race.bind(Promise); +const nativePromiseAny = Promise.any.bind(Promise); +const nativePromiseSettled = Promise.allSettled.bind(Promise); +const nativePromiseAllSettled = Promise.allSettled.bind(Promise); + +globalThis.Promise.all = wrapPromiseUtil(nativePromiseAll); +globalThis.Promise.race = wrapPromiseUtil(nativePromiseRace); +globalThis.Promise.any = wrapPromiseUtil(nativePromiseAny); +globalThis.Promise.allSettled = wrapPromiseUtil(nativePromiseSettled); +globalThis.Promise.allSettled = wrapPromiseUtil(nativePromiseAllSettled); diff --git a/packages/cwait/src/onchain/promisifedOps/awaited.ts b/packages/cwait/src/onchain/promisifedOps/awaited.ts index 72e8634..4b0a60c 100644 --- a/packages/cwait/src/onchain/promisifedOps/awaited.ts +++ b/packages/cwait/src/onchain/promisifedOps/awaited.ts @@ -1,13 +1,20 @@ import { PreparedOperation } from '@coinweb/contract-kit'; -const awaitedOps: PreparedOperation[] = []; +import { Task } from '../../types'; +import { getStack } from '../utils'; -export const pushAwaitedOp = (op: PreparedOperation | PreparedOperation[]) => { - if (Array.isArray(op)) { - awaitedOps.push(...op); - } else { - awaitedOps.push(op); - } +const awaitedOps: Task[] = []; + +export const pushAwaitedOp = (op: PreparedOperation) => { + const stack = getStack({ skip: 2 }); + + awaitedOps.push({ op, stack, isBatch: false }); }; export const getAwaitedOps = () => awaitedOps; + +export const markOpBatch = (count: number) => { + for (let i = 1; i <= count; i++) { + awaitedOps.at(i * -1)!.isBatch = true; + } +}; diff --git a/packages/cwait/src/onchain/promisifedOps/ops/block.ts b/packages/cwait/src/onchain/promisifedOps/ops/block.ts index 8bc3b1a..799460f 100644 --- a/packages/cwait/src/onchain/promisifedOps/ops/block.ts +++ b/packages/cwait/src/onchain/promisifedOps/ops/block.ts @@ -1,17 +1,29 @@ -import { BlockFilter, constructBlock, extractBlock, isResolvedBlock } from '@coinweb/contract-kit'; +import { BlockFilter, constructBlock, extractBlock } from '@coinweb/contract-kit'; +import { opMarker } from '../../global'; +import { isResolvedBlockOp, isResolvedSlotOp } from '../../utils'; import { pushAwaitedOp } from '../awaited'; import { shiftResolvedOp } from '../resolved'; -export const blockOp = (filters: BlockFilter[]) => - new Promise<[BlockFilter, boolean][] | null>((resolve, reject) => { +export const blockOp = (filters: BlockFilter[]) => { + console.log('blockOp'); + let opMarkerValue = false; + + const result = new Promise<[BlockFilter, boolean][] | null>((resolve, reject) => { try { const { op, isOp } = shiftResolvedOp(); if (!isOp) { pushAwaitedOp(constructBlock(filters)); + opMarkerValue = true; } else { - if (op && !isResolvedBlock(op)) { + if (isResolvedSlotOp(op)) { + console.log('blockOp-slotOp'); + return; + } + + if (!isResolvedBlockOp(op)) { + console.log('blockOp-error'); throw new Error('Block operation not found'); } @@ -23,3 +35,8 @@ export const blockOp = (filters: BlockFilter[]) => reject(error); } }); + + (result as Promise<[BlockFilter, boolean][] | null> & { [opMarker]: boolean })[opMarker] = opMarkerValue; + + return result; +}; diff --git a/packages/cwait/src/onchain/promisifedOps/ops/rangeRead.ts b/packages/cwait/src/onchain/promisifedOps/ops/rangeRead.ts index 18ecb62..640d5a2 100644 --- a/packages/cwait/src/onchain/promisifedOps/ops/rangeRead.ts +++ b/packages/cwait/src/onchain/promisifedOps/ops/rangeRead.ts @@ -1,8 +1,10 @@ -import { Claim, ClaimKey, constructRangeRead, extractRead, isResolvedRead } from '@coinweb/contract-kit'; +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 { pushAwaitedOp } from '../awaited'; import { shiftResolvedOp } from '../resolved'; @@ -11,14 +13,24 @@ export const rangeReadOp = ( range: ClaimRange, maxCount: number ) => { - return new Promise((resolve, reject) => { + let opMarkerValue = false; + console.log('rangeReadOp'); + + const result = new Promise((resolve, reject) => { try { const { op, isOp } = shiftResolvedOp(); if (!isOp) { pushAwaitedOp(constructRangeRead(context.issuer, firstPart, range, maxCount)); + opMarkerValue = true; } else { - if (op && !isResolvedRead(op)) { + if (isResolvedSlotOp(op)) { + console.log('rangeReadOp-slotOp'); + return; + } + + if (!isResolvedReadOp(op)) { + console.log('rangeReadOp-error'); throw new Error('Read operation not found'); } @@ -29,4 +41,8 @@ export const rangeReadOp = ( reject(error); } }); + + (result as Promise & { [opMarker]: boolean })[opMarker] = opMarkerValue; + + return result; }; diff --git a/packages/cwait/src/onchain/promisifedOps/ops/read.ts b/packages/cwait/src/onchain/promisifedOps/ops/read.ts index 27f4d36..514ed42 100644 --- a/packages/cwait/src/onchain/promisifedOps/ops/read.ts +++ b/packages/cwait/src/onchain/promisifedOps/ops/read.ts @@ -1,19 +1,31 @@ -import { Claim, ClaimKey, constructRead, extractRead, isResolvedRead } from '@coinweb/contract-kit'; +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 { pushAwaitedOp } from '../awaited'; import { shiftResolvedOp } from '../resolved'; export const readOp = (key: ClaimKey) => { - return new Promise((resolve, reject) => { + console.log('readOp'); + let opMarkerValue = false; + + const result = new Promise((resolve, reject) => { try { const { op, isOp } = shiftResolvedOp(); if (!isOp) { pushAwaitedOp(constructRead(context.issuer, key)); + opMarkerValue = true; } else { - if (op && !isResolvedRead(op)) { + if (isResolvedSlotOp(op)) { + console.log('readOp-slotOp'); + return; + } + + if (!isResolvedReadOp(op)) { + console.log('readOp-error'); throw new Error('Read operation not found'); } @@ -24,4 +36,8 @@ export const readOp = (key: ClaimKey) => { reject(error); } }); + + (result as Promise & { [opMarker]: boolean })[opMarker] = opMarkerValue; + + return result; }; diff --git a/packages/cwait/src/onchain/promisifedOps/ops/store.ts b/packages/cwait/src/onchain/promisifedOps/ops/store.ts index a38e15b..0145685 100644 --- a/packages/cwait/src/onchain/promisifedOps/ops/store.ts +++ b/packages/cwait/src/onchain/promisifedOps/ops/store.ts @@ -1,18 +1,30 @@ -import { Claim, constructStore, isResolvedStore } from '@coinweb/contract-kit'; +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 { pushAwaitedOp } from '../awaited'; import { shiftResolvedOp } from '../resolved'; -export const storeOp = (claim: Claim) => - new Promise((resolve, reject) => { +export const storeOp = (claim: Claim) => { + console.log('storeOp'); + let opMarkerValue = false; + + const result = new Promise((resolve, reject) => { try { const { op, isOp } = shiftResolvedOp(); if (!isOp) { pushAwaitedOp(constructStore(claim)); + opMarkerValue = true; } else { - if (op && !isResolvedStore(op)) { + if (isResolvedSlotOp(op)) { + console.log('storeOp-slotOp'); + return; + } + + if (!isResolvedStoreOp(op)) { + console.log('storeOp-error'); throw new Error('Store operation not found'); } @@ -24,3 +36,8 @@ export const storeOp = (claim: Claim) => reject(error); } }); + + (result as Promise & { [opMarker]: boolean })[opMarker] = opMarkerValue; + + return result; +}; diff --git a/packages/cwait/src/onchain/promisifedOps/ops/take.ts b/packages/cwait/src/onchain/promisifedOps/ops/take.ts index 3c916f7..5c9c507 100644 --- a/packages/cwait/src/onchain/promisifedOps/ops/take.ts +++ b/packages/cwait/src/onchain/promisifedOps/ops/take.ts @@ -1,18 +1,30 @@ -import { constructTake, extractTake, isResolvedTake, Claim, ClaimKey } from '@coinweb/contract-kit'; +import { Claim, ClaimKey, constructTake, extractTake } from '@coinweb/contract-kit'; import { TypedClaim } from '../../../types'; +import { opMarker } from '../../global'; +import { isResolvedSlotOp, isResolvedTakeOp } from '../../utils'; import { pushAwaitedOp } from '../awaited'; import { shiftResolvedOp } from '../resolved'; -export const takeOp = (key: ClaimKey) => - new Promise((resolve, reject) => { +export const takeOp = (key: ClaimKey) => { + console.log('takeOp'); + let opMarkerValue = false; + + const result = new Promise((resolve, reject) => { try { const { op, isOp } = shiftResolvedOp(); if (!isOp) { pushAwaitedOp(constructTake(key)); + opMarkerValue = true; } else { - if (op && !isResolvedTake(op)) { + if (isResolvedSlotOp(op)) { + console.log('takeOp-slotOp'); + return; + } + + if (!isResolvedTakeOp(op)) { + console.log('takeOp-error'); throw new Error('Take operation not found'); } @@ -23,3 +35,8 @@ export const takeOp = (key: ClaimKey) => reject(error); } }); + + (result as Promise & { [opMarker]: boolean })[opMarker] = opMarkerValue; + + return result; +}; diff --git a/packages/cwait/src/onchain/promisifedOps/resolved.ts b/packages/cwait/src/onchain/promisifedOps/resolved.ts index 516bbbb..c3189dd 100644 --- a/packages/cwait/src/onchain/promisifedOps/resolved.ts +++ b/packages/cwait/src/onchain/promisifedOps/resolved.ts @@ -1,8 +1,8 @@ -import { ResolvedOperation } from '@coinweb/contract-kit'; +import { ResolvedOp } from '../../types'; -const resolvedOps: ResolvedOperation[] = []; +const resolvedOps: ResolvedOp[] = []; -export const pushResolvedOp = (op: ResolvedOperation | ResolvedOperation[]) => { +export const pushResolvedOp = (op: ResolvedOp | ResolvedOp[]) => { if (Array.isArray(op)) { resolvedOps.push(...op); } else { @@ -17,7 +17,7 @@ export const shiftResolvedOp = () => }) as | { isOp: true; - op: ResolvedOperation | null; + op: ResolvedOp | null; } | { isOp: false; diff --git a/packages/cwait/src/onchain/promisifedTxs/jumpTx.ts b/packages/cwait/src/onchain/promisifedTxs/jumpTx.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/cwait/src/onchain/promisifedTxs/tx.ts b/packages/cwait/src/onchain/promisifedTxs/tx.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/cwait/src/onchain/utils/callstack.ts b/packages/cwait/src/onchain/utils/callstack.ts new file mode 100644 index 0000000..ea22049 --- /dev/null +++ b/packages/cwait/src/onchain/utils/callstack.ts @@ -0,0 +1,10 @@ +export const getStack = ({ skip = 0 }: { skip?: number } = {}) => + new Error().stack + ?.split('\n') + .slice(2 + skip) + .map((line) => { + const match = line.match(/at\s+([^\s(]+)/); + return match ? match[1] : ''; + }) + .filter((name) => name && name !== 'Promise') + .join('@') || ''; diff --git a/packages/cwait/src/onchain/utils/index.ts b/packages/cwait/src/onchain/utils/index.ts new file mode 100644 index 0000000..e7b425c --- /dev/null +++ b/packages/cwait/src/onchain/utils/index.ts @@ -0,0 +1,2 @@ +export * from './callstack'; +export * from './typeGuards'; diff --git a/packages/cwait/src/onchain/utils/typeGuards.ts b/packages/cwait/src/onchain/utils/typeGuards.ts new file mode 100644 index 0000000..9df5655 --- /dev/null +++ b/packages/cwait/src/onchain/utils/typeGuards.ts @@ -0,0 +1,50 @@ +import { + CwebStore, + isResolvedBlock, + isResolvedRead, + isResolvedStore, + isResolvedTake, + ResolvedRead, + ResolvedTake, +} from '@coinweb/contract-kit'; +import { CwebCallRefResolved, isResolvedCall } from '@coinweb/contract-kit/dist/esm/operations/call'; +import { ResolvedBlock } from '@coinweb/contract-kit/dist/types/operations/block'; +import { GBlock, GCall, GRead, GStore, GTake } from '@coinweb/contract-kit/dist/types/operations/generics'; + +import { ResolvedOp, SlotOp } from '../../types'; + +export const isResolvedSlotOp = (op?: ResolvedOp | null): op is SlotOp => { + console.log('isResolvedSlotOp', JSON.stringify(op)); + console.log('isResolvedSlotOp', !!(op && 'SlotOp' in op)); + return !!(op && 'SlotOp' in op); +}; + +export const isResolvedBlockOp = (op?: ResolvedOp | null): op is GBlock => { + console.log('isResolvedBlockOp', JSON.stringify(op)); + console.log('isResolvedBlockOp', !!(op && !isResolvedSlotOp(op) && isResolvedBlock(op))); + return !!(op && !isResolvedSlotOp(op) && isResolvedBlock(op)); +}; + +export const isResolvedStoreOp = (op?: ResolvedOp | null): op is GStore => { + console.log('isResolvedStoreOp', JSON.stringify(op)); + console.log('isResolvedStoreOp', !!(op && !isResolvedSlotOp(op) && isResolvedStore(op))); + return !!(op && !isResolvedSlotOp(op) && isResolvedStore(op)); +}; + +export const isResolvedCallOp = (op?: ResolvedOp | null): op is GCall => { + console.log('isResolvedCallOp', JSON.stringify(op)); + console.log('isResolvedCallOp', !!(op && !isResolvedSlotOp(op) && isResolvedCall(op))); + return !!(op && !isResolvedSlotOp(op) && isResolvedCall(op)); +}; + +export const isResolvedTakeOp = (op?: ResolvedOp | null): op is GTake => { + console.log('isResolvedTakeOp', JSON.stringify(op)); + console.log('isResolvedTakeOp', !!(op && !isResolvedSlotOp(op) && isResolvedTake(op))); + return !!(op && !isResolvedSlotOp(op) && isResolvedTake(op)); +}; + +export const isResolvedReadOp = (op?: ResolvedOp | null): op is GRead => { + console.log('isResolvedReadOp', JSON.stringify(op)); + console.log('isResolvedReadOp', !!(op && !isResolvedSlotOp(op) && isResolvedRead(op))); + return !!(op && !isResolvedSlotOp(op) && isResolvedRead(op)); +}; diff --git a/packages/cwait/src/types.ts b/packages/cwait/src/types.ts index 1f3a73d..027e0bc 100644 --- a/packages/cwait/src/types.ts +++ b/packages/cwait/src/types.ts @@ -1,4 +1,4 @@ -import { Claim, ClaimKey, OrdJson } from '@coinweb/contract-kit'; +import { Claim, ClaimKey, OrdJson, PreparedOperation, ResolvedOperation } from '@coinweb/contract-kit'; export type HexBigInt = `0x${string}`; @@ -7,3 +7,15 @@ export type TypedClaim { + process.env = { ...process.env, ...loadEnv(mode, process.cwd()) }; + const base = process.env.VITE_BASENAME; + return { + base: base?.length != 0 ? base : "/", + build: { + sourcemap: true, + chunkSizeWarningLimit: Infinity, + target: "ESNEXT", + minify: "esbuild", + rollupOptions: { + treeshake: true, + output: { + manualChunks: { + react: ["react", "react-dom", "react-router-dom"], + cms: ["contract.cm"] + } + }, + onwarn(warning, warn) { + if (warning.code === "INVALID_ANNOTATION") { + if (warning.message.includes("__PURE__")) { + return; + } + } + if (warning.message.includes('Use of eval in "../../node_modules/vm-browserify/index.js"')) { + return; + } + warn(warning); + } + } + }, + plugins: [ + react(), + wasm(), + nodePolyfills({ + include: ["process", "buffer", "vm", "crypto", "stream", "assert", "http", "https", "os", "url", "util"] + }), + visualizer({ open: false, filename: "bundle-visualization.html" }) + ], + server: { + port: 3e3, + fs: { + cachedChecks: false + }, + proxy: { + "/api/getTvl": { + target: `${process.env.VITE_CWAP_API_URL}/cwap_cm/getTvl`, + changeOrigin: true, + rewrite: (path2) => { + const result = path2.replace("/api/getTvl", ""); + const searchParams = new URLSearchParams({ + btcC1: process.env.VITE_L2_CONTRACT_ADDRESS_BASE_BTC ?? "", + btcC2: process.env.VITE_L2_CONTRACT_ADDRESS_MAKER_BTC ?? "", + ethC1: process.env.VITE_L2_CONTRACT_ADDRESS_BASE_ETH ?? "", + ethC2: process.env.VITE_L2_CONTRACT_ADDRESS_MAKER_ETH ?? "", + usdtEthC1: process.env.VITE_L2_CONTRACT_ADDRESS_BASE_USDT_ETH ?? "", + usdtEthC2: process.env.VITE_L2_CONTRACT_ADDRESS_MAKER_USDT_ETH ?? "", + usdtBnbC1: process.env.VITE_L2_CONTRACT_ADDRESS_BASE_USDT_BNB ?? "", + usdtBnbC2: process.env.VITE_L2_CONTRACT_ADDRESS_MAKER_USDT_BNB ?? "", + bnbC1: process.env.VITE_L2_CONTRACT_ADDRESS_BASE_BNB ?? "", + bnbC2: process.env.VITE_L2_CONTRACT_ADDRESS_MAKER_BNB ?? "" + }); + return result + "?" + searchParams.toString(); + } + } + } + }, + test: { + globals: true, + environment: "jsdom", + setupFiles: "./vitest.setup.ts", + silent: true + }, + define: { + __MOCKS__: false + }, + resolve: { + alias: { + process: "process/browser", + buffer: "buffer", + crypto: "crypto-browserify", + stream: "stream-browserify", + assert: "assert", + http: "stream-http", + https: "https-browserify", + os: "os-browserify", + url: "url", + util: "util", + "@": path.resolve(__vite_injected_original_dirname, "./src") + } + } + }; +}); +export { + vite_config_default as default +}; +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCIvaG9tZS9hcmFuZXVzL2N3YWl0L3BhY2thZ2VzL3VpXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ZpbGVuYW1lID0gXCIvaG9tZS9hcmFuZXVzL2N3YWl0L3BhY2thZ2VzL3VpL3ZpdGUuY29uZmlnLnRzXCI7Y29uc3QgX192aXRlX2luamVjdGVkX29yaWdpbmFsX2ltcG9ydF9tZXRhX3VybCA9IFwiZmlsZTovLy9ob21lL2FyYW5ldXMvY3dhaXQvcGFja2FnZXMvdWkvdml0ZS5jb25maWcudHNcIjsvLy8gPHJlZmVyZW5jZSB0eXBlcz1cInZpdGVzdFwiIC8+XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IHJlYWN0IGZyb20gJ0B2aXRlanMvcGx1Z2luLXJlYWN0JztcbmltcG9ydCB7IHZpc3VhbGl6ZXIgfSBmcm9tICdyb2xsdXAtcGx1Z2luLXZpc3VhbGl6ZXInO1xuaW1wb3J0IHsgbG9hZEVudiB9IGZyb20gJ3ZpdGUnO1xuaW1wb3J0IHsgbm9kZVBvbHlmaWxscyB9IGZyb20gJ3ZpdGUtcGx1Z2luLW5vZGUtcG9seWZpbGxzJztcbmltcG9ydCB3YXNtIGZyb20gJ3ZpdGUtcGx1Z2luLXdhc20nO1xuaW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSAndml0ZXN0L2NvbmZpZyc7XG5cbi8vIGh0dHBzOi8vdml0ZWpzLmRldi9jb25maWcvXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoKHsgbW9kZSB9KSA9PiB7XG4gIHByb2Nlc3MuZW52ID0geyAuLi5wcm9jZXNzLmVudiwgLi4ubG9hZEVudihtb2RlLCBwcm9jZXNzLmN3ZCgpKSB9O1xuICBjb25zdCBiYXNlID0gcHJvY2Vzcy5lbnYuVklURV9CQVNFTkFNRTtcbiAgcmV0dXJuIHtcbiAgICBiYXNlOiBiYXNlPy5sZW5ndGggIT0gMCA/IGJhc2UgOiAnLycsXG4gICAgYnVpbGQ6IHtcbiAgICAgIHNvdXJjZW1hcDogdHJ1ZSxcbiAgICAgIGNodW5rU2l6ZVdhcm5pbmdMaW1pdDogSW5maW5pdHksXG4gICAgICB0YXJnZXQ6ICdFU05FWFQnLFxuICAgICAgbWluaWZ5OiAnZXNidWlsZCcsXG4gICAgICByb2xsdXBPcHRpb25zOiB7XG4gICAgICAgIHRyZWVzaGFrZTogdHJ1ZSxcbiAgICAgICAgb3V0cHV0OiB7XG4gICAgICAgICAgbWFudWFsQ2h1bmtzOiB7XG4gICAgICAgICAgICByZWFjdDogWydyZWFjdCcsICdyZWFjdC1kb20nLCAncmVhY3Qtcm91dGVyLWRvbSddLFxuICAgICAgICAgICAgY21zOiBbJ2NvbnRyYWN0LmNtJ10sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgb253YXJuKHdhcm5pbmcsIHdhcm4pIHtcbiAgICAgICAgICBpZiAod2FybmluZy5jb2RlID09PSAnSU5WQUxJRF9BTk5PVEFUSU9OJykge1xuICAgICAgICAgICAgLy8gU3VwcHJlc3MgaWYgdGhlIG1lc3NhZ2UgY29udGFpbnMgXCJfX1BVUkVfX1wiXG4gICAgICAgICAgICBpZiAod2FybmluZy5tZXNzYWdlLmluY2x1ZGVzKCdfX1BVUkVfXycpKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gU3VwcHJlc3MgZXZhbCB3YXJuaW5nIGZyb20gdm0tYnJvd3NlcmlmeVxuICAgICAgICAgIGlmICh3YXJuaW5nLm1lc3NhZ2UuaW5jbHVkZXMoJ1VzZSBvZiBldmFsIGluIFwiLi4vLi4vbm9kZV9tb2R1bGVzL3ZtLWJyb3dzZXJpZnkvaW5kZXguanNcIicpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHdhcm4od2FybmluZyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICAgcGx1Z2luczogW1xuICAgICAgcmVhY3QoKSxcbiAgICAgIHdhc20oKSxcbiAgICAgIG5vZGVQb2x5ZmlsbHMoe1xuICAgICAgICBpbmNsdWRlOiBbJ3Byb2Nlc3MnLCAnYnVmZmVyJywgJ3ZtJywgJ2NyeXB0bycsICdzdHJlYW0nLCAnYXNzZXJ0JywgJ2h0dHAnLCAnaHR0cHMnLCAnb3MnLCAndXJsJywgJ3V0aWwnXSxcbiAgICAgIH0pLFxuICAgICAgdmlzdWFsaXplcih7IG9wZW46IGZhbHNlLCBmaWxlbmFtZTogJ2J1bmRsZS12aXN1YWxpemF0aW9uLmh0bWwnIH0pLFxuICAgIF0sXG4gICAgc2VydmVyOiB7XG4gICAgICBwb3J0OiAzMDAwLFxuICAgICAgZnM6IHtcbiAgICAgICAgY2FjaGVkQ2hlY2tzOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBwcm94eToge1xuICAgICAgICAnL2FwaS9nZXRUdmwnOiB7XG4gICAgICAgICAgdGFyZ2V0OiBgJHtwcm9jZXNzLmVudi5WSVRFX0NXQVBfQVBJX1VSTH0vY3dhcF9jbS9nZXRUdmxgLFxuICAgICAgICAgIGNoYW5nZU9yaWdpbjogdHJ1ZSxcbiAgICAgICAgICByZXdyaXRlOiAocGF0aCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcGF0aC5yZXBsYWNlKCcvYXBpL2dldFR2bCcsICcnKTtcbiAgICAgICAgICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICAgICAgICBidGNDMTogcHJvY2Vzcy5lbnYuVklURV9MMl9DT05UUkFDVF9BRERSRVNTX0JBU0VfQlRDID8/ICcnLFxuICAgICAgICAgICAgICBidGNDMjogcHJvY2Vzcy5lbnYuVklURV9MMl9DT05UUkFDVF9BRERSRVNTX01BS0VSX0JUQyA/PyAnJyxcbiAgICAgICAgICAgICAgZXRoQzE6IHByb2Nlc3MuZW52LlZJVEVfTDJfQ09OVFJBQ1RfQUREUkVTU19CQVNFX0VUSCA/PyAnJyxcbiAgICAgICAgICAgICAgZXRoQzI6IHByb2Nlc3MuZW52LlZJVEVfTDJfQ09OVFJBQ1RfQUREUkVTU19NQUtFUl9FVEggPz8gJycsXG4gICAgICAgICAgICAgIHVzZHRFdGhDMTogcHJvY2Vzcy5lbnYuVklURV9MMl9DT05UUkFDVF9BRERSRVNTX0JBU0VfVVNEVF9FVEggPz8gJycsXG4gICAgICAgICAgICAgIHVzZHRFdGhDMjogcHJvY2Vzcy5lbnYuVklURV9MMl9DT05UUkFDVF9BRERSRVNTX01BS0VSX1VTRFRfRVRIID8/ICcnLFxuICAgICAgICAgICAgICB1c2R0Qm5iQzE6IHByb2Nlc3MuZW52LlZJVEVfTDJfQ09OVFJBQ1RfQUREUkVTU19CQVNFX1VTRFRfQk5CID8/ICcnLFxuICAgICAgICAgICAgICB1c2R0Qm5iQzI6IHByb2Nlc3MuZW52LlZJVEVfTDJfQ09OVFJBQ1RfQUREUkVTU19NQUtFUl9VU0RUX0JOQiA/PyAnJyxcbiAgICAgICAgICAgICAgYm5iQzE6IHByb2Nlc3MuZW52LlZJVEVfTDJfQ09OVFJBQ1RfQUREUkVTU19CQVNFX0JOQiA/PyAnJyxcbiAgICAgICAgICAgICAgYm5iQzI6IHByb2Nlc3MuZW52LlZJVEVfTDJfQ09OVFJBQ1RfQUREUkVTU19NQUtFUl9CTkIgPz8gJycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyAnPycgKyBzZWFyY2hQYXJhbXMudG9TdHJpbmcoKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHRlc3Q6IHtcbiAgICAgIGdsb2JhbHM6IHRydWUsXG4gICAgICBlbnZpcm9ubWVudDogJ2pzZG9tJyxcbiAgICAgIHNldHVwRmlsZXM6ICcuL3ZpdGVzdC5zZXR1cC50cycsXG4gICAgICBzaWxlbnQ6IHRydWUsXG4gICAgfSxcbiAgICBkZWZpbmU6IHtcbiAgICAgIF9fTU9DS1NfXzogZmFsc2UsXG4gICAgfSxcbiAgICByZXNvbHZlOiB7XG4gICAgICBhbGlhczoge1xuICAgICAgICBwcm9jZXNzOiAncHJvY2Vzcy9icm93c2VyJyxcbiAgICAgICAgYnVmZmVyOiAnYnVmZmVyJyxcbiAgICAgICAgY3J5cHRvOiAnY3J5cHRvLWJyb3dzZXJpZnknLFxuICAgICAgICBzdHJlYW06ICdzdHJlYW0tYnJvd3NlcmlmeScsXG4gICAgICAgIGFzc2VydDogJ2Fzc2VydCcsXG4gICAgICAgIGh0dHA6ICdzdHJlYW0taHR0cCcsXG4gICAgICAgIGh0dHBzOiAnaHR0cHMtYnJvd3NlcmlmeScsXG4gICAgICAgIG9zOiAnb3MtYnJvd3NlcmlmeScsXG4gICAgICAgIHVybDogJ3VybCcsXG4gICAgICAgIHV0aWw6ICd1dGlsJyxcbiAgICAgICAgJ0AnOiBwYXRoLnJlc29sdmUoX19kaXJuYW1lLCAnLi9zcmMnKSxcbiAgICAgIH0sXG4gICAgfSxcbiAgfTtcbn0pO1xuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUNBLE9BQU8sVUFBVTtBQUVqQixPQUFPLFdBQVc7QUFDbEIsU0FBUyxrQkFBa0I7QUFDM0IsU0FBUyxlQUFlO0FBQ3hCLFNBQVMscUJBQXFCO0FBQzlCLE9BQU8sVUFBVTtBQUNqQixTQUFTLG9CQUFvQjtBQVI3QixJQUFNLG1DQUFtQztBQVd6QyxJQUFPLHNCQUFRLGFBQWEsQ0FBQyxFQUFFLEtBQUssTUFBTTtBQUN4QyxVQUFRLE1BQU0sRUFBRSxHQUFHLFFBQVEsS0FBSyxHQUFHLFFBQVEsTUFBTSxRQUFRLElBQUksQ0FBQyxFQUFFO0FBQ2hFLFFBQU0sT0FBTyxRQUFRLElBQUk7QUFDekIsU0FBTztBQUFBLElBQ0wsTUFBTSxNQUFNLFVBQVUsSUFBSSxPQUFPO0FBQUEsSUFDakMsT0FBTztBQUFBLE1BQ0wsV0FBVztBQUFBLE1BQ1gsdUJBQXVCO0FBQUEsTUFDdkIsUUFBUTtBQUFBLE1BQ1IsUUFBUTtBQUFBLE1BQ1IsZUFBZTtBQUFBLFFBQ2IsV0FBVztBQUFBLFFBQ1gsUUFBUTtBQUFBLFVBQ04sY0FBYztBQUFBLFlBQ1osT0FBTyxDQUFDLFNBQVMsYUFBYSxrQkFBa0I7QUFBQSxZQUNoRCxLQUFLLENBQUMsYUFBYTtBQUFBLFVBQ3JCO0FBQUEsUUFDRjtBQUFBLFFBQ0EsT0FBTyxTQUFTLE1BQU07QUFDcEIsY0FBSSxRQUFRLFNBQVMsc0JBQXNCO0FBRXpDLGdCQUFJLFFBQVEsUUFBUSxTQUFTLFVBQVUsR0FBRztBQUN4QztBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBRUEsY0FBSSxRQUFRLFFBQVEsU0FBUyw0REFBNEQsR0FBRztBQUMxRjtBQUFBLFVBQ0Y7QUFDQSxlQUFLLE9BQU87QUFBQSxRQUNkO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQLE1BQU07QUFBQSxNQUNOLEtBQUs7QUFBQSxNQUNMLGNBQWM7QUFBQSxRQUNaLFNBQVMsQ0FBQyxXQUFXLFVBQVUsTUFBTSxVQUFVLFVBQVUsVUFBVSxRQUFRLFNBQVMsTUFBTSxPQUFPLE1BQU07QUFBQSxNQUN6RyxDQUFDO0FBQUEsTUFDRCxXQUFXLEVBQUUsTUFBTSxPQUFPLFVBQVUsNEJBQTRCLENBQUM7QUFBQSxJQUNuRTtBQUFBLElBQ0EsUUFBUTtBQUFBLE1BQ04sTUFBTTtBQUFBLE1BQ04sSUFBSTtBQUFBLFFBQ0YsY0FBYztBQUFBLE1BQ2hCO0FBQUEsTUFDQSxPQUFPO0FBQUEsUUFDTCxlQUFlO0FBQUEsVUFDYixRQUFRLEdBQUcsUUFBUSxJQUFJLGlCQUFpQjtBQUFBLFVBQ3hDLGNBQWM7QUFBQSxVQUNkLFNBQVMsQ0FBQ0EsVUFBUztBQUNqQixrQkFBTSxTQUFTQSxNQUFLLFFBQVEsZUFBZSxFQUFFO0FBQzdDLGtCQUFNLGVBQWUsSUFBSSxnQkFBZ0I7QUFBQSxjQUN2QyxPQUFPLFFBQVEsSUFBSSxxQ0FBcUM7QUFBQSxjQUN4RCxPQUFPLFFBQVEsSUFBSSxzQ0FBc0M7QUFBQSxjQUN6RCxPQUFPLFFBQVEsSUFBSSxxQ0FBcUM7QUFBQSxjQUN4RCxPQUFPLFFBQVEsSUFBSSxzQ0FBc0M7QUFBQSxjQUN6RCxXQUFXLFFBQVEsSUFBSSwwQ0FBMEM7QUFBQSxjQUNqRSxXQUFXLFFBQVEsSUFBSSwyQ0FBMkM7QUFBQSxjQUNsRSxXQUFXLFFBQVEsSUFBSSwwQ0FBMEM7QUFBQSxjQUNqRSxXQUFXLFFBQVEsSUFBSSwyQ0FBMkM7QUFBQSxjQUNsRSxPQUFPLFFBQVEsSUFBSSxxQ0FBcUM7QUFBQSxjQUN4RCxPQUFPLFFBQVEsSUFBSSxzQ0FBc0M7QUFBQSxZQUMzRCxDQUFDO0FBQ0QsbUJBQU8sU0FBUyxNQUFNLGFBQWEsU0FBUztBQUFBLFVBQzlDO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFDQSxNQUFNO0FBQUEsTUFDSixTQUFTO0FBQUEsTUFDVCxhQUFhO0FBQUEsTUFDYixZQUFZO0FBQUEsTUFDWixRQUFRO0FBQUEsSUFDVjtBQUFBLElBQ0EsUUFBUTtBQUFBLE1BQ04sV0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBLFNBQVM7QUFBQSxNQUNQLE9BQU87QUFBQSxRQUNMLFNBQVM7QUFBQSxRQUNULFFBQVE7QUFBQSxRQUNSLFFBQVE7QUFBQSxRQUNSLFFBQVE7QUFBQSxRQUNSLFFBQVE7QUFBQSxRQUNSLE1BQU07QUFBQSxRQUNOLE9BQU87QUFBQSxRQUNQLElBQUk7QUFBQSxRQUNKLEtBQUs7QUFBQSxRQUNMLE1BQU07QUFBQSxRQUNOLEtBQUssS0FBSyxRQUFRLGtDQUFXLE9BQU87QUFBQSxNQUN0QztBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0YsQ0FBQzsiLAogICJuYW1lcyI6IFsicGF0aCJdCn0K