@maxosllc/smart-order-router
Version:
BlockDAG Smart Order Router
191 lines • 16.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.NATIVE_OVERHEAD = exports.NATIVE_UNWRAP_OVERHEAD = exports.NATIVE_WRAP_OVERHEAD = exports.TOKEN_OVERHEAD = exports.SINGLE_HOP_OVERHEAD = exports.COST_PER_HOP = exports.COST_PER_INIT_TICK = exports.BASE_SWAP_COST = exports.COST_PER_UNINIT_TICK = void 0;
const bignumber_1 = require("@ethersproject/bignumber");
const router_sdk_1 = require("@uniswap/router-sdk");
const chains_1 = require("../../../../src/util/chains");
const providers_1 = require("../../../providers");
// Cost for crossing an uninitialized tick.
exports.COST_PER_UNINIT_TICK = bignumber_1.BigNumber.from(0);
//l2 execution fee on optimism is roughly the same as mainnet
const BASE_SWAP_COST = (id) => {
switch (id) {
case chains_1.ChainId.MAINNET:
case chains_1.ChainId.GOERLI:
case chains_1.ChainId.SEPOLIA:
case chains_1.ChainId.OPTIMISM:
case chains_1.ChainId.OPTIMISM_GOERLI:
case chains_1.ChainId.OPTIMISM_SEPOLIA:
case chains_1.ChainId.BNB:
case chains_1.ChainId.AVALANCHE:
case chains_1.ChainId.BASE:
case chains_1.ChainId.BASE_GOERLI:
case chains_1.ChainId.ZORA:
case chains_1.ChainId.ZORA_SEPOLIA:
case chains_1.ChainId.ROOTSTOCK:
case chains_1.ChainId.BLAST:
case chains_1.ChainId.ZKSYNC:
case chains_1.ChainId.WORLDCHAIN:
case chains_1.ChainId.UNICHAIN_SEPOLIA:
case chains_1.ChainId.UNICHAIN:
case chains_1.ChainId.BASE_SEPOLIA:
case chains_1.ChainId.MONAD_TESTNET: // TODO: double check on monad gas
case chains_1.ChainId.SONEIUM:
return bignumber_1.BigNumber.from(2000);
case chains_1.ChainId.ARBITRUM_ONE:
case chains_1.ChainId.ARBITRUM_GOERLI:
case chains_1.ChainId.ARBITRUM_SEPOLIA:
return bignumber_1.BigNumber.from(5000);
case chains_1.ChainId.POLYGON:
case chains_1.ChainId.POLYGON_MUMBAI:
return bignumber_1.BigNumber.from(2000);
case chains_1.ChainId.CELO:
case chains_1.ChainId.CELO_ALFAJORES:
return bignumber_1.BigNumber.from(2000);
//TODO determine if sufficient
case chains_1.ChainId.GNOSIS:
return bignumber_1.BigNumber.from(2000);
case chains_1.ChainId.MOONBEAM:
return bignumber_1.BigNumber.from(2000);
case chains_1.ChainId.BLOCKDAG_TESTNET:
return bignumber_1.BigNumber.from(2000);
}
};
exports.BASE_SWAP_COST = BASE_SWAP_COST;
const COST_PER_INIT_TICK = (id) => {
switch (id) {
case chains_1.ChainId.MAINNET:
case chains_1.ChainId.GOERLI:
case chains_1.ChainId.SEPOLIA:
case chains_1.ChainId.BNB:
case chains_1.ChainId.AVALANCHE:
return bignumber_1.BigNumber.from(31000);
case chains_1.ChainId.OPTIMISM:
case chains_1.ChainId.OPTIMISM_GOERLI:
case chains_1.ChainId.OPTIMISM_SEPOLIA:
case chains_1.ChainId.BASE:
case chains_1.ChainId.BASE_GOERLI:
case chains_1.ChainId.ZORA:
case chains_1.ChainId.ZORA_SEPOLIA:
case chains_1.ChainId.ROOTSTOCK:
case chains_1.ChainId.BLAST:
case chains_1.ChainId.ZKSYNC:
case chains_1.ChainId.WORLDCHAIN:
case chains_1.ChainId.UNICHAIN_SEPOLIA:
case chains_1.ChainId.UNICHAIN:
case chains_1.ChainId.BASE_SEPOLIA:
case chains_1.ChainId.MONAD_TESTNET: // TODO: double check on monad gas
case chains_1.ChainId.SONEIUM:
return bignumber_1.BigNumber.from(31000);
case chains_1.ChainId.ARBITRUM_ONE:
case chains_1.ChainId.ARBITRUM_GOERLI:
case chains_1.ChainId.ARBITRUM_SEPOLIA:
return bignumber_1.BigNumber.from(31000);
case chains_1.ChainId.POLYGON:
case chains_1.ChainId.POLYGON_MUMBAI:
return bignumber_1.BigNumber.from(31000);
case chains_1.ChainId.CELO:
case chains_1.ChainId.CELO_ALFAJORES:
return bignumber_1.BigNumber.from(31000);
case chains_1.ChainId.GNOSIS:
return bignumber_1.BigNumber.from(31000);
case chains_1.ChainId.MOONBEAM:
return bignumber_1.BigNumber.from(31000);
case chains_1.ChainId.BLOCKDAG_TESTNET:
return bignumber_1.BigNumber.from(31000);
}
};
exports.COST_PER_INIT_TICK = COST_PER_INIT_TICK;
const COST_PER_HOP = (id) => {
switch (id) {
case chains_1.ChainId.MAINNET:
case chains_1.ChainId.GOERLI:
case chains_1.ChainId.SEPOLIA:
case chains_1.ChainId.BNB:
case chains_1.ChainId.OPTIMISM:
case chains_1.ChainId.OPTIMISM_GOERLI:
case chains_1.ChainId.OPTIMISM_SEPOLIA:
case chains_1.ChainId.AVALANCHE:
case chains_1.ChainId.BASE:
case chains_1.ChainId.BASE_GOERLI:
case chains_1.ChainId.ZORA:
case chains_1.ChainId.ZORA_SEPOLIA:
case chains_1.ChainId.ROOTSTOCK:
case chains_1.ChainId.BLAST:
case chains_1.ChainId.ZKSYNC:
case chains_1.ChainId.WORLDCHAIN:
case chains_1.ChainId.UNICHAIN_SEPOLIA:
case chains_1.ChainId.UNICHAIN:
case chains_1.ChainId.BASE_SEPOLIA:
case chains_1.ChainId.MONAD_TESTNET: // TODO: double check on monad gas
case chains_1.ChainId.SONEIUM:
return bignumber_1.BigNumber.from(80000);
case chains_1.ChainId.ARBITRUM_ONE:
case chains_1.ChainId.ARBITRUM_GOERLI:
case chains_1.ChainId.ARBITRUM_SEPOLIA:
return bignumber_1.BigNumber.from(80000);
case chains_1.ChainId.POLYGON:
case chains_1.ChainId.POLYGON_MUMBAI:
return bignumber_1.BigNumber.from(80000);
case chains_1.ChainId.CELO:
case chains_1.ChainId.CELO_ALFAJORES:
return bignumber_1.BigNumber.from(80000);
case chains_1.ChainId.GNOSIS:
return bignumber_1.BigNumber.from(80000);
case chains_1.ChainId.MOONBEAM:
return bignumber_1.BigNumber.from(80000);
case chains_1.ChainId.BLOCKDAG_TESTNET:
return bignumber_1.BigNumber.from(80000);
}
};
exports.COST_PER_HOP = COST_PER_HOP;
const SINGLE_HOP_OVERHEAD = (_id) => {
return bignumber_1.BigNumber.from(15000);
};
exports.SINGLE_HOP_OVERHEAD = SINGLE_HOP_OVERHEAD;
const TOKEN_OVERHEAD = (id, route) => {
const currencies = route.protocol === router_sdk_1.Protocol.V4 ? route.currencyPath : route.tokenPath;
let overhead = bignumber_1.BigNumber.from(0);
if (id == chains_1.ChainId.MAINNET) {
// AAVE's transfer contains expensive governance snapshotting logic. We estimate
// it at around 150k.
if (currencies.some((t) => t.equals(providers_1.AAVE_MAINNET))) {
overhead = overhead.add(150000);
}
// LDO's reaches out to an external token controller which adds a large overhead
// of around 150k.
if (currencies.some((t) => t.equals(providers_1.LIDO_MAINNET))) {
overhead = overhead.add(150000);
}
}
return overhead;
};
exports.TOKEN_OVERHEAD = TOKEN_OVERHEAD;
// TODO: change per chain
const NATIVE_WRAP_OVERHEAD = (id) => {
switch (id) {
default:
return bignumber_1.BigNumber.from(27938);
}
};
exports.NATIVE_WRAP_OVERHEAD = NATIVE_WRAP_OVERHEAD;
const NATIVE_UNWRAP_OVERHEAD = (id) => {
switch (id) {
default:
return bignumber_1.BigNumber.from(36000);
}
};
exports.NATIVE_UNWRAP_OVERHEAD = NATIVE_UNWRAP_OVERHEAD;
const NATIVE_OVERHEAD = (chainId, amount, quote) => {
if (amount.isNative) {
// need to wrap eth in
return (0, exports.NATIVE_WRAP_OVERHEAD)(chainId);
}
if (quote.isNative) {
// need to unwrap eth out
return (0, exports.NATIVE_UNWRAP_OVERHEAD)(chainId);
}
return bignumber_1.BigNumber.from(0);
};
exports.NATIVE_OVERHEAD = NATIVE_OVERHEAD;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FzLWNvc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3JvdXRlcnMvYWxwaGEtcm91dGVyL2dhcy1tb2RlbHMvZ2FzLWNvc3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHdEQUFxRDtBQUVyRCxvREFBK0M7QUFDL0Msd0RBQXNEO0FBRXRELGtEQUFnRTtBQUdoRSwyQ0FBMkM7QUFDOUIsUUFBQSxvQkFBb0IsR0FBRyxxQkFBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUV0RCw2REFBNkQ7QUFDdEQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxFQUFXLEVBQWEsRUFBRTtJQUN2RCxRQUFRLEVBQUUsRUFBRTtRQUNWLEtBQUssZ0JBQU8sQ0FBQyxPQUFPLENBQUM7UUFDckIsS0FBSyxnQkFBTyxDQUFDLE1BQU0sQ0FBQztRQUNwQixLQUFLLGdCQUFPLENBQUMsT0FBTyxDQUFDO1FBQ3JCLEtBQUssZ0JBQU8sQ0FBQyxRQUFRLENBQUM7UUFDdEIsS0FBSyxnQkFBTyxDQUFDLGVBQWUsQ0FBQztRQUM3QixLQUFLLGdCQUFPLENBQUMsZ0JBQWdCLENBQUM7UUFDOUIsS0FBSyxnQkFBTyxDQUFDLEdBQUcsQ0FBQztRQUNqQixLQUFLLGdCQUFPLENBQUMsU0FBUyxDQUFDO1FBQ3ZCLEtBQUssZ0JBQU8sQ0FBQyxJQUFJLENBQUM7UUFDbEIsS0FBSyxnQkFBTyxDQUFDLFdBQVcsQ0FBQztRQUN6QixLQUFLLGdCQUFPLENBQUMsSUFBSSxDQUFDO1FBQ2xCLEtBQUssZ0JBQU8sQ0FBQyxZQUFZLENBQUM7UUFDMUIsS0FBSyxnQkFBTyxDQUFDLFNBQVMsQ0FBQztRQUN2QixLQUFLLGdCQUFPLENBQUMsS0FBSyxDQUFDO1FBQ25CLEtBQUssZ0JBQU8sQ0FBQyxNQUFNLENBQUM7UUFDcEIsS0FBSyxnQkFBTyxDQUFDLFVBQVUsQ0FBQztRQUN4QixLQUFLLGdCQUFPLENBQUMsZ0JBQWdCLENBQUM7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