@mento-protocol/mento-sdk 1.18.0 → 1.19.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/dist/cjs/ChainClient.d.ts +9 -0
- package/dist/cjs/ChainClient.js +58 -0
- package/dist/cjs/TestChainClient.d.ts +7 -0
- package/dist/cjs/TestChainClient.js +41 -0
- package/dist/cjs/constants/addresses.d.ts +4 -0
- package/dist/cjs/constants/addresses.js +59 -0
- package/dist/cjs/constants/currencies.d.ts +5 -0
- package/dist/cjs/constants/currencies.js +29 -0
- package/dist/cjs/constants/index.d.ts +4 -0
- package/dist/cjs/constants/index.js +20 -0
- package/dist/cjs/constants/tokens.11142220.d.ts +2 -0
- package/dist/cjs/constants/tokens.11142220.js +128 -0
- package/dist/cjs/constants/tokens.42220.d.ts +2 -0
- package/dist/cjs/constants/tokens.42220.js +128 -0
- package/dist/cjs/constants/tokens.d.ts +50 -0
- package/dist/cjs/constants/tokens.js +155 -0
- package/dist/cjs/constants/tradablePairs.11142220.d.ts +2 -0
- package/dist/cjs/constants/tradablePairs.11142220.js +7391 -0
- package/dist/cjs/constants/tradablePairs.42220.d.ts +2 -0
- package/dist/cjs/constants/tradablePairs.42220.js +7391 -0
- package/dist/cjs/constants/tradablePairs.d.ts +16 -0
- package/dist/cjs/constants/tradablePairs.js +53 -0
- package/dist/cjs/enums/chainId.d.ts +4 -0
- package/dist/cjs/enums/chainId.js +8 -0
- package/dist/cjs/enums/index.d.ts +3 -0
- package/dist/cjs/enums/index.js +19 -0
- package/dist/cjs/enums/proposalState.d.ts +10 -0
- package/dist/cjs/enums/proposalState.js +14 -0
- package/dist/cjs/enums/tradingMode.d.ts +17 -0
- package/dist/cjs/enums/tradingMode.js +21 -0
- package/dist/cjs/governance.d.ts +62 -0
- package/dist/cjs/governance.js +151 -0
- package/dist/cjs/index.d.ts +7 -0
- package/dist/cjs/index.js +23 -0
- package/dist/cjs/interfaces/IChainClient.d.ts +6 -0
- package/dist/cjs/interfaces/IChainClient.js +2 -0
- package/dist/cjs/interfaces/index.d.ts +4 -0
- package/dist/cjs/interfaces/index.js +20 -0
- package/dist/cjs/interfaces/tradingLimit.d.ts +7 -0
- package/dist/cjs/interfaces/tradingLimit.js +2 -0
- package/dist/cjs/interfaces/tradingLimitsConfig.d.ts +10 -0
- package/dist/cjs/interfaces/tradingLimitsConfig.js +2 -0
- package/dist/cjs/interfaces/tradingLimitsState.d.ts +9 -0
- package/dist/cjs/interfaces/tradingLimitsState.js +2 -0
- package/dist/cjs/limits.d.ts +33 -0
- package/dist/cjs/limits.js +130 -0
- package/dist/cjs/mento.d.ts +287 -0
- package/dist/cjs/mento.js +699 -0
- package/dist/cjs/routeUtils.d.ts +304 -0
- package/dist/cjs/routeUtils.js +372 -0
- package/dist/cjs/types/contractAddressMap.d.ts +4 -0
- package/dist/cjs/types/contractAddressMap.js +2 -0
- package/dist/cjs/types/contractAddresses.d.ts +23 -0
- package/dist/cjs/types/contractAddresses.js +2 -0
- package/dist/cjs/types/index.d.ts +2 -0
- package/dist/cjs/types/index.js +18 -0
- package/dist/cjs/utils.d.ts +80 -0
- package/dist/cjs/utils.js +177 -0
- package/dist/esm/ChainClient.d.ts +9 -0
- package/dist/esm/ChainClient.js +54 -0
- package/dist/esm/TestChainClient.d.ts +7 -0
- package/dist/esm/TestChainClient.js +37 -0
- package/dist/esm/constants/addresses.d.ts +4 -0
- package/dist/esm/constants/addresses.js +55 -0
- package/dist/esm/constants/currencies.d.ts +5 -0
- package/dist/esm/constants/currencies.js +26 -0
- package/dist/esm/constants/index.d.ts +4 -0
- package/dist/esm/constants/index.js +4 -0
- package/dist/esm/constants/tokens.11142220.d.ts +2 -0
- package/dist/esm/constants/tokens.11142220.js +125 -0
- package/dist/esm/constants/tokens.42220.d.ts +2 -0
- package/dist/esm/constants/tokens.42220.js +125 -0
- package/dist/esm/constants/tokens.d.ts +50 -0
- package/dist/esm/constants/tokens.js +127 -0
- package/dist/esm/constants/tradablePairs.11142220.d.ts +2 -0
- package/dist/esm/constants/tradablePairs.11142220.js +7388 -0
- package/dist/esm/constants/tradablePairs.42220.d.ts +2 -0
- package/dist/esm/constants/tradablePairs.42220.js +7388 -0
- package/dist/esm/constants/tradablePairs.d.ts +16 -0
- package/dist/esm/constants/tradablePairs.js +26 -0
- package/dist/esm/enums/chainId.d.ts +4 -0
- package/dist/esm/enums/chainId.js +5 -0
- package/dist/esm/enums/index.d.ts +3 -0
- package/dist/esm/enums/index.js +3 -0
- package/dist/esm/enums/proposalState.d.ts +10 -0
- package/dist/esm/enums/proposalState.js +11 -0
- package/dist/esm/enums/tradingMode.d.ts +17 -0
- package/dist/esm/enums/tradingMode.js +18 -0
- package/dist/esm/governance.d.ts +62 -0
- package/dist/esm/governance.js +147 -0
- package/dist/esm/index.d.ts +7 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/interfaces/IChainClient.d.ts +6 -0
- package/dist/esm/interfaces/IChainClient.js +1 -0
- package/dist/esm/interfaces/index.d.ts +4 -0
- package/dist/esm/interfaces/index.js +4 -0
- package/dist/esm/interfaces/tradingLimit.d.ts +7 -0
- package/dist/esm/interfaces/tradingLimit.js +1 -0
- package/dist/esm/interfaces/tradingLimitsConfig.d.ts +10 -0
- package/dist/esm/interfaces/tradingLimitsConfig.js +1 -0
- package/dist/esm/interfaces/tradingLimitsState.d.ts +9 -0
- package/dist/esm/interfaces/tradingLimitsState.js +1 -0
- package/dist/esm/limits.d.ts +33 -0
- package/dist/esm/limits.js +123 -0
- package/dist/esm/mento.d.ts +287 -0
- package/dist/esm/mento.js +671 -0
- package/dist/esm/routeUtils.d.ts +304 -0
- package/dist/esm/routeUtils.js +362 -0
- package/dist/esm/types/contractAddressMap.d.ts +4 -0
- package/dist/esm/types/contractAddressMap.js +1 -0
- package/dist/esm/types/contractAddresses.d.ts +23 -0
- package/dist/esm/types/contractAddresses.js +1 -0
- package/dist/esm/types/index.d.ts +2 -0
- package/dist/esm/types/index.js +2 -0
- package/dist/esm/utils.d.ts +80 -0
- package/dist/esm/utils.js +162 -0
- package/package.json +1 -1
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type ContractAddresses = {
|
|
2
|
+
GovernanceFactory: string;
|
|
3
|
+
Airgrab: string;
|
|
4
|
+
Emission: string;
|
|
5
|
+
MentoGovernor: string;
|
|
6
|
+
MentoToken: string;
|
|
7
|
+
TimelockController: string;
|
|
8
|
+
Locking: string;
|
|
9
|
+
MentoRouter: string;
|
|
10
|
+
Broker: string;
|
|
11
|
+
BiPoolManager: string;
|
|
12
|
+
BreakerBox: string;
|
|
13
|
+
Reserve: string;
|
|
14
|
+
ConstantSumPricingModule: string;
|
|
15
|
+
ConstantProductPricingModule: string;
|
|
16
|
+
MedianDeltaBreaker: string;
|
|
17
|
+
ValueDeltaBreaker: string;
|
|
18
|
+
StableToken: string;
|
|
19
|
+
StableTokenEUR: string;
|
|
20
|
+
StableTokenBRL: string;
|
|
21
|
+
StableTokenXOF: string;
|
|
22
|
+
SortedOracles: string;
|
|
23
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { BigNumberish, providers, Signer } from 'ethers';
|
|
2
|
+
import { TokenSymbol } from './constants';
|
|
3
|
+
import { Address } from './interfaces';
|
|
4
|
+
import { Token, TradablePair } from './mento';
|
|
5
|
+
/**
|
|
6
|
+
* Gets the chain ID from a signer or provider
|
|
7
|
+
* @param signerOrProvider an ethers provider or signer
|
|
8
|
+
* @returns the chain ID
|
|
9
|
+
*/
|
|
10
|
+
export declare function getChainId(signerOrProvider: Signer | providers.Provider): Promise<number>;
|
|
11
|
+
/**
|
|
12
|
+
* Ensures that given signer is truly a a connected signer
|
|
13
|
+
* @param signer an ethers signer
|
|
14
|
+
* @throws if signer is invalid or not connected
|
|
15
|
+
*/
|
|
16
|
+
export declare function validateSigner(signer: Signer): void;
|
|
17
|
+
/**
|
|
18
|
+
* Ensures that given signerOrProvider is truly a provider or a connected signer
|
|
19
|
+
* @param signerOrProvider an ethers provider or signer
|
|
20
|
+
* @throws if signerOrProvider is invalid or not connected
|
|
21
|
+
*/
|
|
22
|
+
export declare function validateSignerOrProvider(signerOrProvider: Signer | providers.Provider): void;
|
|
23
|
+
/**
|
|
24
|
+
* Returns the symbol of an erc20 token
|
|
25
|
+
* @param tokenAddr the address of the erc20 token
|
|
26
|
+
* @param signerOrProvider an ethers provider or signer
|
|
27
|
+
* @returns the symbol of the erc20 token
|
|
28
|
+
*/
|
|
29
|
+
export declare function getSymbolFromTokenAddress(tokenAddr: Address, signerOrProvider: Signer | providers.Provider): Promise<TokenSymbol>;
|
|
30
|
+
/**
|
|
31
|
+
* Returns the name of an erc20 token
|
|
32
|
+
* @param tokenAddr the address of the erc20 token
|
|
33
|
+
* @param signerOrProvider an ethers provider or signer
|
|
34
|
+
* @returns the name of the erc20 token
|
|
35
|
+
*/
|
|
36
|
+
export declare function getNameFromTokenAddress(tokenAddr: Address, signerOrProvider: Signer | providers.Provider): Promise<string>;
|
|
37
|
+
/**
|
|
38
|
+
* Returns the decimals of an erc20 token
|
|
39
|
+
* @param tokenAddr the address of the erc20 token
|
|
40
|
+
* @param signerOrProvider an ethers provider or signer
|
|
41
|
+
* @returns the decimals of the erc20 token
|
|
42
|
+
*/
|
|
43
|
+
export declare function getDecimalsFromTokenAddress(tokenAddr: Address, signerOrProvider: Signer | providers.Provider): Promise<number>;
|
|
44
|
+
/**
|
|
45
|
+
* Returns a populated tx obj for increasing the allowance of a spender for a given erc20 token by a given amount
|
|
46
|
+
* @param tokenAddr the address of the erc20 token
|
|
47
|
+
* @param spender the address of the spender
|
|
48
|
+
* @param amount the amount to increase the allowance by
|
|
49
|
+
* @param signerOrProvider an ethers signer or provider
|
|
50
|
+
* @returns the populated TransactionRequest object
|
|
51
|
+
*/
|
|
52
|
+
export declare function increaseAllowance(tokenAddr: string, spender: string, amount: BigNumberish, signerOrProvider: Signer | providers.Provider): Promise<providers.TransactionRequest>;
|
|
53
|
+
/**
|
|
54
|
+
* Find a token address by its symbol from tradable pairs
|
|
55
|
+
* @param pairs array of tradable pairs to search through
|
|
56
|
+
* @param symbol the token symbol to find (case-insensitive)
|
|
57
|
+
* @returns the token address if found, null otherwise
|
|
58
|
+
*/
|
|
59
|
+
export declare function findTokenAddressBySymbolInTradablePairs(symbol: TokenSymbol, pairs: readonly TradablePair[]): Address | null;
|
|
60
|
+
export declare function capitalize(str: string): string; /**
|
|
61
|
+
* Helper function to get token address by symbol for a specific chain
|
|
62
|
+
* @param symbol - The token symbol
|
|
63
|
+
* @param chainId - The chain ID
|
|
64
|
+
* @returns The token address or undefined if not found
|
|
65
|
+
*/
|
|
66
|
+
export declare function getTokenAddress(symbol: TokenSymbol, chainId: number): string | undefined;
|
|
67
|
+
/**
|
|
68
|
+
* Helper function to find a token by symbol in the cached tokens
|
|
69
|
+
* @param symbol - The token symbol to search for
|
|
70
|
+
* @param chainId - The chain ID
|
|
71
|
+
* @returns The token object or undefined if not found
|
|
72
|
+
*/
|
|
73
|
+
export declare function findTokenBySymbol(symbol: string, chainId: number): Token | undefined;
|
|
74
|
+
/**
|
|
75
|
+
* Computes the rate feed ID from a rate feed identifier string.
|
|
76
|
+
* This follows the Solidity formula: address(uint160(uint256(keccak256(abi.encodePacked(rateFeed)))))
|
|
77
|
+
* @param rateFeed the rate feed identifier string (e.g., "EURUSD", "relayed:COPUSD")
|
|
78
|
+
* @returns the computed rate feed address
|
|
79
|
+
*/
|
|
80
|
+
export declare function toRateFeedId(rateFeed: string): Address;
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
import { Contract, ethers, providers, Signer } from 'ethers';
|
|
11
|
+
import { getCachedTokensSync, TOKEN_ADDRESSES_BY_CHAIN } from './constants/tokens';
|
|
12
|
+
/**
|
|
13
|
+
* Gets the chain ID from a signer or provider
|
|
14
|
+
* @param signerOrProvider an ethers provider or signer
|
|
15
|
+
* @returns the chain ID
|
|
16
|
+
*/
|
|
17
|
+
export function getChainId(signerOrProvider) {
|
|
18
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
19
|
+
const provider = Signer.isSigner(signerOrProvider)
|
|
20
|
+
? signerOrProvider.provider
|
|
21
|
+
: signerOrProvider;
|
|
22
|
+
return (yield provider.getNetwork()).chainId;
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Ensures that given signer is truly a a connected signer
|
|
27
|
+
* @param signer an ethers signer
|
|
28
|
+
* @throws if signer is invalid or not connected
|
|
29
|
+
*/
|
|
30
|
+
export function validateSigner(signer) {
|
|
31
|
+
if (!Signer.isSigner(signer)) {
|
|
32
|
+
throw new Error('A valid signer must be provided');
|
|
33
|
+
}
|
|
34
|
+
if (!providers.Provider.isProvider(signer.provider)) {
|
|
35
|
+
throw new Error('Signer must be connected to a provider');
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Ensures that given signerOrProvider is truly a provider or a connected signer
|
|
40
|
+
* @param signerOrProvider an ethers provider or signer
|
|
41
|
+
* @throws if signerOrProvider is invalid or not connected
|
|
42
|
+
*/
|
|
43
|
+
export function validateSignerOrProvider(signerOrProvider) {
|
|
44
|
+
const isSigner = Signer.isSigner(signerOrProvider);
|
|
45
|
+
const isProvider = providers.Provider.isProvider(signerOrProvider);
|
|
46
|
+
if (!isSigner && !isProvider) {
|
|
47
|
+
throw new Error('A valid signer or provider must be provided');
|
|
48
|
+
}
|
|
49
|
+
if (isSigner && !providers.Provider.isProvider(signerOrProvider.provider)) {
|
|
50
|
+
throw new Error('Signer must be connected to a provider');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Returns the symbol of an erc20 token
|
|
55
|
+
* @param tokenAddr the address of the erc20 token
|
|
56
|
+
* @param signerOrProvider an ethers provider or signer
|
|
57
|
+
* @returns the symbol of the erc20 token
|
|
58
|
+
*/
|
|
59
|
+
export function getSymbolFromTokenAddress(tokenAddr, signerOrProvider) {
|
|
60
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
61
|
+
const erc20Abi = ['function symbol() external view returns (string memory)'];
|
|
62
|
+
const contract = new Contract(tokenAddr, erc20Abi, signerOrProvider);
|
|
63
|
+
return contract.symbol();
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Returns the name of an erc20 token
|
|
68
|
+
* @param tokenAddr the address of the erc20 token
|
|
69
|
+
* @param signerOrProvider an ethers provider or signer
|
|
70
|
+
* @returns the name of the erc20 token
|
|
71
|
+
*/
|
|
72
|
+
export function getNameFromTokenAddress(tokenAddr, signerOrProvider) {
|
|
73
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
74
|
+
const erc20Abi = ['function name() external view returns (string memory)'];
|
|
75
|
+
const contract = new Contract(tokenAddr, erc20Abi, signerOrProvider);
|
|
76
|
+
return contract.name();
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Returns the decimals of an erc20 token
|
|
81
|
+
* @param tokenAddr the address of the erc20 token
|
|
82
|
+
* @param signerOrProvider an ethers provider or signer
|
|
83
|
+
* @returns the decimals of the erc20 token
|
|
84
|
+
*/
|
|
85
|
+
export function getDecimalsFromTokenAddress(tokenAddr, signerOrProvider) {
|
|
86
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
87
|
+
const erc20Abi = ['function decimals() external view returns (uint8)'];
|
|
88
|
+
const contract = new Contract(tokenAddr, erc20Abi, signerOrProvider);
|
|
89
|
+
return contract.decimals();
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Returns a populated tx obj for increasing the allowance of a spender for a given erc20 token by a given amount
|
|
94
|
+
* @param tokenAddr the address of the erc20 token
|
|
95
|
+
* @param spender the address of the spender
|
|
96
|
+
* @param amount the amount to increase the allowance by
|
|
97
|
+
* @param signerOrProvider an ethers signer or provider
|
|
98
|
+
* @returns the populated TransactionRequest object
|
|
99
|
+
*/
|
|
100
|
+
export function increaseAllowance(tokenAddr, spender, amount, signerOrProvider) {
|
|
101
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
102
|
+
const abi = [
|
|
103
|
+
'function increaseAllowance(address spender, uint256 value) external returns (bool)',
|
|
104
|
+
];
|
|
105
|
+
// TODO, not all ERC-20 contracts support increaseAllowance
|
|
106
|
+
// Add a check for that here
|
|
107
|
+
const contract = new Contract(tokenAddr, abi, signerOrProvider);
|
|
108
|
+
return yield contract.populateTransaction.increaseAllowance(spender, amount);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Find a token address by its symbol from tradable pairs
|
|
113
|
+
* @param pairs array of tradable pairs to search through
|
|
114
|
+
* @param symbol the token symbol to find (case-insensitive)
|
|
115
|
+
* @returns the token address if found, null otherwise
|
|
116
|
+
*/
|
|
117
|
+
export function findTokenAddressBySymbolInTradablePairs(symbol, pairs) {
|
|
118
|
+
var _a, _b;
|
|
119
|
+
return ((_b = (_a = pairs
|
|
120
|
+
.flatMap((pair) => pair.assets)
|
|
121
|
+
.find((asset) => asset.symbol.toLowerCase() === symbol.toLowerCase())) === null || _a === void 0 ? void 0 : _a.address) !== null && _b !== void 0 ? _b : null);
|
|
122
|
+
}
|
|
123
|
+
export function capitalize(str) {
|
|
124
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
125
|
+
} /**
|
|
126
|
+
* Helper function to get token address by symbol for a specific chain
|
|
127
|
+
* @param symbol - The token symbol
|
|
128
|
+
* @param chainId - The chain ID
|
|
129
|
+
* @returns The token address or undefined if not found
|
|
130
|
+
*/
|
|
131
|
+
export function getTokenAddress(symbol, chainId) {
|
|
132
|
+
var _a;
|
|
133
|
+
return (_a = TOKEN_ADDRESSES_BY_CHAIN[chainId]) === null || _a === void 0 ? void 0 : _a[symbol];
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Helper function to find a token by symbol in the cached tokens
|
|
137
|
+
* @param symbol - The token symbol to search for
|
|
138
|
+
* @param chainId - The chain ID
|
|
139
|
+
* @returns The token object or undefined if not found
|
|
140
|
+
*/
|
|
141
|
+
export function findTokenBySymbol(symbol, chainId) {
|
|
142
|
+
const tokens = getCachedTokensSync(chainId);
|
|
143
|
+
return tokens.find((token) => token.symbol === symbol);
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Computes the rate feed ID from a rate feed identifier string.
|
|
147
|
+
* This follows the Solidity formula: address(uint160(uint256(keccak256(abi.encodePacked(rateFeed)))))
|
|
148
|
+
* @param rateFeed the rate feed identifier string (e.g., "EURUSD", "relayed:COPUSD")
|
|
149
|
+
* @returns the computed rate feed address
|
|
150
|
+
*/
|
|
151
|
+
export function toRateFeedId(rateFeed) {
|
|
152
|
+
// 1. Calculate keccak256 hash
|
|
153
|
+
const hashedBytes = ethers.utils.keccak256(ethers.utils.toUtf8Bytes(rateFeed));
|
|
154
|
+
// 2. Convert to BigInt (equivalent to uint256)
|
|
155
|
+
const hashAsBigInt = BigInt(hashedBytes);
|
|
156
|
+
// 3. Mask to 160 bits (equivalent to uint160)
|
|
157
|
+
const maskedToUint160 = hashAsBigInt & ((BigInt(1) << BigInt(160)) - BigInt(1));
|
|
158
|
+
// 4. Convert to address (hex string)
|
|
159
|
+
const addressHex = '0x' + maskedToUint160.toString(16).padStart(40, '0');
|
|
160
|
+
// 5. Return calculated rate feed ID
|
|
161
|
+
return addressHex;
|
|
162
|
+
}
|