@paraswap/dex-lib 3.8.13-arusd-fxusd.5 → 3.8.13-arusd-fxusd.7
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/dex/concentrator-arusd/concentrator-arusd-event.d.ts +2 -1
- package/build/dex/concentrator-arusd/concentrator-arusd-event.js +16 -2
- package/build/dex/concentrator-arusd/concentrator-arusd-event.js.map +1 -1
- package/build/dex/concentrator-arusd/concentrator-arusd.js +6 -7
- package/build/dex/concentrator-arusd/concentrator-arusd.js.map +1 -1
- package/build/dex/fx-protocol-rusd/fx-protocol-rusd-event.d.ts +3 -2
- package/build/dex/fx-protocol-rusd/fx-protocol-rusd-event.js +27 -15
- package/build/dex/fx-protocol-rusd/fx-protocol-rusd-event.js.map +1 -1
- package/build/dex/fx-protocol-rusd/fx-protocol-rusd.d.ts +2 -2
- package/build/dex/fx-protocol-rusd/fx-protocol-rusd.js +10 -31
- package/build/dex/fx-protocol-rusd/fx-protocol-rusd.js.map +1 -1
- package/package.json +1 -1
- package/src/dex/concentrator-arusd/concentrator-arusd-e2e.test.ts +1 -1
- package/src/dex/concentrator-arusd/concentrator-arusd-event.ts +26 -4
- package/src/dex/concentrator-arusd/concentrator-arusd.ts +14 -9
- package/src/dex/fx-protocol-rusd/fx-protocol-e2e.test.ts +1 -1
- package/src/dex/fx-protocol-rusd/fx-protocol-events.test.ts +3 -3
- package/src/dex/fx-protocol-rusd/fx-protocol-rusd-event.ts +41 -13
- package/src/dex/fx-protocol-rusd/fx-protocol-rusd.ts +22 -54
|
@@ -12,5 +12,6 @@ export declare class ConcentratorArusdEvent extends StatefulEventSubscriber<Conc
|
|
|
12
12
|
constructor(parentName: string, dexHelper: IDexHelper, poolAddress: Address, poolInterface: Interface, logger: Logger);
|
|
13
13
|
protected processLog(state: DeepReadonly<ConcentratorArusdState>, log: Readonly<Log>): AsyncOrSync<DeepReadonly<ConcentratorArusdState> | null>;
|
|
14
14
|
generateState(blockNumber?: number | 'latest'): Promise<DeepReadonly<ConcentratorArusdState>>;
|
|
15
|
-
getPrice(blockNumber: number, ethAmount: bigint, is_deposit: boolean): bigint
|
|
15
|
+
getPrice(blockNumber: number, ethAmount: bigint, is_deposit: boolean): Promise<bigint>;
|
|
16
|
+
getOrGenerateState(blockNumber: number): Promise<DeepReadonly<ConcentratorArusdState> | null>;
|
|
16
17
|
}
|
|
@@ -36,8 +36,8 @@ class ConcentratorArusdEvent extends stateful_event_subscriber_1.StatefulEventSu
|
|
|
36
36
|
const state = await (0, utils_1.getOnChainState)(this.dexHelper.multiContract, this.poolAddress, this.poolInterface, blockNumber);
|
|
37
37
|
return state;
|
|
38
38
|
}
|
|
39
|
-
getPrice(blockNumber, ethAmount, is_deposit) {
|
|
40
|
-
const state = this.
|
|
39
|
+
async getPrice(blockNumber, ethAmount, is_deposit) {
|
|
40
|
+
const state = await this.getOrGenerateState(blockNumber);
|
|
41
41
|
if (!state)
|
|
42
42
|
throw new Error('Cannot compute price');
|
|
43
43
|
const { totalSupply, totalAssets } = state;
|
|
@@ -47,6 +47,20 @@ class ConcentratorArusdEvent extends stateful_event_subscriber_1.StatefulEventSu
|
|
|
47
47
|
}
|
|
48
48
|
return BigInt((nav * ethAmount) / bigint_constants_1.BI_POWS[18]);
|
|
49
49
|
}
|
|
50
|
+
async getOrGenerateState(blockNumber) {
|
|
51
|
+
const state = this.getState(blockNumber);
|
|
52
|
+
if (state) {
|
|
53
|
+
return state;
|
|
54
|
+
}
|
|
55
|
+
this.logger.debug(`No state found for ${this.addressesSubscribed[0]}, generating new one`);
|
|
56
|
+
const newState = await this.generateState(blockNumber);
|
|
57
|
+
if (!newState) {
|
|
58
|
+
this.logger.debug(`Could not regenerate state for ${this.addressesSubscribed[0]}`);
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
this.setState(newState, blockNumber);
|
|
62
|
+
return newState;
|
|
63
|
+
}
|
|
50
64
|
}
|
|
51
65
|
exports.ConcentratorArusdEvent = ConcentratorArusdEvent;
|
|
52
66
|
//# sourceMappingURL=concentrator-arusd-event.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"concentrator-arusd-event.js","sourceRoot":"","sources":["../../../src/dex/concentrator-arusd/concentrator-arusd-event.ts"],"names":[],"mappings":";;;;;;AAAA,oDAAuB;AAGvB,+EAA0E;AAI1E,6DAAiD;
|
|
1
|
+
{"version":3,"file":"concentrator-arusd-event.js","sourceRoot":"","sources":["../../../src/dex/concentrator-arusd/concentrator-arusd-event.ts"],"names":[],"mappings":"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"}
|
|
@@ -90,10 +90,9 @@ class ConcentratorArusd extends simple_exchange_1.SimpleExchange {
|
|
|
90
90
|
return [`${this.dexKey}_${this.config.arUSDAddress}`];
|
|
91
91
|
}
|
|
92
92
|
async getPricesVolume(srcToken, destToken, amounts, side, blockNumber, limitPools) {
|
|
93
|
-
|
|
94
|
-
|
|
93
|
+
// note: BUY is not supported
|
|
94
|
+
if (side === constants_1.SwapSide.BUY)
|
|
95
95
|
return null;
|
|
96
|
-
}
|
|
97
96
|
const isArUSDSwapToken = this.is_arUSD_swap_token(srcToken.address, destToken.address);
|
|
98
97
|
if (!isArUSDSwapToken) {
|
|
99
98
|
return null;
|
|
@@ -101,11 +100,11 @@ class ConcentratorArusd extends simple_exchange_1.SimpleExchange {
|
|
|
101
100
|
const is_deposit = !!this.is_rUSD(srcToken.address);
|
|
102
101
|
const pool = this.concentratorArusdEvent;
|
|
103
102
|
const unitIn = bigint_constants_1.BI_POWS[18];
|
|
104
|
-
const unitOut = pool.getPrice(blockNumber, unitIn, is_deposit);
|
|
105
|
-
const amountsOut = amounts.map(amountIn => {
|
|
106
|
-
const _newPrice = pool.getPrice(blockNumber, amountIn, is_deposit);
|
|
103
|
+
const unitOut = await pool.getPrice(blockNumber, unitIn, is_deposit);
|
|
104
|
+
const amountsOut = await Promise.all(amounts.map(async (amountIn) => {
|
|
105
|
+
const _newPrice = await pool.getPrice(blockNumber, amountIn, is_deposit);
|
|
107
106
|
return _newPrice;
|
|
108
|
-
});
|
|
107
|
+
}));
|
|
109
108
|
return [
|
|
110
109
|
{
|
|
111
110
|
unit: unitOut,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"concentrator-arusd.js","sourceRoot":"","sources":["../../../src/dex/concentrator-arusd/concentrator-arusd.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,+CAAoD;AACpD,2EAA6D;AAC7D,uCAAoD;AAIpD,wDAAoD;AACpD,qCAAmD;AACnD,4CAA+C;AAC/C,mFAA0D;AAC1D,2FAAkE;AAClE,gDAAmE;AACnE,6DAAiD;AACjD,yEAAoE;AACpE,mCAA0C;AAE1C,MAAa,iBACX,SAAQ,gCAAc;IAmBtB,YACW,OAAgB,EAChB,MAAc,EACd,SAAqB,EACpB,WAAW,EAAE;QAEvB,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QALhB,YAAO,GAAP,OAAO,CAAS;QAChB,WAAM,GAAN,MAAM,CAAQ;QACd,cAAS,GAAT,SAAS,CAAY;QACpB,aAAQ,GAAR,QAAQ,CAAK;QAhBhB,iCAA4B,GAAG,IAAI,CAAC;QACpC,mBAAc,GAAG,IAAI,CAAC;QAEtB,6BAAwB,GAAG,KAAK,CAAC;QAgBxC,MAAM,MAAM,GAAG,gCAAuB,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG;YACZ,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE;YAC7C,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE;YAC/C,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE;SACxD,CAAC;QACF,IAAI,CAAC,cAAc,GAAG,IAAI,eAAS,CAAC,wBAAa,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC,sBAAsB,GAAG,IAAI,iDAAsB,CACtD,IAAI,CAAC,MAAM,EACX,SAAS,EACT,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAC5B,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,MAAM,CACZ,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,WAAmB;QACzC,MAAM,SAAS,GAAG,MAAM,IAAA,uBAAe,EACrC,IAAI,CAAC,SAAS,CAAC,aAAa,EAC5B,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAC5B,IAAI,CAAC,cAAc,EACnB,WAAW,CACZ,CAAC;QAEF,MAAM,IAAI,CAAC,sBAAsB,CAAC,UAAU,CAAC,WAAW,EAAE;YACxD,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;IACL,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,OAAO,KAAK,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;IAC1D,CAAC;IAED,OAAO,CAAC,KAAa;QACnB,OAAO,KAAK,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;IACzD,CAAC;IAED,mBAAmB,CAAC,QAAgB,EAAE,SAAiB;QACrD,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE;YACtD,OAAO,IAAI,CAAC;SACb;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YACtD,OAAO,IAAI,CAAC;SACb;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,WAAW,CAAC,IAAc;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,QAAe,EACf,SAAgB,EAChB,IAAc,EACd,WAAmB;QAEnB,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE;YAClE,OAAO,EAAE,CAAC;SACX;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,QAAe,EACf,SAAgB,EAChB,OAAiB,EACjB,IAAc,EACd,WAAmB,EACnB,UAAqB;QAErB,
|
|
1
|
+
{"version":3,"file":"concentrator-arusd.js","sourceRoot":"","sources":["../../../src/dex/concentrator-arusd/concentrator-arusd.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import { StatefulEventSubscriber } from '../../stateful-event-subscriber';
|
|
|
4
4
|
import { Address, Log, Logger } from '../../types';
|
|
5
5
|
import { AsyncOrSync, DeepReadonly } from 'ts-essentials';
|
|
6
6
|
import { FxProtocolPoolState } from './types';
|
|
7
|
-
export declare class
|
|
7
|
+
export declare class FxProtocolRusdEvent extends StatefulEventSubscriber<FxProtocolPoolState> {
|
|
8
8
|
protected dexHelper: IDexHelper;
|
|
9
9
|
private marketAddress;
|
|
10
10
|
private marketInterface;
|
|
@@ -13,5 +13,6 @@ export declare class fxProtocolRusdEvent extends StatefulEventSubscriber<FxProto
|
|
|
13
13
|
constructor(parentName: string, dexHelper: IDexHelper, marketAddress: Address, marketInterface: Interface, weETHOracleAddress: Address, weETHOracleIface: Interface, logger: Logger);
|
|
14
14
|
protected processLog(state: DeepReadonly<FxProtocolPoolState>, log: Readonly<Log>): AsyncOrSync<DeepReadonly<FxProtocolPoolState> | null>;
|
|
15
15
|
generateState(blockNumber?: number | 'latest'): Promise<DeepReadonly<FxProtocolPoolState>>;
|
|
16
|
-
getPrice(blockNumber: number, amount: bigint, isRedeem: boolean): bigint
|
|
16
|
+
getPrice(blockNumber: number, amount: bigint, isRedeem: boolean): Promise<bigint>;
|
|
17
|
+
getOrGenerateState(blockNumber: number): Promise<DeepReadonly<FxProtocolPoolState> | null>;
|
|
17
18
|
}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.FxProtocolRusdEvent = void 0;
|
|
4
|
+
const abi_1 = require("@ethersproject/abi");
|
|
4
5
|
const stateful_event_subscriber_1 = require("../../stateful-event-subscriber");
|
|
5
6
|
const bigint_constants_1 = require("../../bigint-constants");
|
|
6
7
|
const utils_1 = require("./utils");
|
|
7
8
|
const ANSWER_UPDATED_TOPICHASH = `0x0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f`;
|
|
8
9
|
const UPDATE_REDEEM_FEE_TOPICHASH = `0xb3d49e95905d108ea668ffe62a85ee16bdc4ff9f122a7137964327ea8e0585ff`;
|
|
9
|
-
class
|
|
10
|
+
class FxProtocolRusdEvent extends stateful_event_subscriber_1.StatefulEventSubscriber {
|
|
10
11
|
constructor(parentName, dexHelper, marketAddress, marketInterface, weETHOracleAddress, weETHOracleIface, logger) {
|
|
11
12
|
super(parentName, 'fxProtocolRusd', dexHelper, logger);
|
|
12
13
|
this.dexHelper = dexHelper;
|
|
@@ -17,16 +18,13 @@ class fxProtocolRusdEvent extends stateful_event_subscriber_1.StatefulEventSubsc
|
|
|
17
18
|
this.addressesSubscribed = [marketAddress, weETHOracleAddress];
|
|
18
19
|
}
|
|
19
20
|
processLog(state, log) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
// redeemFee: BigInt(defaultFeeRatio).toString(),
|
|
28
|
-
// };
|
|
29
|
-
// }
|
|
21
|
+
if (log.topics[0] === UPDATE_REDEEM_FEE_TOPICHASH) {
|
|
22
|
+
const [defaultFeeRatio] = abi_1.defaultAbiCoder.decode(['uint256', 'int256'], log.data);
|
|
23
|
+
return {
|
|
24
|
+
...state,
|
|
25
|
+
redeemFee: BigInt(defaultFeeRatio).toString(),
|
|
26
|
+
};
|
|
27
|
+
}
|
|
30
28
|
if (log.topics[0] === ANSWER_UPDATED_TOPICHASH) {
|
|
31
29
|
return {
|
|
32
30
|
...state,
|
|
@@ -39,8 +37,8 @@ class fxProtocolRusdEvent extends stateful_event_subscriber_1.StatefulEventSubsc
|
|
|
39
37
|
const state = await (0, utils_1.getOnChainState)(this.dexHelper.multiContract, this.marketAddress, this.marketInterface, this.weETHOracleAddress, this.weETHOracleIface, blockNumber);
|
|
40
38
|
return state;
|
|
41
39
|
}
|
|
42
|
-
getPrice(blockNumber, amount, isRedeem) {
|
|
43
|
-
const state = this.
|
|
40
|
+
async getPrice(blockNumber, amount, isRedeem) {
|
|
41
|
+
const state = await this.getOrGenerateState(blockNumber);
|
|
44
42
|
if (!state)
|
|
45
43
|
throw new Error('Cannot compute price');
|
|
46
44
|
const { nav, redeemFee, weETHPrice } = state;
|
|
@@ -54,6 +52,20 @@ class fxProtocolRusdEvent extends stateful_event_subscriber_1.StatefulEventSubsc
|
|
|
54
52
|
return BigInt((baseTokenPrice * amount) / BigInt(nav));
|
|
55
53
|
}
|
|
56
54
|
}
|
|
55
|
+
async getOrGenerateState(blockNumber) {
|
|
56
|
+
const state = this.getState(blockNumber);
|
|
57
|
+
if (state) {
|
|
58
|
+
return state;
|
|
59
|
+
}
|
|
60
|
+
this.logger.debug(`No state found for ${this.addressesSubscribed[0]}, generating new one`);
|
|
61
|
+
const newState = await this.generateState(blockNumber);
|
|
62
|
+
if (!newState) {
|
|
63
|
+
this.logger.debug(`Could not regenerate state for ${this.addressesSubscribed[0]}`);
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
this.setState(newState, blockNumber);
|
|
67
|
+
return newState;
|
|
68
|
+
}
|
|
57
69
|
}
|
|
58
|
-
exports.
|
|
70
|
+
exports.FxProtocolRusdEvent = FxProtocolRusdEvent;
|
|
59
71
|
//# sourceMappingURL=fx-protocol-rusd-event.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fx-protocol-rusd-event.js","sourceRoot":"","sources":["../../../src/dex/fx-protocol-rusd/fx-protocol-rusd-event.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"fx-protocol-rusd-event.js","sourceRoot":"","sources":["../../../src/dex/fx-protocol-rusd/fx-protocol-rusd-event.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import { IDexHelper } from '../../dex-helper/idex-helper';
|
|
|
5
5
|
import { DexParams, FxProtocolData } from './types';
|
|
6
6
|
import { SimpleExchange } from '../simple-exchange';
|
|
7
7
|
import { Interface } from '@ethersproject/abi';
|
|
8
|
-
import {
|
|
8
|
+
import { FxProtocolRusdEvent } from './fx-protocol-rusd-event';
|
|
9
9
|
export declare class FxProtocolRusd extends SimpleExchange implements IDex<FxProtocolData> {
|
|
10
10
|
readonly network: Network;
|
|
11
11
|
readonly dexKey: string;
|
|
@@ -21,7 +21,7 @@ export declare class FxProtocolRusd extends SimpleExchange implements IDex<FxPro
|
|
|
21
21
|
fxUSDIface: Interface;
|
|
22
22
|
rUSDMarketIface: Interface;
|
|
23
23
|
weETHOracleIface: Interface;
|
|
24
|
-
fxProtocolRusdPool:
|
|
24
|
+
fxProtocolRusdPool: FxProtocolRusdEvent;
|
|
25
25
|
logger: Logger;
|
|
26
26
|
constructor(network: Network, dexKey: string, dexHelper: IDexHelper);
|
|
27
27
|
initializePricing(blockNumber: number): Promise<void>;
|
|
@@ -39,6 +39,7 @@ const weETHOralce_json_1 = __importDefault(require("../../abi/fx-protocol/weETHO
|
|
|
39
39
|
const utils_2 = require("../../executor/utils");
|
|
40
40
|
const fx_protocol_rusd_event_1 = require("./fx-protocol-rusd-event");
|
|
41
41
|
const bigint_constants_1 = require("../../bigint-constants");
|
|
42
|
+
const utils_3 = require("./utils");
|
|
42
43
|
class FxProtocolRusd extends simple_exchange_1.SimpleExchange {
|
|
43
44
|
constructor(network, dexKey, dexHelper) {
|
|
44
45
|
super(dexHelper, dexKey);
|
|
@@ -59,32 +60,13 @@ class FxProtocolRusd extends simple_exchange_1.SimpleExchange {
|
|
|
59
60
|
weETHOracleAddress: config.weETHOracleAddress.toLowerCase(),
|
|
60
61
|
};
|
|
61
62
|
this.logger = dexHelper.getLogger(dexKey);
|
|
62
|
-
this.fxProtocolRusdPool = new fx_protocol_rusd_event_1.
|
|
63
|
+
this.fxProtocolRusdPool = new fx_protocol_rusd_event_1.FxProtocolRusdEvent(this.dexKey, dexHelper, this.config.rUSDWeETHMarketAddress, this.rUSDMarketIface, this.config.weETHOracleAddress, this.weETHOracleIface, this.logger);
|
|
63
64
|
}
|
|
64
65
|
async initializePricing(blockNumber) {
|
|
65
|
-
const
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
callData: this.rUSDMarketIface.encodeFunctionData('fTokenRedeemFeeRatio', []),
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
target: this.config.weETHOracleAddress,
|
|
73
|
-
callData: this.weETHOracleIface.encodeFunctionData('latestAnswer', []),
|
|
74
|
-
},
|
|
75
|
-
])
|
|
76
|
-
.call({}, blockNumber);
|
|
77
|
-
const redeemFee = BigInt(this.rUSDMarketIface.decodeFunctionResult('fTokenRedeemFeeRatio', data.returnData[0])[0]).toString();
|
|
78
|
-
const weETHPrice = BigInt(this.weETHOracleIface.decodeFunctionResult('latestAnswer', data.returnData[1])[0]).toString();
|
|
79
|
-
await Promise.all([
|
|
80
|
-
this.fxProtocolRusdPool.initialize(blockNumber, {
|
|
81
|
-
state: {
|
|
82
|
-
nav: '1000000000000000000',
|
|
83
|
-
redeemFee,
|
|
84
|
-
weETHPrice,
|
|
85
|
-
},
|
|
86
|
-
}),
|
|
87
|
-
]);
|
|
66
|
+
const poolState = await (0, utils_3.getOnChainState)(this.dexHelper.multiContract, this.config.rUSDWeETHMarketAddress, this.rUSDMarketIface, this.config.weETHOracleAddress, this.weETHOracleIface, blockNumber);
|
|
67
|
+
await this.fxProtocolRusdPool.initialize(blockNumber, {
|
|
68
|
+
state: poolState,
|
|
69
|
+
});
|
|
88
70
|
}
|
|
89
71
|
getConfig() {
|
|
90
72
|
return this.config;
|
|
@@ -111,21 +93,18 @@ class FxProtocolRusd extends simple_exchange_1.SimpleExchange {
|
|
|
111
93
|
return [`${this.dexKey}_${this.config.rUSDAddress}`];
|
|
112
94
|
}
|
|
113
95
|
async getPricesVolume(srcToken, destToken, amounts, side, blockNumber, limitPools) {
|
|
114
|
-
|
|
115
|
-
|
|
96
|
+
// note: BUY is not supported
|
|
97
|
+
if (side === constants_1.SwapSide.BUY)
|
|
116
98
|
return null;
|
|
117
|
-
}
|
|
118
99
|
const isRUSDSwapToken = this.is_rUSD_swap_token(srcToken.address, destToken.address);
|
|
119
100
|
if (!isRUSDSwapToken) {
|
|
120
101
|
return null;
|
|
121
102
|
}
|
|
122
103
|
const pool = this.fxProtocolRusdPool;
|
|
123
|
-
if (!pool.getState(blockNumber))
|
|
124
|
-
return null;
|
|
125
104
|
const is_redeem = this.is_weETH(destToken.address);
|
|
126
105
|
const unitIn = bigint_constants_1.BI_POWS[18];
|
|
127
|
-
const unitOut = pool.getPrice(blockNumber, unitIn, is_redeem);
|
|
128
|
-
const amountsOut = amounts.map(_amountIn => pool.getPrice(blockNumber, _amountIn, is_redeem));
|
|
106
|
+
const unitOut = await pool.getPrice(blockNumber, unitIn, is_redeem);
|
|
107
|
+
const amountsOut = await Promise.all(amounts.map(_amountIn => pool.getPrice(blockNumber, _amountIn, is_redeem)));
|
|
129
108
|
return [
|
|
130
109
|
{
|
|
131
110
|
unit: unitOut,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fx-protocol-rusd.js","sourceRoot":"","sources":["../../../src/dex/fx-protocol-rusd/fx-protocol-rusd.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,+CAAoD;AACpD,2EAA6D;AAC7D,uCAAoD;AAIpD,wDAAoD;AACpD,qCAA4C;AAC5C,4CAA6D;AAC7D,kFAAyD;AACzD,wFAA+D;AAC/D,8FAAwE;AAExE,gDAAmE;AACnE,qEAA+D;AAC/D,6DAAiD;
|
|
1
|
+
{"version":3,"file":"fx-protocol-rusd.js","sourceRoot":"","sources":["../../../src/dex/fx-protocol-rusd/fx-protocol-rusd.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -6,7 +6,6 @@ import { Address, Log, Logger } from '../../types';
|
|
|
6
6
|
import { AsyncOrSync, DeepReadonly } from 'ts-essentials';
|
|
7
7
|
import { ConcentratorArusdState } from './types';
|
|
8
8
|
import { BI_POWS } from '../../bigint-constants';
|
|
9
|
-
import { bigIntify } from '../../utils';
|
|
10
9
|
import { getOnChainState } from './utils';
|
|
11
10
|
|
|
12
11
|
export class ConcentratorArusdEvent extends StatefulEventSubscriber<ConcentratorArusdState> {
|
|
@@ -61,12 +60,12 @@ export class ConcentratorArusdEvent extends StatefulEventSubscriber<Concentrator
|
|
|
61
60
|
return state;
|
|
62
61
|
}
|
|
63
62
|
|
|
64
|
-
getPrice(
|
|
63
|
+
async getPrice(
|
|
65
64
|
blockNumber: number,
|
|
66
65
|
ethAmount: bigint,
|
|
67
66
|
is_deposit: boolean,
|
|
68
|
-
): bigint {
|
|
69
|
-
const state = this.
|
|
67
|
+
): Promise<bigint> {
|
|
68
|
+
const state = await this.getOrGenerateState(blockNumber);
|
|
70
69
|
if (!state) throw new Error('Cannot compute price');
|
|
71
70
|
const { totalSupply, totalAssets } = state;
|
|
72
71
|
const nav = (BigInt(totalAssets) * BI_POWS[18]) / BigInt(totalSupply);
|
|
@@ -75,4 +74,27 @@ export class ConcentratorArusdEvent extends StatefulEventSubscriber<Concentrator
|
|
|
75
74
|
}
|
|
76
75
|
return BigInt((nav * ethAmount) / BI_POWS[18]);
|
|
77
76
|
}
|
|
77
|
+
|
|
78
|
+
async getOrGenerateState(
|
|
79
|
+
blockNumber: number,
|
|
80
|
+
): Promise<DeepReadonly<ConcentratorArusdState> | null> {
|
|
81
|
+
const state = this.getState(blockNumber);
|
|
82
|
+
if (state) {
|
|
83
|
+
return state;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
this.logger.debug(
|
|
87
|
+
`No state found for ${this.addressesSubscribed[0]}, generating new one`,
|
|
88
|
+
);
|
|
89
|
+
const newState = await this.generateState(blockNumber);
|
|
90
|
+
|
|
91
|
+
if (!newState) {
|
|
92
|
+
this.logger.debug(
|
|
93
|
+
`Could not regenerate state for ${this.addressesSubscribed[0]}`,
|
|
94
|
+
);
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
this.setState(newState, blockNumber);
|
|
98
|
+
return newState;
|
|
99
|
+
}
|
|
78
100
|
}
|
|
@@ -124,10 +124,9 @@ export class ConcentratorArusd
|
|
|
124
124
|
blockNumber: number,
|
|
125
125
|
limitPools?: string[],
|
|
126
126
|
): Promise<null | ExchangePrices<ConcentratorArusdData>> {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
127
|
+
// note: BUY is not supported
|
|
128
|
+
if (side === SwapSide.BUY) return null;
|
|
129
|
+
|
|
131
130
|
const isArUSDSwapToken = this.is_arUSD_swap_token(
|
|
132
131
|
srcToken.address,
|
|
133
132
|
destToken.address,
|
|
@@ -138,11 +137,17 @@ export class ConcentratorArusd
|
|
|
138
137
|
const is_deposit = !!this.is_rUSD(srcToken.address);
|
|
139
138
|
const pool = this.concentratorArusdEvent;
|
|
140
139
|
const unitIn = BI_POWS[18];
|
|
141
|
-
const unitOut = pool.getPrice(blockNumber, unitIn, is_deposit);
|
|
142
|
-
const amountsOut =
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
140
|
+
const unitOut = await pool.getPrice(blockNumber, unitIn, is_deposit);
|
|
141
|
+
const amountsOut = await Promise.all(
|
|
142
|
+
amounts.map(async amountIn => {
|
|
143
|
+
const _newPrice = await pool.getPrice(
|
|
144
|
+
blockNumber,
|
|
145
|
+
amountIn,
|
|
146
|
+
is_deposit,
|
|
147
|
+
);
|
|
148
|
+
return _newPrice;
|
|
149
|
+
}),
|
|
150
|
+
);
|
|
146
151
|
return [
|
|
147
152
|
{
|
|
148
153
|
unit: unitOut,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import dotenv from 'dotenv';
|
|
2
2
|
dotenv.config();
|
|
3
3
|
|
|
4
|
-
import {
|
|
4
|
+
import { FxProtocolRusdEvent } from './fx-protocol-rusd-event';
|
|
5
5
|
import { FxProtocolConfig } from './config';
|
|
6
6
|
import { Network } from '../../constants';
|
|
7
7
|
import { DummyDexHelper } from '../../dex-helper/index';
|
|
@@ -53,7 +53,7 @@ const dexKey = 'FxProtocolRusd';
|
|
|
53
53
|
const network = Network.MAINNET;
|
|
54
54
|
|
|
55
55
|
async function fetchPoolState(
|
|
56
|
-
fxProtocolPool:
|
|
56
|
+
fxProtocolPool: FxProtocolRusdEvent,
|
|
57
57
|
blockNumber: number,
|
|
58
58
|
): Promise<FxProtocolPoolState> {
|
|
59
59
|
return fxProtocolPool.generateState(blockNumber);
|
|
@@ -73,7 +73,7 @@ describe('FxProtocolRusd Event', function () {
|
|
|
73
73
|
const logger = dexHelper.getLogger(dexKey);
|
|
74
74
|
const config = FxProtocolConfig[dexKey][network];
|
|
75
75
|
|
|
76
|
-
const fxProtocolPool = new
|
|
76
|
+
const fxProtocolPool = new FxProtocolRusdEvent(
|
|
77
77
|
dexKey,
|
|
78
78
|
dexHelper,
|
|
79
79
|
config.rUSDWeETHMarketAddress,
|
|
@@ -11,7 +11,7 @@ import { getOnChainState } from './utils';
|
|
|
11
11
|
const ANSWER_UPDATED_TOPICHASH = `0x0559884fd3a460db3073b7fc896cc77986f16e378210ded43186175bf646fc5f`;
|
|
12
12
|
const UPDATE_REDEEM_FEE_TOPICHASH = `0xb3d49e95905d108ea668ffe62a85ee16bdc4ff9f122a7137964327ea8e0585ff`;
|
|
13
13
|
|
|
14
|
-
export class
|
|
14
|
+
export class FxProtocolRusdEvent extends StatefulEventSubscriber<FxProtocolPoolState> {
|
|
15
15
|
constructor(
|
|
16
16
|
parentName: string,
|
|
17
17
|
protected dexHelper: IDexHelper,
|
|
@@ -29,17 +29,17 @@ export class fxProtocolRusdEvent extends StatefulEventSubscriber<FxProtocolPoolS
|
|
|
29
29
|
state: DeepReadonly<FxProtocolPoolState>,
|
|
30
30
|
log: Readonly<Log>,
|
|
31
31
|
): AsyncOrSync<DeepReadonly<FxProtocolPoolState> | null> {
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
32
|
+
if (log.topics[0] === UPDATE_REDEEM_FEE_TOPICHASH) {
|
|
33
|
+
const [defaultFeeRatio] = defaultAbiCoder.decode(
|
|
34
|
+
['uint256', 'int256'],
|
|
35
|
+
log.data,
|
|
36
|
+
);
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
38
|
+
return {
|
|
39
|
+
...state,
|
|
40
|
+
redeemFee: BigInt(defaultFeeRatio).toString(),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
43
|
|
|
44
44
|
if (log.topics[0] === ANSWER_UPDATED_TOPICHASH) {
|
|
45
45
|
return {
|
|
@@ -47,6 +47,7 @@ export class fxProtocolRusdEvent extends StatefulEventSubscriber<FxProtocolPoolS
|
|
|
47
47
|
weETHPrice: BigInt(log.topics[1]).toString(),
|
|
48
48
|
};
|
|
49
49
|
}
|
|
50
|
+
|
|
50
51
|
return null;
|
|
51
52
|
}
|
|
52
53
|
|
|
@@ -64,8 +65,12 @@ export class fxProtocolRusdEvent extends StatefulEventSubscriber<FxProtocolPoolS
|
|
|
64
65
|
return state;
|
|
65
66
|
}
|
|
66
67
|
|
|
67
|
-
getPrice(
|
|
68
|
-
|
|
68
|
+
async getPrice(
|
|
69
|
+
blockNumber: number,
|
|
70
|
+
amount: bigint,
|
|
71
|
+
isRedeem: boolean,
|
|
72
|
+
): Promise<bigint> {
|
|
73
|
+
const state = await this.getOrGenerateState(blockNumber);
|
|
69
74
|
if (!state) throw new Error('Cannot compute price');
|
|
70
75
|
|
|
71
76
|
const { nav, redeemFee, weETHPrice } = state;
|
|
@@ -81,4 +86,27 @@ export class fxProtocolRusdEvent extends StatefulEventSubscriber<FxProtocolPoolS
|
|
|
81
86
|
return BigInt((baseTokenPrice * amount) / BigInt(nav));
|
|
82
87
|
}
|
|
83
88
|
}
|
|
89
|
+
|
|
90
|
+
async getOrGenerateState(
|
|
91
|
+
blockNumber: number,
|
|
92
|
+
): Promise<DeepReadonly<FxProtocolPoolState> | null> {
|
|
93
|
+
const state = this.getState(blockNumber);
|
|
94
|
+
if (state) {
|
|
95
|
+
return state;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
this.logger.debug(
|
|
99
|
+
`No state found for ${this.addressesSubscribed[0]}, generating new one`,
|
|
100
|
+
);
|
|
101
|
+
const newState = await this.generateState(blockNumber);
|
|
102
|
+
|
|
103
|
+
if (!newState) {
|
|
104
|
+
this.logger.debug(
|
|
105
|
+
`Could not regenerate state for ${this.addressesSubscribed[0]}`,
|
|
106
|
+
);
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
this.setState(newState, blockNumber);
|
|
110
|
+
return newState;
|
|
111
|
+
}
|
|
84
112
|
}
|
|
@@ -23,8 +23,9 @@ import FxMarket_ABI from '../../abi/fx-protocol/FxMarket.json';
|
|
|
23
23
|
import EthWeETHOralce_ABI from '../../abi/fx-protocol/weETHOralce.json';
|
|
24
24
|
|
|
25
25
|
import { extractReturnAmountPosition } from '../../executor/utils';
|
|
26
|
-
import {
|
|
26
|
+
import { FxProtocolRusdEvent } from './fx-protocol-rusd-event';
|
|
27
27
|
import { BI_POWS } from '../../bigint-constants';
|
|
28
|
+
import { getOnChainState } from './utils';
|
|
28
29
|
|
|
29
30
|
export class FxProtocolRusd
|
|
30
31
|
extends SimpleExchange
|
|
@@ -44,7 +45,7 @@ export class FxProtocolRusd
|
|
|
44
45
|
fxUSDIface: Interface;
|
|
45
46
|
rUSDMarketIface: Interface;
|
|
46
47
|
weETHOracleIface: Interface;
|
|
47
|
-
fxProtocolRusdPool:
|
|
48
|
+
fxProtocolRusdPool: FxProtocolRusdEvent;
|
|
48
49
|
logger: Logger;
|
|
49
50
|
|
|
50
51
|
constructor(
|
|
@@ -64,7 +65,7 @@ export class FxProtocolRusd
|
|
|
64
65
|
weETHOracleAddress: config.weETHOracleAddress.toLowerCase(),
|
|
65
66
|
};
|
|
66
67
|
this.logger = dexHelper.getLogger(dexKey);
|
|
67
|
-
this.fxProtocolRusdPool = new
|
|
68
|
+
this.fxProtocolRusdPool = new FxProtocolRusdEvent(
|
|
68
69
|
this.dexKey,
|
|
69
70
|
dexHelper,
|
|
70
71
|
this.config.rUSDWeETHMarketAddress,
|
|
@@ -76,49 +77,18 @@ export class FxProtocolRusd
|
|
|
76
77
|
}
|
|
77
78
|
|
|
78
79
|
async initializePricing(blockNumber: number) {
|
|
79
|
-
const
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
),
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
target: this.config.weETHOracleAddress,
|
|
91
|
-
callData: this.weETHOracleIface.encodeFunctionData(
|
|
92
|
-
'latestAnswer',
|
|
93
|
-
[],
|
|
94
|
-
),
|
|
95
|
-
},
|
|
96
|
-
])
|
|
97
|
-
.call({}, blockNumber);
|
|
98
|
-
|
|
99
|
-
const redeemFee = BigInt(
|
|
100
|
-
this.rUSDMarketIface.decodeFunctionResult(
|
|
101
|
-
'fTokenRedeemFeeRatio',
|
|
102
|
-
data.returnData[0],
|
|
103
|
-
)[0],
|
|
104
|
-
).toString();
|
|
105
|
-
|
|
106
|
-
const weETHPrice = BigInt(
|
|
107
|
-
this.weETHOracleIface.decodeFunctionResult(
|
|
108
|
-
'latestAnswer',
|
|
109
|
-
data.returnData[1],
|
|
110
|
-
)[0],
|
|
111
|
-
).toString();
|
|
80
|
+
const poolState = await getOnChainState(
|
|
81
|
+
this.dexHelper.multiContract,
|
|
82
|
+
this.config.rUSDWeETHMarketAddress,
|
|
83
|
+
this.rUSDMarketIface,
|
|
84
|
+
this.config.weETHOracleAddress,
|
|
85
|
+
this.weETHOracleIface,
|
|
86
|
+
blockNumber,
|
|
87
|
+
);
|
|
112
88
|
|
|
113
|
-
await
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
nav: '1000000000000000000',
|
|
117
|
-
redeemFee,
|
|
118
|
-
weETHPrice,
|
|
119
|
-
},
|
|
120
|
-
}),
|
|
121
|
-
]);
|
|
89
|
+
await this.fxProtocolRusdPool.initialize(blockNumber, {
|
|
90
|
+
state: poolState,
|
|
91
|
+
});
|
|
122
92
|
}
|
|
123
93
|
|
|
124
94
|
getConfig() {
|
|
@@ -165,10 +135,8 @@ export class FxProtocolRusd
|
|
|
165
135
|
blockNumber: number,
|
|
166
136
|
limitPools?: string[],
|
|
167
137
|
): Promise<null | ExchangePrices<FxProtocolData>> {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
return null;
|
|
171
|
-
}
|
|
138
|
+
// note: BUY is not supported
|
|
139
|
+
if (side === SwapSide.BUY) return null;
|
|
172
140
|
|
|
173
141
|
const isRUSDSwapToken = this.is_rUSD_swap_token(
|
|
174
142
|
srcToken.address,
|
|
@@ -178,13 +146,13 @@ export class FxProtocolRusd
|
|
|
178
146
|
return null;
|
|
179
147
|
}
|
|
180
148
|
const pool = this.fxProtocolRusdPool;
|
|
181
|
-
if (!pool.getState(blockNumber)) return null;
|
|
182
|
-
|
|
183
149
|
const is_redeem = this.is_weETH(destToken.address);
|
|
184
150
|
const unitIn = BI_POWS[18];
|
|
185
|
-
const unitOut = pool.getPrice(blockNumber, unitIn, is_redeem);
|
|
186
|
-
const amountsOut =
|
|
187
|
-
|
|
151
|
+
const unitOut = await pool.getPrice(blockNumber, unitIn, is_redeem);
|
|
152
|
+
const amountsOut = await Promise.all(
|
|
153
|
+
amounts.map(_amountIn =>
|
|
154
|
+
pool.getPrice(blockNumber, _amountIn, is_redeem),
|
|
155
|
+
),
|
|
188
156
|
);
|
|
189
157
|
|
|
190
158
|
return [
|