Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

1658 bnc part 3 #1798

Merged
merged 54 commits into from
Feb 13, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
f842d6b
fix: fix BNC...
lucanicoladebiasi Jan 29, 2025
186667c
fix: fix BNC...
lucanicoladebiasi Jan 29, 2025
517e9cd
fix: fix BNC...
lucanicoladebiasi Jan 29, 2025
8743c13
fix: fix BNC...
lucanicoladebiasi Jan 29, 2025
c2f560c
fix: fix BNC...
lucanicoladebiasi Jan 30, 2025
6a5f9b1
fix: fix BNC...
lucanicoladebiasi Jan 30, 2025
74447ca
Merge branch 'main' into 1658-bnc
lucanicoladebiasi Jan 30, 2025
688b52f
Merge branch '1658-bnc' into 1658-bnc---part-2
lucanicoladebiasi Feb 4, 2025
c970688
Merge branch 'main' into 1658-bnc---part-2
lucanicoladebiasi Feb 5, 2025
c3b0ac3
fix: en_7 recommendations... (#1749)
lucanicoladebiasi Feb 5, 2025
1db6c95
fix: BNC (network)
lucanicoladebiasi Feb 6, 2025
41c5356
fix: BNC 2 network
lucanicoladebiasi Feb 6, 2025
0f57e12
fix: BNC 2 network
lucanicoladebiasi Feb 6, 2025
8a411a7
fix: BNC 2 network
lucanicoladebiasi Feb 6, 2025
1b7076d
fix: BNC 2 network
lucanicoladebiasi Feb 6, 2025
9a8965e
fix: BNC 2 network
lucanicoladebiasi Feb 6, 2025
e39f0d4
fix: BNC 2 network
lucanicoladebiasi Feb 6, 2025
be836d4
fix: BNC 2 network
lucanicoladebiasi Feb 6, 2025
99bcb28
fix: BNC 2 network
lucanicoladebiasi Feb 6, 2025
5666047
fix: BNC 2 network
lucanicoladebiasi Feb 6, 2025
abfdab3
fix: BNC 2 network
lucanicoladebiasi Feb 6, 2025
220008d
fix: BNC 2 network
lucanicoladebiasi Feb 6, 2025
57e1dfe
fix: BNC 2 network
lucanicoladebiasi Feb 6, 2025
3f54e7f
fix: BNC 2 network
lucanicoladebiasi Feb 6, 2025
6283023
fix: BNC 2 network
lucanicoladebiasi Feb 6, 2025
b22584c
fix: BNC 2 network
lucanicoladebiasi Feb 6, 2025
fa764a2
fix: BNC 2 network
lucanicoladebiasi Feb 6, 2025
40aba92
fix: BNC 2 network
lucanicoladebiasi Feb 6, 2025
4bd5d23
fix: BNC 2 network
lucanicoladebiasi Feb 7, 2025
4a982dc
fix: BNC 2 network
lucanicoladebiasi Feb 7, 2025
a057c1f
fix: BNC 2 network
lucanicoladebiasi Feb 7, 2025
7b3ed2c
fix: BNC 2 network
lucanicoladebiasi Feb 7, 2025
d45db89
fix: BNC 2 network
lucanicoladebiasi Feb 7, 2025
593cd92
fix: BNC 2 network
lucanicoladebiasi Feb 7, 2025
b16343b
fix: BNC 2 network
lucanicoladebiasi Feb 7, 2025
f8cc404
fix: BNC 2 network
lucanicoladebiasi Feb 7, 2025
6511531
Update packages/rpc-proxy/src/utils/config-validator/config-validator.ts
lucanicoladebiasi Feb 7, 2025
c576e85
Update packages/rpc-proxy/src/utils/config-validator/config-validator.ts
lucanicoladebiasi Feb 7, 2025
c5ea205
fix: BNC 2 network
lucanicoladebiasi Feb 7, 2025
105ca6c
fix: `BNC` part 2 - network refactor
lucanicoladebiasi Jan 31, 2025
2a73fd0
fix: `BNC` part 2 - network refactor
lucanicoladebiasi Feb 8, 2025
560c4e5
fix: `BNC` part 2 - network refactor
lucanicoladebiasi Feb 10, 2025
45278fb
fix: `BNC` part 2 - network refactor
lucanicoladebiasi Feb 10, 2025
e5a225e
fix: `BNC` part 3 - rpc-proxy refactor
lucanicoladebiasi Feb 10, 2025
376b086
fix: `BNC` part 3 - rpc-proxy refactor
lucanicoladebiasi Feb 10, 2025
ed7a0e7
fix: `BNC` part 3 - rpc-proxy refactor
lucanicoladebiasi Feb 10, 2025
386c04a
fix: `BNC` part 3 - rpc-proxy refactor
lucanicoladebiasi Feb 10, 2025
cfddf76
fix: `BNC` part 3 - rpc-proxy refactor
lucanicoladebiasi Feb 10, 2025
961659e
fix: `BNC` part 2 - openssl fix
lucanicoladebiasi Feb 10, 2025
569ac46
fix: `BNC` part 2 - openssl fix
lucanicoladebiasi Feb 10, 2025
2f1f397
fix: `BNC` part 2 - rpc-proxy README.md amended
lucanicoladebiasi Feb 11, 2025
2b03ef2
Merge branch '1658-bnc---part-2' into 1658-bnc---part-3
lucanicoladebiasi Feb 11, 2025
e6a23f7
Merge branch 'main' into 1658-bnc---part-3
lucanicoladebiasi Feb 11, 2025
dc7eddf
Merge branch 'main' into 1658-bnc---part-3
lucanicoladebiasi Feb 12, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions apps/sdk-hardhat-integration/hardhat.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,8 @@ const config: HardhatUserConfig = {
},
debug: true,
gasPayer: {
delegatorUrl: 'https://sponsor-testnet.vechain.energy/by/269'
gasPayerServiceUrl:
'https://sponsor-testnet.vechain.energy/by/269'
},
enableDelegation: true,
gas: 'auto',
Expand All @@ -115,7 +116,7 @@ const config: HardhatUserConfig = {
},
debug: true,
gasPayer: {
delegatorPrivateKey:
gasPayerPrivateKey:
'ea5383ac1f9e625220039a4afac6a7f868bf1ad4f48ce3a1dd78bd214ee4ace5'
},
enableDelegation: true,
Expand Down
15 changes: 9 additions & 6 deletions packages/hardhat-plugin/tests/helpers/fixture.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,10 @@ const createWalletFromHardhatNetworkConfigPositiveCasesFixture = [
'7f9290cc44c5fd2b95fe21d6ad6fe5fa9c177e1cd6f3b4c96a97b13e09eaa157'
],
delegator: {
delegatorPrivateKey:
gasPayerPrivateKey:
'ea5383ac1f9e625220039a4afac6a7f868bf1ad4f48ce3a1dd78bd214ee4ace5',
delegatorUrl: 'https://sponsor-testnet.vechain.energy/by/269'
gasPayerServiceUrl:
'https://sponsor-testnet.vechain.energy/by/269'
}
},
expectedAddresses: [
Expand Down Expand Up @@ -73,9 +74,10 @@ const createWalletFromHardhatNetworkConfigPositiveCasesFixture = [
'0x7f9290cc44c5fd2b95fe21d6ad6fe5fa9c177e1cd6f3b4c96a97b13e09eaa157'
],
delegator: {
delegatorPrivateKey:
gasPayerPrivateKey:
'ea5383ac1f9e625220039a4afac6a7f868bf1ad4f48ce3a1dd78bd214ee4ace5',
delegatorUrl: 'https://sponsor-testnet.vechain.energy/by/269'
gasPayerServiceUrl:
'https://sponsor-testnet.vechain.energy/by/269'
}
},
expectedAddresses: [
Expand Down Expand Up @@ -114,9 +116,10 @@ const createWalletFromHardhatNetworkConfigPositiveCasesFixture = [
initialIndex: 0
},
delegator: {
delegatorPrivateKey:
gasPayerPrivateKey:
'ea5383ac1f9e625220039a4afac6a7f868bf1ad4f48ce3a1dd78bd214ee4ace5',
delegatorUrl: 'https://sponsor-testnet.vechain.energy/by/269'
gasPayerServiceUrl:
'https://sponsor-testnet.vechain.energy/by/269'
}
},
expectedAddresses: [
Expand Down
20 changes: 10 additions & 10 deletions packages/rpc-proxy/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -88,14 +88,14 @@ So you can run the rpc-proxy with:
#### Use delegation

- `-e, --enableDelegation`: Whether to enable delegation.
- `--delegatorPrivateKey <delegatorPrivateKey>`: The private key of the delegator.
- `-d, --delegatorUrl <delegatorUrl>`: The URL of the delegator.
- -e.g.- `npx rpc-proxy -e --delegatorPrivateKey 8f9290cc44c5fd2b95fe21d6ad6fe5fa9c177e1cd6f3b4c96a97b13e09eaa158`
OR `npx rpc-proxy --enableDelegation --delegatorPrivateKey 8f9290cc44c5fd2b95fe21d6ad6fe5fa9c177e1cd6f3b4c96a97b13e09eaa158`
- -e.g.- `npx rpc-proxy -e -d https://sponsor-testnet.vechain.energy/by/...`
OR `npx rpc-proxy --enableDelegation --delegatorUrl https://sponsor-testnet.vechain.energy/by/...`
- **NOTE**: --delegatorPrivateKey and --delegatorUrl are mutually exclusive.
- **NOTE**: if --enableDelegation is used, --delegatorPrivateKey OR --delegatorUrl MUST be used.
- `--gasPayerPrivateKey <gasPayerPrivateKey>`: The private key of the gasPayer.
- `-s, --gasPayerServiceUrl <gasPayerServiceUrl>`: The URL of the gasPayer.
- -e.g.- `npx rpc-proxy -e --gasPayerPrivateKey 8f9290cc44c5fd2b95fe21d6ad6fe5fa9c177e1cd6f3b4c96a97b13e09eaa158`
OR `npx rpc-proxy --enableDelegation --gasPayerPrivateKey 8f9290cc44c5fd2b95fe21d6ad6fe5fa9c177e1cd6f3b4c96a97b13e09eaa158`
- -e.g.- `npx rpc-proxy -e -s https://sponsor-testnet.vechain.energy/by/...`
OR `npx rpc-proxy --enableDelegation --gasPayerServiceUrl https://sponsor-testnet.vechain.energy/by/...`
- **NOTE**: --gasPayerPrivateKey and --gasPayerServiceUrl are mutually exclusive.
- **NOTE**: if --enableDelegation is used, --gasPayerPrivateKey OR --gasPayerServiceUrl MUST be used.

## Configuration file

Expand Down Expand Up @@ -153,7 +153,7 @@ Simple testnet configuration with a gasPayer private key:
"initialIndex": 0
},
"gasPayer": {
"delegatorPrivateKey": "8f9290cc44c5fd2b95fe21d6ad6fe5fa9c177e1cd6f3b4c96a97b13e09eaa158"
"gasPayerPrivateKey": "8f9290cc44c5fd2b95fe21d6ad6fe5fa9c177e1cd6f3b4c96a97b13e09eaa158"
},
"enableDelegation": true
}
Expand All @@ -171,7 +171,7 @@ Simple testnet configuration with a gasPayer private url:
"initialIndex": 0
},
"gasPayer": {
"delegatorUrl": "https://sponsor-testnet.vechain.energy/by/..."
"gasPayerServiceUrl": "https://sponsor-testnet.vechain.energy/by/..."
},
"enableDelegation": true
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -145,46 +145,46 @@ const ArgsValidatorAndGetter = {
): Config => {
// Both delegation fields are provided - throw an error
if (
options.delegatorPrivateKey !== undefined &&
options.delegatorUrl !== undefined &&
options.delegatorPrivateKey !== null &&
options.delegatorUrl !== null
options.gasPayerPrivateKey !== undefined &&
options.gasPayerServiceUrl !== undefined &&
options.gasPayerPrivateKey !== null &&
options.gasPayerServiceUrl !== null
) {
throw new InvalidCommandLineArguments(
'ArgsValidatorAndGetter.delegation()',
'Both gasPayer private key and gasPayer URL are provided. Only one can be provided',
'Both gasPayer private key and gasPayer service URL are provided. Only one can be provided',
{
flag: '{--delegatorPrivateKey}, {-d , --delegatorUrl}',
value: `{value not provided for security reason} , {${options.delegatorUrl as string}}`
flag: '{--gasPayerPrivateKey}, {-s , --gasPayerServiceUrl}',
value: `{value not provided for security reason} , {${options.gasPayerServiceUrl as string}}`
}
);
}

// Delegation is made with a private key
if (
options.delegatorPrivateKey !== undefined &&
options.delegatorPrivateKey !== null
options.gasPayerPrivateKey !== undefined &&
options.gasPayerPrivateKey !== null
) {
return {
...currentConfiguration,
gasPayer: {
gasPayerPrivateKey: ArgsValidator.delegatorPrivateKey(
options.delegatorPrivateKey as string
gasPayerPrivateKey: ArgsValidator.gasPayerPrivateKey(
options.gasPayerPrivateKey as string
)
}
};
}

// Delegation is made with a gasPayer URL
if (
options.delegatorUrl !== undefined &&
options.delegatorUrl !== null
options.gasPayerServiceUrl !== undefined &&
options.gasPayerServiceUrl !== null
) {
return {
...currentConfiguration,
gasPayer: {
gasPayerServiceUrl: ArgsValidator.delegatorUrl(
options.delegatorUrl as string
gasPayerServiceUrl: ArgsValidator.gasPayerServiceUrl(
options.gasPayerServiceUrl as string
)
}
};
Expand Down
47 changes: 25 additions & 22 deletions packages/rpc-proxy/src/utils/args-validator/args-validator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ import { checkValidConfigurationFile } from '../config-validator';
import {
isValidAccountsAsListOfPrivateKeys,
isValidCount,
isValidDelegatorPrivateKey,
isValidDelegatorUrl,
isValidGasPayerPrivateKey,
isValidGasPayerServiceUrl,
isValidMnemonic,
isValidPort,
isValidUrl
Expand Down Expand Up @@ -252,54 +252,57 @@ const ArgsValidator = {

/**
* Delegate configuration
* Validate 'delegatorPrivateKey' configuration field.
* Validate 'gasPayerPrivateKey' configuration field.
*
* @param delegatorPrivateKey Delegator private key to validate
* @returns Delegator private key if provided AND valid, null otherwise
* @param gasPayerPrivateKey The gasPayer private key to validate
* @returns The gasPayer private key if provided AND valid, null otherwise
*/
delegatorPrivateKey: (delegatorPrivateKey: string): string => {
gasPayerPrivateKey: (gasPayerPrivateKey: string): string => {
lucanicoladebiasi marked this conversation as resolved.
Show resolved Hide resolved
if (
!isValidDelegatorPrivateKey(delegatorPrivateKey) ||
delegatorPrivateKey === ''
!isValidGasPayerPrivateKey(gasPayerPrivateKey) ||
gasPayerPrivateKey === ''
) {
throw new InvalidCommandLineArguments(
'ArgsValidator.delegatorPrivateKey()',
'ArgsValidator.gasPayerPrivateKey()',
'An invalid gasPayer private key provided.',
{
flag: '--delegatorPrivateKey',
flag: '--gasPayerPrivateKey',
value: 'Value will not be shown for security reasons'
}
);
}
console.log(
`[rpc-proxy]: Delegator private key provided with command line options`
`[rpc-proxy]: The gasPayer private key provided with command line options`
);

return delegatorPrivateKey;
return gasPayerPrivateKey;
},

/*
* Validate 'delgatorUrl' configuration field
* Validate 'gasPayerServiceUrl' configuration field
*
* @param delegatorUrl Delegator URL to validate
* @returns Delegator URL if provided AND valid, null otherwise
* @param gasPayerServiceUrl The gasPayer service URL to validate
* @returns The gasPayer service URL if provided AND valid, null otherwise
*/
delegatorUrl: (delegatorUrl: string): string => {
if (!isValidDelegatorUrl(delegatorUrl) || delegatorUrl === '') {
gasPayerServiceUrl: (gasPayerServiceUrl: string): string => {
if (
!isValidGasPayerServiceUrl(gasPayerServiceUrl) ||
gasPayerServiceUrl === ''
) {
throw new InvalidCommandLineArguments(
'ArgsValidator.delegatorUrl()',
'ArgsValidator.gasPayerServiceUrl()',
'Invalid gasPayer url provided. The parameter must be a valid url',
{
flag: '-d , --delegatorUrl',
value: delegatorUrl
flag: '-s , --gasPayerServiceUrl',
value: gasPayerServiceUrl
}
);
}
console.log(
`[rpc-proxy]: Delegator url provided with command line options: ${delegatorUrl}`
`[rpc-proxy]: The gasPayer service url provided with command line options: ${gasPayerServiceUrl}`
);

return delegatorUrl;
return gasPayerServiceUrl;
}
};

Expand Down
17 changes: 10 additions & 7 deletions packages/rpc-proxy/src/utils/args/args-options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ import { Command, Option, type OptionValues } from 'commander';
* rpc-proxy {--mnemonicInitialIndex} <index> - Initial index to start deriving accounts from the mnemonic
*
* rpc-proxy {-e|--enableDelegation} - Enable delegation
* rpc-proxy {--delegatorPrivateKey} <delegatorPrivateKey> - Delegator private key
* rpc-proxy {-d|--delegatorUrl} <delegatorUrl> - Delegator URL
* rpc-proxy {--gasPayerPrivateKey} <gasPayerPrivateKey> - The gasPayer private key
* rpc-proxy {-s|--gasPayerServiceUrl} <gasPayerServiceUrl> - The gasPayer service URL
*
* rpc-proxy {-v|--verbose} - Enable verbose logging
*
Expand Down Expand Up @@ -77,17 +77,20 @@ function getOptionsFromCommandLine(
// Enable delegation boolean
.addOption(new Option('-e, --enableDelegation', 'Enable delegation'))

// Delegator configuration (private key)
// The gasPayer configuration (private key)
.addOption(
new Option(
'--delegatorPrivateKey <delegatorPrivateKey>',
'Delegator private key'
'--gasPayerPrivateKey <gasPayerPrivateKey>',
'The gasPayer private key'
)
)

// Delegator configuration (url)
// The gasPayer configuration (url)
.addOption(
new Option('-d, --delegatorUrl <delegatorUrl>', 'Delegator URL')
new Option(
'-s, --gasPayerServiceUrl <gasPayerServiceUrl>',
'The gasPayer service URL'
)
)

// Enable verbose logging
Expand Down
4 changes: 2 additions & 2 deletions packages/rpc-proxy/src/utils/args/args-parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,9 +86,9 @@ function parseAndGetFinalConfig(
) {
throw new InvalidCommandLineArguments(
'_checkIfConfigurationFileHasCorrectStructure()',
`Invalid configuration: Delegation cannot be enabled without a delegator`,
`Invalid configuration: Delegation cannot be enabled without a gasPayer`,
{
flag: '--enableDelegation , --delegatorPrivateKey, --delegatorUrl',
flag: '--enableDelegation , --gasPayerPrivateKey, --gasPayerServiceUrl',
value: `${options.enableDelegation}, Not provided, Not provided`
}
);
Expand Down
12 changes: 8 additions & 4 deletions packages/rpc-proxy/src/utils/args/env-to-args.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,15 @@ function getArgsFromEnv(): string[] {
'ENABLE_DELEGATION'
),
getCliFieldFromEnv(
'--delegatorPrivateKey',
process.env.DELEGATOR_PRIVATE_KEY,
'DELEGATOR_PRIVATE_KEY'
'--gasPayerPrivateKey',
process.env.GAS_PAYER_PRIVATE_KEY,
'GAS_PAYER_PRIVATE_KEY'
),
getCliFieldFromEnv(
'-s',
process.env.GAS_PAYER_SERVICE_URL,
'GAS_PAYER_SERVICE_URL'
),
getCliFieldFromEnv('-d', process.env.DELEGATOR_URL, 'DELEGATOR_URL'),
getCliFieldFromEnv('-v', process.env.VERBOSE, 'VERBOSE'),
getCliFieldFromEnv(
'-c',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ import type { Config } from '../../types';
import {
isValidAccountsAsListOfPrivateKeys,
isValidAccountsAsMnemonic,
isValidDelegatorPrivateKey,
isValidDelegatorUrl,
isValidGasPayerPrivateKey,
isValidGasPayerServiceUrl,
isValidPort,
isValidUrl
} from '../validators';
Expand Down Expand Up @@ -138,11 +138,11 @@ function _checkIfConfigurationFileHasCorrectStructure(filePath: string): void {
// Invalid gasPayer private key
if (
configFile.gasPayer.gasPayerPrivateKey !== undefined &&
!isValidDelegatorPrivateKey(configFile.gasPayer.gasPayerPrivateKey)
!isValidGasPayerPrivateKey(configFile.gasPayer.gasPayerPrivateKey)
) {
throw new InvalidConfigurationFile(
'_checkIfConfigurationFileHasCorrectStructure()',
`Invalid delegator private key in configuration file: ${absolutePath}. Delegator private key must be a valid private key`,
`Invalid gasPayer private key in configuration file: ${absolutePath}. The gasPayer private key must be a valid private key`,
{
filePath
}
Expand All @@ -152,11 +152,11 @@ function _checkIfConfigurationFileHasCorrectStructure(filePath: string): void {
// Invalid gasPayer url
if (
configFile.gasPayer.gasPayerServiceUrl !== undefined &&
!isValidDelegatorUrl(configFile.gasPayer.gasPayerServiceUrl)
!isValidGasPayerServiceUrl(configFile.gasPayer.gasPayerServiceUrl)
) {
throw new InvalidConfigurationFile(
'_checkIfConfigurationFileHasCorrectStructure()',
`Invalid delegator url in configuration file: ${absolutePath}. Delegator url must be a valid URL`,
`Invalid gasPayer service url in configuration file: ${absolutePath}. DThe gasPayer service url must be a valid URL`,
{
filePath
}
Expand Down
8 changes: 4 additions & 4 deletions packages/rpc-proxy/src/utils/validators/validators.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ function isValidAccountsAsMnemonic(account: {
* @param url - URL to check
* @returns True if the url is valid, false otherwise
*/
function isValidDelegatorUrl(url: string): boolean {
function isValidGasPayerServiceUrl(url: string): boolean {
return isValidUrl(url);
}

Expand All @@ -100,7 +100,7 @@ function isValidDelegatorUrl(url: string): boolean {
* @param privateKey - Private key to check
* @returns True if the private key is valid, false otherwise
*/
function isValidDelegatorPrivateKey(privateKey: string): boolean {
function isValidGasPayerPrivateKey(privateKey: string): boolean {
return isValidAccountsAsListOfPrivateKeys([privateKey]);
}

Expand All @@ -112,6 +112,6 @@ export {
isValidCount,
isValidInitialIndex,
isValidAccountsAsMnemonic,
isValidDelegatorUrl,
isValidDelegatorPrivateKey
isValidGasPayerServiceUrl,
isValidGasPayerPrivateKey
};
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
"initialIndex": 0
},
"gasPayer": {
"delegatorPrivateKey": "8f9290cc44c5fd2b95fe21d6ad6fe5fa9c177e1cd6f3b4c96a97b13e09eaa158"
"gasPayerPrivateKey": "8f9290cc44c5fd2b95fe21d6ad6fe5fa9c177e1cd6f3b4c96a97b13e09eaa158"
},
"enableDelegation": false
}
Loading
Loading