Описание изменений
This commit is contained in:
@@ -3,36 +3,99 @@ const fs = require('fs');
|
||||
const path = require('path');
|
||||
const logger = require('./logger');
|
||||
|
||||
// Инициализация провайдера
|
||||
const provider = new ethers.JsonRpcProvider(process.env.RPC_URL);
|
||||
|
||||
// Путь к директории с ABI контрактов
|
||||
const contractsDir = path.join(__dirname, '../artifacts/contracts/AccessToken.sol');
|
||||
|
||||
// Получение ABI контракта
|
||||
const accessTokenJSON = require('../artifacts/contracts/AccessToken.sol/AccessToken.json');
|
||||
const accessTokenABI = accessTokenJSON.abi;
|
||||
|
||||
// Проверка, что ABI является массивом
|
||||
if (!Array.isArray(accessTokenABI)) {
|
||||
console.error('ABI is not an array:', accessTokenABI);
|
||||
// Если ABI не является массивом, создайте массив вручную
|
||||
const manualABI = [
|
||||
"function mintAccessToken(address to, uint8 role) public",
|
||||
"function checkRole(address user) public view returns (uint8)",
|
||||
"function revokeToken(uint256 tokenId) public",
|
||||
// Добавьте другие функции, которые вам нужны
|
||||
];
|
||||
|
||||
// Создание экземпляра контракта с ручным ABI
|
||||
const contractAddress = process.env.ACCESS_TOKEN_ADDRESS;
|
||||
const accessTokenContract = new ethers.Contract(contractAddress, manualABI, provider);
|
||||
|
||||
module.exports = {
|
||||
accessTokenContract,
|
||||
getContract,
|
||||
provider
|
||||
};
|
||||
} else {
|
||||
// Если ABI является массивом, используйте его
|
||||
const contractAddress = process.env.ACCESS_TOKEN_ADDRESS;
|
||||
const accessTokenContract = new ethers.Contract(contractAddress, accessTokenABI, provider);
|
||||
|
||||
module.exports = {
|
||||
accessTokenContract,
|
||||
getContract,
|
||||
provider
|
||||
};
|
||||
}
|
||||
|
||||
// Кэш для хранения экземпляров контрактов
|
||||
const contractsCache = {};
|
||||
|
||||
/**
|
||||
* Получает экземпляр контракта по его имени
|
||||
* @param {string} contractName - Имя контракта (например, 'AccessToken')
|
||||
* @param {string} contractName - Имя контракта
|
||||
* @returns {Promise<ethers.Contract>} - Экземпляр контракта
|
||||
*/
|
||||
async function getContract(contractName) {
|
||||
try {
|
||||
// Путь к артефакту контракта
|
||||
const artifactPath = path.join(__dirname, '..', 'artifacts', 'contracts', `${contractName}.sol`, `${contractName}.json`);
|
||||
console.log(`Getting contract: ${contractName}`);
|
||||
|
||||
// Проверка существования файла
|
||||
if (!fs.existsSync(artifactPath)) {
|
||||
throw new Error(`Артефакт контракта ${contractName} не найден по пути ${artifactPath}`);
|
||||
// Проверяем, есть ли контракт в кэше
|
||||
if (contractsCache[contractName]) {
|
||||
console.log(`Using cached contract: ${contractName}`);
|
||||
return contractsCache[contractName];
|
||||
}
|
||||
|
||||
// Загрузка ABI из артефакта
|
||||
const contractArtifact = require(artifactPath);
|
||||
const contractABI = contractArtifact.abi;
|
||||
// Получаем адрес контракта из переменных окружения
|
||||
const contractAddress = process.env.ACCESS_TOKEN_ADDRESS; // или ACCESS_TOKEN_CONTRACT_ADDRESS
|
||||
|
||||
// Получение адреса контракта из переменных окружения
|
||||
const contractAddress = process.env[`${contractName.toUpperCase()}_ADDRESS`];
|
||||
if (!contractAddress) {
|
||||
throw new Error(`Адрес контракта ${contractName} не найден в переменных окружения`);
|
||||
throw new Error(`Contract address for ${contractName} not found in environment variables`);
|
||||
}
|
||||
|
||||
// Подключение к провайдеру
|
||||
const provider = new ethers.JsonRpcProvider(process.env.ETHEREUM_NETWORK_URL);
|
||||
// Путь к файлу с ABI контракта
|
||||
const abiPath = path.join(contractsDir, `${contractName}.json`);
|
||||
|
||||
// Создание экземпляра контракта
|
||||
const contract = new ethers.Contract(contractAddress, contractABI, provider);
|
||||
// Проверяем, существует ли файл с ABI
|
||||
if (!fs.existsSync(abiPath)) {
|
||||
throw new Error(`ABI file for ${contractName} not found at ${abiPath}`);
|
||||
}
|
||||
|
||||
// Читаем ABI из файла
|
||||
const abiJson = fs.readFileSync(abiPath, 'utf8');
|
||||
const contractJSON = JSON.parse(abiJson);
|
||||
const abi = contractJSON.abi; // Получаем ABI из свойства abi
|
||||
|
||||
console.log(`ABI for ${contractName}:`, abi);
|
||||
|
||||
// Проверяем, что ABI является массивом
|
||||
if (!Array.isArray(abi)) {
|
||||
console.error(`ABI for ${contractName} is not an array:`, abi);
|
||||
throw new Error(`ABI for ${contractName} is not an array`);
|
||||
}
|
||||
|
||||
// Создаем экземпляр контракта
|
||||
const contract = new ethers.Contract(contractAddress, abi, provider);
|
||||
|
||||
// Сохраняем контракт в кэше
|
||||
contractsCache[contractName] = contract;
|
||||
|
||||
return contract;
|
||||
} catch (error) {
|
||||
@@ -40,7 +103,3 @@ async function getContract(contractName) {
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getContract
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user