From b5c8efcc24f73ffdeb8b2890e72e3acb44c04436 Mon Sep 17 00:00:00 2001 From: Valery Antopol Date: Wed, 11 Sep 2024 16:50:57 +0400 Subject: [PATCH 1/5] support split deal rewards --- cli/src/commands/provider/deal-rewards-info.ts | 9 +++++++-- .../commands/provider/deal-rewards-withdraw.ts | 17 +++++++++++------ 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/cli/src/commands/provider/deal-rewards-info.ts b/cli/src/commands/provider/deal-rewards-info.ts index 7a2e0fde9..090da620c 100644 --- a/cli/src/commands/provider/deal-rewards-info.ts +++ b/cli/src/commands/provider/deal-rewards-info.ts @@ -59,9 +59,14 @@ export default class DealRewardsInfo extends BaseCommand< const rewardAmount = await deal.getRewardAmount(unitId); commandObj.log( - `Deal reward amount: ${color.yellow( - await ptFormatWithSymbol(rewardAmount), + `Deal reward amount:\n + provider: ${color.yellow( + await ptFormatWithSymbol(rewardAmount[0]), + )}\n + staker: ${color.yellow( + await ptFormatWithSymbol(rewardAmount[1]), )}`, + ); } } diff --git a/cli/src/commands/provider/deal-rewards-withdraw.ts b/cli/src/commands/provider/deal-rewards-withdraw.ts index 3c82515d5..bb66fd5a2 100644 --- a/cli/src/commands/provider/deal-rewards-withdraw.ts +++ b/cli/src/commands/provider/deal-rewards-withdraw.ts @@ -70,21 +70,26 @@ export default class DealRewardsWithdraw extends BaseCommand< }), ) ).reduce((acc, reward) => { - return acc + reward; - }, 0n); + return [acc[0] + reward[0], + acc[1] + reward[1]]; + }, [0n, 0n]); for (const { onchainId } of workers) { await sign({ - title: `Withdraw rewards for compute unit ${onchainId}`, + title: `Withdraw rewards for worker ${onchainId}`, method: deal.withdrawRewards, args: [onchainId], }); } commandObj.logToStderr( - `Reward ${color.yellow( - await ptFormatWithSymbol(rewardSum), - )} was withdrawn from the deal: ${dealId}`, + `Rewards\n + provider: ${color.yellow( + await ptFormatWithSymbol(rewardSum[0]), + )}\n + staker: ${color.yellow( + await ptFormatWithSymbol(rewardSum[0]), + )} were withdrawn from the deal: ${dealId}`, ); } } From 3b75920512c47d668d7b09524b920063ac726d47 Mon Sep 17 00:00:00 2001 From: Artsiom Shamsutdzinau Date: Wed, 11 Sep 2024 16:32:39 +0200 Subject: [PATCH 2/5] fix --- cli/package.json | 2 +- .../commands/provider/deal-rewards-info.ts | 11 +-- .../provider/deal-rewards-withdraw.ts | 80 ++++++++++++++----- cli/src/versions.json | 6 +- cli/yarn.lock | 10 +-- 5 files changed, 72 insertions(+), 37 deletions(-) diff --git a/cli/package.json b/cli/package.json index cb5f81a45..8afb47740 100644 --- a/cli/package.json +++ b/cli/package.json @@ -59,7 +59,7 @@ "@fluencelabs/air-beautify-wasm": "0.3.9", "@fluencelabs/aqua-api": "0.14.10", "@fluencelabs/aqua-to-js": "0.3.13", - "@fluencelabs/deal-ts-clients": "0.18.7", + "@fluencelabs/deal-ts-clients": "0.18.8-fix-deal-rewards-double-reward-14ebe95-6237-1.0", "@fluencelabs/fluence-network-environment": "1.2.2", "@fluencelabs/js-client": "0.9.0", "@fluencelabs/npm-aqua-compiler": "0.0.3", diff --git a/cli/src/commands/provider/deal-rewards-info.ts b/cli/src/commands/provider/deal-rewards-info.ts index 090da620c..ff1cc7996 100644 --- a/cli/src/commands/provider/deal-rewards-info.ts +++ b/cli/src/commands/provider/deal-rewards-info.ts @@ -59,14 +59,11 @@ export default class DealRewardsInfo extends BaseCommand< const rewardAmount = await deal.getRewardAmount(unitId); commandObj.log( - `Deal reward amount:\n - provider: ${color.yellow( - await ptFormatWithSymbol(rewardAmount[0]), - )}\n - staker: ${color.yellow( - await ptFormatWithSymbol(rewardAmount[1]), + `Provider reward: ${color.yellow( + await ptFormatWithSymbol(rewardAmount.providerReward), + )}\n\nStaker reward: ${color.yellow( + await ptFormatWithSymbol(rewardAmount.stakerReward), )}`, - ); } } diff --git a/cli/src/commands/provider/deal-rewards-withdraw.ts b/cli/src/commands/provider/deal-rewards-withdraw.ts index bb66fd5a2..fed54bc01 100644 --- a/cli/src/commands/provider/deal-rewards-withdraw.ts +++ b/cli/src/commands/provider/deal-rewards-withdraw.ts @@ -15,8 +15,6 @@ * along with this program. If not, see . */ -import { color } from "@oclif/color"; - import { BaseCommand, baseFlags } from "../../baseCommand.js"; import { ptFormatWithSymbol } from "../../lib/chain/currencies.js"; import { commandObj } from "../../lib/commandObj.js"; @@ -26,11 +24,14 @@ import { DEAL_IDS_FLAG_NAME, PT_SYMBOL, } from "../../lib/const.js"; -import { getDealClient, sign } from "../../lib/dealClient.js"; +import { getDealClient, getEventValue, sign } from "../../lib/dealClient.js"; +import { bigintToStr } from "../../lib/helpers/typesafeStringify.js"; import { commaSepStrToArr } from "../../lib/helpers/utils.js"; import { initCli } from "../../lib/lifeCycle.js"; import { input } from "../../lib/prompt.js"; +const REWARD_WITHDRAWN_EVENT = "RewardWithdrawn"; + export default class DealRewardsWithdraw extends BaseCommand< typeof DealRewardsWithdraw > { @@ -63,33 +64,70 @@ export default class DealRewardsWithdraw extends BaseCommand< const deal = dealClient.getDeal(dealId); const workers = await deal.getWorkers(); - const rewardSum = ( - await Promise.all( - workers.map(({ onchainId }) => { - return deal.getRewardAmount(onchainId); - }), - ) - ).reduce((acc, reward) => { - return [acc[0] + reward[0], - acc[1] + reward[1]]; - }, [0n, 0n]); + let providerRewards = 0n; + let stakerRewards = 0n; for (const { onchainId } of workers) { - await sign({ + const txReceipt = await sign({ title: `Withdraw rewards for worker ${onchainId}`, method: deal.withdrawRewards, args: [onchainId], }); + + const providerReward = getEventValue({ + txReceipt, + contract: deal, + eventName: REWARD_WITHDRAWN_EVENT, + value: "providerReward", + }); + + const stakerReward = getEventValue({ + txReceipt, + contract: deal, + eventName: REWARD_WITHDRAWN_EVENT, + value: "stakerReward", + }); + + if ( + typeof providerReward !== "bigint" || + typeof stakerReward !== "bigint" + ) { + continue; + } + + providerRewards = providerRewards + providerReward; + stakerRewards = stakerRewards + stakerReward; } + const allRewards = [ + { name: "Provider", val: providerRewards }, + { name: "Staker", val: stakerRewards }, + ].filter(({ val }) => { + return val > 0n; + }); + + const rewardsStr = + allRewards.length === 0 + ? "Rewards " + : `${( + await Promise.all( + allRewards.map(async ({ name, val }) => { + return `${name} rewards: ${await ptFormatWithSymbol(val)}`; + }), + ) + ).join("\n\n")}\n\n`; + + const totalStr = + allRewards.length > 1 + ? `Total: ${bigintToStr( + allRewards.reduce((acc, { val }) => { + return acc + val; + }, 0n), + )}\n\n` + : ""; + commandObj.logToStderr( - `Rewards\n - provider: ${color.yellow( - await ptFormatWithSymbol(rewardSum[0]), - )}\n - staker: ${color.yellow( - await ptFormatWithSymbol(rewardSum[0]), - )} were withdrawn from the deal: ${dealId}`, + `${rewardsStr}${totalStr}were withdrawn from the deal: ${dealId}`, ); } } diff --git a/cli/src/versions.json b/cli/src/versions.json index 773b25328..0f5cb580b 100644 --- a/cli/src/versions.json +++ b/cli/src/versions.json @@ -1,9 +1,9 @@ { "protocolVersion": 1, "nox": "fluencelabs/nox:0.26.1", - "chain-rpc": "fluencelabs/chain-rpc:0.18.7", - "chain-deploy-script": "fluencelabs/chain-deploy-script:0.18.7", - "subgraph-deploy-script": "fluencelabs/subgraph-deploy-script:0.18.7", + "chain-rpc": "fluencelabs/chain-rpc:fix-deal-rewards-double-reward-14ebe95-6237-1", + "chain-deploy-script": "fluencelabs/chain-deploy-script:fix-deal-rewards-double-reward-14ebe95-6237-1", + "subgraph-deploy-script": "fluencelabs/subgraph-deploy-script:fix-deal-rewards-double-reward-14ebe95-6237-1", "rust-toolchain": "nightly-2024-06-10", "npm": { "@fluencelabs/aqua-lib": "0.11.0", diff --git a/cli/yarn.lock b/cli/yarn.lock index be3332206..af89ab93b 100644 --- a/cli/yarn.lock +++ b/cli/yarn.lock @@ -436,7 +436,7 @@ __metadata: "@fluencelabs/air-beautify-wasm": "npm:0.3.9" "@fluencelabs/aqua-api": "npm:0.14.10" "@fluencelabs/aqua-to-js": "npm:0.3.13" - "@fluencelabs/deal-ts-clients": "npm:0.18.7" + "@fluencelabs/deal-ts-clients": "npm:0.18.8-fix-deal-rewards-double-reward-14ebe95-6237-1.0" "@fluencelabs/fluence-network-environment": "npm:1.2.2" "@fluencelabs/js-client": "npm:0.9.0" "@fluencelabs/npm-aqua-compiler": "npm:0.0.3" @@ -509,9 +509,9 @@ __metadata: languageName: unknown linkType: soft -"@fluencelabs/deal-ts-clients@npm:0.18.7": - version: 0.18.7 - resolution: "@fluencelabs/deal-ts-clients@npm:0.18.7" +"@fluencelabs/deal-ts-clients@npm:0.18.8-fix-deal-rewards-double-reward-14ebe95-6237-1.0": + version: 0.18.8-fix-deal-rewards-double-reward-14ebe95-6237-1.0 + resolution: "@fluencelabs/deal-ts-clients@npm:0.18.8-fix-deal-rewards-double-reward-14ebe95-6237-1.0" dependencies: "@graphql-typed-document-node/core": "npm:^3.2.0" debug: "npm:^4.3.4" @@ -523,7 +523,7 @@ __metadata: graphql-tag: "npm:^2.12.6" ipfs-http-client: "npm:^60.0.1" multiformats: "npm:^13.0.1" - checksum: 10c0/5c753da4e23902676e153e87a0584aff5fa07a9aadf86e355436e17c6cfad13bef1a7617c370666defce2ae2b9db0c160310eb16b101627185a1227cf3153ad3 + checksum: 10c0/b8ce0f0b3faff44bca12f9b32764d55c3d18e09c8c91ed3d846dde0fb5c8ebc83288bd065b22679b2b90c50087b8efdb65722ad4fa23fc5cf8a5668922d91f84 languageName: node linkType: hard From 2cee143843ac238a35d3d71541ee237492016ea3 Mon Sep 17 00:00:00 2001 From: Artsiom Shamsutdzinau Date: Wed, 11 Sep 2024 16:57:17 +0200 Subject: [PATCH 3/5] fix --- cli/src/versions.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/src/versions.json b/cli/src/versions.json index 0f5cb580b..9eb25b338 100644 --- a/cli/src/versions.json +++ b/cli/src/versions.json @@ -1,9 +1,9 @@ { "protocolVersion": 1, "nox": "fluencelabs/nox:0.26.1", - "chain-rpc": "fluencelabs/chain-rpc:fix-deal-rewards-double-reward-14ebe95-6237-1", - "chain-deploy-script": "fluencelabs/chain-deploy-script:fix-deal-rewards-double-reward-14ebe95-6237-1", - "subgraph-deploy-script": "fluencelabs/subgraph-deploy-script:fix-deal-rewards-double-reward-14ebe95-6237-1", + "chain-rpc": "docker.fluence.dev/chain-rpc:fix-deal-rewards-double-reward-14ebe95-6237-1", + "chain-deploy-script": "docker.fluence.dev/chain-deploy-script:fix-deal-rewards-double-reward-14ebe95-6237-1", + "subgraph-deploy-script": "docker.fluence.dev/subgraph-deploy-script:fix-deal-rewards-double-reward-14ebe95-6237-1", "rust-toolchain": "nightly-2024-06-10", "npm": { "@fluencelabs/aqua-lib": "0.11.0", From c9c4fb934b479090cde605e12589f8a43ae1e87a Mon Sep 17 00:00:00 2001 From: Artsiom Shamsutdzinau Date: Wed, 11 Sep 2024 17:17:12 +0200 Subject: [PATCH 4/5] improvements and add deal-rewards-withdraw test --- cli/src/commands/provider/deal-rewards-withdraw.ts | 9 +++++---- cli/test/helpers/sharedSteps.ts | 2 ++ cli/test/tests/deal/dealDeploy.test.ts | 9 ++++++++- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/cli/src/commands/provider/deal-rewards-withdraw.ts b/cli/src/commands/provider/deal-rewards-withdraw.ts index fed54bc01..3919556fd 100644 --- a/cli/src/commands/provider/deal-rewards-withdraw.ts +++ b/cli/src/commands/provider/deal-rewards-withdraw.ts @@ -25,7 +25,6 @@ import { PT_SYMBOL, } from "../../lib/const.js"; import { getDealClient, getEventValue, sign } from "../../lib/dealClient.js"; -import { bigintToStr } from "../../lib/helpers/typesafeStringify.js"; import { commaSepStrToArr } from "../../lib/helpers/utils.js"; import { initCli } from "../../lib/lifeCycle.js"; import { input } from "../../lib/prompt.js"; @@ -92,7 +91,9 @@ export default class DealRewardsWithdraw extends BaseCommand< typeof providerReward !== "bigint" || typeof stakerReward !== "bigint" ) { - continue; + throw new Error( + `Failed to get rewards amount from event ${REWARD_WITHDRAWN_EVENT}. Please make sure event signature is correct`, + ); } providerRewards = providerRewards + providerReward; @@ -119,7 +120,7 @@ export default class DealRewardsWithdraw extends BaseCommand< const totalStr = allRewards.length > 1 - ? `Total: ${bigintToStr( + ? `Total rewards: ${await ptFormatWithSymbol( allRewards.reduce((acc, { val }) => { return acc + val; }, 0n), @@ -127,7 +128,7 @@ export default class DealRewardsWithdraw extends BaseCommand< : ""; commandObj.logToStderr( - `${rewardsStr}${totalStr}were withdrawn from the deal: ${dealId}`, + `\n${rewardsStr}${totalStr}were withdrawn from the deal: ${dealId}`, ); } } diff --git a/cli/test/helpers/sharedSteps.ts b/cli/test/helpers/sharedSteps.ts index ad7b172cf..96cae9ee0 100644 --- a/cli/test/helpers/sharedSteps.ts +++ b/cli/test/helpers/sharedSteps.ts @@ -247,6 +247,8 @@ export async function deployDealAndWaitUntilDeployed( }, RUN_DEPLOYED_SERVICES_TIMEOUT, ); + + return dealId; } export async function createSpellAndAddToDeal(cwd: string, spellName: string) { diff --git a/cli/test/tests/deal/dealDeploy.test.ts b/cli/test/tests/deal/dealDeploy.test.ts index 9e36a6526..3d3d79da7 100644 --- a/cli/test/tests/deal/dealDeploy.test.ts +++ b/cli/test/tests/deal/dealDeploy.test.ts @@ -40,7 +40,7 @@ describe("fluence deploy tests", () => { await createSpellAndAddToDeal(cwd, NEW_SPELL_NAME); - await deployDealAndWaitUntilDeployed(cwd); + const dealId = await deployDealAndWaitUntilDeployed(cwd); await waitUntilShowSubnetReturnsExpected( cwd, @@ -54,6 +54,13 @@ describe("fluence deploy tests", () => { }); assertLogsAreValid(logs); + + // works because the same account that deploys is also a provider + await fluence({ + args: ["provider", "deal-rewards-withdraw"], + flags: { "deal-ids": dealId }, + cwd, + }); }, ); }); From 78d4ac501eb8e6158bf326ece1e389bdafd31927 Mon Sep 17 00:00:00 2001 From: Valery Antopol Date: Thu, 12 Sep 2024 16:13:40 +0400 Subject: [PATCH 5/5] use released versions --- cli/package.json | 2 +- cli/src/versions.json | 6 +++--- cli/yarn.lock | 10 +++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cli/package.json b/cli/package.json index 8afb47740..2b9b97c5b 100644 --- a/cli/package.json +++ b/cli/package.json @@ -59,7 +59,7 @@ "@fluencelabs/air-beautify-wasm": "0.3.9", "@fluencelabs/aqua-api": "0.14.10", "@fluencelabs/aqua-to-js": "0.3.13", - "@fluencelabs/deal-ts-clients": "0.18.8-fix-deal-rewards-double-reward-14ebe95-6237-1.0", + "@fluencelabs/deal-ts-clients": "0.19.0", "@fluencelabs/fluence-network-environment": "1.2.2", "@fluencelabs/js-client": "0.9.0", "@fluencelabs/npm-aqua-compiler": "0.0.3", diff --git a/cli/src/versions.json b/cli/src/versions.json index 9eb25b338..865f8ed3a 100644 --- a/cli/src/versions.json +++ b/cli/src/versions.json @@ -1,9 +1,9 @@ { "protocolVersion": 1, "nox": "fluencelabs/nox:0.26.1", - "chain-rpc": "docker.fluence.dev/chain-rpc:fix-deal-rewards-double-reward-14ebe95-6237-1", - "chain-deploy-script": "docker.fluence.dev/chain-deploy-script:fix-deal-rewards-double-reward-14ebe95-6237-1", - "subgraph-deploy-script": "docker.fluence.dev/subgraph-deploy-script:fix-deal-rewards-double-reward-14ebe95-6237-1", + "chain-rpc": "fluencelabs/chain-rpc:0.19.0", + "chain-deploy-script": "fluencelabs/chain-deploy-script:0.19.0", + "subgraph-deploy-script": "fluencelabs/subgraph-deploy-script:0.19.0", "rust-toolchain": "nightly-2024-06-10", "npm": { "@fluencelabs/aqua-lib": "0.11.0", diff --git a/cli/yarn.lock b/cli/yarn.lock index af89ab93b..c6b14c6b6 100644 --- a/cli/yarn.lock +++ b/cli/yarn.lock @@ -436,7 +436,7 @@ __metadata: "@fluencelabs/air-beautify-wasm": "npm:0.3.9" "@fluencelabs/aqua-api": "npm:0.14.10" "@fluencelabs/aqua-to-js": "npm:0.3.13" - "@fluencelabs/deal-ts-clients": "npm:0.18.8-fix-deal-rewards-double-reward-14ebe95-6237-1.0" + "@fluencelabs/deal-ts-clients": "npm:0.19.0" "@fluencelabs/fluence-network-environment": "npm:1.2.2" "@fluencelabs/js-client": "npm:0.9.0" "@fluencelabs/npm-aqua-compiler": "npm:0.0.3" @@ -509,9 +509,9 @@ __metadata: languageName: unknown linkType: soft -"@fluencelabs/deal-ts-clients@npm:0.18.8-fix-deal-rewards-double-reward-14ebe95-6237-1.0": - version: 0.18.8-fix-deal-rewards-double-reward-14ebe95-6237-1.0 - resolution: "@fluencelabs/deal-ts-clients@npm:0.18.8-fix-deal-rewards-double-reward-14ebe95-6237-1.0" +"@fluencelabs/deal-ts-clients@npm:0.19.0": + version: 0.19.0 + resolution: "@fluencelabs/deal-ts-clients@npm:0.19.0" dependencies: "@graphql-typed-document-node/core": "npm:^3.2.0" debug: "npm:^4.3.4" @@ -523,7 +523,7 @@ __metadata: graphql-tag: "npm:^2.12.6" ipfs-http-client: "npm:^60.0.1" multiformats: "npm:^13.0.1" - checksum: 10c0/b8ce0f0b3faff44bca12f9b32764d55c3d18e09c8c91ed3d846dde0fb5c8ebc83288bd065b22679b2b90c50087b8efdb65722ad4fa23fc5cf8a5668922d91f84 + checksum: 10c0/b2002613cb3fe3be36ee149779294990ea21526954f9ceb0d2e2f62e67b41b7790c14f5f13a94e2da1036e1de0717914158756626eb217e9c753dde899a7c1c6 languageName: node linkType: hard