@crocswap-libs/sdk
Version:
🛠🐊🛠 An SDK for building applications on top of CrocSwap
149 lines • 5.38 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.OrderDirective = void 0;
const ethers_1 = require("ethers");
class OrderDirective {
constructor(openToken) {
this.open = simpleSettle(openToken);
this.hops = [];
}
encodeBytes() {
let schema = encodeWord(LONG_FORM_SCHEMA_TYPE);
let open = encodeSettlement(this.open);
let hops = listEncoding(this.hops, encodeHop);
return ethers_1.ethers.concat([schema, open, hops]);
}
appendHop(nextToken) {
const hop = { settlement: simpleSettle(nextToken),
pools: [],
improve: { isEnabled: false, useBaseSide: false } };
this.hops.push(hop);
return hop;
}
appendPool(poolIdx) {
const pool = {
poolIdx: BigInt(poolIdx),
passive: {
ambient: { isAdd: false, rollType: 0, liquidity: BigInt(0) },
concentrated: []
},
swap: {
isBuy: false,
inBaseQty: false,
rollType: 0,
qty: BigInt(0),
limitPrice: BigInt(0)
},
chain: { rollExit: false, swapDefer: false, offsetSurplus: false }
};
this.hops.at(-1).pools.push(pool);
return pool;
}
appendRangeMint(lowTick, highTick, liq) {
const range = { lowTick: lowTick, highTick: highTick,
isRelTick: false,
isAdd: true,
rollType: 0,
liquidity: liq < 0 ? -liq : liq };
const pool = this.hops.at(-1).pools.at(-1);
pool.passive.concentrated.push(range);
return range;
}
appendAmbientMint(liq) {
const pool = this.hops.at(-1).pools.at(-1);
pool.passive.ambient = {
isAdd: true,
rollType: 0,
liquidity: liq < 0 ? -liq : liq
};
return pool.passive.ambient;
}
appendRangeBurn(lowTick, highTick, liq) {
let range = this.appendRangeMint(lowTick, highTick, liq);
range.isAdd = false;
return range;
}
}
exports.OrderDirective = OrderDirective;
const LONG_FORM_SCHEMA_TYPE = 1;
function simpleSettle(token) {
return { token: token, limitQty: BigInt(2) ** BigInt(125),
dustThresh: BigInt(0), useSurplus: false };
}
function encodeSettlement(dir) {
let token = encodeToken(dir.token);
let limit = encodeSigned(dir.limitQty);
let dust = encodeFull(dir.dustThresh);
let reserveFlag = encodeWord(dir.useSurplus ? 1 : 0);
return ethers_1.ethers.concat([token, limit, dust, reserveFlag]);
}
function encodeHop(hop) {
let pools = listEncoding(hop.pools, encodePool);
let settle = encodeSettlement(hop.settlement);
let improve = encodeImprove(hop.improve);
return ethers_1.ethers.concat([pools, settle, improve]);
}
function encodeImprove(improve) {
let abiCoder = new ethers_1.ethers.AbiCoder();
return abiCoder.encode(["bool", "bool"], [improve.isEnabled, improve.useBaseSide]);
}
function encodeChain(chain) {
let abiCoder = new ethers_1.ethers.AbiCoder();
return abiCoder.encode(["bool", "bool", "bool"], [chain.rollExit, chain.swapDefer, chain.offsetSurplus]);
}
function encodePool(pool) {
let poolIdx = encodeFull(pool.poolIdx);
let passive = encodePassive(pool.passive);
let swap = encodeSwap(pool.swap);
let chain = encodeChain(pool.chain);
return ethers_1.ethers.concat([poolIdx, passive, swap, chain]);
}
function encodeSwap(swap) {
let abiCoder = new ethers_1.ethers.AbiCoder();
return abiCoder.encode(["bool", "bool", "uint8", "uint128", "uint128"], [swap.isBuy, swap.inBaseQty, swap.rollType ? swap.rollType : 0, swap.qty, swap.limitPrice]);
}
function encodePassive(passive) {
let ambAdd = encodeBool(passive.ambient.isAdd);
let rollType = encodeWord(passive.ambient.rollType ? passive.ambient.rollType : 0);
let ambLiq = encodeFull(passive.ambient.liquidity);
let conc = listEncoding(passive.concentrated, encodeConc);
return ethers_1.ethers.concat([ambAdd, rollType, ambLiq, conc]);
}
function encodeConc(conc) {
let openTick = encodeJsSigned(conc.lowTick);
let closeTick = encodeJsSigned(conc.highTick);
let isRelTick = encodeBool(conc.isRelTick);
let isAdd = encodeBool(conc.isAdd);
let rollType = encodeWord(conc.rollType ? conc.rollType : 0);
let liq = encodeFull(conc.liquidity);
return ethers_1.ethers.concat([openTick, closeTick, isRelTick, isAdd, rollType, liq]);
}
function listEncoding(elems, encoderFn) {
let count = encodeWord(elems.length);
let vals = elems.map(encoderFn);
return ethers_1.ethers.concat([count].concat(vals));
}
function encodeToken(tokenAddr) {
return ethers_1.ethers.zeroPadValue(tokenAddr, 32);
}
function encodeFull(val) {
let abiCoder = new ethers_1.ethers.AbiCoder();
return abiCoder.encode(["uint256"], [val]);
}
function encodeSigned(val) {
let abiCoder = new ethers_1.ethers.AbiCoder();
return abiCoder.encode(["int256"], [val]);
}
function encodeJsNum(val) {
return encodeFull(BigInt(val));
}
function encodeJsSigned(val) {
return encodeSigned(BigInt(val));
}
function encodeWord(val) {
return encodeJsNum(val);
}
function encodeBool(flag) {
return encodeWord(flag ? 1 : 0);
}
//# sourceMappingURL=longform.js.map