diff --git a/packages/cli/package/docs/commands/README.md b/packages/cli/package/docs/commands/README.md index c37bf3c31..273c1542e 100644 --- a/packages/cli/package/docs/commands/README.md +++ b/packages/cli/package/docs/commands/README.md @@ -319,11 +319,12 @@ Move resources from deals, withdraw FLT collateral from capacity commitments, re ``` USAGE $ fluence provider cc-finish [--no-input] [--peer-names | --cc-ids ] [--offers - ] [--env ] [--priv-key ] + ] [--env ] [--priv-key ] [--force] FLAGS --cc-ids= Comma separated capacity commitment IDs --env= Fluence Environment to use when running the command + --force Allow finish Active CC --no-input Don't interactively ask for any input from the user --offers= Comma-separated list of offer names. To use all of your offers: --offers all diff --git a/packages/cli/package/package.json b/packages/cli/package/package.json index b7830ffd4..c2328da25 100644 --- a/packages/cli/package/package.json +++ b/packages/cli/package/package.json @@ -56,7 +56,7 @@ "whatwg-url": "^14.0.0" }, "dependencies": { - "@fluencelabs/deal-ts-clients": "0.24.3-feat-beam-support-f0edb5b-8391-1.0", + "@fluencelabs/deal-ts-clients": "0.27.2-release-candidate-v0-27-2-7faf671-9169-1.0", "@kubernetes/client-node": "github:fluencelabs/kubernetes-client-javascript#e72ee00a52fec4eb4a8327632895d888ee504f4d", "@libp2p/crypto": "4.0.1", "@libp2p/peer-id-factory": "4.0.5", diff --git a/packages/cli/package/src/commands/provider/cc-finish.ts b/packages/cli/package/src/commands/provider/cc-finish.ts index 7301123b4..93fbda133 100644 --- a/packages/cli/package/src/commands/provider/cc-finish.ts +++ b/packages/cli/package/src/commands/provider/cc-finish.ts @@ -17,7 +17,12 @@ import { BaseCommand } from "../../baseCommand.js"; import { collateralWithdraw } from "../../lib/chain/commitment.js"; -import { CHAIN_FLAGS, FLT_SYMBOL, CC_FLAGS } from "../../lib/const.js"; +import { + CHAIN_FLAGS, + FLT_SYMBOL, + CC_FLAGS, + CC_FINISH_FORCE_FLAG, +} from "../../lib/const.js"; import { aliasesText } from "../../lib/helpers/aliasesText.js"; import { initCli } from "../../lib/lifeCycle.js"; @@ -30,6 +35,7 @@ export default class CCFinish extends BaseCommand { static override flags = { ...CC_FLAGS, ...CHAIN_FLAGS, + ...CC_FINISH_FORCE_FLAG, }; async run(): Promise { diff --git a/packages/cli/package/src/lib/chain/commitment.ts b/packages/cli/package/src/lib/chain/commitment.ts index 0b636944e..14c73e9c2 100644 --- a/packages/cli/package/src/lib/chain/commitment.ts +++ b/packages/cli/package/src/lib/chain/commitment.ts @@ -538,14 +538,24 @@ export async function removeCommitments(flags: CCFlags) { export async function collateralWithdraw( flags: CCFlags & { [FINISH_COMMITMENT_FLAG_NAME]?: boolean; + force?: boolean; }, ) { + const isStatusAllowed: (status: CapacityCommitmentStatusString) => boolean = + flags.force === true + ? (status) => { + return ( + status === "Completed" || status === "Failed" || status === "Active" + ); + } + : (status) => { + return status === "Completed" || status === "Failed"; + }; + const [invalidCommitments, commitments] = splitErrorsAndResults( await getCommitmentsGroupedByStatus(flags), (c) => { - return c.status === "Completed" || c.status === "Failed" - ? { result: c } - : { error: c }; + return isStatusAllowed(c.status) ? { result: c } : { error: c }; }, ); @@ -570,52 +580,6 @@ export async function collateralWithdraw( })) { const { ccId, name: peerName } = commitment; - // TODO: improve how we get this info - const [unitIds, isExitedStatuses] = - await contracts.diamond.getUnitExitStatuses(ccId); - - // eslint-disable-next-line @typescript-eslint/consistent-type-assertions - const computeUnitInfos = (await multicallRead( - unitIds.map((unitId): MulticallReadItem => { - return { - target: contracts.deployment.diamond, - callData: contracts.diamond.interface.encodeFunctionData( - "getComputeUnit", - [unitId], - ), - decode(returnData) { - return contracts.diamond.interface.decodeFunctionResult( - "getComputeUnit", - returnData, - ); - }, - }; - }), - )) as ( - | Awaited> - | undefined - )[]; - - const units = unitIds.map((unitId, i) => { - return { - unitId, - unitInfo: - computeUnitInfos[i] ?? - (() => { - throw new Error( - `Unreachable. Unit ${unitId} not found after running getComputeUnit`, - ); - })(), - isExited: - isExitedStatuses[i] ?? - (() => { - throw new Error( - `Unreachable. No exit status returned from getUnitExitStatuses for unit ${unitId}`, - ); - })(), - }; - }); - await sign({ title: `withdraw collateral from: ${ccId}`, method: contracts.diamond.withdrawCollateral, @@ -632,28 +596,9 @@ export async function collateralWithdraw( continue; } - const [firstNotExitedUnit, ...restNotExitedUnits] = units.filter( - ({ isExited }) => { - return !isExited; - }, - ); - await signBatch({ - title: `${firstNotExitedUnit === undefined ? "Finish" : "Remove compute units from capacity commitments and finish"} commitment ${peerName === undefined ? ccId : `for ${peerName} (${ccId})`} ${ccId}`, - populatedTxs: - firstNotExitedUnit === undefined - ? [populateTx(contracts.diamond.finishCommitment, ccId)] - : [ - populateTx(contracts.diamond.removeCUFromCC, ccId, [ - firstNotExitedUnit.unitId, - ]), - ...restNotExitedUnits.map(({ unitId }) => { - return populateTx(contracts.diamond.removeCUFromCC, ccId, [ - unitId, - ]); - }), - populateTx(contracts.diamond.finishCommitment, ccId), - ], + title: `Finish commitment ${peerName === undefined ? ccId : `for ${peerName} (${ccId})`} ${ccId}`, + populatedTxs: [populateTx(contracts.diamond.finishCommitment, ccId)], }); } } diff --git a/packages/cli/package/src/lib/const.ts b/packages/cli/package/src/lib/const.ts index 0407b6de7..f2f7f2bb8 100644 --- a/packages/cli/package/src/lib/const.ts +++ b/packages/cli/package/src/lib/const.ts @@ -258,6 +258,12 @@ export const CC_FLAGS = { ...OFFER_FLAG, }; +export const CC_FINISH_FORCE_FLAG = { + force: Flags.boolean({ + description: "Allow finish Active CC", + }), +}; + export const FINISH_COMMITMENT_FLAG_NAME = "finish"; export const JSON_FLAG = { diff --git a/packages/cli/package/src/versions.json b/packages/cli/package/src/versions.json index dc317bf0c..842db70f5 100644 --- a/packages/cli/package/src/versions.json +++ b/packages/cli/package/src/versions.json @@ -1,6 +1,6 @@ { "protocolVersion": 2, - "chain-rpc": "docker.fluence.dev/chain-rpc:feat-beam-support-f0edb5b-8391-1", - "chain-deploy-script": "docker.fluence.dev/chain-deploy-script:feat-beam-support-f0edb5b-8391-1", - "subgraph-deploy-script": "docker.fluence.dev/subgraph-deploy-script:feat-beam-support-f0edb5b-8391-1" + "chain-rpc": "docker.fluence.dev/chain-rpc:release-candidate-v0-27-2-1d44fe4-9165-1", + "chain-deploy-script": "docker.fluence.dev/chain-deploy-script:release-candidate-v0-27-2-1d44fe4-9165-1", + "subgraph-deploy-script": "docker.fluence.dev/subgraph-deploy-script:release-candidate-v0-27-2-1d44fe4-9165-1" } diff --git a/packages/cli/package/yarn.lock b/packages/cli/package/yarn.lock index 93029f0ff..d7fa82641 100644 --- a/packages/cli/package/yarn.lock +++ b/packages/cli/package/yarn.lock @@ -1964,7 +1964,7 @@ __metadata: dependencies: "@actions/core": "npm:1.11.1" "@aws-sdk/lib-storage": "npm:^3.501.0" - "@fluencelabs/deal-ts-clients": "npm:0.24.3-feat-beam-support-f0edb5b-8391-1.0" + "@fluencelabs/deal-ts-clients": "npm:0.27.2-release-candidate-v0-27-2-7faf671-9169-1.0" "@graphql-codegen/cli": "npm:^5.0.3" "@graphql-codegen/typescript": "npm:^4.1.1" "@graphql-codegen/typescript-graphql-request": "npm:^6.2.0" @@ -2038,9 +2038,9 @@ __metadata: languageName: unknown linkType: soft -"@fluencelabs/deal-ts-clients@npm:0.24.3-feat-beam-support-f0edb5b-8391-1.0": - version: 0.24.3-feat-beam-support-f0edb5b-8391-1.0 - resolution: "@fluencelabs/deal-ts-clients@npm:0.24.3-feat-beam-support-f0edb5b-8391-1.0" +"@fluencelabs/deal-ts-clients@npm:0.27.2-release-candidate-v0-27-2-7faf671-9169-1.0": + version: 0.27.2-release-candidate-v0-27-2-7faf671-9169-1.0 + resolution: "@fluencelabs/deal-ts-clients@npm:0.27.2-release-candidate-v0-27-2-7faf671-9169-1.0" dependencies: "@graphql-typed-document-node/core": "npm:^3.2.0" debug: "npm:^4.3.4" @@ -2052,7 +2052,7 @@ __metadata: graphql-tag: "npm:^2.12.6" ipfs-http-client: "npm:^60.0.1" multiformats: "npm:^13.0.1" - checksum: 10c0/2478de8b0eeb12a98f3206dbf2af4501f59da55d413b261dbd84303054ad1053c7f602ce786e4fafb4ce322318605e897d48182759c5875c46685877f5356d58 + checksum: 10c0/21a9db2c8f3651a7fd0e89d53aed6fe69755577c3c379317406fd9542006e7cb2f273e4f2786135bf1fbdaba8f8f2370d03cececb0afe95cad2929d6713f1835 languageName: node linkType: hard