dop-stick
Version:
Source control tooling for versionable-upgradeable smart contracts
98 lines • 3.08 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.ContractInterface = void 0;
const ethers_1 = require("ethers");
const logger_1 = require("../../logsAndMetrics/core/logger");
class ContractInterface {
constructor(address, abi, signerOrProvider, metadata) {
this.contract = new ethers_1.ethers.Contract(address, abi, signerOrProvider);
this.metadata = metadata;
}
/**
* Get the underlying ethers contract
*/
getContract() {
return this.contract;
}
/**
* Get function metadata by name or selector
*/
getFunctionMetadata(nameOrSelector) {
return this.metadata.functions.find(f => f.name === nameOrSelector || f.selector === nameOrSelector);
}
/**
* Get all function metadata
*/
getFunctions() {
return this.metadata.functions;
}
/**
* Get event metadata by name or signature
*/
getEventMetadata(nameOrSignature) {
return this.metadata.events.find(e => e.name === nameOrSignature || e.signature === nameOrSignature);
}
/**
* Get all event metadata
*/
getEvents() {
return this.metadata.events;
}
/**
* Call a contract function
*/
async call(functionNameOrSelector, args = [], overrides = {}) {
try {
const func = this.getFunctionMetadata(functionNameOrSelector);
if (!func) {
throw new Error(`Function ${functionNameOrSelector} not found`);
}
return await this.contract[func.name](...args, overrides);
}
catch (error) {
logger_1.Logger.error(`Failed to call function ${functionNameOrSelector}:`, error);
throw error;
}
}
/**
* Listen to contract events
*/
on(eventNameOrSignature, listener) {
try {
const event = this.getEventMetadata(eventNameOrSignature);
if (!event) {
throw new Error(`Event ${eventNameOrSignature} not found`);
}
this.contract.on(event.name, listener);
}
catch (error) {
logger_1.Logger.error(`Failed to register event listener for ${eventNameOrSignature}:`, error);
throw error;
}
}
/**
* Remove event listener
*/
off(eventNameOrSignature, listener) {
try {
const event = this.getEventMetadata(eventNameOrSignature);
if (!event) {
throw new Error(`Event ${eventNameOrSignature} not found`);
}
this.contract.off(event.name, listener);
}
catch (error) {
logger_1.Logger.error(`Failed to remove event listener for ${eventNameOrSignature}:`, error);
throw error;
}
}
/**
* Connect contract to a new signer
*/
connect(signerOrProvider) {
this.contract = this.contract.connect(signerOrProvider);
return this;
}
}
exports.ContractInterface = ContractInterface;
//# sourceMappingURL=interface.js.map