UNPKG

@deliquifiedlabs/uniswapx-sdk

Version:

SDK for the UniswapX protocol

143 lines 6.26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DutchOrderBuilder = void 0; const tslib_1 = require("tslib"); const ethers_1 = require("ethers"); const tiny_invariant_1 = tslib_1.__importDefault(require("tiny-invariant")); const constants_1 = require("../constants"); const errors_1 = require("../errors"); const order_1 = require("../order"); const OrderBuilder_1 = require("./OrderBuilder"); /** * Helper builder for generating dutch limit orders */ class DutchOrderBuilder extends OrderBuilder_1.OrderBuilder { static fromOrder(order) { // note chainId not used if passing in true reactor address const builder = new DutchOrderBuilder(order.chainId, order.info.reactor) .deadline(order.info.deadline) .decayEndTime(order.info.decayEndTime) .decayStartTime(order.info.decayStartTime) .swapper(order.info.swapper) .nonce(order.info.nonce) .input(order.info.input) .exclusiveFiller(order.info.exclusiveFiller, order.info.exclusivityOverrideBps) .validation({ additionalValidationContract: order.info.additionalValidationContract, additionalValidationData: order.info.additionalValidationData, }); for (const output of order.info.outputs) { builder.output(output); } return builder; } constructor(chainId, reactorAddress, permit2Address) { super(); this.chainId = chainId; this.permit2Address = permit2Address; const mappedReactorAddress = constants_1.REACTOR_ADDRESS_MAPPING[chainId] ? constants_1.REACTOR_ADDRESS_MAPPING[chainId][constants_1.OrderType.Dutch] : undefined; if (reactorAddress) { this.reactor(reactorAddress); } else if (mappedReactorAddress) { this.reactor(mappedReactorAddress); } else { throw new errors_1.MissingConfiguration("reactor", chainId.toString()); } this.info = { outputs: [], exclusiveFiller: ethers_1.ethers.constants.AddressZero, exclusivityOverrideBps: ethers_1.BigNumber.from(0), }; } decayStartTime(decayStartTime) { this.info.decayStartTime = decayStartTime; return this; } decayEndTime(decayEndTime) { if (this.orderInfo.deadline === undefined) { super.deadline(decayEndTime); } this.info.decayEndTime = decayEndTime; return this; } input(input) { this.info.input = input; return this; } output(output) { if (!this.info.outputs) { this.info.outputs = []; } (0, tiny_invariant_1.default)(output.startAmount.gte(output.endAmount), `startAmount must be greater than endAmount: ${output.startAmount.toString()}`); this.info.outputs.push(output); return this; } deadline(deadline) { super.deadline(deadline); if (this.info.decayEndTime === undefined) { this.decayEndTime(deadline); } return this; } swapper(swapper) { super.swapper(swapper); return this; } nonce(nonce) { super.nonce(nonce); return this; } validation(info) { super.validation(info); return this; } // ensures that we only change non fee outputs nonFeeRecipient(newRecipient, feeRecipient) { (0, tiny_invariant_1.default)(newRecipient !== feeRecipient, `newRecipient must be different from feeRecipient: ${newRecipient}`); if (!this.info.outputs) { return this; } this.info.outputs = this.info.outputs.map((output) => { // if fee output then pass through if (feeRecipient && output.recipient.toLowerCase() === feeRecipient.toLowerCase()) { return output; } return Object.assign(Object.assign({}, output), { recipient: newRecipient }); }); return this; } exclusiveFiller(exclusiveFiller, exclusivityOverrideBps) { this.info.exclusiveFiller = exclusiveFiller; this.info.exclusivityOverrideBps = exclusivityOverrideBps; return this; } build() { (0, tiny_invariant_1.default)(this.info.decayStartTime !== undefined, "decayStartTime not set"); (0, tiny_invariant_1.default)(this.info.input !== undefined, "input not set"); (0, tiny_invariant_1.default)(this.info.decayEndTime !== undefined, "decayEndTime not set"); (0, tiny_invariant_1.default)(this.info.exclusiveFiller !== undefined, "exclusiveFiller not set"); (0, tiny_invariant_1.default)(this.info.exclusivityOverrideBps !== undefined, "exclusivityOverrideBps not set"); (0, tiny_invariant_1.default)(this.info.outputs !== undefined && this.info.outputs.length !== 0, "outputs not set"); (0, tiny_invariant_1.default)(this.info.decayEndTime !== undefined || this.getOrderInfo().deadline !== undefined, "Must set either deadline or decayEndTime"); (0, tiny_invariant_1.default)(!this.orderInfo.deadline || this.info.decayStartTime <= this.orderInfo.deadline, `decayStartTime must be before or same as deadline: ${this.info.decayStartTime}`); (0, tiny_invariant_1.default)(!this.orderInfo.deadline || this.info.decayEndTime <= this.orderInfo.deadline, `decayEndTime must be before or same as deadline: ${this.info.decayEndTime}`); return new order_1.DutchOrder(Object.assign(this.getOrderInfo(), { decayStartTime: this.info.decayStartTime, decayEndTime: this.info.decayEndTime, exclusiveFiller: this.info.exclusiveFiller, exclusivityOverrideBps: this.info.exclusivityOverrideBps, input: this.info.input, outputs: this.info.outputs, }), this.chainId, this.permit2Address); } } exports.DutchOrderBuilder = DutchOrderBuilder; //# sourceMappingURL=DutchOrderBuilder.js.map