@metamask-previews/assets-controller 1.0.0-preview-1ad6631 → 1.0.0-preview-e7b1aa6
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/CHANGELOG.md +0 -1
- package/dist/AssetsController-method-action-types.cjs.map +1 -1
- package/dist/AssetsController-method-action-types.d.cts +1 -26
- package/dist/AssetsController-method-action-types.d.cts.map +1 -1
- package/dist/AssetsController-method-action-types.d.mts +1 -26
- package/dist/AssetsController-method-action-types.d.mts.map +1 -1
- package/dist/AssetsController-method-action-types.mjs.map +1 -1
- package/dist/AssetsController.cjs +9 -84
- package/dist/AssetsController.cjs.map +1 -1
- package/dist/AssetsController.d.cts +2 -47
- package/dist/AssetsController.d.cts.map +1 -1
- package/dist/AssetsController.d.mts +2 -47
- package/dist/AssetsController.d.mts.map +1 -1
- package/dist/AssetsController.mjs +9 -84
- package/dist/AssetsController.mjs.map +1 -1
- package/dist/data-sources/RpcDataSource.cjs +4 -117
- package/dist/data-sources/RpcDataSource.cjs.map +1 -1
- package/dist/data-sources/RpcDataSource.d.cts +0 -14
- package/dist/data-sources/RpcDataSource.d.cts.map +1 -1
- package/dist/data-sources/RpcDataSource.d.mts +0 -14
- package/dist/data-sources/RpcDataSource.d.mts.map +1 -1
- package/dist/data-sources/RpcDataSource.mjs +4 -117
- package/dist/data-sources/RpcDataSource.mjs.map +1 -1
- package/dist/data-sources/TokenDataSource.cjs +0 -5
- package/dist/data-sources/TokenDataSource.cjs.map +1 -1
- package/dist/data-sources/TokenDataSource.d.cts.map +1 -1
- package/dist/data-sources/TokenDataSource.d.mts.map +1 -1
- package/dist/data-sources/TokenDataSource.mjs +0 -5
- package/dist/data-sources/TokenDataSource.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/index.cjs +1 -5
- package/dist/data-sources/evm-rpc-services/index.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/index.d.cts +1 -1
- package/dist/data-sources/evm-rpc-services/index.d.cts.map +1 -1
- package/dist/data-sources/evm-rpc-services/index.d.mts +1 -1
- package/dist/data-sources/evm-rpc-services/index.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/index.mjs +1 -1
- package/dist/data-sources/evm-rpc-services/index.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/index.cjs +1 -6
- package/dist/data-sources/evm-rpc-services/services/index.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/index.d.cts +0 -1
- package/dist/data-sources/evm-rpc-services/services/index.d.cts.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/index.d.mts +0 -1
- package/dist/data-sources/evm-rpc-services/services/index.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/services/index.mjs +0 -1
- package/dist/data-sources/evm-rpc-services/services/index.mjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/utils/index.cjs +1 -9
- package/dist/data-sources/evm-rpc-services/utils/index.cjs.map +1 -1
- package/dist/data-sources/evm-rpc-services/utils/index.d.cts +0 -2
- package/dist/data-sources/evm-rpc-services/utils/index.d.cts.map +1 -1
- package/dist/data-sources/evm-rpc-services/utils/index.d.mts +0 -2
- package/dist/data-sources/evm-rpc-services/utils/index.d.mts.map +1 -1
- package/dist/data-sources/evm-rpc-services/utils/index.mjs +0 -2
- package/dist/data-sources/evm-rpc-services/utils/index.mjs.map +1 -1
- package/dist/data-sources/index.cjs +1 -3
- package/dist/data-sources/index.cjs.map +1 -1
- package/dist/data-sources/index.d.cts +0 -1
- package/dist/data-sources/index.d.cts.map +1 -1
- package/dist/data-sources/index.d.mts +0 -1
- package/dist/data-sources/index.d.mts.map +1 -1
- package/dist/data-sources/index.mjs +0 -1
- package/dist/data-sources/index.mjs.map +1 -1
- package/package.json +1 -1
- package/dist/data-sources/StakedBalanceDataSource.cjs +0 -536
- package/dist/data-sources/StakedBalanceDataSource.cjs.map +0 -1
- package/dist/data-sources/StakedBalanceDataSource.d.cts +0 -72
- package/dist/data-sources/StakedBalanceDataSource.d.cts.map +0 -1
- package/dist/data-sources/StakedBalanceDataSource.d.mts +0 -72
- package/dist/data-sources/StakedBalanceDataSource.d.mts.map +0 -1
- package/dist/data-sources/StakedBalanceDataSource.mjs +0 -532
- package/dist/data-sources/StakedBalanceDataSource.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.cjs +0 -133
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.cts +0 -78
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.mts +0 -78
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.mjs +0 -127
- package/dist/data-sources/evm-rpc-services/services/StakedBalanceFetcher.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/parsing.cjs +0 -34
- package/dist/data-sources/evm-rpc-services/utils/parsing.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/parsing.d.cts +0 -18
- package/dist/data-sources/evm-rpc-services/utils/parsing.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/parsing.d.mts +0 -18
- package/dist/data-sources/evm-rpc-services/utils/parsing.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/parsing.mjs +0 -29
- package/dist/data-sources/evm-rpc-services/utils/parsing.mjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.cjs +0 -50
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.cjs.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.cts +0 -24
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.cts.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.mts +0 -24
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.d.mts.map +0 -1
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.mjs +0 -44
- package/dist/data-sources/evm-rpc-services/utils/staking-contracts.mjs.map +0 -1
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
-
};
|
|
8
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
-
};
|
|
13
|
-
var _StakedBalanceFetcher_providerGetter, _StakedBalanceFetcher_onStakedBalanceUpdate;
|
|
14
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.StakedBalanceFetcher = exports.isStakingContractAssetId = exports.getSupportedStakingChainIds = exports.getStakingContractAddress = void 0;
|
|
16
|
-
const abi_1 = require("@ethersproject/abi");
|
|
17
|
-
const providers_1 = require("@ethersproject/providers");
|
|
18
|
-
const polling_controller_1 = require("@metamask/polling-controller");
|
|
19
|
-
const utils_1 = require("../utils/index.cjs");
|
|
20
|
-
Object.defineProperty(exports, "getStakingContractAddress", { enumerable: true, get: function () { return utils_1.getStakingContractAddress; } });
|
|
21
|
-
Object.defineProperty(exports, "getSupportedStakingChainIds", { enumerable: true, get: function () { return utils_1.getSupportedStakingChainIds; } });
|
|
22
|
-
Object.defineProperty(exports, "isStakingContractAssetId", { enumerable: true, get: function () { return utils_1.isStakingContractAssetId; } });
|
|
23
|
-
/** Staking contract ABI: getShares(account) and convertToAssets(shares). */
|
|
24
|
-
const STAKING_CONTRACT_ABI = [
|
|
25
|
-
{
|
|
26
|
-
inputs: [{ internalType: 'address', name: 'account', type: 'address' }],
|
|
27
|
-
name: 'getShares',
|
|
28
|
-
outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
|
|
29
|
-
stateMutability: 'view',
|
|
30
|
-
type: 'function',
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
inputs: [{ internalType: 'uint256', name: 'shares', type: 'uint256' }],
|
|
34
|
-
name: 'convertToAssets',
|
|
35
|
-
outputs: [{ internalType: 'uint256', name: 'assets', type: 'uint256' }],
|
|
36
|
-
stateMutability: 'view',
|
|
37
|
-
type: 'function',
|
|
38
|
-
},
|
|
39
|
-
];
|
|
40
|
-
const STAKING_INTERFACE = new abi_1.Interface(STAKING_CONTRACT_ABI);
|
|
41
|
-
const STAKING_DECIMALS = 18;
|
|
42
|
-
const DEFAULT_STAKED_BALANCE_INTERVAL = 180000; // 3 minutes
|
|
43
|
-
class StakedBalanceFetcher extends (0, polling_controller_1.StaticIntervalPollingControllerOnly)() {
|
|
44
|
-
constructor(config) {
|
|
45
|
-
super();
|
|
46
|
-
_StakedBalanceFetcher_providerGetter.set(this, void 0);
|
|
47
|
-
_StakedBalanceFetcher_onStakedBalanceUpdate.set(this, void 0);
|
|
48
|
-
__classPrivateFieldSet(this, _StakedBalanceFetcher_providerGetter, config?.getNetworkProvider, "f");
|
|
49
|
-
this.setIntervalLength(config?.pollingInterval ?? DEFAULT_STAKED_BALANCE_INTERVAL);
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Register a callback that is invoked after every successful poll with
|
|
53
|
-
* the staked balance (including zero). Zero is reported so that merged
|
|
54
|
-
* updates can clear prior non-zero state.
|
|
55
|
-
*
|
|
56
|
-
* @param callback - The callback to invoke.
|
|
57
|
-
*/
|
|
58
|
-
setOnStakedBalanceUpdate(callback) {
|
|
59
|
-
__classPrivateFieldSet(this, _StakedBalanceFetcher_onStakedBalanceUpdate, callback, "f");
|
|
60
|
-
}
|
|
61
|
-
async _executePoll(input) {
|
|
62
|
-
let result;
|
|
63
|
-
try {
|
|
64
|
-
result = await this.fetchStakedBalance(input);
|
|
65
|
-
}
|
|
66
|
-
catch {
|
|
67
|
-
// Do not push an update on provider/RPC failure; otherwise we would
|
|
68
|
-
// overwrite existing non-zero staked balances with zero in state.
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
if (__classPrivateFieldGet(this, _StakedBalanceFetcher_onStakedBalanceUpdate, "f")) {
|
|
72
|
-
__classPrivateFieldGet(this, _StakedBalanceFetcher_onStakedBalanceUpdate, "f").call(this, {
|
|
73
|
-
accountId: input.accountId,
|
|
74
|
-
chainId: input.chainId,
|
|
75
|
-
balance: result,
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Fetches the staked balance for an account on a chain using the same
|
|
81
|
-
* staking contract as AccountTrackerController (getShares then convertToAssets).
|
|
82
|
-
* Returns a human-readable amount string (e.g. "1.5" for 1.5 ETH).
|
|
83
|
-
* Throws when no provider is available or when the RPC/contract call fails, so
|
|
84
|
-
* callers do not persist a false zero and overwrite existing balances.
|
|
85
|
-
*
|
|
86
|
-
* @param input - Chain, account ID, and address to query.
|
|
87
|
-
* @returns Human-readable staked balance (amount string).
|
|
88
|
-
* @throws When provider is missing or when getShares/convertToAssets fails.
|
|
89
|
-
*/
|
|
90
|
-
async fetchStakedBalance(input) {
|
|
91
|
-
const { chainId, accountAddress } = input;
|
|
92
|
-
const provider = __classPrivateFieldGet(this, _StakedBalanceFetcher_providerGetter, "f")?.call(this, chainId);
|
|
93
|
-
if (!provider) {
|
|
94
|
-
throw new Error('StakedBalanceFetcher: no provider available for chain');
|
|
95
|
-
}
|
|
96
|
-
const hexChainId = (0, utils_1.chainIdToHex)(chainId);
|
|
97
|
-
const contractAddress = utils_1.STAKING_CONTRACT_ADDRESS_BY_CHAINID[hexChainId];
|
|
98
|
-
if (!contractAddress) {
|
|
99
|
-
return { amount: '0' };
|
|
100
|
-
}
|
|
101
|
-
try {
|
|
102
|
-
const sharesCalldata = STAKING_INTERFACE.encodeFunctionData('getShares', [
|
|
103
|
-
accountAddress,
|
|
104
|
-
]);
|
|
105
|
-
const sharesResult = await provider.call({
|
|
106
|
-
to: contractAddress,
|
|
107
|
-
data: sharesCalldata,
|
|
108
|
-
});
|
|
109
|
-
const sharesRaw = STAKING_INTERFACE.decodeFunctionResult('getShares', sharesResult)[0];
|
|
110
|
-
const sharesBigNum = BigInt(sharesRaw.toString());
|
|
111
|
-
if (sharesBigNum === 0n) {
|
|
112
|
-
return { amount: '0' };
|
|
113
|
-
}
|
|
114
|
-
const assetsCalldata = STAKING_INTERFACE.encodeFunctionData('convertToAssets', [sharesBigNum]);
|
|
115
|
-
const assetsResult = await provider.call({
|
|
116
|
-
to: contractAddress,
|
|
117
|
-
data: assetsCalldata,
|
|
118
|
-
});
|
|
119
|
-
const assetsRaw = STAKING_INTERFACE.decodeFunctionResult('convertToAssets', assetsResult)[0];
|
|
120
|
-
const assetsWei = BigInt(assetsRaw.toString());
|
|
121
|
-
const amount = (0, utils_1.weiToHumanReadable)(assetsWei.toString(), STAKING_DECIMALS);
|
|
122
|
-
return { amount };
|
|
123
|
-
}
|
|
124
|
-
catch (error) {
|
|
125
|
-
throw error instanceof Error
|
|
126
|
-
? error
|
|
127
|
-
: new Error('StakedBalanceFetcher: failed to fetch staked balance');
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
exports.StakedBalanceFetcher = StakedBalanceFetcher;
|
|
132
|
-
_StakedBalanceFetcher_providerGetter = new WeakMap(), _StakedBalanceFetcher_onStakedBalanceUpdate = new WeakMap();
|
|
133
|
-
//# sourceMappingURL=StakedBalanceFetcher.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StakedBalanceFetcher.cjs","sourceRoot":"","sources":["../../../../src/data-sources/evm-rpc-services/services/StakedBalanceFetcher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,4CAA+C;AAC/C,wDAAwD;AACxD,qEAAmF;AAGnF,8CAOkB;AAGhB,0GATA,iCAAyB,OASA;AACzB,4GATA,mCAA2B,OASA;AAC3B,yGATA,gCAAwB,OASA;AAkC1B,4EAA4E;AAC5E,MAAM,oBAAoB,GAAG;IAC3B;QACE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACvE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACjE,eAAe,EAAE,MAAM;QACvB,IAAI,EAAE,UAAU;KACjB;IACD;QACE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACtE,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACvE,eAAe,EAAE,MAAM;QACvB,IAAI,EAAE,UAAU;KACjB;CACF,CAAC;AAEF,MAAM,iBAAiB,GAAG,IAAI,eAAS,CAAC,oBAAoB,CAAC,CAAC;AAE9D,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAS5B,MAAM,+BAA+B,GAAG,MAAO,CAAC,CAAC,YAAY;AAE7D,MAAa,oBAAqB,SAAQ,IAAA,wDAAmC,GAA6B;IAKxG,YAAY,MAAmC;QAC7C,KAAK,EAAE,CAAC;QALD,uDAAiE;QAE1E,8DAAkE;QAIhE,uBAAA,IAAI,wCAAmB,MAAM,EAAE,kBAAkB,MAAA,CAAC;QAElD,IAAI,CAAC,iBAAiB,CACpB,MAAM,EAAE,eAAe,IAAI,+BAA+B,CAC3D,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,wBAAwB,CAAC,QAAuC;QAC9D,uBAAA,IAAI,+CAA0B,QAAQ,MAAA,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAgC;QACjD,IAAI,MAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;YACpE,kEAAkE;YAClE,OAAO;QACT,CAAC;QAED,IAAI,uBAAA,IAAI,mDAAuB,EAAE,CAAC;YAChC,uBAAA,IAAI,mDAAuB,MAA3B,IAAI,EAAwB;gBAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,kBAAkB,CACtB,KAAgC;QAEhC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;QAC1C,MAAM,QAAQ,GAAG,uBAAA,IAAI,4CAAgB,EAAE,KAAtB,IAAI,EAAmB,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,UAAU,GAAG,IAAA,oBAAY,EAAC,OAAO,CAAC,CAAC;QACzC,MAAM,eAAe,GAAG,2CAAmC,CAAC,UAAU,CAAC,CAAC;QAExE,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACzB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,WAAW,EAAE;gBACvE,cAAc;aACf,CAAC,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;gBACvC,EAAE,EAAE,eAAe;gBACnB,IAAI,EAAE,cAAc;aACrB,CAAC,CAAC;YACH,MAAM,SAAS,GAAG,iBAAiB,CAAC,oBAAoB,CACtD,WAAW,EACX,YAAY,CACb,CAAC,CAAC,CAAC,CAAC;YACL,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;YAElD,IAAI,YAAY,KAAK,EAAE,EAAE,CAAC;gBACxB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;YACzB,CAAC;YAED,MAAM,cAAc,GAAG,iBAAiB,CAAC,kBAAkB,CACzD,iBAAiB,EACjB,CAAC,YAAY,CAAC,CACf,CAAC;YACF,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;gBACvC,EAAE,EAAE,eAAe;gBACnB,IAAI,EAAE,cAAc;aACrB,CAAC,CAAC;YACH,MAAM,SAAS,GAAG,iBAAiB,CAAC,oBAAoB,CACtD,iBAAiB,EACjB,YAAY,CACb,CAAC,CAAC,CAAC,CAAC;YACL,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;YAE/C,MAAM,MAAM,GAAG,IAAA,0BAAkB,EAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,gBAAgB,CAAC,CAAC;YAC1E,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,KAAK,YAAY,KAAK;gBAC1B,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;CACF;AA9GD,oDA8GC","sourcesContent":["import { Interface } from '@ethersproject/abi';\nimport { Web3Provider } from '@ethersproject/providers';\nimport { StaticIntervalPollingControllerOnly } from '@metamask/polling-controller';\n\nimport type { Address, AccountId, ChainId } from '../types';\nimport {\n getStakingContractAddress,\n getSupportedStakingChainIds,\n isStakingContractAssetId,\n STAKING_CONTRACT_ADDRESS_BY_CHAINID,\n chainIdToHex,\n weiToHumanReadable,\n} from '../utils';\n\nexport {\n getStakingContractAddress,\n getSupportedStakingChainIds,\n isStakingContractAssetId,\n};\n\nexport type StakedBalancePollingInput = {\n /** Chain ID (hex format, e.g. 0x1) */\n chainId: ChainId;\n /** Account ID */\n accountId: AccountId;\n /** Account address */\n accountAddress: Address;\n};\n\n/** Human-readable staked balance (e.g. \"1.5\" for 1.5 ETH). */\nexport type StakedBalance = {\n amount: string;\n};\n\n/** Result reported via the update callback. */\nexport type StakedBalanceFetchResult = {\n /** Account ID (UUID). */\n accountId: AccountId;\n /** Hex chain ID. */\n chainId: ChainId;\n /** Human-readable staked balance. */\n balance: StakedBalance;\n};\n\n/**\n * Callback type for staked balance updates.\n */\nexport type OnStakedBalanceUpdateCallback = (\n result: StakedBalanceFetchResult,\n) => void;\n\n/** Staking contract ABI: getShares(account) and convertToAssets(shares). */\nconst STAKING_CONTRACT_ABI = [\n {\n inputs: [{ internalType: 'address', name: 'account', type: 'address' }],\n name: 'getShares',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint256', name: 'shares', type: 'uint256' }],\n name: 'convertToAssets',\n outputs: [{ internalType: 'uint256', name: 'assets', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n];\n\nconst STAKING_INTERFACE = new Interface(STAKING_CONTRACT_ABI);\n\nconst STAKING_DECIMALS = 18;\n\nexport type StakedBalanceFetcherConfig = {\n /** Polling interval in ms (default: 180s) */\n pollingInterval?: number;\n /** Returns the network provider for the given chain. Required for fetchStakedBalance. */\n getNetworkProvider?: (chainId: ChainId) => Web3Provider | undefined;\n};\n\nconst DEFAULT_STAKED_BALANCE_INTERVAL = 180_000; // 3 minutes\n\nexport class StakedBalanceFetcher extends StaticIntervalPollingControllerOnly<StakedBalancePollingInput>() {\n readonly #providerGetter?: (chainId: ChainId) => Web3Provider | undefined;\n\n #onStakedBalanceUpdate: OnStakedBalanceUpdateCallback | undefined;\n\n constructor(config?: StakedBalanceFetcherConfig) {\n super();\n this.#providerGetter = config?.getNetworkProvider;\n\n this.setIntervalLength(\n config?.pollingInterval ?? DEFAULT_STAKED_BALANCE_INTERVAL,\n );\n }\n\n /**\n * Register a callback that is invoked after every successful poll with\n * the staked balance (including zero). Zero is reported so that merged\n * updates can clear prior non-zero state.\n *\n * @param callback - The callback to invoke.\n */\n setOnStakedBalanceUpdate(callback: OnStakedBalanceUpdateCallback): void {\n this.#onStakedBalanceUpdate = callback;\n }\n\n async _executePoll(input: StakedBalancePollingInput): Promise<void> {\n let result: StakedBalance;\n try {\n result = await this.fetchStakedBalance(input);\n } catch {\n // Do not push an update on provider/RPC failure; otherwise we would\n // overwrite existing non-zero staked balances with zero in state.\n return;\n }\n\n if (this.#onStakedBalanceUpdate) {\n this.#onStakedBalanceUpdate({\n accountId: input.accountId,\n chainId: input.chainId,\n balance: result,\n });\n }\n }\n\n /**\n * Fetches the staked balance for an account on a chain using the same\n * staking contract as AccountTrackerController (getShares then convertToAssets).\n * Returns a human-readable amount string (e.g. \"1.5\" for 1.5 ETH).\n * Throws when no provider is available or when the RPC/contract call fails, so\n * callers do not persist a false zero and overwrite existing balances.\n *\n * @param input - Chain, account ID, and address to query.\n * @returns Human-readable staked balance (amount string).\n * @throws When provider is missing or when getShares/convertToAssets fails.\n */\n async fetchStakedBalance(\n input: StakedBalancePollingInput,\n ): Promise<StakedBalance> {\n const { chainId, accountAddress } = input;\n const provider = this.#providerGetter?.(chainId);\n if (!provider) {\n throw new Error('StakedBalanceFetcher: no provider available for chain');\n }\n const hexChainId = chainIdToHex(chainId);\n const contractAddress = STAKING_CONTRACT_ADDRESS_BY_CHAINID[hexChainId];\n\n if (!contractAddress) {\n return { amount: '0' };\n }\n\n try {\n const sharesCalldata = STAKING_INTERFACE.encodeFunctionData('getShares', [\n accountAddress,\n ]);\n const sharesResult = await provider.call({\n to: contractAddress,\n data: sharesCalldata,\n });\n const sharesRaw = STAKING_INTERFACE.decodeFunctionResult(\n 'getShares',\n sharesResult,\n )[0];\n const sharesBigNum = BigInt(sharesRaw.toString());\n\n if (sharesBigNum === 0n) {\n return { amount: '0' };\n }\n\n const assetsCalldata = STAKING_INTERFACE.encodeFunctionData(\n 'convertToAssets',\n [sharesBigNum],\n );\n const assetsResult = await provider.call({\n to: contractAddress,\n data: assetsCalldata,\n });\n const assetsRaw = STAKING_INTERFACE.decodeFunctionResult(\n 'convertToAssets',\n assetsResult,\n )[0];\n const assetsWei = BigInt(assetsRaw.toString());\n\n const amount = weiToHumanReadable(assetsWei.toString(), STAKING_DECIMALS);\n return { amount };\n } catch (error) {\n throw error instanceof Error\n ? error\n : new Error('StakedBalanceFetcher: failed to fetch staked balance');\n }\n }\n}\n"]}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { Web3Provider } from "@ethersproject/providers";
|
|
2
|
-
import type { Address, AccountId, ChainId } from "../types/index.cjs";
|
|
3
|
-
import { getStakingContractAddress, getSupportedStakingChainIds, isStakingContractAssetId } from "../utils/index.cjs";
|
|
4
|
-
export { getStakingContractAddress, getSupportedStakingChainIds, isStakingContractAssetId, };
|
|
5
|
-
export type StakedBalancePollingInput = {
|
|
6
|
-
/** Chain ID (hex format, e.g. 0x1) */
|
|
7
|
-
chainId: ChainId;
|
|
8
|
-
/** Account ID */
|
|
9
|
-
accountId: AccountId;
|
|
10
|
-
/** Account address */
|
|
11
|
-
accountAddress: Address;
|
|
12
|
-
};
|
|
13
|
-
/** Human-readable staked balance (e.g. "1.5" for 1.5 ETH). */
|
|
14
|
-
export type StakedBalance = {
|
|
15
|
-
amount: string;
|
|
16
|
-
};
|
|
17
|
-
/** Result reported via the update callback. */
|
|
18
|
-
export type StakedBalanceFetchResult = {
|
|
19
|
-
/** Account ID (UUID). */
|
|
20
|
-
accountId: AccountId;
|
|
21
|
-
/** Hex chain ID. */
|
|
22
|
-
chainId: ChainId;
|
|
23
|
-
/** Human-readable staked balance. */
|
|
24
|
-
balance: StakedBalance;
|
|
25
|
-
};
|
|
26
|
-
/**
|
|
27
|
-
* Callback type for staked balance updates.
|
|
28
|
-
*/
|
|
29
|
-
export type OnStakedBalanceUpdateCallback = (result: StakedBalanceFetchResult) => void;
|
|
30
|
-
export type StakedBalanceFetcherConfig = {
|
|
31
|
-
/** Polling interval in ms (default: 180s) */
|
|
32
|
-
pollingInterval?: number;
|
|
33
|
-
/** Returns the network provider for the given chain. Required for fetchStakedBalance. */
|
|
34
|
-
getNetworkProvider?: (chainId: ChainId) => Web3Provider | undefined;
|
|
35
|
-
};
|
|
36
|
-
declare const StakedBalanceFetcher_base: (abstract new (...args: any[]) => {
|
|
37
|
-
readonly "__#15@#intervalIds": Record<string, NodeJS.Timeout>;
|
|
38
|
-
"__#15@#intervalLength": number | undefined;
|
|
39
|
-
setIntervalLength(intervalLength: number): void;
|
|
40
|
-
getIntervalLength(): number | undefined;
|
|
41
|
-
_startPolling(input: StakedBalancePollingInput): void;
|
|
42
|
-
_stopPollingByPollingTokenSetId(key: string): void;
|
|
43
|
-
readonly "__#3@#pollingTokenSets": Map<string, Set<string>>;
|
|
44
|
-
readonly "__#3@#callbacks": Map<string, Set<(input: StakedBalancePollingInput) => void>>;
|
|
45
|
-
_executePoll(input: StakedBalancePollingInput): Promise<void>;
|
|
46
|
-
startPolling(input: StakedBalancePollingInput): string;
|
|
47
|
-
stopAllPolling(): void;
|
|
48
|
-
stopPollingByPollingToken(pollingToken: string): void;
|
|
49
|
-
onPollingComplete(input: StakedBalancePollingInput, callback: (input: StakedBalancePollingInput) => void): void;
|
|
50
|
-
}) & {
|
|
51
|
-
new (): {};
|
|
52
|
-
};
|
|
53
|
-
export declare class StakedBalanceFetcher extends StakedBalanceFetcher_base {
|
|
54
|
-
#private;
|
|
55
|
-
constructor(config?: StakedBalanceFetcherConfig);
|
|
56
|
-
/**
|
|
57
|
-
* Register a callback that is invoked after every successful poll with
|
|
58
|
-
* the staked balance (including zero). Zero is reported so that merged
|
|
59
|
-
* updates can clear prior non-zero state.
|
|
60
|
-
*
|
|
61
|
-
* @param callback - The callback to invoke.
|
|
62
|
-
*/
|
|
63
|
-
setOnStakedBalanceUpdate(callback: OnStakedBalanceUpdateCallback): void;
|
|
64
|
-
_executePoll(input: StakedBalancePollingInput): Promise<void>;
|
|
65
|
-
/**
|
|
66
|
-
* Fetches the staked balance for an account on a chain using the same
|
|
67
|
-
* staking contract as AccountTrackerController (getShares then convertToAssets).
|
|
68
|
-
* Returns a human-readable amount string (e.g. "1.5" for 1.5 ETH).
|
|
69
|
-
* Throws when no provider is available or when the RPC/contract call fails, so
|
|
70
|
-
* callers do not persist a false zero and overwrite existing balances.
|
|
71
|
-
*
|
|
72
|
-
* @param input - Chain, account ID, and address to query.
|
|
73
|
-
* @returns Human-readable staked balance (amount string).
|
|
74
|
-
* @throws When provider is missing or when getShares/convertToAssets fails.
|
|
75
|
-
*/
|
|
76
|
-
fetchStakedBalance(input: StakedBalancePollingInput): Promise<StakedBalance>;
|
|
77
|
-
}
|
|
78
|
-
//# sourceMappingURL=StakedBalanceFetcher.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StakedBalanceFetcher.d.cts","sourceRoot":"","sources":["../../../../src/data-sources/evm-rpc-services/services/StakedBalanceFetcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,iCAAiC;AAGxD,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,2BAAiB;AAC5D,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,wBAAwB,EAIzB,2BAAiB;AAElB,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,wBAAwB,GACzB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,sBAAsB;IACtB,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,8DAA8D;AAC9D,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,+CAA+C;AAC/C,MAAM,MAAM,wBAAwB,GAAG;IACrC,yBAAyB;IACzB,SAAS,EAAE,SAAS,CAAC;IACrB,oBAAoB;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,qCAAqC;IACrC,OAAO,EAAE,aAAa,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,6BAA6B,GAAG,CAC1C,MAAM,EAAE,wBAAwB,KAC7B,IAAI,CAAC;AAwBV,MAAM,MAAM,0BAA0B,GAAG;IACvC,6CAA6C;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yFAAyF;IACzF,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,YAAY,GAAG,SAAS,CAAC;CACrE,CAAC;;;;;;;;;;;;;;;;;;AAIF,qBAAa,oBAAqB,SAAQ,yBAAgE;;gBAK5F,MAAM,CAAC,EAAE,0BAA0B;IAS/C;;;;;;OAMG;IACH,wBAAwB,CAAC,QAAQ,EAAE,6BAA6B,GAAG,IAAI;IAIjE,YAAY,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBnE;;;;;;;;;;OAUG;IACG,kBAAkB,CACtB,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,aAAa,CAAC;CAqD1B"}
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
import { Web3Provider } from "@ethersproject/providers";
|
|
2
|
-
import type { Address, AccountId, ChainId } from "../types/index.mjs";
|
|
3
|
-
import { getStakingContractAddress, getSupportedStakingChainIds, isStakingContractAssetId } from "../utils/index.mjs";
|
|
4
|
-
export { getStakingContractAddress, getSupportedStakingChainIds, isStakingContractAssetId, };
|
|
5
|
-
export type StakedBalancePollingInput = {
|
|
6
|
-
/** Chain ID (hex format, e.g. 0x1) */
|
|
7
|
-
chainId: ChainId;
|
|
8
|
-
/** Account ID */
|
|
9
|
-
accountId: AccountId;
|
|
10
|
-
/** Account address */
|
|
11
|
-
accountAddress: Address;
|
|
12
|
-
};
|
|
13
|
-
/** Human-readable staked balance (e.g. "1.5" for 1.5 ETH). */
|
|
14
|
-
export type StakedBalance = {
|
|
15
|
-
amount: string;
|
|
16
|
-
};
|
|
17
|
-
/** Result reported via the update callback. */
|
|
18
|
-
export type StakedBalanceFetchResult = {
|
|
19
|
-
/** Account ID (UUID). */
|
|
20
|
-
accountId: AccountId;
|
|
21
|
-
/** Hex chain ID. */
|
|
22
|
-
chainId: ChainId;
|
|
23
|
-
/** Human-readable staked balance. */
|
|
24
|
-
balance: StakedBalance;
|
|
25
|
-
};
|
|
26
|
-
/**
|
|
27
|
-
* Callback type for staked balance updates.
|
|
28
|
-
*/
|
|
29
|
-
export type OnStakedBalanceUpdateCallback = (result: StakedBalanceFetchResult) => void;
|
|
30
|
-
export type StakedBalanceFetcherConfig = {
|
|
31
|
-
/** Polling interval in ms (default: 180s) */
|
|
32
|
-
pollingInterval?: number;
|
|
33
|
-
/** Returns the network provider for the given chain. Required for fetchStakedBalance. */
|
|
34
|
-
getNetworkProvider?: (chainId: ChainId) => Web3Provider | undefined;
|
|
35
|
-
};
|
|
36
|
-
declare const StakedBalanceFetcher_base: (abstract new (...args: any[]) => {
|
|
37
|
-
readonly "__#15@#intervalIds": Record<string, NodeJS.Timeout>;
|
|
38
|
-
"__#15@#intervalLength": number | undefined;
|
|
39
|
-
setIntervalLength(intervalLength: number): void;
|
|
40
|
-
getIntervalLength(): number | undefined;
|
|
41
|
-
_startPolling(input: StakedBalancePollingInput): void;
|
|
42
|
-
_stopPollingByPollingTokenSetId(key: string): void;
|
|
43
|
-
readonly "__#3@#pollingTokenSets": Map<string, Set<string>>;
|
|
44
|
-
readonly "__#3@#callbacks": Map<string, Set<(input: StakedBalancePollingInput) => void>>;
|
|
45
|
-
_executePoll(input: StakedBalancePollingInput): Promise<void>;
|
|
46
|
-
startPolling(input: StakedBalancePollingInput): string;
|
|
47
|
-
stopAllPolling(): void;
|
|
48
|
-
stopPollingByPollingToken(pollingToken: string): void;
|
|
49
|
-
onPollingComplete(input: StakedBalancePollingInput, callback: (input: StakedBalancePollingInput) => void): void;
|
|
50
|
-
}) & {
|
|
51
|
-
new (): {};
|
|
52
|
-
};
|
|
53
|
-
export declare class StakedBalanceFetcher extends StakedBalanceFetcher_base {
|
|
54
|
-
#private;
|
|
55
|
-
constructor(config?: StakedBalanceFetcherConfig);
|
|
56
|
-
/**
|
|
57
|
-
* Register a callback that is invoked after every successful poll with
|
|
58
|
-
* the staked balance (including zero). Zero is reported so that merged
|
|
59
|
-
* updates can clear prior non-zero state.
|
|
60
|
-
*
|
|
61
|
-
* @param callback - The callback to invoke.
|
|
62
|
-
*/
|
|
63
|
-
setOnStakedBalanceUpdate(callback: OnStakedBalanceUpdateCallback): void;
|
|
64
|
-
_executePoll(input: StakedBalancePollingInput): Promise<void>;
|
|
65
|
-
/**
|
|
66
|
-
* Fetches the staked balance for an account on a chain using the same
|
|
67
|
-
* staking contract as AccountTrackerController (getShares then convertToAssets).
|
|
68
|
-
* Returns a human-readable amount string (e.g. "1.5" for 1.5 ETH).
|
|
69
|
-
* Throws when no provider is available or when the RPC/contract call fails, so
|
|
70
|
-
* callers do not persist a false zero and overwrite existing balances.
|
|
71
|
-
*
|
|
72
|
-
* @param input - Chain, account ID, and address to query.
|
|
73
|
-
* @returns Human-readable staked balance (amount string).
|
|
74
|
-
* @throws When provider is missing or when getShares/convertToAssets fails.
|
|
75
|
-
*/
|
|
76
|
-
fetchStakedBalance(input: StakedBalancePollingInput): Promise<StakedBalance>;
|
|
77
|
-
}
|
|
78
|
-
//# sourceMappingURL=StakedBalanceFetcher.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StakedBalanceFetcher.d.mts","sourceRoot":"","sources":["../../../../src/data-sources/evm-rpc-services/services/StakedBalanceFetcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,iCAAiC;AAGxD,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,2BAAiB;AAC5D,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,wBAAwB,EAIzB,2BAAiB;AAElB,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,wBAAwB,GACzB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,sCAAsC;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,iBAAiB;IACjB,SAAS,EAAE,SAAS,CAAC;IACrB,sBAAsB;IACtB,cAAc,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,8DAA8D;AAC9D,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,+CAA+C;AAC/C,MAAM,MAAM,wBAAwB,GAAG;IACrC,yBAAyB;IACzB,SAAS,EAAE,SAAS,CAAC;IACrB,oBAAoB;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,qCAAqC;IACrC,OAAO,EAAE,aAAa,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,MAAM,MAAM,6BAA6B,GAAG,CAC1C,MAAM,EAAE,wBAAwB,KAC7B,IAAI,CAAC;AAwBV,MAAM,MAAM,0BAA0B,GAAG;IACvC,6CAA6C;IAC7C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,yFAAyF;IACzF,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,YAAY,GAAG,SAAS,CAAC;CACrE,CAAC;;;;;;;;;;;;;;;;;;AAIF,qBAAa,oBAAqB,SAAQ,yBAAgE;;gBAK5F,MAAM,CAAC,EAAE,0BAA0B;IAS/C;;;;;;OAMG;IACH,wBAAwB,CAAC,QAAQ,EAAE,6BAA6B,GAAG,IAAI;IAIjE,YAAY,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBnE;;;;;;;;;;OAUG;IACG,kBAAkB,CACtB,KAAK,EAAE,yBAAyB,GAC/B,OAAO,CAAC,aAAa,CAAC;CAqD1B"}
|
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
-
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
-
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
-
};
|
|
7
|
-
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
-
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
-
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
-
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
-
};
|
|
12
|
-
var _StakedBalanceFetcher_providerGetter, _StakedBalanceFetcher_onStakedBalanceUpdate;
|
|
13
|
-
import { Interface } from "@ethersproject/abi";
|
|
14
|
-
import { Web3Provider } from "@ethersproject/providers";
|
|
15
|
-
import { StaticIntervalPollingControllerOnly } from "@metamask/polling-controller";
|
|
16
|
-
import { getStakingContractAddress, getSupportedStakingChainIds, isStakingContractAssetId, STAKING_CONTRACT_ADDRESS_BY_CHAINID, chainIdToHex, weiToHumanReadable } from "../utils/index.mjs";
|
|
17
|
-
export { getStakingContractAddress, getSupportedStakingChainIds, isStakingContractAssetId };
|
|
18
|
-
/** Staking contract ABI: getShares(account) and convertToAssets(shares). */
|
|
19
|
-
const STAKING_CONTRACT_ABI = [
|
|
20
|
-
{
|
|
21
|
-
inputs: [{ internalType: 'address', name: 'account', type: 'address' }],
|
|
22
|
-
name: 'getShares',
|
|
23
|
-
outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
|
|
24
|
-
stateMutability: 'view',
|
|
25
|
-
type: 'function',
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
inputs: [{ internalType: 'uint256', name: 'shares', type: 'uint256' }],
|
|
29
|
-
name: 'convertToAssets',
|
|
30
|
-
outputs: [{ internalType: 'uint256', name: 'assets', type: 'uint256' }],
|
|
31
|
-
stateMutability: 'view',
|
|
32
|
-
type: 'function',
|
|
33
|
-
},
|
|
34
|
-
];
|
|
35
|
-
const STAKING_INTERFACE = new Interface(STAKING_CONTRACT_ABI);
|
|
36
|
-
const STAKING_DECIMALS = 18;
|
|
37
|
-
const DEFAULT_STAKED_BALANCE_INTERVAL = 180000; // 3 minutes
|
|
38
|
-
export class StakedBalanceFetcher extends StaticIntervalPollingControllerOnly() {
|
|
39
|
-
constructor(config) {
|
|
40
|
-
super();
|
|
41
|
-
_StakedBalanceFetcher_providerGetter.set(this, void 0);
|
|
42
|
-
_StakedBalanceFetcher_onStakedBalanceUpdate.set(this, void 0);
|
|
43
|
-
__classPrivateFieldSet(this, _StakedBalanceFetcher_providerGetter, config?.getNetworkProvider, "f");
|
|
44
|
-
this.setIntervalLength(config?.pollingInterval ?? DEFAULT_STAKED_BALANCE_INTERVAL);
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Register a callback that is invoked after every successful poll with
|
|
48
|
-
* the staked balance (including zero). Zero is reported so that merged
|
|
49
|
-
* updates can clear prior non-zero state.
|
|
50
|
-
*
|
|
51
|
-
* @param callback - The callback to invoke.
|
|
52
|
-
*/
|
|
53
|
-
setOnStakedBalanceUpdate(callback) {
|
|
54
|
-
__classPrivateFieldSet(this, _StakedBalanceFetcher_onStakedBalanceUpdate, callback, "f");
|
|
55
|
-
}
|
|
56
|
-
async _executePoll(input) {
|
|
57
|
-
let result;
|
|
58
|
-
try {
|
|
59
|
-
result = await this.fetchStakedBalance(input);
|
|
60
|
-
}
|
|
61
|
-
catch {
|
|
62
|
-
// Do not push an update on provider/RPC failure; otherwise we would
|
|
63
|
-
// overwrite existing non-zero staked balances with zero in state.
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
if (__classPrivateFieldGet(this, _StakedBalanceFetcher_onStakedBalanceUpdate, "f")) {
|
|
67
|
-
__classPrivateFieldGet(this, _StakedBalanceFetcher_onStakedBalanceUpdate, "f").call(this, {
|
|
68
|
-
accountId: input.accountId,
|
|
69
|
-
chainId: input.chainId,
|
|
70
|
-
balance: result,
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Fetches the staked balance for an account on a chain using the same
|
|
76
|
-
* staking contract as AccountTrackerController (getShares then convertToAssets).
|
|
77
|
-
* Returns a human-readable amount string (e.g. "1.5" for 1.5 ETH).
|
|
78
|
-
* Throws when no provider is available or when the RPC/contract call fails, so
|
|
79
|
-
* callers do not persist a false zero and overwrite existing balances.
|
|
80
|
-
*
|
|
81
|
-
* @param input - Chain, account ID, and address to query.
|
|
82
|
-
* @returns Human-readable staked balance (amount string).
|
|
83
|
-
* @throws When provider is missing or when getShares/convertToAssets fails.
|
|
84
|
-
*/
|
|
85
|
-
async fetchStakedBalance(input) {
|
|
86
|
-
const { chainId, accountAddress } = input;
|
|
87
|
-
const provider = __classPrivateFieldGet(this, _StakedBalanceFetcher_providerGetter, "f")?.call(this, chainId);
|
|
88
|
-
if (!provider) {
|
|
89
|
-
throw new Error('StakedBalanceFetcher: no provider available for chain');
|
|
90
|
-
}
|
|
91
|
-
const hexChainId = chainIdToHex(chainId);
|
|
92
|
-
const contractAddress = STAKING_CONTRACT_ADDRESS_BY_CHAINID[hexChainId];
|
|
93
|
-
if (!contractAddress) {
|
|
94
|
-
return { amount: '0' };
|
|
95
|
-
}
|
|
96
|
-
try {
|
|
97
|
-
const sharesCalldata = STAKING_INTERFACE.encodeFunctionData('getShares', [
|
|
98
|
-
accountAddress,
|
|
99
|
-
]);
|
|
100
|
-
const sharesResult = await provider.call({
|
|
101
|
-
to: contractAddress,
|
|
102
|
-
data: sharesCalldata,
|
|
103
|
-
});
|
|
104
|
-
const sharesRaw = STAKING_INTERFACE.decodeFunctionResult('getShares', sharesResult)[0];
|
|
105
|
-
const sharesBigNum = BigInt(sharesRaw.toString());
|
|
106
|
-
if (sharesBigNum === 0n) {
|
|
107
|
-
return { amount: '0' };
|
|
108
|
-
}
|
|
109
|
-
const assetsCalldata = STAKING_INTERFACE.encodeFunctionData('convertToAssets', [sharesBigNum]);
|
|
110
|
-
const assetsResult = await provider.call({
|
|
111
|
-
to: contractAddress,
|
|
112
|
-
data: assetsCalldata,
|
|
113
|
-
});
|
|
114
|
-
const assetsRaw = STAKING_INTERFACE.decodeFunctionResult('convertToAssets', assetsResult)[0];
|
|
115
|
-
const assetsWei = BigInt(assetsRaw.toString());
|
|
116
|
-
const amount = weiToHumanReadable(assetsWei.toString(), STAKING_DECIMALS);
|
|
117
|
-
return { amount };
|
|
118
|
-
}
|
|
119
|
-
catch (error) {
|
|
120
|
-
throw error instanceof Error
|
|
121
|
-
? error
|
|
122
|
-
: new Error('StakedBalanceFetcher: failed to fetch staked balance');
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
_StakedBalanceFetcher_providerGetter = new WeakMap(), _StakedBalanceFetcher_onStakedBalanceUpdate = new WeakMap();
|
|
127
|
-
//# sourceMappingURL=StakedBalanceFetcher.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StakedBalanceFetcher.mjs","sourceRoot":"","sources":["../../../../src/data-sources/evm-rpc-services/services/StakedBalanceFetcher.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,OAAO,EAAE,SAAS,EAAE,2BAA2B;AAC/C,OAAO,EAAE,YAAY,EAAE,iCAAiC;AACxD,OAAO,EAAE,mCAAmC,EAAE,qCAAqC;AAGnF,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,wBAAwB,EACxB,mCAAmC,EACnC,YAAY,EACZ,kBAAkB,EACnB,2BAAiB;AAElB,OAAO,EACL,yBAAyB,EACzB,2BAA2B,EAC3B,wBAAwB,EACzB,CAAC;AAiCF,4EAA4E;AAC5E,MAAM,oBAAoB,GAAG;IAC3B;QACE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACvE,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACjE,eAAe,EAAE,MAAM;QACvB,IAAI,EAAE,UAAU;KACjB;IACD;QACE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACtE,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACvE,eAAe,EAAE,MAAM;QACvB,IAAI,EAAE,UAAU;KACjB;CACF,CAAC;AAEF,MAAM,iBAAiB,GAAG,IAAI,SAAS,CAAC,oBAAoB,CAAC,CAAC;AAE9D,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAS5B,MAAM,+BAA+B,GAAG,MAAO,CAAC,CAAC,YAAY;AAE7D,MAAM,OAAO,oBAAqB,SAAQ,mCAAmC,EAA6B;IAKxG,YAAY,MAAmC;QAC7C,KAAK,EAAE,CAAC;QALD,uDAAiE;QAE1E,8DAAkE;QAIhE,uBAAA,IAAI,wCAAmB,MAAM,EAAE,kBAAkB,MAAA,CAAC;QAElD,IAAI,CAAC,iBAAiB,CACpB,MAAM,EAAE,eAAe,IAAI,+BAA+B,CAC3D,CAAC;IACJ,CAAC;IAED;;;;;;OAMG;IACH,wBAAwB,CAAC,QAAuC;QAC9D,uBAAA,IAAI,+CAA0B,QAAQ,MAAA,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,KAAgC;QACjD,IAAI,MAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;YACpE,kEAAkE;YAClE,OAAO;QACT,CAAC;QAED,IAAI,uBAAA,IAAI,mDAAuB,EAAE,CAAC;YAChC,uBAAA,IAAI,mDAAuB,MAA3B,IAAI,EAAwB;gBAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,OAAO,EAAE,MAAM;aAChB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,kBAAkB,CACtB,KAAgC;QAEhC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;QAC1C,MAAM,QAAQ,GAAG,uBAAA,IAAI,4CAAgB,EAAE,KAAtB,IAAI,EAAmB,OAAO,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,eAAe,GAAG,mCAAmC,CAAC,UAAU,CAAC,CAAC;QAExE,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;QACzB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,WAAW,EAAE;gBACvE,cAAc;aACf,CAAC,CAAC;YACH,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;gBACvC,EAAE,EAAE,eAAe;gBACnB,IAAI,EAAE,cAAc;aACrB,CAAC,CAAC;YACH,MAAM,SAAS,GAAG,iBAAiB,CAAC,oBAAoB,CACtD,WAAW,EACX,YAAY,CACb,CAAC,CAAC,CAAC,CAAC;YACL,MAAM,YAAY,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;YAElD,IAAI,YAAY,KAAK,EAAE,EAAE,CAAC;gBACxB,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;YACzB,CAAC;YAED,MAAM,cAAc,GAAG,iBAAiB,CAAC,kBAAkB,CACzD,iBAAiB,EACjB,CAAC,YAAY,CAAC,CACf,CAAC;YACF,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC;gBACvC,EAAE,EAAE,eAAe;gBACnB,IAAI,EAAE,cAAc;aACrB,CAAC,CAAC;YACH,MAAM,SAAS,GAAG,iBAAiB,CAAC,oBAAoB,CACtD,iBAAiB,EACjB,YAAY,CACb,CAAC,CAAC,CAAC,CAAC;YACL,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;YAE/C,MAAM,MAAM,GAAG,kBAAkB,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,gBAAgB,CAAC,CAAC;YAC1E,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,KAAK,YAAY,KAAK;gBAC1B,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;CACF","sourcesContent":["import { Interface } from '@ethersproject/abi';\nimport { Web3Provider } from '@ethersproject/providers';\nimport { StaticIntervalPollingControllerOnly } from '@metamask/polling-controller';\n\nimport type { Address, AccountId, ChainId } from '../types';\nimport {\n getStakingContractAddress,\n getSupportedStakingChainIds,\n isStakingContractAssetId,\n STAKING_CONTRACT_ADDRESS_BY_CHAINID,\n chainIdToHex,\n weiToHumanReadable,\n} from '../utils';\n\nexport {\n getStakingContractAddress,\n getSupportedStakingChainIds,\n isStakingContractAssetId,\n};\n\nexport type StakedBalancePollingInput = {\n /** Chain ID (hex format, e.g. 0x1) */\n chainId: ChainId;\n /** Account ID */\n accountId: AccountId;\n /** Account address */\n accountAddress: Address;\n};\n\n/** Human-readable staked balance (e.g. \"1.5\" for 1.5 ETH). */\nexport type StakedBalance = {\n amount: string;\n};\n\n/** Result reported via the update callback. */\nexport type StakedBalanceFetchResult = {\n /** Account ID (UUID). */\n accountId: AccountId;\n /** Hex chain ID. */\n chainId: ChainId;\n /** Human-readable staked balance. */\n balance: StakedBalance;\n};\n\n/**\n * Callback type for staked balance updates.\n */\nexport type OnStakedBalanceUpdateCallback = (\n result: StakedBalanceFetchResult,\n) => void;\n\n/** Staking contract ABI: getShares(account) and convertToAssets(shares). */\nconst STAKING_CONTRACT_ABI = [\n {\n inputs: [{ internalType: 'address', name: 'account', type: 'address' }],\n name: 'getShares',\n outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n {\n inputs: [{ internalType: 'uint256', name: 'shares', type: 'uint256' }],\n name: 'convertToAssets',\n outputs: [{ internalType: 'uint256', name: 'assets', type: 'uint256' }],\n stateMutability: 'view',\n type: 'function',\n },\n];\n\nconst STAKING_INTERFACE = new Interface(STAKING_CONTRACT_ABI);\n\nconst STAKING_DECIMALS = 18;\n\nexport type StakedBalanceFetcherConfig = {\n /** Polling interval in ms (default: 180s) */\n pollingInterval?: number;\n /** Returns the network provider for the given chain. Required for fetchStakedBalance. */\n getNetworkProvider?: (chainId: ChainId) => Web3Provider | undefined;\n};\n\nconst DEFAULT_STAKED_BALANCE_INTERVAL = 180_000; // 3 minutes\n\nexport class StakedBalanceFetcher extends StaticIntervalPollingControllerOnly<StakedBalancePollingInput>() {\n readonly #providerGetter?: (chainId: ChainId) => Web3Provider | undefined;\n\n #onStakedBalanceUpdate: OnStakedBalanceUpdateCallback | undefined;\n\n constructor(config?: StakedBalanceFetcherConfig) {\n super();\n this.#providerGetter = config?.getNetworkProvider;\n\n this.setIntervalLength(\n config?.pollingInterval ?? DEFAULT_STAKED_BALANCE_INTERVAL,\n );\n }\n\n /**\n * Register a callback that is invoked after every successful poll with\n * the staked balance (including zero). Zero is reported so that merged\n * updates can clear prior non-zero state.\n *\n * @param callback - The callback to invoke.\n */\n setOnStakedBalanceUpdate(callback: OnStakedBalanceUpdateCallback): void {\n this.#onStakedBalanceUpdate = callback;\n }\n\n async _executePoll(input: StakedBalancePollingInput): Promise<void> {\n let result: StakedBalance;\n try {\n result = await this.fetchStakedBalance(input);\n } catch {\n // Do not push an update on provider/RPC failure; otherwise we would\n // overwrite existing non-zero staked balances with zero in state.\n return;\n }\n\n if (this.#onStakedBalanceUpdate) {\n this.#onStakedBalanceUpdate({\n accountId: input.accountId,\n chainId: input.chainId,\n balance: result,\n });\n }\n }\n\n /**\n * Fetches the staked balance for an account on a chain using the same\n * staking contract as AccountTrackerController (getShares then convertToAssets).\n * Returns a human-readable amount string (e.g. \"1.5\" for 1.5 ETH).\n * Throws when no provider is available or when the RPC/contract call fails, so\n * callers do not persist a false zero and overwrite existing balances.\n *\n * @param input - Chain, account ID, and address to query.\n * @returns Human-readable staked balance (amount string).\n * @throws When provider is missing or when getShares/convertToAssets fails.\n */\n async fetchStakedBalance(\n input: StakedBalancePollingInput,\n ): Promise<StakedBalance> {\n const { chainId, accountAddress } = input;\n const provider = this.#providerGetter?.(chainId);\n if (!provider) {\n throw new Error('StakedBalanceFetcher: no provider available for chain');\n }\n const hexChainId = chainIdToHex(chainId);\n const contractAddress = STAKING_CONTRACT_ADDRESS_BY_CHAINID[hexChainId];\n\n if (!contractAddress) {\n return { amount: '0' };\n }\n\n try {\n const sharesCalldata = STAKING_INTERFACE.encodeFunctionData('getShares', [\n accountAddress,\n ]);\n const sharesResult = await provider.call({\n to: contractAddress,\n data: sharesCalldata,\n });\n const sharesRaw = STAKING_INTERFACE.decodeFunctionResult(\n 'getShares',\n sharesResult,\n )[0];\n const sharesBigNum = BigInt(sharesRaw.toString());\n\n if (sharesBigNum === 0n) {\n return { amount: '0' };\n }\n\n const assetsCalldata = STAKING_INTERFACE.encodeFunctionData(\n 'convertToAssets',\n [sharesBigNum],\n );\n const assetsResult = await provider.call({\n to: contractAddress,\n data: assetsCalldata,\n });\n const assetsRaw = STAKING_INTERFACE.decodeFunctionResult(\n 'convertToAssets',\n assetsResult,\n )[0];\n const assetsWei = BigInt(assetsRaw.toString());\n\n const amount = weiToHumanReadable(assetsWei.toString(), STAKING_DECIMALS);\n return { amount };\n } catch (error) {\n throw error instanceof Error\n ? error\n : new Error('StakedBalanceFetcher: failed to fetch staked balance');\n }\n }\n}\n"]}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.chainIdToHex = exports.weiToHumanReadable = void 0;
|
|
4
|
-
/**
|
|
5
|
-
* Convert wei (decimal string) to human-readable amount with decimals, trim trailing zeros.
|
|
6
|
-
*
|
|
7
|
-
* @param weiStr - Balance in wei as decimal string.
|
|
8
|
-
* @param decimals - Token decimals (e.g. 18).
|
|
9
|
-
* @returns Human-readable amount string (e.g. "1.5").
|
|
10
|
-
*/
|
|
11
|
-
function weiToHumanReadable(weiStr, decimals) {
|
|
12
|
-
const padded = weiStr.padStart(decimals + 1, '0');
|
|
13
|
-
const len = padded.length;
|
|
14
|
-
const intPart = padded.slice(0, len - decimals);
|
|
15
|
-
const fracPart = padded.slice(len - decimals).replace(/0+$/u, '') || '0';
|
|
16
|
-
return fracPart === '0' ? intPart : `${intPart}.${fracPart}`;
|
|
17
|
-
}
|
|
18
|
-
exports.weiToHumanReadable = weiToHumanReadable;
|
|
19
|
-
/**
|
|
20
|
-
* Normalize chain ID to hex for contract lookup (e.g. eip155:1 -> 0x1).
|
|
21
|
-
*
|
|
22
|
-
* @param chainId - CAIP-2 or hex chain ID.
|
|
23
|
-
* @returns Hex chain ID for contract map lookup.
|
|
24
|
-
*/
|
|
25
|
-
function chainIdToHex(chainId) {
|
|
26
|
-
if (typeof chainId === 'string' && chainId.startsWith('eip155:')) {
|
|
27
|
-
const decimalPart = chainId.split(':')[1];
|
|
28
|
-
const decimalValue = parseInt(decimalPart, 10);
|
|
29
|
-
return `0x${decimalValue.toString(16)}`;
|
|
30
|
-
}
|
|
31
|
-
return chainId;
|
|
32
|
-
}
|
|
33
|
-
exports.chainIdToHex = chainIdToHex;
|
|
34
|
-
//# sourceMappingURL=parsing.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parsing.cjs","sourceRoot":"","sources":["../../../../src/data-sources/evm-rpc-services/utils/parsing.ts"],"names":[],"mappings":";;;AAIA;;;;;;GAMG;AACH,SAAgB,kBAAkB,CAAC,MAAc,EAAE,QAAgB;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;IAC1B,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,QAAQ,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;IACzE,OAAO,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,QAAQ,EAAE,CAAC;AAC/D,CAAC;AAND,gDAMC;AAED;;;;;GAKG;AACH,SAAgB,YAAY,CAAC,OAAgB;IAC3C,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACjE,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO,KAAK,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAPD,oCAOC","sourcesContent":["import type { Hex } from '@metamask/utils';\n\nimport type { ChainId } from '../types';\n\n/**\n * Convert wei (decimal string) to human-readable amount with decimals, trim trailing zeros.\n *\n * @param weiStr - Balance in wei as decimal string.\n * @param decimals - Token decimals (e.g. 18).\n * @returns Human-readable amount string (e.g. \"1.5\").\n */\nexport function weiToHumanReadable(weiStr: string, decimals: number): string {\n const padded = weiStr.padStart(decimals + 1, '0');\n const len = padded.length;\n const intPart = padded.slice(0, len - decimals);\n const fracPart = padded.slice(len - decimals).replace(/0+$/u, '') || '0';\n return fracPart === '0' ? intPart : `${intPart}.${fracPart}`;\n}\n\n/**\n * Normalize chain ID to hex for contract lookup (e.g. eip155:1 -> 0x1).\n *\n * @param chainId - CAIP-2 or hex chain ID.\n * @returns Hex chain ID for contract map lookup.\n */\nexport function chainIdToHex(chainId: ChainId): Hex {\n if (typeof chainId === 'string' && chainId.startsWith('eip155:')) {\n const decimalPart = chainId.split(':')[1];\n const decimalValue = parseInt(decimalPart, 10);\n return `0x${decimalValue.toString(16)}`;\n }\n return chainId;\n}\n"]}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { Hex } from "@metamask/utils";
|
|
2
|
-
import type { ChainId } from "../types/index.cjs";
|
|
3
|
-
/**
|
|
4
|
-
* Convert wei (decimal string) to human-readable amount with decimals, trim trailing zeros.
|
|
5
|
-
*
|
|
6
|
-
* @param weiStr - Balance in wei as decimal string.
|
|
7
|
-
* @param decimals - Token decimals (e.g. 18).
|
|
8
|
-
* @returns Human-readable amount string (e.g. "1.5").
|
|
9
|
-
*/
|
|
10
|
-
export declare function weiToHumanReadable(weiStr: string, decimals: number): string;
|
|
11
|
-
/**
|
|
12
|
-
* Normalize chain ID to hex for contract lookup (e.g. eip155:1 -> 0x1).
|
|
13
|
-
*
|
|
14
|
-
* @param chainId - CAIP-2 or hex chain ID.
|
|
15
|
-
* @returns Hex chain ID for contract map lookup.
|
|
16
|
-
*/
|
|
17
|
-
export declare function chainIdToHex(chainId: ChainId): Hex;
|
|
18
|
-
//# sourceMappingURL=parsing.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parsing.d.cts","sourceRoot":"","sources":["../../../../src/data-sources/evm-rpc-services/utils/parsing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EAAE,OAAO,EAAE,2BAAiB;AAExC;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAM3E;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG,CAOlD"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { Hex } from "@metamask/utils";
|
|
2
|
-
import type { ChainId } from "../types/index.mjs";
|
|
3
|
-
/**
|
|
4
|
-
* Convert wei (decimal string) to human-readable amount with decimals, trim trailing zeros.
|
|
5
|
-
*
|
|
6
|
-
* @param weiStr - Balance in wei as decimal string.
|
|
7
|
-
* @param decimals - Token decimals (e.g. 18).
|
|
8
|
-
* @returns Human-readable amount string (e.g. "1.5").
|
|
9
|
-
*/
|
|
10
|
-
export declare function weiToHumanReadable(weiStr: string, decimals: number): string;
|
|
11
|
-
/**
|
|
12
|
-
* Normalize chain ID to hex for contract lookup (e.g. eip155:1 -> 0x1).
|
|
13
|
-
*
|
|
14
|
-
* @param chainId - CAIP-2 or hex chain ID.
|
|
15
|
-
* @returns Hex chain ID for contract map lookup.
|
|
16
|
-
*/
|
|
17
|
-
export declare function chainIdToHex(chainId: ChainId): Hex;
|
|
18
|
-
//# sourceMappingURL=parsing.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parsing.d.mts","sourceRoot":"","sources":["../../../../src/data-sources/evm-rpc-services/utils/parsing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,wBAAwB;AAE3C,OAAO,KAAK,EAAE,OAAO,EAAE,2BAAiB;AAExC;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAM3E;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,GAAG,CAOlD"}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Convert wei (decimal string) to human-readable amount with decimals, trim trailing zeros.
|
|
3
|
-
*
|
|
4
|
-
* @param weiStr - Balance in wei as decimal string.
|
|
5
|
-
* @param decimals - Token decimals (e.g. 18).
|
|
6
|
-
* @returns Human-readable amount string (e.g. "1.5").
|
|
7
|
-
*/
|
|
8
|
-
export function weiToHumanReadable(weiStr, decimals) {
|
|
9
|
-
const padded = weiStr.padStart(decimals + 1, '0');
|
|
10
|
-
const len = padded.length;
|
|
11
|
-
const intPart = padded.slice(0, len - decimals);
|
|
12
|
-
const fracPart = padded.slice(len - decimals).replace(/0+$/u, '') || '0';
|
|
13
|
-
return fracPart === '0' ? intPart : `${intPart}.${fracPart}`;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Normalize chain ID to hex for contract lookup (e.g. eip155:1 -> 0x1).
|
|
17
|
-
*
|
|
18
|
-
* @param chainId - CAIP-2 or hex chain ID.
|
|
19
|
-
* @returns Hex chain ID for contract map lookup.
|
|
20
|
-
*/
|
|
21
|
-
export function chainIdToHex(chainId) {
|
|
22
|
-
if (typeof chainId === 'string' && chainId.startsWith('eip155:')) {
|
|
23
|
-
const decimalPart = chainId.split(':')[1];
|
|
24
|
-
const decimalValue = parseInt(decimalPart, 10);
|
|
25
|
-
return `0x${decimalValue.toString(16)}`;
|
|
26
|
-
}
|
|
27
|
-
return chainId;
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=parsing.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"parsing.mjs","sourceRoot":"","sources":["../../../../src/data-sources/evm-rpc-services/utils/parsing.ts"],"names":[],"mappings":"AAIA;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAAc,EAAE,QAAgB;IACjE,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC;IAC1B,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,QAAQ,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;IACzE,OAAO,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,QAAQ,EAAE,CAAC;AAC/D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACjE,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAC/C,OAAO,KAAK,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["import type { Hex } from '@metamask/utils';\n\nimport type { ChainId } from '../types';\n\n/**\n * Convert wei (decimal string) to human-readable amount with decimals, trim trailing zeros.\n *\n * @param weiStr - Balance in wei as decimal string.\n * @param decimals - Token decimals (e.g. 18).\n * @returns Human-readable amount string (e.g. \"1.5\").\n */\nexport function weiToHumanReadable(weiStr: string, decimals: number): string {\n const padded = weiStr.padStart(decimals + 1, '0');\n const len = padded.length;\n const intPart = padded.slice(0, len - decimals);\n const fracPart = padded.slice(len - decimals).replace(/0+$/u, '') || '0';\n return fracPart === '0' ? intPart : `${intPart}.${fracPart}`;\n}\n\n/**\n * Normalize chain ID to hex for contract lookup (e.g. eip155:1 -> 0x1).\n *\n * @param chainId - CAIP-2 or hex chain ID.\n * @returns Hex chain ID for contract map lookup.\n */\nexport function chainIdToHex(chainId: ChainId): Hex {\n if (typeof chainId === 'string' && chainId.startsWith('eip155:')) {\n const decimalPart = chainId.split(':')[1];\n const decimalValue = parseInt(decimalPart, 10);\n return `0x${decimalValue.toString(16)}`;\n }\n return chainId;\n}\n"]}
|