@orbs-network/twap 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +174 -0
- package/dist/artifacts/contracts/TWAP.sol/TWAP.json +849 -0
- package/dist/artifacts/contracts/periphery/Lens.sol/Lens.json +488 -0
- package/dist/src/configs.d.ts +20 -0
- package/dist/src/configs.js +64 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.js +19 -0
- package/dist/src/lib.d.ts +130 -0
- package/dist/src/lib.js +194 -0
- package/dist/src/paraswap.d.ts +33 -0
- package/dist/src/paraswap.js +73 -0
- package/dist/typechain-hardhat/contracts/IExchange.d.ts +23 -0
- package/dist/typechain-hardhat/contracts/IExchange.js +5 -0
- package/dist/typechain-hardhat/contracts/TWAP.d.ts +204 -0
- package/dist/typechain-hardhat/contracts/TWAP.js +5 -0
- package/dist/typechain-hardhat/contracts/exchange/IParaswap.d.ts +20 -0
- package/dist/typechain-hardhat/contracts/exchange/IParaswap.js +5 -0
- package/dist/typechain-hardhat/contracts/exchange/IUniswapV2.d.ts +24 -0
- package/dist/typechain-hardhat/contracts/exchange/IUniswapV2.js +5 -0
- package/dist/typechain-hardhat/contracts/exchange/ParaswapExchange.d.ts +24 -0
- package/dist/typechain-hardhat/contracts/exchange/ParaswapExchange.js +5 -0
- package/dist/typechain-hardhat/contracts/exchange/UniswapV2Exchange.d.ts +24 -0
- package/dist/typechain-hardhat/contracts/exchange/UniswapV2Exchange.js +5 -0
- package/dist/typechain-hardhat/contracts/exchange/index.d.ts +4 -0
- package/dist/typechain-hardhat/contracts/exchange/index.js +2 -0
- package/dist/typechain-hardhat/contracts/index.d.ts +8 -0
- package/dist/typechain-hardhat/contracts/index.js +2 -0
- package/dist/typechain-hardhat/contracts/periphery/IWETH.d.ts +22 -0
- package/dist/typechain-hardhat/contracts/periphery/IWETH.js +5 -0
- package/dist/typechain-hardhat/contracts/periphery/Lens.d.ts +104 -0
- package/dist/typechain-hardhat/contracts/periphery/Lens.js +5 -0
- package/dist/typechain-hardhat/contracts/periphery/Taker.d.ts +39 -0
- package/dist/typechain-hardhat/contracts/periphery/Taker.js +5 -0
- package/dist/typechain-hardhat/contracts/periphery/index.d.ts +3 -0
- package/dist/typechain-hardhat/contracts/periphery/index.js +2 -0
- package/dist/typechain-hardhat/contracts/test/MockDeflationaryToken.d.ts +56 -0
- package/dist/typechain-hardhat/contracts/test/MockDeflationaryToken.js +5 -0
- package/dist/typechain-hardhat/contracts/test/MockExchange.d.ts +25 -0
- package/dist/typechain-hardhat/contracts/test/MockExchange.js +5 -0
- package/dist/typechain-hardhat/contracts/test/index.d.ts +2 -0
- package/dist/typechain-hardhat/contracts/test/index.js +2 -0
- package/dist/typechain-hardhat/types.d.ts +55 -0
- package/dist/typechain-hardhat/types.js +5 -0
- package/package.json +33 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { Config, TokenData } from "./configs";
|
|
2
|
+
import BN from "bignumber.js";
|
|
3
|
+
import type { TWAP } from "../typechain-hardhat/contracts";
|
|
4
|
+
import type { Lens } from "../typechain-hardhat/contracts/periphery";
|
|
5
|
+
export declare class TWAPLib {
|
|
6
|
+
config: Config;
|
|
7
|
+
provider: any;
|
|
8
|
+
maker: string;
|
|
9
|
+
twap: TWAP;
|
|
10
|
+
lens: Lens;
|
|
11
|
+
constructor(config: Config, provider: any, maker: string);
|
|
12
|
+
dstAmount: (srcAmount: BN.Value, srcUsd: BN.Value, dstUsd: BN.Value) => BN;
|
|
13
|
+
isNativeToken: (token: TokenData) => boolean;
|
|
14
|
+
isValidNetwork: (chainId: number) => boolean;
|
|
15
|
+
maxPossibleChunks: (srcToken: TokenData, srcAmount: BN.Value, srcUsd: BN.Value) => number;
|
|
16
|
+
srcChunkAmount: (srcAmount: BN.Value, totalChunks: BN.Value) => BN;
|
|
17
|
+
totalChunks: (srcAmount: BN.Value, srcChunkAmount: BN.Value) => BN;
|
|
18
|
+
fillDelayMillis: (totalChunks: BN.Value, maxDurationMillis: BN.Value) => BN;
|
|
19
|
+
dstMinAmountOut: (srcToken: TokenData, dstToken: TokenData, srcChunkAmount: BN.Value, limitDstPriceFor1Src: BN.Value, isMarketOrder: boolean) => BN;
|
|
20
|
+
isMarketOrder: (order: Order) => boolean;
|
|
21
|
+
orderProgress: (order: Order) => BN;
|
|
22
|
+
status: (order: Order) => Status;
|
|
23
|
+
makerBalance(token: TokenData): Promise<BN>;
|
|
24
|
+
wrapNativeToken(amount: BN.Value): Promise<any>;
|
|
25
|
+
waitForConfirmation<T>(fn: () => Promise<T>): Promise<T>;
|
|
26
|
+
hasAllowance(srcToken: TokenData, amount: BN.Value): Promise<boolean>;
|
|
27
|
+
approve(srcToken: TokenData, amount: BN.Value): Promise<void>;
|
|
28
|
+
validateOrderInputs(srcToken: TokenData, dstToken: TokenData, srcAmount: BN.Value, srcChunkAmount: BN.Value, dstMinChunkAmountOut: BN.Value, deadline: BN.Value, fillDelaySeconds: BN.Value, srcUsd: BN.Value): OrderInputValidation;
|
|
29
|
+
submitOrder(srcToken: TokenData, dstToken: TokenData, srcAmount: BN.Value, srcChunkAmount: BN.Value, dstMinChunkAmountOut: BN.Value, deadline: number, fillDelaySeconds: number, srcUsd: BN.Value): Promise<number>;
|
|
30
|
+
getOrder(id: number): Promise<Order>;
|
|
31
|
+
cancelOrder(id: number): Promise<void>;
|
|
32
|
+
getAllOrders(): Promise<{
|
|
33
|
+
id: number;
|
|
34
|
+
status: number;
|
|
35
|
+
filledTime: number;
|
|
36
|
+
srcFilledAmount: BN;
|
|
37
|
+
ask: {
|
|
38
|
+
time: number;
|
|
39
|
+
deadline: number;
|
|
40
|
+
bidDelay: number;
|
|
41
|
+
fillDelay: number;
|
|
42
|
+
maker: any;
|
|
43
|
+
exchange: any;
|
|
44
|
+
srcToken: any;
|
|
45
|
+
dstToken: any;
|
|
46
|
+
srcAmount: BN;
|
|
47
|
+
srcBidAmount: BN;
|
|
48
|
+
dstMinAmount: BN;
|
|
49
|
+
};
|
|
50
|
+
bid: {
|
|
51
|
+
time: number;
|
|
52
|
+
taker: any;
|
|
53
|
+
exchange: any;
|
|
54
|
+
dstAmount: BN;
|
|
55
|
+
dstFee: BN;
|
|
56
|
+
data: any;
|
|
57
|
+
};
|
|
58
|
+
}[]>;
|
|
59
|
+
parseOrder(r: any): {
|
|
60
|
+
id: number;
|
|
61
|
+
status: number;
|
|
62
|
+
filledTime: number;
|
|
63
|
+
srcFilledAmount: BN;
|
|
64
|
+
ask: {
|
|
65
|
+
time: number;
|
|
66
|
+
deadline: number;
|
|
67
|
+
bidDelay: number;
|
|
68
|
+
fillDelay: number;
|
|
69
|
+
maker: any;
|
|
70
|
+
exchange: any;
|
|
71
|
+
srcToken: any;
|
|
72
|
+
dstToken: any;
|
|
73
|
+
srcAmount: BN;
|
|
74
|
+
srcBidAmount: BN;
|
|
75
|
+
dstMinAmount: BN;
|
|
76
|
+
};
|
|
77
|
+
bid: {
|
|
78
|
+
time: number;
|
|
79
|
+
taker: any;
|
|
80
|
+
exchange: any;
|
|
81
|
+
dstAmount: BN;
|
|
82
|
+
dstFee: BN;
|
|
83
|
+
data: any;
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
export interface Order {
|
|
88
|
+
id: number;
|
|
89
|
+
status: number;
|
|
90
|
+
filledTime: number;
|
|
91
|
+
srcFilledAmount: BN;
|
|
92
|
+
ask: {
|
|
93
|
+
time: number;
|
|
94
|
+
deadline: number;
|
|
95
|
+
bidDelay: number;
|
|
96
|
+
fillDelay: number;
|
|
97
|
+
maker: string;
|
|
98
|
+
exchange: string;
|
|
99
|
+
srcToken: string;
|
|
100
|
+
dstToken: string;
|
|
101
|
+
srcAmount: BN;
|
|
102
|
+
srcBidAmount: BN;
|
|
103
|
+
dstMinAmount: BN;
|
|
104
|
+
};
|
|
105
|
+
bid: {
|
|
106
|
+
time: number;
|
|
107
|
+
taker: string;
|
|
108
|
+
exchange: string;
|
|
109
|
+
dstAmount: BN;
|
|
110
|
+
dstFee: BN;
|
|
111
|
+
data: string;
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
export declare enum Status {
|
|
115
|
+
Open = "Open",
|
|
116
|
+
Canceled = "Canceled",
|
|
117
|
+
Completed = "Completed",
|
|
118
|
+
Expired = "Expired"
|
|
119
|
+
}
|
|
120
|
+
export declare enum OrderInputValidation {
|
|
121
|
+
valid = "valid",
|
|
122
|
+
equalTokens = "equalTokens",
|
|
123
|
+
invalidSrcAmount = "invalidSrcAmount",
|
|
124
|
+
invalidSrcChunkAmount = "invalidSrcChunkAmount",
|
|
125
|
+
invalidDstMinChunkAmountOut = "invalidDstMinChunkAmountOut",
|
|
126
|
+
invalidDeadline = "invalidDeadline",
|
|
127
|
+
invalidFillDelaySeconds = "invalidFillDelaySeconds",
|
|
128
|
+
invalidSrcUsd = "invalidSrcUsd",
|
|
129
|
+
invalidSmallestSrcChunkUsd = "invalidSmallestSrcChunkUsd"
|
|
130
|
+
}
|
package/dist/src/lib.js
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.OrderInputValidation = exports.Status = exports.TWAPLib = void 0;
|
|
16
|
+
const configs_1 = require("./configs");
|
|
17
|
+
const web3_1 = __importDefault(require("web3"));
|
|
18
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
19
|
+
const web3_candies_1 = require("@defi.org/web3-candies");
|
|
20
|
+
const TWAP_json_1 = __importDefault(require("../artifacts/contracts/TWAP.sol/TWAP.json"));
|
|
21
|
+
const Lens_json_1 = __importDefault(require("../artifacts/contracts/periphery/Lens.sol/Lens.json"));
|
|
22
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
23
|
+
class TWAPLib {
|
|
24
|
+
constructor(config, provider, maker) {
|
|
25
|
+
this.config = config;
|
|
26
|
+
this.provider = provider;
|
|
27
|
+
this.maker = maker;
|
|
28
|
+
this.dstAmount = (srcAmount, srcUsd, dstUsd) => (0, bignumber_js_1.default)(srcAmount).times(srcUsd).idiv(dstUsd);
|
|
29
|
+
this.isNativeToken = (token) => !!lodash_1.default.find(configs_1.nativeTokenAddresses, (a) => (0, web3_candies_1.eqIgnoreCase)(a, token.address));
|
|
30
|
+
this.isValidNetwork = (chainId) => chainId === this.config.chainId;
|
|
31
|
+
this.maxPossibleChunks = (srcToken, srcAmount, srcUsd) => bignumber_js_1.default.max(1, (0, bignumber_js_1.default)(srcAmount).div((0, bignumber_js_1.default)(10).pow(srcToken.decimals).div(srcUsd).times(this.config.minChunkSizeUsd)))
|
|
32
|
+
.integerValue(bignumber_js_1.default.ROUND_FLOOR)
|
|
33
|
+
.toNumber();
|
|
34
|
+
this.srcChunkAmount = (srcAmount, totalChunks) => (0, bignumber_js_1.default)(srcAmount).div(totalChunks).integerValue(bignumber_js_1.default.ROUND_FLOOR);
|
|
35
|
+
this.totalChunks = (srcAmount, srcChunkAmount) => (0, bignumber_js_1.default)(srcAmount).div(srcChunkAmount).integerValue(bignumber_js_1.default.ROUND_CEIL);
|
|
36
|
+
this.fillDelayMillis = (totalChunks, maxDurationMillis) => (0, bignumber_js_1.default)(totalChunks).lte(0) || (0, bignumber_js_1.default)(maxDurationMillis).lte(0)
|
|
37
|
+
? web3_candies_1.zero
|
|
38
|
+
: bignumber_js_1.default.max((0, bignumber_js_1.default)(maxDurationMillis)
|
|
39
|
+
.div(totalChunks)
|
|
40
|
+
.minus((0, bignumber_js_1.default)(this.config.bidDelaySeconds * 1000)), 0);
|
|
41
|
+
this.dstMinAmountOut = (srcToken, dstToken, srcChunkAmount, limitDstPriceFor1Src, isMarketOrder) => isMarketOrder
|
|
42
|
+
? (0, bignumber_js_1.default)(1)
|
|
43
|
+
: (0, web3_candies_1.convertDecimals)((0, bignumber_js_1.default)(srcChunkAmount).times(limitDstPriceFor1Src), srcToken.decimals, dstToken.decimals).integerValue(bignumber_js_1.default.ROUND_FLOOR);
|
|
44
|
+
this.isMarketOrder = (order) => order.ask.dstMinAmount.lte(1);
|
|
45
|
+
this.orderProgress = (order) => order.srcFilledAmount.div(order.ask.srcAmount);
|
|
46
|
+
this.status = (order) => order.status > Date.now() / 1000
|
|
47
|
+
? Status.Open
|
|
48
|
+
: order.status === 1
|
|
49
|
+
? Status.Canceled
|
|
50
|
+
: order.status === 2
|
|
51
|
+
? Status.Completed
|
|
52
|
+
: Status.Expired;
|
|
53
|
+
(0, web3_candies_1.setWeb3Instance)(new web3_1.default(provider));
|
|
54
|
+
this.twap = (0, web3_candies_1.contract)(TWAP_json_1.default.abi, this.config.twapAddress);
|
|
55
|
+
this.lens = (0, web3_candies_1.contract)(Lens_json_1.default.abi, this.config.lensAddress);
|
|
56
|
+
}
|
|
57
|
+
makerBalance(token) {
|
|
58
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
59
|
+
if (this.isNativeToken(token))
|
|
60
|
+
return (0, web3_candies_1.web3)().eth.getBalance(this.maker).then(bignumber_js_1.default);
|
|
61
|
+
else
|
|
62
|
+
return (0, web3_candies_1.erc20)(token.symbol, token.address, token.decimals).methods.balanceOf(this.maker).call().then(bignumber_js_1.default);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
wrapNativeToken(amount) {
|
|
66
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
67
|
+
return (0, web3_candies_1.erc20)(this.config.wToken.symbol, this.config.wToken.address, this.config.wToken.decimals, web3_candies_1.iwethabi)
|
|
68
|
+
.methods.deposit()
|
|
69
|
+
.send({ from: this.maker, value: (0, bignumber_js_1.default)(amount).toFixed(0) });
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
waitForConfirmation(fn) {
|
|
73
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
74
|
+
const nonceBefore = yield (0, web3_candies_1.web3)().eth.getTransactionCount(this.maker);
|
|
75
|
+
const result = yield fn();
|
|
76
|
+
while ((yield (0, web3_candies_1.web3)().eth.getTransactionCount(this.maker)) === nonceBefore) {
|
|
77
|
+
yield new Promise((r) => setTimeout(r, 1000));
|
|
78
|
+
}
|
|
79
|
+
return result;
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
hasAllowance(srcToken, amount) {
|
|
83
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
84
|
+
const token = (0, web3_candies_1.erc20)(srcToken.symbol, srcToken.address, srcToken.decimals);
|
|
85
|
+
const allowance = (0, bignumber_js_1.default)(yield token.methods.allowance(this.maker, this.config.twapAddress).call());
|
|
86
|
+
return allowance.gte(amount);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
approve(srcToken, amount) {
|
|
90
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
91
|
+
const token = (0, web3_candies_1.erc20)(srcToken.symbol, srcToken.address, srcToken.decimals);
|
|
92
|
+
yield token.methods.approve(this.config.twapAddress, amount.toString()).send({ from: this.maker });
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
validateOrderInputs(srcToken, dstToken, srcAmount, srcChunkAmount, dstMinChunkAmountOut, deadline, fillDelaySeconds, srcUsd) {
|
|
96
|
+
if (lodash_1.default.isEqual(srcToken, dstToken))
|
|
97
|
+
return OrderInputValidation.equalTokens;
|
|
98
|
+
if ((0, bignumber_js_1.default)(srcAmount).lte(0))
|
|
99
|
+
return OrderInputValidation.invalidSrcAmount;
|
|
100
|
+
if ((0, bignumber_js_1.default)(srcChunkAmount).lte(0) || (0, bignumber_js_1.default)(srcChunkAmount).gt(srcAmount))
|
|
101
|
+
return OrderInputValidation.invalidSrcChunkAmount;
|
|
102
|
+
if ((0, bignumber_js_1.default)(dstMinChunkAmountOut).lte(0))
|
|
103
|
+
return OrderInputValidation.invalidDstMinChunkAmountOut;
|
|
104
|
+
if ((0, bignumber_js_1.default)(deadline).integerValue(bignumber_js_1.default.ROUND_FLOOR).lte(Date.now()))
|
|
105
|
+
return OrderInputValidation.invalidDeadline;
|
|
106
|
+
if ((0, bignumber_js_1.default)(fillDelaySeconds).integerValue(bignumber_js_1.default.ROUND_FLOOR).lt(0))
|
|
107
|
+
return OrderInputValidation.invalidFillDelaySeconds;
|
|
108
|
+
if ((0, bignumber_js_1.default)(srcUsd).lte(0))
|
|
109
|
+
return OrderInputValidation.invalidSrcUsd;
|
|
110
|
+
const smallestChunkSize = (0, bignumber_js_1.default)(srcAmount).mod(srcChunkAmount).gt(0)
|
|
111
|
+
? (0, bignumber_js_1.default)(srcAmount).mod(srcChunkAmount)
|
|
112
|
+
: (0, bignumber_js_1.default)(srcChunkAmount);
|
|
113
|
+
if (smallestChunkSize.times(srcUsd).lt(this.config.minChunkSizeUsd))
|
|
114
|
+
return OrderInputValidation.invalidSmallestSrcChunkUsd;
|
|
115
|
+
return OrderInputValidation.valid;
|
|
116
|
+
}
|
|
117
|
+
submitOrder(srcToken, dstToken, srcAmount, srcChunkAmount, dstMinChunkAmountOut, deadline, fillDelaySeconds, srcUsd) {
|
|
118
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
119
|
+
let validation = this.validateOrderInputs(srcToken, dstToken, srcAmount, srcChunkAmount, dstMinChunkAmountOut, deadline, fillDelaySeconds, srcUsd);
|
|
120
|
+
if (validation !== OrderInputValidation.valid)
|
|
121
|
+
throw new Error(`invalid inputs: ${validation}`);
|
|
122
|
+
const tx = yield this.twap.methods
|
|
123
|
+
.ask(this.config.exchangeAddress, srcToken.address, dstToken.address, (0, bignumber_js_1.default)(srcAmount).toFixed(0), (0, bignumber_js_1.default)(srcChunkAmount).toFixed(0), (0, bignumber_js_1.default)(dstMinChunkAmountOut).toFixed(0), (0, bignumber_js_1.default)(deadline).div(1000).toFixed(0), (0, bignumber_js_1.default)(this.config.bidDelaySeconds).toFixed(0), (0, bignumber_js_1.default)(fillDelaySeconds).toFixed(0))
|
|
124
|
+
.send({ from: this.maker });
|
|
125
|
+
const events = (0, web3_candies_1.parseEvents)(tx, this.twap.options.jsonInterface);
|
|
126
|
+
return Number(events[0].returnValues.id);
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
getOrder(id) {
|
|
130
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
131
|
+
return this.parseOrder(yield this.twap.methods.order(id).call());
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
cancelOrder(id) {
|
|
135
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
136
|
+
yield this.twap.methods.cancel(id).send({ from: this.maker });
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
getAllOrders() {
|
|
140
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
141
|
+
return lodash_1.default.map(yield this.lens.methods.makerOrders(this.maker).call(), (o) => this.parseOrder(o));
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
parseOrder(r) {
|
|
145
|
+
var _a, _b, _c, _d, _e, _f;
|
|
146
|
+
return {
|
|
147
|
+
id: Number(r.id),
|
|
148
|
+
status: Number(r.status),
|
|
149
|
+
filledTime: Number(r.filledTime),
|
|
150
|
+
srcFilledAmount: (0, bignumber_js_1.default)(r.srcFilledAmount),
|
|
151
|
+
ask: {
|
|
152
|
+
time: Number(r.ask.time),
|
|
153
|
+
deadline: Number(r.ask.deadline),
|
|
154
|
+
bidDelay: Number(r.ask.bidDelay),
|
|
155
|
+
fillDelay: Number(r.ask.fillDelay),
|
|
156
|
+
maker: r.ask.maker,
|
|
157
|
+
exchange: r.ask.exchange,
|
|
158
|
+
srcToken: r.ask.srcToken,
|
|
159
|
+
dstToken: r.ask.dstToken,
|
|
160
|
+
srcAmount: (0, bignumber_js_1.default)(r.ask.srcAmount),
|
|
161
|
+
srcBidAmount: (0, bignumber_js_1.default)(r.ask.srcBidAmount),
|
|
162
|
+
dstMinAmount: (0, bignumber_js_1.default)(r.ask.dstMinAmount),
|
|
163
|
+
},
|
|
164
|
+
bid: {
|
|
165
|
+
time: Number(((_a = r.bid) === null || _a === void 0 ? void 0 : _a.time) || 0),
|
|
166
|
+
taker: ((_b = r.bid) === null || _b === void 0 ? void 0 : _b.taker) || "",
|
|
167
|
+
exchange: ((_c = r.bid) === null || _c === void 0 ? void 0 : _c.exchange) || "",
|
|
168
|
+
dstAmount: (0, bignumber_js_1.default)(((_d = r.bid) === null || _d === void 0 ? void 0 : _d.dstAmount) || web3_candies_1.zero),
|
|
169
|
+
dstFee: (0, bignumber_js_1.default)(((_e = r.bid) === null || _e === void 0 ? void 0 : _e.dstFee) || web3_candies_1.zero),
|
|
170
|
+
data: ((_f = r.bid) === null || _f === void 0 ? void 0 : _f.data) || "",
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
exports.TWAPLib = TWAPLib;
|
|
176
|
+
var Status;
|
|
177
|
+
(function (Status) {
|
|
178
|
+
Status["Open"] = "Open";
|
|
179
|
+
Status["Canceled"] = "Canceled";
|
|
180
|
+
Status["Completed"] = "Completed";
|
|
181
|
+
Status["Expired"] = "Expired";
|
|
182
|
+
})(Status = exports.Status || (exports.Status = {}));
|
|
183
|
+
var OrderInputValidation;
|
|
184
|
+
(function (OrderInputValidation) {
|
|
185
|
+
OrderInputValidation["valid"] = "valid";
|
|
186
|
+
OrderInputValidation["equalTokens"] = "equalTokens";
|
|
187
|
+
OrderInputValidation["invalidSrcAmount"] = "invalidSrcAmount";
|
|
188
|
+
OrderInputValidation["invalidSrcChunkAmount"] = "invalidSrcChunkAmount";
|
|
189
|
+
OrderInputValidation["invalidDstMinChunkAmountOut"] = "invalidDstMinChunkAmountOut";
|
|
190
|
+
OrderInputValidation["invalidDeadline"] = "invalidDeadline";
|
|
191
|
+
OrderInputValidation["invalidFillDelaySeconds"] = "invalidFillDelaySeconds";
|
|
192
|
+
OrderInputValidation["invalidSrcUsd"] = "invalidSrcUsd";
|
|
193
|
+
OrderInputValidation["invalidSmallestSrcChunkUsd"] = "invalidSmallestSrcChunkUsd";
|
|
194
|
+
})(OrderInputValidation = exports.OrderInputValidation || (exports.OrderInputValidation = {}));
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import BN from "bignumber.js";
|
|
2
|
+
import { TokenData } from "./configs";
|
|
3
|
+
export declare namespace Paraswap {
|
|
4
|
+
enum OnlyDex {
|
|
5
|
+
SpiritSwap = "SpiritSwap,SpiritSwapV2",
|
|
6
|
+
SpookySwap = "SpookySwap"
|
|
7
|
+
}
|
|
8
|
+
interface ParaswapRoute {
|
|
9
|
+
blockNumber: number;
|
|
10
|
+
network: number;
|
|
11
|
+
srcToken: string;
|
|
12
|
+
destToken: string;
|
|
13
|
+
srcDecimals: number;
|
|
14
|
+
destDecimals: number;
|
|
15
|
+
srcAmount: string;
|
|
16
|
+
destAmount: string;
|
|
17
|
+
bestRoute: any[];
|
|
18
|
+
gasCostUSD: string;
|
|
19
|
+
gasCost: string;
|
|
20
|
+
side: string;
|
|
21
|
+
tokenTransferProxy: string;
|
|
22
|
+
contractAddress: string;
|
|
23
|
+
contractMethod: string;
|
|
24
|
+
partnerFee: number;
|
|
25
|
+
srcUSD: string;
|
|
26
|
+
destUSD: string;
|
|
27
|
+
partner: string;
|
|
28
|
+
maxImpactReached: boolean;
|
|
29
|
+
}
|
|
30
|
+
function priceUsd(chainId: number, token: TokenData): Promise<BN>;
|
|
31
|
+
function findRoute(chainId: number, src: TokenData, dst: TokenData, amountIn: BN.Value, onlyDex?: OnlyDex): Promise<ParaswapRoute>;
|
|
32
|
+
function buildSwapData(dstMinOut: BN.Value, paraswapRoute: ParaswapRoute, exchangeAdapter: string): Promise<string>;
|
|
33
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.Paraswap = void 0;
|
|
16
|
+
const bignumber_js_1 = __importDefault(require("bignumber.js"));
|
|
17
|
+
const axios_1 = __importDefault(require("axios"));
|
|
18
|
+
const web3_candies_1 = require("@defi.org/web3-candies");
|
|
19
|
+
var Paraswap;
|
|
20
|
+
(function (Paraswap) {
|
|
21
|
+
const URL = "https://apiv5.paraswap.io";
|
|
22
|
+
let OnlyDex;
|
|
23
|
+
(function (OnlyDex) {
|
|
24
|
+
OnlyDex["SpiritSwap"] = "SpiritSwap,SpiritSwapV2";
|
|
25
|
+
OnlyDex["SpookySwap"] = "SpookySwap";
|
|
26
|
+
})(OnlyDex = Paraswap.OnlyDex || (Paraswap.OnlyDex = {}));
|
|
27
|
+
function priceUsd(chainId, token) {
|
|
28
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
29
|
+
const r = yield findRoute(chainId, token, token, (0, bignumber_js_1.default)(10).pow(token.decimals));
|
|
30
|
+
return (0, bignumber_js_1.default)(r.srcUSD);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
Paraswap.priceUsd = priceUsd;
|
|
34
|
+
function findRoute(chainId, src, dst, amountIn, onlyDex) {
|
|
35
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
36
|
+
const params = new URLSearchParams({
|
|
37
|
+
srcToken: src.address,
|
|
38
|
+
destToken: dst.address,
|
|
39
|
+
srcDecimals: src.decimals.toString(),
|
|
40
|
+
destDecimals: dst.decimals.toString(),
|
|
41
|
+
amount: amountIn.toString(),
|
|
42
|
+
network: chainId.toString(),
|
|
43
|
+
side: "SELL",
|
|
44
|
+
includeDEXS: onlyDex || "",
|
|
45
|
+
partner: "chucknorris",
|
|
46
|
+
// otherExchangePrices: "true",
|
|
47
|
+
});
|
|
48
|
+
const response = yield axios_1.default.get(`${URL}/prices/?${params}`);
|
|
49
|
+
if (response.status < 200 || response.status >= 400)
|
|
50
|
+
throw new Error(`${response.statusText}`);
|
|
51
|
+
return response.data.priceRoute;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
Paraswap.findRoute = findRoute;
|
|
55
|
+
function buildSwapData(dstMinOut, paraswapRoute, exchangeAdapter) {
|
|
56
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
57
|
+
const response = yield axios_1.default.post(`${URL}/transactions/${paraswapRoute.network}?ignoreChecks=true`, {
|
|
58
|
+
priceRoute: paraswapRoute,
|
|
59
|
+
srcToken: paraswapRoute.srcToken,
|
|
60
|
+
destToken: paraswapRoute.destToken,
|
|
61
|
+
srcDecimals: paraswapRoute.srcDecimals,
|
|
62
|
+
destDecimals: paraswapRoute.destDecimals,
|
|
63
|
+
srcAmount: paraswapRoute.srcAmount,
|
|
64
|
+
destAmount: (0, bignumber_js_1.default)(dstMinOut).toFixed(0),
|
|
65
|
+
userAddress: exchangeAdapter,
|
|
66
|
+
});
|
|
67
|
+
if (response.status < 200 || response.status >= 400)
|
|
68
|
+
throw new Error(`${response.statusText}`);
|
|
69
|
+
return (0, web3_candies_1.web3)().eth.abi.encodeParameters(["uint256", "bytes"], [paraswapRoute.destAmount, response.data.data]);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
Paraswap.buildSwapData = buildSwapData;
|
|
73
|
+
})(Paraswap = exports.Paraswap || (exports.Paraswap = {}));
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type BN from "bn.js";
|
|
3
|
+
import type BigNumber from "bignumber.js";
|
|
4
|
+
import type { ContractOptions } from "web3-eth-contract";
|
|
5
|
+
import type { EventLog } from "web3-core";
|
|
6
|
+
import type { EventEmitter } from "events";
|
|
7
|
+
import type { Callback, NonPayableTransactionObject, BlockType, BaseContract } from "../types";
|
|
8
|
+
export interface EventOptions {
|
|
9
|
+
filter?: object;
|
|
10
|
+
fromBlock?: BlockType;
|
|
11
|
+
topics?: string[];
|
|
12
|
+
}
|
|
13
|
+
export interface IExchange extends BaseContract {
|
|
14
|
+
constructor(jsonInterface: any[], address?: string, options?: ContractOptions): IExchange;
|
|
15
|
+
clone(): IExchange;
|
|
16
|
+
methods: {
|
|
17
|
+
getAmountOut(srcToken: string, dstToken: string, amountIn: number | string | BN | BigNumber, data: string | number[]): NonPayableTransactionObject<string>;
|
|
18
|
+
swap(srcToken: string, dstToken: string, amountIn: number | string | BN | BigNumber, amountOutMin: number | string | BN | BigNumber, data: string | number[]): NonPayableTransactionObject<void>;
|
|
19
|
+
};
|
|
20
|
+
events: {
|
|
21
|
+
allEvents(options?: EventOptions, cb?: Callback<EventLog>): EventEmitter;
|
|
22
|
+
};
|
|
23
|
+
}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import type BN from "bn.js";
|
|
3
|
+
import type BigNumber from "bignumber.js";
|
|
4
|
+
import type { ContractOptions } from "web3-eth-contract";
|
|
5
|
+
import type { EventLog } from "web3-core";
|
|
6
|
+
import type { EventEmitter } from "events";
|
|
7
|
+
import type { Callback, NonPayableTransactionObject, BlockType, ContractEventLog, BaseContract } from "../types";
|
|
8
|
+
export interface EventOptions {
|
|
9
|
+
filter?: object;
|
|
10
|
+
fromBlock?: BlockType;
|
|
11
|
+
topics?: string[];
|
|
12
|
+
}
|
|
13
|
+
export declare type OrderBid = ContractEventLog<{
|
|
14
|
+
id: string;
|
|
15
|
+
maker: string;
|
|
16
|
+
exchange: string;
|
|
17
|
+
slippagePercent: string;
|
|
18
|
+
bid: [string, string, string, string, string, string];
|
|
19
|
+
0: string;
|
|
20
|
+
1: string;
|
|
21
|
+
2: string;
|
|
22
|
+
3: string;
|
|
23
|
+
4: [string, string, string, string, string, string];
|
|
24
|
+
}>;
|
|
25
|
+
export declare type OrderCanceled = ContractEventLog<{
|
|
26
|
+
id: string;
|
|
27
|
+
maker: string;
|
|
28
|
+
sender: string;
|
|
29
|
+
0: string;
|
|
30
|
+
1: string;
|
|
31
|
+
2: string;
|
|
32
|
+
}>;
|
|
33
|
+
export declare type OrderCompleted = ContractEventLog<{
|
|
34
|
+
id: string;
|
|
35
|
+
maker: string;
|
|
36
|
+
exchange: string;
|
|
37
|
+
taker: string;
|
|
38
|
+
0: string;
|
|
39
|
+
1: string;
|
|
40
|
+
2: string;
|
|
41
|
+
3: string;
|
|
42
|
+
}>;
|
|
43
|
+
export declare type OrderCreated = ContractEventLog<{
|
|
44
|
+
id: string;
|
|
45
|
+
maker: string;
|
|
46
|
+
exchange: string;
|
|
47
|
+
ask: [
|
|
48
|
+
string,
|
|
49
|
+
string,
|
|
50
|
+
string,
|
|
51
|
+
string,
|
|
52
|
+
string,
|
|
53
|
+
string,
|
|
54
|
+
string,
|
|
55
|
+
string,
|
|
56
|
+
string,
|
|
57
|
+
string,
|
|
58
|
+
string
|
|
59
|
+
];
|
|
60
|
+
0: string;
|
|
61
|
+
1: string;
|
|
62
|
+
2: string;
|
|
63
|
+
3: [
|
|
64
|
+
string,
|
|
65
|
+
string,
|
|
66
|
+
string,
|
|
67
|
+
string,
|
|
68
|
+
string,
|
|
69
|
+
string,
|
|
70
|
+
string,
|
|
71
|
+
string,
|
|
72
|
+
string,
|
|
73
|
+
string,
|
|
74
|
+
string
|
|
75
|
+
];
|
|
76
|
+
}>;
|
|
77
|
+
export declare type OrderFilled = ContractEventLog<{
|
|
78
|
+
id: string;
|
|
79
|
+
maker: string;
|
|
80
|
+
exchange: string;
|
|
81
|
+
taker: string;
|
|
82
|
+
srcAmountIn: string;
|
|
83
|
+
dstAmountOut: string;
|
|
84
|
+
dstFee: string;
|
|
85
|
+
srcFilledAmount: string;
|
|
86
|
+
0: string;
|
|
87
|
+
1: string;
|
|
88
|
+
2: string;
|
|
89
|
+
3: string;
|
|
90
|
+
4: string;
|
|
91
|
+
5: string;
|
|
92
|
+
6: string;
|
|
93
|
+
7: string;
|
|
94
|
+
}>;
|
|
95
|
+
export interface TWAP extends BaseContract {
|
|
96
|
+
constructor(jsonInterface: any[], address?: string, options?: ContractOptions): TWAP;
|
|
97
|
+
clone(): TWAP;
|
|
98
|
+
methods: {
|
|
99
|
+
MIN_BID_DELAY_SECONDS(): NonPayableTransactionObject<string>;
|
|
100
|
+
MIN_OUTBID_PERCENT(): NonPayableTransactionObject<string>;
|
|
101
|
+
PERCENT_BASE(): NonPayableTransactionObject<string>;
|
|
102
|
+
STALE_BID_DELAY_MUL(): NonPayableTransactionObject<string>;
|
|
103
|
+
STATUS_CANCELED(): NonPayableTransactionObject<string>;
|
|
104
|
+
STATUS_COMPLETED(): NonPayableTransactionObject<string>;
|
|
105
|
+
VERSION(): NonPayableTransactionObject<string>;
|
|
106
|
+
ask(exchange: string, srcToken: string, dstToken: string, srcAmount: number | string | BN | BigNumber, srcBidAmount: number | string | BN | BigNumber, dstMinAmount: number | string | BN | BigNumber, deadline: number | string | BN | BigNumber, bidDelay: number | string | BN | BigNumber, fillDelay: number | string | BN | BigNumber): NonPayableTransactionObject<string>;
|
|
107
|
+
bid(id: number | string | BN | BigNumber, exchange: string, dstFee: number | string | BN | BigNumber, slippagePercent: number | string | BN | BigNumber, data: string | number[]): NonPayableTransactionObject<void>;
|
|
108
|
+
book(arg0: number | string | BN | BigNumber): NonPayableTransactionObject<{
|
|
109
|
+
id: string;
|
|
110
|
+
status: string;
|
|
111
|
+
filledTime: string;
|
|
112
|
+
srcFilledAmount: string;
|
|
113
|
+
ask: [
|
|
114
|
+
string,
|
|
115
|
+
string,
|
|
116
|
+
string,
|
|
117
|
+
string,
|
|
118
|
+
string,
|
|
119
|
+
string,
|
|
120
|
+
string,
|
|
121
|
+
string,
|
|
122
|
+
string,
|
|
123
|
+
string,
|
|
124
|
+
string
|
|
125
|
+
];
|
|
126
|
+
bid: [string, string, string, string, string, string];
|
|
127
|
+
0: string;
|
|
128
|
+
1: string;
|
|
129
|
+
2: string;
|
|
130
|
+
3: string;
|
|
131
|
+
4: [
|
|
132
|
+
string,
|
|
133
|
+
string,
|
|
134
|
+
string,
|
|
135
|
+
string,
|
|
136
|
+
string,
|
|
137
|
+
string,
|
|
138
|
+
string,
|
|
139
|
+
string,
|
|
140
|
+
string,
|
|
141
|
+
string,
|
|
142
|
+
string
|
|
143
|
+
];
|
|
144
|
+
5: [string, string, string, string, string, string];
|
|
145
|
+
}>;
|
|
146
|
+
cancel(id: number | string | BN | BigNumber): NonPayableTransactionObject<void>;
|
|
147
|
+
fill(id: number | string | BN | BigNumber): NonPayableTransactionObject<void>;
|
|
148
|
+
length(): NonPayableTransactionObject<string>;
|
|
149
|
+
makerOrders(arg0: string, arg1: number | string | BN | BigNumber): NonPayableTransactionObject<string>;
|
|
150
|
+
order(id: number | string | BN | BigNumber): NonPayableTransactionObject<[
|
|
151
|
+
string,
|
|
152
|
+
string,
|
|
153
|
+
string,
|
|
154
|
+
string,
|
|
155
|
+
[
|
|
156
|
+
string,
|
|
157
|
+
string,
|
|
158
|
+
string,
|
|
159
|
+
string,
|
|
160
|
+
string,
|
|
161
|
+
string,
|
|
162
|
+
string,
|
|
163
|
+
string,
|
|
164
|
+
string,
|
|
165
|
+
string,
|
|
166
|
+
string
|
|
167
|
+
],
|
|
168
|
+
[
|
|
169
|
+
string,
|
|
170
|
+
string,
|
|
171
|
+
string,
|
|
172
|
+
string,
|
|
173
|
+
string,
|
|
174
|
+
string
|
|
175
|
+
]
|
|
176
|
+
]>;
|
|
177
|
+
orderIdsByMaker(maker: string): NonPayableTransactionObject<string[]>;
|
|
178
|
+
prune(id: number | string | BN | BigNumber): NonPayableTransactionObject<void>;
|
|
179
|
+
status(arg0: number | string | BN | BigNumber): NonPayableTransactionObject<string>;
|
|
180
|
+
};
|
|
181
|
+
events: {
|
|
182
|
+
OrderBid(cb?: Callback<OrderBid>): EventEmitter;
|
|
183
|
+
OrderBid(options?: EventOptions, cb?: Callback<OrderBid>): EventEmitter;
|
|
184
|
+
OrderCanceled(cb?: Callback<OrderCanceled>): EventEmitter;
|
|
185
|
+
OrderCanceled(options?: EventOptions, cb?: Callback<OrderCanceled>): EventEmitter;
|
|
186
|
+
OrderCompleted(cb?: Callback<OrderCompleted>): EventEmitter;
|
|
187
|
+
OrderCompleted(options?: EventOptions, cb?: Callback<OrderCompleted>): EventEmitter;
|
|
188
|
+
OrderCreated(cb?: Callback<OrderCreated>): EventEmitter;
|
|
189
|
+
OrderCreated(options?: EventOptions, cb?: Callback<OrderCreated>): EventEmitter;
|
|
190
|
+
OrderFilled(cb?: Callback<OrderFilled>): EventEmitter;
|
|
191
|
+
OrderFilled(options?: EventOptions, cb?: Callback<OrderFilled>): EventEmitter;
|
|
192
|
+
allEvents(options?: EventOptions, cb?: Callback<EventLog>): EventEmitter;
|
|
193
|
+
};
|
|
194
|
+
once(event: "OrderBid", cb: Callback<OrderBid>): void;
|
|
195
|
+
once(event: "OrderBid", options: EventOptions, cb: Callback<OrderBid>): void;
|
|
196
|
+
once(event: "OrderCanceled", cb: Callback<OrderCanceled>): void;
|
|
197
|
+
once(event: "OrderCanceled", options: EventOptions, cb: Callback<OrderCanceled>): void;
|
|
198
|
+
once(event: "OrderCompleted", cb: Callback<OrderCompleted>): void;
|
|
199
|
+
once(event: "OrderCompleted", options: EventOptions, cb: Callback<OrderCompleted>): void;
|
|
200
|
+
once(event: "OrderCreated", cb: Callback<OrderCreated>): void;
|
|
201
|
+
once(event: "OrderCreated", options: EventOptions, cb: Callback<OrderCreated>): void;
|
|
202
|
+
once(event: "OrderFilled", cb: Callback<OrderFilled>): void;
|
|
203
|
+
once(event: "OrderFilled", options: EventOptions, cb: Callback<OrderFilled>): void;
|
|
204
|
+
}
|