Skip to content

Commit 69da8d6

Browse files
feat!: support delegated offer creation (#1118)
* fix ipfs container * support provider management address * Apply automatic changes * Apply automatic changes --------- Co-authored-by: fluencebot <116741523+fluencebot@users.noreply.github.com>
1 parent 2bab696 commit 69da8d6

File tree

11 files changed

+100
-31
lines changed

11 files changed

+100
-31
lines changed

packages/cli/package/docs/commands/README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -671,7 +671,7 @@ Create offers. You have to be registered as a provider to do that. Alias: fluenc
671671
```
672672
USAGE
673673
$ fluence provider offer-create [--no-input] [--env <testnet | mainnet | stage | local>] [--priv-key <private-key>]
674-
[--offers <offer-1,offer-2>]
674+
[--offers <offer-1,offer-2>] [--provider <address>]
675675
676676
FLAGS
677677
--env=<testnet | mainnet | stage | local> Fluence Environment to use when running the command
@@ -682,6 +682,7 @@ FLAGS
682682
unsecure. On local env
683683
0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 is used
684684
by default when CLI is used in non-interactive mode
685+
--provider=<address> Provider address. In case using managmenent address to sign transactions
685686
686687
DESCRIPTION
687688
Create offers. You have to be registered as a provider to do that. Alias: fluence provider oc

packages/cli/package/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
"whatwg-url": "^14.0.0"
5757
},
5858
"dependencies": {
59-
"@fluencelabs/deal-ts-clients": "0.24.2",
59+
"@fluencelabs/deal-ts-clients": "0.24.3-feat-beam-support-f0edb5b-8391-1.0",
6060
"@kubernetes/client-node": "github:fluencelabs/kubernetes-client-javascript#e72ee00a52fec4eb4a8327632895d888ee504f4d",
6161
"@libp2p/crypto": "4.0.1",
6262
"@libp2p/peer-id-factory": "4.0.5",

packages/cli/package/src/commands/provider/offer-access-address.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ import {
2020
filterOffersFoundOnChain,
2121
resolveSingleOfferFromProviderConfig,
2222
} from "../../lib/chain/offer/offer.js";
23-
import { assertProviderIsRegistered } from "../../lib/chain/providerInfo.js";
23+
import {
24+
getOfferOwner,
25+
makeProviderAddressValidator,
26+
} from "../../lib/chain/providerInfo.js";
2427
import { commandObj } from "../../lib/commandObj.js";
2528
import {
2629
CHAIN_FLAGS,
@@ -82,8 +85,10 @@ export default class OfferAccessAddress extends BaseCommand<
8285

8386
const { contracts } = await getContracts();
8487

88+
const providerAddress = await getOfferOwner(chainOffer.offerId);
89+
8590
await sign({
86-
validateAddress: assertProviderIsRegistered,
91+
validateAddress: makeProviderAddressValidator(providerAddress),
8792
title: `Setting cluster address ${address} for offer ${chainOffer.offerName} (${chainOffer.offerId})`,
8893
method: contracts.diamond.setClusterKey,
8994
args: [chainOffer.offerId, address],

packages/cli/package/src/commands/provider/offer-create.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,11 @@
1717

1818
import { BaseCommand } from "../../baseCommand.js";
1919
import { createOffers } from "../../lib/chain/offer/offer.js";
20-
import { OFFER_FLAG, CHAIN_FLAGS } from "../../lib/const.js";
20+
import {
21+
OFFER_FLAG,
22+
CHAIN_FLAGS,
23+
PROVIDER_ADDRESS_FLAG,
24+
} from "../../lib/const.js";
2125
import { aliasesText } from "../../lib/helpers/aliasesText.js";
2226
import { initCli } from "../../lib/lifeCycle.js";
2327

@@ -27,10 +31,11 @@ export default class CreateOffer extends BaseCommand<typeof CreateOffer> {
2731
static override flags = {
2832
...CHAIN_FLAGS,
2933
...OFFER_FLAG,
34+
...PROVIDER_ADDRESS_FLAG,
3035
};
3136

3237
async run(): Promise<void> {
3338
const { flags } = await initCli(this, await this.parse(CreateOffer));
34-
await createOffers(flags);
39+
await createOffers(flags, flags.provider);
3540
}
3641
}

packages/cli/package/src/lib/chain/offer/offer.ts

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ import {
4545
CLI_NAME,
4646
OFFER_FLAG_NAME,
4747
OFFER_IDS_FLAG_NAME,
48+
PROVIDER_ADDRESS_FLAG_NAME,
4849
PROVIDER_ARTIFACTS_CONFIG_FULL_FILE_NAME,
4950
PROVIDER_CONFIG_FULL_FILE_NAME,
5051
SINGLE_OFFER_FLAG_NAME,
@@ -76,7 +77,7 @@ import {
7677
resourceSupplyFromConfigToChain,
7778
} from "../conversions.js";
7879
import { ptFormatWithSymbol } from "../currencies.js";
79-
import { assertProviderIsRegistered } from "../providerInfo.js";
80+
import { makeProviderAddressValidator } from "../providerInfo.js";
8081

8182
const MARKET_OFFER_REGISTERED_EVENT_NAME = "MarketOfferRegistered";
8283
const OFFER_ID_PROPERTY = "offerId";
@@ -87,12 +88,19 @@ export type OffersArgs = {
8788
force?: boolean | undefined;
8889
};
8990

91+
export type CreateOffersArgs = OffersArgs & {
92+
[PROVIDER_ADDRESS_FLAG_NAME]?: string | undefined;
93+
};
94+
9095
export type SingleOffersArgs = {
9196
[SINGLE_OFFER_FLAG_NAME]?: string | undefined;
9297
[SINGLE_OFFER_ID_FLAG_NAME]?: string | undefined;
9398
};
9499

95-
export async function createOffers(flags: OffersArgs) {
100+
export async function createOffers(
101+
flags: CreateOffersArgs,
102+
maybeProviderAddress?: string,
103+
) {
96104
const allOffers = await resolveOffersFromProviderConfig(flags);
97105
const providerConfig = await ensureReadonlyProviderConfig();
98106
const providerConfigPath = providerConfig.$getPath();
@@ -164,6 +172,9 @@ export async function createOffers(flags: OffersArgs) {
164172
let addedCPs;
165173
let offerRegisterTxReceipt;
166174

175+
const signerAddress = await getSignerAddress();
176+
const providerAddress = maybeProviderAddress ?? signerAddress;
177+
167178
try {
168179
({
169180
sliceIndex: registeredCUsCount,
@@ -174,6 +185,7 @@ export async function createOffers(flags: OffersArgs) {
174185
sliceIndex: allCUs.length,
175186
getArgs(computePeersToRegister) {
176187
return [
188+
providerAddress,
177189
contracts.deployment.usdc,
178190
resourcePricesArray,
179191
setCPUSupplyForCP(computePeersToRegister),
@@ -183,8 +195,8 @@ export async function createOffers(flags: OffersArgs) {
183195
getTitle() {
184196
return `Register offer: ${offerName}`;
185197
},
186-
method: contracts.diamond.registerMarketOfferV2,
187-
validateAddress: assertProviderIsRegistered,
198+
method: contracts.diamond.registerMarketOfferV2Delegated,
199+
validateAddress: makeProviderAddressValidator(providerAddress),
188200
}));
189201
} catch (e) {
190202
pushOfferRegisterResult({
@@ -221,7 +233,6 @@ export async function createOffers(flags: OffersArgs) {
221233
continue;
222234
}
223235

224-
const providerAddress = await getSignerAddress();
225236
const offerPerEnv = providerArtifactsConfig.offers[fluenceEnv] ?? {};
226237
offerPerEnv[offerName] = { id: offerId, providerAddress };
227238
providerArtifactsConfig.offers[fluenceEnv] = offerPerEnv;

packages/cli/package/src/lib/chain/offer/updateOffers.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,10 @@ import {
3535
resourceSupplyFromChainToConfig,
3636
} from "../conversions.js";
3737
import { ptFormatWithSymbol } from "../currencies.js";
38-
import { assertProviderIsRegistered } from "../providerInfo.js";
38+
import {
39+
getOfferOwner,
40+
makeProviderAddressValidator,
41+
} from "../providerInfo.js";
3942

4043
import {
4144
type OffersArgs,
@@ -116,6 +119,12 @@ export async function updateOffers(flags: OffersArgs) {
116119
return;
117120
}
118121

122+
let providerAddress = undefined;
123+
124+
if (offersFoundOnChain[0] !== undefined) {
125+
providerAddress = await getOfferOwner(offersFoundOnChain[0].offerId);
126+
}
127+
119128
if (firstUpdateOffersTx !== undefined) {
120129
await signBatch({
121130
title: `Updating offers:\n\n${populatedOffersTxs
@@ -124,7 +133,7 @@ export async function updateOffers(flags: OffersArgs) {
124133
})
125134
.join("\n")}`,
126135
populatedTxs: [firstUpdateOffersTx, ...restUpdateOffersTxs],
127-
validateAddress: assertProviderIsRegistered,
136+
validateAddress: makeProviderAddressValidator(providerAddress),
128137
});
129138
}
130139

@@ -190,14 +199,20 @@ export async function removeOffers(flags: OffersArgs) {
190199
return;
191200
}
192201

202+
let providerAddress = undefined;
203+
204+
if (offersFoundOnChain[0] !== undefined) {
205+
providerAddress = await getOfferOwner(offersFoundOnChain[0].offerId);
206+
}
207+
193208
await signBatch({
194209
title: `Removing offers:\n\n${populatedTxs
195210
.map(({ offerName, offerId }) => {
196211
return `${offerName} (${offerId})`;
197212
})
198213
.join("\n")}`,
199214
populatedTxs: [firstRemoveOffersTx, ...restRemoveOffersTxs],
200-
validateAddress: assertProviderIsRegistered,
215+
validateAddress: makeProviderAddressValidator(providerAddress),
201216
});
202217

203218
const providerArtifactsConfig = await initNewProviderArtifactsConfig();

packages/cli/package/src/lib/chain/providerInfo.ts

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -110,19 +110,42 @@ Provider address: ${signerAddress}
110110
async function getProviderInfoByAddress(address: string) {
111111
const { contracts } = await getContracts();
112112
const { name } = await contracts.diamond.getProviderInfo(address);
113-
return { name: name === "" ? null : name, address };
113+
114+
const managementAddress =
115+
await contracts.diamond.getProviderManagementAddress(address);
116+
117+
return { name: name === "" ? null : name, address, managementAddress };
114118
}
115119

116120
export async function getProviderInfo(address?: string) {
117121
return getProviderInfoByAddress(address ?? (await getSignerAddress()));
118122
}
119123

120-
export async function assertProviderIsRegistered(address: string) {
121-
const providerInfo = await getProviderInfoByAddress(address);
124+
export function makeProviderAddressValidator(providerAddress?: string) {
125+
return async (address: string) => {
126+
providerAddress = providerAddress ?? address;
127+
128+
const providerInfo = await getProviderInfoByAddress(providerAddress);
129+
130+
if (providerInfo.name === null) {
131+
commandObj.error(
132+
`You have to register as a provider first. Use '${CLI_NAME} provider register' command for that`,
133+
);
134+
} else if (
135+
address !== providerAddress &&
136+
address !== providerInfo.managementAddress
137+
) {
138+
commandObj.error(
139+
`You have using nor provider address not provider management address to sign the transaction.`,
140+
);
141+
}
142+
143+
return;
144+
};
145+
}
122146

123-
if (providerInfo.name === null) {
124-
commandObj.error(
125-
`You have to register as a provider first. Use '${CLI_NAME} provider register' command for that`,
126-
);
127-
}
147+
export async function getOfferOwner(offerId: string): Promise<string> {
148+
const { contracts } = await getContracts();
149+
const offerData = await contracts.diamond.getOffer(offerId);
150+
return offerData.provider;
128151
}

packages/cli/package/src/lib/configs/project/chainContainers.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ export const chainContainers = {
5454
},
5555
services: {
5656
[IPFS_CONTAINER_NAME]: {
57-
image: "ipfs/kubo:v0.36.0",
57+
image: "ipfs/go-ipfs",
5858
ports: [`${IPFS_PORT}:${IPFS_PORT}`, "4001:4001"],
5959
environment: {
6060
IPFS_PROFILE: "server",

packages/cli/package/src/lib/const.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,7 @@ export const PRIV_KEY_FLAG = {
199199
};
200200

201201
export const ADDRESS_FLAG_NAME = "address";
202+
export const PROVIDER_ADDRESS_FLAG_NAME = "provider";
202203

203204
export const ADDRESS_FLAG = {
204205
[ADDRESS_FLAG_NAME]: Flags.string({
@@ -214,6 +215,14 @@ export const CLUSTER_ADDRESS_FLAG = {
214215
}),
215216
};
216217

218+
export const PROVIDER_ADDRESS_FLAG = {
219+
[PROVIDER_ADDRESS_FLAG_NAME]: Flags.string({
220+
description:
221+
"Provider address. In case using managmenent address to sign transactions",
222+
helpValue: "<address>",
223+
}),
224+
};
225+
217226
export const CHAIN_FLAGS = {
218227
...ENV_FLAG,
219228
...PRIV_KEY_FLAG,
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"protocolVersion": 2,
3-
"chain-rpc": "fluencelabs/chain-rpc:0.24.2",
4-
"chain-deploy-script": "fluencelabs/chain-deploy-script:0.24.2",
5-
"subgraph-deploy-script": "fluencelabs/subgraph-deploy-script:0.24.2"
3+
"chain-rpc": "docker.fluence.dev/chain-rpc:feat-beam-support-f0edb5b-8391-1",
4+
"chain-deploy-script": "docker.fluence.dev/chain-deploy-script:feat-beam-support-f0edb5b-8391-1",
5+
"subgraph-deploy-script": "docker.fluence.dev/subgraph-deploy-script:feat-beam-support-f0edb5b-8391-1"
66
}

0 commit comments

Comments
 (0)