@mixerx/oracles 0.2.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 +674 -0
- package/README.md +139 -0
- package/dist/application/ports/ILogger.d.ts +18 -0
- package/dist/application/ports/ILogger.d.ts.map +1 -0
- package/dist/application/ports/ILogger.js +26 -0
- package/dist/application/ports/ILogger.js.map +1 -0
- package/dist/application/ports/index.d.ts +6 -0
- package/dist/application/ports/index.d.ts.map +1 -0
- package/dist/application/ports/index.js +18 -0
- package/dist/application/ports/index.js.map +1 -0
- package/dist/application/services/TokenPriceService.d.ts +61 -0
- package/dist/application/services/TokenPriceService.d.ts.map +1 -0
- package/dist/application/services/TokenPriceService.js +137 -0
- package/dist/application/services/TokenPriceService.js.map +1 -0
- package/dist/domain/config/TokenDefaults.d.ts +33 -0
- package/dist/domain/config/TokenDefaults.d.ts.map +1 -0
- package/dist/domain/config/TokenDefaults.js +78 -0
- package/dist/domain/config/TokenDefaults.js.map +1 -0
- package/dist/domain/config/index.d.ts +2 -0
- package/dist/domain/config/index.d.ts.map +1 -0
- package/dist/domain/config/index.js +20 -0
- package/dist/domain/config/index.js.map +1 -0
- package/dist/domain/exceptions.d.ts +5 -0
- package/dist/domain/exceptions.d.ts.map +1 -0
- package/dist/domain/exceptions.js +13 -0
- package/dist/domain/exceptions.js.map +1 -0
- package/dist/domain/repositories.d.ts +4 -0
- package/dist/domain/repositories.d.ts.map +1 -0
- package/dist/domain/repositories.js +3 -0
- package/dist/domain/repositories.js.map +1 -0
- package/dist/factory.d.ts +62 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +51 -0
- package/dist/factory.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/blockchain/contracts.d.ts +20 -0
- package/dist/infrastructure/blockchain/contracts.d.ts.map +1 -0
- package/dist/infrastructure/blockchain/contracts.js +10 -0
- package/dist/infrastructure/blockchain/contracts.js.map +1 -0
- package/dist/infrastructure/config/ProtocolTokenConfig.d.ts +4 -0
- package/dist/infrastructure/config/ProtocolTokenConfig.d.ts.map +1 -0
- package/dist/infrastructure/config/ProtocolTokenConfig.js +54 -0
- package/dist/infrastructure/config/ProtocolTokenConfig.js.map +1 -0
- package/dist/infrastructure/config/gasOracleConfigs.d.ts +14 -0
- package/dist/infrastructure/config/gasOracleConfigs.d.ts.map +1 -0
- package/dist/infrastructure/config/gasOracleConfigs.js +38 -0
- package/dist/infrastructure/config/gasOracleConfigs.js.map +1 -0
- package/dist/infrastructure/config/index.d.ts +5 -0
- package/dist/infrastructure/config/index.d.ts.map +1 -0
- package/dist/infrastructure/config/index.js +11 -0
- package/dist/infrastructure/config/index.js.map +1 -0
- package/dist/infrastructure/gas/GasPriceOracle.d.ts +41 -0
- package/dist/infrastructure/gas/GasPriceOracle.d.ts.map +1 -0
- package/dist/infrastructure/gas/GasPriceOracle.js +77 -0
- package/dist/infrastructure/gas/GasPriceOracle.js.map +1 -0
- package/dist/infrastructure/multicall/MulticallProvider.d.ts +14 -0
- package/dist/infrastructure/multicall/MulticallProvider.d.ts.map +1 -0
- package/dist/infrastructure/multicall/MulticallProvider.js +23 -0
- package/dist/infrastructure/multicall/MulticallProvider.js.map +1 -0
- package/dist/infrastructure/token-price/TokenPriceOracle.d.ts +50 -0
- package/dist/infrastructure/token-price/TokenPriceOracle.d.ts.map +1 -0
- package/dist/infrastructure/token-price/TokenPriceOracle.js +133 -0
- package/dist/infrastructure/token-price/TokenPriceOracle.js.map +1 -0
- package/dist/infrastructure/token-price/index.d.ts +3 -0
- package/dist/infrastructure/token-price/index.d.ts.map +1 -0
- package/dist/infrastructure/token-price/index.js +6 -0
- package/dist/infrastructure/token-price/index.js.map +1 -0
- package/dist/infrastructure/tornado/TornadoFeeOracle.d.ts +90 -0
- package/dist/infrastructure/tornado/TornadoFeeOracle.d.ts.map +1 -0
- package/dist/infrastructure/tornado/TornadoFeeOracle.js +230 -0
- package/dist/infrastructure/tornado/TornadoFeeOracle.js.map +1 -0
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +40 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { GasPriceOracle } from './infrastructure/gas/GasPriceOracle';
|
|
2
|
+
import { TokenPriceOracle } from './infrastructure/token-price/TokenPriceOracle';
|
|
3
|
+
import { TornadoFeeOracle } from './infrastructure/tornado/TornadoFeeOracle';
|
|
4
|
+
import { ITokenPriceRepository } from './domain/repositories';
|
|
5
|
+
import { ChainId } from './infrastructure/config/gasOracleConfigs';
|
|
6
|
+
import { TokenPrices } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* Simplified Configuration for mixerx-oracles module
|
|
9
|
+
*/
|
|
10
|
+
export interface MixerxOraclesConfig {
|
|
11
|
+
/** Chain ID */
|
|
12
|
+
chainId: ChainId;
|
|
13
|
+
/** RPC URL for blockchain connection */
|
|
14
|
+
rpcUrl: string;
|
|
15
|
+
/** Relayer fee percentage (e.g., 0.004 for 0.4%) */
|
|
16
|
+
relayerFeePercent: number;
|
|
17
|
+
/** Token price repository (for reading prices from Redis/cache) - optional */
|
|
18
|
+
priceRepository?: ITokenPriceRepository;
|
|
19
|
+
/** Multicall contract address (optional, uses default) */
|
|
20
|
+
multicallAddress?: string;
|
|
21
|
+
/** Offchain oracle contract address (optional, falls back to @mixerx/config by chain) */
|
|
22
|
+
offchainOracleAddress?: string;
|
|
23
|
+
/** Fallback gas prices (optional) */
|
|
24
|
+
fallbackGasPrices?: {
|
|
25
|
+
legacy?: {
|
|
26
|
+
instant: number;
|
|
27
|
+
fast: number;
|
|
28
|
+
standard: number;
|
|
29
|
+
low: number;
|
|
30
|
+
};
|
|
31
|
+
eip1559?: {
|
|
32
|
+
baseFee: number;
|
|
33
|
+
maxFeePerGas: number;
|
|
34
|
+
maxPriorityFeePerGas: number;
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Mixerx Oracles Module Interface
|
|
40
|
+
*/
|
|
41
|
+
export interface IMixerxOraclesModule {
|
|
42
|
+
/** Gas price oracle (EIP-1559 + Legacy) */
|
|
43
|
+
gasPriceOracle: GasPriceOracle;
|
|
44
|
+
/** Token price oracle (Multicall + OffchainOracle) */
|
|
45
|
+
tokenPriceOracle: TokenPriceOracle;
|
|
46
|
+
/** Tornado fee oracle (V5 - calculates withdrawal fees) */
|
|
47
|
+
tornadoFeeOracle: TornadoFeeOracle;
|
|
48
|
+
/** Convenience method to fetch token prices */
|
|
49
|
+
fetchPrices(): Promise<TokenPrices>;
|
|
50
|
+
/** Chain ID */
|
|
51
|
+
chainId: ChainId;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Factory function to create mixerx-oracles module
|
|
55
|
+
*
|
|
56
|
+
* This creates a complete oracle module with:
|
|
57
|
+
* - GasPriceOracle: Fetches EIP-1559 and Legacy gas prices from multiple sources
|
|
58
|
+
* - TokenPriceOracle: Fetches token prices using Multicall to OffchainOracle
|
|
59
|
+
* - TornadoFeeOracle: Calculates Tornado Cash withdrawal fees
|
|
60
|
+
*/
|
|
61
|
+
export declare function createMixerxOraclesModule(config: MixerxOraclesConfig): IMixerxOraclesModule;
|
|
62
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,+CAA+C,CAAC;AACjF,OAAO,EAAE,gBAAgB,EAA2B,MAAM,2CAA2C,CAAC;AACtG,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,0CAA0C,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,eAAe;IACf,OAAO,EAAE,OAAO,CAAC;IAEjB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IAEf,oDAAoD;IACpD,iBAAiB,EAAE,MAAM,CAAC;IAE1B,8EAA8E;IAC9E,eAAe,CAAC,EAAE,qBAAqB,CAAC;IAExC,0DAA0D;IAC1D,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,yFAAyF;IACzF,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAE/B,qCAAqC;IACrC,iBAAiB,CAAC,EAAE;QAClB,MAAM,CAAC,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;QAC1E,OAAO,CAAC,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAC;YAAC,oBAAoB,EAAE,MAAM,CAAA;SAAE,CAAC;KACnF,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,2CAA2C;IAC3C,cAAc,EAAE,cAAc,CAAC;IAE/B,sDAAsD;IACtD,gBAAgB,EAAE,gBAAgB,CAAC;IAEnC,2DAA2D;IAC3D,gBAAgB,EAAE,gBAAgB,CAAC;IAEnC,+CAA+C;IAC/C,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAAC;IAEpC,eAAe;IACf,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,mBAAmB,GAC1B,oBAAoB,CA6CtB"}
|
package/dist/factory.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createMixerxOraclesModule = createMixerxOraclesModule;
|
|
4
|
+
const GasPriceOracle_1 = require("./infrastructure/gas/GasPriceOracle");
|
|
5
|
+
const TokenPriceOracle_1 = require("./infrastructure/token-price/TokenPriceOracle");
|
|
6
|
+
const TornadoFeeOracle_1 = require("./infrastructure/tornado/TornadoFeeOracle");
|
|
7
|
+
const ProtocolTokenConfig_1 = require("./infrastructure/config/ProtocolTokenConfig");
|
|
8
|
+
/**
|
|
9
|
+
* Factory function to create mixerx-oracles module
|
|
10
|
+
*
|
|
11
|
+
* This creates a complete oracle module with:
|
|
12
|
+
* - GasPriceOracle: Fetches EIP-1559 and Legacy gas prices from multiple sources
|
|
13
|
+
* - TokenPriceOracle: Fetches token prices using Multicall to OffchainOracle
|
|
14
|
+
* - TornadoFeeOracle: Calculates Tornado Cash withdrawal fees
|
|
15
|
+
*/
|
|
16
|
+
function createMixerxOraclesModule(config) {
|
|
17
|
+
// Multicall remains explicit/hardcoded-compatible by design
|
|
18
|
+
const multicallAddress = config.multicallAddress || '0xeefBa1e63905eF1D7ACbA5a8513c70307C1cE441';
|
|
19
|
+
const offchainOracleAddress = config.offchainOracleAddress || (0, ProtocolTokenConfig_1.resolveOffchainOracleAddress)(config.chainId);
|
|
20
|
+
const defaultTokens = (0, ProtocolTokenConfig_1.resolveDefaultTokens)(config.chainId);
|
|
21
|
+
// Create gas price oracle
|
|
22
|
+
const gasPriceOracle = new GasPriceOracle_1.GasPriceOracle({
|
|
23
|
+
chainId: config.chainId,
|
|
24
|
+
rpcUrl: config.rpcUrl,
|
|
25
|
+
fallbackGasPrices: config.fallbackGasPrices,
|
|
26
|
+
});
|
|
27
|
+
// Create token price oracle
|
|
28
|
+
const tokenPriceOracle = new TokenPriceOracle_1.TokenPriceOracle(config.rpcUrl, config.chainId, offchainOracleAddress, multicallAddress, defaultTokens);
|
|
29
|
+
// Create tornado fee oracle
|
|
30
|
+
const tornadoFeeOracle = new TornadoFeeOracle_1.TornadoFeeOracle({
|
|
31
|
+
chainId: config.chainId,
|
|
32
|
+
rpcUrl: config.rpcUrl,
|
|
33
|
+
relayerFeePercent: config.relayerFeePercent,
|
|
34
|
+
gasPriceOracle,
|
|
35
|
+
tokenPriceOracle,
|
|
36
|
+
priceRepository: config.priceRepository,
|
|
37
|
+
multicallAddress,
|
|
38
|
+
offchainOracleAddress,
|
|
39
|
+
});
|
|
40
|
+
return {
|
|
41
|
+
gasPriceOracle,
|
|
42
|
+
tokenPriceOracle,
|
|
43
|
+
tornadoFeeOracle,
|
|
44
|
+
chainId: config.chainId,
|
|
45
|
+
// Convenience method
|
|
46
|
+
async fetchPrices() {
|
|
47
|
+
return tokenPriceOracle.fetchPrices();
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.js","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":";;AAiEA,8DA+CC;AAhHD,wEAAqE;AACrE,oFAAiF;AACjF,gFAAsG;AAGtG,qFAAiH;AAoDjH;;;;;;;GAOG;AACH,SAAgB,yBAAyB,CACvC,MAA2B;IAE3B,4DAA4D;IAC5D,MAAM,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,IAAI,4CAA4C,CAAC;IACjG,MAAM,qBAAqB,GAAG,MAAM,CAAC,qBAAqB,IAAI,IAAA,kDAA4B,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC3G,MAAM,aAAa,GAAG,IAAA,0CAAoB,EAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE3D,0BAA0B;IAC1B,MAAM,cAAc,GAAG,IAAI,+BAAc,CAAC;QACxC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;KAC5C,CAAC,CAAC;IAEH,4BAA4B;IAC5B,MAAM,gBAAgB,GAAG,IAAI,mCAAgB,CAC3C,MAAM,CAAC,MAAM,EACb,MAAM,CAAC,OAAO,EACd,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,CACd,CAAC;IAEF,4BAA4B;IAC5B,MAAM,gBAAgB,GAAG,IAAI,mCAAgB,CAAC;QAC5C,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,cAAc;QACd,gBAAgB;QAChB,eAAe,EAAE,MAAM,CAAC,eAAe;QACvC,gBAAgB;QAChB,qBAAqB;KACtB,CAAC,CAAC;IAEH,OAAO;QACL,cAAc;QACd,gBAAgB;QAChB,gBAAgB;QAChB,OAAO,EAAE,MAAM,CAAC,OAAO;QAEvB,qBAAqB;QACrB,KAAK,CAAC,WAAW;YACf,OAAO,gBAAgB,CAAC,WAAW,EAAE,CAAC;QACxC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./factory"), exports);
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { InterfaceAbi } from 'ethers';
|
|
2
|
+
export type OffchainOracleAbi = {
|
|
3
|
+
interface: {
|
|
4
|
+
encodeFunctionData(functionName: string, values?: readonly unknown[]): string;
|
|
5
|
+
};
|
|
6
|
+
target: string | object;
|
|
7
|
+
};
|
|
8
|
+
export type MulticallInput = {
|
|
9
|
+
to: string;
|
|
10
|
+
data: string;
|
|
11
|
+
};
|
|
12
|
+
export type MulticallAbi = {
|
|
13
|
+
multicall(calls: MulticallInput[]): Promise<{
|
|
14
|
+
results: string[];
|
|
15
|
+
success: boolean[];
|
|
16
|
+
}>;
|
|
17
|
+
};
|
|
18
|
+
export declare const OFFCHAIN_ORACLE_ABI: InterfaceAbi;
|
|
19
|
+
export declare const MULTICALL_ABI: InterfaceAbi;
|
|
20
|
+
//# sourceMappingURL=contracts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/blockchain/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAE3C,MAAM,MAAM,iBAAiB,GAAG;IAC9B,SAAS,EAAE;QACT,kBAAkB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,CAAC;KAC/E,CAAC;IACF,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,CAAC;CACxF,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,YAEjC,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,YAE3B,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MULTICALL_ABI = exports.OFFCHAIN_ORACLE_ABI = void 0;
|
|
4
|
+
exports.OFFCHAIN_ORACLE_ABI = [
|
|
5
|
+
'function getRateToEth(address srcToken, bool useSrcWrappers) external view returns (uint256 weightedRate)',
|
|
6
|
+
];
|
|
7
|
+
exports.MULTICALL_ABI = [
|
|
8
|
+
'function multicall(tuple(address to, bytes data)[] calls) external view returns (bytes[] results, bool[] success)',
|
|
9
|
+
];
|
|
10
|
+
//# sourceMappingURL=contracts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../../../src/infrastructure/blockchain/contracts.ts"],"names":[],"mappings":";;;AAkBa,QAAA,mBAAmB,GAAiB;IAC/C,2GAA2G;CAC5G,CAAC;AAEW,QAAA,aAAa,GAAiB;IACzC,mHAAmH;CACpH,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ChainId, Token } from '../../types';
|
|
2
|
+
export declare function resolveOffchainOracleAddress(chainId: ChainId | number): string;
|
|
3
|
+
export declare function resolveDefaultTokens(chainId: ChainId | number): Token[];
|
|
4
|
+
//# sourceMappingURL=ProtocolTokenConfig.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProtocolTokenConfig.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/config/ProtocolTokenConfig.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAWlD,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,CAQ9E;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,EAAE,CAoCvE"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveOffchainOracleAddress = resolveOffchainOracleAddress;
|
|
4
|
+
exports.resolveDefaultTokens = resolveDefaultTokens;
|
|
5
|
+
const config_1 = require("@mixerx/config");
|
|
6
|
+
function toSupportedChainId(chainId) {
|
|
7
|
+
const numericChainId = Number(chainId);
|
|
8
|
+
if (!(0, config_1.isSupportedNetId)(numericChainId)) {
|
|
9
|
+
throw new Error(`Unsupported chainId ${chainId} for @mixerx/config`);
|
|
10
|
+
}
|
|
11
|
+
return numericChainId;
|
|
12
|
+
}
|
|
13
|
+
function resolveOffchainOracleAddress(chainId) {
|
|
14
|
+
const validatedChainId = toSupportedChainId(chainId);
|
|
15
|
+
const network = (0, config_1.getNetworkConfig)(validatedChainId);
|
|
16
|
+
const address = network?.contracts.offchainOracleAddress;
|
|
17
|
+
if (!address) {
|
|
18
|
+
throw new Error(`Missing offchainOracleAddress in @mixerx/config for chainId ${chainId}`);
|
|
19
|
+
}
|
|
20
|
+
return address;
|
|
21
|
+
}
|
|
22
|
+
function resolveDefaultTokens(chainId) {
|
|
23
|
+
const netId = toSupportedChainId(chainId);
|
|
24
|
+
const networkInstances = config_1.instances[netId];
|
|
25
|
+
const networkConfig = (0, config_1.getNetworkConfig)(netId);
|
|
26
|
+
const tokenMap = new Map();
|
|
27
|
+
if (networkConfig?.tokens.mixerXTokenAddress) {
|
|
28
|
+
const mixerXTokenAddress = networkConfig.tokens.mixerXTokenAddress.toLowerCase();
|
|
29
|
+
tokenMap.set(mixerXTokenAddress, {
|
|
30
|
+
address: mixerXTokenAddress,
|
|
31
|
+
symbol: networkConfig.tokens.mixerXTokenSymbol.toLowerCase(),
|
|
32
|
+
decimals: networkConfig.tokens.mixerXTokenDecimals,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
if (networkInstances) {
|
|
36
|
+
for (const currencyData of Object.values(networkInstances)) {
|
|
37
|
+
if (!currencyData.tokenAddress) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
const tokenAddress = currencyData.tokenAddress.toLowerCase();
|
|
41
|
+
tokenMap.set(tokenAddress, {
|
|
42
|
+
address: tokenAddress,
|
|
43
|
+
symbol: currencyData.symbol.toLowerCase(),
|
|
44
|
+
decimals: currencyData.decimals,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const tokens = Array.from(tokenMap.values());
|
|
49
|
+
if (tokens.length === 0) {
|
|
50
|
+
throw new Error(`No default tokens resolved from @mixerx/config for chainId ${chainId}`);
|
|
51
|
+
}
|
|
52
|
+
return tokens;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=ProtocolTokenConfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProtocolTokenConfig.js","sourceRoot":"","sources":["../../../src/infrastructure/config/ProtocolTokenConfig.ts"],"names":[],"mappings":";;AAcA,oEAQC;AAED,oDAoCC;AA5DD,2CAA+E;AAK/E,SAAS,kBAAkB,CAAC,OAAyB;IACnD,MAAM,cAAc,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,CAAC,IAAA,yBAAgB,EAAC,cAAc,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,qBAAqB,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAgB,4BAA4B,CAAC,OAAyB;IACpE,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,IAAA,yBAAgB,EAAC,gBAAgB,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,OAAO,EAAE,SAAS,CAAC,qBAAqB,CAAC;IACzD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,+DAA+D,OAAO,EAAE,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,oBAAoB,CAAC,OAAyB;IAC5D,MAAM,KAAK,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,gBAAgB,GAAG,kBAAS,CAAC,KAAK,CAA+C,CAAC;IACxF,MAAM,aAAa,GAAG,IAAA,yBAAgB,EAAC,KAAK,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAiB,CAAC;IAE1C,IAAI,aAAa,EAAE,MAAM,CAAC,kBAAkB,EAAE,CAAC;QAC7C,MAAM,kBAAkB,GAAG,aAAa,CAAC,MAAM,CAAC,kBAAkB,CAAC,WAAW,EAAE,CAAC;QACjF,QAAQ,CAAC,GAAG,CAAC,kBAAkB,EAAE;YAC/B,OAAO,EAAE,kBAAkB;YAC3B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,iBAAiB,CAAC,WAAW,EAAE;YAC5D,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,mBAAmB;SACnD,CAAC,CAAC;IACL,CAAC;IAED,IAAI,gBAAgB,EAAE,CAAC;QACrB,KAAK,MAAM,YAAY,IAAI,MAAM,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC3D,IAAI,CAAC,YAAY,CAAC,YAAY,EAAE,CAAC;gBAC/B,SAAS;YACX,CAAC;YACD,MAAM,YAAY,GAAG,YAAY,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;YAC7D,QAAQ,CAAC,GAAG,CAAC,YAAY,EAAE;gBACzB,OAAO,EAAE,YAAY;gBACrB,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC,WAAW,EAAE;gBACzC,QAAQ,EAAE,YAAY,CAAC,QAAQ;aAChC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,8DAA8D,OAAO,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { getNetworkConfig as getProtocolNetworkConfig } from '@mixerx/config';
|
|
2
|
+
export type ChainId = number;
|
|
3
|
+
export interface NetworkConfig {
|
|
4
|
+
chainId: number;
|
|
5
|
+
rpcUrl?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const NETWORKS: Record<number, NetworkConfig>;
|
|
8
|
+
export declare function getNetworkConfig(chainId: ChainId): ReturnType<typeof getProtocolNetworkConfig>;
|
|
9
|
+
export declare function isSupportedChain(chainId: number): boolean;
|
|
10
|
+
export declare function getSupportedChainIds(): number[];
|
|
11
|
+
export declare function getDefaultGasPrice(): number;
|
|
12
|
+
export declare function getMaxGasPrice(): number;
|
|
13
|
+
export declare function getRpcUrl(chainId: number): string | undefined;
|
|
14
|
+
//# sourceMappingURL=gasOracleConfigs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gasOracleConfigs.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/config/gasOracleConfigs.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,IAAI,wBAAwB,EAG7C,MAAM,gBAAgB,CAAC;AAGxB,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAElD,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,UAAU,CAAC,OAAO,wBAAwB,CAAC,CAM9F;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED,wBAAgB,oBAAoB,IAAI,MAAM,EAAE,CAE/C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAO7D"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NETWORKS = void 0;
|
|
4
|
+
exports.getNetworkConfig = getNetworkConfig;
|
|
5
|
+
exports.isSupportedChain = isSupportedChain;
|
|
6
|
+
exports.getSupportedChainIds = getSupportedChainIds;
|
|
7
|
+
exports.getDefaultGasPrice = getDefaultGasPrice;
|
|
8
|
+
exports.getMaxGasPrice = getMaxGasPrice;
|
|
9
|
+
exports.getRpcUrl = getRpcUrl;
|
|
10
|
+
const config_1 = require("@mixerx/config");
|
|
11
|
+
const SUPPORTED_CHAIN_IDS = [...config_1.SUPPORTED_NET_IDS];
|
|
12
|
+
exports.NETWORKS = Object.fromEntries(SUPPORTED_CHAIN_IDS.map((chainId) => [chainId, { chainId }]));
|
|
13
|
+
function getNetworkConfig(chainId) {
|
|
14
|
+
if (!(0, config_1.isSupportedNetId)(chainId)) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
return (0, config_1.getNetworkConfig)(chainId);
|
|
18
|
+
}
|
|
19
|
+
function isSupportedChain(chainId) {
|
|
20
|
+
return (0, config_1.isSupportedNetId)(chainId);
|
|
21
|
+
}
|
|
22
|
+
function getSupportedChainIds() {
|
|
23
|
+
return [...SUPPORTED_CHAIN_IDS];
|
|
24
|
+
}
|
|
25
|
+
function getDefaultGasPrice() {
|
|
26
|
+
return 20;
|
|
27
|
+
}
|
|
28
|
+
function getMaxGasPrice() {
|
|
29
|
+
return 500;
|
|
30
|
+
}
|
|
31
|
+
function getRpcUrl(chainId) {
|
|
32
|
+
const network = getNetworkConfig(chainId);
|
|
33
|
+
if (!network || !('rpcUrl' in network) || typeof network.rpcUrl !== 'string') {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
return network.rpcUrl;
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=gasOracleConfigs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gasOracleConfigs.js","sourceRoot":"","sources":["../../../src/infrastructure/config/gasOracleConfigs.ts"],"names":[],"mappings":";;;AAoBA,4CAMC;AAED,4CAEC;AAED,oDAEC;AAED,gDAEC;AAED,wCAEC;AAED,8BAOC;AAnDD,2CAIwB;AAUxB,MAAM,mBAAmB,GAAG,CAAC,GAAG,0BAAiB,CAAa,CAAC;AAElD,QAAA,QAAQ,GAAkC,MAAM,CAAC,WAAW,CACvE,mBAAmB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAC7D,CAAC;AAEF,SAAgB,gBAAgB,CAAC,OAAgB;IAC/C,IAAI,CAAC,IAAA,yBAAgB,EAAC,OAAO,CAAC,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,IAAA,yBAAwB,EAAC,OAAuB,CAAC,CAAC;AAC3D,CAAC;AAED,SAAgB,gBAAgB,CAAC,OAAe;IAC9C,OAAO,IAAA,yBAAgB,EAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AAED,SAAgB,oBAAoB;IAClC,OAAO,CAAC,GAAG,mBAAmB,CAAC,CAAC;AAClC,CAAC;AAED,SAAgB,kBAAkB;IAChC,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAgB,cAAc;IAC5B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAgB,SAAS,CAAC,OAAe;IACvC,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAC1C,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,OAAO,OAAO,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC7E,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/config/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Infrastructure configuration exports
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.resolveOffchainOracleAddress = exports.resolveDefaultTokens = void 0;
|
|
7
|
+
// Protocol-derived configuration
|
|
8
|
+
var ProtocolTokenConfig_1 = require("./ProtocolTokenConfig");
|
|
9
|
+
Object.defineProperty(exports, "resolveDefaultTokens", { enumerable: true, get: function () { return ProtocolTokenConfig_1.resolveDefaultTokens; } });
|
|
10
|
+
Object.defineProperty(exports, "resolveOffchainOracleAddress", { enumerable: true, get: function () { return ProtocolTokenConfig_1.resolveOffchainOracleAddress; } });
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/infrastructure/config/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,iCAAiC;AACjC,6DAA2F;AAAlF,2HAAA,oBAAoB,OAAA;AAAE,mIAAA,4BAA4B,OAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { ILogger } from '../../application/ports/ILogger';
|
|
2
|
+
import type { ChainId } from '../config/gasOracleConfigs';
|
|
3
|
+
export interface GasPriceParams {
|
|
4
|
+
gasPrice?: string;
|
|
5
|
+
maxFeePerGas?: string;
|
|
6
|
+
maxPriorityFeePerGas?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface GetTxGasParamsInput {
|
|
9
|
+
isLegacy?: boolean;
|
|
10
|
+
bumpPercent?: number;
|
|
11
|
+
legacySpeed?: 'instant' | 'fast' | 'standard' | 'low';
|
|
12
|
+
}
|
|
13
|
+
export interface GasPriceOracleOptions {
|
|
14
|
+
chainId: ChainId;
|
|
15
|
+
rpcUrl: string;
|
|
16
|
+
logger?: ILogger;
|
|
17
|
+
fallbackGasPrices?: {
|
|
18
|
+
legacy?: {
|
|
19
|
+
instant: number;
|
|
20
|
+
fast: number;
|
|
21
|
+
standard: number;
|
|
22
|
+
low: number;
|
|
23
|
+
};
|
|
24
|
+
eip1559?: {
|
|
25
|
+
baseFee: number;
|
|
26
|
+
maxFeePerGas: number;
|
|
27
|
+
maxPriorityFeePerGas: number;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export declare class GasPriceOracle {
|
|
32
|
+
private readonly provider;
|
|
33
|
+
private readonly logger;
|
|
34
|
+
private readonly fallback;
|
|
35
|
+
constructor(options: GasPriceOracleOptions);
|
|
36
|
+
getTxGasParams(input?: GetTxGasParamsInput): Promise<GasPriceParams>;
|
|
37
|
+
private bump;
|
|
38
|
+
private toWeiGwei;
|
|
39
|
+
private bumpGwei;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=GasPriceOracle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GasPriceOracle.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/gas/GasPriceOracle.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAE/D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAE1D,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,KAAK,CAAC;CACvD;AAED,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,iBAAiB,CAAC,EAAE;QAClB,MAAM,CAAC,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAC;YAAC,GAAG,EAAE,MAAM,CAAA;SAAE,CAAC;QAC1E,OAAO,CAAC,EAAE;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAC;YAAC,oBAAoB,EAAE,MAAM,CAAA;SAAE,CAAC;KACnF,CAAC;CACH;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAClD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoE;gBAEjF,OAAO,EAAE,qBAAqB;IASpC,cAAc,CAAC,KAAK,GAAE,mBAAwB,GAAG,OAAO,CAAC,cAAc,CAAC;IA4C9E,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,QAAQ;CAOjB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GasPriceOracle = void 0;
|
|
4
|
+
const ethers_1 = require("ethers");
|
|
5
|
+
const ILogger_1 = require("../../application/ports/ILogger");
|
|
6
|
+
class GasPriceOracle {
|
|
7
|
+
provider;
|
|
8
|
+
logger;
|
|
9
|
+
fallback;
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.provider = new ethers_1.ethers.JsonRpcProvider(options.rpcUrl);
|
|
12
|
+
this.logger = options.logger ?? new ILogger_1.NullLogger();
|
|
13
|
+
this.fallback = {
|
|
14
|
+
legacy: options.fallbackGasPrices?.legacy ?? { instant: 35, fast: 25, standard: 20, low: 15 },
|
|
15
|
+
eip1559: options.fallbackGasPrices?.eip1559 ?? { baseFee: 15, maxFeePerGas: 30, maxPriorityFeePerGas: 2 },
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
async getTxGasParams(input = {}) {
|
|
19
|
+
const rawBumpPercent = Number(input.bumpPercent);
|
|
20
|
+
const bumpPercent = Number.isFinite(rawBumpPercent)
|
|
21
|
+
? Math.max(0, Math.floor(rawBumpPercent))
|
|
22
|
+
: 0;
|
|
23
|
+
try {
|
|
24
|
+
const feeData = await this.provider.getFeeData();
|
|
25
|
+
if (!input.isLegacy && feeData.maxFeePerGas && feeData.maxPriorityFeePerGas) {
|
|
26
|
+
const maxFeePerGas = this.bump(feeData.maxFeePerGas, bumpPercent);
|
|
27
|
+
const maxPriorityFeePerGas = this.bump(feeData.maxPriorityFeePerGas, bumpPercent);
|
|
28
|
+
return {
|
|
29
|
+
maxFeePerGas: maxFeePerGas.toString(),
|
|
30
|
+
maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
if (feeData.gasPrice) {
|
|
34
|
+
return {
|
|
35
|
+
gasPrice: this.bump(feeData.gasPrice, bumpPercent).toString(),
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
this.logger.warn('GasPriceOracle failed to fetch gas price; using fallback', error);
|
|
41
|
+
}
|
|
42
|
+
if (input.isLegacy) {
|
|
43
|
+
const requestedSpeed = input.legacySpeed;
|
|
44
|
+
const speed = requestedSpeed && Object.prototype.hasOwnProperty.call(this.fallback.legacy, requestedSpeed)
|
|
45
|
+
? requestedSpeed
|
|
46
|
+
: 'fast';
|
|
47
|
+
const bumpedLegacyGwei = this.bumpGwei(this.fallback.legacy[speed], bumpPercent);
|
|
48
|
+
return { gasPrice: this.toWeiGwei(bumpedLegacyGwei).toString() };
|
|
49
|
+
}
|
|
50
|
+
const bumpedMaxFeePerGasGwei = this.bumpGwei(this.fallback.eip1559.maxFeePerGas, bumpPercent);
|
|
51
|
+
const bumpedMaxPriorityFeePerGasGwei = this.bumpGwei(this.fallback.eip1559.maxPriorityFeePerGas, bumpPercent);
|
|
52
|
+
return {
|
|
53
|
+
maxFeePerGas: this.toWeiGwei(bumpedMaxFeePerGasGwei).toString(),
|
|
54
|
+
maxPriorityFeePerGas: this.toWeiGwei(bumpedMaxPriorityFeePerGasGwei).toString(),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
bump(value, percent) {
|
|
58
|
+
if (!percent) {
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
61
|
+
return (value * BigInt(100 + percent)) / 100n;
|
|
62
|
+
}
|
|
63
|
+
toWeiGwei(gwei) {
|
|
64
|
+
if (!Number.isFinite(gwei) || gwei < 0) {
|
|
65
|
+
throw new Error(`Invalid fallbackGasPrices gwei value: ${String(gwei)}. Expected a finite non-negative number.`);
|
|
66
|
+
}
|
|
67
|
+
return BigInt(Math.round(gwei * 1e9));
|
|
68
|
+
}
|
|
69
|
+
bumpGwei(gwei, percent) {
|
|
70
|
+
if (!percent) {
|
|
71
|
+
return gwei;
|
|
72
|
+
}
|
|
73
|
+
return (gwei * (100 + percent)) / 100;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.GasPriceOracle = GasPriceOracle;
|
|
77
|
+
//# sourceMappingURL=GasPriceOracle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GasPriceOracle.js","sourceRoot":"","sources":["../../../src/infrastructure/gas/GasPriceOracle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface Call {
|
|
2
|
+
target: string;
|
|
3
|
+
callData: string;
|
|
4
|
+
}
|
|
5
|
+
export interface CallResult {
|
|
6
|
+
success: boolean;
|
|
7
|
+
returnData: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class MulticallProvider {
|
|
10
|
+
private readonly provider;
|
|
11
|
+
constructor(rpcUrl: string, _multicallAddress?: string);
|
|
12
|
+
aggregate(calls: Call[]): Promise<CallResult[]>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=MulticallProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MulticallProvider.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/multicall/MulticallProvider.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,IAAI;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;gBAEtC,MAAM,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM;IAIhD,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;CAYtD"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MulticallProvider = void 0;
|
|
4
|
+
const ethers_1 = require("ethers");
|
|
5
|
+
class MulticallProvider {
|
|
6
|
+
provider;
|
|
7
|
+
constructor(rpcUrl, _multicallAddress) {
|
|
8
|
+
this.provider = new ethers_1.ethers.JsonRpcProvider(rpcUrl);
|
|
9
|
+
}
|
|
10
|
+
async aggregate(calls) {
|
|
11
|
+
return Promise.all(calls.map(async ({ target, callData }) => {
|
|
12
|
+
try {
|
|
13
|
+
const returnData = await this.provider.call({ to: target, data: callData });
|
|
14
|
+
return { success: true, returnData };
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return { success: false, returnData: '0x' };
|
|
18
|
+
}
|
|
19
|
+
}));
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.MulticallProvider = MulticallProvider;
|
|
23
|
+
//# sourceMappingURL=MulticallProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MulticallProvider.js","sourceRoot":"","sources":["../../../src/infrastructure/multicall/MulticallProvider.ts"],"names":[],"mappings":";;;AAAA,mCAAgC;AAYhC,MAAa,iBAAiB;IACX,QAAQ,CAAyB;IAElD,YAAY,MAAc,EAAE,iBAA0B;QACpD,IAAI,CAAC,QAAQ,GAAG,IAAI,eAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa;QAC3B,OAAO,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;YACvC,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;gBAC5E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;YACvC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YAC9C,CAAC;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;CACF;AAnBD,8CAmBC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { ILogger } from '../../application/ports/ILogger';
|
|
2
|
+
import { ChainId, Token } from '../../types';
|
|
3
|
+
export interface TokenPrices {
|
|
4
|
+
[symbol: string]: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* TokenPriceOracle
|
|
8
|
+
* Fetches token prices from OffchainOracle using Multicall
|
|
9
|
+
* Based on @tornado/tornado-oracles TokenPriceOracle
|
|
10
|
+
*
|
|
11
|
+
* Uses protocol-configured OffchainOracle from @mixerx/config
|
|
12
|
+
* Returns price rate to ETH in wei (how much ETH 1 token = X wei)
|
|
13
|
+
*
|
|
14
|
+
* NOTE: Uses centralized TokenDefaults to avoid duplication
|
|
15
|
+
*/
|
|
16
|
+
export declare class TokenPriceOracle {
|
|
17
|
+
private multicall;
|
|
18
|
+
private offchainOracleAddress;
|
|
19
|
+
private offchainOracleAbi;
|
|
20
|
+
private defaultTokens;
|
|
21
|
+
private defaultPrices;
|
|
22
|
+
private logger;
|
|
23
|
+
constructor(rpcUrl: string, chainId: ChainId | number, offchainOracleAddress?: string, multicallAddress?: string, tokens?: Token[], logger?: ILogger);
|
|
24
|
+
/**
|
|
25
|
+
* Fetch prices for tokens
|
|
26
|
+
* Uses multicall to batch requests
|
|
27
|
+
*/
|
|
28
|
+
fetchPrices(tokens?: Token[]): Promise<TokenPrices>;
|
|
29
|
+
/**
|
|
30
|
+
* Fetch price for single token
|
|
31
|
+
*/
|
|
32
|
+
fetchPrice(token: Token): Promise<string | null>;
|
|
33
|
+
/**
|
|
34
|
+
* Get default prices
|
|
35
|
+
*/
|
|
36
|
+
getDefaultPrices(): TokenPrices;
|
|
37
|
+
/**
|
|
38
|
+
* Get supported tokens
|
|
39
|
+
*/
|
|
40
|
+
getSupportedTokens(): Token[];
|
|
41
|
+
/**
|
|
42
|
+
* Add custom tokens
|
|
43
|
+
*/
|
|
44
|
+
addTokens(tokens: Token[]): void;
|
|
45
|
+
/**
|
|
46
|
+
* Encode getRateToEth call
|
|
47
|
+
*/
|
|
48
|
+
private encodeGetRateToEth;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=TokenPriceOracle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TokenPriceOracle.d.ts","sourceRoot":"","sources":["../../../src/infrastructure/token-price/TokenPriceOracle.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAc,MAAM,iCAAiC,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAG7C,MAAM,WAAW,WAAW;IAC1B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;CAC1B;AAED;;;;;;;;;GASG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,iBAAiB,CAEvB;IAGF,OAAO,CAAC,aAAa,CAAU;IAG/B,OAAO,CAAC,aAAa,CAAqC;IAE1D,OAAO,CAAC,MAAM,CAAU;gBAGtB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,GAAG,MAAM,EACzB,qBAAqB,CAAC,EAAE,MAAM,EAC9B,gBAAgB,CAAC,EAAE,MAAM,EACzB,MAAM,CAAC,EAAE,KAAK,EAAE,EAChB,MAAM,CAAC,EAAE,OAAO;IAQlB;;;OAGG;IACG,WAAW,CAAC,MAAM,GAAE,KAAK,EAAuB,GAAG,OAAO,CAAC,WAAW,CAAC;IAsE7E;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAKtD;;OAEG;IACH,gBAAgB,IAAI,WAAW;IAI/B;;OAEG;IACH,kBAAkB,IAAI,KAAK,EAAE;IAI7B;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;IAIhC;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAI3B"}
|