mirror of
https://github.com/oceanprotocol/market.git
synced 2024-12-02 05:57:29 +01:00
Add reuse order in start compute flow (#1352)
* wip add reuse order logic * add reuse order in start job * added missing check if no jobs found * update lib Signed-off-by: mihaisc <mihai.scarlat@smartcontrol.ro> * fix lint Signed-off-by: mihaisc <mihai.scarlat@smartcontrol.ro> Co-authored-by: mihaisc <mihai.scarlat@smartcontrol.ro>
This commit is contained in:
parent
a0558efaab
commit
ef744c1a2c
16
package-lock.json
generated
16
package-lock.json
generated
@ -13,7 +13,7 @@
|
|||||||
"@coingecko/cryptoformat": "^0.4.4",
|
"@coingecko/cryptoformat": "^0.4.4",
|
||||||
"@loadable/component": "^5.15.2",
|
"@loadable/component": "^5.15.2",
|
||||||
"@oceanprotocol/art": "^3.2.0",
|
"@oceanprotocol/art": "^3.2.0",
|
||||||
"@oceanprotocol/lib": "^1.0.0-next.36",
|
"@oceanprotocol/lib": "^1.0.0-next.37",
|
||||||
"@oceanprotocol/typographies": "^0.1.0",
|
"@oceanprotocol/typographies": "^0.1.0",
|
||||||
"@portis/web3": "^4.0.7",
|
"@portis/web3": "^4.0.7",
|
||||||
"@tippyjs/react": "^4.2.6",
|
"@tippyjs/react": "^4.2.6",
|
||||||
@ -2723,9 +2723,9 @@
|
|||||||
"integrity": "sha512-M/yyKfpWmMRHWPTjvKlrRWUcIbfkRWyHhjHUI1kPggJPPX6ADxApTwtzwVXJ/+WyegcaYc7bqwuclqvg9XPqBQ=="
|
"integrity": "sha512-M/yyKfpWmMRHWPTjvKlrRWUcIbfkRWyHhjHUI1kPggJPPX6ADxApTwtzwVXJ/+WyegcaYc7bqwuclqvg9XPqBQ=="
|
||||||
},
|
},
|
||||||
"node_modules/@oceanprotocol/lib": {
|
"node_modules/@oceanprotocol/lib": {
|
||||||
"version": "1.0.0-next.36",
|
"version": "1.0.0-next.37",
|
||||||
"resolved": "https://registry.npmjs.org/@oceanprotocol/lib/-/lib-1.0.0-next.36.tgz",
|
"resolved": "https://registry.npmjs.org/@oceanprotocol/lib/-/lib-1.0.0-next.37.tgz",
|
||||||
"integrity": "sha512-Q0IoLGSRlxAJYBc4aF9eZRdIWigD0+W1we9EVQd7nn4MJBN290VEUVlE88+ZBkjrrE4Wq7E0YGyVlsDwzMQh7Q==",
|
"integrity": "sha512-3d3JSSZbBjPnlqzx8LJw6g+Ti4LL96FH/TTOqFCP9D4kbux2gN0KaUdHzI66G6S6vhsxBKOmUyACJcOuH3eBDQ==",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@oceanprotocol/contracts": "1.0.0-alpha.28",
|
"@oceanprotocol/contracts": "1.0.0-alpha.28",
|
||||||
"bignumber.js": "^9.0.2",
|
"bignumber.js": "^9.0.2",
|
||||||
@ -21572,15 +21572,16 @@
|
|||||||
"integrity": "sha512-M/yyKfpWmMRHWPTjvKlrRWUcIbfkRWyHhjHUI1kPggJPPX6ADxApTwtzwVXJ/+WyegcaYc7bqwuclqvg9XPqBQ=="
|
"integrity": "sha512-M/yyKfpWmMRHWPTjvKlrRWUcIbfkRWyHhjHUI1kPggJPPX6ADxApTwtzwVXJ/+WyegcaYc7bqwuclqvg9XPqBQ=="
|
||||||
},
|
},
|
||||||
"@oceanprotocol/lib": {
|
"@oceanprotocol/lib": {
|
||||||
"version": "1.0.0-next.36",
|
"version": "1.0.0-next.37",
|
||||||
"resolved": "https://registry.npmjs.org/@oceanprotocol/lib/-/lib-1.0.0-next.36.tgz",
|
"resolved": "https://registry.npmjs.org/@oceanprotocol/lib/-/lib-1.0.0-next.37.tgz",
|
||||||
"integrity": "sha512-Q0IoLGSRlxAJYBc4aF9eZRdIWigD0+W1we9EVQd7nn4MJBN290VEUVlE88+ZBkjrrE4Wq7E0YGyVlsDwzMQh7Q==",
|
"integrity": "sha512-3d3JSSZbBjPnlqzx8LJw6g+Ti4LL96FH/TTOqFCP9D4kbux2gN0KaUdHzI66G6S6vhsxBKOmUyACJcOuH3eBDQ==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"@oceanprotocol/contracts": "1.0.0-alpha.28",
|
"@oceanprotocol/contracts": "1.0.0-alpha.28",
|
||||||
"bignumber.js": "^9.0.2",
|
"bignumber.js": "^9.0.2",
|
||||||
"cross-fetch": "^3.1.5",
|
"cross-fetch": "^3.1.5",
|
||||||
"crypto-js": "^4.1.1",
|
"crypto-js": "^4.1.1",
|
||||||
"decimal.js": "^10.3.1",
|
"decimal.js": "^10.3.1",
|
||||||
|
"web3": "^1.7.3",
|
||||||
"web3-core": "^1.7.1",
|
"web3-core": "^1.7.1",
|
||||||
"web3-eth-contract": "^1.7.1"
|
"web3-eth-contract": "^1.7.1"
|
||||||
}
|
}
|
||||||
@ -21683,6 +21684,7 @@
|
|||||||
"integrity": "sha512-5vwpq6kbvwkQwKqAoOU3L72GZ3Ta8RRrewKj9OJRolx28KLJJ8Dg9Rf7obRwt5jQA9bkYd8gqzMTrI7H3xLfaw==",
|
"integrity": "sha512-5vwpq6kbvwkQwKqAoOU3L72GZ3Ta8RRrewKj9OJRolx28KLJJ8Dg9Rf7obRwt5jQA9bkYd8gqzMTrI7H3xLfaw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
|
"@oclif/config": "^1.15.1",
|
||||||
"@oclif/errors": "^1.3.3",
|
"@oclif/errors": "^1.3.3",
|
||||||
"@oclif/parser": "^3.8.3",
|
"@oclif/parser": "^3.8.3",
|
||||||
"@oclif/plugin-help": "^3",
|
"@oclif/plugin-help": "^3",
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
"@coingecko/cryptoformat": "^0.4.4",
|
"@coingecko/cryptoformat": "^0.4.4",
|
||||||
"@loadable/component": "^5.15.2",
|
"@loadable/component": "^5.15.2",
|
||||||
"@oceanprotocol/art": "^3.2.0",
|
"@oceanprotocol/art": "^3.2.0",
|
||||||
"@oceanprotocol/lib": "^1.0.0-next.36",
|
"@oceanprotocol/lib": "^1.0.0-next.37",
|
||||||
"@oceanprotocol/typographies": "^0.1.0",
|
"@oceanprotocol/typographies": "^0.1.0",
|
||||||
"@portis/web3": "^4.0.7",
|
"@portis/web3": "^4.0.7",
|
||||||
"@tippyjs/react": "^4.2.6",
|
"@tippyjs/react": "^4.2.6",
|
||||||
|
@ -369,3 +369,31 @@ export async function transformComputeFormToServiceComputeOptions(
|
|||||||
|
|
||||||
return privacy
|
return privacy
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function checkComputeResourcesValidity(
|
||||||
|
asset: Asset,
|
||||||
|
accountId: string,
|
||||||
|
computeEnvMaxJobDuration: number,
|
||||||
|
datasetTimeout?: number,
|
||||||
|
algorithmTimeout?: number,
|
||||||
|
cancelToken?: CancelToken
|
||||||
|
): Promise<boolean> {
|
||||||
|
const jobs = await getComputeJobs(
|
||||||
|
[asset?.chainId],
|
||||||
|
accountId,
|
||||||
|
asset,
|
||||||
|
cancelToken
|
||||||
|
)
|
||||||
|
if (jobs.computeJobs.length <= 0) return false
|
||||||
|
const inputValues = []
|
||||||
|
computeEnvMaxJobDuration && inputValues.push(computeEnvMaxJobDuration * 60)
|
||||||
|
datasetTimeout && inputValues.push(datasetTimeout)
|
||||||
|
algorithmTimeout && inputValues.push(algorithmTimeout)
|
||||||
|
const minValue = Math.min(...inputValues)
|
||||||
|
const jobStartDate = new Date(
|
||||||
|
parseInt(jobs.computeJobs[0].dateCreated) * 1000
|
||||||
|
)
|
||||||
|
jobStartDate.setMinutes(jobStartDate.getMinutes() + Math.floor(minValue / 60))
|
||||||
|
const currentTime = new Date().getTime() / 1000
|
||||||
|
return Math.floor(jobStartDate.getTime() / 1000) > currentTime
|
||||||
|
}
|
||||||
|
@ -111,3 +111,57 @@ export async function order(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* called when having a valid order, but with expired provider access, requires approval of the provider fee
|
||||||
|
* @param web3
|
||||||
|
* @param asset
|
||||||
|
* @param accountId
|
||||||
|
* @param accountId validOrderTx
|
||||||
|
* @param computeEnv
|
||||||
|
* @param computeValidUntil
|
||||||
|
* @param computeConsumerAddress
|
||||||
|
* @returns {TransactionReceipt} receipt of the order
|
||||||
|
*/
|
||||||
|
export async function reuseOrder(
|
||||||
|
web3: Web3,
|
||||||
|
asset: AssetExtended,
|
||||||
|
accountId: string,
|
||||||
|
validOrderTx: string,
|
||||||
|
computeEnv: string = null,
|
||||||
|
computeValidUntil: number = null,
|
||||||
|
computeConsumerAddress?: string
|
||||||
|
) {
|
||||||
|
const datatoken = new Datatoken(web3)
|
||||||
|
const initializeData = await ProviderInstance.initialize(
|
||||||
|
asset.id,
|
||||||
|
asset.services[0].id,
|
||||||
|
0,
|
||||||
|
accountId,
|
||||||
|
asset.services[0].serviceEndpoint,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
computeEnv,
|
||||||
|
computeValidUntil
|
||||||
|
)
|
||||||
|
const txApprove = await approve(
|
||||||
|
web3,
|
||||||
|
accountId,
|
||||||
|
initializeData.providerFee.providerFeeToken,
|
||||||
|
asset.accessDetails.datatoken.address,
|
||||||
|
initializeData.providerFee.providerFeeAmount,
|
||||||
|
false
|
||||||
|
)
|
||||||
|
if (!txApprove) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const tx = await datatoken.reuseOrder(
|
||||||
|
asset.accessDetails.datatoken.address,
|
||||||
|
accountId,
|
||||||
|
validOrderTx,
|
||||||
|
initializeData.providerFee
|
||||||
|
)
|
||||||
|
|
||||||
|
return tx
|
||||||
|
}
|
||||||
|
@ -28,7 +28,8 @@ import {
|
|||||||
getAlgorithmAssetSelectionList,
|
getAlgorithmAssetSelectionList,
|
||||||
getAlgorithmsForAsset,
|
getAlgorithmsForAsset,
|
||||||
getValidUntilTime,
|
getValidUntilTime,
|
||||||
getComputeEnviroment
|
getComputeEnviroment,
|
||||||
|
checkComputeResourcesValidity
|
||||||
} from '@utils/compute'
|
} from '@utils/compute'
|
||||||
import { AssetSelectionAsset } from '@shared/FormFields/AssetSelection'
|
import { AssetSelectionAsset } from '@shared/FormFields/AssetSelection'
|
||||||
import AlgorithmDatasetsListForCompute from './AlgorithmDatasetsListForCompute'
|
import AlgorithmDatasetsListForCompute from './AlgorithmDatasetsListForCompute'
|
||||||
@ -41,7 +42,7 @@ import { useAbortController } from '@hooks/useAbortController'
|
|||||||
import { getOrderPriceAndFees } from '@utils/accessDetailsAndPricing'
|
import { getOrderPriceAndFees } from '@utils/accessDetailsAndPricing'
|
||||||
import { OrderPriceAndFees } from 'src/@types/Price'
|
import { OrderPriceAndFees } from 'src/@types/Price'
|
||||||
import { buyDtFromPool } from '@utils/pool'
|
import { buyDtFromPool } from '@utils/pool'
|
||||||
import { order } from '@utils/order'
|
import { order, reuseOrder } from '@utils/order'
|
||||||
import { AssetExtended } from 'src/@types/AssetExtended'
|
import { AssetExtended } from 'src/@types/AssetExtended'
|
||||||
import { getComputeFeedback } from '@utils/feedback'
|
import { getComputeFeedback } from '@utils/feedback'
|
||||||
|
|
||||||
@ -94,6 +95,7 @@ export default function Compute({
|
|||||||
useState<OrderPriceAndFees>()
|
useState<OrderPriceAndFees>()
|
||||||
const [isRequestingAlgoOrderPrice, setIsRequestingAlgoOrderPrice] =
|
const [isRequestingAlgoOrderPrice, setIsRequestingAlgoOrderPrice] =
|
||||||
useState(false)
|
useState(false)
|
||||||
|
const [isProviderFeeValid, setIsProviderFeeValid] = useState(false)
|
||||||
const isComputeButtonDisabled =
|
const isComputeButtonDisabled =
|
||||||
isJobStarting === true ||
|
isJobStarting === true ||
|
||||||
file === null ||
|
file === null ||
|
||||||
@ -116,6 +118,15 @@ export default function Compute({
|
|||||||
async function initPriceAndFees() {
|
async function initPriceAndFees() {
|
||||||
const computeEnv = await getComputeEnviroment(asset)
|
const computeEnv = await getComputeEnviroment(asset)
|
||||||
setComputeEnv(computeEnv)
|
setComputeEnv(computeEnv)
|
||||||
|
setIsProviderFeeValid(
|
||||||
|
await checkComputeResourcesValidity(
|
||||||
|
asset,
|
||||||
|
accountId,
|
||||||
|
computeEnv?.maxJobDuration,
|
||||||
|
asset.services[0].timeout,
|
||||||
|
selectedAlgorithmAsset.services[0].timeout
|
||||||
|
)
|
||||||
|
)
|
||||||
const validUntil = getValidUntilTime(
|
const validUntil = getValidUntilTime(
|
||||||
computeEnv?.maxJobDuration,
|
computeEnv?.maxJobDuration,
|
||||||
asset.services[0].timeout,
|
asset.services[0].timeout,
|
||||||
@ -377,6 +388,26 @@ export default function Compute({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isOwned && !isProviderFeeValid) {
|
||||||
|
const reuseOrderTx = await reuseOrder(
|
||||||
|
web3,
|
||||||
|
asset,
|
||||||
|
accountId,
|
||||||
|
validOrderTx,
|
||||||
|
computeEnv?.id,
|
||||||
|
computeValidUntil
|
||||||
|
)
|
||||||
|
if (!reuseOrderTx) {
|
||||||
|
toast.error('Failed to pay provider fees!')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
LoggerInstance.log(
|
||||||
|
'[compute] Reused order: ',
|
||||||
|
reuseOrderTx.transactionHash
|
||||||
|
)
|
||||||
|
datasetOrderTx = reuseOrderTx.transactionHash
|
||||||
|
}
|
||||||
|
|
||||||
LoggerInstance.log('[compute] Starting compute job.')
|
LoggerInstance.log('[compute] Starting compute job.')
|
||||||
const computeAsset: ComputeAsset = {
|
const computeAsset: ComputeAsset = {
|
||||||
documentId: asset.id,
|
documentId: asset.id,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user