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

chore: adding to staking instance deployment scripts #22

Merged
merged 5 commits into from
Jul 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion lib/autonolas-registries
Submodule autonolas-registries updated 41 files
+109 −0 .gitleaksignore
+4 −0 README.md
+28 −2 abis/0.8.25/StakingFactory.json
+71 −8 abis/0.8.25/StakingNativeToken.json
+71 −8 abis/0.8.25/StakingToken.json
+84 −25 abis/0.8.25/StakingVerifier.json
+3 −0 audits/README.md
+212 −0 audits/internal6/README.md
+130 −91 contracts/staking/StakingBase.sol
+60 −29 contracts/staking/StakingFactory.sol
+2 −0 contracts/staking/StakingNativeToken.sol
+124 −30 contracts/staking/StakingVerifier.sol
+25 −3 contracts/test/MockStaking.sol
+1 −3 contracts/test/ReentrancyStakingAttacker.sol
+ docs/Vulnerabilities_list_registries.pdf
+105 −0 docs/configuration.json
+1 −1 package.json
+12 −1 scripts/deployment/l2/deploy_16_service_staking_token.js
+12 −1 scripts/deployment/l2/deploy_17_service_staking_native_token.js
+12 −1 scripts/deployment/l2/deploy_18_service_staking_activity_checker.js
+18 −4 scripts/deployment/l2/deploy_19_service_staking_verifier.js
+12 −1 scripts/deployment/l2/deploy_20_service_staking_factory.js
+7 −3 scripts/deployment/l2/deploy_21_service_staking_token_instance.js
+6 −3 scripts/deployment/l2/deploy_22_service_staking_native_token_instance.js
+1 −1 scripts/deployment/l2/globals_arbitrum_one.json
+1 −1 scripts/deployment/l2/globals_arbitrum_sepolia.json
+1 −1 scripts/deployment/l2/globals_base_mainnet.json
+1 −1 scripts/deployment/l2/globals_celo_mainnet.json
+40 −0 scripts/deployment/l2/globals_ethereum_mainnet.json
+1 −1 scripts/deployment/l2/globals_gnosis_chiado.json
+9 −8 scripts/deployment/l2/globals_gnosis_mainnet.json
+1 −1 scripts/deployment/l2/globals_optimistic_mainnet.json
+1 −1 scripts/deployment/l2/globals_optimistic_sepolia.json
+1 −1 scripts/deployment/l2/globals_polygon_amoy.json
+1 −1 scripts/deployment/l2/globals_polygon_mainnet.json
+9 −3 scripts/deployment/l2/verify_19_service_staking_verifier.js
+2 −2 test/ServiceRegistry.js
+244 −29 test/ServiceStaking.js
+7 −4 test/ServiceStaking.t.sol
+129 −49 test/ServiceStakingFactory.js
+65 −99 yarn.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
/*global process*/

const { ethers } = require("hardhat");
const { LedgerSigner } = require("@anders-t/ethers-ledger");

