@solarity/hardhat-migrate
Version:
The simplest way to deploy smart contracts
176 lines • 7.35 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.TransactionProcessor = exports.BaseTransactionProcessor = void 0;
exports.createTransactionProcessor = createTransactionProcessor;
const ethers_1 = require("ethers");
const contract_names_1 = require("hardhat/utils/contract-names");
const MigrateStorage_1 = require("./MigrateStorage");
const Reporter_1 = require("../reporters/Reporter");
const errors_1 = require("../../errors");
const utils_1 = require("../../utils");
const type_checks_1 = require("../../types/type-checks");
let BaseTransactionProcessor = class BaseTransactionProcessor {
_config;
constructor(_config) {
this._config = _config;
}
saveDeploymentTransaction(args, contractName, contractAddress, metadata) {
const dataToSave = {
contractKeyData: {
name: contractName,
data: args.data,
from: args.from,
chainId: args.chainId,
value: args.value,
},
contractAddress,
metadata,
};
const keyByArgs = (0, utils_1.createKeyDeploymentFieldsHash)(dataToSave.contractKeyData);
this._saveContract(keyByArgs, dataToSave);
this._saveContractByName(contractName, dataToSave);
}
/**
* @param tx - Transaction to save. Acts as a key and value at the same time.
* @param receipt
* @param metadata
*/
saveTransaction(tx, receipt, metadata) {
return this._saveTransaction({
data: tx.data,
from: tx.from,
chainId: tx.chainId,
to: tx.to,
value: tx.value,
name: tx.name,
}, receipt, metadata);
}
saveContractAddress(contractName, contractAddress, metadata) {
const dataToSave = {
contractAddress,
metadata,
};
this._saveContractByName(contractName, dataToSave);
}
async tryRestoreContractAddressByKeyFields(key) {
const restoredData = this._tryGetDataFromStorage((0, utils_1.createKeyDeploymentFieldsHash)({
name: key.contractName,
data: key.data,
from: key.from,
chainId: key.chainId,
value: key.value,
}));
if (!(0, ethers_1.isAddress)(restoredData.contractAddress) || !(await (0, utils_1.isDeployedContractAddress)(restoredData.contractAddress))) {
throw new errors_1.MigrateError(`Contract address is not valid`);
}
return restoredData.contractAddress;
}
async tryRestoreContractAddressByName(contractName) {
const restoredData = this._tryGetDataFromStorage(contractName);
if (!(0, ethers_1.isAddress)(restoredData.contractAddress) || !(await (0, utils_1.isDeployedContractAddress)(restoredData.contractAddress))) {
throw new errors_1.MigrateError(`Contract address is not valid`);
}
return restoredData.contractAddress;
}
tryRestoreSavedTransaction(key) {
return this._tryGetDataFromStorage((0, utils_1.createKeyTxFieldsHash)({
data: key.data,
from: key.from,
chainId: key.chainId,
to: key.to,
value: key.value,
name: key.name,
}));
}
tryRestoreSavedDeployedTxByContractName(contractName) {
return this._tryGetDataFromStorage(contractName);
}
_saveTransaction(args, transaction, metadata) {
const dataToSave = {
txKeyData: args,
receipt: transaction,
metadata,
};
const dataKey = (0, utils_1.createKeyTxFieldsHash)({
data: args.data,
from: args.from,
chainId: args.chainId,
to: args.to,
value: args.value,
name: args.name,
});
if (MigrateStorage_1.TransactionStorage.has(dataKey) && !this._config.execution.continue) {
this._processCollision(dataKey, dataToSave);
}
MigrateStorage_1.TransactionStorage.set(dataKey, dataToSave, true);
return dataToSave;
}
_saveContract(keyByArgs, dataToSave) {
if (MigrateStorage_1.TransactionStorage.has(keyByArgs) && !this._config.execution.continue) {
this._processCollision(keyByArgs, dataToSave);
}
MigrateStorage_1.TransactionStorage.set(keyByArgs, dataToSave, true);
}
_saveContractByName(contractName, dataToSave) {
if (MigrateStorage_1.TransactionStorage.has(contractName) && !this._config.execution.continue) {
this._processCollision(contractName, dataToSave);
}
MigrateStorage_1.TransactionStorage.set(contractName, dataToSave, true);
}
_processCollision(dataKey, dataToSave) {
if (this._config.execution.continue) {
return;
}
const oldData = MigrateStorage_1.TransactionStorage.get(dataKey);
if (oldData.contractAddress && (0, contract_names_1.isFullyQualifiedName)(dataKey)) {
Reporter_1.Reporter.notifyContractCollisionByName(oldData, dataToSave);
return;
}
if (oldData.contractAddress) {
Reporter_1.Reporter.notifyContractCollisionByKeyFields(oldData, dataToSave);
return;
}
if (oldData.receipt) {
Reporter_1.Reporter.notifyTransactionCollision(oldData, dataToSave);
return;
}
Reporter_1.Reporter.notifyUnknownCollision(oldData.metadata, dataToSave);
}
_tryGetDataFromStorage(key) {
const value = MigrateStorage_1.TransactionStorage.get(key);
if (!value) {
throw new errors_1.MigrateError(`Requested data not found in storage`);
}
return value;
}
};
exports.BaseTransactionProcessor = BaseTransactionProcessor;
__decorate([
type_checks_1.validateKeyDeploymentFields
], BaseTransactionProcessor.prototype, "saveDeploymentTransaction", null);
__decorate([
type_checks_1.validateKeyTxFields
], BaseTransactionProcessor.prototype, "saveTransaction", null);
__decorate([
type_checks_1.validateKeyDeploymentFields
], BaseTransactionProcessor.prototype, "tryRestoreContractAddressByKeyFields", null);
__decorate([
type_checks_1.validateKeyTxFields
], BaseTransactionProcessor.prototype, "tryRestoreSavedTransaction", null);
exports.BaseTransactionProcessor = BaseTransactionProcessor = __decorate([
utils_1.catchError
], BaseTransactionProcessor);
exports.TransactionProcessor = null;
function createTransactionProcessor(config) {
if (exports.TransactionProcessor) {
return;
}
exports.TransactionProcessor = new BaseTransactionProcessor(config);
}
//# sourceMappingURL=TransactionProcessor.js.map