@lidofinance/lido-ethereum-sdk
Version:
<div style="display: flex;" align="center"> <h1 align="center">Lido Ethereum SDK</h1> </div>
229 lines • 13.2 kB
JavaScript
;
var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
var useValue = arguments.length > 2;
for (var i = 0; i < initializers.length; i++) {
value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
}
return useValue ? value : void 0;
};
var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
var _, done = false;
for (var i = decorators.length - 1; i >= 0; i--) {
var context = {};
for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
for (var p in contextIn.access) context.access[p] = contextIn.access[p];
context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
if (kind === "accessor") {
if (result === void 0) continue;
if (result === null || typeof result !== "object") throw new TypeError("Object expected");
if (_ = accept(result.get)) descriptor.get = _;
if (_ = accept(result.set)) descriptor.set = _;
if (_ = accept(result.init)) initializers.unshift(_);
}
else if (_ = accept(result)) {
if (kind === "field") initializers.unshift(_);
else descriptor[key] = _;
}
}
if (target) Object.defineProperty(target, contextIn.name, descriptor);
done = true;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.LidoSDKVaultFactory = void 0;
const viem_1 = require("viem");
const index_js_1 = require("../common/decorators/index.js");
const constants_js_1 = require("../common/constants.js");
const VaultFactory_js_1 = require("./abi/VaultFactory.js");
const common_js_1 = require("./consts/common.js");
const index_js_2 = require("../common/index.js");
const bus_module_js_1 = require("./bus-module.js");
const vault_contracts_js_1 = require("./vault-contracts.js");
let LidoSDKVaultFactory = (() => {
var _a;
let _classSuper = bus_module_js_1.BusModule;
let _instanceExtraInitializers = [];
let _createVault_decorators;
let _createVaultSimulateTx_decorators;
let _createVaultPopulateTx_decorators;
let _createVaultParseEvents_decorators;
return _a = class LidoSDKVaultFactory extends _classSuper {
_validateNodeOperatorFeeBP(nodeOperatorFeeBP) {
if (nodeOperatorFeeBP < common_js_1.MIN_NODE_OPERATOR_BP ||
nodeOperatorFeeBP > common_js_1.MAX_NODE_OPERATOR_BP) {
throw this.bus.core.error({
code: index_js_2.ERROR_CODE.INVALID_ARGUMENT,
message: 'Invalid node operator fee rate.',
});
}
}
async _validateConfirmExpiry(confirmExpiry) {
const MIN_CONFIRM_EXPIRY = await this.bus.constants.MIN_CONFIRM_EXPIRY();
const MAX_CONFIRM_EXPIRY = await this.bus.constants.MAX_CONFIRM_EXPIRY();
if (confirmExpiry < MIN_CONFIRM_EXPIRY ||
confirmExpiry > MAX_CONFIRM_EXPIRY) {
throw this.bus.core.error({
code: index_js_2.ERROR_CODE.INVALID_ARGUMENT,
message: 'Invalid confirm expiry.',
});
}
}
async _validateRoles(roles) {
const ROLES = await this.bus.constants.ROLES();
for (const role of roles) {
if (!Object.values(ROLES).includes(role.role)) {
throw this.bus.core.error({
code: index_js_2.ERROR_CODE.INVALID_ARGUMENT,
message: `Invalid role "${role.role}" found.`,
});
}
}
}
async _validateCreateVaultProps(props) {
await this._validateRoles(props.roleAssignments);
this._validateNodeOperatorFeeBP(props.nodeOperatorFeeBP);
await this._validateConfirmExpiry(props.confirmExpirySeconds);
}
async createVault(props) {
await this._validateCreateVaultProps(props);
this.bus.core.useWalletClient();
const { callback, account, txArgs, ...rest } = await this.parseProps(props);
const contract = await this.bus.contracts.getContractVaultFactory();
if (props.withoutConnectingToVaultHub) {
return this.bus.core.performTransaction({
...rest,
callback,
account,
getGasLimit: async (options) => contract.estimateGas.createVaultWithDashboardWithoutConnectingToVaultHub(txArgs, { ...options }),
sendTransaction: (options) => contract.write.createVaultWithDashboardWithoutConnectingToVaultHub(txArgs, { ...options }),
decodeResult: async (receipt) => this.createVaultParseEvents(receipt),
});
}
const CONNECT_DEPOSIT = await this.bus.constants.CONNECT_DEPOSIT();
return this.bus.core.performTransaction({
...rest,
callback,
account,
getGasLimit: async (options) => contract.estimateGas.createVaultWithDashboard(txArgs, {
...options,
value: CONNECT_DEPOSIT,
}),
sendTransaction: (options) => contract.write.createVaultWithDashboard(txArgs, {
...options,
value: CONNECT_DEPOSIT,
}),
decodeResult: async (receipt) => this.createVaultParseEvents(receipt),
});
}
async createVaultSimulateTx(props) {
await this._validateCreateVaultProps(props);
const { account, txArgs } = await this.parseProps(props);
const contract = await this.bus.contracts.getContractVaultFactory();
if (props.withoutConnectingToVaultHub) {
const { request } = await contract.simulate.createVaultWithDashboard(txArgs, {
account,
value: await this.bus.constants.CONNECT_DEPOSIT(),
});
return request;
}
const { request } = await contract.simulate.createVaultWithDashboardWithoutConnectingToVaultHub(txArgs, {
account,
});
return request;
}
async createVaultPopulateTx(props) {
await this._validateCreateVaultProps(props);
const { account, txArgs } = await this.parseProps(props);
const contract = await this.bus.contracts.getContractVaultFactory();
if (props.withoutConnectingToVaultHub) {
return {
from: account.address,
to: contract.address,
data: (0, viem_1.encodeFunctionData)({
abi: contract.abi,
functionName: 'createVaultWithDashboardWithoutConnectingToVaultHub',
args: txArgs,
}),
};
}
return {
from: account.address,
to: contract.address,
value: this.bus.constants.CONNECT_DEPOSIT(),
data: (0, viem_1.encodeFunctionData)({
abi: contract.abi,
functionName: 'createVaultWithDashboard',
args: txArgs,
}),
};
}
async createVaultParseEvents(receipt) {
let vault;
let dashboard;
for (const log of receipt.logs) {
if (log.topics[0] === vault_contracts_js_1.LidoSDKVaultContracts.VAULT_CREATED_SIGNATURE) {
const parsedLog = (0, viem_1.decodeEventLog)({
abi: VaultFactory_js_1.VaultCreatedEventAbi,
strict: true,
...log,
});
if ((0, viem_1.isAddress)(parsedLog.args.vault)) {
vault = parsedLog.args.vault;
}
}
else if (log.topics[0] === vault_contracts_js_1.LidoSDKVaultContracts.DASHBOARD_CREATED_SIGNATURE) {
const parsedLog = (0, viem_1.decodeEventLog)({
abi: VaultFactory_js_1.DashboardCreatedEventAbi,
strict: true,
...log,
});
if ((0, viem_1.isAddress)(parsedLog.args.dashboard)) {
dashboard = parsedLog.args.dashboard;
}
}
}
(0, index_js_2.invariant)(dashboard, 'could not find DashboardCreated event in transaction', index_js_2.ERROR_CODE.TRANSACTION_ERROR);
(0, index_js_2.invariant)(vault, 'could not find VaultCreated event in transaction', index_js_2.ERROR_CODE.TRANSACTION_ERROR);
return this.bus.vaultFromAddress(vault, dashboard);
}
async parseProps(props) {
const { defaultAdmin, nodeOperator, nodeOperatorManager, nodeOperatorFeeBP, confirmExpirySeconds, roleAssignments, } = props;
return {
...props,
txArgs: [
defaultAdmin,
nodeOperator,
nodeOperatorManager,
nodeOperatorFeeBP,
confirmExpirySeconds,
roleAssignments,
],
account: await this.bus.core.useAccount(props.account),
callback: props.callback ?? constants_js_1.NOOP,
};
}
constructor() {
super(...arguments);
__runInitializers(this, _instanceExtraInitializers);
}
},
(() => {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
_createVault_decorators = [(0, index_js_1.Logger)('Call:'), (0, index_js_1.ErrorHandler)()];
_createVaultSimulateTx_decorators = [(0, index_js_1.Logger)('Call:'), (0, index_js_1.ErrorHandler)()];
_createVaultPopulateTx_decorators = [(0, index_js_1.Logger)('Call:'), (0, index_js_1.ErrorHandler)()];
_createVaultParseEvents_decorators = [(0, index_js_1.Logger)('Utils:')];
__esDecorate(_a, null, _createVault_decorators, { kind: "method", name: "createVault", static: false, private: false, access: { has: obj => "createVault" in obj, get: obj => obj.createVault }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(_a, null, _createVaultSimulateTx_decorators, { kind: "method", name: "createVaultSimulateTx", static: false, private: false, access: { has: obj => "createVaultSimulateTx" in obj, get: obj => obj.createVaultSimulateTx }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(_a, null, _createVaultPopulateTx_decorators, { kind: "method", name: "createVaultPopulateTx", static: false, private: false, access: { has: obj => "createVaultPopulateTx" in obj, get: obj => obj.createVaultPopulateTx }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(_a, null, _createVaultParseEvents_decorators, { kind: "method", name: "createVaultParseEvents", static: false, private: false, access: { has: obj => "createVaultParseEvents" in obj, get: obj => obj.createVaultParseEvents }, metadata: _metadata }, null, _instanceExtraInitializers);
if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
})(),
_a;
})();
exports.LidoSDKVaultFactory = LidoSDKVaultFactory;
//# sourceMappingURL=vault-factory.js.map