@paraswap/dex-lib 3.8.18 → 3.8.20-lite-psm.2
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/build/abi/inception/inception-ineth-pool.json +1062 -0
- package/build/abi/inception/inception-ineth.json +609 -0
- package/build/abi/inception/inception-ratio-feed.json +93 -0
- package/build/abi/inception/inception-vault.json +991 -0
- package/build/abi/infusion/InfusionFactory.json +147 -0
- package/build/abi/infusion/InfusionPair.json +658 -0
- package/build/abi/infusion/InfusionRouter.json +442 -0
- package/build/abi/lite-psm/dai.json +333 -0
- package/build/abi/lite-psm/psm.json +468 -0
- package/build/abi/lite-psm/usdc.json +814 -0
- package/build/abi/oswap/oswap.abi.json +452 -0
- package/build/dex/aave-v1/aave-v1.js +0 -1
- package/build/dex/aave-v1/aave-v1.js.map +1 -1
- package/build/dex/idle-dao/idle-dao-pool.d.ts +56 -0
- package/build/dex/idle-dao/idle-dao-pool.js +176 -0
- package/build/dex/idle-dao/idle-dao-pool.js.map +1 -0
- package/build/dex/idle-dao/idle-dao-pooling-pool.d.ts +16 -0
- package/build/dex/idle-dao/idle-dao-pooling-pool.js +57 -0
- package/build/dex/idle-dao/idle-dao-pooling-pool.js.map +1 -0
- package/build/dex/idle-dao/scripts.d.ts +9 -0
- package/build/dex/idle-dao/scripts.js +552 -0
- package/build/dex/idle-dao/scripts.js.map +1 -0
- package/build/dex/inception/config.d.ts +5 -0
- package/build/dex/inception/config.js +112 -0
- package/build/dex/inception/config.js.map +1 -0
- package/build/dex/inception/inception-event-pool.d.ts +23 -0
- package/build/dex/inception/inception-event-pool.js +34 -0
- package/build/dex/inception/inception-event-pool.js.map +1 -0
- package/build/dex/inception/inception-native.d.ts +43 -0
- package/build/dex/inception/inception-native.js +131 -0
- package/build/dex/inception/inception-native.js.map +1 -0
- package/build/dex/inception/inception-pool.d.ts +18 -0
- package/build/dex/inception/inception-pool.js +32 -0
- package/build/dex/inception/inception-pool.js.map +1 -0
- package/build/dex/inception/inception-price-feed.d.ts +19 -0
- package/build/dex/inception/inception-price-feed.js +51 -0
- package/build/dex/inception/inception-price-feed.js.map +1 -0
- package/build/dex/inception/inception.d.ts +44 -0
- package/build/dex/inception/inception.js +162 -0
- package/build/dex/inception/inception.js.map +1 -0
- package/build/dex/inception/tokens.d.ts +9 -0
- package/build/dex/inception/tokens.js +28 -0
- package/build/dex/inception/tokens.js.map +1 -0
- package/build/dex/inception/types.d.ts +22 -0
- package/build/dex/inception/types.js +3 -0
- package/build/dex/inception/types.js.map +1 -0
- package/build/dex/inception/utils.d.ts +7 -0
- package/build/dex/inception/utils.js +58 -0
- package/build/dex/inception/utils.js.map +1 -0
- package/build/dex/index.js +4 -0
- package/build/dex/index.js.map +1 -1
- package/build/dex/infusion/config.d.ts +4 -0
- package/build/dex/infusion/config.js +25 -0
- package/build/dex/infusion/config.js.map +1 -0
- package/build/dex/infusion/infusion-stable-pool.d.ts +4 -0
- package/build/dex/infusion/infusion-stable-pool.js +74 -0
- package/build/dex/infusion/infusion-stable-pool.js.map +1 -0
- package/build/dex/infusion/infusion.d.ts +54 -0
- package/build/dex/infusion/infusion.js +510 -0
- package/build/dex/infusion/infusion.js.map +1 -0
- package/build/dex/infusion/types.d.ts +47 -0
- package/build/dex/infusion/types.js +3 -0
- package/build/dex/infusion/types.js.map +1 -0
- package/build/dex/infusion/utils/isStablePair.d.ts +2 -0
- package/build/dex/infusion/utils/isStablePair.js +18 -0
- package/build/dex/infusion/utils/isStablePair.js.map +1 -0
- package/build/dex/lite-psm/config.d.ts +3 -0
- package/build/dex/lite-psm/config.js +29 -0
- package/build/dex/lite-psm/config.js.map +1 -0
- package/build/dex/lite-psm/lite-psm-event-pool.d.ts +29 -0
- package/build/dex/lite-psm/lite-psm-event-pool.js +164 -0
- package/build/dex/lite-psm/lite-psm-event-pool.js.map +1 -0
- package/build/dex/lite-psm/lite-psm.d.ts +53 -0
- package/build/dex/lite-psm/lite-psm.js +366 -0
- package/build/dex/lite-psm/lite-psm.js.map +1 -0
- package/build/dex/lite-psm/types.d.ts +40 -0
- package/build/dex/lite-psm/types.js +3 -0
- package/build/dex/lite-psm/types.js.map +1 -0
- package/build/dex/maker-psm/maker-psm.js +3 -2
- package/build/dex/maker-psm/maker-psm.js.map +1 -1
- package/build/dex/oswap/config.d.ts +5 -0
- package/build/dex/oswap/config.js +31 -0
- package/build/dex/oswap/config.js.map +1 -0
- package/build/dex/oswap/oswap-pool.d.ts +51 -0
- package/build/dex/oswap/oswap-pool.js +150 -0
- package/build/dex/oswap/oswap-pool.js.map +1 -0
- package/build/dex/oswap/oswap.d.ts +46 -0
- package/build/dex/oswap/oswap.js +273 -0
- package/build/dex/oswap/oswap.js.map +1 -0
- package/build/dex/oswap/types.d.ts +20 -0
- package/build/dex/oswap/types.js +3 -0
- package/build/dex/oswap/types.js.map +1 -0
- package/build/dex/platypus/platypus.js +3 -17
- package/build/dex/platypus/platypus.js.map +1 -1
- package/build/dex/swaap-v1/swaap-v1.js +0 -4
- package/build/dex/swaap-v1/swaap-v1.js.map +1 -1
- package/build/dex/trader-joe-v2.1/config.d.ts +3 -0
- package/build/dex/trader-joe-v2.1/config.js +5 -1
- package/build/dex/trader-joe-v2.1/config.js.map +1 -1
- package/build/dex/trader-joe-v2.1/trader-joe-v2.1.d.ts +2 -14
- package/build/dex/trader-joe-v2.1/trader-joe-v2.1.js +3 -85
- package/build/dex/trader-joe-v2.1/trader-joe-v2.1.js.map +1 -1
- package/build/dex-helper/dummy-dex-helper.js +1 -1
- package/build/dex-helper/dummy-dex-helper.js.map +1 -1
- package/package.json +1 -1
- package/src/abi/lite-psm/dai.json +333 -0
- package/src/abi/lite-psm/psm.json +468 -0
- package/src/abi/lite-psm/usdc.json +814 -0
- package/src/dex/index.ts +4 -0
- package/src/dex/lite-psm/config.ts +29 -0
- package/src/dex/lite-psm/lite-psm-e2e.test.ts +79 -0
- package/src/dex/lite-psm/lite-psm-event-pool.ts +216 -0
- package/src/dex/lite-psm/lite-psm-events.test.ts +61 -0
- package/src/dex/lite-psm/lite-psm-integration.test.ts +96 -0
- package/src/dex/lite-psm/lite-psm.ts +576 -0
- package/src/dex/lite-psm/types.ts +46 -0
- package/src/dex/maker-psm/maker-psm.ts +3 -2
- package/src/dex/trader-joe-v2.1/base.ts +178 -0
- package/src/dex/trader-joe-v2.1/config.ts +5 -0
- package/src/dex/trader-joe-v2.1/trader-joe-v2.1.ts +8 -165
- package/src/dex/trader-joe-v2.1/trader-joe-v2.2.ts +23 -0
- package/src/dex-helper/dummy-dex-helper.ts +1 -1
- package/.vscode/launch.json +0 -53
- package/.vscode/settings.json +0 -2
- package/.vscode/tasks.json +0 -15
- package/build/abi/maverick-v2/MaverickV2Router.json +0 -778
- package/build/abi/uniswap-v3/AlienBaseV3Router.abi.json +0 -52
- package/build/abi/wombat/pool.json +0 -1289
- package/build/dex/aave-v2/tokens-avalanche.json +0 -44
- package/build/dex/aave-v2/tokens-mainnet.json +0 -188
- package/build/dex/aave-v2/tokens-polygon.json +0 -44
- package/build/dex/bProtocol.d.ts +0 -18
- package/build/dex/bProtocol.js +0 -39
- package/build/dex/bProtocol.js.map +0 -1
- package/build/dex/bancor.d.ts +0 -26
- package/build/dex/bancor.js +0 -58
- package/build/dex/bancor.js.map +0 -1
- package/build/dex/compound.d.ts +0 -18
- package/build/dex/compound.js +0 -46
- package/build/dex/compound.js.map +0 -1
- package/build/dex/curve-v2.d.ts +0 -58
- package/build/dex/curve-v2.js +0 -180
- package/build/dex/curve-v2.js.map +0 -1
- package/build/dex/dodo-v1.d.ts +0 -33
- package/build/dex/dodo-v1.js +0 -63
- package/build/dex/dodo-v1.js.map +0 -1
- package/build/dex/lido.d.ts +0 -19
- package/build/dex/lido.js +0 -42
- package/build/dex/lido.js.map +0 -1
- package/build/dex/maker-psm/scripts/gem.abi.json +0 -136
- package/build/dex/maker-psm/scripts/validate-state.d.ts +0 -0
- package/build/dex/maker-psm/scripts/validate-state.js +0 -185
- package/build/dex/maker-psm/scripts/validate-state.js.map +0 -1
- package/build/dex/maker-psm/scripts/vat.abi.json +0 -243
- package/build/dex/onebit.d.ts +0 -25
- package/build/dex/onebit.js +0 -42
- package/build/dex/onebit.js.map +0 -1
- package/build/dex/smoothy.d.ts +0 -26
- package/build/dex/smoothy.js +0 -48
- package/build/dex/smoothy.js.map +0 -1
- package/build/dex/solidly-v3/scripts/check-event-pool-event.d.ts +0 -1
- package/build/dex/solidly-v3/scripts/check-event-pool-event.js +0 -53
- package/build/dex/solidly-v3/scripts/check-event-pool-event.js.map +0 -1
- package/build/dex/stable-pool.d.ts +0 -28
- package/build/dex/stable-pool.js +0 -55
- package/build/dex/stable-pool.js.map +0 -1
- package/build/dex/trader-joe-v2.1/trader-joe-v2.1-new.d.ts +0 -7
- package/build/dex/trader-joe-v2.1/trader-joe-v2.1-new.js +0 -20
- package/build/dex/trader-joe-v2.1/trader-joe-v2.1-new.js.map +0 -1
- package/build/dex/trader-joe-v2.1.d.ts +0 -43
- package/build/dex/trader-joe-v2.1.js +0 -79
- package/build/dex/trader-joe-v2.1.js.map +0 -1
- package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.d.ts +0 -17
- package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.js +0 -64
- package/build/dex/uniswap-v3/forks/alien-base-v3/alien-base-v3.js.map +0 -1
- package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.d.ts +0 -17
- package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.js +0 -79
- package/build/dex/uniswap-v3/forks/alien-v3/alien-v3.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../src/dex/lite-psm/config.ts"],"names":[],"mappings":";;;AAEA,+CAA0C;AAE1C,0CAA0C;AAC7B,QAAA,aAAa,GAA4B;IACpD,OAAO,EAAE;QACP,CAAC,mBAAO,CAAC,OAAO,CAAC,EAAE;YACjB,GAAG,EAAE;gBACH,OAAO,EAAE,4CAA4C;gBACrD,QAAQ,EAAE,EAAE;aACb;YACD,UAAU,EAAE,4CAA4C;YACxD,KAAK,EAAE;gBACL;oBACE,GAAG,EAAE;wBACH,OAAO,EAAE,4CAA4C;wBACrD,QAAQ,EAAE,CAAC;qBACZ;oBACD,cAAc,EAAE,4CAA4C;oBAC5D,aAAa,EAAE,4CAA4C;oBAC3D,UAAU,EAAE,4CAA4C;oBACxD,UAAU,EACR,oEAAoE,EAAE,6BAA6B;iBACtG;aACF;SACF;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { DeepReadonly } from 'ts-essentials';
|
|
2
|
+
import { Contract } from 'web3-eth-contract';
|
|
3
|
+
import { Address, Log, Logger } from '../../types';
|
|
4
|
+
import { StatefulEventSubscriber } from '../../stateful-event-subscriber';
|
|
5
|
+
import { IDexHelper } from '../../dex-helper/idex-helper';
|
|
6
|
+
import { PoolState, PoolConfig } from './types';
|
|
7
|
+
export declare function getOnChainState(multiContract: Contract, poolConfigs: PoolConfig[], vatAddress: Address, blockNumber: number | 'latest', daiAddress: Address): Promise<PoolState[]>;
|
|
8
|
+
export declare class LitePsmEventPool extends StatefulEventSubscriber<PoolState> {
|
|
9
|
+
protected network: number;
|
|
10
|
+
protected dexHelper: IDexHelper;
|
|
11
|
+
poolConfig: PoolConfig;
|
|
12
|
+
protected vatAddress: Address;
|
|
13
|
+
handlers: {
|
|
14
|
+
[event: string]: (event: any, pool: PoolState, log: Log) => PoolState;
|
|
15
|
+
};
|
|
16
|
+
logDecoder: (log: Log) => any;
|
|
17
|
+
to18ConversionFactor: bigint;
|
|
18
|
+
bytes32Tout: string;
|
|
19
|
+
bytes32Tin: string;
|
|
20
|
+
daiAddress: Address;
|
|
21
|
+
constructor(parentName: string, network: number, dexHelper: IDexHelper, logger: Logger, poolConfig: PoolConfig, vatAddress: Address);
|
|
22
|
+
handleFile(event: any, pool: PoolState, log: Log): PoolState;
|
|
23
|
+
handleTransfer(event: any, pool: PoolState, log: Log): PoolState;
|
|
24
|
+
handleTransferDAI(event: any, pool: PoolState, log: Log): PoolState;
|
|
25
|
+
handleTransferGEM(event: any, pool: PoolState, log: Log): PoolState;
|
|
26
|
+
getIdentifier(): string;
|
|
27
|
+
protected processLog(state: DeepReadonly<PoolState>, log: Readonly<Log>): DeepReadonly<PoolState> | null;
|
|
28
|
+
generateState(blockNumber: number | 'latest'): Promise<Readonly<PoolState>>;
|
|
29
|
+
}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.LitePsmEventPool = exports.getOnChainState = void 0;
|
|
7
|
+
const abi_1 = require("@ethersproject/abi");
|
|
8
|
+
const stateful_event_subscriber_1 = require("../../stateful-event-subscriber");
|
|
9
|
+
const utils_1 = require("../../utils");
|
|
10
|
+
const config_1 = require("./config");
|
|
11
|
+
const psm_json_1 = __importDefault(require("../../abi/maker-psm/psm.json"));
|
|
12
|
+
const vat_json_1 = __importDefault(require("../../abi/maker-psm/vat.json"));
|
|
13
|
+
const utils_2 = require("../../lib/tokens/utils");
|
|
14
|
+
const dai_json_1 = __importDefault(require("../../abi/lite-psm/dai.json"));
|
|
15
|
+
const usdc_json_1 = __importDefault(require("../../abi/lite-psm/usdc.json"));
|
|
16
|
+
const vatInterface = new abi_1.Interface(vat_json_1.default);
|
|
17
|
+
const psmInterface = new abi_1.Interface(psm_json_1.default);
|
|
18
|
+
const daiInterface = new abi_1.Interface(dai_json_1.default);
|
|
19
|
+
const usdcInterface = new abi_1.Interface(usdc_json_1.default);
|
|
20
|
+
const bigIntify = (b) => BigInt(b.toString());
|
|
21
|
+
async function getOnChainState(multiContract, poolConfigs, vatAddress, blockNumber, daiAddress) {
|
|
22
|
+
const callData = poolConfigs
|
|
23
|
+
.map(c => [
|
|
24
|
+
{
|
|
25
|
+
target: c.psmAddress,
|
|
26
|
+
callData: psmInterface.encodeFunctionData('tin', []),
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
target: c.psmAddress,
|
|
30
|
+
callData: psmInterface.encodeFunctionData('tout', []),
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
target: vatAddress,
|
|
34
|
+
callData: vatInterface.encodeFunctionData('ilks', [c.identifier]),
|
|
35
|
+
},
|
|
36
|
+
// dai liquidity
|
|
37
|
+
// ceiling for `sellGem`
|
|
38
|
+
{
|
|
39
|
+
target: daiAddress,
|
|
40
|
+
callData: utils_2.erc20Iface.encodeFunctionData('balanceOf', [c.psmAddress]),
|
|
41
|
+
},
|
|
42
|
+
// gem liquidity
|
|
43
|
+
// ceiling for `buyGem`
|
|
44
|
+
{
|
|
45
|
+
target: c.gem.address,
|
|
46
|
+
callData: utils_2.erc20Iface.encodeFunctionData('balanceOf', [c.pocketAddress]),
|
|
47
|
+
},
|
|
48
|
+
])
|
|
49
|
+
.flat();
|
|
50
|
+
const res = await multiContract.methods
|
|
51
|
+
.aggregate(callData)
|
|
52
|
+
.call({}, blockNumber);
|
|
53
|
+
let i = 0;
|
|
54
|
+
const result = poolConfigs.map(c => {
|
|
55
|
+
const tin = bigIntify(psmInterface.decodeFunctionResult('tin', res.returnData[i++])[0]);
|
|
56
|
+
const tout = bigIntify(psmInterface.decodeFunctionResult('tout', res.returnData[i++])[0]);
|
|
57
|
+
const ilks = vatInterface.decodeFunctionResult('ilks', res.returnData[i++]);
|
|
58
|
+
const rate = bigIntify(ilks.rate);
|
|
59
|
+
const daiBalance = bigIntify(utils_2.erc20Iface.decodeFunctionResult('balanceOf', res.returnData[i++])[0]);
|
|
60
|
+
const gemBalance = bigIntify(utils_2.erc20Iface.decodeFunctionResult('balanceOf', res.returnData[i++])[0]);
|
|
61
|
+
const response = {
|
|
62
|
+
tin,
|
|
63
|
+
tout,
|
|
64
|
+
daiBalance,
|
|
65
|
+
gemBalance,
|
|
66
|
+
rate,
|
|
67
|
+
};
|
|
68
|
+
return response;
|
|
69
|
+
});
|
|
70
|
+
return result;
|
|
71
|
+
}
|
|
72
|
+
exports.getOnChainState = getOnChainState;
|
|
73
|
+
class LitePsmEventPool extends stateful_event_subscriber_1.StatefulEventSubscriber {
|
|
74
|
+
constructor(parentName, network, dexHelper, logger, poolConfig, vatAddress) {
|
|
75
|
+
super(parentName, poolConfig.identifier, dexHelper, logger);
|
|
76
|
+
this.network = network;
|
|
77
|
+
this.dexHelper = dexHelper;
|
|
78
|
+
this.poolConfig = poolConfig;
|
|
79
|
+
this.vatAddress = vatAddress;
|
|
80
|
+
this.handlers = {};
|
|
81
|
+
this.bytes32Tout = '0x746f757400000000000000000000000000000000000000000000000000000000'; // bytes32('tout')
|
|
82
|
+
this.bytes32Tin = '0x74696e0000000000000000000000000000000000000000000000000000000000'; // bytes32('tin')
|
|
83
|
+
this.daiAddress =
|
|
84
|
+
config_1.LitePsmConfig[this.parentName][this.network].dai.address.toLowerCase();
|
|
85
|
+
this.logDecoder = (log) => {
|
|
86
|
+
const logAddress = log.address.toLowerCase();
|
|
87
|
+
if (logAddress === this.daiAddress) {
|
|
88
|
+
return daiInterface.parseLog(log);
|
|
89
|
+
}
|
|
90
|
+
else if (logAddress === this.poolConfig.gem.address) {
|
|
91
|
+
return usdcInterface.parseLog(log);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
return psmInterface.parseLog(log);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
this.addressesSubscribed = [
|
|
98
|
+
poolConfig.psmAddress,
|
|
99
|
+
this.daiAddress,
|
|
100
|
+
this.poolConfig.gem.address,
|
|
101
|
+
];
|
|
102
|
+
this.to18ConversionFactor = (0, utils_1.getBigIntPow)(18 - poolConfig.gem.decimals);
|
|
103
|
+
// Add handlers
|
|
104
|
+
this.handlers['File'] = this.handleFile.bind(this);
|
|
105
|
+
this.handlers['Transfer'] = this.handleTransfer.bind(this);
|
|
106
|
+
}
|
|
107
|
+
handleFile(event, pool, log) {
|
|
108
|
+
if (event.args.what === this.bytes32Tin) {
|
|
109
|
+
pool.tin = bigIntify(event.args.data);
|
|
110
|
+
}
|
|
111
|
+
else if (event.args.what === this.bytes32Tout) {
|
|
112
|
+
pool.tout = bigIntify(event.args.data);
|
|
113
|
+
}
|
|
114
|
+
return pool;
|
|
115
|
+
}
|
|
116
|
+
handleTransfer(event, pool, log) {
|
|
117
|
+
if (log.address.toLowerCase() === this.daiAddress) {
|
|
118
|
+
return this.handleTransferDAI(event, pool, log);
|
|
119
|
+
}
|
|
120
|
+
else if (log.address.toLowerCase() === this.poolConfig.gem.address) {
|
|
121
|
+
return this.handleTransferGEM(event, pool, log);
|
|
122
|
+
}
|
|
123
|
+
return pool;
|
|
124
|
+
}
|
|
125
|
+
handleTransferDAI(event, pool, log) {
|
|
126
|
+
if (event.args?.src?.toLowerCase() === this.poolConfig.psmAddress) {
|
|
127
|
+
pool.daiBalance -= bigIntify(event.args.wad);
|
|
128
|
+
}
|
|
129
|
+
else if (event.args?.dst?.toLowerCase() === this.poolConfig.psmAddress) {
|
|
130
|
+
pool.daiBalance += bigIntify(event.args.wad);
|
|
131
|
+
}
|
|
132
|
+
return pool;
|
|
133
|
+
}
|
|
134
|
+
handleTransferGEM(event, pool, log) {
|
|
135
|
+
if (event.args?.from?.toLowerCase() === this.poolConfig.pocketAddress) {
|
|
136
|
+
pool.gemBalance -= bigIntify(event.args.value);
|
|
137
|
+
}
|
|
138
|
+
else if (event.args?.to?.toLowerCase() === this.poolConfig.pocketAddress) {
|
|
139
|
+
pool.gemBalance += bigIntify(event.args.value);
|
|
140
|
+
}
|
|
141
|
+
return pool;
|
|
142
|
+
}
|
|
143
|
+
getIdentifier() {
|
|
144
|
+
return `${this.parentName}_${this.poolConfig.psmAddress}`.toLowerCase();
|
|
145
|
+
}
|
|
146
|
+
processLog(state, log) {
|
|
147
|
+
try {
|
|
148
|
+
const event = this.logDecoder(log);
|
|
149
|
+
if (event.name in this.handlers) {
|
|
150
|
+
return this.handlers[event.name](event, state, log);
|
|
151
|
+
}
|
|
152
|
+
return state;
|
|
153
|
+
}
|
|
154
|
+
catch (e) {
|
|
155
|
+
this.logger.error(`Error_${this.parentName}_processLog could not parse the log with topic ${log.topics}:`, e);
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
async generateState(blockNumber) {
|
|
160
|
+
return (await getOnChainState(this.dexHelper.multiContract, [this.poolConfig], this.vatAddress, blockNumber, this.daiAddress))[0];
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
exports.LitePsmEventPool = LitePsmEventPool;
|
|
164
|
+
//# sourceMappingURL=lite-psm-event-pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lite-psm-event-pool.js","sourceRoot":"","sources":["../../../src/dex/lite-psm/lite-psm-event-pool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Token, Address, ExchangePrices, PoolPrices, AdapterExchangeParam, SimpleExchangeParam, PoolLiquidity, Logger, NumberAsString, DexExchangeParam, ExchangeTxInfo, PreprocessTransactionOptions } from '../../types';
|
|
2
|
+
import { SwapSide, Network } from '../../constants';
|
|
3
|
+
import { IDex } from '../../dex/idex';
|
|
4
|
+
import { IDexHelper } from '../../dex-helper/idex-helper';
|
|
5
|
+
import { LitePsmData, PoolState, PoolConfig, LitePsmDirectPayload } from './types';
|
|
6
|
+
import { SimpleExchange } from '../simple-exchange';
|
|
7
|
+
import { OptimalSwapExchange } from '@paraswap/core';
|
|
8
|
+
import { LitePsmEventPool } from './lite-psm-event-pool';
|
|
9
|
+
export declare class LitePsm extends SimpleExchange implements IDex<LitePsmData, LitePsmDirectPayload> {
|
|
10
|
+
protected network: Network;
|
|
11
|
+
protected dexHelper: IDexHelper;
|
|
12
|
+
protected dai: Token;
|
|
13
|
+
protected vatAddress: Address;
|
|
14
|
+
protected poolConfigs: PoolConfig[];
|
|
15
|
+
protected eventPools: {
|
|
16
|
+
[gemAddress: string]: LitePsmEventPool;
|
|
17
|
+
};
|
|
18
|
+
readonly hasConstantPriceLargeAmounts = true;
|
|
19
|
+
readonly isFeeOnTransferSupported = false;
|
|
20
|
+
static dexKeysWithNetwork: {
|
|
21
|
+
key: string;
|
|
22
|
+
networks: Network[];
|
|
23
|
+
}[];
|
|
24
|
+
logger: Logger;
|
|
25
|
+
constructor(network: Network, dexKey: string, dexHelper: IDexHelper, dai?: Token, vatAddress?: Address, poolConfigs?: PoolConfig[]);
|
|
26
|
+
static getDirectFunctionNameV6(): string[];
|
|
27
|
+
initializePricing(blockNumber: number): Promise<void>;
|
|
28
|
+
getAdapters(side: SwapSide): {
|
|
29
|
+
name: string;
|
|
30
|
+
index: number;
|
|
31
|
+
}[] | null;
|
|
32
|
+
getEventPool(srcToken: Token, destToken: Token): LitePsmEventPool | null;
|
|
33
|
+
getPoolIdentifiers(srcToken: Token, destToken: Token, side: SwapSide, blockNumber: number): Promise<string[]>;
|
|
34
|
+
getPoolState(pool: LitePsmEventPool, blockNumber: number): Promise<PoolState>;
|
|
35
|
+
computePrices(isSrcDai: boolean, to18ConversionFactor: bigint, side: SwapSide, amounts: bigint[], poolState: PoolState): bigint[];
|
|
36
|
+
getPricesVolume(srcToken: Token, destToken: Token, amounts: bigint[], side: SwapSide, blockNumber: number, limitPools?: string[]): Promise<null | ExchangePrices<LitePsmData>>;
|
|
37
|
+
getCalldataGasCost(poolPrices: PoolPrices<LitePsmData>): number | number[];
|
|
38
|
+
getPsmParams(srcToken: string, srcAmount: string, destAmount: string, data: LitePsmData, side: SwapSide): {
|
|
39
|
+
isGemSell: boolean;
|
|
40
|
+
gemAmount: string;
|
|
41
|
+
};
|
|
42
|
+
getAdapterParam(srcToken: string, destToken: string, srcAmount: string, destAmount: string, data: LitePsmData, side: SwapSide): AdapterExchangeParam;
|
|
43
|
+
getSimpleParam(srcToken: string, destToken: string, srcAmount: string, destAmount: string, data: LitePsmData, side: SwapSide): Promise<SimpleExchangeParam>;
|
|
44
|
+
getTokenFromAddress(address: Address): Token;
|
|
45
|
+
preProcessTransaction?(optimalSwapExchange: OptimalSwapExchange<LitePsmData>, srcToken: Token, destToken: Token, side: SwapSide, options: PreprocessTransactionOptions): Promise<[OptimalSwapExchange<LitePsmData>, ExchangeTxInfo]>;
|
|
46
|
+
getDexParam(srcToken: Address, destToken: Address, srcAmount: NumberAsString, destAmount: NumberAsString, recipient: Address, data: LitePsmData, side: SwapSide): DexExchangeParam;
|
|
47
|
+
getDirectParamV6(srcToken: Address, destToken: Address, fromAmount: NumberAsString, toAmount: NumberAsString, quotedAmount: NumberAsString, data: LitePsmData, side: SwapSide, permit: string, uuid: string, partnerAndFee: string, beneficiary: string, blockNumber: number, contractMethod: string): {
|
|
48
|
+
params: LitePsmDirectPayload;
|
|
49
|
+
encoder: (...params: (string | LitePsmDirectPayload)[]) => string;
|
|
50
|
+
networkFee: string;
|
|
51
|
+
};
|
|
52
|
+
getTopPoolsForToken(tokenAddress: Address, limit: number): Promise<PoolLiquidity[]>;
|
|
53
|
+
}
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.LitePsm = void 0;
|
|
30
|
+
const abi_1 = require("@ethersproject/abi");
|
|
31
|
+
const constants_1 = require("../../constants");
|
|
32
|
+
const CALLDATA_GAS_COST = __importStar(require("../../calldata-gas-cost"));
|
|
33
|
+
const utils_1 = require("../../utils");
|
|
34
|
+
const simple_exchange_1 = require("../simple-exchange");
|
|
35
|
+
const config_1 = require("./config");
|
|
36
|
+
const psm_json_1 = __importDefault(require("../../abi/lite-psm/psm.json"));
|
|
37
|
+
const bigint_constants_1 = require("../../bigint-constants");
|
|
38
|
+
const types_1 = require("../../executor/types");
|
|
39
|
+
const bytes_1 = require("@ethersproject/bytes");
|
|
40
|
+
const core_1 = require("@paraswap/core");
|
|
41
|
+
const ethers_1 = require("ethers");
|
|
42
|
+
const lite_psm_event_pool_1 = require("./lite-psm-event-pool");
|
|
43
|
+
const utils_2 = require("../../executor/utils");
|
|
44
|
+
const psmInterface = new abi_1.Interface(psm_json_1.default);
|
|
45
|
+
const WAD = bigint_constants_1.BI_POWS[18];
|
|
46
|
+
const ceilDiv = (a, b) => (a + b - 1n) / b;
|
|
47
|
+
class LitePsm extends simple_exchange_1.SimpleExchange {
|
|
48
|
+
constructor(network, dexKey, dexHelper, dai = config_1.LitePsmConfig[dexKey][network].dai, vatAddress = config_1.LitePsmConfig[dexKey][network].vatAddress, poolConfigs = config_1.LitePsmConfig[dexKey][network].pools) {
|
|
49
|
+
super(dexHelper, dexKey);
|
|
50
|
+
this.network = network;
|
|
51
|
+
this.dexHelper = dexHelper;
|
|
52
|
+
this.dai = dai;
|
|
53
|
+
this.vatAddress = vatAddress;
|
|
54
|
+
this.poolConfigs = poolConfigs;
|
|
55
|
+
// warning: There is limit on swap
|
|
56
|
+
this.hasConstantPriceLargeAmounts = true;
|
|
57
|
+
this.isFeeOnTransferSupported = false;
|
|
58
|
+
this.logger = dexHelper.getLogger(dexKey);
|
|
59
|
+
this.eventPools = {};
|
|
60
|
+
poolConfigs.forEach(p => (this.eventPools[p.gem.address.toLowerCase()] = new lite_psm_event_pool_1.LitePsmEventPool(dexKey, network, dexHelper, this.logger, p, this.vatAddress)));
|
|
61
|
+
}
|
|
62
|
+
static getDirectFunctionNameV6() {
|
|
63
|
+
return [core_1.ContractMethodV6.swapExactAmountInOutOnMakerPSM];
|
|
64
|
+
}
|
|
65
|
+
async initializePricing(blockNumber) {
|
|
66
|
+
const poolStates = await (0, lite_psm_event_pool_1.getOnChainState)(this.dexHelper.multiContract, this.poolConfigs, this.vatAddress, blockNumber, config_1.LitePsmConfig[this.dexKey][this.network].dai.address);
|
|
67
|
+
await Promise.all(this.poolConfigs.map(async (p, i) => {
|
|
68
|
+
const eventPool = this.eventPools[p.gem.address.toLowerCase()];
|
|
69
|
+
await eventPool.initialize(blockNumber, {
|
|
70
|
+
state: poolStates[i],
|
|
71
|
+
});
|
|
72
|
+
}));
|
|
73
|
+
}
|
|
74
|
+
// Returns the list of contract adapters (name and index)
|
|
75
|
+
// for a buy/sell. Return null if there are no adapters.
|
|
76
|
+
getAdapters(side) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
getEventPool(srcToken, destToken) {
|
|
80
|
+
const srcAddress = srcToken.address.toLowerCase();
|
|
81
|
+
const destAddress = destToken.address.toLowerCase();
|
|
82
|
+
return ((srcAddress === this.dai.address && this.eventPools[destAddress]) ||
|
|
83
|
+
(destAddress === this.dai.address && this.eventPools[srcAddress]) ||
|
|
84
|
+
null);
|
|
85
|
+
}
|
|
86
|
+
// Returns list of pool identifiers that can be used
|
|
87
|
+
// for a given swap. poolIdentifiers must be unique
|
|
88
|
+
// across DEXes.
|
|
89
|
+
async getPoolIdentifiers(srcToken, destToken, side, blockNumber) {
|
|
90
|
+
const eventPool = this.getEventPool(srcToken, destToken);
|
|
91
|
+
if (!eventPool)
|
|
92
|
+
return [];
|
|
93
|
+
return [eventPool.getIdentifier()];
|
|
94
|
+
}
|
|
95
|
+
async getPoolState(pool, blockNumber) {
|
|
96
|
+
const eventState = pool.getState(blockNumber);
|
|
97
|
+
if (eventState)
|
|
98
|
+
return eventState;
|
|
99
|
+
const onChainState = await pool.generateState(blockNumber);
|
|
100
|
+
pool.setState(onChainState, blockNumber);
|
|
101
|
+
return onChainState;
|
|
102
|
+
}
|
|
103
|
+
computePrices(isSrcDai, to18ConversionFactor, side, amounts, poolState) {
|
|
104
|
+
const sellGemCheck = (dart) => {
|
|
105
|
+
return dart <= poolState.daiBalance;
|
|
106
|
+
};
|
|
107
|
+
const buyGemCheck = (dart) => {
|
|
108
|
+
return dart <= poolState.gemBalance * to18ConversionFactor;
|
|
109
|
+
};
|
|
110
|
+
return amounts.map(a => {
|
|
111
|
+
if (side === constants_1.SwapSide.SELL) {
|
|
112
|
+
if (isSrcDai) {
|
|
113
|
+
const gemAmt18 = (a * WAD) / (WAD + poolState.tout);
|
|
114
|
+
if (buyGemCheck(gemAmt18))
|
|
115
|
+
return gemAmt18 / to18ConversionFactor;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
const gemAmt18 = to18ConversionFactor * a;
|
|
119
|
+
if (sellGemCheck(gemAmt18))
|
|
120
|
+
return gemAmt18 - (gemAmt18 * poolState.tin) / WAD;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
if (isSrcDai) {
|
|
125
|
+
const gemAmt18 = to18ConversionFactor * a;
|
|
126
|
+
if (buyGemCheck(gemAmt18))
|
|
127
|
+
return gemAmt18 + (gemAmt18 * poolState.tout) / WAD;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
const gemAmt18 = (a * WAD) / (WAD - poolState.tin);
|
|
131
|
+
if (sellGemCheck(gemAmt18))
|
|
132
|
+
return gemAmt18 / to18ConversionFactor;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return 0n;
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
// Returns pool prices for amounts.
|
|
139
|
+
// If limitPools is defined only pools in limitPools
|
|
140
|
+
// should be used. If limitPools is undefined then
|
|
141
|
+
// any pools can be used.
|
|
142
|
+
async getPricesVolume(srcToken, destToken, amounts, side, blockNumber, limitPools) {
|
|
143
|
+
const eventPool = this.getEventPool(srcToken, destToken);
|
|
144
|
+
if (!eventPool)
|
|
145
|
+
return null;
|
|
146
|
+
const poolIdentifier = eventPool.getIdentifier();
|
|
147
|
+
if (limitPools && !limitPools.includes(poolIdentifier))
|
|
148
|
+
return null;
|
|
149
|
+
const poolState = await this.getPoolState(eventPool, blockNumber);
|
|
150
|
+
const unitVolume = (0, utils_1.getBigIntPow)((side === constants_1.SwapSide.SELL ? srcToken : destToken).decimals);
|
|
151
|
+
const isSrcDai = srcToken.address.toLowerCase() === this.dai.address;
|
|
152
|
+
const gem = isSrcDai ? destToken : srcToken;
|
|
153
|
+
const toll = (side === constants_1.SwapSide.SELL && isSrcDai) ||
|
|
154
|
+
(side === constants_1.SwapSide.BUY && !isSrcDai)
|
|
155
|
+
? poolState.tout
|
|
156
|
+
: poolState.tin;
|
|
157
|
+
const [unit, ...prices] = this.computePrices(isSrcDai, eventPool.to18ConversionFactor, side, [unitVolume, ...amounts], poolState);
|
|
158
|
+
return [
|
|
159
|
+
{
|
|
160
|
+
prices,
|
|
161
|
+
unit,
|
|
162
|
+
data: {
|
|
163
|
+
toll: toll.toString(),
|
|
164
|
+
psmAddress: eventPool.poolConfig.psmAddress,
|
|
165
|
+
gemJoinAddress: eventPool.poolConfig.gemJoinAddress,
|
|
166
|
+
gemDecimals: gem.decimals,
|
|
167
|
+
},
|
|
168
|
+
poolAddresses: [eventPool.poolConfig.psmAddress],
|
|
169
|
+
exchange: this.dexKey,
|
|
170
|
+
gasCost: isSrcDai ? 80000 : 100000,
|
|
171
|
+
poolIdentifier,
|
|
172
|
+
},
|
|
173
|
+
];
|
|
174
|
+
}
|
|
175
|
+
// Returns estimated gas cost of calldata for this DEX in multiSwap
|
|
176
|
+
getCalldataGasCost(poolPrices) {
|
|
177
|
+
return (CALLDATA_GAS_COST.DEX_OVERHEAD +
|
|
178
|
+
CALLDATA_GAS_COST.LENGTH_SMALL +
|
|
179
|
+
CALLDATA_GAS_COST.ADDRESS +
|
|
180
|
+
// TODO: pools have toll as zero currently but may change
|
|
181
|
+
CALLDATA_GAS_COST.ZERO +
|
|
182
|
+
// Either 1 (18 decimals) or 1e12 = 0xe8d4a51000 (6 decimals)
|
|
183
|
+
CALLDATA_GAS_COST.wordNonZeroBytes(poolPrices.data.gemDecimals === 6 ? 4 : 1));
|
|
184
|
+
}
|
|
185
|
+
getPsmParams(srcToken, srcAmount, destAmount, data, side) {
|
|
186
|
+
const isSrcDai = srcToken.toLowerCase() === this.dai.address;
|
|
187
|
+
const to18ConversionFactor = (0, utils_1.getBigIntPow)(18 - data.gemDecimals);
|
|
188
|
+
if (side === constants_1.SwapSide.SELL) {
|
|
189
|
+
if (isSrcDai) {
|
|
190
|
+
const gemAmt18 = (BigInt(srcAmount) * WAD) / (WAD + BigInt(data.toll));
|
|
191
|
+
return {
|
|
192
|
+
isGemSell: false,
|
|
193
|
+
gemAmount: (gemAmt18 / to18ConversionFactor).toString(),
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
return { isGemSell: true, gemAmount: srcAmount };
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
if (isSrcDai) {
|
|
202
|
+
return { isGemSell: false, gemAmount: destAmount };
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
const gemAmt = ceilDiv(BigInt(destAmount) * WAD, (WAD - BigInt(data.toll)) * to18ConversionFactor);
|
|
206
|
+
return {
|
|
207
|
+
isGemSell: true,
|
|
208
|
+
gemAmount: gemAmt.toString(),
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
// Encode params required by the exchange adapter
|
|
214
|
+
// Used for multiSwap, buy & megaSwap
|
|
215
|
+
getAdapterParam(srcToken, destToken, srcAmount, destAmount, data, side) {
|
|
216
|
+
const to18ConversionFactor = (0, utils_1.getBigIntPow)(18 - data.gemDecimals);
|
|
217
|
+
const payload = this.abiCoder.encodeParameter({
|
|
218
|
+
ParentStruct: {
|
|
219
|
+
gemJoinAddress: 'address',
|
|
220
|
+
toll: 'uint256',
|
|
221
|
+
to18ConversionFactor: 'uint256',
|
|
222
|
+
},
|
|
223
|
+
}, {
|
|
224
|
+
gemJoinAddress: data.gemJoinAddress,
|
|
225
|
+
toll: data.toll,
|
|
226
|
+
to18ConversionFactor,
|
|
227
|
+
});
|
|
228
|
+
return {
|
|
229
|
+
targetExchange: data.psmAddress,
|
|
230
|
+
networkFee: '0',
|
|
231
|
+
payload,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
// Encode call data used by simpleSwap like routers
|
|
235
|
+
// Used for simpleSwap & simpleBuy
|
|
236
|
+
async getSimpleParam(srcToken, destToken, srcAmount, destAmount, data, side) {
|
|
237
|
+
const { isGemSell, gemAmount } = this.getPsmParams(srcToken, srcAmount, destAmount, data, side);
|
|
238
|
+
const swapData = psmInterface.encodeFunctionData(isGemSell ? 'sellGem' : 'buyGem', [this.augustusAddress, gemAmount]);
|
|
239
|
+
return this.buildSimpleParamWithoutWETHConversion(srcToken, srcAmount, destToken, destAmount, swapData, data.psmAddress, isGemSell ? data.gemJoinAddress : data.psmAddress);
|
|
240
|
+
}
|
|
241
|
+
getTokenFromAddress(address) {
|
|
242
|
+
return { address, decimals: 0 };
|
|
243
|
+
}
|
|
244
|
+
async preProcessTransaction(optimalSwapExchange, srcToken, destToken, side, options) {
|
|
245
|
+
if (!optimalSwapExchange.data) {
|
|
246
|
+
throw new Error(`Error_${this.dexKey}_preProcessTransaction payload is not received`);
|
|
247
|
+
}
|
|
248
|
+
let isApproved = false;
|
|
249
|
+
// isApproved is only used in direct method and available only for v6, then no need to check approve for v5
|
|
250
|
+
// because it's either done in getSimpleParam or approve call in the adapter smart contract
|
|
251
|
+
if (options.version === core_1.ParaSwapVersion.V6 && options.isDirectMethod) {
|
|
252
|
+
isApproved = await this.dexHelper.augustusApprovals.hasApproval(options.executionContractAddress, srcToken.address, srcToken.address.toLowerCase() === this.dai.address.toLowerCase()
|
|
253
|
+
? optimalSwapExchange.data.psmAddress
|
|
254
|
+
: optimalSwapExchange.data.gemJoinAddress);
|
|
255
|
+
}
|
|
256
|
+
return [
|
|
257
|
+
{
|
|
258
|
+
...optimalSwapExchange,
|
|
259
|
+
data: { ...optimalSwapExchange.data, isApproved },
|
|
260
|
+
},
|
|
261
|
+
{},
|
|
262
|
+
];
|
|
263
|
+
}
|
|
264
|
+
getDexParam(srcToken, destToken, srcAmount, destAmount, recipient, data, side) {
|
|
265
|
+
const { isGemSell, gemAmount } = this.getPsmParams(srcToken, srcAmount, destAmount, data, side);
|
|
266
|
+
let exchangeData = psmInterface.encodeFunctionData(isGemSell ? 'sellGem' : 'buyGem', [recipient, gemAmount]);
|
|
267
|
+
// append toll and to18ConversionFactor & set specialDexFlag = SWAP_ON_MAKER_PSM to
|
|
268
|
+
// - `buyGem` on Ex1 & Ex2
|
|
269
|
+
// - `sellGem` on Ex3
|
|
270
|
+
let specialDexFlag = types_1.SpecialDex.DEFAULT;
|
|
271
|
+
if ((side === constants_1.SwapSide.SELL && !isGemSell) ||
|
|
272
|
+
(side === constants_1.SwapSide.BUY && isGemSell)) {
|
|
273
|
+
exchangeData = (0, bytes_1.hexConcat)([
|
|
274
|
+
exchangeData,
|
|
275
|
+
(0, bytes_1.hexZeroPad)((0, bytes_1.hexlify)(BigInt(data.toll)), 32),
|
|
276
|
+
(0, bytes_1.hexZeroPad)((0, bytes_1.hexlify)((0, utils_1.getBigIntPow)(18 - data.gemDecimals)), 32),
|
|
277
|
+
]);
|
|
278
|
+
specialDexFlag = types_1.SpecialDex.SWAP_ON_MAKER_PSM;
|
|
279
|
+
}
|
|
280
|
+
return {
|
|
281
|
+
needWrapNative: this.needWrapNative,
|
|
282
|
+
dexFuncHasRecipient: true,
|
|
283
|
+
exchangeData,
|
|
284
|
+
targetExchange: data.psmAddress,
|
|
285
|
+
specialDexFlag,
|
|
286
|
+
spender: isGemSell ? data.gemJoinAddress : data.psmAddress,
|
|
287
|
+
returnAmountPos: (0, utils_2.extractReturnAmountPosition)(psmInterface, isGemSell ? 'sellGem' : 'buyGem', isGemSell ? 'daiOutWad' : 'daiInWad'),
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
getDirectParamV6(srcToken, destToken, fromAmount, toAmount, quotedAmount, data, side, permit, uuid, partnerAndFee, beneficiary, blockNumber, contractMethod) {
|
|
291
|
+
if (!contractMethod)
|
|
292
|
+
throw new Error(`contractMethod need to be passed`);
|
|
293
|
+
if (!LitePsm.getDirectFunctionNameV6().includes(contractMethod)) {
|
|
294
|
+
throw new Error(`Invalid contract method ${contractMethod}`);
|
|
295
|
+
}
|
|
296
|
+
const beneficiaryParam = ethers_1.BigNumber.from(beneficiary);
|
|
297
|
+
const approveParam = !data.isApproved
|
|
298
|
+
? ethers_1.BigNumber.from(1).shl(255)
|
|
299
|
+
: ethers_1.BigNumber.from(0);
|
|
300
|
+
const directionParam = side === constants_1.SwapSide.SELL ? ethers_1.BigNumber.from(0) : ethers_1.BigNumber.from(1).shl(254);
|
|
301
|
+
const beneficiaryDirectionApproveFlag = beneficiaryParam
|
|
302
|
+
.or(directionParam)
|
|
303
|
+
.or(approveParam);
|
|
304
|
+
const to18ConversionFactor = (0, utils_1.getBigIntPow)(18 - data.gemDecimals);
|
|
305
|
+
const metadata = (0, bytes_1.hexConcat)([
|
|
306
|
+
(0, bytes_1.hexZeroPad)((0, utils_1.uuidToBytes16)(uuid), 16),
|
|
307
|
+
(0, bytes_1.hexZeroPad)((0, bytes_1.hexlify)(blockNumber), 16),
|
|
308
|
+
]);
|
|
309
|
+
const params = [
|
|
310
|
+
srcToken,
|
|
311
|
+
// not used on the contract, but used for analytics
|
|
312
|
+
destToken,
|
|
313
|
+
fromAmount,
|
|
314
|
+
toAmount,
|
|
315
|
+
data.toll,
|
|
316
|
+
to18ConversionFactor.toString(),
|
|
317
|
+
data.psmAddress,
|
|
318
|
+
data.gemJoinAddress,
|
|
319
|
+
metadata,
|
|
320
|
+
beneficiaryDirectionApproveFlag.toString(),
|
|
321
|
+
];
|
|
322
|
+
const payload = [params, permit];
|
|
323
|
+
const encoder = (...params) => {
|
|
324
|
+
return this.augustusV6Interface.encodeFunctionData(core_1.ContractMethodV6.swapExactAmountInOutOnMakerPSM, [...params]);
|
|
325
|
+
};
|
|
326
|
+
return { params: payload, encoder, networkFee: '0' };
|
|
327
|
+
}
|
|
328
|
+
// Returns list of top pools based on liquidity. Max
|
|
329
|
+
// limit number pools should be returned.
|
|
330
|
+
async getTopPoolsForToken(tokenAddress, limit) {
|
|
331
|
+
const _tokenAddress = tokenAddress.toLowerCase();
|
|
332
|
+
// Liquidity depends on the swapping side hence we simply use the min
|
|
333
|
+
// Its always in terms of stable coin hence liquidityUSD = liquidity
|
|
334
|
+
const minLiq = (poolState, decimals) => {
|
|
335
|
+
const buyLimit = poolState.gemBalance * (0, utils_1.getBigIntPow)(18 - decimals);
|
|
336
|
+
const sellLimit = poolState.daiBalance;
|
|
337
|
+
return (2 *
|
|
338
|
+
parseInt(((buyLimit > sellLimit ? sellLimit : buyLimit) / bigint_constants_1.BI_POWS[18]).toString()));
|
|
339
|
+
};
|
|
340
|
+
const isDai = _tokenAddress === this.dai.address;
|
|
341
|
+
const validPoolConfigs = isDai
|
|
342
|
+
? this.poolConfigs
|
|
343
|
+
: this.eventPools[_tokenAddress]
|
|
344
|
+
? [this.eventPools[_tokenAddress].poolConfig]
|
|
345
|
+
: [];
|
|
346
|
+
if (!validPoolConfigs.length)
|
|
347
|
+
return [];
|
|
348
|
+
// const poolStates = await getOnChainState(
|
|
349
|
+
// this.dexHelper.multiContract,
|
|
350
|
+
// validPoolConfigs,
|
|
351
|
+
// this.vatAddress,
|
|
352
|
+
// 'latest',
|
|
353
|
+
// );
|
|
354
|
+
const blockNumber = this.dexHelper.blockManager.getLatestBlockNumber();
|
|
355
|
+
const poolStates = await Promise.all(Object.values(this.eventPools).map(e => this.getPoolState(e, blockNumber)));
|
|
356
|
+
return validPoolConfigs.map((p, i) => ({
|
|
357
|
+
exchange: this.dexKey,
|
|
358
|
+
address: p.psmAddress,
|
|
359
|
+
liquidityUSD: minLiq(poolStates[i], p.gem.decimals),
|
|
360
|
+
connectorTokens: [isDai ? p.gem : this.dai],
|
|
361
|
+
}));
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
exports.LitePsm = LitePsm;
|
|
365
|
+
LitePsm.dexKeysWithNetwork = (0, utils_1.getDexKeysWithNetwork)(config_1.LitePsmConfig);
|
|
366
|
+
//# sourceMappingURL=lite-psm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lite-psm.js","sourceRoot":"","sources":["../../../src/dex/lite-psm/lite-psm.ts"],"names":[],"mappings":"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"}
|