async function main() {
const fs = require("fs");
const globalsFile = "globals.json";
const dataFromJSON = fs.readFileSync(globalsFile, "utf8");
let parsedData = JSON.parse(dataFromJSON);
const useLedger = parsedData.useLedger;
const derivationPath = parsedData.derivationPath;
const providerName = parsedData.providerName;
const gasPriceInGwei = parsedData.gasPriceInGwei;
const livenessRatio = parsedData.livenessRatio;

let networkURL = parsedData.networkURL;
if (providerName === "mainnet") {
if (!process.env.ALCHEMY_API_KEY_MAINNET) {
console.log("set ALCHEMY_API_KEY_MAINNET env variable");
}
networkURL += process.env.ALCHEMY_API_KEY_MAINNET;
} else if (providerName === "sepolia") {
if (!process.env.ALCHEMY_API_KEY_SEPOLIA) {
console.log("set ALCHEMY_API_KEY_SEPOLIA env variable");
return;
}
networkURL += process.env.ALCHEMY_API_KEY_SEPOLIA;
} else if (providerName === "polygon") {
if (!process.env.ALCHEMY_API_KEY_MATIC) {
console.log("set ALCHEMY_API_KEY_MATIC env variable");
}
networkURL += process.env.ALCHEMY_API_KEY_MATIC;
} else if (providerName === "polygonAmoy") {
if (!process.env.ALCHEMY_API_KEY_AMOY) {
console.log("set ALCHEMY_API_KEY_AMOY env variable");
return;
}
networkURL += process.env.ALCHEMY_API_KEY_AMOY;
}

const provider = new ethers.providers.JsonRpcProvider(networkURL);
const signers = await ethers.getSigners();

let EOA;
if (useLedger) {
EOA = new LedgerSigner(provider, derivationPath);
} else {
EOA = signers[0];
}
// EOA address
const deployer = await EOA.getAddress();
console.log("EOA is:", deployer);

// Transaction signing and execution
console.log("18. EOA to deploy StakingActivityChecker");
const gasPrice = ethers.utils.parseUnits(gasPriceInGwei, "gwei");
const StakingActivityChecker = await ethers.getContractFactory("StakingActivityChecker");
console.log("You are signing the following transaction: StakingActivityChecker.connect(EOA).deploy()");
const stakingActivityChecker = await StakingActivityChecker.connect(EOA).deploy(livenessRatio,
{ gasPrice });
const result = await stakingActivityChecker.deployed();

// Transaction details
console.log("Contract deployment: StakingActivityChecker");
console.log("Contract address:", stakingActivityChecker.address);
console.log("Transaction:", result.deployTransaction.hash);
// Wait half a minute for the transaction completion
await new Promise(r => setTimeout(r, 30000));

// Writing updated parameters back to the JSON file
parsedData.stakingActivityCheckerAddress = stakingActivityChecker.address;
fs.writeFileSync(globalsFile, JSON.stringify(parsedData));

// Contract verification
if (parsedData.contractVerification) {
const execSync = require("child_process").execSync;
execSync("npx hardhat verify --constructor-args scripts/deployment/l2/verify_18_service_staking_activity_checker.js --network " + providerName + " " + stakingActivityChecker.address, { encoding: "utf-8" });
}
}

