@antseed/ants 0.1.5 → 0.1.6
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/ants-web/assets/Arc-VDBY7LNS-BChRXCXW.js +1 -0
- package/dist/ants-web/assets/Brave-BRAKJXDS-mq-Xo37j.js +1 -0
- package/dist/ants-web/assets/Browser-76IHF3Y2-BMhRaC5Z.js +1 -0
- package/dist/ants-web/assets/Chrome-65Q5P54Y-DR9MQEVr.js +1 -0
- package/dist/ants-web/assets/Edge-XSPUTORV-DEoZslQE.js +1 -0
- package/dist/ants-web/assets/Firefox-AAHGJQIP-Bp_Hm04m.js +1 -0
- package/dist/ants-web/assets/Linux-OO4TNCLJ-B0aw93n9.js +1 -0
- package/dist/ants-web/assets/Macos-MW4AE7LN-Vvm8Drw3.js +1 -0
- package/dist/ants-web/assets/Opera-KQZLSACL-Cwv5MDFy.js +1 -0
- package/dist/ants-web/assets/Safari-ZPL37GXR-C4Ggg6rz.js +1 -0
- package/dist/ants-web/assets/Windows-PPTHQER6-BlyV2p7Y.js +1 -0
- package/dist/ants-web/assets/add-1qQ_SVL6.js +15 -0
- package/dist/ants-web/assets/all-wallets-D0QF065k.js +6 -0
- package/dist/ants-web/assets/apechain-SX5YFU6N-q5qBv-mp.js +1 -0
- package/dist/ants-web/assets/app-store-j-2thKGl.js +17 -0
- package/dist/ants-web/assets/apple-CCcInWVX.js +18 -0
- package/dist/ants-web/assets/ar_AR-44JUQ6EW-BMX-am0v.js +1487 -0
- package/dist/ants-web/assets/arbitrum-WURIBY6W-CqVkHBr5.js +1 -0
- package/dist/ants-web/assets/arrow-bottom-DVZa97G2.js +8 -0
- package/dist/ants-web/assets/arrow-bottom-circle-tt2k5BWG.js +11 -0
- package/dist/ants-web/assets/arrow-left-DnjqXMe0.js +8 -0
- package/dist/ants-web/assets/arrow-right-De8QMymS.js +8 -0
- package/dist/ants-web/assets/arrow-top-BS2oLt_x.js +8 -0
- package/dist/ants-web/assets/assets-Q6ZU7ZJ5-P8HioiAD.js +1 -0
- package/dist/ants-web/assets/avalanche-KOMJD3XY-Dsn_JPR4.js +1 -0
- package/dist/ants-web/assets/bank-DIxCskFM.js +14 -0
- package/dist/ants-web/assets/base-OAXLRA4F-CoYTVIiL.js +1 -0
- package/dist/ants-web/assets/baseAccount-44UITRK7-CsjdbWCf.js +1 -0
- package/dist/ants-web/assets/basic-D0Dg7j2v.js +2128 -0
- package/dist/ants-web/assets/berachain-NJECWIVC-DumxnFvf.js +1 -0
- package/dist/ants-web/assets/blast-V555OVXZ-BbhJh1tj.js +1 -0
- package/dist/ants-web/assets/browser-n9VVPree.js +14 -0
- package/dist/ants-web/assets/bsc-N647EYR2-B2nLKXWV.js +1 -0
- package/dist/ants-web/assets/card-Bl7AHEuE.js +14 -0
- package/dist/ants-web/assets/ccip-C_ifxkiT.js +1 -0
- package/dist/ants-web/assets/celo-GEP4TUHG-CenIBYLU.js +1 -0
- package/dist/ants-web/assets/checkmark-DXB1SsFx.js +11 -0
- package/dist/ants-web/assets/checkmark-bold-CIMnw7st.js +8 -0
- package/dist/ants-web/assets/chevron-bottom-DGkVb8CY.js +8 -0
- package/dist/ants-web/assets/chevron-left-D8vC6sW_.js +8 -0
- package/dist/ants-web/assets/chevron-right-CP8tyhU4.js +8 -0
- package/dist/ants-web/assets/chevron-top-DUqp6O8b.js +8 -0
- package/dist/ants-web/assets/chrome-store-CDk6Jfiv.js +61 -0
- package/dist/ants-web/assets/clock-t0Dwo5ck.js +8 -0
- package/dist/ants-web/assets/close-BiTlv6FX.js +8 -0
- package/dist/ants-web/assets/coinPlaceholder-PJZCh_De.js +8 -0
- package/dist/ants-web/assets/compass-CctP2ZVM.js +8 -0
- package/dist/ants-web/assets/connect-UA7M4XW6-IY3X6Bmr.js +1 -0
- package/dist/ants-web/assets/copy-b1i5dSZT.js +15 -0
- package/dist/ants-web/assets/core-4w9H32as.js +908 -0
- package/dist/ants-web/assets/create-FASO7PVG-D_rvSpre.js +1 -0
- package/dist/ants-web/assets/cronos-HJPAQTAE-BEOvlOC4.js +1 -0
- package/dist/ants-web/assets/cursor-kLCZuRWK.js +3 -0
- package/dist/ants-web/assets/cursor-transparent-C1IxvCBs.js +12 -0
- package/dist/ants-web/assets/de_DE-PYAO5YD6-BWlqPWgO.js +1487 -0
- package/dist/ants-web/assets/degen-FQQ4XGHB-CeHTs88l.js +1 -0
- package/dist/ants-web/assets/desktop-Qa_41eha.js +9 -0
- package/dist/ants-web/assets/disconnect-7QBZVVG8.js +8 -0
- package/dist/ants-web/assets/discord-DuRr0OMy.js +17 -0
- package/dist/ants-web/assets/es_419-HRGOJ6VT-D-qzxUM-.js +1487 -0
- package/dist/ants-web/assets/ethereum-RGGVA4PY-SWGOlkuk.js +1 -0
- package/dist/ants-web/assets/etherscan-BOImzSgC.js +6 -0
- package/dist/ants-web/assets/events-DQ172AOg.js +1 -0
- package/dist/ants-web/assets/exclamation-triangle-evZ54TSt.js +4 -0
- package/dist/ants-web/assets/extension-YSvzNEgu.js +8 -0
- package/dist/ants-web/assets/external-link-BukU3aK3.js +8 -0
- package/dist/ants-web/assets/facebook-WJZQGI9M.js +26 -0
- package/dist/ants-web/assets/farcaster-Dt0XRvlP.js +12 -0
- package/dist/ants-web/assets/filters-CFC5g--u.js +8 -0
- package/dist/ants-web/assets/flow-5FQJFCTK-CUie2reO.js +1 -0
- package/dist/ants-web/assets/fr_FR-IGGVC6RM-D8LpUM75.js +1487 -0
- package/dist/ants-web/assets/github-Bhz0AnGj.js +18 -0
- package/dist/ants-web/assets/gnosis-37ZC4RBL-B137OtHZ.js +1 -0
- package/dist/ants-web/assets/google-CGzSUXjP.js +18 -0
- package/dist/ants-web/assets/gravity-J5YQHTYH-Bj6B0uod.js +1 -0
- package/dist/ants-web/assets/hardhat-TX56IT5N-CV1FY-wE.js +1 -0
- package/dist/ants-web/assets/help-circle-BoGPtVJY.js +12 -0
- package/dist/ants-web/assets/hi_IN-XSKAA3MF-C3QUpWyP.js +1487 -0
- package/dist/ants-web/assets/hyperevm-VKPAA4SA-CHwraEsx.js +1 -0
- package/dist/ants-web/assets/id-ir8rS0J_.js +12 -0
- package/dist/ants-web/assets/id_ID-KUOB4UAL-K9y-nRWm.js +1487 -0
- package/dist/ants-web/assets/image-DXBUHwz_.js +4 -0
- package/dist/ants-web/assets/index-9ALlRD6p.css +1 -0
- package/dist/ants-web/assets/index-B7p3jPAJ.js +1 -0
- package/dist/ants-web/assets/index-BqWNkBzB.js +395 -0
- package/dist/ants-web/assets/index-C-I4ROfT.js +16 -0
- package/dist/ants-web/assets/index-Chq8yV_g.js +47 -0
- package/dist/ants-web/assets/index-Ci5bF__2.js +1729 -0
- package/dist/ants-web/assets/index-kzlEvkEN.js +1 -0
- package/dist/ants-web/assets/index.es-D1GdDJUC.js +39 -0
- package/dist/ants-web/assets/info-DzGq_QPQ.js +3 -0
- package/dist/ants-web/assets/info-circle-z91TqQxH.js +12 -0
- package/dist/ants-web/assets/ink-FZMYZWHG-62p-5IK5.js +1 -0
- package/dist/ants-web/assets/ja_JP-4WRQ63RX-Ct5pF4ug.js +1487 -0
- package/dist/ants-web/assets/kaia-65D2U3PU-JmuLQ4gC.js +1 -0
- package/dist/ants-web/assets/ko_KR-I2K7AIEP-B5gw8Mwb.js +1487 -0
- package/dist/ants-web/assets/lightbulb-CgYwiQYs.js +3 -0
- package/dist/ants-web/assets/linea-QRMVQ5DY-DuI3vv0d.js +1 -0
- package/dist/ants-web/assets/login-UP3DZBGS-Db_wM5oQ.js +1 -0
- package/dist/ants-web/assets/mail-FLPFIbqi.js +8 -0
- package/dist/ants-web/assets/manta-SI27YFEJ-CpVOKa06.js +1 -0
- package/dist/ants-web/assets/mantle-CKIUT334-DR2WgqzU.js +1 -0
- package/dist/ants-web/assets/metaMaskWallet-SITXT2FV-BlemcphV.js +1 -0
- package/dist/ants-web/assets/metamask-sdk-QG4PtQco.js +542 -0
- package/dist/ants-web/assets/mobile--kHpa5NK.js +9 -0
- package/dist/ants-web/assets/monad-4KWC6TSS-DVXSkpiz.js +1 -0
- package/dist/ants-web/assets/more-CJbReLy0.js +11 -0
- package/dist/ants-web/assets/ms_MY-6VZW6Q3Z-BtFD07hR.js +1487 -0
- package/dist/ants-web/assets/network-placeholder-BfSizFBN.js +14 -0
- package/dist/ants-web/assets/nftPlaceholder-BTfly2G8.js +8 -0
- package/dist/ants-web/assets/off-DCMXa6Y2.js +8 -0
- package/dist/ants-web/assets/optimism-HAF2GUT7-ec6Nqxs9.js +1 -0
- package/dist/ants-web/assets/play-store-CbbevixE.js +32 -0
- package/dist/ants-web/assets/plus-BxINT2r_.js +13 -0
- package/dist/ants-web/assets/polygon-WW6ZI7PM-DXlmm4L1.js +1 -0
- package/dist/ants-web/assets/pt_BR-N3XOZ4SV-CvVpfsHb.js +1487 -0
- package/dist/ants-web/assets/qr-code-CMEsvGrE.js +6 -0
- package/dist/ants-web/assets/rainbowWallet-O26YNBMX-DUhYus-9.js +1 -0
- package/dist/ants-web/assets/recycle-horizontal-BldRTXPT.js +9 -0
- package/dist/ants-web/assets/refresh-82vLCcdB.js +8 -0
- package/dist/ants-web/assets/refresh-S4T5V5GX-CwqIaaxK.js +1 -0
- package/dist/ants-web/assets/reown-logo-BPGalyzg.js +12 -0
- package/dist/ants-web/assets/ronin-EMCPYXZT-N-QBHZdV.js +1 -0
- package/dist/ants-web/assets/ru_RU-IITAPRET-DOj6Jzj7.js +1487 -0
- package/dist/ants-web/assets/safeWallet-5MNKTR5Z-D-5imDLD.js +1 -0
- package/dist/ants-web/assets/sanko-RHQYXGM5-OX010CbN.js +1 -0
- package/dist/ants-web/assets/scan-4UYSQ56Q-CjMz6-XC.js +1 -0
- package/dist/ants-web/assets/scroll-5OBGQVOV-DJFECiai.js +1 -0
- package/dist/ants-web/assets/search-CADsyV1c.js +8 -0
- package/dist/ants-web/assets/secp256k1-B5byVYSZ.js +1 -0
- package/dist/ants-web/assets/secp256k1-Cb4vPU9D.js +1 -0
- package/dist/ants-web/assets/send-DyAisqGO.js +15 -0
- package/dist/ants-web/assets/sign-A7IJEUT5-CGsRnPrd.js +1 -0
- package/dist/ants-web/assets/superposition-HG6MMR2Y-bRkgatRO.js +1 -0
- package/dist/ants-web/assets/swapHorizontal-BfHwXZPT.js +8 -0
- package/dist/ants-web/assets/swapHorizontalBold-FIoCjqnp.js +8 -0
- package/dist/ants-web/assets/swapHorizontalMedium-CzDDCY_G.js +16 -0
- package/dist/ants-web/assets/swapHorizontalRoundedBold-CvMRJeWj.js +8 -0
- package/dist/ants-web/assets/swapVertical-BgSezaow.js +8 -0
- package/dist/ants-web/assets/telegram-CsMNhXCs.js +16 -0
- package/dist/ants-web/assets/th_TH-3ZQCKCQE-BcHUN2Q4.js +1487 -0
- package/dist/ants-web/assets/three-dots-DYf4gmVW.js +5 -0
- package/dist/ants-web/assets/tr_TR-QUPUGMUF-CwpF6ZFn.js +1487 -0
- package/dist/ants-web/assets/twitch-BtBr-NTg.js +18 -0
- package/dist/ants-web/assets/twitterIcon-BmRf6M77.js +6 -0
- package/dist/ants-web/assets/uk_UA-SSN6SV5E-IlYYyRC6.js +1487 -0
- package/dist/ants-web/assets/unichain-C5BWO2ZY-BfguYsnu.js +1 -0
- package/dist/ants-web/assets/verify-cxA8gdP6.js +8 -0
- package/dist/ants-web/assets/verify-filled-DHnnW8EE.js +8 -0
- package/dist/ants-web/assets/vi_VN-7BUVRNYY-CZ9S75qZ.js +1487 -0
- package/dist/ants-web/assets/w3m-modal-D1ucMOAa.js +642 -0
- package/dist/ants-web/assets/wallet-BT4Fue1R.js +8 -0
- package/dist/ants-web/assets/wallet-placeholder-C2J5s6Yp.js +14 -0
- package/dist/ants-web/assets/walletConnectWallet-YHWKVTDY-D3lyiczV.js +1 -0
- package/dist/ants-web/assets/walletconnect-B5k8iJl-.js +30 -0
- package/dist/ants-web/assets/warning-circle-9rNSUSsX.js +12 -0
- package/dist/ants-web/assets/x-CpRc85jR.js +12 -0
- package/dist/ants-web/assets/xdc-KJ3TDBYO-DNV6zchh.js +1 -0
- package/dist/ants-web/assets/zetachain-TLDS5IPW-Udhyw16T.js +1 -0
- package/dist/ants-web/assets/zh_CN-HJBN674C-Baf0GEeT.js +1487 -0
- package/dist/ants-web/assets/zh_HK-JW3WLRKE-VztJKXL5.js +1487 -0
- package/dist/ants-web/assets/zh_TW-VNNRNXY7-aWfg7Qp4.js +1487 -0
- package/dist/ants-web/assets/zksync-DH7HK5U4-Dt4usFw6.js +1 -0
- package/dist/ants-web/assets/zora-FYL5H3IO-iB4wygST.js +1 -0
- package/dist/ants-web/index.html +2 -2
- package/dist/api-types.d.ts +168 -6
- package/dist/browser-signer.d.ts +30 -0
- package/dist/browser-signer.js +189 -0
- package/dist/browser-signer.js.map +1 -0
- package/dist/jobs.d.ts +10 -3
- package/dist/jobs.js +97 -20
- package/dist/jobs.js.map +1 -1
- package/dist/position-actions.d.ts +13 -0
- package/dist/position-actions.js +25 -0
- package/dist/position-actions.js.map +1 -0
- package/dist/routes.d.ts +7 -0
- package/dist/routes.js +63 -5
- package/dist/routes.js.map +1 -1
- package/dist/server.d.ts +8 -0
- package/dist/server.js +157 -12
- package/dist/server.js.map +1 -1
- package/dist/service/context.d.ts +13 -2
- package/dist/service/context.js +35 -4
- package/dist/service/context.js.map +1 -1
- package/dist/service/display-snapshot.d.ts +28 -0
- package/dist/service/display-snapshot.js +144 -0
- package/dist/service/display-snapshot.js.map +1 -0
- package/dist/service/emissions.js +11 -19
- package/dist/service/emissions.js.map +1 -1
- package/dist/service/explorer.js +2 -1
- package/dist/service/explorer.js.map +1 -1
- package/dist/service/format.d.ts +1 -1
- package/dist/service/format.js +2 -0
- package/dist/service/format.js.map +1 -1
- package/dist/service/indexed-wallet.d.ts +7 -0
- package/dist/service/indexed-wallet.js +58 -0
- package/dist/service/indexed-wallet.js.map +1 -0
- package/dist/service/indexer.d.ts +32 -3
- package/dist/service/indexer.js +64 -8
- package/dist/service/indexer.js.map +1 -1
- package/dist/service/legacy-payout.d.ts +3 -0
- package/dist/service/legacy-payout.js +32 -0
- package/dist/service/legacy-payout.js.map +1 -0
- package/dist/service/network.d.ts +5 -0
- package/dist/service/network.js +185 -0
- package/dist/service/network.js.map +1 -0
- package/dist/service/overview-reads.d.ts +30 -0
- package/dist/service/overview-reads.js +69 -0
- package/dist/service/overview-reads.js.map +1 -0
- package/dist/service/overview.js +14 -36
- package/dist/service/overview.js.map +1 -1
- package/dist/service/pool-merge.d.ts +2 -1
- package/dist/service/pool-merge.js +11 -4
- package/dist/service/pool-merge.js.map +1 -1
- package/dist/service/pools.d.ts +22 -1
- package/dist/service/pools.js +257 -98
- package/dist/service/pools.js.map +1 -1
- package/dist/service/position-feed.d.ts +73 -0
- package/dist/service/position-feed.js +173 -0
- package/dist/service/position-feed.js.map +1 -0
- package/dist/service/positions.d.ts +3 -5
- package/dist/service/positions.js +155 -93
- package/dist/service/positions.js.map +1 -1
- package/dist/service/rewards.d.ts +1 -0
- package/dist/service/rewards.js +117 -56
- package/dist/service/rewards.js.map +1 -1
- package/dist/service/rpc-provider.d.ts +3 -0
- package/dist/service/rpc-provider.js +32 -3
- package/dist/service/rpc-provider.js.map +1 -1
- package/dist/service/seller-models.d.ts +2 -0
- package/dist/service/seller-models.js +94 -0
- package/dist/service/seller-models.js.map +1 -0
- package/dist/service/seller.js +33 -30
- package/dist/service/seller.js.map +1 -1
- package/dist/service/stake-eligibility.d.ts +6 -0
- package/dist/service/stake-eligibility.js +50 -0
- package/dist/service/stake-eligibility.js.map +1 -0
- package/dist/service/usage.js +5 -13
- package/dist/service/usage.js.map +1 -1
- package/dist/service/yield.d.ts +3 -0
- package/dist/service/yield.js +12 -0
- package/dist/service/yield.js.map +1 -0
- package/dist/view-cache.d.ts +5 -10
- package/dist/view-cache.js +12 -14
- package/dist/view-cache.js.map +1 -1
- package/dist/wallet-errors.d.ts +9 -0
- package/dist/wallet-errors.js +32 -0
- package/dist/wallet-errors.js.map +1 -0
- package/package.json +8 -3
- package/dist/ants-web/assets/index-BunPfgXh.css +0 -1
- package/dist/ants-web/assets/index-zCPoF694.js +0 -40
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/** Live position status older than this is rejected; Antscan refreshes it every 15s. */
|
|
2
|
+
const LIVE_MAX_AGE_SECONDS = 15;
|
|
3
|
+
const REWARDS_MAX_AGE_SECONDS = 3600;
|
|
4
|
+
/** Tolerated clock skew between Antscan and this machine. */
|
|
5
|
+
const CLOCK_SKEW_SECONDS = 30;
|
|
6
|
+
const nowSeconds = () => Math.floor(Date.now() / 1000);
|
|
7
|
+
function validateChain(ctx, data) {
|
|
8
|
+
const { source } = data;
|
|
9
|
+
const matches = source.chainId === ctx.chain.evmChainId
|
|
10
|
+
&& source.contracts.sellerPools.toLowerCase() === ctx.chain.sellerPoolsAddress?.toLowerCase()
|
|
11
|
+
&& source.contracts.sellerPoolsRewards.toLowerCase() === ctx.chain.sellerPoolsRewardsAddress?.toLowerCase();
|
|
12
|
+
if (!matches)
|
|
13
|
+
throw new Error('Antscan position chain or contracts do not match this dashboard');
|
|
14
|
+
}
|
|
15
|
+
/** The wallet's positions with live on-chain status from Antscan, accepted only when fresh, complete and past our read barrier. */
|
|
16
|
+
export async function liveWalletPositions(ctx, epoch) {
|
|
17
|
+
const indexer = ctx.indexer();
|
|
18
|
+
if (!indexer?.rewardPositions)
|
|
19
|
+
throw new Error('Antscan positions are unavailable');
|
|
20
|
+
const data = await indexer.rewardPositions(ctx.address);
|
|
21
|
+
validateChain(ctx, data);
|
|
22
|
+
const { liveSource } = data;
|
|
23
|
+
const now = nowSeconds();
|
|
24
|
+
const fresh = now - liveSource.fetchedAt < LIVE_MAX_AGE_SECONDS && liveSource.fetchedAt <= now + CLOCK_SKEW_SECONDS;
|
|
25
|
+
if (liveSource.currentEpoch !== epoch || liveSource.stale || !liveSource.complete || data.liveError || !fresh)
|
|
26
|
+
throw new Error(data.liveError ?? 'Antscan live position status is stale or incomplete');
|
|
27
|
+
const barrier = ctx.positionReadBarriers?.get(ctx.address.toLowerCase());
|
|
28
|
+
if (barrier && (liveSource.fetchedAt <= barrier.at || data.source.indexedBlock < barrier.block))
|
|
29
|
+
throw new Error('Antscan live positions have not caught up with your transaction');
|
|
30
|
+
if (data.positions.some(row => row.power == null || row.nextPower == null || row.withdrawableEpoch === null || row.maxLockedNext === null || row.changePending === null))
|
|
31
|
+
throw new Error('Antscan live position fields are incomplete');
|
|
32
|
+
return data;
|
|
33
|
+
}
|
|
34
|
+
/** Indexed staker rewards per position, accepted only for this chain's contracts, a fresh complete snapshot, and past our read barrier. */
|
|
35
|
+
export async function indexedWalletRewards(ctx, epoch, outstanding = false) {
|
|
36
|
+
const indexer = ctx.indexer();
|
|
37
|
+
if (!indexer?.rewardPositions)
|
|
38
|
+
throw new Error('Antscan indexed rewards are unavailable');
|
|
39
|
+
const data = await indexer.rewardPositions(ctx.address, outstanding);
|
|
40
|
+
return validateWalletRewards(ctx, epoch, data);
|
|
41
|
+
}
|
|
42
|
+
export function validateWalletRewards(ctx, epoch, data) {
|
|
43
|
+
validateChain(ctx, data);
|
|
44
|
+
const { source } = data;
|
|
45
|
+
const now = nowSeconds();
|
|
46
|
+
const fresh = now - source.indexedAt <= REWARDS_MAX_AGE_SECONDS && source.indexedAt <= now + CLOCK_SKEW_SECONDS;
|
|
47
|
+
if (source.schemaVersion !== 1 || data.currentEpoch !== epoch || source.stale || !fresh)
|
|
48
|
+
throw new Error('Antscan reward snapshot is stale');
|
|
49
|
+
if (!source.complete || !source.historyComplete || source.historyFromBlock > source.indexedBlock)
|
|
50
|
+
throw new Error('Antscan reward history is incomplete');
|
|
51
|
+
const barrier = ctx.positionReadBarriers?.get(ctx.address.toLowerCase());
|
|
52
|
+
if (barrier && source.indexedBlock < barrier.block)
|
|
53
|
+
throw new Error('Antscan rewards have not caught up with your transaction');
|
|
54
|
+
if (data.positions.some(row => row.rewards.status !== 'available' || row.rewards.pending === null))
|
|
55
|
+
throw new Error('Some indexed position rewards are unavailable');
|
|
56
|
+
return data;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=indexed-wallet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indexed-wallet.js","sourceRoot":"","sources":["../../src/service/indexed-wallet.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,12 @@
|
|
|
5
5
|
* reconstructed from RPC log scans. Every method returns plain JSON-shaped
|
|
6
6
|
* data; amounts stay as decimal strings.
|
|
7
7
|
*/
|
|
8
|
+
import { type DisplaySnapshot } from './display-snapshot.js';
|
|
9
|
+
import { type RewardPositions } from './position-feed.js';
|
|
8
10
|
export interface IndexedStakingEpoch {
|
|
11
|
+
snapshotBlock?: number;
|
|
12
|
+
lastBlockNumber?: number;
|
|
13
|
+
complete?: boolean;
|
|
9
14
|
epoch: number;
|
|
10
15
|
totalPowerWeight: string;
|
|
11
16
|
totalActiveStake: string;
|
|
@@ -17,6 +22,7 @@ export interface IndexedStakingEpoch {
|
|
|
17
22
|
stakerBudget: string;
|
|
18
23
|
}
|
|
19
24
|
export interface IndexedPool {
|
|
25
|
+
participationComplete?: boolean;
|
|
20
26
|
agentId: number;
|
|
21
27
|
seller: string | null;
|
|
22
28
|
sellerName: string | null;
|
|
@@ -34,8 +40,17 @@ export interface IndexedPool {
|
|
|
34
40
|
lastUsagePoints: string;
|
|
35
41
|
volumeUsdc: string;
|
|
36
42
|
lastVolumeUsdc: string;
|
|
43
|
+
volumeAvailable?: boolean;
|
|
44
|
+
lastVolumeAvailable?: boolean;
|
|
37
45
|
lastEmission: string;
|
|
38
46
|
lastEmissionSettled: boolean;
|
|
47
|
+
/** Preserve absent/invalid historical inputs instead of treating them as a real zero. */
|
|
48
|
+
historicalYield?: {
|
|
49
|
+
power: string;
|
|
50
|
+
reward: string;
|
|
51
|
+
settled: boolean;
|
|
52
|
+
} | null;
|
|
53
|
+
stakers?: number | null;
|
|
39
54
|
lastRewardPer1kPower: string | null;
|
|
40
55
|
projectedEmission: string;
|
|
41
56
|
projectedRewardPer1kPower: string | null;
|
|
@@ -60,14 +75,18 @@ export interface IndexedPoolEpoch {
|
|
|
60
75
|
settled: boolean;
|
|
61
76
|
}
|
|
62
77
|
export interface IndexedPoolDetail {
|
|
78
|
+
activeStake?: string | null;
|
|
63
79
|
pool: (IndexedPool & {
|
|
64
80
|
firstStakeAt: number | null;
|
|
65
81
|
}) | null;
|
|
66
82
|
epochs: IndexedPoolEpoch[];
|
|
67
|
-
openPositions: number;
|
|
68
|
-
stakers: number;
|
|
83
|
+
openPositions: number | null;
|
|
84
|
+
stakers: number | null;
|
|
85
|
+
/** Stake in open positions waiting for their activation epoch; null when the explorer predates the field. */
|
|
86
|
+
pendingStake: string | null;
|
|
69
87
|
}
|
|
70
88
|
export interface IndexedPosition {
|
|
89
|
+
lastBlockNumber?: number;
|
|
71
90
|
id: number;
|
|
72
91
|
owner: string;
|
|
73
92
|
agentId: number;
|
|
@@ -86,6 +105,9 @@ export interface IndexedPosition {
|
|
|
86
105
|
slashedAmount: string;
|
|
87
106
|
createdAt: number;
|
|
88
107
|
closedAt: number | null;
|
|
108
|
+
/** Live power this epoch as read by the explorer; null when the explorer could not read it or predates the field. */
|
|
109
|
+
power?: string | null;
|
|
110
|
+
nextPower?: string | null;
|
|
89
111
|
}
|
|
90
112
|
export interface IndexedSellerEpoch {
|
|
91
113
|
seller: string;
|
|
@@ -117,6 +139,9 @@ export interface IndexedEpochMetric {
|
|
|
117
139
|
requests: string;
|
|
118
140
|
}
|
|
119
141
|
export interface Indexer {
|
|
142
|
+
rewardPositions?(owner: string, outstanding?: boolean): Promise<RewardPositions>;
|
|
143
|
+
displaySnapshot?(epoch: number): Promise<DisplaySnapshot>;
|
|
144
|
+
invalidate?(): void;
|
|
120
145
|
readonly baseUrl: string;
|
|
121
146
|
pools(): Promise<IndexedPools>;
|
|
122
147
|
pool(agentId: number, epochs?: number): Promise<IndexedPoolDetail>;
|
|
@@ -129,7 +154,8 @@ export interface Indexer {
|
|
|
129
154
|
}
|
|
130
155
|
export declare class IndexerError extends Error {
|
|
131
156
|
readonly url: string;
|
|
132
|
-
|
|
157
|
+
readonly status?: number | undefined;
|
|
158
|
+
constructor(message: string, url: string, status?: number | undefined);
|
|
133
159
|
}
|
|
134
160
|
export declare class AntscanIndexer implements Indexer {
|
|
135
161
|
private readonly fetchImpl;
|
|
@@ -137,10 +163,13 @@ export declare class AntscanIndexer implements Indexer {
|
|
|
137
163
|
readonly baseUrl: string;
|
|
138
164
|
private readonly cache;
|
|
139
165
|
constructor(baseUrl: string, fetchImpl?: typeof fetch, ttlMs?: number);
|
|
166
|
+
invalidate(): void;
|
|
167
|
+
displaySnapshot(epoch: number): Promise<DisplaySnapshot>;
|
|
140
168
|
private get;
|
|
141
169
|
pools(): Promise<IndexedPools>;
|
|
142
170
|
pool(agentId: number, epochs?: number): Promise<IndexedPoolDetail>;
|
|
143
171
|
positions(owner: string, includeClosed?: boolean): Promise<IndexedPosition[]>;
|
|
172
|
+
rewardPositions(owner: string, outstanding?: boolean): Promise<RewardPositions>;
|
|
144
173
|
stakingEpochs(limit?: number): Promise<IndexedStakingEpoch[]>;
|
|
145
174
|
sellerEpochs(epochs?: number): Promise<Map<string, IndexedSellerEpoch[]>>;
|
|
146
175
|
participant(address: string, epochs?: number): Promise<IndexedParticipant>;
|
package/dist/service/indexer.js
CHANGED
|
@@ -5,13 +5,17 @@
|
|
|
5
5
|
* reconstructed from RPC log scans. Every method returns plain JSON-shaped
|
|
6
6
|
* data; amounts stay as decimal strings.
|
|
7
7
|
*/
|
|
8
|
+
import { fetchDisplaySnapshot } from './display-snapshot.js';
|
|
9
|
+
import { fetchRewardPositions } from './position-feed.js';
|
|
8
10
|
const FETCH_TIMEOUT_MS = 8_000;
|
|
9
11
|
const CACHE_TTL_MS = 15_000;
|
|
10
12
|
export class IndexerError extends Error {
|
|
11
13
|
url;
|
|
12
|
-
|
|
14
|
+
status;
|
|
15
|
+
constructor(message, url, status) {
|
|
13
16
|
super(message);
|
|
14
17
|
this.url = url;
|
|
18
|
+
this.status = status;
|
|
15
19
|
this.name = 'IndexerError';
|
|
16
20
|
}
|
|
17
21
|
}
|
|
@@ -23,11 +27,18 @@ const str = (value) => (value === null || value === undefined ? '0' : String(val
|
|
|
23
27
|
const lower = (value) => (typeof value === 'string' && value ? value.toLowerCase() : null);
|
|
24
28
|
/** `convert(value)`, or null when the field is absent. */
|
|
25
29
|
const optional = (value, convert) => (value === null || value === undefined ? null : convert(value));
|
|
30
|
+
/** A non-negative integer string, or null for anything else (absent field, error marker, older explorer). */
|
|
31
|
+
const decimalOrNull = (value) => (/^\d+$/.test(String(value ?? '')) ? String(value) : null);
|
|
32
|
+
/** A non-negative safe integer count, or null. */
|
|
33
|
+
const countOrNull = (value) => (value != null && Number.isSafeInteger(Number(value)) && Number(value) >= 0 ? Number(value) : null);
|
|
26
34
|
const CLOSE_REASONS = ['split', 'merge', 'move', 'withdraw'];
|
|
27
35
|
function toStakingEpoch(row) {
|
|
28
36
|
if (!row)
|
|
29
37
|
return null;
|
|
30
38
|
return {
|
|
39
|
+
snapshotBlock: row['snapshotBlock'] == null ? undefined : num(row['snapshotBlock']),
|
|
40
|
+
lastBlockNumber: row['lastBlockNumber'] == null ? undefined : num(row['lastBlockNumber']),
|
|
41
|
+
complete: ['epoch', 'totalActiveStake', 'totalPowerWeight', 'stakerBudget', 'totalWeightedPoolPoints'].every(key => /^\d+$/.test(String(row[key] ?? ''))),
|
|
31
42
|
epoch: num(row['epoch']),
|
|
32
43
|
totalPowerWeight: str(row['totalPowerWeight']),
|
|
33
44
|
totalActiveStake: str(row['totalActiveStake']),
|
|
@@ -41,6 +52,7 @@ function toStakingEpoch(row) {
|
|
|
41
52
|
}
|
|
42
53
|
function toPool(row) {
|
|
43
54
|
return {
|
|
55
|
+
participationComplete: ['openPositions', 'totalPositions'].every(key => row[key] != null && Number.isSafeInteger(Number(row[key])) && Number(row[key]) >= 0),
|
|
44
56
|
agentId: num(row['agentId']),
|
|
45
57
|
seller: lower(row['seller']),
|
|
46
58
|
sellerName: typeof row['sellerName'] === 'string' ? row['sellerName'] : null,
|
|
@@ -58,8 +70,13 @@ function toPool(row) {
|
|
|
58
70
|
lastUsagePoints: str(row['lastUsagePoints']),
|
|
59
71
|
volumeUsdc: str(row['volumeUsdc']),
|
|
60
72
|
lastVolumeUsdc: str(row['lastVolumeUsdc']),
|
|
73
|
+
volumeAvailable: row['volumeUsdc'] != null,
|
|
74
|
+
lastVolumeAvailable: row['lastVolumeUsdc'] != null,
|
|
61
75
|
lastEmission: str(row['lastEmission']),
|
|
62
76
|
lastEmissionSettled: row['lastEmissionSettled'] === true,
|
|
77
|
+
historicalYield: /^\d+$/.test(String(row['lastWeight'] ?? '')) && /^\d+$/.test(String(row['lastEmission'] ?? '')) && typeof row['lastEmissionSettled'] === 'boolean'
|
|
78
|
+
? { power: String(row['lastWeight']), reward: String(row['lastEmission']), settled: row['lastEmissionSettled'] } : null,
|
|
79
|
+
stakers: countOrNull(row['stakers']),
|
|
63
80
|
lastRewardPer1kPower: optional(row['lastRewardPer1kPower'], str),
|
|
64
81
|
projectedEmission: str(row['projectedEmission']),
|
|
65
82
|
projectedRewardPer1kPower: optional(row['projectedRewardPer1kPower'], str),
|
|
@@ -69,6 +86,7 @@ function toPool(row) {
|
|
|
69
86
|
function toPosition(row) {
|
|
70
87
|
const closedBy = CLOSE_REASONS.find((reason) => reason === row['closedBy']) ?? null;
|
|
71
88
|
return {
|
|
89
|
+
lastBlockNumber: row['lastBlockNumber'] == null ? undefined : num(row['lastBlockNumber']),
|
|
72
90
|
id: num(row['id']),
|
|
73
91
|
owner: lower(row['owner']) ?? '',
|
|
74
92
|
agentId: num(row['agentId']),
|
|
@@ -87,6 +105,8 @@ function toPosition(row) {
|
|
|
87
105
|
slashedAmount: str(row['slashedAmount']),
|
|
88
106
|
createdAt: num(row['createdAt']),
|
|
89
107
|
closedAt: optional(row['closedAt'], num),
|
|
108
|
+
power: decimalOrNull(row['power']),
|
|
109
|
+
nextPower: decimalOrNull(row['nextPower']),
|
|
90
110
|
};
|
|
91
111
|
}
|
|
92
112
|
const toSellerEpoch = (row) => ({
|
|
@@ -116,10 +136,22 @@ export class AntscanIndexer {
|
|
|
116
136
|
this.ttlMs = ttlMs;
|
|
117
137
|
this.baseUrl = baseUrl.replace(/\/$/, '');
|
|
118
138
|
}
|
|
119
|
-
|
|
120
|
-
|
|
139
|
+
invalidate() { this.cache.clear(); }
|
|
140
|
+
displaySnapshot(epoch) {
|
|
141
|
+
const key = `display:${epoch}`;
|
|
142
|
+
const hit = this.cache.get(key);
|
|
121
143
|
if (hit && Date.now() - hit.at < this.ttlMs)
|
|
122
144
|
return hit.value;
|
|
145
|
+
const value = fetchDisplaySnapshot(this.baseUrl, this.fetchImpl, epoch);
|
|
146
|
+
this.cache.set(key, { at: Date.now(), value });
|
|
147
|
+
value.catch(() => { if (this.cache.get(key)?.value === value)
|
|
148
|
+
this.cache.delete(key); });
|
|
149
|
+
return value;
|
|
150
|
+
}
|
|
151
|
+
get(path, cache = true) {
|
|
152
|
+
const hit = this.cache.get(path);
|
|
153
|
+
if (cache && hit && Date.now() - hit.at < this.ttlMs)
|
|
154
|
+
return hit.value;
|
|
123
155
|
const url = `${this.baseUrl}${path}`;
|
|
124
156
|
const value = (async () => {
|
|
125
157
|
let response;
|
|
@@ -130,10 +162,11 @@ export class AntscanIndexer {
|
|
|
130
162
|
throw new IndexerError(`Explorer unreachable: ${error.message}`, url);
|
|
131
163
|
}
|
|
132
164
|
if (!response.ok)
|
|
133
|
-
throw new IndexerError(`Explorer responded with HTTP ${response.status}`, url);
|
|
165
|
+
throw new IndexerError(`Explorer responded with HTTP ${response.status}`, url, response.status);
|
|
134
166
|
return await response.json();
|
|
135
167
|
})();
|
|
136
|
-
|
|
168
|
+
if (cache)
|
|
169
|
+
this.cache.set(path, { at: Date.now(), value });
|
|
137
170
|
value.catch(() => { if (this.cache.get(path)?.value === value)
|
|
138
171
|
this.cache.delete(path); });
|
|
139
172
|
return value;
|
|
@@ -150,18 +183,41 @@ export class AntscanIndexer {
|
|
|
150
183
|
const raw = await this.get(`/api/staking/pools/${agentId}?epochs=${epochs}`);
|
|
151
184
|
return {
|
|
152
185
|
pool: raw.pool ? toPool(raw.pool) : null,
|
|
153
|
-
epochs: (raw.epochs ?? []).map((row) => ({
|
|
186
|
+
epochs: (raw.epochs ?? []).filter(row => row['volumeUsdc'] != null).map((row) => ({
|
|
154
187
|
epoch: num(row['epoch']), weight: str(row['weight']), activeStake: str(row['activeStake']), usagePoints: str(row['usagePoints']), weightedUsagePoints: str(row['weightedUsagePoints']),
|
|
155
188
|
volumeUsdc: str(row['volumeUsdc']), requests: str(row['requests']), settledEmission: str(row['settledEmission']), settled: row['settled'] === true,
|
|
156
189
|
})),
|
|
157
|
-
openPositions:
|
|
158
|
-
stakers:
|
|
190
|
+
openPositions: countOrNull(raw.openPositions),
|
|
191
|
+
stakers: countOrNull(raw.stakers),
|
|
192
|
+
pendingStake: decimalOrNull(raw.pendingStake),
|
|
193
|
+
activeStake: decimalOrNull(raw.activeStake),
|
|
159
194
|
};
|
|
160
195
|
}
|
|
161
196
|
async positions(owner, includeClosed = true) {
|
|
162
197
|
const raw = await this.get(`/api/staking/positions?owner=${owner.toLowerCase()}${includeClosed ? '&includeClosed=1' : ''}`);
|
|
163
198
|
return (raw.positions ?? []).map(toPosition);
|
|
164
199
|
}
|
|
200
|
+
rewardPositions(owner, outstanding = false) {
|
|
201
|
+
const key = `rewards:${owner.toLowerCase()}:${outstanding}`;
|
|
202
|
+
const hit = this.cache.get(key);
|
|
203
|
+
if (hit && Date.now() - hit.at < this.ttlMs)
|
|
204
|
+
return hit.value;
|
|
205
|
+
const value = (async () => {
|
|
206
|
+
for (let attempt = 0;; attempt++) {
|
|
207
|
+
try {
|
|
208
|
+
return await fetchRewardPositions(owner, outstanding, path => this.get(path, false));
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
if (!(error instanceof IndexerError && error.status === 409 && attempt === 0))
|
|
212
|
+
throw error;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
})();
|
|
216
|
+
this.cache.set(key, { at: Date.now(), value });
|
|
217
|
+
value.catch(() => { if (this.cache.get(key)?.value === value)
|
|
218
|
+
this.cache.delete(key); });
|
|
219
|
+
return value;
|
|
220
|
+
}
|
|
165
221
|
async stakingEpochs(limit = 8) {
|
|
166
222
|
const raw = await this.get(`/api/staking/epochs?limit=${limit}`);
|
|
167
223
|
return (raw ?? []).map((row) => toStakingEpoch(row));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../src/service/indexer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../src/service/indexer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Interface, isError, ZeroAddress } from 'ethers';
|
|
2
|
+
const policyInterface = new Interface(['function canClaimSellerUnlocked(address seller) view returns (bool)']);
|
|
3
|
+
export async function legacySellerPayout(ctx, legacyAddress) {
|
|
4
|
+
try {
|
|
5
|
+
const legacy = ctx.legacyEmissionsAt(legacyAddress ?? null);
|
|
6
|
+
if (!legacy)
|
|
7
|
+
return { destination: 'unknown', recipient: null };
|
|
8
|
+
const policy = await legacy.sellerUnlockPolicy();
|
|
9
|
+
let unlocked = false;
|
|
10
|
+
if (policy !== ZeroAddress) {
|
|
11
|
+
try {
|
|
12
|
+
const result = await ctx.provider().call({
|
|
13
|
+
from: legacyAddress, to: policy,
|
|
14
|
+
data: policyInterface.encodeFunctionData('canClaimSellerUnlocked', [ctx.address]),
|
|
15
|
+
});
|
|
16
|
+
unlocked = policyInterface.decodeFunctionResult('canClaimSellerUnlocked', result)[0] === true;
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
if (!isError(error, 'CALL_EXCEPTION'))
|
|
20
|
+
throw error;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
if (unlocked)
|
|
24
|
+
return { destination: 'wallet', recipient: ctx.address };
|
|
25
|
+
const pool = await legacy.sellerRewardsPool();
|
|
26
|
+
return pool === ZeroAddress ? { destination: 'unknown', recipient: null } : { destination: 'locked', recipient: pool };
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return { destination: 'unknown', recipient: null };
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=legacy-payout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-payout.js","sourceRoot":"","sources":["../../src/service/legacy-payout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAIzD,MAAM,eAAe,GAAG,IAAI,SAAS,CAAC,CAAC,qEAAqE,CAAC,CAAC,CAAC;AAE/G,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAgB,EAAE,aAAwC;IACjG,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,GAAG,CAAC,iBAAiB,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,kBAAkB,EAAE,CAAC;QACjD,IAAI,QAAQ,GAAG,KAAK,CAAC;QACrB,IAAI,MAAM,KAAK,WAAW,EAAE,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC;oBACvC,IAAI,EAAE,aAAc,EAAE,EAAE,EAAE,MAAM;oBAChC,IAAI,EAAE,eAAe,CAAC,kBAAkB,CAAC,wBAAwB,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;iBAClF,CAAC,CAAC;gBACH,QAAQ,GAAG,eAAe,CAAC,oBAAoB,CAAC,wBAAwB,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;YAChG,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,gBAAgB,CAAC;oBAAE,MAAM,KAAK,CAAC;YACrD,CAAC;QACH,CAAC;QACD,IAAI,QAAQ;YAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;QACvE,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC9C,OAAO,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACzH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACrD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AntsContext } from './context.js';
|
|
2
|
+
import type { EmissionsView, NetworkSnapshot } from '../api-types.js';
|
|
3
|
+
export declare function invalidateNetwork(ctx: AntsContext): void;
|
|
4
|
+
export declare function networkSnapshot(ctx: AntsContext): Promise<NetworkSnapshot>;
|
|
5
|
+
export declare function networkLegacy(ctx: AntsContext): Promise<EmissionsView['legacy']>;
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { Interface, ZeroAddress } from 'ethers';
|
|
2
|
+
import { GATE_MINTERS, gateMinterId, multicallRead } from '@antseed/node/payments';
|
|
3
|
+
const ABI = new Interface([
|
|
4
|
+
'function genesis() view returns(uint256)',
|
|
5
|
+
'function epochDuration() view returns(uint256)',
|
|
6
|
+
'function effectiveEpoch() view returns(uint256)',
|
|
7
|
+
'function currentEpoch() view returns(uint256)',
|
|
8
|
+
'function INITIAL_EMISSION() view returns(uint256)',
|
|
9
|
+
'function initialEmission() view returns(uint256)',
|
|
10
|
+
'function HALVING_INTERVAL() view returns(uint256)',
|
|
11
|
+
'function SHARE_DENOMINATOR() view returns(uint256)',
|
|
12
|
+
'function GATE_SHARE_DENOMINATOR() view returns(uint256)',
|
|
13
|
+
'function getEpochEmission(uint256) view returns(uint256)',
|
|
14
|
+
'function cumulativeEmissionThrough(uint256) view returns(uint256)',
|
|
15
|
+
'function minters(bytes32) view returns(address controller,uint32 shareBps,bool editable)',
|
|
16
|
+
'function minterEpochBudget(bytes32,uint256) view returns(uint256)',
|
|
17
|
+
'function totalSupply() view returns(uint256)',
|
|
18
|
+
'function MAX_SUPPLY() view returns(uint256)',
|
|
19
|
+
'function totalActiveStakeAtEpoch(uint256) view returns(uint256)',
|
|
20
|
+
'function totalPowerWeightAtEpoch(uint256) view returns(uint256)',
|
|
21
|
+
'function totalBuyerPointsByEpoch(uint256) view returns(uint256)',
|
|
22
|
+
'function totalSellerPointsByEpoch(uint256) view returns(uint256)',
|
|
23
|
+
'function stakerEpochBudget(uint256) view returns(uint256)',
|
|
24
|
+
'function usageEpochBudgets(uint256) view returns(uint256 buyer,uint256 seller)',
|
|
25
|
+
'function dynamicStakerConfigAt(uint256) view returns(tuple(uint32 minShareBps,uint32 maxShareBps,uint256 stakeShareTarget))',
|
|
26
|
+
'function dynamicUsageConfigAt(uint256) view returns(tuple(uint32 buyerMinShareBps,uint32 buyerMaxShareBps,uint32 sellerMinShareBps,uint32 sellerMaxShareBps,uint256 volumeShareTarget))',
|
|
27
|
+
'function emissionsGate() view returns(address)',
|
|
28
|
+
'function sellerPools() view returns(address)',
|
|
29
|
+
'function usageAccounting() view returns(address)',
|
|
30
|
+
'function emissions() view returns(address)',
|
|
31
|
+
'function staking() view returns(address)',
|
|
32
|
+
]);
|
|
33
|
+
const caches = new WeakMap();
|
|
34
|
+
const TTL_MS = 20_000;
|
|
35
|
+
export function invalidateNetwork(ctx) {
|
|
36
|
+
const cache = caches.get(ctx);
|
|
37
|
+
if (cache)
|
|
38
|
+
caches.set(ctx, { key: cache.key, metadata: cache.metadata });
|
|
39
|
+
}
|
|
40
|
+
export function networkSnapshot(ctx) {
|
|
41
|
+
const key = JSON.stringify(ctx.chain);
|
|
42
|
+
let cache = caches.get(ctx);
|
|
43
|
+
if (!cache || cache.key !== key) {
|
|
44
|
+
cache = { key };
|
|
45
|
+
caches.set(ctx, cache);
|
|
46
|
+
}
|
|
47
|
+
if (cache.pending)
|
|
48
|
+
return cache.pending;
|
|
49
|
+
const value = cache.value;
|
|
50
|
+
const age = value ? Date.now() - value.fetchedAt : Infinity;
|
|
51
|
+
if (value && age < TTL_MS && age < value.epoch.secondsToBoundary * 1000)
|
|
52
|
+
return Promise.resolve(value);
|
|
53
|
+
const entry = cache;
|
|
54
|
+
const pending = readSnapshot(ctx, entry).then(snapshot => {
|
|
55
|
+
entry.value = snapshot;
|
|
56
|
+
return snapshot;
|
|
57
|
+
}).finally(() => { entry.pending = undefined; });
|
|
58
|
+
entry.pending = pending;
|
|
59
|
+
return pending;
|
|
60
|
+
}
|
|
61
|
+
async function readSnapshot(ctx, cache) {
|
|
62
|
+
const chain = ctx.chain;
|
|
63
|
+
const gate = chain.emissionsGateAddress;
|
|
64
|
+
if (!gate || gate === ZeroAddress)
|
|
65
|
+
throw new Error('The emission gate is not configured on this network.');
|
|
66
|
+
const provider = ctx.provider();
|
|
67
|
+
const block = await provider.getBlock('latest');
|
|
68
|
+
if (!block)
|
|
69
|
+
throw new Error('The latest network block is unavailable.');
|
|
70
|
+
const options = { blockTag: block.number };
|
|
71
|
+
if (!cache.metadata) {
|
|
72
|
+
const methods = ['genesis', 'epochDuration', 'INITIAL_EMISSION', 'HALVING_INTERVAL', 'SHARE_DENOMINATOR'];
|
|
73
|
+
const values = await multicallRead(provider, methods.map(method => ({ target: gate, iface: ABI, method })), options);
|
|
74
|
+
const required = (index) => {
|
|
75
|
+
const value = values[index]?.[0];
|
|
76
|
+
if (typeof value !== 'bigint')
|
|
77
|
+
throw new Error(`Network configuration unavailable: ${methods[index]}.`);
|
|
78
|
+
return value;
|
|
79
|
+
};
|
|
80
|
+
const metadata = { genesis: Number(required(0)), duration: Number(required(1)), initial: required(2).toString(), halving: Number(required(3)), denominator: Number(required(4)) };
|
|
81
|
+
if (![metadata.genesis, metadata.duration, metadata.halving, metadata.denominator].every(Number.isSafeInteger) || metadata.duration <= 0 || metadata.denominator <= 0)
|
|
82
|
+
throw new Error('Invalid emission timing or share denominator.');
|
|
83
|
+
cache.metadata = metadata;
|
|
84
|
+
}
|
|
85
|
+
const metadata = cache.metadata;
|
|
86
|
+
const epoch = Math.max(0, Math.floor((block.timestamp - metadata.genesis) / metadata.duration));
|
|
87
|
+
const requests = [];
|
|
88
|
+
const errors = [];
|
|
89
|
+
const add = (target, method, args = []) => {
|
|
90
|
+
if (!target || target === ZeroAddress)
|
|
91
|
+
return -1;
|
|
92
|
+
return requests.push({ target, iface: ABI, method, args }) - 1;
|
|
93
|
+
};
|
|
94
|
+
const poolRewards = chain.sellerPoolsRewardsAddress;
|
|
95
|
+
const usageRewards = chain.usageRewardsAddress;
|
|
96
|
+
const ids = {
|
|
97
|
+
epoch: add(gate, 'currentEpoch'), effective: add(gate, 'effectiveEpoch'),
|
|
98
|
+
emission: add(gate, 'getEpochEmission', [epoch]), nextEmission: add(gate, 'getEpochEmission', [epoch + 1]),
|
|
99
|
+
cumulative: add(gate, 'cumulativeEmissionThrough', [epoch + 1]),
|
|
100
|
+
supply: add(chain.antsTokenAddress, 'totalSupply'), maxSupply: add(chain.antsTokenAddress, 'MAX_SUPPLY'),
|
|
101
|
+
stake: add(chain.sellerPoolsAddress, 'totalActiveStakeAtEpoch', [epoch]), weight: add(chain.sellerPoolsAddress, 'totalPowerWeightAtEpoch', [epoch]),
|
|
102
|
+
buyerPoints: add(chain.usageAccountingAddress, 'totalBuyerPointsByEpoch', [epoch]), sellerPoints: add(chain.usageAccountingAddress, 'totalSellerPointsByEpoch', [epoch]),
|
|
103
|
+
stakerBudget: add(poolRewards, 'stakerEpochBudget', [epoch]), usageBudgets: add(usageRewards, 'usageEpochBudgets', [epoch]),
|
|
104
|
+
stakerConfig: add(poolRewards, 'dynamicStakerConfigAt', [epoch]), nextStakerConfig: add(poolRewards, 'dynamicStakerConfigAt', [epoch + 1]),
|
|
105
|
+
usageConfig: add(usageRewards, 'dynamicUsageConfigAt', [epoch]), nextUsageConfig: add(usageRewards, 'dynamicUsageConfigAt', [epoch + 1]),
|
|
106
|
+
initial: add(poolRewards, 'initialEmission'),
|
|
107
|
+
stakerGate: add(poolRewards, 'emissionsGate'), usageGate: add(usageRewards, 'emissionsGate'),
|
|
108
|
+
pools: add(poolRewards, 'sellerPools'), accounting: add(usageRewards, 'usageAccounting'),
|
|
109
|
+
stakerDenominator: add(poolRewards, 'GATE_SHARE_DENOMINATOR'), usageDenominator: add(usageRewards, 'GATE_SHARE_DENOMINATOR'),
|
|
110
|
+
registryEmissions: add(chain.registryContractAddress, 'emissions'), registryStaking: add(chain.registryContractAddress, 'staking'),
|
|
111
|
+
};
|
|
112
|
+
const buckets = GATE_MINTERS.map(minter => {
|
|
113
|
+
const id = gateMinterId(minter.id);
|
|
114
|
+
return { name: minter.name, id, info: add(gate, 'minters', [id]), budget: add(gate, 'minterEpochBudget', [id, epoch]), nextBudget: add(gate, 'minterEpochBudget', [id, epoch + 1]) };
|
|
115
|
+
});
|
|
116
|
+
const values = await multicallRead(provider, requests, options);
|
|
117
|
+
const read = (index, label) => {
|
|
118
|
+
const value = index < 0 ? null : values[index];
|
|
119
|
+
if (!value)
|
|
120
|
+
errors.push(`${label} unavailable.`);
|
|
121
|
+
return value ?? null;
|
|
122
|
+
};
|
|
123
|
+
const amount = (index, label) => {
|
|
124
|
+
const value = read(index, label)?.[0];
|
|
125
|
+
return typeof value === 'bigint' ? value.toString() : null;
|
|
126
|
+
};
|
|
127
|
+
if (amount(ids.epoch, 'Current epoch') !== String(epoch))
|
|
128
|
+
throw new Error('The emission epoch does not match the snapshot block. Refresh the network data.');
|
|
129
|
+
const bucketViews = buckets.map(bucket => ({ name: bucket.name, id: bucket.id, controller: read(bucket.info, `${bucket.name} controller`)?.[0] ?? null, budget: amount(bucket.budget, `${bucket.name} limit`), nextBudget: amount(bucket.nextBudget, `${bucket.name} next-epoch limit`) }));
|
|
130
|
+
const matches = (index, expected) => typeof values[index]?.[0] === 'string' && values[index][0].toLowerCase() === expected?.toLowerCase();
|
|
131
|
+
const stakerVerified = matches(ids.stakerGate, gate) && matches(ids.pools, chain.sellerPoolsAddress)
|
|
132
|
+
&& bucketViews[0]?.controller?.toLowerCase() === poolRewards?.toLowerCase() && values[ids.stakerDenominator]?.[0] === BigInt(metadata.denominator);
|
|
133
|
+
const usageVerified = matches(ids.usageGate, gate) && matches(ids.accounting, chain.usageAccountingAddress)
|
|
134
|
+
&& bucketViews[1]?.controller?.toLowerCase() === usageRewards?.toLowerCase() && values[ids.usageDenominator]?.[0] === BigInt(metadata.denominator);
|
|
135
|
+
if (!stakerVerified)
|
|
136
|
+
errors.push('Staker controller connections could not be verified against the emission gate.');
|
|
137
|
+
if (!usageVerified)
|
|
138
|
+
errors.push('Usage controller connections could not be verified against the emission gate.');
|
|
139
|
+
const stakerConfig = (index) => {
|
|
140
|
+
const result = read(index, 'Staker configuration')?.[0];
|
|
141
|
+
return stakerVerified && result ? { minShareBps: Number(result[0]), maxShareBps: Number(result[1]), stakeShareTarget: result[2].toString() } : null;
|
|
142
|
+
};
|
|
143
|
+
const usageConfig = (index) => {
|
|
144
|
+
const result = read(index, 'Usage configuration')?.[0];
|
|
145
|
+
return usageVerified && result ? { buyerMinShareBps: Number(result[0]), buyerMaxShareBps: Number(result[1]), sellerMinShareBps: Number(result[2]), sellerMaxShareBps: Number(result[3]), volumeShareTarget: result[4].toString() } : null;
|
|
146
|
+
};
|
|
147
|
+
const emission = amount(ids.emission, 'Epoch emission');
|
|
148
|
+
const config = stakerConfig(ids.stakerConfig);
|
|
149
|
+
const initial = amount(ids.initial, 'Staker initial emission');
|
|
150
|
+
const buyerPoints = amount(ids.buyerPoints, 'Buyer usage input');
|
|
151
|
+
const sellerPoints = amount(ids.sellerPoints, 'Seller usage input');
|
|
152
|
+
const usage = read(ids.usageBudgets, 'Usage budgets');
|
|
153
|
+
const effective = amount(ids.effective, 'Reward activation epoch');
|
|
154
|
+
const registryEmissions = read(ids.registryEmissions, 'Registry emissions pointer');
|
|
155
|
+
const registryStaking = read(ids.registryStaking, 'Registry staking pointer');
|
|
156
|
+
const activation = !registryEmissions || !registryStaking ? 'unverified'
|
|
157
|
+
: matches(ids.registryEmissions, chain.usageAccountingAddress) && matches(ids.registryStaking, chain.sellerRegistryAddress) ? 'active' : 'not-active';
|
|
158
|
+
const nextBoundaryAt = metadata.genesis + (epoch + 1) * metadata.duration;
|
|
159
|
+
return {
|
|
160
|
+
chainId: chain.chainId, evmChainId: chain.evmChainId, blockNumber: block.number, blockTimestamp: block.timestamp, fetchedAt: Date.now(),
|
|
161
|
+
activation,
|
|
162
|
+
epoch: { current: epoch, effective: effective === null ? null : Number(effective), genesis: metadata.genesis, epochDuration: metadata.duration, nextBoundaryAt, secondsToBoundary: Math.max(0, nextBoundaryAt - block.timestamp) },
|
|
163
|
+
shareDenominator: metadata.denominator, initialEmission: metadata.initial, halvingInterval: metadata.halving,
|
|
164
|
+
emission, nextEmission: amount(ids.nextEmission, 'Next epoch emission'), cumulativeScheduled: amount(ids.cumulative, 'Scheduled cumulative emission'),
|
|
165
|
+
totalSupply: amount(ids.supply, 'Token supply'), maxSupply: amount(ids.maxSupply, 'Maximum token supply'),
|
|
166
|
+
totalActiveStake: amount(ids.stake, 'Active stake'), totalPowerWeight: amount(ids.weight, 'Power weight'),
|
|
167
|
+
usageVolume: buyerPoints === null || sellerPoints === null ? null : (BigInt(buyerPoints) > BigInt(sellerPoints) ? buyerPoints : sellerPoints),
|
|
168
|
+
buckets: bucketViews,
|
|
169
|
+
budgets: { staker: stakerVerified ? amount(ids.stakerBudget, 'Staker budget') : null, buyer: usageVerified && usage ? String(usage[0]) : null, seller: usageVerified && usage ? String(usage[1]) : null },
|
|
170
|
+
stakerConfig: config, nextStakerConfig: stakerConfig(ids.nextStakerConfig),
|
|
171
|
+
scaledStakeTarget: config && emission !== null && initial !== null && BigInt(initial) > 0n ? (BigInt(config.stakeShareTarget) * BigInt(emission) / BigInt(initial)).toString() : null,
|
|
172
|
+
usageConfig: usageConfig(ids.usageConfig), nextUsageConfig: usageConfig(ids.nextUsageConfig),
|
|
173
|
+
contracts: Object.fromEntries(Object.entries({ registry: chain.registryContractAddress, gate, sellerPools: chain.sellerPoolsAddress, stakerRewards: poolRewards, usageRewards, usageAccounting: chain.usageAccountingAddress, token: chain.antsTokenAddress }).filter((entry) => !!entry[1])),
|
|
174
|
+
errors: [...new Set(errors)],
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
export async function networkLegacy(ctx) {
|
|
178
|
+
const stack = await ctx.stack();
|
|
179
|
+
const contract = ctx.legacyEmissionsAt(stack.legacyEmissions);
|
|
180
|
+
if (!contract || !stack.legacyEmissions)
|
|
181
|
+
return null;
|
|
182
|
+
const [shares, info] = await Promise.all([contract.getShares(), contract.getEpochInfo()]);
|
|
183
|
+
return { contract: stack.legacyEmissions, sellerPct: shares.sellerSharePct, buyerPct: shares.buyerSharePct, reservePct: shares.reserveSharePct, teamPct: shares.teamSharePct, currentEpoch: info.epoch };
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=network.js.map
|