From 23d559046dd8c12882b7551a70b1b25fc71425e8 Mon Sep 17 00:00:00 2001 From: Aleksandr Kuperman Date: Fri, 10 Jan 2025 16:04:09 +0000 Subject: [PATCH] chore: deployment scripts --- contracts/BalanceTrackerBase.sol | 2 - .../BalanceTrackerNvmSubscription.sol | 74 ++++++++++++---- ...{deploy_04_karma.js => deploy_01_karma.js} | 2 +- ...arma_proxy.js => deploy_02_karma_proxy.js} | 4 +- ...place.js => deploy_03_mech_marketplace.js} | 12 +-- .../deploy_04_mech_marketplace_proxy.js | 86 +++++++++++++++++++ ...eploy_05_mech_factory_nvm_subscription.js} | 24 +++--- ...oy_06_balance_tracker_nvm_subscription.js} | 33 +++---- ....js => deploy_11_karma_set_marketplace.js} | 6 +- ...=> deploy_12_marketplace_set_factories.js} | 27 +++--- ...loy_13_marketplace_set_balance_trackers.js | 65 ++++++++++++++ ...14_balance_tracker_nvm_subscription_set.js | 67 +++++++++++++++ .../deployment/globals_gnosis_mainnet.json | 2 +- .../globals_gnosis_mainnet_deprecated.json | 1 + scripts/deployment/verify_00_agent_mech.js | 24 ------ .../deployment/verify_01_agent_registry.js | 13 --- ...arma_proxy.js => verify_02_karma_proxy.js} | 0 .../deployment/verify_03_mech_marketplace.js | 11 +++ .../verify_04_mech_marketplace_proxy.js | 15 ++++ ...erify_05_mech_factory_nvm_subscription.js} | 4 +- ...ify_06_balance_tracker_nvm_subscription.js | 10 +++ .../deployment/verify_06_mech_marketplace.js | 15 ---- 22 files changed, 363 insertions(+), 134 deletions(-) rename scripts/deployment/{deploy_04_karma.js => deploy_01_karma.js} (98%) rename scripts/deployment/{deploy_05_karma_proxy.js => deploy_02_karma_proxy.js} (96%) rename scripts/deployment/{deploy_06_mech_marketplace.js => deploy_03_mech_marketplace.js} (84%) create mode 100644 scripts/deployment/deploy_04_mech_marketplace_proxy.js rename scripts/deployment/{deploy_01_agent_registry.js => deploy_05_mech_factory_nvm_subscription.js} (67%) rename scripts/deployment/{deploy_02_agent_factory.js => deploy_06_balance_tracker_nvm_subscription.js} (65%) rename scripts/deployment/{deploy_07_karma_set_marketplace.js => deploy_11_karma_set_marketplace.js} (91%) rename scripts/deployment/{deploy_03_change_manager.js => deploy_12_marketplace_set_factories.js} (64%) create mode 100644 scripts/deployment/deploy_13_marketplace_set_balance_trackers.js create mode 100644 scripts/deployment/deploy_14_balance_tracker_nvm_subscription_set.js create mode 100644 scripts/deployment/globals_gnosis_mainnet_deprecated.json delete mode 100644 scripts/deployment/verify_00_agent_mech.js delete mode 100644 scripts/deployment/verify_01_agent_registry.js rename scripts/deployment/{verify_05_karma_proxy.js => verify_02_karma_proxy.js} (100%) create mode 100644 scripts/deployment/verify_03_mech_marketplace.js create mode 100644 scripts/deployment/verify_04_mech_marketplace_proxy.js rename scripts/deployment/{verify_02_agent_factory.js => verify_05_mech_factory_nvm_subscription.js} (63%) create mode 100644 scripts/deployment/verify_06_balance_tracker_nvm_subscription.js delete mode 100644 scripts/deployment/verify_06_mech_marketplace.js diff --git a/contracts/BalanceTrackerBase.sol b/contracts/BalanceTrackerBase.sol index 022ff9c..26f4fe5 100644 --- a/contracts/BalanceTrackerBase.sol +++ b/contracts/BalanceTrackerBase.sol @@ -139,7 +139,6 @@ abstract contract BalanceTrackerBase { revert ZeroValue(); } - // TODO Separate between total fee and marketplace fee when NVM solution is ready // Calculate mech payment and marketplace fee uint256 fee = _getFee(); @@ -151,7 +150,6 @@ abstract contract BalanceTrackerBase { // Calculate mech payment mechPayment = balance - marketplaceFee; - // TODO If fee is charged beforehand, this is irrelevant // Check for zero value, although this must never happen if (marketplaceFee == 0 || mechPayment == 0) { revert ZeroValue(); diff --git a/contracts/mechs/nevermined/BalanceTrackerNvmSubscription.sol b/contracts/mechs/nevermined/BalanceTrackerNvmSubscription.sol index a9b0996..783ce85 100644 --- a/contracts/mechs/nevermined/BalanceTrackerNvmSubscription.sol +++ b/contracts/mechs/nevermined/BalanceTrackerNvmSubscription.sol @@ -24,6 +24,11 @@ interface IERC1155 { function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata) external; } +/// @dev Only `owner` has a privilege, but the `sender` was provided. +/// @param sender Sender address. +/// @param owner Required sender address as an owner. +error OwnerOnly(address sender, address owner); + /// @dev Value overflow. /// @param provided Overflow value. /// @param max Maximum possible value. @@ -34,6 +39,7 @@ error Overflow(uint256 provided, uint256 max); error NoDepositAllowed(uint256 amount); contract BalanceTrackerNvmSubscription is BalanceTrackerBase { + event SubscriptionSet(address indexed token, uint256 indexed tokenId); event WithdrawSubscription(address indexed account, address indexed token, uint256 indexed tokenId, uint256 amount); event RequesterCreditsRedeemed(address indexed account, uint256 amount); @@ -41,28 +47,21 @@ contract BalanceTrackerNvmSubscription is BalanceTrackerBase { uint256 public constant NVM_FEE = 100; // Subscription NFT - address public immutable subscriptionNFT; + address public subscriptionNFT; // Subscription token Id - uint256 public immutable subscriptionTokenId; + uint256 public subscriptionTokenId; + + // Temporary owner address + address public owner; + // TODO Do we manage subscription fee via buyBackBurner as well or in-place? /// @dev BalanceTrackerSubscription constructor. /// @param _mechMarketplace Mech marketplace address. /// @param _buyBackBurner Buy back burner address. - /// @param _subscriptionNFT Subscription NFT address. - /// @param _subscriptionTokenId Subscription token Id. - constructor(address _mechMarketplace, address _buyBackBurner, address _subscriptionNFT, uint256 _subscriptionTokenId) + constructor(address _mechMarketplace, address _buyBackBurner) BalanceTrackerBase(_mechMarketplace, _buyBackBurner) { - if (_subscriptionNFT == address(0)) { - revert ZeroAddress(); - } - - if (_subscriptionTokenId == 0) { - revert ZeroValue(); - } - - subscriptionNFT = _subscriptionNFT; - subscriptionTokenId = _subscriptionTokenId; + owner = msg.sender; } /// @dev Adjusts initial requester balance accounting for max request delivery rate (credit). @@ -130,6 +129,26 @@ contract BalanceTrackerNvmSubscription is BalanceTrackerBase { return 0; } + /// @dev Process mech payment. + /// @param mech Mech address. + /// @return mechPayment Mech payment. + function _processPayment(address mech) internal virtual override returns (uint256 mechPayment, uint256) { + // Get mech balance + mechPayment = mapMechBalances[mech]; + // Check for zero value + if (mechPayment == 0) { + revert ZeroValue(); + } + + // Clear balances + mapMechBalances[mech] = 0; + + // Process withdraw + _withdraw(mech, mechPayment); + + return (mechPayment, 0); + } + /// @dev Withdraws funds. /// @param account Account address. /// @param amount Token amount. @@ -140,6 +159,31 @@ contract BalanceTrackerNvmSubscription is BalanceTrackerBase { emit WithdrawSubscription(msg.sender, subscriptionNFT, subscriptionTokenId, amount); } + /// @dev Sets subscription. + /// @param _subscriptionNFT Subscription NFT address. + /// @param _subscriptionTokenId Subscription token Id. + function setSubscription(address _subscriptionNFT, uint256 _subscriptionTokenId) external { + // Check for ownership + if (msg.sender != owner) { + revert OwnerOnly(msg.sender, owner); + } + + if (_subscriptionNFT == address(0)) { + revert ZeroAddress(); + } + + if (_subscriptionTokenId == 0) { + revert ZeroValue(); + } + + subscriptionNFT = _subscriptionNFT; + subscriptionTokenId = _subscriptionTokenId; + + owner = address(0); + + emit SubscriptionSet(_subscriptionNFT, _subscriptionTokenId); + } + /// @dev Redeem requester credits. /// @param requester Requester address. function redeemRequesterCredits(address requester) external { diff --git a/scripts/deployment/deploy_04_karma.js b/scripts/deployment/deploy_01_karma.js similarity index 98% rename from scripts/deployment/deploy_04_karma.js rename to scripts/deployment/deploy_01_karma.js index a0fabe4..7bad406 100644 --- a/scripts/deployment/deploy_04_karma.js +++ b/scripts/deployment/deploy_01_karma.js @@ -41,7 +41,7 @@ async function main() { console.log("EOA is:", deployer); // Transaction signing and execution - console.log("4. EOA to deploy Karma"); + console.log("1. EOA to deploy Karma"); console.log("You are signing the following transaction: Karma.connect(EOA).deploy()"); const gasPrice = ethers.utils.parseUnits(gasPriceInGwei, "gwei"); const Karma = await ethers.getContractFactory("Karma"); diff --git a/scripts/deployment/deploy_05_karma_proxy.js b/scripts/deployment/deploy_02_karma_proxy.js similarity index 96% rename from scripts/deployment/deploy_05_karma_proxy.js rename to scripts/deployment/deploy_02_karma_proxy.js index ffa68ed..f464d9e 100644 --- a/scripts/deployment/deploy_05_karma_proxy.js +++ b/scripts/deployment/deploy_02_karma_proxy.js @@ -46,7 +46,7 @@ async function main() { const proxyData = karma.interface.encodeFunctionData("initialize", []); // Transaction signing and execution - console.log("5. EOA to deploy Karma Proxy"); + console.log("2. EOA to deploy Karma Proxy"); console.log("You are signing the following transaction: KarmaProxy.connect(EOA).deploy()"); const gasPrice = ethers.utils.parseUnits(gasPriceInGwei, "gwei"); const KarmaProxy = await ethers.getContractFactory("KarmaProxy"); @@ -68,7 +68,7 @@ async function main() { // Contract verification if (parsedData.contractVerification) { const execSync = require("child_process").execSync; - execSync("npx hardhat verify --constructor-args scripts/deployment/verify_05_karma_proxy.js --network " + providerName + " " + karmaProxy.address, { encoding: "utf-8" }); + execSync("npx hardhat verify --constructor-args scripts/deployment/verify_02_karma_proxy.js --network " + providerName + " " + karmaProxy.address, { encoding: "utf-8" }); } } diff --git a/scripts/deployment/deploy_06_mech_marketplace.js b/scripts/deployment/deploy_03_mech_marketplace.js similarity index 84% rename from scripts/deployment/deploy_06_mech_marketplace.js rename to scripts/deployment/deploy_03_mech_marketplace.js index 2401591..e306d9b 100644 --- a/scripts/deployment/deploy_06_mech_marketplace.js +++ b/scripts/deployment/deploy_03_mech_marketplace.js @@ -12,10 +12,8 @@ async function main() { const derivationPath = parsedData.derivationPath; const providerName = parsedData.providerName; const gasPriceInGwei = parsedData.gasPriceInGwei; - const stakingFactoryAddress = parsedData.stakingFactoryAddress; + const serviceRegistryAddress = parsedData.serviceRegistryAddress; const karmaProxyAddress = parsedData.karmaProxyAddress; - const minResponseTimeout = parsedData.minResponseTimeout; - const maxResponseTimeout = parsedData.maxResponseTimeout; let networkURL = parsedData.networkURL; if (providerName === "polygon") { @@ -45,15 +43,13 @@ async function main() { console.log("EOA is:", deployer); // Transaction signing and execution - console.log("6. EOA to deploy Mech Marketplace"); + console.log("3. EOA to deploy Mech Marketplace"); console.log("You are signing the following transaction: MechMarketplace.connect(EOA).deploy()"); const gasPrice = ethers.utils.parseUnits(gasPriceInGwei, "gwei"); const MechMarketplace = await ethers.getContractFactory("MechMarketplace"); - const mechMarketplace = await MechMarketplace.connect(EOA).deploy(stakingFactoryAddress, karmaProxyAddress, - minResponseTimeout, maxResponseTimeout, { gasPrice }); + const mechMarketplace = await MechMarketplace.connect(EOA).deploy(serviceRegistryAddress, karmaProxyAddress, { gasPrice }); // In case when gas calculation is not working correctly on Arbitrum //const gasLimit = 60000000; - //const mechMarketplace = await MechMarketplace.connect(EOA).deploy(stakingFactoryAddress, { gasLimit }); const result = await mechMarketplace.deployed(); // Transaction details @@ -71,7 +67,7 @@ async function main() { // Contract verification if (parsedData.contractVerification) { const execSync = require("child_process").execSync; - execSync("npx hardhat verify --constructor-args scripts/deployment/verify_06_mech_marketplace.js --network " + providerName + " " + mechMarketplace.address, { encoding: "utf-8" }); + execSync("npx hardhat verify --constructor-args scripts/deployment/verify_03_mech_marketplace.js --network " + providerName + " " + mechMarketplace.address, { encoding: "utf-8" }); } } diff --git a/scripts/deployment/deploy_04_mech_marketplace_proxy.js b/scripts/deployment/deploy_04_mech_marketplace_proxy.js new file mode 100644 index 0000000..900b169 --- /dev/null +++ b/scripts/deployment/deploy_04_mech_marketplace_proxy.js @@ -0,0 +1,86 @@ +/*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 mechMarketplaceAddress = parsedData.mechMarketplaceAddress; + const fee = parsedData.fee; + const minResponseTimeout = parsedData.minResponseTimeout; + const maxResponseTimeout = parsedData.maxResponseTimeout; + + let networkURL = parsedData.networkURL; + 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 === "polygonMumbai") { + if (!process.env.ALCHEMY_API_KEY_MUMBAI) { + console.log("set ALCHEMY_API_KEY_MUMBAI env variable"); + return; + } + networkURL += process.env.ALCHEMY_API_KEY_MUMBAI; + } + + 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); + + // Assemble the mech marketplace proxy data + const mechMarketplace = await ethers.getContractAt("MechMarketplace", mechMarketplaceAddress); + const proxyPayload = mechMarketplace.interface.encodeFunctionData("initialize", [fee, minResponseTimeout, maxResponseTimeout]); + + // Transaction signing and execution + console.log("4. EOA to deploy Mech Marketplace Proxy"); + console.log("You are signing the following transaction: MechMarketplaceProxy.connect(EOA).deploy()"); + const gasPrice = ethers.utils.parseUnits(gasPriceInGwei, "gwei"); + const MechMarketplaceProxy = await ethers.getContractFactory("MechMarketplaceProxy"); + const mechMarketplaceProxy = await MechMarketplaceProxy.connect(EOA).deploy(mechMarketplaceAddress, proxyPayload, + { gasPrice }); + // In case when gas calculation is not working correctly on Arbitrum + //const gasLimit = 60000000; + const result = await mechMarketplaceProxy.deployed(); + + // Transaction details + console.log("Contract deployment: MechMarketplaceProxy"); + console.log("Contract address:", mechMarketplaceProxy.address); + console.log("Transaction:", result.deployTransaction.hash); + + // Wait for half a minute for the transaction completion + await new Promise(r => setTimeout(r, 30000)); + + // Writing updated parameters back to the JSON file + parsedData.mechMarketplaceProxyAddress = mechMarketplaceProxy.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/verify_04_mech_marketplace_proxy.js --network " + providerName + " " + mechMarketplaceProxy.address, { encoding: "utf-8" }); + } +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/deployment/deploy_01_agent_registry.js b/scripts/deployment/deploy_05_mech_factory_nvm_subscription.js similarity index 67% rename from scripts/deployment/deploy_01_agent_registry.js rename to scripts/deployment/deploy_05_mech_factory_nvm_subscription.js index 71b3ca6..57a2d9e 100644 --- a/scripts/deployment/deploy_01_agent_registry.js +++ b/scripts/deployment/deploy_05_mech_factory_nvm_subscription.js @@ -12,9 +12,7 @@ async function main() { const derivationPath = parsedData.derivationPath; const providerName = parsedData.providerName; const gasPriceInGwei = parsedData.gasPriceInGwei; - const agentRegistryName = parsedData.agentRegistryName; - const agentRegistrySymbol = parsedData.agentRegistrySymbol; - const baseURI = parsedData.baseURI; + const mechMarketplaceProxyAddress = parsedData.mechMarketplaceProxyAddress; let networkURL = parsedData.networkURL; if (providerName === "polygon") { @@ -44,29 +42,31 @@ async function main() { console.log("EOA is:", deployer); // Transaction signing and execution - console.log("1. EOA to deploy AgentRegistry"); - const AgentRegistry = await ethers.getContractFactory("AgentRegistry"); - console.log("You are signing the following transaction: AgentRegistry.connect(EOA).deploy()"); + console.log("5. EOA to deploy Mech Factory NVM Subscription"); + console.log("You are signing the following transaction: MechFactoryNvmSubscription.connect(EOA).deploy()"); const gasPrice = ethers.utils.parseUnits(gasPriceInGwei, "gwei"); - const agentRegistry = await AgentRegistry.connect(EOA).deploy(agentRegistryName, agentRegistrySymbol, baseURI, { gasPrice }); - const result = await agentRegistry.deployed(); + const MechFactoryNvmSubscription = await ethers.getContractFactory("MechFactoryNvmSubscription"); + const mechFactoryNvmSubscription = await MechFactoryNvmSubscription.connect(EOA).deploy(mechMarketplaceProxyAddress, { gasPrice }); + // In case when gas calculation is not working correctly on Arbitrum + //const gasLimit = 60000000; + const result = await mechFactoryNvmSubscription.deployed(); // Transaction details - console.log("Contract deployment: AgentRegistry"); - console.log("Contract address:", agentRegistry.address); + console.log("Contract deployment: MechFactoryNvmSubscription"); + console.log("Contract address:", mechFactoryNvmSubscription.address); console.log("Transaction:", result.deployTransaction.hash); // Wait for half a minute for the transaction completion await new Promise(r => setTimeout(r, 30000)); // Writing updated parameters back to the JSON file - parsedData.agentRegistryAddress = agentRegistry.address; + parsedData.mechFactoryNvmSubscriptionAddress = mechFactoryNvmSubscription.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/verify_01_agent_registry.js --network " + providerName + " " + agentRegistry.address, { encoding: "utf-8" }); + execSync("npx hardhat verify --constructor-args scripts/deployment/verify_05_mech_factory_nvm_subscription.js --network " + providerName + " " + mechFactoryNvmSubscription.address, { encoding: "utf-8" }); } } diff --git a/scripts/deployment/deploy_02_agent_factory.js b/scripts/deployment/deploy_06_balance_tracker_nvm_subscription.js similarity index 65% rename from scripts/deployment/deploy_02_agent_factory.js rename to scripts/deployment/deploy_06_balance_tracker_nvm_subscription.js index 569e07c..6d7085a 100644 --- a/scripts/deployment/deploy_02_agent_factory.js +++ b/scripts/deployment/deploy_06_balance_tracker_nvm_subscription.js @@ -12,8 +12,7 @@ async function main() { const derivationPath = parsedData.derivationPath; const providerName = parsedData.providerName; const gasPriceInGwei = parsedData.gasPriceInGwei; - const agentRegistryAddress = parsedData.agentRegistryAddress; - const agentType = parsedData.agentType; + const mechMarketplaceProxyAddress = parsedData.mechMarketplaceProxyAddress; let networkURL = parsedData.networkURL; if (providerName === "polygon") { @@ -43,41 +42,33 @@ async function main() { console.log("EOA is:", deployer); // Transaction signing and execution - console.log("2. EOA to deploy AgentFactory pointed to AgentRegistry"); - let AgentFactory; - if (agentType === "subscription") { - AgentFactory = await ethers.getContractFactory("AgentFactorySubscription"); - } else { - AgentFactory = await ethers.getContractFactory("AgentFactory"); - } - console.log("You are signing the following transaction: AgentFactory.connect(EOA).deploy()"); + console.log("5. EOA to deploy Balance Tracker NVM Subscription"); + console.log("You are signing the following transaction: BalanceTrackerNvmSubscription.connect(EOA).deploy()"); const gasPrice = ethers.utils.parseUnits(gasPriceInGwei, "gwei"); - const agentFactory = await AgentFactory.connect(EOA).deploy(agentRegistryAddress, { gasPrice }); + const BalanceTrackerNvmSubscription = await ethers.getContractFactory("BalanceTrackerNvmSubscription"); + // TODO Decide on buyBackBurner, now just mechMarketplace address + const balanceTrackerNvmSubscription = await BalanceTrackerNvmSubscription.connect(EOA).deploy(mechMarketplaceProxyAddress, + mechMarketplaceProxyAddress, { gasPrice }); // In case when gas calculation is not working correctly on Arbitrum //const gasLimit = 60000000; - //const agentFactory = await AgentFactory.connect(EOA).deploy(agentRegistryAddress, { gasLimit }); - const result = await agentFactory.deployed(); + const result = await balanceTrackerNvmSubscription.deployed(); // Transaction details - console.log("Contract deployment: AgentFactory"); - console.log("Contract address:", agentFactory.address); + console.log("Contract deployment: BalanceTrackerNvmSubscription"); + console.log("Contract address:", balanceTrackerNvmSubscription.address); console.log("Transaction:", result.deployTransaction.hash); // Wait for half a minute for the transaction completion await new Promise(r => setTimeout(r, 30000)); // Writing updated parameters back to the JSON file - if (agentType === "subscription") { - parsedData.agentFactorySubscriptionAddress = agentFactory.address; - } else { - parsedData.agentFactoryAddress = agentFactory.address; - } + parsedData.balanceTrackerNvmSubscriptionAddress = balanceTrackerNvmSubscription.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/verify_02_agent_factory.js --network " + providerName + " " + agentFactory.address, { encoding: "utf-8" }); + execSync("npx hardhat verify --constructor-args scripts/deployment/verify_06_balance_tracker_nvm_subscription.js --network " + providerName + " " + balanceTrackerNvmSubscription.address, { encoding: "utf-8" }); } } diff --git a/scripts/deployment/deploy_07_karma_set_marketplace.js b/scripts/deployment/deploy_11_karma_set_marketplace.js similarity index 91% rename from scripts/deployment/deploy_07_karma_set_marketplace.js rename to scripts/deployment/deploy_11_karma_set_marketplace.js index f4467ce..a18491f 100644 --- a/scripts/deployment/deploy_07_karma_set_marketplace.js +++ b/scripts/deployment/deploy_11_karma_set_marketplace.js @@ -13,7 +13,7 @@ async function main() { const providerName = parsedData.providerName; const gasPriceInGwei = parsedData.gasPriceInGwei; const karmaProxyAddress = parsedData.karmaProxyAddress; - const mechMarketplaceAddress = parsedData.mechMarketplaceAddress; + const mechMarketplaceProxyAddress = parsedData.mechMarketplaceProxyAddress; let networkURL = parsedData.networkURL; if (providerName === "polygon") { @@ -46,10 +46,10 @@ async function main() { const karma = await ethers.getContractAt("Karma", karmaProxyAddress); // Transaction signing and execution - console.log("7. EOA to set Mech Marketplace statuses"); + console.log("11. EOA to set Mech Marketplace statuses"); console.log("You are signing the following transaction: KarmaProxy.connect(EOA).setMechMarketplaceStatuses()"); const gasPrice = ethers.utils.parseUnits(gasPriceInGwei, "gwei"); - const result = await karma.connect(EOA).setMechMarketplaceStatuses([mechMarketplaceAddress], [true], { gasPrice }); + const result = await karma.connect(EOA).setMechMarketplaceStatuses([mechMarketplaceProxyAddress], [true], { gasPrice }); // Transaction details console.log("Contract deployment: KarmaProxy"); diff --git a/scripts/deployment/deploy_03_change_manager.js b/scripts/deployment/deploy_12_marketplace_set_factories.js similarity index 64% rename from scripts/deployment/deploy_03_change_manager.js rename to scripts/deployment/deploy_12_marketplace_set_factories.js index 53290e1..672f8d2 100644 --- a/scripts/deployment/deploy_03_change_manager.js +++ b/scripts/deployment/deploy_12_marketplace_set_factories.js @@ -11,14 +11,9 @@ async function main() { const useLedger = parsedData.useLedger; const derivationPath = parsedData.derivationPath; const providerName = parsedData.providerName; - const agentRegistryAddress = parsedData.agentRegistryAddress; - const agentType = parsedData.agentType; - let agentFactoryAddress; - if (agentType === "subscription") { - agentFactoryAddress = parsedData.agentFactorySubscriptionAddress; - } else { - agentFactoryAddress = parsedData.agentFactoryAddress; - } + const gasPriceInGwei = parsedData.gasPriceInGwei; + const mechMarketplaceProxyAddress = parsedData.mechMarketplaceProxyAddress; + const mechFactoryNvmSubscriptionAddress = parsedData.mechFactoryNvmSubscriptionAddress; let networkURL = parsedData.networkURL; if (providerName === "polygon") { @@ -47,16 +42,18 @@ async function main() { const deployer = await EOA.getAddress(); console.log("EOA is:", deployer); - // Get all the contracts - const agentRegistry = await ethers.getContractAt("AgentRegistry", agentRegistryAddress); + // Get the contract instance + const mechMarketplace = await ethers.getContractAt("MechMarketplace", mechMarketplaceProxyAddress); // Transaction signing and execution - // 3. EOA to change the manager of AgentRegistry via `changeManager(AgentRegistry)`; - console.log("You are signing the following transaction: agentRegistry.connect(EOA).changeManager()"); - let result = await agentRegistry.connect(EOA).changeManager(agentFactoryAddress); + console.log("12. EOA to set Mech factories"); + console.log("You are signing the following transaction: MechMarketplaceProxy.connect(EOA).setMechFactoryStatuses()"); + const gasPrice = ethers.utils.parseUnits(gasPriceInGwei, "gwei"); + const result = await mechMarketplace.connect(EOA).setMechFactoryStatuses([mechFactoryNvmSubscriptionAddress], [true], { gasPrice }); + // Transaction details - console.log("Contract deployment: AgentRegistry"); - console.log("Contract address:", agentRegistryAddress); + console.log("Contract deployment: MechMarketplaceProxy"); + console.log("Contract address:", mechMarketplace.address); console.log("Transaction:", result.hash); } diff --git a/scripts/deployment/deploy_13_marketplace_set_balance_trackers.js b/scripts/deployment/deploy_13_marketplace_set_balance_trackers.js new file mode 100644 index 0000000..754ab7a --- /dev/null +++ b/scripts/deployment/deploy_13_marketplace_set_balance_trackers.js @@ -0,0 +1,65 @@ +/*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 mechMarketplaceProxyAddress = parsedData.mechMarketplaceProxyAddress; + const balanceTrackerNvmSubscriptionAddress = parsedData.balanceTrackerNvmSubscriptionAddress; + + let networkURL = parsedData.networkURL; + 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 === "polygonMumbai") { + if (!process.env.ALCHEMY_API_KEY_MUMBAI) { + console.log("set ALCHEMY_API_KEY_MUMBAI env variable"); + return; + } + networkURL += process.env.ALCHEMY_API_KEY_MUMBAI; + } + + 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); + + // Get the contract instance + const mechMarketplace = await ethers.getContractAt("MechMarketplace", mechMarketplaceProxyAddress); + + // Transaction signing and execution + console.log("13. EOA to set Balance trackers"); + console.log("You are signing the following transaction: MechMarketplaceProxy.connect(EOA).setMechFactoryStatuses()"); + const gasPrice = ethers.utils.parseUnits(gasPriceInGwei, "gwei"); + const result = await mechMarketplace.connect(EOA).setMechFactoryStatuses([balanceTrackerNvmSubscriptionAddress], [true], { gasPrice }); + + // Transaction details + console.log("Contract deployment: MechMarketplaceProxy"); + console.log("Contract address:", mechMarketplace.address); + console.log("Transaction:", result.hash); +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/deployment/deploy_14_balance_tracker_nvm_subscription_set.js b/scripts/deployment/deploy_14_balance_tracker_nvm_subscription_set.js new file mode 100644 index 0000000..e5d6eb1 --- /dev/null +++ b/scripts/deployment/deploy_14_balance_tracker_nvm_subscription_set.js @@ -0,0 +1,67 @@ +/*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 balanceTrackerNvmSubscriptionAddress = parsedData.balanceTrackerNvmSubscriptionAddress; + const subscriptionNFTAddress = parsedData.subscriptionNFTAddress; + const subscriptionTokenId = parsedData.subscriptionTokenId; + + let networkURL = parsedData.networkURL; + 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 === "polygonMumbai") { + if (!process.env.ALCHEMY_API_KEY_MUMBAI) { + console.log("set ALCHEMY_API_KEY_MUMBAI env variable"); + return; + } + networkURL += process.env.ALCHEMY_API_KEY_MUMBAI; + } + + 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); + + // Get the contract instance + const balanceTrackerNvmSubscription = await ethers.getContractAt("BalanceTrackerNvmSubscription", balanceTrackerNvmSubscriptionAddress); + + // Transaction signing and execution + console.log("14. EOA to set Balance trackers NVM subscription"); + console.log("You are signing the following transaction: BalanceTrackerNvmSubscription.connect(EOA).setSubscription()"); + const gasPrice = ethers.utils.parseUnits(gasPriceInGwei, "gwei"); + const result = await balanceTrackerNvmSubscription.connect(EOA).setSubscription(subscriptionNFTAddress, + subscriptionTokenId, { gasPrice }); + + // Transaction details + console.log("Contract deployment: MechMarketplaceProxy"); + console.log("Contract address:", mechMarketplace.address); + console.log("Transaction:", result.hash); +} + +main() + .then(() => process.exit(0)) + .catch((error) => { + console.error(error); + process.exit(1); + }); diff --git a/scripts/deployment/globals_gnosis_mainnet.json b/scripts/deployment/globals_gnosis_mainnet.json index 6020fd0..efbeea7 100644 --- a/scripts/deployment/globals_gnosis_mainnet.json +++ b/scripts/deployment/globals_gnosis_mainnet.json @@ -1 +1 @@ -{"contractVerification":true,"useLedger":true,"derivationPath":"m/44'/60'/2'/0/0","providerName":"gnosis","networkURL":"https://rpc.gnosischain.com","gasPriceInGwei":"5","agentType":".","baseURI":"https://gateway.autonolas.tech/ipfs/","agentRegistryName":"AI Agent Registry","agentRegistrySymbol":"AI-AGENT-V1","agentRegistryAddress":"0xE49CB081e8d96920C38aA7AB90cb0294ab4Bc8EA","agentFactoryAddress":"0x6D8CbEbCAD7397c63347D44448147Db05E7d17B0","agentMechAddress":"0x77af31de935740567cf4ff1986d04b2c964a786a","agentId":"9","price":"10000000000000000","agentHash":"0x59ec5386a145869a4c8d14a3df188b32da54f4ae70bf9002df00672dbf777ffc","agentFactorySubscriptionAddress":"0x910Ca843Cad6C050Faf3f84387879b2928D40370","agentMechSubscriptionAddress":"0x327E26bDF1CfEa50BFAe35643B23D5268E41F7F9","agentIdSubscription":"3","minCreditsPerRequest":"1","subscriptionNFTAddress":"0x80A9b55F8604acC26dF2Ac6e07F9dC5B0eAa05Ce","subscriptionTokenId":"0x0ea01d5de3b34e3792db825f2a5f5595c393c68b19fd5efdacd00fcc63a53483","agentHashSubscription":"0x59ec5386a145869a4c8d14a3df188b32da54f4ae70bf9002df00672dbf777ffc","karmaAddress":"0x4039B809E0C0Ad04F6Fc880193366b251dDf4B40","karmaProxyAddress":"0x4E3e48bA826b15214FDe72a50BFd17aB286B584E","stakingFactoryAddress":"0xb0228CA253A88Bc8eb4ca70BCAC8f87b381f4700","minResponseTimeout":"60","maxResponseTimeout":"300","mechMarketplaceAddress":"0x4554fE75c1f5576c1d7F765B2A036c199Adae329"} \ No newline at end of file +{"contractVerification":true,"useLedger":true,"derivationPath":"m/44'/60'/2'/0/0","providerName":"gnosis","networkURL":"https://rpc.gnosischain.com","gasPriceInGwei":"3","serviceRegistryAddress":"0x9338b5153AE39BB89f50468E608eD9d764B755fD","karmaAddress":"0x4039B809E0C0Ad04F6Fc880193366b251dDf4B40","karmaProxyAddress":"0x4E3e48bA826b15214FDe72a50BFd17aB286B584E","fee":"0","minResponseTimeout":"60","maxResponseTimeout":"300","subscriptionNFTAddress":"0x80A9b55F8604acC26dF2Ac6e07F9dC5B0eAa05Ce","subscriptionTokenId":"0x0ea01d5de3b34e3792db825f2a5f5595c393c68b19fd5efdacd00fcc63a53483","mechMarketplaceAddress":""} \ No newline at end of file diff --git a/scripts/deployment/globals_gnosis_mainnet_deprecated.json b/scripts/deployment/globals_gnosis_mainnet_deprecated.json new file mode 100644 index 0000000..6020fd0 --- /dev/null +++ b/scripts/deployment/globals_gnosis_mainnet_deprecated.json @@ -0,0 +1 @@ +{"contractVerification":true,"useLedger":true,"derivationPath":"m/44'/60'/2'/0/0","providerName":"gnosis","networkURL":"https://rpc.gnosischain.com","gasPriceInGwei":"5","agentType":".","baseURI":"https://gateway.autonolas.tech/ipfs/","agentRegistryName":"AI Agent Registry","agentRegistrySymbol":"AI-AGENT-V1","agentRegistryAddress":"0xE49CB081e8d96920C38aA7AB90cb0294ab4Bc8EA","agentFactoryAddress":"0x6D8CbEbCAD7397c63347D44448147Db05E7d17B0","agentMechAddress":"0x77af31de935740567cf4ff1986d04b2c964a786a","agentId":"9","price":"10000000000000000","agentHash":"0x59ec5386a145869a4c8d14a3df188b32da54f4ae70bf9002df00672dbf777ffc","agentFactorySubscriptionAddress":"0x910Ca843Cad6C050Faf3f84387879b2928D40370","agentMechSubscriptionAddress":"0x327E26bDF1CfEa50BFAe35643B23D5268E41F7F9","agentIdSubscription":"3","minCreditsPerRequest":"1","subscriptionNFTAddress":"0x80A9b55F8604acC26dF2Ac6e07F9dC5B0eAa05Ce","subscriptionTokenId":"0x0ea01d5de3b34e3792db825f2a5f5595c393c68b19fd5efdacd00fcc63a53483","agentHashSubscription":"0x59ec5386a145869a4c8d14a3df188b32da54f4ae70bf9002df00672dbf777ffc","karmaAddress":"0x4039B809E0C0Ad04F6Fc880193366b251dDf4B40","karmaProxyAddress":"0x4E3e48bA826b15214FDe72a50BFd17aB286B584E","stakingFactoryAddress":"0xb0228CA253A88Bc8eb4ca70BCAC8f87b381f4700","minResponseTimeout":"60","maxResponseTimeout":"300","mechMarketplaceAddress":"0x4554fE75c1f5576c1d7F765B2A036c199Adae329"} \ No newline at end of file diff --git a/scripts/deployment/verify_00_agent_mech.js b/scripts/deployment/verify_00_agent_mech.js deleted file mode 100644 index 67d3f51..0000000 --- a/scripts/deployment/verify_00_agent_mech.js +++ /dev/null @@ -1,24 +0,0 @@ -const { ethers } = require("hardhat"); -const fs = require("fs"); -const globalsFile = "globals.json"; -const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); -const parsedData = JSON.parse(dataFromJSON); -const agentType = parsedData.agentType; - -if (agentType === "subscription") { - module.exports = [ - parsedData.agentRegistryAddress, - parsedData.agentIdSubscription, - parsedData.minCreditsPerRequest, - parsedData.subscriptionNFTAddress, - parsedData.subscriptionTokenId, - parsedData.mechMarketplaceAddress - ]; -} else { - module.exports = [ - parsedData.agentRegistryAddress, - parsedData.agentId, - parsedData.price, - parsedData.mechMarketplaceAddress - ]; -} \ No newline at end of file diff --git a/scripts/deployment/verify_01_agent_registry.js b/scripts/deployment/verify_01_agent_registry.js deleted file mode 100644 index 93b70bc..0000000 --- a/scripts/deployment/verify_01_agent_registry.js +++ /dev/null @@ -1,13 +0,0 @@ -const fs = require("fs"); -const globalsFile = "globals.json"; -const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); -const parsedData = JSON.parse(dataFromJSON); -const agentRegistryName = parsedData.agentRegistryName; -const agentRegistrySymbol = parsedData.agentRegistrySymbol; -const baseURI = parsedData.baseURI; - -module.exports = [ - agentRegistryName, - agentRegistrySymbol, - baseURI -]; \ No newline at end of file diff --git a/scripts/deployment/verify_05_karma_proxy.js b/scripts/deployment/verify_02_karma_proxy.js similarity index 100% rename from scripts/deployment/verify_05_karma_proxy.js rename to scripts/deployment/verify_02_karma_proxy.js diff --git a/scripts/deployment/verify_03_mech_marketplace.js b/scripts/deployment/verify_03_mech_marketplace.js new file mode 100644 index 0000000..8e467de --- /dev/null +++ b/scripts/deployment/verify_03_mech_marketplace.js @@ -0,0 +1,11 @@ +const fs = require("fs"); +const globalsFile = "globals.json"; +const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); +const parsedData = JSON.parse(dataFromJSON); +const serviceRegistryAddress = parsedData.serviceRegistryAddress; +const karmaProxyAddress = parsedData.karmaProxyAddress; + +module.exports = [ + serviceRegistryAddress, + karmaProxyAddress +]; \ No newline at end of file diff --git a/scripts/deployment/verify_04_mech_marketplace_proxy.js b/scripts/deployment/verify_04_mech_marketplace_proxy.js new file mode 100644 index 0000000..902c572 --- /dev/null +++ b/scripts/deployment/verify_04_mech_marketplace_proxy.js @@ -0,0 +1,15 @@ +const fs = require("fs"); +const globalsFile = "globals.json"; +const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); +const parsedData = JSON.parse(dataFromJSON); +const mechMarketplaceAddress = parsedData.mechMarketplaceAddress; +const fee = parsedData.fee; +const minResponseTimeout = parsedData.minResponseTimeout; +const maxResponseTimeout = parsedData.maxResponseTimeout; +const iface = new ethers.utils.Interface(["function initialize(uint256,uint256,uint256)"]); +const proxyPayload = iface.encodeFunctionData("initialize", [fee, minResponseTimeout, maxResponseTimeout]); + +module.exports = [ + mechMarketplaceAddress, + proxyPayload +]; \ No newline at end of file diff --git a/scripts/deployment/verify_02_agent_factory.js b/scripts/deployment/verify_05_mech_factory_nvm_subscription.js similarity index 63% rename from scripts/deployment/verify_02_agent_factory.js rename to scripts/deployment/verify_05_mech_factory_nvm_subscription.js index 9b60384..e1f00ef 100644 --- a/scripts/deployment/verify_02_agent_factory.js +++ b/scripts/deployment/verify_05_mech_factory_nvm_subscription.js @@ -2,8 +2,8 @@ const fs = require("fs"); const globalsFile = "globals.json"; const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); const parsedData = JSON.parse(dataFromJSON); -const agentRegistryAddress = parsedData.agentRegistryAddress; +const mechMarketplaceProxyAddress = parsedData.mechMarketplaceProxyAddress; module.exports = [ - agentRegistryAddress, + mechMarketplaceProxyAddress ]; \ No newline at end of file diff --git a/scripts/deployment/verify_06_balance_tracker_nvm_subscription.js b/scripts/deployment/verify_06_balance_tracker_nvm_subscription.js new file mode 100644 index 0000000..14f6b15 --- /dev/null +++ b/scripts/deployment/verify_06_balance_tracker_nvm_subscription.js @@ -0,0 +1,10 @@ +const fs = require("fs"); +const globalsFile = "globals.json"; +const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); +const parsedData = JSON.parse(dataFromJSON); +const mechMarketplaceProxyAddress = parsedData.mechMarketplaceProxyAddress; + +module.exports = [ + mechMarketplaceProxyAddress, + mechMarketplaceProxyAddress +]; \ No newline at end of file diff --git a/scripts/deployment/verify_06_mech_marketplace.js b/scripts/deployment/verify_06_mech_marketplace.js deleted file mode 100644 index 1b343f5..0000000 --- a/scripts/deployment/verify_06_mech_marketplace.js +++ /dev/null @@ -1,15 +0,0 @@ -const fs = require("fs"); -const globalsFile = "globals.json"; -const dataFromJSON = fs.readFileSync(globalsFile, "utf8"); -const parsedData = JSON.parse(dataFromJSON); -const stakingFactoryAddress = parsedData.stakingFactoryAddress; -const karmaProxyAddress = parsedData.karmaProxyAddress; -const minResponseTimeout = parsedData.minResponseTimeout; -const maxResponseTimeout = parsedData.maxResponseTimeout; - -module.exports = [ - stakingFactoryAddress, - karmaProxyAddress, - minResponseTimeout, - maxResponseTimeout -]; \ No newline at end of file