main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});
10 changes: 7 additions & 3 deletions scripts/deployment/deploy_02_staking_token_instance.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ async function main() {
const derivationPath = parsedData.derivationPath;
const providerName = parsedData.providerName;
const stakingParams = parsedData.stakingParams;
const gasPriceInGwei = parsedData.gasPriceInGwei;
const serviceRegistryTokenUtilityAddress = parsedData.serviceRegistryTokenUtilityAddress;
const olasAddress = parsedData.olasAddress;
const stakingTokenAddress = parsedData.stakingTokenAddress;
Expand Down Expand Up @@ -52,11 +53,14 @@ async function main() {
// Transaction signing and execution
console.log("21. EOA to deploy StakingTokenInstance via the StakingFactory");
console.log("You are signing the following transaction: StakingFactory.connect(EOA).createStakingInstance()");
const gasPrice = ethers.utils.parseUnits(gasPriceInGwei, "gwei");
const initPayload = stakingToken.interface.encodeFunctionData("initialize", [stakingParams,
serviceRegistryTokenUtilityAddress, olasAddress]);
const stakingTokenInstanceAddress = await stakingFactory.callStatic.createStakingInstance(stakingTokenAddress,
initPayload);
const result = await stakingFactory.createStakingInstance(stakingTokenAddress, initPayload);
const result = await stakingFactory.createStakingInstance(stakingTokenAddress, initPayload, { gasPrice });
let res = await result.wait();
// Get staking contract instance address from the event
const stakingTokenInstanceAddress = "0x" + res.logs[0].topics[2].slice(26);


// Transaction details
console.log("Contract deployment: StakingProxy");
Expand Down
9 changes: 6 additions & 3 deletions scripts/deployment/deploy_03_staking_native_token_instance.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ async function main() {
const useLedger = parsedData.useLedger;
const derivationPath = parsedData.derivationPath;
const providerName = parsedData.providerName;
const gasPriceInGwei = parsedData.gasPriceInGwei;
const stakingParams = parsedData.stakingParams;
const stakingNativeTokenAddress = parsedData.stakingNativeTokenAddress;
const stakingFactoryAddress = parsedData.stakingFactoryAddress;
Expand Down Expand Up @@ -50,10 +51,12 @@ async function main() {
// Transaction signing and execution
console.log("22. EOA to deploy StakingNativeTokenInstance via the StakingFactory");
console.log("You are signing the following transaction: StakingFactory.connect(EOA).createStakingInstance()");
const gasPrice = ethers.utils.parseUnits(gasPriceInGwei, "gwei");
const initPayload = stakingNativeToken.interface.encodeFunctionData("initialize", [stakingParams]);
const stakingNativeTokenInstanceAddress = await stakingFactory.callStatic.createStakingInstance(
stakingNativeTokenAddress, initPayload);
const result = await stakingFactory.createStakingInstance(stakingNativeTokenAddress, initPayload);
const result = await stakingFactory.createStakingInstance(stakingNativeTokenAddress, initPayload, { gasPrice });
let res = await result.wait();
// Get staking contract instance address from the event
const stakingNativeTokenInstanceAddress = "0x" + res.logs[0].topics[2].slice(26);

// Transaction details
console.log("Contract deployment: StakingProxy");
Expand Down
1 change: 1 addition & 0 deletions scripts/deployment/globals_arbitrum_one.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"contractVerification":true,"useLedger":true,"derivationPath":"m/44'/60'/2'/0/0","providerName":"arbitrumOne","networkURL":"https://arb1.arbitrum.io/rpc","gasPriceInGwei":"2","gnosisSafeAddress":"0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552","gnosisSafeProxyFactoryAddress":"0xa6B71E26C5e0845f74c812102Ca7114b6a896AB2","serviceRegistryAddress":"0xE3607b00E75f6405248323A9417ff6b39B244b50","serviceRegistryTokenUtilityAddress":"0x3d77596beb0f130a4415df3D2D8232B3d3D31e44","olasAddress":"0x064F8B858C2A603e1b106a2039f5446D32dc81c1","multisigProxyHash130":"0xb89c1b3bdf2cf8827818646bce9a8f6e372885f8c55e5c07acbd307cb133b000","stakingTokenAddress":"0x04b0007b2aFb398015B76e5f22993a1fddF83644","stakingNativeTokenAddress":"","stakingFactoryAddress":"0xEB5638eefE289691EcE01943f768EDBF96258a80","agentMechAddress":"","livenessRatio":"700000000000000","mechActivityCheckerAddress":"","stakingActivityCheckerAddress":"","stakingParams":{"metadataHash":"","maxNumServices":"100","rewardsPerSecond":"1000000000000000","minStakingDeposit":"50000000000000000000","minNumStakingPeriods":"3","maxNumInactivityPeriods":"3","livenessPeriod":"86400","timeForEmissions":"2592000","numAgentInstances":"1","agentIds":["14"],"threshold":"0","configHash":"0x0000000000000000000000000000000000000000000000000000000000000000","proxyHash":"0xb89c1b3bdf2cf8827818646bce9a8f6e372885f8c55e5c07acbd307cb133b000","serviceRegistry":"0xE3607b00E75f6405248323A9417ff6b39B244b50","activityChecker":""}}
1 change: 1 addition & 0 deletions scripts/deployment/globals_arbitrum_sepolia.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"contractVerification":true,"useLedger":false,"derivationPath":"m/44'/60'/2'/0/0","providerName":"arbitrumSepolia","networkURL":"https://sepolia-rollup.arbitrum.io/rpc","gasPriceInGwei":"1","gnosisSafeAddress":"0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552","gnosisSafeProxyFactoryAddress":"0xa6B71E26C5e0845f74c812102Ca7114b6a896AB2","serviceRegistryAddress":"0x31D3202d8744B16A120117A053459DDFAE93c855","serviceRegistryTokenUtilityAddress":"0xeB49bE5DF00F74bd240DE4535DDe6Bc89CEfb994","olasAddress":"0x2AeD71638128A3811F5e5971a397fFe6A8587caa","multisigProxyHash130":"0xb89c1b3bdf2cf8827818646bce9a8f6e372885f8c55e5c07acbd307cb133b000","stakingTokenAddress":"0xea930a028793FeBE9F6A2CFb62c95620dB91da71","stakingNativeTokenAddress":"0xA9D794548486D15BfbCe2b8b5F5518b739fa8A4b","agentMechAddress":"","livenessRatio":"700000000000000","mechActivityCheckerAddress":"","stakingActivityCheckerAddress":"","stakingFactoryAddress":"0xd64Cf67500b7d15A41E02DDeb40F3A73CB533eB5","stakingParams":{"metadataHash":"0x0000000000000000000000000000000000000000000000000000000000000001","maxNumServices":"100","rewardsPerSecond":"1000000000000000","minStakingDeposit":"50000000000000000000","minNumStakingPeriods":"3","maxNumInactivityPeriods":"3","livenessPeriod":"86400","timeForEmissions":"2592000","numAgentInstances":"1","agentIds":["12"],"threshold":"0","configHash":"0x0000000000000000000000000000000000000000000000000000000000000000","proxyHash":"0xb89c1b3bdf2cf8827818646bce9a8f6e372885f8c55e5c07acbd307cb133b000","serviceRegistry":"0x31D3202d8744B16A120117A053459DDFAE93c855","activityChecker":""},"stakingTokenInstanceAddress":"","stakingNativeTokenInstanceAddress":""}
1 change: 1 addition & 0 deletions scripts/deployment/globals_base_mainnet.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"contractVerification":true,"useLedger":true,"derivationPath":"m/44'/60'/2'/0/0","providerName":"base","networkURL":"https://mainnet.base.org","gasPriceInGwei":"2","gnosisSafeAddress":"0x69f4D1788e39c87893C980c06EdF4b7f686e2938","gnosisSafeProxyFactoryAddress":"0xC22834581EbC8527d974F8a1c97E1bEA4EF910BC","olasAddress":"0x54330d28ca3357F294334BDC454a032e7f353416","multisigProxyHash130":"0xb89c1b3bdf2cf8827818646bce9a8f6e372885f8c55e5c07acbd307cb133b000","serviceRegistryAddress":"0x3C1fF68f5aa342D296d4DEe4Bb1cACCA912D95fE","serviceRegistryTokenUtilityAddress":"0x34C895f302D0b5cf52ec0Edd3945321EB0f83dd5","stakingTokenAddress":"0xEB5638eefE289691EcE01943f768EDBF96258a80","stakingNativeTokenAddress":"","stakingFactoryAddress":"0x1cEe30D08943EB58EFF84DD1AB44a6ee6FEff63a","agentMechAddress":"","livenessRatio":"700000000000000","mechActivityCheckerAddress":"","stakingActivityCheckerAddress":"","stakingParams":{"metadataHash":"","maxNumServices":"100","rewardsPerSecond":"1000000000000000","minStakingDeposit":"50000000000000000000","minNumStakingPeriods":"3","maxNumInactivityPeriods":"3","livenessPeriod":"86400","timeForEmissions":"2592000","numAgentInstances":"1","agentIds":["14"],"threshold":"0","configHash":"0x0000000000000000000000000000000000000000000000000000000000000000","proxyHash":"0xb89c1b3bdf2cf8827818646bce9a8f6e372885f8c55e5c07acbd307cb133b000","serviceRegistry":"0x3C1fF68f5aa342D296d4DEe4Bb1cACCA912D95fE","activityChecker":""}}
1 change: 1 addition & 0 deletions scripts/deployment/globals_base_sepolia.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"contractVerification":true,"useLedger":false,"derivationPath":"m/44'/60'/2'/0/0","providerName":"baseSepolia","networkURL":"https://sepolia.base.org","gasPriceInGwei":"2","gnosisSafeAddress":"0x69f4D1788e39c87893C980c06EdF4b7f686e2938","gnosisSafeProxyFactoryAddress":"0xC22834581EbC8527d974F8a1c97E1bEA4EF910BC","olasAddress":"","multisigProxyHash130":"0xb89c1b3bdf2cf8827818646bce9a8f6e372885f8c55e5c07acbd307cb133b000","serviceRegistryAddress":"0x31D3202d8744B16A120117A053459DDFAE93c855","serviceRegistryTokenUtilityAddress":"0xeB49bE5DF00F74bd240DE4535DDe6Bc89CEfb994","mechActivityCheckerAddress":""}
1 change: 1 addition & 0 deletions scripts/deployment/globals_celo_alfajores.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"contractVerification":true,"useLedger":false,"derivationPath":"m/44'/60'/2'/0/0","providerName":"celoAlfajores","networkURL":"https://alfajores-forno.celo-testnet.org","gasPriceInGwei":"10","gnosisSafeAddress":"0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552","gnosisSafeProxyFactoryAddress":"0xa6B71E26C5e0845f74c812102Ca7114b6a896AB2","olasAddress":"","multisigProxyHash130":"0xb89c1b3bdf2cf8827818646bce9a8f6e372885f8c55e5c07acbd307cb133b000","serviceRegistryAddress":"0x31D3202d8744B16A120117A053459DDFAE93c855","serviceRegistryTokenUtilityAddress":"0xeB49bE5DF00F74bd240DE4535DDe6Bc89CEfb994","stakingParams":{"maxNumServices":"100","rewardsPerSecond":"1000000000000000","minStakingDeposit":"50000000000000000000","minNumStakingPeriods":"3","maxNumInactivityPeriods":"3","livenessPeriod":"86400","livenessRatio":"700000000000000","numAgentInstances":"1","agentIds":["12"],"threshold":"0","configHash":"0x0000000000000000000000000000000000000000000000000000000000000000"},"stakingTokenAddress":"0x4cEB52802ef86edF8796632546d89e55c87a0901","stakingFactoryAddress":"0xaC26774616bbeD41b0CB69EA2ae7de366F430b23"}
1 change: 1 addition & 0 deletions scripts/deployment/globals_celo_mainnet.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"contractVerification":true,"useLedger":true,"derivationPath":"m/44'/60'/2'/0/0","providerName":"celo","networkURL":"https://forno.celo.org","gasPriceInGwei":"10","gnosisSafeAddress":"0x69f4D1788e39c87893C980c06EdF4b7f686e2938","gnosisSafeProxyFactoryAddress":"0xC22834581EbC8527d974F8a1c97E1bEA4EF910BC","olasAddress":"0xaCFfAe8e57Ec6E394Eb1b41939A8CF7892DbDc51","multisigProxyHash130":"0xb89c1b3bdf2cf8827818646bce9a8f6e372885f8c55e5c07acbd307cb133b000","serviceRegistryAddress":"0xE3607b00E75f6405248323A9417ff6b39B244b50","serviceRegistryTokenUtilityAddress":"0x3d77596beb0f130a4415df3D2D8232B3d3D31e44","stakingTokenAddress":"0xe1E1B286EbE95b39F785d8069f2248ae9C41b7a9","stakingNativeTokenAddress":"","agentMechAddress":"","livenessRatio":"700000000000000","mechActivityCheckerAddress":"","stakingActivityCheckerAddress":"","stakingFactoryAddress":"0x1c2cD884127b080F940b7546c1e9aaf525b1FA55","stakingParams":{"metadataHash":"0x0000000000000000000000000000000000000000000000000000000000000001","maxNumServices":"100","rewardsPerSecond":"1000000000000000","minStakingDeposit":"50000000000000000000","minNumStakingPeriods":"3","maxNumInactivityPeriods":"3","livenessPeriod":"86400","timeForEmissions":"2592000","numAgentInstances":"1","agentIds":["12"],"threshold":"0","configHash":"0x0000000000000000000000000000000000000000000000000000000000000000","proxyHash":"0xb89c1b3bdf2cf8827818646bce9a8f6e372885f8c55e5c07acbd307cb133b000","serviceRegistry":"0xE3607b00E75f6405248323A9417ff6b39B244b50","activityChecker":""},"stakingTokenInstanceAddress":"0x83839b36d41bdb44abfb6a52ef5549de9bbbb046"}
37 changes: 37 additions & 0 deletions scripts/deployment/globals_ethereum_mainnet.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
{
"contractVerification": true,
"useLedger": true,
"derivationPath": "m/44'/60'/2'/0/0",
"providerName": "mainnet",
"networkURL": "https://eth-mainnet.g.alchemy.com/v2/",
"gasPriceInGwei": "15",
"serviceRegistryAddress": "0x48b6af7B12C71f09e2fC8aF4855De4Ff54e775cA",
"serviceRegistryTokenUtilityAddress": "0x3Fb926116D454b95c669B6Bf2E7c3bad8d19affA",
"olasAddress": "0x0001A500A6B18995B03f44bb040A5fFc28E45CB0",
"multisigProxyHash130": "0xb89c1b3bdf2cf8827818646bce9a8f6e372885f8c55e5c07acbd307cb133b000",
"stakingNativeTokenAddress":"",
"stakingTokenAddress":"0x0Dc23eEf3bC64CF3cbd8f9329B57AE4C4f28d5d2",
"agentMechAddress":"",
"livenessRatio":"700000000000000",
"mechActivityCheckerAddress":"",
"stakingActivityCheckerAddress":"",
"stakingFactoryAddress":"0xEBdde456EA288b49f7D5975E7659bA1Ccf607efc",
"stakingParams":
{
"metadataHash":"",
"maxNumServices":"100",
"rewardsPerSecond":"1000000000000000",
"minStakingDeposit":"50000000000000000000",
"minNumStakingPeriods":"3",
"maxNumInactivityPeriods":"3",
"livenessPeriod":"86400",
"timeForEmissions":"2592000",
"numAgentInstances":"1",
"agentIds":["12"],
"threshold":"0",
"configHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"proxyHash":"0xb89c1b3bdf2cf8827818646bce9a8f6e372885f8c55e5c07acbd307cb133b000",
"serviceRegistry":"0x48b6af7B12C71f09e2fC8aF4855De4Ff54e775cA",
"activityChecker":""},
"stakingTokenInstanceAddress":""
}
37 changes: 37 additions & 0 deletions scripts/deployment/globals_ethereum_sepolia.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
{
"contractVerification": true,
"useLedger": false,
"derivationPath": "m/44'/60'/2'/0/0",
"providerName": "mainnet",
"networkURL": "https://eth-sepolia.g.alchemy.com/v2/",
"gasPriceInGwei": "30",
"serviceRegistryAddress": "",
"serviceRegistryTokenUtilityAddress": "",
"olasAddress": "0x0001A500A6B18995B03f44bb040A5fFc28E45CB0",
"multisigProxyHash130": "0xb89c1b3bdf2cf8827818646bce9a8f6e372885f8c55e5c07acbd307cb133b000",
"stakingNativeTokenAddress":"",
"stakingTokenAddress":"",
"agentMechAddress":"",
"livenessRatio":"700000000000000",
"mechActivityCheckerAddress":"",
"stakingActivityCheckerAddress":"",
"stakingFactoryAddress":"",
"stakingParams":
{
"metadataHash":"",
"maxNumServices":"100",
"rewardsPerSecond":"1000000000000000",
"minStakingDeposit":"50000000000000000000",
"minNumStakingPeriods":"3",
"maxNumInactivityPeriods":"3",
"livenessPeriod":"86400",
"timeForEmissions":"2592000",
"numAgentInstances":"1",
"agentIds":["12"],
"threshold":"0",
"configHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
"proxyHash":"0xb89c1b3bdf2cf8827818646bce9a8f6e372885f8c55e5c07acbd307cb133b000",
"serviceRegistry":"",
"activityChecker":""},
"stakingTokenInstanceAddress":""
}
Loading
Loading