@xyo-network/chain-sdk 4.0.5 → 4.0.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.
Files changed (42) hide show
  1. package/dist/browser/modules/ethereum/block/blockRangeChunks.d.ts +8 -0
  2. package/dist/browser/modules/ethereum/block/blockRangeChunks.d.ts.map +1 -0
  3. package/dist/browser/modules/ethereum/block/estimateBlockNumberAt.d.ts +17 -0
  4. package/dist/browser/modules/ethereum/block/estimateBlockNumberAt.d.ts.map +1 -0
  5. package/dist/browser/modules/ethereum/block/index.d.ts +2 -0
  6. package/dist/browser/modules/ethereum/block/index.d.ts.map +1 -1
  7. package/dist/browser/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts +27 -0
  8. package/dist/browser/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts.map +1 -1
  9. package/dist/browser/modules/ethereum/drivers/EvmStakeViewer.d.ts.map +1 -1
  10. package/dist/browser/modules/ethereum/rpc/isRpcRateLimitError.d.ts +6 -0
  11. package/dist/browser/modules/ethereum/rpc/isRpcRateLimitError.d.ts.map +1 -0
  12. package/dist/browser/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts +19 -0
  13. package/dist/browser/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts.map +1 -0
  14. package/dist/neutral/ethereum.mjs +249 -65
  15. package/dist/neutral/ethereum.mjs.map +4 -4
  16. package/dist/neutral/modules/ethereum/block/blockRangeChunks.d.ts +8 -0
  17. package/dist/neutral/modules/ethereum/block/blockRangeChunks.d.ts.map +1 -0
  18. package/dist/neutral/modules/ethereum/block/estimateBlockNumberAt.d.ts +17 -0
  19. package/dist/neutral/modules/ethereum/block/estimateBlockNumberAt.d.ts.map +1 -0
  20. package/dist/neutral/modules/ethereum/block/index.d.ts +2 -0
  21. package/dist/neutral/modules/ethereum/block/index.d.ts.map +1 -1
  22. package/dist/neutral/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts +27 -0
  23. package/dist/neutral/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts.map +1 -1
  24. package/dist/neutral/modules/ethereum/drivers/EvmStakeViewer.d.ts.map +1 -1
  25. package/dist/neutral/modules/ethereum/rpc/isRpcRateLimitError.d.ts +6 -0
  26. package/dist/neutral/modules/ethereum/rpc/isRpcRateLimitError.d.ts.map +1 -0
  27. package/dist/neutral/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts +19 -0
  28. package/dist/neutral/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts.map +1 -0
  29. package/dist/node/modules/ethereum/block/blockRangeChunks.d.ts +8 -0
  30. package/dist/node/modules/ethereum/block/blockRangeChunks.d.ts.map +1 -0
  31. package/dist/node/modules/ethereum/block/estimateBlockNumberAt.d.ts +17 -0
  32. package/dist/node/modules/ethereum/block/estimateBlockNumberAt.d.ts.map +1 -0
  33. package/dist/node/modules/ethereum/block/index.d.ts +2 -0
  34. package/dist/node/modules/ethereum/block/index.d.ts.map +1 -1
  35. package/dist/node/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts +27 -0
  36. package/dist/node/modules/ethereum/drivers/EvmStakeEventsViewer.d.ts.map +1 -1
  37. package/dist/node/modules/ethereum/drivers/EvmStakeViewer.d.ts.map +1 -1
  38. package/dist/node/modules/ethereum/rpc/isRpcRateLimitError.d.ts +6 -0
  39. package/dist/node/modules/ethereum/rpc/isRpcRateLimitError.d.ts.map +1 -0
  40. package/dist/node/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts +19 -0
  41. package/dist/node/modules/ethereum/rpc/withRpcRateLimitBackoff.d.ts.map +1 -0
  42. package/package.json +16 -16
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/modules/ethereum/BaseEthProvider.ts", "../../src/modules/ethereum/block/rate/blockRate.ts", "../../src/modules/ethereum/block/rate/timeRate.ts", "../../src/modules/ethereum/createChain.ts", "../../src/modules/ethereum/createChainContract.ts", "../../src/modules/ethereum/createChainRewardsContract.ts", "../../src/modules/ethereum/nextContractAddress.ts", "../../src/modules/ethereum/drivers/EvmStakeEventsViewer.ts", "../../src/modules/ethereum/providers/AbstractEvmProvider.ts", "../../src/modules/ethereum/providers/AbstractEvmRunner.ts", "../../src/modules/ethereum/providers/AbstractEvmViewer.ts", "../../src/modules/ethereum/providers/EvmChainContractViewer.ts", "../../src/modules/ethereum/providers/EvmStakeRunner.ts", "../../src/modules/ethereum/providers/EvmStakeTotalsViewer.ts", "../../src/modules/ethereum/drivers/EvmStakeEventZod.ts", "../../src/modules/ethereum/drivers/EvmStakeViewer.ts", "../../src/modules/ethereum/ethereum.ts"],
4
- "sourcesContent": ["import type {\n Address, BlockAPI,\n BlockNumberOrTag,\n CompileResultAPI,\n EthExecutionAPI,\n FeeHistoryResultAPI,\n Filter,\n FilterResultsAPI,\n HexString, HexString8Bytes,\n HexString32Bytes,\n HexString256Bytes,\n HexStringBytes,\n SignedTransactionInfoAPI,\n SyncingStatusAPI,\n TransactionCallAPI,\n TransactionInfoAPI,\n TransactionReceiptAPI,\n TransactionWithSenderAPI,\n Uint,\n Uint256,\n} from 'web3-types'\n\nexport class BaseEthProvider implements EthExecutionAPI {\n eth_accounts(): Address[] {\n throw new Error('Method not implemented.')\n }\n\n eth_blockNumber(): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_call(_transaction: TransactionCallAPI, _blockNumber: BlockNumberOrTag): HexStringBytes {\n throw new Error('Method not implemented.')\n }\n\n eth_clearSubscriptions(_keepSyncing?: boolean): void {\n throw new Error('Method not implemented.')\n }\n\n eth_coinbase(): Address {\n throw new Error('Method not implemented.')\n }\n\n eth_compileLLL(_code: string): HexStringBytes {\n throw new Error('Method not implemented.')\n }\n\n eth_compileSerpent(_code: string): HexStringBytes {\n throw new Error('Method not implemented.')\n }\n\n eth_compileSolidity(_code: string): CompileResultAPI {\n throw new Error('Method not implemented.')\n }\n\n eth_estimateGas(_transaction: Partial<TransactionWithSenderAPI>, _blockNumber: BlockNumberOrTag): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_feeHistory(_blockCount: Uint, _newestBlock: BlockNumberOrTag, _rewardPercentiles: number[]): FeeHistoryResultAPI {\n throw new Error('Method not implemented.')\n }\n\n eth_gasPrice(): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_getBalance(_address: Address, _blockNumber: BlockNumberOrTag): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_getBlockByHash(_blockHash: HexString32Bytes, _hydrated: boolean): BlockAPI {\n throw new Error('Method not implemented.')\n }\n\n eth_getBlockByNumber(_blockNumber: BlockNumberOrTag, _hydrated: boolean): BlockAPI {\n throw new Error('Method not implemented.')\n }\n\n eth_getBlockTransactionCountByHash(_blockHash: HexString32Bytes): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_getBlockTransactionCountByNumber(_blockNumber: BlockNumberOrTag): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_getCode(_address: Address, _blockNumber: BlockNumberOrTag): HexStringBytes {\n throw new Error('Method not implemented.')\n }\n\n eth_getCompilers(): string[] {\n throw new Error('Method not implemented.')\n }\n\n eth_getFilterChanges(_filterIdentifier: Uint): FilterResultsAPI {\n throw new Error('Method not implemented.')\n }\n\n eth_getFilterLogs(_filterIdentifier: Uint): FilterResultsAPI {\n throw new Error('Method not implemented.')\n }\n\n eth_getLogs(_filter: Filter): FilterResultsAPI {\n throw new Error('Method not implemented.')\n }\n\n eth_getStorageAt(_address: Address, _storageSlot: Uint256, _blockNumber: BlockNumberOrTag): HexStringBytes {\n throw new Error('Method not implemented.')\n }\n\n eth_getTransactionByBlockHashAndIndex(_blockHash: HexString32Bytes, _transactionIndex: Uint): TransactionInfoAPI | undefined {\n throw new Error('Method not implemented.')\n }\n\n eth_getTransactionByBlockNumberAndIndex(_blockNumber: BlockNumberOrTag, _transactionIndex: Uint): TransactionInfoAPI | undefined {\n throw new Error('Method not implemented.')\n }\n\n eth_getTransactionByHash(_transactionHash: HexString32Bytes): TransactionInfoAPI | undefined {\n throw new Error('Method not implemented.')\n }\n\n eth_getTransactionCount(_address: Address, _blockNumber: BlockNumberOrTag): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_getTransactionReceipt(_transactionHash: HexString32Bytes): TransactionReceiptAPI | undefined {\n throw new Error('Method not implemented.')\n }\n\n eth_getUncleByBlockHashAndIndex(_blockHash: HexString32Bytes, _uncleIndex: Uint): BlockAPI {\n throw new Error('Method not implemented.')\n }\n\n eth_getUncleByBlockNumberAndIndex(_blockNumber: BlockNumberOrTag, _uncleIndex: Uint): BlockAPI {\n throw new Error('Method not implemented.')\n }\n\n eth_getUncleCountByBlockHash(_blockHash: HexString32Bytes): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_getUncleCountByBlockNumber(_blockNumber: BlockNumberOrTag): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_getWork(): [HexString32Bytes, HexString32Bytes, HexString32Bytes] {\n throw new Error('Method not implemented.')\n }\n\n eth_hashrate(): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_maxPriorityFeePerGas(): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_mining(): boolean {\n throw new Error('Method not implemented.')\n }\n\n eth_newBlockFilter(): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_newFilter(_filter: Filter): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_newPendingTransactionFilter(): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_protocolVersion(): string {\n throw new Error('Method not implemented.')\n }\n\n eth_sendRawTransaction(_transaction: HexStringBytes): HexString32Bytes {\n throw new Error('Method not implemented.')\n }\n\n eth_sendTransaction(_transaction: TransactionWithSenderAPI | Partial<TransactionWithSenderAPI>): HexString32Bytes {\n throw new Error('Method not implemented.')\n }\n\n eth_sign(_address: Address, _message: HexStringBytes): HexString256Bytes {\n throw new Error('Method not implemented.')\n }\n\n eth_signTransaction(_transaction: TransactionWithSenderAPI | Partial<TransactionWithSenderAPI>): HexStringBytes | SignedTransactionInfoAPI {\n throw new Error('Method not implemented.')\n }\n\n eth_submitHashrate(_hashRate: HexString32Bytes, _id: HexString32Bytes): boolean {\n throw new Error('Method not implemented.')\n }\n\n eth_submitWork(_nonce: HexString8Bytes, _hash: HexString32Bytes, _digest: HexString32Bytes): boolean {\n throw new Error('Method not implemented.')\n }\n\n eth_subscribe(..._params: ['newHeads'] | ['newPendingTransactions'] | ['syncing'] | ['logs', { address?: HexString; topics?: HexString[] }]): HexString {\n throw new Error('Method not implemented.')\n }\n\n eth_syncing(): SyncingStatusAPI {\n throw new Error('Method not implemented.')\n }\n\n eth_uninstallFilter(_filterIdentifier: Uint): boolean {\n throw new Error('Method not implemented.')\n }\n\n eth_unsubscribe(_subscriptionId: HexString): HexString {\n throw new Error('Method not implemented.')\n }\n}\n", "import { isDefined, isFalsy } from '@ariestools/sdk'\nimport type {\n EthBlockNumber, EthBlockRange, EthBlockRate, TimeDurations,\n} from '@xyo-network/xl1-sdk'\nimport {\n asEthBlockRange, rateMultipliers, timeDurations,\n} from '@xyo-network/xl1-sdk'\nimport type { Block, Provider } from 'ethers/providers'\n\nexport const ethBlockRate = (\n startBlock: Block,\n endBlock: Block,\n timeUnit?: keyof TimeDurations,\n): EthBlockRate => {\n const heightDifference = endBlock.number - startBlock.number\n const timeDifference = endBlock.timestamp - startBlock.timestamp\n\n const rate = heightDifference / timeDifference\n\n const timeUnitValue = isDefined(timeUnit) ? timeUnit : 'millis'\n const returnedTimeDifference = isDefined(timeUnit) ? timeDurations(timeDifference)[timeUnit] : timeDifference\n const timePerBlock = returnedTimeDifference / heightDifference\n\n return {\n range: asEthBlockRange([startBlock.number, endBlock.number], true),\n span: heightDifference,\n rate: isDefined(timeUnit) ? rate * rateMultipliers[timeUnit] : rate,\n timeUnit: timeUnitValue,\n timeDifference: returnedTimeDifference,\n timePerBlock,\n }\n}\n\nexport const getEthBlockRateBlocks = async (\n provider: Provider,\n startBlockHeight: EthBlockNumber,\n endBlockHeight: EthBlockNumber,\n): Promise<{ endingBlock: Block; startingBlock: Block }> => {\n if (endBlockHeight <= startBlockHeight) {\n console.error('startBlockHeight', startBlockHeight)\n console.error('endBlockHeight', endBlockHeight)\n throw new Error('End block height must be greater than start block height')\n }\n\n const startingBlock = await provider.getBlock(startBlockHeight)\n const endingBlock = await provider.getBlock(endBlockHeight)\n\n if (isFalsy(startingBlock) || isFalsy(endingBlock)) {\n throw new Error('Could not retrieve blocks for speed calculation')\n }\n\n return { startingBlock, endingBlock }\n}\n\nexport const calculateEthBlockRate = async (\n provider: Provider,\n range: EthBlockRange,\n timeUnit?: keyof TimeDurations,\n): Promise<EthBlockRate> => {\n const [startBlockHeight, endBlockHeight] = range\n const { startingBlock, endingBlock } = await getEthBlockRateBlocks(\n provider,\n startBlockHeight,\n endBlockHeight,\n )\n return ethBlockRate(startingBlock, endingBlock, timeUnit)\n}\n", "import {\n assertEx, isDefined, isDefinedNotNull,\n} from '@ariestools/sdk'\nimport type {\n EthBlockNumber,\n EthBlockRate,\n SingleTimeConfig,\n TimeDurations,\n} from '@xyo-network/xl1-sdk'\nimport {\n asEthBlockNumber, asEthBlockRange, getTimeConfigInMilliseconds,\n} from '@xyo-network/xl1-sdk'\nimport type { Block, Provider } from 'ethers/providers'\n\nimport { calculateEthBlockRate } from './blockRate.ts'\n\nconst DEFAULT_TOLERANCE_MS = 30_000 // 30 seconds\nconst DEFAULT_MAX_ATTEMPTS = 20\n\nexport const calculateEthTimeRate = async (\n provider: Provider,\n timeConfig: SingleTimeConfig,\n startBlockNumber?: EthBlockNumber,\n timeUnit?: keyof TimeDurations,\n // default tolerance of 30 seconds to cut down on iterations\n toleranceMs = DEFAULT_TOLERANCE_MS,\n // maximum recursive attempts to prevent infinite loops\n maxAttempts = DEFAULT_MAX_ATTEMPTS,\n): Promise<EthBlockRate> => {\n // check the time config has only one key\n assertEx(Object.keys(timeConfig ?? {}).length === 1, () => 'Only one time unit should be specified in timeConfig')\n\n // resolve the starting block\n const startBlock = isDefinedNotNull(startBlockNumber) ? await provider.getBlock(BigInt(startBlockNumber)) : null\n\n // Ensure the start block could be resolved\n assertEx(isDefinedNotNull(startBlockNumber) && isDefinedNotNull(startBlock), () => 'Start block could not be resolved')\n\n const resolvedStartBlock = isDefinedNotNull(startBlock)\n ? startBlock\n : assertEx(await provider.getBlock('latest'))\n\n const timeInMilliseconds = getTimeConfigInMilliseconds(timeConfig)\n assertEx(timeInMilliseconds > 0, () => 'Time duration must be greater than zero')\n\n // Estimate blocks per milliseconds (bpm) based on average block time\n const blocksPerMillisecondRate = 1 / (12 * 1000) // Approximate average block time of 12 seconds\n\n // Calculate the number of blocks in the given time duration\n const initialBlocksInDuration = Math.floor(blocksPerMillisecondRate * timeInMilliseconds)\n\n // Recursively find the proper end block\n const endBlockNumber = await findEndBlockRecursive(\n provider,\n resolvedStartBlock,\n timeInMilliseconds,\n initialBlocksInDuration,\n toleranceMs,\n maxAttempts,\n )\n\n return await calculateEthBlockRate(\n provider,\n asEthBlockRange([endBlockNumber, resolvedStartBlock.number], true),\n timeUnit,\n )\n}\n\nconst findEndBlockRecursive = async (\n provider: Provider,\n startBlock: Block,\n targetTimeMs: number,\n estimatedBlocksBack: number,\n toleranceMs: number,\n attemptsRemaining: number,\n): Promise<EthBlockNumber> => {\n console.log(`Attempts remaining: ${attemptsRemaining}, Estimated blocks back: ${estimatedBlocksBack}`)\n assertEx(attemptsRemaining > 0, () => 'Maximum attempts reached while searching for end block')\n\n const startBlockEpoch = startBlock.timestamp\n const estimatedEndBlockNumber = startBlock.number - estimatedBlocksBack\n\n if (estimatedEndBlockNumber < 0) {\n throw new Error('Estimated end block number is less than zero')\n }\n\n // Fetch the estimated end block\n const endBlock = await provider.getBlock(estimatedEndBlockNumber)\n const resolvedEndBlock = assertEx(\n isDefined(endBlock) ? endBlock : undefined,\n () => `Could not retrieve block ${estimatedEndBlockNumber} for time rate calculation`,\n )\n\n const endBlockEpoch = resolvedEndBlock.timestamp\n const actualTimeDifference = startBlockEpoch - endBlockEpoch\n\n // Check if we're within tolerance\n const timeDelta = Math.abs(actualTimeDifference - targetTimeMs)\n if (timeDelta <= toleranceMs) {\n return asEthBlockNumber(resolvedEndBlock.number, true)\n }\n\n // TODO - in order to support older POW days, we might need to shift away from using adjustmentFactor but do a pure binary search\n // Calculate adjustment factor and recursively search\n let adjustedBlocksBack: number\n if (actualTimeDifference < targetTimeMs) {\n // Need to go further back\n const adjustmentFactor = targetTimeMs / actualTimeDifference\n adjustedBlocksBack = Math.floor(estimatedBlocksBack * adjustmentFactor)\n if (adjustedBlocksBack > startBlock.number) {\n adjustedBlocksBack = startBlock.number / 2\n }\n } else {\n // Need to come forward\n const adjustmentFactor = actualTimeDifference / targetTimeMs\n adjustedBlocksBack = Math.floor(estimatedBlocksBack / adjustmentFactor)\n }\n\n return await findEndBlockRecursive(\n provider,\n startBlock,\n targetTimeMs,\n adjustedBlocksBack,\n toleranceMs,\n attemptsRemaining - 1,\n )\n}\n", "import type {\n Address,\n EthAddress,\n} from '@ariestools/sdk'\nimport {\n toAddress,\n toEthAddress,\n} from '@ariestools/sdk'\nimport type { AccountInstance } from '@xyo-network/sdk'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport { type HydratedBlockWithHashMeta, XYO_NETWORK_STAKING_ADDRESS } from '@xyo-network/xl1-sdk'\nimport type { Signer } from 'ethers/providers'\n\nimport { createGenesisBlock } from '#protocol'\n\nimport { createChainContract } from './createChainContract.ts'\nimport { createChainRewardsContract } from './createChainRewardsContract.ts'\nimport type { GasConfig } from './ethereum.ts'\nimport { nextContractAddress } from './nextContractAddress.ts'\n\nexport async function createChain(\n signer: Signer,\n stakingTokenAddress: EthAddress | Address,\n initialBlockProducer: AccountInstance,\n rewardsContractAddress: Address | null,\n genesisBlockRewardAmount: bigint,\n genesisBlockRewardAddress: Address,\n minWithdrawalBlocks: bigint,\n maxStakersPerAddress = 10,\n unlimitedStakingAddress = XYO_NETWORK_STAKING_ADDRESS,\n minStake = 10_000n,\n gas?: GasConfig,\n): Promise<[Address, HydratedBlockWithHashMeta, Address]> {\n const ethStakingTokenAddress = toEthAddress(stakingTokenAddress)\n const rewardContractAddressResolved = rewardsContractAddress ?? (await createChainRewardsContract(signer, genesisBlockRewardAmount, gas))\n const contractAddress = await nextContractAddress(signer)\n const genesisBlock = await createGenesisBlock(\n initialBlockProducer,\n contractAddress,\n genesisBlockRewardAmount,\n genesisBlockRewardAddress,\n )\n const chainId = toAddress(await createChainContract(\n signer,\n ethStakingTokenAddress,\n await PayloadBuilder.hash(genesisBlock[0]),\n rewardContractAddressResolved,\n minWithdrawalBlocks,\n maxStakersPerAddress,\n unlimitedStakingAddress,\n minStake,\n gas,\n ))\n return [chainId, genesisBlock, rewardContractAddressResolved]\n}\n", "import type {\n Address, EthAddress, Hash,\n} from '@ariestools/sdk'\nimport {\n asAddress, assertEx,\n ETH_ZERO_ADDRESS, hexToBigInt, toEthAddress,\n} from '@ariestools/sdk'\nimport { StakedXyoChainV2__factory } from '@xyo-network/typechain'\nimport { XYO_NETWORK_STAKING_ADDRESS } from '@xyo-network/xl1-sdk'\nimport type { Signer } from 'ethers/providers'\n\nimport type { GasConfig } from './ethereum.ts'\n\nexport const createChainContract = async (\n signer: Signer,\n stakingTokenAddress: EthAddress,\n genesisBlockHash: Hash,\n rewardsContractAddress: Address,\n minWithdrawalBlocks: bigint,\n maxStakersPerAddress = 10,\n unlimitedStakingAddress = XYO_NETWORK_STAKING_ADDRESS,\n minStake = 10_000n,\n gas: GasConfig = {},\n): Promise<Address> => {\n try {\n const xyoChainFactory = new StakedXyoChainV2__factory(signer)\n const deployResponse = await xyoChainFactory.deploy(\n ETH_ZERO_ADDRESS, // forkFromChainId\n 0n, // forkFromLastBlockNumber\n hexToBigInt(genesisBlockHash), // forkFromLastHash\n toEthAddress(rewardsContractAddress),\n minWithdrawalBlocks, // min withdraw blocks\n toEthAddress(stakingTokenAddress),\n maxStakersPerAddress,\n toEthAddress(unlimitedStakingAddress),\n minStake,\n gas,\n )\n await deployResponse.waitForDeployment()\n const xyoChainContractAddress = await deployResponse.getAddress()\n return assertEx(asAddress(xyoChainContractAddress), () => 'Invalid staking contract address')\n } catch (ex) {\n console.log(ex)\n throw ex\n }\n}\n", "import type { Address } from '@ariestools/sdk'\nimport {\n asAddress, assertEx, toFixedPoint,\n} from '@ariestools/sdk'\nimport { XyoChainRewards__factory as XyoChainRewardsFactory } from '@xyo-network/typechain'\nimport { parseUnits, type Signer } from 'ethers'\n\nimport type { GasConfig } from './ethereum.ts'\n\nconst gasConfig = () => {\n return {\n gasLimit: 2_000_000, // Set the gas limit\n gasPrice: parseUnits('100', 'gwei'),\n }\n}\n\nexport const createChainRewardsContract = async (\n signer: Signer,\n genesisReward = 0n,\n gas: GasConfig = gasConfig(),\n): Promise<Address> => {\n try {\n const xyoChainRewardsFactory = new XyoChainRewardsFactory(signer)\n const deployResponse = await xyoChainRewardsFactory.deploy(\n toFixedPoint(1000n),\n 1_000_000n,\n 95n,\n 100n,\n toFixedPoint(30n),\n genesisReward,\n 18n,\n gas,\n )\n await deployResponse.waitForDeployment()\n const xyoChainRewardsAddress = await deployResponse.getAddress()\n return assertEx(asAddress(xyoChainRewardsAddress), () => 'Invalid rewards contract address')\n } catch (ex) {\n console.log(ex)\n throw ex\n }\n}\n", "import type { Address } from '@ariestools/sdk'\nimport {\n asAddress, assertEx, toEthAddress,\n} from '@ariestools/sdk'\nimport { getCreateAddress } from 'ethers/address'\nimport type { Provider, Signer } from 'ethers/providers'\n\n/**\n * Predicts the next contract address for a contract that will be deployed\n * @param address The address of the deployer\n * @param provider The provider to use\n * @returns The predicted contract address\n */\nexport const nextContractAddressForAddress = async (address: Address, provider: Provider) => {\n // Get the deployer address\n const deployerAddress = toEthAddress(address)\n\n // Get the next nonce for the deployer account\n const nonce = await provider.getTransactionCount(deployerAddress)\n\n // Predict the next deployed contract contract address\n const contractAddress = getCreateAddress({ from: deployerAddress, nonce })\n\n // Return the predicted contract address\n return assertEx(asAddress(contractAddress), () => 'Unable to convert contract address to address')\n}\n\n/**\n * Predicts the next contract address for a contract that will be deployed\n * @param signer The signer to use when deploying the contract\n * @returns The predicted contract address\n */\nexport const nextContractAddress = async (signer: Signer) => {\n const provider = assertEx(signer.provider, () => 'Unable to obtain provider from signer')\n const address = assertEx(asAddress(await signer.getAddress()), () => 'Unable to obtain address from signer')\n return await nextContractAddressForAddress(address, provider)\n}\n", "import type { EthAddress, Promisable } from '@ariestools/sdk'\nimport {\n assertEx,\n exists, isDefined,\n toAddress, toEthAddress,\n} from '@ariestools/sdk'\nimport {\n type IAddressStakingEvents,\n IAddressStakingEvents__factory,\n type TypedEventLog,\n} from '@xyo-network/typechain'\nimport {\n creatableProvider,\n type StakeEvent, type StakeEventFilter, type StakeEventName,\n type StakeEventsViewer,\n StakeEventsViewerMoniker,\n} from '@xyo-network/xl1-sdk'\nimport { asAttoXL1 } from '@xyo-network/xl1-sdk'\n\nimport type { ReturnTypeForOverload } from '../model/index.ts'\nimport type { EvmViewerParams } from '../providers/index.ts'\nimport { AbstractEvmViewer } from '../providers/index.ts'\nimport { EvmStakeEventZod } from './EvmStakeEventZod.ts'\n\ntype StakeAddedLogEvent = TypedEventLog<ReturnTypeForOverload<IAddressStakingEvents['getEvent'], 'StakeAdded'>>\ntype StakeRemovedLogEvent = TypedEventLog<ReturnTypeForOverload<IAddressStakingEvents['getEvent'], 'StakeRemoved'>>\ntype StakeWithdrawnLogEvent = TypedEventLog<ReturnTypeForOverload<IAddressStakingEvents['getEvent'], 'StakeWithdrawn'>>\ntype StakeLogEvent = StakeAddedLogEvent | StakeRemovedLogEvent | StakeWithdrawnLogEvent\n\nexport interface EvmStakeEventsParams extends EvmViewerParams {\n\n}\n\n@creatableProvider()\nexport class EvmStakeEventsViewer extends AbstractEvmViewer<EvmStakeEventsParams, IAddressStakingEvents> implements StakeEventsViewer {\n static readonly connectionTypes = ['evm-rpc'] as const\n static readonly defaultMoniker = StakeEventsViewerMoniker\n static readonly dependencies = []\n static readonly monikers = [StakeEventsViewerMoniker]\n static readonly surface = 'node' as const\n moniker = EvmStakeEventsViewer.defaultMoniker\n\n private eventCache = new Map<string, StakeEvent>()\n\n get deploymentBlock() {\n return this.params.deploymentBlock ?? 0\n }\n\n async positionCount(range: [number, number | 'latest']): Promise<number> {\n const events = await this.stakeEvents(range)\n const positionIds = events.map(e => e.args.id)\n return Math.max(-1, ...positionIds) + 1\n }\n\n stakeEvents<TName extends StakeEventName>(\n range: [number, number | 'latest'] = [0, 'latest'],\n filter?: StakeEventFilter<TName>,\n ): Promisable<StakeEvent<TName>[]> {\n const allEvents = this.eventCache.values().toArray()\n\n // eslint-disable-next-line complexity\n const result = allEvents.filter((e) => {\n if ((range[1] !== 'latest') && (e.time > range[1])) {\n return false\n }\n if (e.time < range[0]) {\n return false\n }\n if (isDefined(filter?.name) && (e.name !== filter.name)) {\n return false\n }\n if (isDefined(filter?.args?.id) && (e.args.id !== filter.args.id)) {\n return false\n }\n if (isDefined(filter?.args?.staked) && (e.args.staked !== filter.args.staked)) {\n return false\n }\n if (isDefined(filter?.args?.staker) && (e.args.staker !== filter.args.staker)) {\n return false\n }\n return true\n }) as StakeEvent<TName>[]\n // console.warn(`stakeEvents returning ${result.length} events for range ${range[0]}-${range[1]} out of ${allEvents.length} total events`)\n return result\n }\n\n protected override connectContract(address: EthAddress) {\n return IAddressStakingEvents__factory.connect(address, this.params.provider)\n }\n\n protected onEventHandler(staked: string, staker: string, id: bigint, amount: bigint, event: StakeLogEvent, throwOnInvalid = false): StakeEvent | undefined {\n const validatedEventResult = EvmStakeEventZod.safeParse(event)\n\n if (validatedEventResult.error) {\n this.logger?.warn(`Received invalid stake event [${event.eventName}/${event.blockNumber}], ignoring...`)\n this.logger?.warn(` - ${validatedEventResult.error.message}`)\n if (throwOnInvalid) {\n throw new Error(`Invalid stake event: ${validatedEventResult.error.message}`)\n }\n return\n }\n\n const validatedEvent = validatedEventResult.data\n const { eventName, blockNumber } = validatedEvent\n\n this.logger?.log(`Processing ${eventName} event for stake ID ${id} at block ${blockNumber}`)\n\n const cacheKey = `${Number(id)}|${eventName}|${staker}`\n const existingStakeEvent = this.eventCache.get(cacheKey)\n const stakeEvent = {\n name: eventName,\n args: {\n id: Number(id),\n staked: toAddress(staked),\n staker: toAddress(staker),\n amount: asAttoXL1(amount),\n },\n time: blockNumber,\n } satisfies StakeEvent\n\n if (isDefined(existingStakeEvent)) {\n this.logger?.warn(`Received ${eventName} event for stake ID ${id} that is already cached, updating cache...`)\n this.logger?.warn('1')\n this.logger?.warn('Previous event', existingStakeEvent)\n this.logger?.warn('2')\n this.logger?.warn('New event', stakeEvent)\n this.logger?.warn('3')\n }\n\n this.eventCache.set(cacheKey, stakeEvent)\n return stakeEvent\n }\n\n protected override async startHandler() {\n try {\n const currentEthBlock = assertEx(await this.contract.runner?.provider?.getBlockNumber(), () => new Error('Failed to egt currentEthBlock'))\n\n await this.contract.on(this.contract.getEvent('StakeAdded'), (staked, staker, id, amount, event) => {\n this.onEventHandler(staked, staker, id, amount, event)\n })\n await this.contract.on(this.contract.getEvent('StakeRemoved'), (staked, staker, id, amount, event) => {\n this.onEventHandler(staked, staker, id, amount, event)\n })\n await this.contract.on(this.contract.getEvent('StakeWithdrawn'), (staked, staker, id, amount, event) => {\n this.onEventHandler(staked, staker, id, amount, event)\n })\n\n await this.loadHistoricalEvents(currentEthBlock)\n } catch (error) {\n this.logger?.error('EthereumChainStakeEvents failed to start:', error)\n throw error\n }\n }\n\n private async loadHistoricalEvents(currentEthBlock: number) {\n const stakeEventGroups = await Promise.all([\n this.stakeEventsNative([this.deploymentBlock, currentEthBlock], { name: 'StakeAdded' }),\n this.stakeEventsNative([this.deploymentBlock, currentEthBlock], { name: 'StakeRemoved' }),\n this.stakeEventsNative([this.deploymentBlock, currentEthBlock], { name: 'StakeWithdrawn' }),\n ])\n const allStakeEvents = stakeEventGroups.flat().toSorted((a, b) => a.time - b.time)\n\n console.warn(`Caching ${allStakeEvents.length} stake events from chain starting at block ${this.deploymentBlock}`)\n\n for (const event of allStakeEvents) {\n this.eventCache.set(`${Number(event.args.id)}|${event.name}|${event.args.staker}`, event)\n }\n }\n\n private async stakeEventsNative(\n range: [number, number | 'latest'] = [0, 'latest'],\n filter?: StakeEventFilter<StakeEvent['name']>,\n ): Promise<StakeEvent[]> {\n const name = filter?.name\n if (isDefined(name)) {\n const stakedFilter = filter?.args?.staked\n const stakerFilter = filter?.args?.staker\n const stakedFilterEth = isDefined(stakedFilter) ? toEthAddress(stakedFilter) : undefined\n const stakerFilterEth = isDefined(stakerFilter) ? toEthAddress(stakerFilter) : undefined\n const ethFilter = this.contract.filters[name](stakedFilterEth, stakerFilterEth)\n const ethEvents = await this.contract.queryFilter(ethFilter, range[0], range[1])\n\n return ethEvents.map((e) => {\n assertEx(e.eventName === name, () => `Event name mismatch expected '${name}' but got '${e.eventName}'`)\n return this.onEventHandler(e.args.staked, e.args.by, e.args.id, e.args.amount, e, true)\n }).filter(exists)\n }\n throw new Error('Only filtered stake events (by name) are supported')\n }\n}\n", "import { type EthAddress, toEthAddress } from '@ariestools/sdk'\nimport type { CreatableProviderParams } from '@xyo-network/xl1-sdk'\nimport { AbstractCreatableProvider } from '@xyo-network/xl1-sdk'\nimport type { BaseContract } from 'ethers'\n\nexport interface EvmProviderParams extends CreatableProviderParams {\n address: EthAddress\n deploymentBlock?: number\n}\n\nexport abstract class AbstractEvmProvider<TParams extends EvmProviderParams, TContract extends BaseContract> extends\n AbstractCreatableProvider<TParams> {\n protected _contract!: TContract\n\n protected get contract() {\n return this._contract\n }\n\n override async createHandler() {\n await super.createHandler()\n this._contract = this.connectContract(toEthAddress(this.params.address))\n }\n\n protected abstract connectContract(address: EthAddress): TContract\n}\n", "import { assertEx } from '@ariestools/sdk'\nimport type { BaseContract, ContractRunner } from 'ethers'\n\nimport type { EvmViewerParams } from './AbstractEvmViewer.ts'\nimport { AbstractEvmViewer } from './AbstractEvmViewer.ts'\n\nexport interface EvmRunnerParams extends EvmViewerParams {\n runner: ContractRunner\n}\n\nexport abstract class AbstractEvmRunner<TParams extends EvmRunnerParams = EvmRunnerParams,\n TContract extends BaseContract = BaseContract> extends\n AbstractEvmViewer<TParams, TContract> {\n static override async paramsHandler<T extends AbstractEvmRunner>(params: Partial<T['params']>): Promise<T['params']> {\n const runner = assertEx(params?.runner, () => new Error('No runner defined'))\n const provider = assertEx(runner.provider, () => new Error('Runner must have a provider defined'))\n return { ...(await super.paramsHandler({ ...params, provider })), runner }\n }\n}\n", "import type { BaseContract, Provider } from 'ethers'\n\nimport { AbstractEvmProvider, type EvmProviderParams } from './AbstractEvmProvider.ts'\n\nexport interface EvmViewerParams extends EvmProviderParams {\n provider: Provider\n}\n\nexport abstract class AbstractEvmViewer<TParams extends EvmViewerParams, TContract extends BaseContract> extends\n AbstractEvmProvider<TParams, TContract> {}\n", "import type {\n Address, EthAddress, Hash,\n} from '@ariestools/sdk'\nimport {\n asHash, assertEx, toAddress, toEthAddress, toHex,\n} from '@ariestools/sdk'\nimport type { IStakedXyoChain } from '@xyo-network/typechain'\nimport { IStakedXyoChain__factory } from '@xyo-network/typechain'\nimport type { ChainContractViewer, XL1BlockNumber } from '@xyo-network/xl1-sdk'\nimport {\n ChainContractViewerMoniker, creatableProvider, toXL1BlockNumber, withContextCacheResponse,\n} from '@xyo-network/xl1-sdk'\n\nimport type { EvmViewerParams } from './AbstractEvmViewer.ts'\nimport { AbstractEvmViewer } from './AbstractEvmViewer.ts'\n\nexport interface EvmChainContractViewerParams extends EvmViewerParams {}\n\n/**\n * A class that represents a chain stake as backed by an EVM smart contract\n */\n@creatableProvider()\nexport class EvmChainContractViewer extends AbstractEvmViewer<EvmChainContractViewerParams, IStakedXyoChain> implements ChainContractViewer {\n static readonly connectionTypes = ['evm-rpc'] as const\n static readonly defaultMoniker = ChainContractViewerMoniker\n static readonly dependencies = []\n static readonly monikers = [ChainContractViewerMoniker]\n static readonly surface = 'node' as const\n override moniker = EvmChainContractViewer.defaultMoniker\n\n private _forkedAtBlockNumber?: Promise<XL1BlockNumber | null>\n private _forkedAtHash?: Promise<Hash>\n private _forkedChainContractViewer?: Promise<ChainContractViewer>\n private _forkedChainId?: Promise<Address>\n private _minWithdrawalBlocks?: Promise<number>\n private _rewardsContract?: Promise<Address>\n private _stakingTokenAddress?: Promise<Address>\n\n get address() {\n return this.params.address\n }\n\n chainId() {\n return toHex(this.params.address, { prefix: false })\n }\n\n async chainIdAtBlockNumber(blockNumber: XL1BlockNumber) {\n return await withContextCacheResponse(this.context, 'chainIdAtBlockNumber', String(blockNumber), async () => {\n let chainId = this.chainId()\n // eslint-disable-next-line unicorn/no-this-assignment, @typescript-eslint/no-this-alias\n let contractViewer: ChainContractViewer = this\n let forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber()\n while (forkedAtBlockNumber !== null && blockNumber <= forkedAtBlockNumber) {\n contractViewer = assertEx(await contractViewer.forkedChainContractViewer(), () => 'Forked chain contract viewer is undefined')\n forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber()\n chainId = await contractViewer.chainId()\n }\n return chainId\n })\n }\n\n async forkedAtBlockNumber() {\n const contractAddress = this.contract.getAddress()\n try {\n this._forkedAtBlockNumber = this._forkedAtBlockNumber ?? (async () => toXL1BlockNumber(await (this.contract).forkedAtBlockNumber(), true))()\n return await this._forkedAtBlockNumber\n } catch {\n this.logger?.warn('Failed to fetch forkedAtBlockNumber, returning null', contractAddress)\n this._forkedAtBlockNumber = Promise.resolve(null)\n return await this._forkedAtBlockNumber\n }\n }\n\n async forkedAtHash() {\n this._forkedAtHash = this._forkedAtHash ?? (async () => asHash(toHex(await (this.contract).forkedAtHash()), true))()\n return await this._forkedAtHash\n }\n\n async forkedChainContractViewer(): Promise<ChainContractViewer> {\n this._forkedChainContractViewer = this._forkedChainContractViewer ?? (async () => {\n const address = await this.forkedChainId()\n return EvmChainContractViewer.create({ ...this.params, address: toEthAddress(address) })\n })()\n return await this._forkedChainContractViewer\n }\n\n async forkedChainId(): Promise<Address> {\n this._forkedChainId = this._forkedChainId ?? (async () => {\n return toAddress(await (this.contract).forkedChainId())\n })()\n return await this._forkedChainId\n }\n\n async minWithdrawalBlocks(): Promise<number> {\n this._minWithdrawalBlocks = this._minWithdrawalBlocks ?? (async () => Number(await (this.contract).minWithdrawalBlocks()))()\n return await this._minWithdrawalBlocks\n }\n\n async rewardsContract(): Promise<Address> {\n this._rewardsContract = this._rewardsContract ?? (async () => {\n return toAddress(await (this.contract).rewardsContract())\n })()\n return await this._rewardsContract\n }\n\n async stakingTokenAddress(): Promise<Address> {\n this._stakingTokenAddress = this._stakingTokenAddress ?? (async () => {\n return toAddress(await (this.contract).stakingTokenAddress())\n })()\n return await this._stakingTokenAddress\n }\n\n protected override connectContract(address: EthAddress) {\n return IStakedXyoChain__factory.connect(address, this.params.provider)\n }\n}\n", "import type { Address, EthAddress } from '@ariestools/sdk'\nimport { toEthAddress } from '@ariestools/sdk'\nimport type { IStakedXyoChain } from '@xyo-network/typechain'\nimport { IStakedXyoChain__factory } from '@xyo-network/typechain'\nimport type { StakeRunner } from '@xyo-network/xl1-sdk'\nimport {\n creatableProvider,\n StakeRunnerMoniker,\n} from '@xyo-network/xl1-sdk'\nimport { getAddress } from 'ethers/address'\n\nimport type { EvmRunnerParams } from './AbstractEvmRunner.ts'\nimport { AbstractEvmRunner } from './AbstractEvmRunner.ts'\n\nexport interface EvmStakeRunnerParams extends EvmRunnerParams {}\n\n@creatableProvider()\nexport class EvmStakeRunner extends AbstractEvmRunner<EvmStakeRunnerParams, IStakedXyoChain> implements StakeRunner {\n static readonly connectionTypes = ['evm-rpc'] as const\n static readonly defaultMoniker = StakeRunnerMoniker\n static readonly dependencies = []\n static readonly monikers = [StakeRunnerMoniker]\n static readonly surface = 'node' as const\n override moniker = EvmStakeRunner.defaultMoniker\n\n async addStake(staked: Address, amount: bigint): Promise<boolean> {\n const result = await (this.contract).addStake(getAddress(toEthAddress(staked)), amount)\n await result.wait()\n return true\n }\n\n async removeStake(slot: bigint): Promise<boolean> {\n const result = await (this.contract).removeStake(slot)\n await result.wait()\n return true\n }\n\n async withdrawStake(slot: bigint): Promise<boolean> {\n const result = await (this.contract).withdrawStake(slot)\n await result.wait()\n return true\n }\n\n protected override connectContract(address: EthAddress) {\n return IStakedXyoChain__factory.connect(address, this.params.runner)\n }\n}\n", "import type { Address, EthAddress } from '@ariestools/sdk'\nimport { toEthAddress } from '@ariestools/sdk'\nimport type { IStakedXyoChain } from '@xyo-network/typechain'\nimport { IStakedXyoChain__factory } from '@xyo-network/typechain'\nimport type { StakeTotalsViewer } from '@xyo-network/xl1-sdk'\nimport {\n creatableProvider,\n StakeTotalsViewerMoniker,\n} from '@xyo-network/xl1-sdk'\nimport { getAddress } from 'ethers/address'\n\nimport type { EvmViewerParams } from './AbstractEvmViewer.ts'\nimport { AbstractEvmViewer } from './AbstractEvmViewer.ts'\n\nexport interface EvmChainStakeViewerParams extends EvmViewerParams {}\n\n/**\n * A class that represents a chain stake as backed by an EVM smart contract\n */\n@creatableProvider()\nexport class EvmStakeTotalsViewer extends AbstractEvmViewer<EvmChainStakeViewerParams, IStakedXyoChain> implements StakeTotalsViewer {\n static readonly connectionTypes = ['evm-rpc'] as const\n static readonly defaultMoniker = StakeTotalsViewerMoniker\n static readonly dependencies = []\n static readonly monikers = [StakeTotalsViewerMoniker]\n static readonly surface = 'node' as const\n override moniker = EvmStakeTotalsViewer.defaultMoniker\n\n async active(): Promise<bigint> {\n return await (this.contract).active()\n }\n\n async activeByStaked(staked: Address): Promise<bigint> {\n return await (this.contract).activeByAddressStaked(getAddress(toEthAddress(staked)))\n }\n\n async activeByStaker(address: Address): Promise<bigint> {\n return await (this.contract).activeByStaker(getAddress(toEthAddress(address)))\n }\n\n async pending(): Promise<bigint> {\n return await (this.contract).pending()\n }\n\n async pendingByStaker(staker: Address): Promise<bigint> {\n return await (this.contract).pendingByStaker(getAddress(toEthAddress(staker)))\n }\n\n async withdrawn(): Promise<bigint> {\n return await (this.contract).withdrawn()\n }\n\n async withdrawnByStaker(staker: string): Promise<bigint> {\n return await (this.contract).withdrawnByStaker(getAddress(staker))\n }\n\n protected override connectContract(address: EthAddress) {\n return IStakedXyoChain__factory.connect(address, this.params.provider)\n }\n}\n", "import {\n EthAddressZod, HexRegExMinMaxMixedCaseWithPrefix,\n zodAsFactory, zodIsFactory, zodToFactory,\n} from '@ariestools/sdk'\nimport { z } from 'zod/mini'\n\nexport const EthHashRegEx = HexRegExMinMaxMixedCaseWithPrefix(32, 32)\n\nexport const EthHashZod = z.string().check(z.regex(EthHashRegEx, { error: 'Invalid address format' }))\n\nexport const EvmStakeAddedEventNameZod = z.literal('StakeAdded')\nexport const EvmStakeRemovedEventNameZod = z.literal('StakeRemoved')\nexport const EvmStakeWithdrawnEventNameZod = z.literal('StakeWithdrawn')\n\nexport const EvmStakeEventNameZod = z.union([\n EvmStakeAddedEventNameZod,\n EvmStakeRemovedEventNameZod,\n EvmStakeWithdrawnEventNameZod,\n])\n\nexport const EvmStakeEventArgsZod = z.tuple([\n EthAddressZod, // staker\n EthAddressZod, // staked\n z.bigint(), // id\n z.bigint(), // amount\n])\n\nexport const EvmStakeEventZod = z.object({\n address: EthAddressZod,\n args: EvmStakeEventArgsZod,\n blockHash: EthHashZod,\n blockNumber: z.number(),\n eventName: EvmStakeEventNameZod,\n transactionHash: EthHashZod,\n transactionIndex: z.number(),\n})\nexport type EvmStakeEvent = z.infer<typeof EvmStakeEventZod>\n\nexport const isEvmStakeEvent = zodIsFactory(EvmStakeEventZod)\nexport const asEvmStakeEvent = zodAsFactory(EvmStakeEventZod, 'asEvmStakeEvent')\nexport const toEvmStakeEvent = zodToFactory(EvmStakeEventZod, 'toEvmStakeEvent')\n\nexport const EvmStakeAddedEventZod = z.extend(EvmStakeEventZod, { eventName: EvmStakeAddedEventNameZod })\nexport type EvmStakeAddedEvent = z.infer<typeof EvmStakeAddedEventZod>\n\nexport const isEvmStakeAddedEvent = zodIsFactory(EvmStakeAddedEventZod)\nexport const asEvmStakeAddedEvent = zodAsFactory(EvmStakeAddedEventZod, 'asEvmStakeAddedEvent')\nexport const toEvmStakeAddedEvent = zodToFactory(EvmStakeAddedEventZod, 'toEvmStakeAddedEvent')\n\nexport const EvmStakeRemovedEventZod = z.extend(EvmStakeEventZod, { eventName: EvmStakeRemovedEventNameZod })\nexport type EvmStakeRemovedEvent = z.infer<typeof EvmStakeRemovedEventZod>\n\nexport const isEvmStakeRemovedEvent = zodIsFactory(EvmStakeRemovedEventZod)\nexport const asEvmStakeRemovedEvent = zodAsFactory(EvmStakeRemovedEventZod, 'asEvmStakeRemovedEvent')\nexport const toEvmStakeRemovedEvent = zodToFactory(EvmStakeRemovedEventZod, 'toEvmStakeRemovedEvent')\n\nexport const EvmStakeWithdrawnEventZod = z.extend(EvmStakeEventZod, { eventName: EvmStakeWithdrawnEventNameZod })\nexport type EvmStakeWithdrawnEvent = z.infer<typeof EvmStakeWithdrawnEventZod>\n\nexport const isEvmStakeWithdrawnEvent = zodIsFactory(EvmStakeWithdrawnEventZod)\nexport const asEvmStakeWithdrawnEvent = zodAsFactory(EvmStakeWithdrawnEventZod, 'asEvmStakeWithdrawnEvent')\nexport const toEvmStakeWithdrawnEvent = zodToFactory(EvmStakeWithdrawnEventZod, 'toEvmStakeWithdrawnEvent')\n", "import type {\n Address, EthAddress, Promisable,\n} from '@ariestools/sdk'\nimport {\n assertEx, toAddress,\n toEthAddress,\n} from '@ariestools/sdk'\nimport { type IAddressStaking, IAddressStaking__factory } from '@xyo-network/typechain'\nimport {\n creatableProvider,\n type Position, type PositionId,\n type StakeEvent,\n type StakeEventsViewer,\n StakeEventsViewerMoniker,\n type StakeViewer,\n StakeViewerMoniker,\n} from '@xyo-network/xl1-sdk'\nimport { asAttoXL1 } from '@xyo-network/xl1-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport type { EvmViewerParams } from '../providers/index.ts'\nimport { AbstractEvmViewer } from '../providers/index.ts'\n\nconst ethStakeToStake = (ethStake: Awaited<ReturnType<IAddressStaking['getStakeById']>>): Position => {\n const stake = {\n id: Number(ethStake.id) as PositionId,\n staked: toAddress(ethStake.staked),\n staker: toAddress(ethStake.staker),\n amount: asAttoXL1(ethStake.amount),\n addBlock: Number(ethStake.addBlock),\n removeBlock: Number(ethStake.removeBlock),\n withdrawBlock: Number(ethStake.withdrawBlock),\n } satisfies Position\n return stake\n}\n\nexport interface EvmStakeViewerParams extends EvmViewerParams {\n\n}\n\n@creatableProvider()\nexport class EvmStakeViewer extends AbstractEvmViewer<EvmStakeViewerParams, IAddressStaking> implements StakeViewer {\n static readonly connectionTypes = ['evm-rpc'] as const\n static readonly defaultMoniker = StakeViewerMoniker\n static readonly dependencies = []\n static readonly monikers = [StakeViewerMoniker]\n static readonly surface = 'node' as const\n readonly moniker = EvmStakeViewer.defaultMoniker\n\n private _callMutex = new Mutex()\n private _deploymentBlock = 0\n\n private _stakeCache = new Map<number, Position>()\n private _stakeEventsViewer!: StakeEventsViewer\n\n get stakeEvents() {\n return this._stakeEventsViewer\n }\n\n async active(): Promise<bigint> {\n return await this._callMutex.runExclusive(async () => {\n return await this.contract.active()\n })\n }\n\n async activeByAddressStaked(address: Address): Promise<bigint> {\n return await this._callMutex.runExclusive(async () => {\n return await this.contract.activeByAddressStaked(toEthAddress(address))\n })\n }\n\n async activeByStaker(address: Address): Promise<bigint> {\n return await this._callMutex.runExclusive(async () => {\n return await this.contract.activeByStaker(toEthAddress(address))\n })\n }\n\n activeStakes(): Promisable<Position[]> {\n return this._stakeCache.values().filter(stake => stake.removeBlock === 0 && stake.withdrawBlock === 0).toArray()\n }\n\n override async createHandler(): Promise<void> {\n await super.createHandler()\n this._stakeEventsViewer = await this.locator.getInstance<StakeEventsViewer>(StakeEventsViewerMoniker)\n }\n\n minWithdrawalBlocks(): number {\n return 0\n }\n\n async pending(): Promise<bigint> {\n return await this._callMutex.runExclusive(async () => {\n return await this.contract.pending()\n })\n }\n\n async pendingByStaker(staker: Address): Promise<bigint> {\n return await this._callMutex.runExclusive(async () => {\n return await this.contract.pendingByStaker(toEthAddress(staker))\n })\n }\n\n removedStakes(): Promisable<Position[]> {\n return this._stakeCache.values().filter(stake => stake.removeBlock !== 0 && stake.withdrawBlock === 0).toArray()\n }\n\n rewardsContract(): Address {\n return toAddress('0x000000000000000000000000000000')\n }\n\n async stakeById(id: number): Promise<Position> {\n return await this._callMutex.runExclusive(async () => {\n const startTime = Date.now()\n const cachedStake = this._stakeCache.get(id)\n if (cachedStake) {\n return cachedStake\n }\n const ethResult = await this.contract.getStakeById(id)\n const stake = ethStakeToStake(ethResult)\n this._stakeCache.set(stake.id, stake)\n this.logger?.log(`EthereumChainStake: stakeById(${id}) took ${Date.now() - startTime}ms`)\n return stake\n })\n }\n\n async stakeByStaker(staker: Address, slot: number): Promise<Position> {\n return await this._callMutex.runExclusive(async () => {\n const ethResult = await this.contract.getStake(toEthAddress(staker), slot)\n const stake = ethStakeToStake(ethResult)\n this._stakeCache.set(stake.id, stake)\n return stake\n })\n }\n\n async stakesByStaked(staked: Address, range: [number, number | undefined] = [0, undefined]): Promise<Position[]> {\n const events = await this.stakeEvents.stakeEvents([Math.max(\n range[0],\n this._deploymentBlock,\n ), range.at(1) ?? 'latest'], { name: 'StakeAdded', args: { staked } })\n\n const result: Position[] = []\n for (const event of events) {\n if (toAddress(event.args.staked) === toAddress(staked)) {\n result.push(await this.stakeById(event.args.id))\n }\n }\n return result\n }\n\n async stakesByStaker(staker: Address, range: [number, number | undefined] = [0, undefined]): Promise<Position[]> {\n const events = await this.stakeEvents.stakeEvents([Math.max(\n range[0],\n this._deploymentBlock,\n ), range.at(1) ?? 'latest'], { name: 'StakeAdded', args: { staker } })\n const result: Position[] = []\n for (const event of events) {\n if (toAddress(event.args.staker) === toAddress(staker)) {\n result.push(await this.stakeById(event.args.id))\n }\n }\n return result\n }\n\n stakingTokenAddress(): Address {\n return toAddress('0x000000000000000000000000000011')\n }\n\n async withdrawn(): Promise<bigint> {\n return await this._callMutex.runExclusive(async () => {\n return await this.contract.withdrawn()\n })\n }\n\n async withdrawnByStaker(staker: Address): Promise<bigint> {\n return await this._callMutex.runExclusive(async () => {\n return await this.contract.withdrawnByStaker(toEthAddress(staker))\n })\n }\n\n withdrawnStakes(): Promisable<Position[]> {\n return this._stakeCache.values().filter(stake => stake.removeBlock !== 0 && stake.withdrawBlock !== 0).toArray()\n }\n\n protected override connectContract(address: EthAddress) {\n return IAddressStaking__factory.connect(address, this.params.provider)\n }\n\n protected override async startHandler() {\n await this.contract.on(this.contract.getEvent('StakeAdded'), (staked, staker, id, amount, event) => {\n this._stakeCache.set(Number(id), {\n id: Number(id) as PositionId,\n staked: toAddress(staked),\n staker: toAddress(staker),\n amount: asAttoXL1(amount),\n addBlock: event.blockNumber,\n removeBlock: 0,\n withdrawBlock: 0,\n })\n })\n await this.contract.on(this.contract.getEvent('StakeRemoved'), (staked, staker, id, amount, event) => {\n const stake = assertEx(this._stakeCache.get(Number(id)))\n this._stakeCache.set(Number(id), {\n ...stake,\n removeBlock: event.blockNumber,\n })\n })\n await this.contract.on(this.contract.getEvent('StakeWithdrawn'), (staked, staker, id, amount, event) => {\n const stake = assertEx(this._stakeCache.get(Number(id)))\n this._stakeCache.set(Number(id), {\n ...stake,\n withdrawBlock: event.blockNumber,\n })\n })\n const stakeEventGroups = await Promise.all([\n this.stakeEvents.stakeEvents([this._deploymentBlock, 'latest'], { name: 'StakeAdded' }),\n this.stakeEvents.stakeEvents([this._deploymentBlock, 'latest'], { name: 'StakeRemoved' }),\n this.stakeEvents.stakeEvents([this._deploymentBlock, 'latest'], { name: 'StakeWithdrawn' }),\n ])\n const allStakeEvents = stakeEventGroups.flat().toSorted((a, b) => a.time - b.time)\n\n for (const event of allStakeEvents) {\n this.applyHistoricalStakeEvent(event)\n }\n for (const event of allStakeEvents) {\n await this.stakeById(event.args.id)\n }\n }\n\n private applyHistoricalStakeEvent(event: StakeEvent): void {\n if (event.name === 'StakeAdded') {\n this._stakeCache.set(event.args.id, {\n id: event.args.id as PositionId,\n staked: event.args.staked,\n staker: event.args.staker,\n amount: event.args.amount,\n addBlock: event.time,\n removeBlock: 0,\n withdrawBlock: 0,\n })\n return\n }\n if (event.name === 'StakeRemoved') {\n const stake = assertEx(this._stakeCache.get(event.args.id))\n this._stakeCache.set(event.args.id, {\n ...stake,\n removeBlock: event.time,\n })\n return\n }\n if (event.name === 'StakeWithdrawn') {\n const stake = assertEx(this._stakeCache.get(event.args.id))\n this._stakeCache.set(event.args.id, {\n ...stake,\n withdrawBlock: event.time,\n })\n }\n }\n}\n", "import { parseUnits } from 'ethers/utils'\n\nexport interface GasConfig {\n gasLimit?: number\n gasPrice?: bigint\n}\n\nexport const getDefaultGasConfig = (): GasConfig => {\n return {\n gasLimit: 2_000_000, // Set the gas limit\n gasPrice: parseUnits('100', 'gwei'),\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["isDefined", "asEthBlockRange", "asEthBlockRange", "isDefined", "toEthAddress", "XYO_NETWORK_STAKING_ADDRESS", "assertEx", "asAddress", "assertEx", "asAddress", "assertEx", "toEthAddress", "XYO_NETWORK_STAKING_ADDRESS", "toEthAddress", "assertEx", "isDefined", "toAddress", "toEthAddress", "creatableProvider", "toEthAddress", "assertEx", "assertEx", "assertEx", "toAddress", "toEthAddress", "assertEx", "toEthAddress", "toAddress", "toEthAddress", "IStakedXyoChain__factory", "creatableProvider", "toEthAddress", "IStakedXyoChain__factory", "creatableProvider", "toEthAddress", "IStakedXyoChain__factory", "creatableProvider", "getAddress", "getAddress", "toEthAddress", "IStakedXyoChain__factory", "creatableProvider", "isDefined", "toAddress", "assertEx", "toEthAddress", "creatableProvider", "assertEx", "toAddress", "toEthAddress", "creatableProvider", "StakeEventsViewerMoniker", "asAttoXL1", "toAddress", "asAttoXL1", "toEthAddress", "StakeEventsViewerMoniker", "assertEx", "creatableProvider", "parseUnits"]
3
+ "sources": ["../../src/modules/ethereum/BaseEthProvider.ts", "../../src/modules/ethereum/block/blockRangeChunks.ts", "../../src/modules/ethereum/block/estimateBlockNumberAt.ts", "../../src/modules/ethereum/block/rate/blockRate.ts", "../../src/modules/ethereum/block/rate/timeRate.ts", "../../src/modules/ethereum/createChain.ts", "../../src/modules/ethereum/createChainContract.ts", "../../src/modules/ethereum/createChainRewardsContract.ts", "../../src/modules/ethereum/nextContractAddress.ts", "../../src/modules/ethereum/drivers/EvmStakeEventsViewer.ts", "../../src/modules/ethereum/providers/AbstractEvmProvider.ts", "../../src/modules/ethereum/providers/AbstractEvmRunner.ts", "../../src/modules/ethereum/providers/AbstractEvmViewer.ts", "../../src/modules/ethereum/providers/EvmChainContractViewer.ts", "../../src/modules/ethereum/providers/EvmStakeRunner.ts", "../../src/modules/ethereum/providers/EvmStakeTotalsViewer.ts", "../../src/modules/ethereum/rpc/withRpcRateLimitBackoff.ts", "../../src/modules/ethereum/rpc/isRpcRateLimitError.ts", "../../src/modules/ethereum/drivers/EvmStakeEventZod.ts", "../../src/modules/ethereum/drivers/EvmStakeViewer.ts", "../../src/modules/ethereum/ethereum.ts"],
4
+ "sourcesContent": ["import type {\n Address, BlockAPI,\n BlockNumberOrTag,\n CompileResultAPI,\n EthExecutionAPI,\n FeeHistoryResultAPI,\n Filter,\n FilterResultsAPI,\n HexString, HexString8Bytes,\n HexString32Bytes,\n HexString256Bytes,\n HexStringBytes,\n SignedTransactionInfoAPI,\n SyncingStatusAPI,\n TransactionCallAPI,\n TransactionInfoAPI,\n TransactionReceiptAPI,\n TransactionWithSenderAPI,\n Uint,\n Uint256,\n} from 'web3-types'\n\nexport class BaseEthProvider implements EthExecutionAPI {\n eth_accounts(): Address[] {\n throw new Error('Method not implemented.')\n }\n\n eth_blockNumber(): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_call(_transaction: TransactionCallAPI, _blockNumber: BlockNumberOrTag): HexStringBytes {\n throw new Error('Method not implemented.')\n }\n\n eth_clearSubscriptions(_keepSyncing?: boolean): void {\n throw new Error('Method not implemented.')\n }\n\n eth_coinbase(): Address {\n throw new Error('Method not implemented.')\n }\n\n eth_compileLLL(_code: string): HexStringBytes {\n throw new Error('Method not implemented.')\n }\n\n eth_compileSerpent(_code: string): HexStringBytes {\n throw new Error('Method not implemented.')\n }\n\n eth_compileSolidity(_code: string): CompileResultAPI {\n throw new Error('Method not implemented.')\n }\n\n eth_estimateGas(_transaction: Partial<TransactionWithSenderAPI>, _blockNumber: BlockNumberOrTag): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_feeHistory(_blockCount: Uint, _newestBlock: BlockNumberOrTag, _rewardPercentiles: number[]): FeeHistoryResultAPI {\n throw new Error('Method not implemented.')\n }\n\n eth_gasPrice(): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_getBalance(_address: Address, _blockNumber: BlockNumberOrTag): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_getBlockByHash(_blockHash: HexString32Bytes, _hydrated: boolean): BlockAPI {\n throw new Error('Method not implemented.')\n }\n\n eth_getBlockByNumber(_blockNumber: BlockNumberOrTag, _hydrated: boolean): BlockAPI {\n throw new Error('Method not implemented.')\n }\n\n eth_getBlockTransactionCountByHash(_blockHash: HexString32Bytes): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_getBlockTransactionCountByNumber(_blockNumber: BlockNumberOrTag): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_getCode(_address: Address, _blockNumber: BlockNumberOrTag): HexStringBytes {\n throw new Error('Method not implemented.')\n }\n\n eth_getCompilers(): string[] {\n throw new Error('Method not implemented.')\n }\n\n eth_getFilterChanges(_filterIdentifier: Uint): FilterResultsAPI {\n throw new Error('Method not implemented.')\n }\n\n eth_getFilterLogs(_filterIdentifier: Uint): FilterResultsAPI {\n throw new Error('Method not implemented.')\n }\n\n eth_getLogs(_filter: Filter): FilterResultsAPI {\n throw new Error('Method not implemented.')\n }\n\n eth_getStorageAt(_address: Address, _storageSlot: Uint256, _blockNumber: BlockNumberOrTag): HexStringBytes {\n throw new Error('Method not implemented.')\n }\n\n eth_getTransactionByBlockHashAndIndex(_blockHash: HexString32Bytes, _transactionIndex: Uint): TransactionInfoAPI | undefined {\n throw new Error('Method not implemented.')\n }\n\n eth_getTransactionByBlockNumberAndIndex(_blockNumber: BlockNumberOrTag, _transactionIndex: Uint): TransactionInfoAPI | undefined {\n throw new Error('Method not implemented.')\n }\n\n eth_getTransactionByHash(_transactionHash: HexString32Bytes): TransactionInfoAPI | undefined {\n throw new Error('Method not implemented.')\n }\n\n eth_getTransactionCount(_address: Address, _blockNumber: BlockNumberOrTag): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_getTransactionReceipt(_transactionHash: HexString32Bytes): TransactionReceiptAPI | undefined {\n throw new Error('Method not implemented.')\n }\n\n eth_getUncleByBlockHashAndIndex(_blockHash: HexString32Bytes, _uncleIndex: Uint): BlockAPI {\n throw new Error('Method not implemented.')\n }\n\n eth_getUncleByBlockNumberAndIndex(_blockNumber: BlockNumberOrTag, _uncleIndex: Uint): BlockAPI {\n throw new Error('Method not implemented.')\n }\n\n eth_getUncleCountByBlockHash(_blockHash: HexString32Bytes): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_getUncleCountByBlockNumber(_blockNumber: BlockNumberOrTag): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_getWork(): [HexString32Bytes, HexString32Bytes, HexString32Bytes] {\n throw new Error('Method not implemented.')\n }\n\n eth_hashrate(): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_maxPriorityFeePerGas(): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_mining(): boolean {\n throw new Error('Method not implemented.')\n }\n\n eth_newBlockFilter(): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_newFilter(_filter: Filter): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_newPendingTransactionFilter(): Uint {\n throw new Error('Method not implemented.')\n }\n\n eth_protocolVersion(): string {\n throw new Error('Method not implemented.')\n }\n\n eth_sendRawTransaction(_transaction: HexStringBytes): HexString32Bytes {\n throw new Error('Method not implemented.')\n }\n\n eth_sendTransaction(_transaction: TransactionWithSenderAPI | Partial<TransactionWithSenderAPI>): HexString32Bytes {\n throw new Error('Method not implemented.')\n }\n\n eth_sign(_address: Address, _message: HexStringBytes): HexString256Bytes {\n throw new Error('Method not implemented.')\n }\n\n eth_signTransaction(_transaction: TransactionWithSenderAPI | Partial<TransactionWithSenderAPI>): HexStringBytes | SignedTransactionInfoAPI {\n throw new Error('Method not implemented.')\n }\n\n eth_submitHashrate(_hashRate: HexString32Bytes, _id: HexString32Bytes): boolean {\n throw new Error('Method not implemented.')\n }\n\n eth_submitWork(_nonce: HexString8Bytes, _hash: HexString32Bytes, _digest: HexString32Bytes): boolean {\n throw new Error('Method not implemented.')\n }\n\n eth_subscribe(..._params: ['newHeads'] | ['newPendingTransactions'] | ['syncing'] | ['logs', { address?: HexString; topics?: HexString[] }]): HexString {\n throw new Error('Method not implemented.')\n }\n\n eth_syncing(): SyncingStatusAPI {\n throw new Error('Method not implemented.')\n }\n\n eth_uninstallFilter(_filterIdentifier: Uint): boolean {\n throw new Error('Method not implemented.')\n }\n\n eth_unsubscribe(_subscriptionId: HexString): HexString {\n throw new Error('Method not implemented.')\n }\n}\n", "/**\n * Split an inclusive block range into fixed-size inclusive chunks.\n *\n * @example\n * blockRangeChunks(0, 5000, 2000) // [[0, 1999], [2000, 3999], [4000, 5000]]\n */\nexport function blockRangeChunks(\n fromBlock: number,\n toBlock: number,\n chunkSize: number,\n): [number, number][] {\n if (!Number.isInteger(chunkSize) || chunkSize < 1) {\n throw new TypeError(`chunkSize must be an integer >= 1, got ${chunkSize}`)\n }\n if (!Number.isFinite(fromBlock) || !Number.isFinite(toBlock)) {\n throw new TypeError(`fromBlock and toBlock must be finite numbers, got [${fromBlock}, ${toBlock}]`)\n }\n if (fromBlock > toBlock) {\n return []\n }\n\n const chunks: [number, number][] = []\n for (let start = fromBlock; start <= toBlock; start += chunkSize) {\n const end = Math.min(start + chunkSize - 1, toBlock)\n chunks.push([start, end])\n }\n return chunks\n}\n", "import { assertEx } from '@ariestools/sdk'\nimport type { Provider } from 'ethers'\n\n/** Rough average EVM block time (post-merge Ethereum / Sepolia). */\nexport const DEFAULT_EVM_BLOCK_TIME_SEC = 12\n\n/** Default date used when estimating a deployment / history floor block. */\nexport const DEFAULT_ESTIMATE_BLOCK_DATE = new Date(Date.UTC(2025, 5, 1)) // 2025-06-01\n\n/**\n * Estimate the block number at `targetDate` from a known head, using a constant\n * average block time. Conservative: `Math.ceil` on blocks-back so the estimate\n * tends slightly early.\n */\nexport function estimateBlockNumberFromHead(\n headNumber: number,\n headTimestampSec: number,\n targetDate: Date = DEFAULT_ESTIMATE_BLOCK_DATE,\n avgBlockTimeSec: number = DEFAULT_EVM_BLOCK_TIME_SEC,\n): number {\n const targetTimestampSec = Math.floor(targetDate.getTime() / 1000)\n if (targetTimestampSec >= headTimestampSec) {\n return headNumber\n }\n const blocksBack = Math.ceil((headTimestampSec - targetTimestampSec) / avgBlockTimeSec)\n return Math.max(0, headNumber - blocksBack)\n}\n\n/**\n * Fetch the current head from `provider` and estimate the block number on that\n * chain at `targetDate` (default 2025-06-01 UTC).\n */\nexport async function estimateBlockNumberAt(\n provider: Provider,\n targetDate: Date = DEFAULT_ESTIMATE_BLOCK_DATE,\n avgBlockTimeSec: number = DEFAULT_EVM_BLOCK_TIME_SEC,\n): Promise<number> {\n const head = assertEx(await provider.getBlock('latest'), () => new Error('Failed to get latest eth block'))\n return estimateBlockNumberFromHead(head.number, head.timestamp, targetDate, avgBlockTimeSec)\n}\n", "import { isDefined, isFalsy } from '@ariestools/sdk'\nimport type {\n EthBlockNumber, EthBlockRange, EthBlockRate, TimeDurations,\n} from '@xyo-network/xl1-sdk'\nimport {\n asEthBlockRange, rateMultipliers, timeDurations,\n} from '@xyo-network/xl1-sdk'\nimport type { Block, Provider } from 'ethers/providers'\n\nexport const ethBlockRate = (\n startBlock: Block,\n endBlock: Block,\n timeUnit?: keyof TimeDurations,\n): EthBlockRate => {\n const heightDifference = endBlock.number - startBlock.number\n const timeDifference = endBlock.timestamp - startBlock.timestamp\n\n const rate = heightDifference / timeDifference\n\n const timeUnitValue = isDefined(timeUnit) ? timeUnit : 'millis'\n const returnedTimeDifference = isDefined(timeUnit) ? timeDurations(timeDifference)[timeUnit] : timeDifference\n const timePerBlock = returnedTimeDifference / heightDifference\n\n return {\n range: asEthBlockRange([startBlock.number, endBlock.number], true),\n span: heightDifference,\n rate: isDefined(timeUnit) ? rate * rateMultipliers[timeUnit] : rate,\n timeUnit: timeUnitValue,\n timeDifference: returnedTimeDifference,\n timePerBlock,\n }\n}\n\nexport const getEthBlockRateBlocks = async (\n provider: Provider,\n startBlockHeight: EthBlockNumber,\n endBlockHeight: EthBlockNumber,\n): Promise<{ endingBlock: Block; startingBlock: Block }> => {\n if (endBlockHeight <= startBlockHeight) {\n console.error('startBlockHeight', startBlockHeight)\n console.error('endBlockHeight', endBlockHeight)\n throw new Error('End block height must be greater than start block height')\n }\n\n const startingBlock = await provider.getBlock(startBlockHeight)\n const endingBlock = await provider.getBlock(endBlockHeight)\n\n if (isFalsy(startingBlock) || isFalsy(endingBlock)) {\n throw new Error('Could not retrieve blocks for speed calculation')\n }\n\n return { startingBlock, endingBlock }\n}\n\nexport const calculateEthBlockRate = async (\n provider: Provider,\n range: EthBlockRange,\n timeUnit?: keyof TimeDurations,\n): Promise<EthBlockRate> => {\n const [startBlockHeight, endBlockHeight] = range\n const { startingBlock, endingBlock } = await getEthBlockRateBlocks(\n provider,\n startBlockHeight,\n endBlockHeight,\n )\n return ethBlockRate(startingBlock, endingBlock, timeUnit)\n}\n", "import {\n assertEx, isDefined, isDefinedNotNull,\n} from '@ariestools/sdk'\nimport type {\n EthBlockNumber,\n EthBlockRate,\n SingleTimeConfig,\n TimeDurations,\n} from '@xyo-network/xl1-sdk'\nimport {\n asEthBlockNumber, asEthBlockRange, getTimeConfigInMilliseconds,\n} from '@xyo-network/xl1-sdk'\nimport type { Block, Provider } from 'ethers/providers'\n\nimport { calculateEthBlockRate } from './blockRate.ts'\n\nconst DEFAULT_TOLERANCE_MS = 30_000 // 30 seconds\nconst DEFAULT_MAX_ATTEMPTS = 20\n\nexport const calculateEthTimeRate = async (\n provider: Provider,\n timeConfig: SingleTimeConfig,\n startBlockNumber?: EthBlockNumber,\n timeUnit?: keyof TimeDurations,\n // default tolerance of 30 seconds to cut down on iterations\n toleranceMs = DEFAULT_TOLERANCE_MS,\n // maximum recursive attempts to prevent infinite loops\n maxAttempts = DEFAULT_MAX_ATTEMPTS,\n): Promise<EthBlockRate> => {\n // check the time config has only one key\n assertEx(Object.keys(timeConfig ?? {}).length === 1, () => 'Only one time unit should be specified in timeConfig')\n\n // resolve the starting block\n const startBlock = isDefinedNotNull(startBlockNumber) ? await provider.getBlock(BigInt(startBlockNumber)) : null\n\n // Ensure the start block could be resolved\n assertEx(isDefinedNotNull(startBlockNumber) && isDefinedNotNull(startBlock), () => 'Start block could not be resolved')\n\n const resolvedStartBlock = isDefinedNotNull(startBlock)\n ? startBlock\n : assertEx(await provider.getBlock('latest'))\n\n const timeInMilliseconds = getTimeConfigInMilliseconds(timeConfig)\n assertEx(timeInMilliseconds > 0, () => 'Time duration must be greater than zero')\n\n // Estimate blocks per milliseconds (bpm) based on average block time\n const blocksPerMillisecondRate = 1 / (12 * 1000) // Approximate average block time of 12 seconds\n\n // Calculate the number of blocks in the given time duration\n const initialBlocksInDuration = Math.floor(blocksPerMillisecondRate * timeInMilliseconds)\n\n // Recursively find the proper end block\n const endBlockNumber = await findEndBlockRecursive(\n provider,\n resolvedStartBlock,\n timeInMilliseconds,\n initialBlocksInDuration,\n toleranceMs,\n maxAttempts,\n )\n\n return await calculateEthBlockRate(\n provider,\n asEthBlockRange([endBlockNumber, resolvedStartBlock.number], true),\n timeUnit,\n )\n}\n\nconst findEndBlockRecursive = async (\n provider: Provider,\n startBlock: Block,\n targetTimeMs: number,\n estimatedBlocksBack: number,\n toleranceMs: number,\n attemptsRemaining: number,\n): Promise<EthBlockNumber> => {\n console.log(`Attempts remaining: ${attemptsRemaining}, Estimated blocks back: ${estimatedBlocksBack}`)\n assertEx(attemptsRemaining > 0, () => 'Maximum attempts reached while searching for end block')\n\n const startBlockEpoch = startBlock.timestamp\n const estimatedEndBlockNumber = startBlock.number - estimatedBlocksBack\n\n if (estimatedEndBlockNumber < 0) {\n throw new Error('Estimated end block number is less than zero')\n }\n\n // Fetch the estimated end block\n const endBlock = await provider.getBlock(estimatedEndBlockNumber)\n const resolvedEndBlock = assertEx(\n isDefined(endBlock) ? endBlock : undefined,\n () => `Could not retrieve block ${estimatedEndBlockNumber} for time rate calculation`,\n )\n\n const endBlockEpoch = resolvedEndBlock.timestamp\n const actualTimeDifference = startBlockEpoch - endBlockEpoch\n\n // Check if we're within tolerance\n const timeDelta = Math.abs(actualTimeDifference - targetTimeMs)\n if (timeDelta <= toleranceMs) {\n return asEthBlockNumber(resolvedEndBlock.number, true)\n }\n\n // TODO - in order to support older POW days, we might need to shift away from using adjustmentFactor but do a pure binary search\n // Calculate adjustment factor and recursively search\n let adjustedBlocksBack: number\n if (actualTimeDifference < targetTimeMs) {\n // Need to go further back\n const adjustmentFactor = targetTimeMs / actualTimeDifference\n adjustedBlocksBack = Math.floor(estimatedBlocksBack * adjustmentFactor)\n if (adjustedBlocksBack > startBlock.number) {\n adjustedBlocksBack = startBlock.number / 2\n }\n } else {\n // Need to come forward\n const adjustmentFactor = actualTimeDifference / targetTimeMs\n adjustedBlocksBack = Math.floor(estimatedBlocksBack / adjustmentFactor)\n }\n\n return await findEndBlockRecursive(\n provider,\n startBlock,\n targetTimeMs,\n adjustedBlocksBack,\n toleranceMs,\n attemptsRemaining - 1,\n )\n}\n", "import type {\n Address,\n EthAddress,\n} from '@ariestools/sdk'\nimport {\n toAddress,\n toEthAddress,\n} from '@ariestools/sdk'\nimport type { AccountInstance } from '@xyo-network/sdk'\nimport { PayloadBuilder } from '@xyo-network/sdk'\nimport { type HydratedBlockWithHashMeta, XYO_NETWORK_STAKING_ADDRESS } from '@xyo-network/xl1-sdk'\nimport type { Signer } from 'ethers/providers'\n\nimport { createGenesisBlock } from '#protocol'\n\nimport { createChainContract } from './createChainContract.ts'\nimport { createChainRewardsContract } from './createChainRewardsContract.ts'\nimport type { GasConfig } from './ethereum.ts'\nimport { nextContractAddress } from './nextContractAddress.ts'\n\nexport async function createChain(\n signer: Signer,\n stakingTokenAddress: EthAddress | Address,\n initialBlockProducer: AccountInstance,\n rewardsContractAddress: Address | null,\n genesisBlockRewardAmount: bigint,\n genesisBlockRewardAddress: Address,\n minWithdrawalBlocks: bigint,\n maxStakersPerAddress = 10,\n unlimitedStakingAddress = XYO_NETWORK_STAKING_ADDRESS,\n minStake = 10_000n,\n gas?: GasConfig,\n): Promise<[Address, HydratedBlockWithHashMeta, Address]> {\n const ethStakingTokenAddress = toEthAddress(stakingTokenAddress)\n const rewardContractAddressResolved = rewardsContractAddress ?? (await createChainRewardsContract(signer, genesisBlockRewardAmount, gas))\n const contractAddress = await nextContractAddress(signer)\n const genesisBlock = await createGenesisBlock(\n initialBlockProducer,\n contractAddress,\n genesisBlockRewardAmount,\n genesisBlockRewardAddress,\n )\n const chainId = toAddress(await createChainContract(\n signer,\n ethStakingTokenAddress,\n await PayloadBuilder.hash(genesisBlock[0]),\n rewardContractAddressResolved,\n minWithdrawalBlocks,\n maxStakersPerAddress,\n unlimitedStakingAddress,\n minStake,\n gas,\n ))\n return [chainId, genesisBlock, rewardContractAddressResolved]\n}\n", "import type {\n Address, EthAddress, Hash,\n} from '@ariestools/sdk'\nimport {\n asAddress, assertEx,\n ETH_ZERO_ADDRESS, hexToBigInt, toEthAddress,\n} from '@ariestools/sdk'\nimport { StakedXyoChainV2__factory } from '@xyo-network/typechain'\nimport { XYO_NETWORK_STAKING_ADDRESS } from '@xyo-network/xl1-sdk'\nimport type { Signer } from 'ethers/providers'\n\nimport type { GasConfig } from './ethereum.ts'\n\nexport const createChainContract = async (\n signer: Signer,\n stakingTokenAddress: EthAddress,\n genesisBlockHash: Hash,\n rewardsContractAddress: Address,\n minWithdrawalBlocks: bigint,\n maxStakersPerAddress = 10,\n unlimitedStakingAddress = XYO_NETWORK_STAKING_ADDRESS,\n minStake = 10_000n,\n gas: GasConfig = {},\n): Promise<Address> => {\n try {\n const xyoChainFactory = new StakedXyoChainV2__factory(signer)\n const deployResponse = await xyoChainFactory.deploy(\n ETH_ZERO_ADDRESS, // forkFromChainId\n 0n, // forkFromLastBlockNumber\n hexToBigInt(genesisBlockHash), // forkFromLastHash\n toEthAddress(rewardsContractAddress),\n minWithdrawalBlocks, // min withdraw blocks\n toEthAddress(stakingTokenAddress),\n maxStakersPerAddress,\n toEthAddress(unlimitedStakingAddress),\n minStake,\n gas,\n )\n await deployResponse.waitForDeployment()\n const xyoChainContractAddress = await deployResponse.getAddress()\n return assertEx(asAddress(xyoChainContractAddress), () => 'Invalid staking contract address')\n } catch (ex) {\n console.log(ex)\n throw ex\n }\n}\n", "import type { Address } from '@ariestools/sdk'\nimport {\n asAddress, assertEx, toFixedPoint,\n} from '@ariestools/sdk'\nimport { XyoChainRewards__factory as XyoChainRewardsFactory } from '@xyo-network/typechain'\nimport { parseUnits, type Signer } from 'ethers'\n\nimport type { GasConfig } from './ethereum.ts'\n\nconst gasConfig = () => {\n return {\n gasLimit: 2_000_000, // Set the gas limit\n gasPrice: parseUnits('100', 'gwei'),\n }\n}\n\nexport const createChainRewardsContract = async (\n signer: Signer,\n genesisReward = 0n,\n gas: GasConfig = gasConfig(),\n): Promise<Address> => {\n try {\n const xyoChainRewardsFactory = new XyoChainRewardsFactory(signer)\n const deployResponse = await xyoChainRewardsFactory.deploy(\n toFixedPoint(1000n),\n 1_000_000n,\n 95n,\n 100n,\n toFixedPoint(30n),\n genesisReward,\n 18n,\n gas,\n )\n await deployResponse.waitForDeployment()\n const xyoChainRewardsAddress = await deployResponse.getAddress()\n return assertEx(asAddress(xyoChainRewardsAddress), () => 'Invalid rewards contract address')\n } catch (ex) {\n console.log(ex)\n throw ex\n }\n}\n", "import type { Address } from '@ariestools/sdk'\nimport {\n asAddress, assertEx, toEthAddress,\n} from '@ariestools/sdk'\nimport { getCreateAddress } from 'ethers/address'\nimport type { Provider, Signer } from 'ethers/providers'\n\n/**\n * Predicts the next contract address for a contract that will be deployed\n * @param address The address of the deployer\n * @param provider The provider to use\n * @returns The predicted contract address\n */\nexport const nextContractAddressForAddress = async (address: Address, provider: Provider) => {\n // Get the deployer address\n const deployerAddress = toEthAddress(address)\n\n // Get the next nonce for the deployer account\n const nonce = await provider.getTransactionCount(deployerAddress)\n\n // Predict the next deployed contract contract address\n const contractAddress = getCreateAddress({ from: deployerAddress, nonce })\n\n // Return the predicted contract address\n return assertEx(asAddress(contractAddress), () => 'Unable to convert contract address to address')\n}\n\n/**\n * Predicts the next contract address for a contract that will be deployed\n * @param signer The signer to use when deploying the contract\n * @returns The predicted contract address\n */\nexport const nextContractAddress = async (signer: Signer) => {\n const provider = assertEx(signer.provider, () => 'Unable to obtain provider from signer')\n const address = assertEx(asAddress(await signer.getAddress()), () => 'Unable to obtain address from signer')\n return await nextContractAddressForAddress(address, provider)\n}\n", "import type { EthAddress, Promisable } from '@ariestools/sdk'\nimport {\n assertEx,\n exists, isDefined,\n toAddress, toEthAddress,\n} from '@ariestools/sdk'\nimport {\n type IAddressStakingEvents,\n IAddressStakingEvents__factory,\n type TypedEventLog,\n} from '@xyo-network/typechain'\nimport {\n creatableProvider,\n type StakeEvent, type StakeEventFilter, type StakeEventName,\n type StakeEventsViewer,\n StakeEventsViewerMoniker,\n} from '@xyo-network/xl1-sdk'\nimport { asAttoXL1 } from '@xyo-network/xl1-sdk'\n\nimport { blockRangeChunks } from '../block/blockRangeChunks.ts'\nimport { estimateBlockNumberAt } from '../block/estimateBlockNumberAt.ts'\nimport type { ReturnTypeForOverload } from '../model/index.ts'\nimport type { EvmViewerParams } from '../providers/index.ts'\nimport { AbstractEvmViewer } from '../providers/index.ts'\nimport { withRpcRateLimitBackoff } from '../rpc/withRpcRateLimitBackoff.ts'\nimport { EvmStakeEventZod } from './EvmStakeEventZod.ts'\n\ntype StakeAddedLogEvent = TypedEventLog<ReturnTypeForOverload<IAddressStakingEvents['getEvent'], 'StakeAdded'>>\ntype StakeRemovedLogEvent = TypedEventLog<ReturnTypeForOverload<IAddressStakingEvents['getEvent'], 'StakeRemoved'>>\ntype StakeWithdrawnLogEvent = TypedEventLog<ReturnTypeForOverload<IAddressStakingEvents['getEvent'], 'StakeWithdrawn'>>\ntype StakeLogEvent = StakeAddedLogEvent | StakeRemovedLogEvent | StakeWithdrawnLogEvent\n\n/** Default max blocks per eth_getLogs / queryFilter call (public RPC safe). */\nexport const DEFAULT_EVENT_QUERY_BLOCK_CHUNK_SIZE = 2000\n\n/** Default attempts (including first) when eth_getLogs hits provider rate limits. */\nexport const DEFAULT_EVENT_QUERY_MAX_ATTEMPTS = 8\n\n/** Initial backoff after a rate-limit response before retrying eth_getLogs. */\nexport const DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS = 1000\n\nexport interface EvmStakeEventsParams extends EvmViewerParams {\n /**\n * Max blocks per eth_getLogs / queryFilter call when loading historical stake events.\n * Defaults to {@link DEFAULT_EVENT_QUERY_BLOCK_CHUNK_SIZE}.\n */\n eventQueryBlockChunkSize?: number\n /**\n * Initial delay (ms) after a rate-limit response before retrying eth_getLogs.\n * Defaults to {@link DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS}.\n */\n eventQueryInitialDelayMs?: number\n /**\n * Total eth_getLogs attempts per chunk (including the first) when rate limited.\n * Defaults to {@link DEFAULT_EVENT_QUERY_MAX_ATTEMPTS}.\n */\n eventQueryMaxAttempts?: number\n}\n\n@creatableProvider()\nexport class EvmStakeEventsViewer extends AbstractEvmViewer<EvmStakeEventsParams, IAddressStakingEvents> implements StakeEventsViewer {\n static readonly connectionTypes = ['evm-rpc'] as const\n static readonly defaultMoniker = StakeEventsViewerMoniker\n static readonly dependencies = []\n static readonly monikers = [StakeEventsViewerMoniker]\n static readonly surface = 'node' as const\n moniker = EvmStakeEventsViewer.defaultMoniker\n\n /** Set at start when `params.deploymentBlock` is omitted (estimated 2025-06-01). */\n private defaultDeploymentBlock = 0\n\n private eventCache = new Map<string, StakeEvent>()\n\n get deploymentBlock() {\n return this.params.deploymentBlock ?? this.defaultDeploymentBlock\n }\n\n get eventQueryBlockChunkSize() {\n return this.params.eventQueryBlockChunkSize ?? DEFAULT_EVENT_QUERY_BLOCK_CHUNK_SIZE\n }\n\n get eventQueryInitialDelayMs() {\n return this.params.eventQueryInitialDelayMs ?? DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS\n }\n\n get eventQueryMaxAttempts() {\n return this.params.eventQueryMaxAttempts ?? DEFAULT_EVENT_QUERY_MAX_ATTEMPTS\n }\n\n async positionCount(range: [number, number | 'latest']): Promise<number> {\n const events = await this.stakeEvents(range)\n const positionIds = events.map(e => e.args.id)\n return Math.max(-1, ...positionIds) + 1\n }\n\n stakeEvents<TName extends StakeEventName>(\n range: [number, number | 'latest'] = [0, 'latest'],\n filter?: StakeEventFilter<TName>,\n ): Promisable<StakeEvent<TName>[]> {\n const allEvents = this.eventCache.values().toArray()\n\n // eslint-disable-next-line complexity\n const result = allEvents.filter((e) => {\n if ((range[1] !== 'latest') && (e.time > range[1])) {\n return false\n }\n if (e.time < range[0]) {\n return false\n }\n if (isDefined(filter?.name) && (e.name !== filter.name)) {\n return false\n }\n if (isDefined(filter?.args?.id) && (e.args.id !== filter.args.id)) {\n return false\n }\n if (isDefined(filter?.args?.staked) && (e.args.staked !== filter.args.staked)) {\n return false\n }\n if (isDefined(filter?.args?.staker) && (e.args.staker !== filter.args.staker)) {\n return false\n }\n return true\n }) as StakeEvent<TName>[]\n return result\n }\n\n protected override connectContract(address: EthAddress) {\n return IAddressStakingEvents__factory.connect(address, this.params.provider)\n }\n\n protected onEventHandler(staked: string, staker: string, id: bigint, amount: bigint, event: StakeLogEvent, throwOnInvalid = false): StakeEvent | undefined {\n const validatedEventResult = EvmStakeEventZod.safeParse(event)\n\n if (validatedEventResult.error) {\n this.logger?.warn(`Received invalid stake event [${event.eventName}/${event.blockNumber}], ignoring...`)\n this.logger?.warn(` - ${validatedEventResult.error.message}`)\n if (throwOnInvalid) {\n throw new Error(`Invalid stake event: ${validatedEventResult.error.message}`)\n }\n return\n }\n\n const validatedEvent = validatedEventResult.data\n const { eventName, blockNumber } = validatedEvent\n\n const cacheKey = `${Number(id)}|${eventName}|${staker}`\n const stakeEvent = {\n name: eventName,\n args: {\n id: Number(id),\n staked: toAddress(staked),\n staker: toAddress(staker),\n amount: asAttoXL1(amount),\n },\n time: blockNumber,\n } satisfies StakeEvent\n\n // Idempotent overwrite (history + live + tail catch-up may re-deliver the same key).\n this.eventCache.set(cacheKey, stakeEvent)\n return stakeEvent\n }\n\n protected override async startHandler() {\n try {\n const provider = assertEx(this.contract.runner?.provider, () => new Error('Failed to get provider'))\n const historyEndBlock = assertEx(await provider.getBlockNumber(), () => new Error('Failed to get currentEthBlock'))\n if (!isDefined(this.params.deploymentBlock)) {\n this.defaultDeploymentBlock = await estimateBlockNumberAt(provider)\n }\n\n // Load history before attaching live listeners to shrink the double-apply window.\n await this.loadHistoricalEvents(this.deploymentBlock, historyEndBlock)\n await this.attachLiveListeners()\n\n // Close the gap for blocks produced while history was loading / listeners attaching.\n const latestBlock = assertEx(await provider.getBlockNumber(), () => new Error('Failed to get latestEthBlock'))\n if (latestBlock > historyEndBlock) {\n await this.loadHistoricalEvents(historyEndBlock + 1, latestBlock)\n }\n } catch (error) {\n this.logger?.error('EthereumChainStakeEvents failed to start:', error)\n throw error\n }\n }\n\n private async attachLiveListeners() {\n await this.contract.on(this.contract.getEvent('StakeAdded'), (staked, staker, id, amount, event) => {\n this.onEventHandler(staked, staker, id, amount, event)\n })\n await this.contract.on(this.contract.getEvent('StakeRemoved'), (staked, staker, id, amount, event) => {\n this.onEventHandler(staked, staker, id, amount, event)\n })\n await this.contract.on(this.contract.getEvent('StakeWithdrawn'), (staked, staker, id, amount, event) => {\n this.onEventHandler(staked, staker, id, amount, event)\n })\n }\n\n private async loadHistoricalEvents(fromBlock: number, toBlock: number) {\n if (fromBlock > toBlock) {\n return\n }\n\n const stakeEventGroups = await Promise.all([\n this.stakeEventsNative([fromBlock, toBlock], { name: 'StakeAdded' }),\n this.stakeEventsNative([fromBlock, toBlock], { name: 'StakeRemoved' }),\n this.stakeEventsNative([fromBlock, toBlock], { name: 'StakeWithdrawn' }),\n ])\n const allStakeEvents = stakeEventGroups.flat().toSorted((a, b) => a.time - b.time)\n const chunks = blockRangeChunks(fromBlock, toBlock, this.eventQueryBlockChunkSize)\n\n this.logger?.log(\n `Cached ${allStakeEvents.length} stake events from blocks ${fromBlock}-${toBlock} `\n + `(${chunks.length} chunk(s) of up to ${this.eventQueryBlockChunkSize} blocks)`,\n )\n\n for (const event of allStakeEvents) {\n this.eventCache.set(`${Number(event.args.id)}|${event.name}|${event.args.staker}`, event)\n }\n }\n\n private async stakeEventsNative(\n range: [number, number | 'latest'] = [0, 'latest'],\n filter?: StakeEventFilter<StakeEvent['name']>,\n ): Promise<StakeEvent[]> {\n const name = filter?.name\n if (!isDefined(name)) {\n throw new Error('Only filtered stake events (by name) are supported')\n }\n\n const stakedFilter = filter?.args?.staked\n const stakerFilter = filter?.args?.staker\n const stakedFilterEth = isDefined(stakedFilter) ? toEthAddress(stakedFilter) : undefined\n const stakerFilterEth = isDefined(stakerFilter) ? toEthAddress(stakerFilter) : undefined\n const ethFilter = this.contract.filters[name](stakedFilterEth, stakerFilterEth)\n\n const fromBlock = range[0]\n const toBlock = range[1] === 'latest'\n ? assertEx(await this.contract.runner?.provider?.getBlockNumber(), () => new Error('Failed to resolve latest block'))\n : range[1]\n\n if (fromBlock > toBlock) {\n return []\n }\n\n const chunkSize = this.eventQueryBlockChunkSize\n const chunks = blockRangeChunks(fromBlock, toBlock, chunkSize)\n const ethEventGroups = []\n\n for (const [chunkFrom, chunkTo] of chunks) {\n try {\n // Inline (not a helper) so queryFilter keeps its precise event log types.\n ethEventGroups.push(await withRpcRateLimitBackoff(\n () => this.contract.queryFilter(ethFilter, chunkFrom, chunkTo),\n {\n initialDelayMs: this.eventQueryInitialDelayMs,\n maxAttempts: this.eventQueryMaxAttempts,\n onRetry: (_error, attempt, delayMs) => {\n this.logger?.warn(\n `Rate limited fetching ${name} logs for blocks ${chunkFrom}-${chunkTo} `\n + `(attempt ${attempt}/${this.eventQueryMaxAttempts}); backing off ${delayMs}ms`,\n )\n },\n },\n ))\n } catch (error) {\n this.logger?.error(\n `eth_getLogs failed for ${name} blocks ${chunkFrom}-${chunkTo} `\n + `after rate-limit retries (from=${fromBlock} to=${toBlock}):`,\n error,\n )\n throw error\n }\n }\n\n const ethEvents = ethEventGroups.flat()\n\n return ethEvents.map((e) => {\n assertEx(e.eventName === name, () => `Event name mismatch expected '${name}' but got '${e.eventName}'`)\n return this.onEventHandler(e.args.staked, e.args.by, e.args.id, e.args.amount, e, true)\n }).filter(exists)\n }\n}\n", "import { type EthAddress, toEthAddress } from '@ariestools/sdk'\nimport type { CreatableProviderParams } from '@xyo-network/xl1-sdk'\nimport { AbstractCreatableProvider } from '@xyo-network/xl1-sdk'\nimport type { BaseContract } from 'ethers'\n\nexport interface EvmProviderParams extends CreatableProviderParams {\n address: EthAddress\n deploymentBlock?: number\n}\n\nexport abstract class AbstractEvmProvider<TParams extends EvmProviderParams, TContract extends BaseContract> extends\n AbstractCreatableProvider<TParams> {\n protected _contract!: TContract\n\n protected get contract() {\n return this._contract\n }\n\n override async createHandler() {\n await super.createHandler()\n this._contract = this.connectContract(toEthAddress(this.params.address))\n }\n\n protected abstract connectContract(address: EthAddress): TContract\n}\n", "import { assertEx } from '@ariestools/sdk'\nimport type { BaseContract, ContractRunner } from 'ethers'\n\nimport type { EvmViewerParams } from './AbstractEvmViewer.ts'\nimport { AbstractEvmViewer } from './AbstractEvmViewer.ts'\n\nexport interface EvmRunnerParams extends EvmViewerParams {\n runner: ContractRunner\n}\n\nexport abstract class AbstractEvmRunner<TParams extends EvmRunnerParams = EvmRunnerParams,\n TContract extends BaseContract = BaseContract> extends\n AbstractEvmViewer<TParams, TContract> {\n static override async paramsHandler<T extends AbstractEvmRunner>(params: Partial<T['params']>): Promise<T['params']> {\n const runner = assertEx(params?.runner, () => new Error('No runner defined'))\n const provider = assertEx(runner.provider, () => new Error('Runner must have a provider defined'))\n return { ...(await super.paramsHandler({ ...params, provider })), runner }\n }\n}\n", "import type { BaseContract, Provider } from 'ethers'\n\nimport { AbstractEvmProvider, type EvmProviderParams } from './AbstractEvmProvider.ts'\n\nexport interface EvmViewerParams extends EvmProviderParams {\n provider: Provider\n}\n\nexport abstract class AbstractEvmViewer<TParams extends EvmViewerParams, TContract extends BaseContract> extends\n AbstractEvmProvider<TParams, TContract> {}\n", "import type {\n Address, EthAddress, Hash,\n} from '@ariestools/sdk'\nimport {\n asHash, assertEx, toAddress, toEthAddress, toHex,\n} from '@ariestools/sdk'\nimport type { IStakedXyoChain } from '@xyo-network/typechain'\nimport { IStakedXyoChain__factory } from '@xyo-network/typechain'\nimport type { ChainContractViewer, XL1BlockNumber } from '@xyo-network/xl1-sdk'\nimport {\n ChainContractViewerMoniker, creatableProvider, toXL1BlockNumber, withContextCacheResponse,\n} from '@xyo-network/xl1-sdk'\n\nimport type { EvmViewerParams } from './AbstractEvmViewer.ts'\nimport { AbstractEvmViewer } from './AbstractEvmViewer.ts'\n\nexport interface EvmChainContractViewerParams extends EvmViewerParams {}\n\n/**\n * A class that represents a chain stake as backed by an EVM smart contract\n */\n@creatableProvider()\nexport class EvmChainContractViewer extends AbstractEvmViewer<EvmChainContractViewerParams, IStakedXyoChain> implements ChainContractViewer {\n static readonly connectionTypes = ['evm-rpc'] as const\n static readonly defaultMoniker = ChainContractViewerMoniker\n static readonly dependencies = []\n static readonly monikers = [ChainContractViewerMoniker]\n static readonly surface = 'node' as const\n override moniker = EvmChainContractViewer.defaultMoniker\n\n private _forkedAtBlockNumber?: Promise<XL1BlockNumber | null>\n private _forkedAtHash?: Promise<Hash>\n private _forkedChainContractViewer?: Promise<ChainContractViewer>\n private _forkedChainId?: Promise<Address>\n private _minWithdrawalBlocks?: Promise<number>\n private _rewardsContract?: Promise<Address>\n private _stakingTokenAddress?: Promise<Address>\n\n get address() {\n return this.params.address\n }\n\n chainId() {\n return toHex(this.params.address, { prefix: false })\n }\n\n async chainIdAtBlockNumber(blockNumber: XL1BlockNumber) {\n return await withContextCacheResponse(this.context, 'chainIdAtBlockNumber', String(blockNumber), async () => {\n let chainId = this.chainId()\n // eslint-disable-next-line unicorn/no-this-assignment, @typescript-eslint/no-this-alias\n let contractViewer: ChainContractViewer = this\n let forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber()\n while (forkedAtBlockNumber !== null && blockNumber <= forkedAtBlockNumber) {\n contractViewer = assertEx(await contractViewer.forkedChainContractViewer(), () => 'Forked chain contract viewer is undefined')\n forkedAtBlockNumber = await contractViewer.forkedAtBlockNumber()\n chainId = await contractViewer.chainId()\n }\n return chainId\n })\n }\n\n async forkedAtBlockNumber() {\n const contractAddress = this.contract.getAddress()\n try {\n this._forkedAtBlockNumber = this._forkedAtBlockNumber ?? (async () => toXL1BlockNumber(await (this.contract).forkedAtBlockNumber(), true))()\n return await this._forkedAtBlockNumber\n } catch {\n this.logger?.warn('Failed to fetch forkedAtBlockNumber, returning null', contractAddress)\n this._forkedAtBlockNumber = Promise.resolve(null)\n return await this._forkedAtBlockNumber\n }\n }\n\n async forkedAtHash() {\n this._forkedAtHash = this._forkedAtHash ?? (async () => asHash(toHex(await (this.contract).forkedAtHash()), true))()\n return await this._forkedAtHash\n }\n\n async forkedChainContractViewer(): Promise<ChainContractViewer> {\n this._forkedChainContractViewer = this._forkedChainContractViewer ?? (async () => {\n const address = await this.forkedChainId()\n return EvmChainContractViewer.create({ ...this.params, address: toEthAddress(address) })\n })()\n return await this._forkedChainContractViewer\n }\n\n async forkedChainId(): Promise<Address> {\n this._forkedChainId = this._forkedChainId ?? (async () => {\n return toAddress(await (this.contract).forkedChainId())\n })()\n return await this._forkedChainId\n }\n\n async minWithdrawalBlocks(): Promise<number> {\n this._minWithdrawalBlocks = this._minWithdrawalBlocks ?? (async () => Number(await (this.contract).minWithdrawalBlocks()))()\n return await this._minWithdrawalBlocks\n }\n\n async rewardsContract(): Promise<Address> {\n this._rewardsContract = this._rewardsContract ?? (async () => {\n return toAddress(await (this.contract).rewardsContract())\n })()\n return await this._rewardsContract\n }\n\n async stakingTokenAddress(): Promise<Address> {\n this._stakingTokenAddress = this._stakingTokenAddress ?? (async () => {\n return toAddress(await (this.contract).stakingTokenAddress())\n })()\n return await this._stakingTokenAddress\n }\n\n protected override connectContract(address: EthAddress) {\n return IStakedXyoChain__factory.connect(address, this.params.provider)\n }\n}\n", "import type { Address, EthAddress } from '@ariestools/sdk'\nimport { toEthAddress } from '@ariestools/sdk'\nimport type { IStakedXyoChain } from '@xyo-network/typechain'\nimport { IStakedXyoChain__factory } from '@xyo-network/typechain'\nimport type { StakeRunner } from '@xyo-network/xl1-sdk'\nimport {\n creatableProvider,\n StakeRunnerMoniker,\n} from '@xyo-network/xl1-sdk'\nimport { getAddress } from 'ethers/address'\n\nimport type { EvmRunnerParams } from './AbstractEvmRunner.ts'\nimport { AbstractEvmRunner } from './AbstractEvmRunner.ts'\n\nexport interface EvmStakeRunnerParams extends EvmRunnerParams {}\n\n@creatableProvider()\nexport class EvmStakeRunner extends AbstractEvmRunner<EvmStakeRunnerParams, IStakedXyoChain> implements StakeRunner {\n static readonly connectionTypes = ['evm-rpc'] as const\n static readonly defaultMoniker = StakeRunnerMoniker\n static readonly dependencies = []\n static readonly monikers = [StakeRunnerMoniker]\n static readonly surface = 'node' as const\n override moniker = EvmStakeRunner.defaultMoniker\n\n async addStake(staked: Address, amount: bigint): Promise<boolean> {\n const result = await (this.contract).addStake(getAddress(toEthAddress(staked)), amount)\n await result.wait()\n return true\n }\n\n async removeStake(slot: bigint): Promise<boolean> {\n const result = await (this.contract).removeStake(slot)\n await result.wait()\n return true\n }\n\n async withdrawStake(slot: bigint): Promise<boolean> {\n const result = await (this.contract).withdrawStake(slot)\n await result.wait()\n return true\n }\n\n protected override connectContract(address: EthAddress) {\n return IStakedXyoChain__factory.connect(address, this.params.runner)\n }\n}\n", "import type { Address, EthAddress } from '@ariestools/sdk'\nimport { toEthAddress } from '@ariestools/sdk'\nimport type { IStakedXyoChain } from '@xyo-network/typechain'\nimport { IStakedXyoChain__factory } from '@xyo-network/typechain'\nimport type { StakeTotalsViewer } from '@xyo-network/xl1-sdk'\nimport {\n creatableProvider,\n StakeTotalsViewerMoniker,\n} from '@xyo-network/xl1-sdk'\nimport { getAddress } from 'ethers/address'\n\nimport type { EvmViewerParams } from './AbstractEvmViewer.ts'\nimport { AbstractEvmViewer } from './AbstractEvmViewer.ts'\n\nexport interface EvmChainStakeViewerParams extends EvmViewerParams {}\n\n/**\n * A class that represents a chain stake as backed by an EVM smart contract\n */\n@creatableProvider()\nexport class EvmStakeTotalsViewer extends AbstractEvmViewer<EvmChainStakeViewerParams, IStakedXyoChain> implements StakeTotalsViewer {\n static readonly connectionTypes = ['evm-rpc'] as const\n static readonly defaultMoniker = StakeTotalsViewerMoniker\n static readonly dependencies = []\n static readonly monikers = [StakeTotalsViewerMoniker]\n static readonly surface = 'node' as const\n override moniker = EvmStakeTotalsViewer.defaultMoniker\n\n async active(): Promise<bigint> {\n return await (this.contract).active()\n }\n\n async activeByStaked(staked: Address): Promise<bigint> {\n return await (this.contract).activeByAddressStaked(getAddress(toEthAddress(staked)))\n }\n\n async activeByStaker(address: Address): Promise<bigint> {\n return await (this.contract).activeByStaker(getAddress(toEthAddress(address)))\n }\n\n async pending(): Promise<bigint> {\n return await (this.contract).pending()\n }\n\n async pendingByStaker(staker: Address): Promise<bigint> {\n return await (this.contract).pendingByStaker(getAddress(toEthAddress(staker)))\n }\n\n async withdrawn(): Promise<bigint> {\n return await (this.contract).withdrawn()\n }\n\n async withdrawnByStaker(staker: string): Promise<bigint> {\n return await (this.contract).withdrawnByStaker(getAddress(staker))\n }\n\n protected override connectContract(address: EthAddress) {\n return IStakedXyoChain__factory.connect(address, this.params.provider)\n }\n}\n", "import { delay } from '@ariestools/sdk'\n\nimport { isRpcRateLimitError } from './isRpcRateLimitError.ts'\n\nexport interface RpcRateLimitBackoffOptions {\n /** Multiplier applied to delay after each rate-limit hit. Default 2. */\n backoff?: number\n /** Initial wait before the first retry. Default 1000ms. */\n initialDelayMs?: number\n /** Total attempts including the first try. Default 8. */\n maxAttempts?: number\n /** Cap on wait between retries. Default 30_000ms. */\n maxDelayMs?: number\n /** Optional hook when a rate-limit triggers a backoff sleep. */\n onRetry?: (error: unknown, attempt: number, delayMs: number) => void\n}\n\n/**\n * Run an async RPC call, retrying with exponential backoff when the provider\n * reports rate limiting (e.g. Infura `-32005` / \"Too Many Requests\").\n * Non-rate-limit errors are rethrown immediately.\n */\nexport async function withRpcRateLimitBackoff<T>(\n fn: () => Promise<T>,\n options: RpcRateLimitBackoffOptions = {},\n): Promise<T> {\n const {\n backoff = 2,\n initialDelayMs = 1000,\n maxAttempts = 8,\n maxDelayMs = 30_000,\n onRetry,\n } = options\n\n if (!Number.isInteger(maxAttempts) || maxAttempts < 1) {\n throw new TypeError(`maxAttempts must be an integer >= 1, got ${maxAttempts}`)\n }\n\n let delayMs = initialDelayMs\n let lastError: unknown\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn()\n } catch (error) {\n lastError = error\n const isLastAttempt = attempt >= maxAttempts\n if (!isRpcRateLimitError(error) || isLastAttempt) {\n throw error\n }\n const waitMs = Math.min(delayMs, maxDelayMs)\n onRetry?.(error, attempt, waitMs)\n await delay(waitMs)\n delayMs = Math.min(delayMs * backoff, maxDelayMs)\n }\n }\n\n throw lastError\n}\n", "/**\n * Detect Infura / Alchemy / generic JSON-RPC rate-limit and overload responses.\n * Walks nested ethers error wrappers (`error`, `info`, `value`, `data`).\n */\nexport function isRpcRateLimitError(error: unknown): boolean {\n const seen = new Set<unknown>()\n const queue: unknown[] = [error]\n\n while (queue.length > 0) {\n const current = queue.pop()\n if (current === undefined || current === null || seen.has(current)) {\n continue\n }\n seen.add(current)\n\n if (typeof current === 'string') {\n if (matchesRateLimitText(current)) {\n return true\n }\n continue\n }\n\n if (typeof current === 'number') {\n if (isRateLimitCode(current)) {\n return true\n }\n continue\n }\n\n if (typeof current !== 'object') {\n continue\n }\n\n if (Array.isArray(current)) {\n const items: unknown[] = current\n queue.push(...items)\n continue\n }\n\n const record = current as Record<string, unknown>\n for (const key of ['code', 'message', 'shortMessage', 'reason', 'status', 'statusCode'] as const) {\n if (key in record) {\n queue.push(record[key])\n }\n }\n for (const key of ['error', 'info', 'data', 'value', 'body', 'payload'] as const) {\n if (key in record) {\n queue.push(record[key])\n }\n }\n }\n\n return false\n}\n\nfunction isRateLimitCode(code: number): boolean {\n // HTTP 429, Infura/common JSON-RPC overload codes\n return code === 429 || code === -32_005 || code === -32_016\n}\n\nfunction matchesRateLimitText(text: string): boolean {\n const normalized = text.toLowerCase()\n return normalized.includes('too many requests')\n || normalized.includes('rate limit')\n || normalized.includes('rate exceeded')\n || normalized.includes('call rate limit')\n || normalized.includes('exceeded the quota')\n}\n", "import {\n EthAddressZod, HexRegExMinMaxMixedCaseWithPrefix,\n zodAsFactory, zodIsFactory, zodToFactory,\n} from '@ariestools/sdk'\nimport { z } from 'zod/mini'\n\nexport const EthHashRegEx = HexRegExMinMaxMixedCaseWithPrefix(32, 32)\n\nexport const EthHashZod = z.string().check(z.regex(EthHashRegEx, { error: 'Invalid address format' }))\n\nexport const EvmStakeAddedEventNameZod = z.literal('StakeAdded')\nexport const EvmStakeRemovedEventNameZod = z.literal('StakeRemoved')\nexport const EvmStakeWithdrawnEventNameZod = z.literal('StakeWithdrawn')\n\nexport const EvmStakeEventNameZod = z.union([\n EvmStakeAddedEventNameZod,\n EvmStakeRemovedEventNameZod,\n EvmStakeWithdrawnEventNameZod,\n])\n\nexport const EvmStakeEventArgsZod = z.tuple([\n EthAddressZod, // staker\n EthAddressZod, // staked\n z.bigint(), // id\n z.bigint(), // amount\n])\n\nexport const EvmStakeEventZod = z.object({\n address: EthAddressZod,\n args: EvmStakeEventArgsZod,\n blockHash: EthHashZod,\n blockNumber: z.number(),\n eventName: EvmStakeEventNameZod,\n transactionHash: EthHashZod,\n transactionIndex: z.number(),\n})\nexport type EvmStakeEvent = z.infer<typeof EvmStakeEventZod>\n\nexport const isEvmStakeEvent = zodIsFactory(EvmStakeEventZod)\nexport const asEvmStakeEvent = zodAsFactory(EvmStakeEventZod, 'asEvmStakeEvent')\nexport const toEvmStakeEvent = zodToFactory(EvmStakeEventZod, 'toEvmStakeEvent')\n\nexport const EvmStakeAddedEventZod = z.extend(EvmStakeEventZod, { eventName: EvmStakeAddedEventNameZod })\nexport type EvmStakeAddedEvent = z.infer<typeof EvmStakeAddedEventZod>\n\nexport const isEvmStakeAddedEvent = zodIsFactory(EvmStakeAddedEventZod)\nexport const asEvmStakeAddedEvent = zodAsFactory(EvmStakeAddedEventZod, 'asEvmStakeAddedEvent')\nexport const toEvmStakeAddedEvent = zodToFactory(EvmStakeAddedEventZod, 'toEvmStakeAddedEvent')\n\nexport const EvmStakeRemovedEventZod = z.extend(EvmStakeEventZod, { eventName: EvmStakeRemovedEventNameZod })\nexport type EvmStakeRemovedEvent = z.infer<typeof EvmStakeRemovedEventZod>\n\nexport const isEvmStakeRemovedEvent = zodIsFactory(EvmStakeRemovedEventZod)\nexport const asEvmStakeRemovedEvent = zodAsFactory(EvmStakeRemovedEventZod, 'asEvmStakeRemovedEvent')\nexport const toEvmStakeRemovedEvent = zodToFactory(EvmStakeRemovedEventZod, 'toEvmStakeRemovedEvent')\n\nexport const EvmStakeWithdrawnEventZod = z.extend(EvmStakeEventZod, { eventName: EvmStakeWithdrawnEventNameZod })\nexport type EvmStakeWithdrawnEvent = z.infer<typeof EvmStakeWithdrawnEventZod>\n\nexport const isEvmStakeWithdrawnEvent = zodIsFactory(EvmStakeWithdrawnEventZod)\nexport const asEvmStakeWithdrawnEvent = zodAsFactory(EvmStakeWithdrawnEventZod, 'asEvmStakeWithdrawnEvent')\nexport const toEvmStakeWithdrawnEvent = zodToFactory(EvmStakeWithdrawnEventZod, 'toEvmStakeWithdrawnEvent')\n", "import type {\n Address, EthAddress, Promisable,\n} from '@ariestools/sdk'\nimport {\n assertEx, isDefined, toAddress,\n toEthAddress,\n} from '@ariestools/sdk'\nimport { type IAddressStaking, IAddressStaking__factory } from '@xyo-network/typechain'\nimport {\n creatableProvider,\n type Position, type PositionId,\n type StakeEvent,\n type StakeEventsViewer,\n StakeEventsViewerMoniker,\n type StakeViewer,\n StakeViewerMoniker,\n} from '@xyo-network/xl1-sdk'\nimport { asAttoXL1 } from '@xyo-network/xl1-sdk'\nimport { Mutex } from 'async-mutex'\n\nimport { estimateBlockNumberAt } from '../block/estimateBlockNumberAt.ts'\nimport type { EvmViewerParams } from '../providers/index.ts'\nimport { AbstractEvmViewer } from '../providers/index.ts'\n\nconst ethStakeToStake = (ethStake: Awaited<ReturnType<IAddressStaking['getStakeById']>>): Position => {\n const stake = {\n id: Number(ethStake.id) as PositionId,\n staked: toAddress(ethStake.staked),\n staker: toAddress(ethStake.staker),\n amount: asAttoXL1(ethStake.amount),\n addBlock: Number(ethStake.addBlock),\n removeBlock: Number(ethStake.removeBlock),\n withdrawBlock: Number(ethStake.withdrawBlock),\n } satisfies Position\n return stake\n}\n\nexport interface EvmStakeViewerParams extends EvmViewerParams {\n\n}\n\n@creatableProvider()\nexport class EvmStakeViewer extends AbstractEvmViewer<EvmStakeViewerParams, IAddressStaking> implements StakeViewer {\n static readonly connectionTypes = ['evm-rpc'] as const\n static readonly defaultMoniker = StakeViewerMoniker\n static readonly dependencies = []\n static readonly monikers = [StakeViewerMoniker]\n static readonly surface = 'node' as const\n readonly moniker = EvmStakeViewer.defaultMoniker\n\n private _callMutex = new Mutex()\n private _deploymentBlock = 0\n\n private _stakeCache = new Map<number, Position>()\n private _stakeEventsViewer!: StakeEventsViewer\n\n get stakeEvents() {\n return this._stakeEventsViewer\n }\n\n async active(): Promise<bigint> {\n return await this._callMutex.runExclusive(async () => {\n return await this.contract.active()\n })\n }\n\n async activeByAddressStaked(address: Address): Promise<bigint> {\n return await this._callMutex.runExclusive(async () => {\n return await this.contract.activeByAddressStaked(toEthAddress(address))\n })\n }\n\n async activeByStaker(address: Address): Promise<bigint> {\n return await this._callMutex.runExclusive(async () => {\n return await this.contract.activeByStaker(toEthAddress(address))\n })\n }\n\n activeStakes(): Promisable<Position[]> {\n return this._stakeCache.values().filter(stake => stake.removeBlock === 0 && stake.withdrawBlock === 0).toArray()\n }\n\n override async createHandler(): Promise<void> {\n await super.createHandler()\n this._stakeEventsViewer = await this.locator.getInstance<StakeEventsViewer>(StakeEventsViewerMoniker)\n this._deploymentBlock = isDefined(this.params.deploymentBlock)\n ? this.params.deploymentBlock\n : await estimateBlockNumberAt(this.params.provider)\n }\n\n minWithdrawalBlocks(): number {\n return 0\n }\n\n async pending(): Promise<bigint> {\n return await this._callMutex.runExclusive(async () => {\n return await this.contract.pending()\n })\n }\n\n async pendingByStaker(staker: Address): Promise<bigint> {\n return await this._callMutex.runExclusive(async () => {\n return await this.contract.pendingByStaker(toEthAddress(staker))\n })\n }\n\n removedStakes(): Promisable<Position[]> {\n return this._stakeCache.values().filter(stake => stake.removeBlock !== 0 && stake.withdrawBlock === 0).toArray()\n }\n\n rewardsContract(): Address {\n return toAddress('0x000000000000000000000000000000')\n }\n\n async stakeById(id: number): Promise<Position> {\n return await this._callMutex.runExclusive(async () => {\n const startTime = Date.now()\n const cachedStake = this._stakeCache.get(id)\n if (cachedStake) {\n return cachedStake\n }\n const ethResult = await this.contract.getStakeById(id)\n const stake = ethStakeToStake(ethResult)\n this._stakeCache.set(stake.id, stake)\n this.logger?.log(`EthereumChainStake: stakeById(${id}) took ${Date.now() - startTime}ms`)\n return stake\n })\n }\n\n async stakeByStaker(staker: Address, slot: number): Promise<Position> {\n return await this._callMutex.runExclusive(async () => {\n const ethResult = await this.contract.getStake(toEthAddress(staker), slot)\n const stake = ethStakeToStake(ethResult)\n this._stakeCache.set(stake.id, stake)\n return stake\n })\n }\n\n async stakesByStaked(staked: Address, range: [number, number | undefined] = [0, undefined]): Promise<Position[]> {\n const events = await this.stakeEvents.stakeEvents([Math.max(\n range[0],\n this._deploymentBlock,\n ), range.at(1) ?? 'latest'], { name: 'StakeAdded', args: { staked } })\n\n const result: Position[] = []\n for (const event of events) {\n if (toAddress(event.args.staked) === toAddress(staked)) {\n result.push(await this.stakeById(event.args.id))\n }\n }\n return result\n }\n\n async stakesByStaker(staker: Address, range: [number, number | undefined] = [0, undefined]): Promise<Position[]> {\n const events = await this.stakeEvents.stakeEvents([Math.max(\n range[0],\n this._deploymentBlock,\n ), range.at(1) ?? 'latest'], { name: 'StakeAdded', args: { staker } })\n const result: Position[] = []\n for (const event of events) {\n if (toAddress(event.args.staker) === toAddress(staker)) {\n result.push(await this.stakeById(event.args.id))\n }\n }\n return result\n }\n\n stakingTokenAddress(): Address {\n return toAddress('0x000000000000000000000000000011')\n }\n\n async withdrawn(): Promise<bigint> {\n return await this._callMutex.runExclusive(async () => {\n return await this.contract.withdrawn()\n })\n }\n\n async withdrawnByStaker(staker: Address): Promise<bigint> {\n return await this._callMutex.runExclusive(async () => {\n return await this.contract.withdrawnByStaker(toEthAddress(staker))\n })\n }\n\n withdrawnStakes(): Promisable<Position[]> {\n return this._stakeCache.values().filter(stake => stake.removeBlock !== 0 && stake.withdrawBlock !== 0).toArray()\n }\n\n protected override connectContract(address: EthAddress) {\n return IAddressStaking__factory.connect(address, this.params.provider)\n }\n\n protected override async startHandler() {\n await this.contract.on(this.contract.getEvent('StakeAdded'), (staked, staker, id, amount, event) => {\n this._stakeCache.set(Number(id), {\n id: Number(id) as PositionId,\n staked: toAddress(staked),\n staker: toAddress(staker),\n amount: asAttoXL1(amount),\n addBlock: event.blockNumber,\n removeBlock: 0,\n withdrawBlock: 0,\n })\n })\n await this.contract.on(this.contract.getEvent('StakeRemoved'), (staked, staker, id, amount, event) => {\n const stake = assertEx(this._stakeCache.get(Number(id)))\n this._stakeCache.set(Number(id), {\n ...stake,\n removeBlock: event.blockNumber,\n })\n })\n await this.contract.on(this.contract.getEvent('StakeWithdrawn'), (staked, staker, id, amount, event) => {\n const stake = assertEx(this._stakeCache.get(Number(id)))\n this._stakeCache.set(Number(id), {\n ...stake,\n withdrawBlock: event.blockNumber,\n })\n })\n const stakeEventGroups = await Promise.all([\n this.stakeEvents.stakeEvents([this._deploymentBlock, 'latest'], { name: 'StakeAdded' }),\n this.stakeEvents.stakeEvents([this._deploymentBlock, 'latest'], { name: 'StakeRemoved' }),\n this.stakeEvents.stakeEvents([this._deploymentBlock, 'latest'], { name: 'StakeWithdrawn' }),\n ])\n const allStakeEvents = stakeEventGroups.flat().toSorted((a, b) => a.time - b.time)\n\n for (const event of allStakeEvents) {\n this.applyHistoricalStakeEvent(event)\n }\n for (const event of allStakeEvents) {\n await this.stakeById(event.args.id)\n }\n }\n\n private applyHistoricalStakeEvent(event: StakeEvent): void {\n if (event.name === 'StakeAdded') {\n this._stakeCache.set(event.args.id, {\n id: event.args.id as PositionId,\n staked: event.args.staked,\n staker: event.args.staker,\n amount: event.args.amount,\n addBlock: event.time,\n removeBlock: 0,\n withdrawBlock: 0,\n })\n return\n }\n if (event.name === 'StakeRemoved') {\n const stake = assertEx(this._stakeCache.get(event.args.id))\n this._stakeCache.set(event.args.id, {\n ...stake,\n removeBlock: event.time,\n })\n return\n }\n if (event.name === 'StakeWithdrawn') {\n const stake = assertEx(this._stakeCache.get(event.args.id))\n this._stakeCache.set(event.args.id, {\n ...stake,\n withdrawBlock: event.time,\n })\n }\n }\n}\n", "import { parseUnits } from 'ethers/utils'\n\nexport interface GasConfig {\n gasLimit?: number\n gasPrice?: bigint\n}\n\nexport const getDefaultGasConfig = (): GasConfig => {\n return {\n gasLimit: 2_000_000, // Set the gas limit\n gasPrice: parseUnits('100', 'gwei'),\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["assertEx", "isDefined", "asEthBlockRange", "assertEx", "asEthBlockRange", "isDefined", "toEthAddress", "XYO_NETWORK_STAKING_ADDRESS", "assertEx", "asAddress", "assertEx", "asAddress", "assertEx", "toEthAddress", "XYO_NETWORK_STAKING_ADDRESS", "toEthAddress", "assertEx", "isDefined", "toAddress", "toEthAddress", "creatableProvider", "toEthAddress", "assertEx", "assertEx", "assertEx", "toAddress", "toEthAddress", "assertEx", "toEthAddress", "toAddress", "toEthAddress", "IStakedXyoChain__factory", "creatableProvider", "toEthAddress", "IStakedXyoChain__factory", "creatableProvider", "toEthAddress", "IStakedXyoChain__factory", "creatableProvider", "getAddress", "getAddress", "toEthAddress", "IStakedXyoChain__factory", "creatableProvider", "isDefined", "toAddress", "assertEx", "toEthAddress", "creatableProvider", "assertEx", "isDefined", "toAddress", "toEthAddress", "creatableProvider", "StakeEventsViewerMoniker", "asAttoXL1", "toAddress", "asAttoXL1", "toEthAddress", "StakeEventsViewerMoniker", "isDefined", "assertEx", "creatableProvider", "parseUnits"]
7
7
  }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Split an inclusive block range into fixed-size inclusive chunks.
3
+ *
4
+ * @example
5
+ * blockRangeChunks(0, 5000, 2000) // [[0, 1999], [2000, 3999], [4000, 5000]]
6
+ */
7
+ export declare function blockRangeChunks(fromBlock: number, toBlock: number, chunkSize: number): [number, number][];
8
+ //# sourceMappingURL=blockRangeChunks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blockRangeChunks.d.ts","sourceRoot":"","sources":["../../../../../src/modules/ethereum/block/blockRangeChunks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAiBpB"}
@@ -0,0 +1,17 @@
1
+ import type { Provider } from 'ethers';
2
+ /** Rough average EVM block time (post-merge Ethereum / Sepolia). */
3
+ export declare const DEFAULT_EVM_BLOCK_TIME_SEC = 12;
4
+ /** Default date used when estimating a deployment / history floor block. */
5
+ export declare const DEFAULT_ESTIMATE_BLOCK_DATE: Date;
6
+ /**
7
+ * Estimate the block number at `targetDate` from a known head, using a constant
8
+ * average block time. Conservative: `Math.ceil` on blocks-back so the estimate
9
+ * tends slightly early.
10
+ */
11
+ export declare function estimateBlockNumberFromHead(headNumber: number, headTimestampSec: number, targetDate?: Date, avgBlockTimeSec?: number): number;
12
+ /**
13
+ * Fetch the current head from `provider` and estimate the block number on that
14
+ * chain at `targetDate` (default 2025-06-01 UTC).
15
+ */
16
+ export declare function estimateBlockNumberAt(provider: Provider, targetDate?: Date, avgBlockTimeSec?: number): Promise<number>;
17
+ //# sourceMappingURL=estimateBlockNumberAt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"estimateBlockNumberAt.d.ts","sourceRoot":"","sources":["../../../../../src/modules/ethereum/block/estimateBlockNumberAt.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAEtC,oEAAoE;AACpE,eAAO,MAAM,0BAA0B,KAAK,CAAA;AAE5C,4EAA4E;AAC5E,eAAO,MAAM,2BAA2B,MAAiC,CAAA;AAEzE;;;;GAIG;AACH,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,EACxB,UAAU,GAAE,IAAkC,EAC9C,eAAe,GAAE,MAAmC,GACnD,MAAM,CAOR;AAED;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,QAAQ,EAClB,UAAU,GAAE,IAAkC,EAC9C,eAAe,GAAE,MAAmC,GACnD,OAAO,CAAC,MAAM,CAAC,CAGjB"}
@@ -1,2 +1,4 @@
1
+ export * from './blockRangeChunks.js';
2
+ export * from './estimateBlockNumberAt.js';
1
3
  export * from './rate/index.js';
2
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/modules/ethereum/block/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/modules/ethereum/block/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAA;AACrC,cAAc,4BAA4B,CAAA;AAC1C,cAAc,iBAAiB,CAAA"}
@@ -8,7 +8,28 @@ type StakeAddedLogEvent = TypedEventLog<ReturnTypeForOverload<IAddressStakingEve
8
8
  type StakeRemovedLogEvent = TypedEventLog<ReturnTypeForOverload<IAddressStakingEvents['getEvent'], 'StakeRemoved'>>;
9
9
  type StakeWithdrawnLogEvent = TypedEventLog<ReturnTypeForOverload<IAddressStakingEvents['getEvent'], 'StakeWithdrawn'>>;
10
10
  type StakeLogEvent = StakeAddedLogEvent | StakeRemovedLogEvent | StakeWithdrawnLogEvent;
11
+ /** Default max blocks per eth_getLogs / queryFilter call (public RPC safe). */
12
+ export declare const DEFAULT_EVENT_QUERY_BLOCK_CHUNK_SIZE = 2000;
13
+ /** Default attempts (including first) when eth_getLogs hits provider rate limits. */
14
+ export declare const DEFAULT_EVENT_QUERY_MAX_ATTEMPTS = 8;
15
+ /** Initial backoff after a rate-limit response before retrying eth_getLogs. */
16
+ export declare const DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS = 1000;
11
17
  export interface EvmStakeEventsParams extends EvmViewerParams {
18
+ /**
19
+ * Max blocks per eth_getLogs / queryFilter call when loading historical stake events.
20
+ * Defaults to {@link DEFAULT_EVENT_QUERY_BLOCK_CHUNK_SIZE}.
21
+ */
22
+ eventQueryBlockChunkSize?: number;
23
+ /**
24
+ * Initial delay (ms) after a rate-limit response before retrying eth_getLogs.
25
+ * Defaults to {@link DEFAULT_EVENT_QUERY_INITIAL_DELAY_MS}.
26
+ */
27
+ eventQueryInitialDelayMs?: number;
28
+ /**
29
+ * Total eth_getLogs attempts per chunk (including the first) when rate limited.
30
+ * Defaults to {@link DEFAULT_EVENT_QUERY_MAX_ATTEMPTS}.
31
+ */
32
+ eventQueryMaxAttempts?: number;
12
33
  }
13
34
  export declare class EvmStakeEventsViewer extends AbstractEvmViewer<EvmStakeEventsParams, IAddressStakingEvents> implements StakeEventsViewer {
14
35
  static readonly connectionTypes: readonly ["evm-rpc"];
@@ -17,13 +38,19 @@ export declare class EvmStakeEventsViewer extends AbstractEvmViewer<EvmStakeEven
17
38
  static readonly monikers: "StakeEventsViewer"[];
18
39
  static readonly surface: "node";
19
40
  moniker: "StakeEventsViewer";
41
+ /** Set at start when `params.deploymentBlock` is omitted (estimated 2025-06-01). */
42
+ private defaultDeploymentBlock;
20
43
  private eventCache;
21
44
  get deploymentBlock(): number;
45
+ get eventQueryBlockChunkSize(): number;
46
+ get eventQueryInitialDelayMs(): number;
47
+ get eventQueryMaxAttempts(): number;
22
48
  positionCount(range: [number, number | 'latest']): Promise<number>;
23
49
  stakeEvents<TName extends StakeEventName>(range?: [number, number | 'latest'], filter?: StakeEventFilter<TName>): Promisable<StakeEvent<TName>[]>;
24
50
  protected connectContract(address: EthAddress): IAddressStakingEvents;
25
51
  protected onEventHandler(staked: string, staker: string, id: bigint, amount: bigint, event: StakeLogEvent, throwOnInvalid?: boolean): StakeEvent | undefined;
26
52
  protected startHandler(): Promise<void>;
53
+ private attachLiveListeners;
27
54
  private loadHistoricalEvents;
28
55
  private stakeEventsNative;
29
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EvmStakeEventsViewer.d.ts","sourceRoot":"","sources":["../../../../../src/modules/ethereum/drivers/EvmStakeEventsViewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAM7D,OAAO,EACL,KAAK,qBAAqB,EAE1B,KAAK,aAAa,EACnB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAEL,KAAK,UAAU,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAC3D,KAAK,iBAAiB,EAEvB,MAAM,sBAAsB,CAAA;AAG7B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAGzD,KAAK,kBAAkB,GAAG,aAAa,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC,CAAA;AAC/G,KAAK,oBAAoB,GAAG,aAAa,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC,CAAC,CAAA;AACnH,KAAK,sBAAsB,GAAG,aAAa,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAA;AACvH,KAAK,aAAa,GAAG,kBAAkB,GAAG,oBAAoB,GAAG,sBAAsB,CAAA;AAEvF,MAAM,WAAW,oBAAqB,SAAQ,eAAe;CAE5D;AAED,qBACa,oBAAqB,SAAQ,iBAAiB,CAAC,oBAAoB,EAAE,qBAAqB,CAAE,YAAW,iBAAiB;IACnI,MAAM,CAAC,QAAQ,CAAC,eAAe,uBAAuB;IACtD,MAAM,CAAC,QAAQ,CAAC,cAAc,sBAA2B;IACzD,MAAM,CAAC,QAAQ,CAAC,YAAY,UAAK;IACjC,MAAM,CAAC,QAAQ,CAAC,QAAQ,wBAA6B;IACrD,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAG,MAAM,CAAS;IACzC,OAAO,sBAAsC;IAE7C,OAAO,CAAC,UAAU,CAAgC;IAElD,IAAI,eAAe,WAElB;IAEK,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAMxE,WAAW,CAAC,KAAK,SAAS,cAAc,EACtC,KAAK,GAAE,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAiB,EAClD,MAAM,CAAC,EAAE,gBAAgB,CAAC,KAAK,CAAC,GAC/B,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;cA6Bf,eAAe,CAAC,OAAO,EAAE,UAAU;IAItD,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,UAAQ,GAAG,UAAU,GAAG,SAAS;cA2CjI,YAAY;YAqBvB,oBAAoB;YAepB,iBAAiB;CAoBhC"}
1
+ {"version":3,"file":"EvmStakeEventsViewer.d.ts","sourceRoot":"","sources":["../../../../../src/modules/ethereum/drivers/EvmStakeEventsViewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAM7D,OAAO,EACL,KAAK,qBAAqB,EAE1B,KAAK,aAAa,EACnB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAEL,KAAK,UAAU,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAC3D,KAAK,iBAAiB,EAEvB,MAAM,sBAAsB,CAAA;AAK7B,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAIzD,KAAK,kBAAkB,GAAG,aAAa,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC,CAAA;AAC/G,KAAK,oBAAoB,GAAG,aAAa,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAE,cAAc,CAAC,CAAC,CAAA;AACnH,KAAK,sBAAsB,GAAG,aAAa,CAAC,qBAAqB,CAAC,qBAAqB,CAAC,UAAU,CAAC,EAAE,gBAAgB,CAAC,CAAC,CAAA;AACvH,KAAK,aAAa,GAAG,kBAAkB,GAAG,oBAAoB,GAAG,sBAAsB,CAAA;AAEvF,+EAA+E;AAC/E,eAAO,MAAM,oCAAoC,OAAO,CAAA;AAExD,qFAAqF;AACrF,eAAO,MAAM,gCAAgC,IAAI,CAAA;AAEjD,+EAA+E;AAC/E,eAAO,MAAM,oCAAoC,OAAO,CAAA;AAExD,MAAM,WAAW,oBAAqB,SAAQ,eAAe;IAC3D;;;OAGG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC;;;OAGG;IACH,wBAAwB,CAAC,EAAE,MAAM,CAAA;IACjC;;;OAGG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAC/B;AAED,qBACa,oBAAqB,SAAQ,iBAAiB,CAAC,oBAAoB,EAAE,qBAAqB,CAAE,YAAW,iBAAiB;IACnI,MAAM,CAAC,QAAQ,CAAC,eAAe,uBAAuB;IACtD,MAAM,CAAC,QAAQ,CAAC,cAAc,sBAA2B;IACzD,MAAM,CAAC,QAAQ,CAAC,YAAY,UAAK;IACjC,MAAM,CAAC,QAAQ,CAAC,QAAQ,wBAA6B;IACrD,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAG,MAAM,CAAS;IACzC,OAAO,sBAAsC;IAE7C,oFAAoF;IACpF,OAAO,CAAC,sBAAsB,CAAI;IAElC,OAAO,CAAC,UAAU,CAAgC;IAElD,IAAI,eAAe,WAElB;IAED,IAAI,wBAAwB,WAE3B;IAED,IAAI,wBAAwB,WAE3B;IAED,IAAI,qBAAqB,WAExB;IAEK,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAMxE,WAAW,CAAC,KAAK,SAAS,cAAc,EACtC,KAAK,GAAE,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAAiB,EAClD,MAAM,CAAC,EAAE,gBAAgB,CAAC,KAAK,CAAC,GAC/B,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;cA4Bf,eAAe,CAAC,OAAO,EAAE,UAAU;IAItD,SAAS,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,UAAQ,GAAG,UAAU,GAAG,SAAS;cAgCjI,YAAY;YAuBvB,mBAAmB;YAYnB,oBAAoB;YAuBpB,iBAAiB;CA6DhC"}
@@ -1 +1 @@
1
- {"version":3,"file":"EvmStakeViewer.d.ts","sourceRoot":"","sources":["../../../../../src/modules/ethereum/drivers/EvmStakeViewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAAE,UAAU,EAAE,UAAU,EAChC,MAAM,iBAAiB,CAAA;AAKxB,OAAO,EAAE,KAAK,eAAe,EAA4B,MAAM,wBAAwB,CAAA;AACvF,OAAO,EAEL,KAAK,QAAQ,EAEb,KAAK,iBAAiB,EAEtB,KAAK,WAAW,EAEjB,MAAM,sBAAsB,CAAA;AAI7B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAezD,MAAM,WAAW,oBAAqB,SAAQ,eAAe;CAE5D;AAED,qBACa,cAAe,SAAQ,iBAAiB,CAAC,oBAAoB,EAAE,eAAe,CAAE,YAAW,WAAW;IACjH,MAAM,CAAC,QAAQ,CAAC,eAAe,uBAAuB;IACtD,MAAM,CAAC,QAAQ,CAAC,cAAc,gBAAqB;IACnD,MAAM,CAAC,QAAQ,CAAC,YAAY,UAAK;IACjC,MAAM,CAAC,QAAQ,CAAC,QAAQ,kBAAuB;IAC/C,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAG,MAAM,CAAS;IACzC,QAAQ,CAAC,OAAO,gBAAgC;IAEhD,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,gBAAgB,CAAI;IAE5B,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,kBAAkB,CAAoB;IAE9C,IAAI,WAAW,sBAEd;IAEK,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAMzB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAMxD,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAMvD,YAAY,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;IAIvB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAK7C,mBAAmB,IAAI,MAAM;IAIvB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAM1B,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAMvD,aAAa,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;IAIvC,eAAe,IAAI,OAAO;IAIpB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAexC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAS/D,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,GAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAkB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAe1G,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,GAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAkB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAchH,mBAAmB,IAAI,OAAO;IAIxB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAM5B,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAMzD,eAAe,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;cAItB,eAAe,CAAC,OAAO,EAAE,UAAU;cAI7B,YAAY;IAyCrC,OAAO,CAAC,yBAAyB;CA6BlC"}
1
+ {"version":3,"file":"EvmStakeViewer.d.ts","sourceRoot":"","sources":["../../../../../src/modules/ethereum/drivers/EvmStakeViewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EAAE,UAAU,EAAE,UAAU,EAChC,MAAM,iBAAiB,CAAA;AAKxB,OAAO,EAAE,KAAK,eAAe,EAA4B,MAAM,wBAAwB,CAAA;AACvF,OAAO,EAEL,KAAK,QAAQ,EAEb,KAAK,iBAAiB,EAEtB,KAAK,WAAW,EAEjB,MAAM,sBAAsB,CAAA;AAK7B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AAezD,MAAM,WAAW,oBAAqB,SAAQ,eAAe;CAE5D;AAED,qBACa,cAAe,SAAQ,iBAAiB,CAAC,oBAAoB,EAAE,eAAe,CAAE,YAAW,WAAW;IACjH,MAAM,CAAC,QAAQ,CAAC,eAAe,uBAAuB;IACtD,MAAM,CAAC,QAAQ,CAAC,cAAc,gBAAqB;IACnD,MAAM,CAAC,QAAQ,CAAC,YAAY,UAAK;IACjC,MAAM,CAAC,QAAQ,CAAC,QAAQ,kBAAuB;IAC/C,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAG,MAAM,CAAS;IACzC,QAAQ,CAAC,OAAO,gBAAgC;IAEhD,OAAO,CAAC,UAAU,CAAc;IAChC,OAAO,CAAC,gBAAgB,CAAI;IAE5B,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,kBAAkB,CAAoB;IAE9C,IAAI,WAAW,sBAEd;IAEK,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAMzB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAMxD,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAMvD,YAAY,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;IAIvB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ7C,mBAAmB,IAAI,MAAM;IAIvB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAM1B,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAMvD,aAAa,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;IAIvC,eAAe,IAAI,OAAO;IAIpB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAexC,aAAa,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAS/D,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,GAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAkB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAe1G,cAAc,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,GAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAkB,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAchH,mBAAmB,IAAI,OAAO;IAIxB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC;IAM5B,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAMzD,eAAe,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;cAItB,eAAe,CAAC,OAAO,EAAE,UAAU;cAI7B,YAAY;IAyCrC,OAAO,CAAC,yBAAyB;CA6BlC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Detect Infura / Alchemy / generic JSON-RPC rate-limit and overload responses.
3
+ * Walks nested ethers error wrappers (`error`, `info`, `value`, `data`).
4
+ */
5
+ export declare function isRpcRateLimitError(error: unknown): boolean;
6
+ //# sourceMappingURL=isRpcRateLimitError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isRpcRateLimitError.d.ts","sourceRoot":"","sources":["../../../../../src/modules/ethereum/rpc/isRpcRateLimitError.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAiD3D"}
@@ -0,0 +1,19 @@
1
+ export interface RpcRateLimitBackoffOptions {
2
+ /** Multiplier applied to delay after each rate-limit hit. Default 2. */
3
+ backoff?: number;
4
+ /** Initial wait before the first retry. Default 1000ms. */
5
+ initialDelayMs?: number;
6
+ /** Total attempts including the first try. Default 8. */
7
+ maxAttempts?: number;
8
+ /** Cap on wait between retries. Default 30_000ms. */
9
+ maxDelayMs?: number;
10
+ /** Optional hook when a rate-limit triggers a backoff sleep. */
11
+ onRetry?: (error: unknown, attempt: number, delayMs: number) => void;
12
+ }
13
+ /**
14
+ * Run an async RPC call, retrying with exponential backoff when the provider
15
+ * reports rate limiting (e.g. Infura `-32005` / "Too Many Requests").
16
+ * Non-rate-limit errors are rethrown immediately.
17
+ */
18
+ export declare function withRpcRateLimitBackoff<T>(fn: () => Promise<T>, options?: RpcRateLimitBackoffOptions): Promise<T>;
19
+ //# sourceMappingURL=withRpcRateLimitBackoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withRpcRateLimitBackoff.d.ts","sourceRoot":"","sources":["../../../../../src/modules/ethereum/rpc/withRpcRateLimitBackoff.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,0BAA0B;IACzC,wEAAwE;IACxE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2DAA2D;IAC3D,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,qDAAqD;IACrD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,gEAAgE;IAChE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;CACrE;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,CAAC,EAC7C,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,0BAA+B,GACvC,OAAO,CAAC,CAAC,CAAC,CAiCZ"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Split an inclusive block range into fixed-size inclusive chunks.
3
+ *
4
+ * @example
5
+ * blockRangeChunks(0, 5000, 2000) // [[0, 1999], [2000, 3999], [4000, 5000]]
6
+ */
7
+ export declare function blockRangeChunks(fromBlock: number, toBlock: number, chunkSize: number): [number, number][];
8
+ //# sourceMappingURL=blockRangeChunks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blockRangeChunks.d.ts","sourceRoot":"","sources":["../../../../../src/modules/ethereum/block/blockRangeChunks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAiBpB"}