115 lines
2.7 KiB
JavaScript
115 lines
2.7 KiB
JavaScript
|
|
import {uint32max, uint64max} from "@/misc.js";
|
|
import {ethers} from "ethers";
|
|
|
|
export const NO_CHAIN = uint64max;
|
|
export const NO_OCO = uint64max;
|
|
|
|
// struct SwapOrder {
|
|
// address tokenIn;
|
|
// address tokenOut;
|
|
// Route route;
|
|
// uint256 amount;
|
|
// bool amountIsInput;
|
|
// bool outputDirectlyToOwner;
|
|
// uint64 chainOrder; // use NO_CHAIN for no chaining. chainOrder index must be < than this order's index for safety (written first) and chainOrder state must be Template
|
|
// Tranche[] tranches;
|
|
// }
|
|
// struct Route {
|
|
// Exchange exchange;
|
|
// uint24 fee;
|
|
// }
|
|
export function newOrder(tokenIn, tokenOut, exchange, fee, amount, amountIsInput, tranches,
|
|
outputToOwner=false, chainOrder=NO_CHAIN) {
|
|
if(!tranches)
|
|
tranches = [newTranche(1,[])] // todo this is just a swap: issue warning?
|
|
return [
|
|
tokenIn, tokenOut, [exchange,fee], amount, amountIsInput, outputToOwner, chainOrder, tranches
|
|
]
|
|
}
|
|
|
|
// struct Tranche {
|
|
// uint64 fraction;
|
|
// Constraint[] constraints;
|
|
// }
|
|
export function newTranche(amountRatio, constraints) {
|
|
return [
|
|
BigInt(Math.min(65535, Math.ceil(amountRatio * 65535))), // we use ceil to make sure the sum of tranche fractions doesn't round below 1
|
|
constraints
|
|
]
|
|
}
|
|
|
|
// enum Exchange {
|
|
// UniswapV2,
|
|
// UniswapV3
|
|
// }
|
|
export const Exchange = {
|
|
UniswapV2: 0,
|
|
UniswapV3: 1,
|
|
}
|
|
|
|
// enum ConstraintMode {
|
|
// Time, // 0
|
|
// Limit, // 1
|
|
// Trailing, // 2
|
|
// Barrier, // 3
|
|
// Line // 4
|
|
// }
|
|
export const ConstraintMode = {
|
|
Time: 0,
|
|
Limit: 1,
|
|
Trailing: 2,
|
|
Barrier: 3,
|
|
Line: 4,
|
|
}
|
|
|
|
// struct Constraint {
|
|
// ConstraintMode mode;
|
|
// bytes constraint; // abi-encoded constraint struct
|
|
// }
|
|
|
|
function encodeConstraint( constraintMode, types, values ) {
|
|
return [constraintMode, ethers.AbiCoder.defaultAbiCoder().encode(types,values)]
|
|
}
|
|
|
|
|
|
export const TimeMode = {
|
|
Timestamp:0,
|
|
SinceOrderStart:1,
|
|
}
|
|
|
|
export const DISTANT_PAST = 0
|
|
export const DISTANT_FUTURE = uint32max
|
|
|
|
// struct Time {
|
|
// TimeMode mode;
|
|
// uint32 time;
|
|
// }
|
|
// struct TimeConstraint {
|
|
// Time earliest;
|
|
// Time latest;
|
|
// }
|
|
export function newTimeConstraint(startMode, start, endMode, end) {
|
|
// absolute time
|
|
return encodeConstraint(
|
|
ConstraintMode.Time,
|
|
['uint8', 'uint32', 'uint8', 'uint32'],
|
|
[startMode, start, endMode, end]
|
|
)
|
|
}
|
|
|
|
// struct PriceConstraint {
|
|
// bool isAbove;
|
|
// bool isRatio;
|
|
// uint160 valueSqrtX96;
|
|
// }
|
|
|
|
// struct LineConstraint {
|
|
// bool isAbove;
|
|
// bool isRatio;
|
|
// uint32 time;
|
|
// uint160 valueSqrtX96;
|
|
// int160 slopeSqrtX96; // price change per second
|
|
// }
|
|
|