@lidofinance/lido-ethereum-sdk
Version:
<div style="display: flex;" align="center"> <h1 align="center">Lido Ethereum SDK</h1> </div>
308 lines • 20.4 kB
JavaScript
"use strict";
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.LidoSDKWithdrawRequest = void 0;
const index_js_1 = require("../../common/decorators/index.js");
const constants_js_1 = require("../../common/constants.js");
const types_js_1 = require("../../core/types.js");
const bus_module_js_1 = require("../bus-module.js");
const sdk_error_js_1 = require("../../common/utils/sdk-error.js");
const viem_1 = require("viem");
const parse_value_js_1 = require("../../common/utils/parse-value.js");
const withdrawalQueue_js_1 = require("../abi/withdrawalQueue.js");
let LidoSDKWithdrawRequest = (() => {
var _a;
let _classSuper = bus_module_js_1.BusModule;
let _instanceExtraInitializers = [];
let _splitAmountToRequests_decorators;
let _requestWithdrawal_decorators;
let _requestWithdrawalEstimateGas_decorators;
let _requestWithdrawalSimulateTx_decorators;
let _requestWithdrawalPopulateTx_decorators;
let _requestWithdrawalWithPermit_decorators;
let _requestWithdrawalWithPermitEstimateGas_decorators;
let _requestWithdrawalWithPermitSimulateTx_decorators;
let _requestWithdrawalWithPermitPopulateTx_decorators;
let _decodeWithdrawEvents_decorators;
return _a = class LidoSDKWithdrawRequest extends _classSuper {
async splitAmountToRequests({ amount: _amount, token, }) {
const amount = (0, parse_value_js_1.parseValue)(_amount);
const isSteth = token === 'stETH';
const [min, max] = await Promise.all([
isSteth
? this.bus.views.minStethWithdrawalAmount()
: this.bus.views.minWStethWithdrawalAmount(),
isSteth
? this.bus.views.maxStethWithdrawalAmount()
: this.bus.views.maxWStethWithdrawalAmount(),
]);
(0, sdk_error_js_1.invariantArgument)(amount >= min, `Amount is less than minimal withdrawable amount allowed(${(0, viem_1.formatEther)(min)} ${token})`);
const rest = amount % max;
const requestCount = amount / max;
const result = Array.from({ length: Number(requestCount) }).fill(max);
if (rest > 0n) {
(0, sdk_error_js_1.invariantArgument)(rest >= min, `Amount cannot be split, as last request would be less than minimal withdrawable amount allowed(${(0, viem_1.formatEther)(min)} ${token})`);
result.push(rest);
}
return result;
}
async requestWithdrawal(props) {
const account = await this.bus.core.useAccount(props.account);
const { token, receiver = account.address, callback = constants_js_1.NOOP, ...rest } = props;
const requests = props.requests ?? (await this.splitAmountToRequests(props));
const isSteth = token === 'stETH';
const contract = await this.bus.contract.getContractWithdrawalQueue();
const getGasLimit = (options) => isSteth
? contract.estimateGas.requestWithdrawals([requests, receiver], options)
: contract.estimateGas.requestWithdrawalsWstETH([requests, receiver], options);
const sendTransaction = (options) => isSteth
? contract.write.requestWithdrawals([requests, receiver], options)
: contract.write.requestWithdrawalsWstETH([requests, receiver], options);
return this.bus.core.performTransaction({
...rest,
account,
callback,
getGasLimit,
sendTransaction,
decodeResult: (receipt) => this.decodeWithdrawEvents(receipt),
});
}
async requestWithdrawalEstimateGas(props, options) {
const account = await this.bus.core.useAccount(props.account);
const { token, receiver = account.address, amount = 0n, requests: _requests, } = props;
const requests = _requests ?? (await this.splitAmountToRequests({ amount, token }));
const isSteth = token === 'stETH';
const contract = await this.bus.contract.getContractWithdrawalQueue();
const args = [requests, receiver];
const estimatePromise = isSteth
? contract.estimateGas.requestWithdrawals(args, { account, ...options })
: contract.estimateGas.requestWithdrawalsWstETH(args, {
account,
...options,
});
return await estimatePromise;
}
async requestWithdrawalSimulateTx(props) {
const account = await this.bus.core.useAccount(props.account);
const { token, receiver = account.address, amount = 0n, requests: _requests, } = props;
const requests = _requests ?? (await this.splitAmountToRequests({ amount, token }));
const isSteth = token === 'stETH';
const contract = await this.bus.contract.getContractWithdrawalQueue();
const args = [requests, receiver];
const result = await (isSteth
? contract.simulate.requestWithdrawals(args, { account })
: contract.simulate.requestWithdrawalsWstETH(args, {
account,
}));
return result;
}
async requestWithdrawalPopulateTx(props) {
const account = await this.bus.core.useAccount(props.account);
const { token, receiver = account.address, amount = 0n, requests: _requests, } = props;
const requests = _requests ?? (await this.splitAmountToRequests({ amount, token }));
const isSteth = token === 'stETH';
const contract = await this.bus.contract.getContractWithdrawalQueue();
const args = [requests, receiver];
const functionName = isSteth
? 'requestWithdrawals'
: 'requestWithdrawalsWstETH';
return {
from: account.address,
to: contract.address,
data: (0, viem_1.encodeFunctionData)({
abi: contract.abi,
functionName,
args,
}),
};
}
async requestWithdrawalWithPermit(props) {
const account = await this.bus.core.useAccount(props.account);
const { token, receiver = account.address, callback = constants_js_1.NOOP, permit: permitProp, deadline, ...rest } = props;
const requests = props.requests ?? (await this.splitAmountToRequests(props));
const isSteth = token === 'stETH';
const contract = await this.bus.contract.getContractWithdrawalQueue();
let permit;
if (permitProp) {
permit = permitProp;
}
else {
await callback({ stage: types_js_1.TransactionCallbackStage.PERMIT });
const isContract = await this.bus.core.isContract(account.address);
(0, sdk_error_js_1.invariant)(!isContract, 'Cannot sign permit for contract', sdk_error_js_1.ERROR_CODE.NOT_SUPPORTED);
const amount = requests.reduce((sum, request) => sum + request);
const signature = await this.bus.core.signPermit({
account,
spender: contract.address,
amount,
token,
deadline,
});
permit = {
deadline: signature.deadline,
value: signature.value,
r: signature.r,
v: signature.v,
s: signature.s,
};
}
const getGasLimit = (options) => isSteth
? contract.estimateGas.requestWithdrawalsWithPermit([requests, receiver, permit], options)
: contract.estimateGas.requestWithdrawalsWstETHWithPermit([requests, receiver, permit], options);
const sendTransaction = (options) => isSteth
? contract.write.requestWithdrawalsWithPermit([requests, receiver, permit], options)
: contract.write.requestWithdrawalsWstETHWithPermit([requests, receiver, permit], options);
return this.bus.core.performTransaction({
...rest,
account,
callback,
getGasLimit,
sendTransaction,
decodeResult: (receipt) => this.decodeWithdrawEvents(receipt),
});
}
async requestWithdrawalWithPermitEstimateGas(props, options) {
const account = await this.bus.core.useAccount(props.account);
const { token, receiver = account.address, permit, amount = 0n, requests: _requests, } = props;
const requests = _requests ?? (await this.splitAmountToRequests({ amount, token }));
const isSteth = token === 'stETH';
const contract = await this.bus.contract.getContractWithdrawalQueue();
const args = [requests, receiver, permit];
const estimatePromise = isSteth
? contract.estimateGas.requestWithdrawalsWithPermit(args, {
account,
...options,
})
: contract.estimateGas.requestWithdrawalsWstETHWithPermit(args, {
account,
...options,
});
return await estimatePromise;
}
async requestWithdrawalWithPermitSimulateTx(props) {
const account = await this.bus.core.useAccount(props.account);
const { token, receiver = account.address, permit, amount = 0n, requests: _requests, } = props;
const requests = _requests ?? (await this.splitAmountToRequests({ amount, token }));
const isSteth = token === 'stETH';
const contract = await this.bus.contract.getContractWithdrawalQueue();
const args = [requests, receiver, permit];
const result = await (isSteth
? contract.simulate.requestWithdrawalsWithPermit(args, {
account,
})
: contract.simulate.requestWithdrawalsWstETHWithPermit(args, {
account,
}));
return result;
}
async requestWithdrawalWithPermitPopulateTx(props) {
const account = await this.bus.core.useAccount(props.account);
const { token, receiver = account.address, permit, amount = 0n, requests: _requests, } = props;
const requests = _requests ?? (await this.splitAmountToRequests({ amount, token }));
const isSteth = token === 'stETH';
const contract = await this.bus.contract.getContractWithdrawalQueue();
const args = [requests, receiver, permit];
const functionName = isSteth
? 'requestWithdrawalsWithPermit'
: 'requestWithdrawalsWstETHWithPermit';
return {
from: account.address,
to: contract.address,
data: (0, viem_1.encodeFunctionData)({
abi: contract.abi,
functionName,
args,
}),
};
}
async decodeWithdrawEvents(receipt) {
const requests = [];
for (const log of receipt.logs) {
if (log.topics[0] !== _a.WITHDRAW_SIGNATURE)
continue;
const parsedLog = (0, viem_1.decodeEventLog)({
abi: withdrawalQueue_js_1.PartialWithdrawalQueueEventsAbi,
strict: true,
...log,
});
if (parsedLog.eventName === 'WithdrawalRequested') {
requests.push({ ...parsedLog.args });
}
}
return { requests };
}
constructor() {
super(...arguments);
__runInitializers(this, _instanceExtraInitializers);
}
},
(() => {
const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
_splitAmountToRequests_decorators = [(0, index_js_1.Logger)('Views:')];
_requestWithdrawal_decorators = [(0, index_js_1.Logger)('Call:'), (0, index_js_1.ErrorHandler)('Error:')];
_requestWithdrawalEstimateGas_decorators = [(0, index_js_1.Logger)('Views:'), (0, index_js_1.ErrorHandler)()];
_requestWithdrawalSimulateTx_decorators = [(0, index_js_1.Logger)('Views:'), (0, index_js_1.ErrorHandler)()];
_requestWithdrawalPopulateTx_decorators = [(0, index_js_1.Logger)('Views:'), (0, index_js_1.ErrorHandler)()];
_requestWithdrawalWithPermit_decorators = [(0, index_js_1.Logger)('Call:'), (0, index_js_1.ErrorHandler)('Error:')];
_requestWithdrawalWithPermitEstimateGas_decorators = [(0, index_js_1.Logger)('Views:'), (0, index_js_1.ErrorHandler)()];
_requestWithdrawalWithPermitSimulateTx_decorators = [(0, index_js_1.Logger)('Views:'), (0, index_js_1.ErrorHandler)()];
_requestWithdrawalWithPermitPopulateTx_decorators = [(0, index_js_1.Logger)('Views:'), (0, index_js_1.ErrorHandler)()];
_decodeWithdrawEvents_decorators = [(0, index_js_1.Logger)('Utils:')];
__esDecorate(_a, null, _splitAmountToRequests_decorators, { kind: "method", name: "splitAmountToRequests", static: false, private: false, access: { has: obj => "splitAmountToRequests" in obj, get: obj => obj.splitAmountToRequests }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(_a, null, _requestWithdrawal_decorators, { kind: "method", name: "requestWithdrawal", static: false, private: false, access: { has: obj => "requestWithdrawal" in obj, get: obj => obj.requestWithdrawal }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(_a, null, _requestWithdrawalEstimateGas_decorators, { kind: "method", name: "requestWithdrawalEstimateGas", static: false, private: false, access: { has: obj => "requestWithdrawalEstimateGas" in obj, get: obj => obj.requestWithdrawalEstimateGas }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(_a, null, _requestWithdrawalSimulateTx_decorators, { kind: "method", name: "requestWithdrawalSimulateTx", static: false, private: false, access: { has: obj => "requestWithdrawalSimulateTx" in obj, get: obj => obj.requestWithdrawalSimulateTx }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(_a, null, _requestWithdrawalPopulateTx_decorators, { kind: "method", name: "requestWithdrawalPopulateTx", static: false, private: false, access: { has: obj => "requestWithdrawalPopulateTx" in obj, get: obj => obj.requestWithdrawalPopulateTx }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(_a, null, _requestWithdrawalWithPermit_decorators, { kind: "method", name: "requestWithdrawalWithPermit", static: false, private: false, access: { has: obj => "requestWithdrawalWithPermit" in obj, get: obj => obj.requestWithdrawalWithPermit }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(_a, null, _requestWithdrawalWithPermitEstimateGas_decorators, { kind: "method", name: "requestWithdrawalWithPermitEstimateGas", static: false, private: false, access: { has: obj => "requestWithdrawalWithPermitEstimateGas" in obj, get: obj => obj.requestWithdrawalWithPermitEstimateGas }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(_a, null, _requestWithdrawalWithPermitSimulateTx_decorators, { kind: "method", name: "requestWithdrawalWithPermitSimulateTx", static: false, private: false, access: { has: obj => "requestWithdrawalWithPermitSimulateTx" in obj, get: obj => obj.requestWithdrawalWithPermitSimulateTx }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(_a, null, _requestWithdrawalWithPermitPopulateTx_decorators, { kind: "method", name: "requestWithdrawalWithPermitPopulateTx", static: false, private: false, access: { has: obj => "requestWithdrawalWithPermitPopulateTx" in obj, get: obj => obj.requestWithdrawalWithPermitPopulateTx }, metadata: _metadata }, null, _instanceExtraInitializers);
__esDecorate(_a, null, _decodeWithdrawEvents_decorators, { kind: "method", name: "decodeWithdrawEvents", static: false, private: false, access: { has: obj => "decodeWithdrawEvents" in obj, get: obj => obj.decodeWithdrawEvents }, metadata: _metadata }, null, _instanceExtraInitializers);
if (_metadata) Object.defineProperty(_a, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
})(),
Object.defineProperty(_a, "WITHDRAW_SIGNATURE", {
enumerable: true,
configurable: true,
writable: true,
value: (0, viem_1.toEventHash)((0, viem_1.getAbiItem)({
abi: withdrawalQueue_js_1.PartialWithdrawalQueueEventsAbi,
name: 'WithdrawalRequested',
}))
}),
_a;
})();
exports.LidoSDKWithdrawRequest = LidoSDKWithdrawRequest;
//# sourceMappingURL=request.js.map