From a98aa340db5c8db263f865f9fd46ed1ab27b51bf Mon Sep 17 00:00:00 2001 From: Pierre Jeanjacquot <26487010+PierreJeanjacquot@users.noreply.github.com> Date: Tue, 18 Nov 2025 17:30:41 +0100 Subject: [PATCH] fix: allow DATASET_INFINITE_VOLUME - 1 in bulk for compatibility with existing orders --- api/src/services/order.js | 3 ++- api/src/utils/order-utils.js | 8 +++++++- api/test/datasetorders.test.js | 32 ++++++++++++++++++++++++++------ 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/api/src/services/order.js b/api/src/services/order.js index 546b31d..f93367e 100644 --- a/api/src/services/order.js +++ b/api/src/services/order.js @@ -31,6 +31,7 @@ import { TAG_MAP, tagToArray, excludeTagArray, + DATASET_INFINITE_VOLUME, } from '../utils/order-utils.js'; import { maxOpenOrdersPerWallet } from '../config.js'; import { ANY } from '../utils/keywords.js'; @@ -588,7 +589,7 @@ const getDatasetorders = async ({ ...(dataset && requiredDatasetOrAnyClause(dataset)), ...(datasetOwner && { signer: datasetOwner }), ...(bulkOnly && { - 'order.volume': Number.MAX_SAFE_INTEGER, + 'order.volume': { $gte: DATASET_INFINITE_VOLUME - 1 }, // DATASET_INFINITE_VOLUME - 1 is accepted for compatibility with existing orders 'order.datasetprice': 0, }), ...apprestrictOrAnyClause(app, isAppStrict), diff --git a/api/src/utils/order-utils.js b/api/src/utils/order-utils.js index 2003db5..d8440f0 100644 --- a/api/src/utils/order-utils.js +++ b/api/src/utils/order-utils.js @@ -139,8 +139,13 @@ const excludeTagArray = (tagArray) => }) .filter((e) => e !== null); +const DATASET_INFINITE_VOLUME = Number.MAX_SAFE_INTEGER; + const isDatasetBulkOrder = (order = {}) => { - return order?.volume >= Number.MAX_SAFE_INTEGER && order?.datasetprice === 0; + return ( + order?.volume >= DATASET_INFINITE_VOLUME - 1 && // DATASET_INFINITE_VOLUME - 1 is accepted for compatibility with existing orders + order?.datasetprice === 0 + ); }; export { @@ -148,6 +153,7 @@ export { STATUS_MAP, TAG_MAP, UNPUBLISH_TARGET_MAP, + DATASET_INFINITE_VOLUME, tagToArray, excludeTagArray, isDatasetBulkOrder, diff --git a/api/test/datasetorders.test.js b/api/test/datasetorders.test.js index e6a9ee8..20fda7e 100644 --- a/api/test/datasetorders.test.js +++ b/api/test/datasetorders.test.js @@ -11,7 +11,10 @@ import supertest from 'supertest'; import { Wallet } from 'ethers'; import { IExec, utils } from 'iexec'; import { chains } from '../src/config.js'; -import { STATUS_MAP } from '../src/utils/order-utils.js'; +import { + DATASET_INFINITE_VOLUME, + STATUS_MAP, +} from '../src/utils/order-utils.js'; import { WALLETS, sleep, @@ -950,15 +953,15 @@ describe('Offchain marketplace', () => { noRestrictOrders.push(...datasetPrice0); allOrders.push(...datasetPrice0); - const bulk = await Promise.all( - Array(2) + const bulk = await Promise.all([ + ...Array(2) .fill(null) .map(async () => { const order = await iexecUser.order .createDatasetorder({ dataset: datasetAddress, datasetprice: 0, // bulk order must be free - volume: Number.MAX_SAFE_INTEGER, // bulk order must have max volume + volume: DATASET_INFINITE_VOLUME, // bulk order must have max volume }) .then(iexecUser.order.signDatasetorder); const orderHash = await iexecUser.order.hashDatasetorder(order); @@ -968,7 +971,24 @@ describe('Offchain marketplace', () => { signer: ownerAddress, }; }), - ); + ...Array(2) + .fill(null) + .map(async () => { + const order = await iexecUser.order + .createDatasetorder({ + dataset: datasetAddress, + datasetprice: 0, // bulk order must be free + volume: DATASET_INFINITE_VOLUME - 1, // DATASET_INFINITE_VOLUME - 1 is accepted for compatibility with existing orders + }) + .then(iexecUser.order.signDatasetorder); + const orderHash = await iexecUser.order.hashDatasetorder(order); + return { + order, + orderHash, + signer: ownerAddress, + }; + }), + ]); bulkOrders.push(...bulk); minVolumeOrders.push(...bulk); noRestrictOrders.push(...bulk); @@ -1864,7 +1884,7 @@ describe('Offchain marketplace', () => { expect(Array.isArray(notOnlyBulkRes.data.orders)).toBe(true); notOnlyBulkRes.data.orders.forEach((e) => { if ( - e.order.volume >= Number.MAX_SAFE_INTEGER && + e.order.volume >= DATASET_INFINITE_VOLUME - 1 && // DATASET_INFINITE_VOLUME - 1 is accepted for compatibility with existing orders e.order.datasetprice === 0 ) { expect(e.bulk).toBe(true);