@xyo-network/chain-services 1.17.2 → 1.17.3

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 (38) hide show
  1. package/dist/neutral/BlockReward/EvmBlockRewardViewer.d.ts +3 -0
  2. package/dist/neutral/BlockReward/EvmBlockRewardViewer.d.ts.map +1 -1
  3. package/dist/neutral/ChainBlockNumberIteration/ChainBlockNumberIterationService.d.ts +3 -0
  4. package/dist/neutral/ChainBlockNumberIteration/ChainBlockNumberIterationService.d.ts.map +1 -1
  5. package/dist/neutral/ChainService/Evm/Evm.d.ts +4 -1
  6. package/dist/neutral/ChainService/Evm/Evm.d.ts.map +1 -1
  7. package/dist/neutral/ChainService/Memory/Memory.d.ts +4 -1
  8. package/dist/neutral/ChainService/Memory/Memory.d.ts.map +1 -1
  9. package/dist/neutral/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts +3 -0
  10. package/dist/neutral/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.d.ts.map +1 -1
  11. package/dist/neutral/PendingTransactions/BasePendingTransactions.d.ts +3 -0
  12. package/dist/neutral/PendingTransactions/BasePendingTransactions.d.ts.map +1 -1
  13. package/dist/neutral/Schemas/BaseSchemasService.d.ts.map +1 -1
  14. package/dist/neutral/StepStake/BaseStepStakeService.d.ts +3 -0
  15. package/dist/neutral/StepStake/BaseStepStakeService.d.ts.map +1 -1
  16. package/dist/neutral/Time/BaseTimeSyncService.d.ts +3 -0
  17. package/dist/neutral/Time/BaseTimeSyncService.d.ts.map +1 -1
  18. package/dist/neutral/blockViewerFromChainIteratorAndArchivist.d.ts +1 -1
  19. package/dist/neutral/blockViewerFromChainIteratorAndArchivist.d.ts.map +1 -1
  20. package/dist/neutral/index.mjs +63 -14
  21. package/dist/neutral/index.mjs.map +1 -1
  22. package/dist/neutral/simple/block/runner/spec/SimpleBlockRunner.d.ts +2 -0
  23. package/dist/neutral/simple/block/runner/spec/SimpleBlockRunner.d.ts.map +1 -0
  24. package/package.json +15 -16
  25. package/src/BlockReward/EvmBlockRewardViewer.ts +5 -0
  26. package/src/ChainBlockNumberIteration/ChainBlockNumberIterationService.ts +5 -1
  27. package/src/ChainService/Evm/Evm.ts +5 -1
  28. package/src/ChainService/Memory/Memory.ts +8 -1
  29. package/src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts +7 -1
  30. package/src/PendingTransactions/BasePendingTransactions.ts +6 -1
  31. package/src/Schemas/BaseSchemasService.ts +3 -2
  32. package/src/StepStake/BaseStepStakeService.ts +5 -1
  33. package/src/Time/BaseTimeSyncService.ts +6 -1
  34. package/src/blockViewerFromChainIteratorAndArchivist.ts +4 -1
  35. package/src/simple/block/runner/SimpleBlockRunner.ts +1 -1
  36. package/src/simple/block/runner/spec/{SimpleBlockRewardViewer.ts → SimpleBlockRunner.ts} +99 -94
  37. package/dist/neutral/simple/block/runner/spec/SimpleBlockRewardViewer.d.ts +0 -2
  38. package/dist/neutral/simple/block/runner/spec/SimpleBlockRewardViewer.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/AccountBalance/accountBalanceServiceFromArchivist.ts","../../src/BaseService.ts","../../src/BlockReward/EvmBlockRewardViewer.ts","../../src/blockViewerFromChainIteratorAndArchivist.ts","../../src/ChainBlockNumberIteration/ChainBlockNumberIterationService.ts","../../src/ChainService/Evm/Evm.ts","../../src/ChainService/Memory/Memory.ts","../../src/ChainValidator/XyoValidator.ts","../../src/Election/BaseElectionService.ts","../../src/implementation/accountBalance.ts","../../src/implementation/blockViewer.ts","../../src/implementation/chain/index.ts","../../src/implementation/chain/evm.ts","../../src/implementation/evm/initEvmProvider.ts","../../src/implementation/evm/initInfuraProvider.ts","../../src/implementation/evm/initChainId.ts","../../src/implementation/evm/initJsonRpcProvider.ts","../../src/implementation/head/head.ts","../../src/implementation/head/createBootstrapHead.ts","../../src/implementation/head/createForkedHead/getBridgeDestinationObservation.ts","../../src/implementation/head/createForkedHead/config/getBridgeDestinationDetails.ts","../../src/implementation/head/createForkedHead/config/getForkDetails.ts","../../src/implementation/head/createForkedHead/config/getBridgeSourceDetails.ts","../../src/implementation/head/createForkedHead/getBridgeIntent.ts","../../src/implementation/head/createForkedHead/getBridgeSourceObservation.ts","../../src/implementation/head/createForkedHead/getFirstBlockForNewChain.ts","../../src/implementation/head/createForkedHead/createForkedHead.ts","../../src/implementation/head/getForkFromBlock.ts","../../src/implementation/head/submitNewChain.ts","../../src/implementation/mempoolRunner.ts","../../src/implementation/mempoolViewer.ts","../../src/implementation/pendingTransactions.ts","../../src/PendingTransactions/BasePendingTransactions.ts","../../src/PendingTransactions/bundledPayloadToHydratedTransaction.ts","../../src/PendingTransactions/hydratedTransactionToPayloadBundle.ts","../../src/implementation/producer.ts","../../src/simple/block/runner/SimpleBlockRunner.ts","../../src/simple/block/runner/generateTransactionFeeTransfers.ts","../../src/implementation/reward.ts","../../src/implementation/time.ts","../../src/Time/BaseTimeSyncService.ts","../../src/implementation/validator.ts","../../src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts","../../src/Schemas/BaseSchemasService.ts","../../src/StakeIntent/lib/getBlockSignedStakeDeclarations.ts","../../src/StakeIntent/XyoStakeIntentService.ts","../../src/StepStake/BaseStepStakeService.ts"],"sourcesContent":["import type { Hash } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { ReadArchivist } from '@xyo-network/archivist-model'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { ChainId } from '@xyo-network/xl1-protocol'\nimport { StepSizes } from '@xyo-network/xl1-protocol'\nimport type {\n AccountBalanceViewer, BalancesStepSummary, SimpleAccountBalanceViewerParams, SimpleBlockViewerParams, TransfersStepSummary,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n findMostRecentBlock, LruCacheMap, readPayloadMapFromStore,\n SimpleAccountBalanceViewer,\n SimpleBlockViewer,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { Semaphore } from 'async-mutex'\n\n// this is intended to only be used for testing\nexport const accountBalancesViewerFromArchivist = async (\n chainId: ChainId,\n archivist: ReadArchivist<WithStorageMeta<Payload>>,\n): Promise<AccountBalanceViewer> => {\n const summaryMap = new LruCacheMap<string, BalancesStepSummary>({\n max: 100_000,\n allowStale: true,\n noDisposeOnSet: false,\n updateAgeOnGet: true,\n })\n\n const transferSummaryMap = new LruCacheMap<string, TransfersStepSummary>({\n max: 100_000,\n allowStale: true,\n noDisposeOnSet: false,\n updateAgeOnGet: true,\n })\n\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(archivist)\n const headFunc = async (): Promise<[Hash, number]> => {\n const head = assertEx(await findMostRecentBlock(archivist), () => 'No blocks found in chainArchivist')\n return [head._hash, head.block]\n }\n\n const service = await SimpleAccountBalanceViewer.create({\n context: {\n chainId,\n store: { chainMap },\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap,\n head: headFunc,\n },\n transfersSummaryContext: {\n chainId,\n store: { chainMap },\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap: transferSummaryMap,\n head: headFunc,\n\n },\n blockViewer: await SimpleBlockViewer.create({\n context: {\n chainId,\n head: headFunc,\n store: { chainMap },\n },\n finalizedArchivist: archivist,\n } satisfies SimpleBlockViewerParams),\n } satisfies SimpleAccountBalanceViewerParams)\n return service\n}\n","import type { EventData, Promisable } from '@xylabs/sdk-js'\nimport { AbstractCreatable, creatable } from '@xylabs/sdk-js'\nimport { Mutex } from 'async-mutex'\n\nimport type { BaseAccountableServiceParams, BaseServiceParams } from './model/index.ts'\n\ndeclare global {\n var xyoServiceSingletons: Record<string, unknown>\n}\n\n@creatable()\nexport class BaseService<TParams extends BaseServiceParams = BaseServiceParams, TEventData extends EventData = EventData>\n extends AbstractCreatable<TParams, TEventData> {\n private static singletonInitMutex = new Mutex()\n\n static get singletons() {\n return globalThis['xyoServiceSingletons'] ?? (globalThis['xyoServiceSingletons'] = {})\n }\n\n static initSingleton<TService extends BaseService<TParams>, TParams extends BaseServiceParams>(params: Partial<TParams>) {\n if (this.singletons[this.name]) throw new Error(`Singleton already initialized for ${this.name}`)\n return this.singletonInitMutex.runExclusive(async () => {\n return await this.create(params) as TService\n })\n }\n}\n\nexport abstract class BaseAccountableService<\n TParams extends BaseAccountableServiceParams = BaseAccountableServiceParams,\n> extends BaseService<TParams> {\n // Base class for services that have an account\n}\n\nexport interface CreatableService<T extends BaseService = BaseService> {\n new(params: T['params']): T\n create<T extends BaseService>(this: CreatableService<T>, params?: Partial<T['params']>): Promisable<T>\n}\n\nexport function creatableService<T extends BaseService = BaseService>() {\n return <U extends CreatableService<T>>(constructor: U) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n constructor\n }\n}\n","import {\n AbstractCreatable,\n assertEx, creatable, CreatableParams, toEthAddress,\n} from '@xylabs/sdk-js'\nimport { XyoChainRewards__factory as XyoChainRewardsFactory } from '@xyo-network/typechain'\nimport {\n asAttoXL1, AttoXL1, XL1BlockNumber,\n} from '@xyo-network/xl1-protocol'\nimport {\n BlockRewardViewer,\n ChainContractViewer,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { Provider } from 'ethers/providers'\n\nexport interface EvmBlockRewardViewerParams extends CreatableParams {\n chainContractViewer: ChainContractViewer\n provider: Provider\n}\n\n@creatable()\nexport class EvmBlockRewardViewer extends AbstractCreatable<EvmBlockRewardViewerParams> implements BlockRewardViewer {\n protected _contractAddress: string | undefined\n\n protected get chainContractViewer() {\n return assertEx(this.params.chainContractViewer, () => 'chainContractViewer is required')\n }\n\n protected get contractAddress() {\n return assertEx(this._contractAddress, () => 'contractAddress is required')\n }\n\n protected get provider() {\n return assertEx(this.params.provider, () => 'provider is required')\n }\n\n async allowedRewardForBlock(blockNumber: XL1BlockNumber): Promise<AttoXL1> {\n const contract = XyoChainRewardsFactory.connect(toEthAddress(this.contractAddress), this.provider)\n return asAttoXL1(await contract.calcBlockReward(blockNumber))\n }\n\n override async createHandler() {\n await super.createHandler()\n try {\n this._contractAddress = await this.chainContractViewer.rewardsContract()\n } catch (ex) {\n const error = ex as Error\n throw new Error(`Failed to get rewards contract address: ${error.message}`)\n }\n }\n}\n","import type { Hash, Promisable } from '@xylabs/sdk-js'\nimport { isDefined } from '@xylabs/sdk-js'\nimport type { ReadArchivist } from '@xyo-network/archivist-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload, WithHashMeta } from '@xyo-network/payload-model'\nimport type {\n SignedHydratedBlockWithHashMeta,\n XL1BlockNumber,\n} from '@xyo-network/xl1-protocol'\nimport { asSignedBlockBoundWitness, asSignedBlockBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol'\nimport type { BlockViewer, EventingChainBlockNumberIteratorService } from '@xyo-network/xl1-protocol-sdk'\n\nexport function blockViewerFromChainIteratorAndArchivist(\n chainIterator: EventingChainBlockNumberIteratorService,\n chainArchivist: ReadArchivist,\n): BlockViewer {\n const result = {\n blockByHash: async function (hash: Hash): Promise<SignedHydratedBlockWithHashMeta | null> {\n const [payload] = await chainArchivist.get([hash])\n const block = asSignedBlockBoundWitnessWithStorageMeta(payload)\n if (isDefined(block)) {\n const payloads = await chainArchivist.get(block.payload_hashes)\n return [block, payloads]\n }\n return null\n },\n blockByNumber: async function (blockNumber: XL1BlockNumber): Promise<SignedHydratedBlockWithHashMeta | null> {\n const payload = asSignedBlockBoundWitness(await chainIterator.get(blockNumber))\n const block = payload ? await PayloadBuilder.addHashMeta(payload) : undefined\n if (isDefined(block)) {\n const payloads = await chainArchivist.get(block.payload_hashes)\n return [block, payloads]\n }\n return null\n },\n blocksByHash: async function (hash: Hash, limit = 10): Promise<SignedHydratedBlockWithHashMeta[]> {\n const results: SignedHydratedBlockWithHashMeta[] = []\n for (let i = 0; i < limit; i++) {\n const block = await this.blockByHash(hash)\n if (block) {\n results.push(block)\n } else {\n break\n }\n }\n return results\n },\n blocksByNumber: async function (number: XL1BlockNumber, limit = 10): Promise<SignedHydratedBlockWithHashMeta[]> {\n const results: SignedHydratedBlockWithHashMeta[] = []\n for (let i = 0; i < limit; i++) {\n const block = await this.blockByNumber(number)\n if (block) {\n results.push(block)\n } else {\n break\n }\n }\n return results\n },\n currentBlock: async function (): Promise<SignedHydratedBlockWithHashMeta> {\n const head = await chainIterator.head()\n return this.blockByHash(head._hash) as Promise<SignedHydratedBlockWithHashMeta>\n },\n currentBlockHash: async function (): Promise<Hash> {\n const head = await chainIterator.head()\n return head._hash\n },\n currentBlockNumber: async function (): Promise<XL1BlockNumber> {\n const head = await chainIterator.head()\n return head.block\n },\n payloadByHash: function (_hash: Hash): Promisable<WithHashMeta<Payload> | null> {\n throw new Error('Function not implemented.')\n },\n payloadsByHash: function (_hashes: Hash[]): Promisable<WithHashMeta<Payload>[]> {\n throw new Error('Function not implemented.')\n },\n } satisfies BlockViewer\n return result\n}\n","import type {\n Hash, Hex, Promisable,\n} from '@xylabs/sdk-js'\nimport {\n assertEx,\n isDefined, isNull, isUndefined,\n} from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n Payload, WithHashMeta, WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport type {\n BlockBoundWitness, SignedHydratedBlockWithHashMeta, XL1BlockNumber,\n} from '@xyo-network/xl1-protocol'\nimport {\n asBlockBoundWitness, asBlockBoundWitnessWithStorageMeta, asSignedHydratedBlockWithHashMeta, asXL1BlockNumber, isBlockBoundWitnessWithHashMeta,\n} from '@xyo-network/xl1-protocol'\nimport type {\n BlockViewer,\n ChainIteratorServiceEventData,\n ChainStoreRead,\n PayloadMapRead,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { hydrateBlock } from '@xyo-network/xl1-protocol-sdk'\nimport { LRUCache } from 'lru-cache'\n\nimport { BaseService } from '../BaseService.ts'\nimport type { XyoChainIteratorParams } from './model/index.ts'\n\nexport class ChainBlockNumberIterationService extends BaseService<XyoChainIteratorParams, ChainIteratorServiceEventData>\n implements BlockViewer {\n protected _blocksByBlockNumber = new LRUCache<number, WithStorageMeta<BlockBoundWitness>>({ max: 10_000 })\n protected _currentHead: WithStorageMeta<BlockBoundWitness> | undefined\n\n get chainId(): Hex { return assertEx(this._currentHead?.chain ?? this.params?.head?.chain, () => 'Current head is not set') }\n\n get chainMap(): PayloadMapRead<WithStorageMeta<Payload>> { return assertEx(this.params.chainMap) }\n\n get chainStoreRead() {\n return { chainMap: this.chainMap } satisfies ChainStoreRead\n }\n\n async blockByHash(hash: Hash): Promise<SignedHydratedBlockWithHashMeta | null> {\n return asSignedHydratedBlockWithHashMeta(await hydrateBlock(this.chainStoreRead, hash)) ?? null\n }\n\n async blockByNumber(block: XL1BlockNumber): Promise<SignedHydratedBlockWithHashMeta | null> {\n return asSignedHydratedBlockWithHashMeta(await this.get(block)) ?? null\n }\n\n async blocksByHash(hash: Hash, limit: number = 100): Promise<SignedHydratedBlockWithHashMeta[]> {\n const results: SignedHydratedBlockWithHashMeta[] = []\n let currentBlock = await this.blockByHash(hash)\n while (currentBlock !== null && (isUndefined(limit) || results.length < limit)) {\n results.push(currentBlock)\n const previousHash = currentBlock[0].previous\n if (isNull(previousHash)) break\n currentBlock = await this.blockByHash(previousHash)\n }\n return results\n }\n\n async blocksByNumber(blockNumber: XL1BlockNumber, limit: number = 100): Promise<SignedHydratedBlockWithHashMeta[]> {\n const results: SignedHydratedBlockWithHashMeta[] = []\n let currentBlock = await this.blockByNumber(blockNumber)\n while (currentBlock !== null && (isUndefined(limit) || results.length < limit)) {\n results.push(currentBlock)\n if (currentBlock[0].block === 0) break\n const previousNumber = asXL1BlockNumber(currentBlock[0].block - 1, true)\n currentBlock = await this.blockByNumber(previousNumber)\n }\n return results\n }\n\n async currentBlock(): Promise<SignedHydratedBlockWithHashMeta> {\n return assertEx(await this.blockByHash(await this.currentBlockHash()), () => 'Current block not found')\n }\n\n async currentBlockHash(): Promise<Hash> {\n const head = assertEx(await this.head(), () => 'Head is not set')\n return head._hash\n }\n\n async currentBlockNumber(): Promise<XL1BlockNumber> {\n const head = assertEx(await this.head(), () => 'Head is not set')\n return head.block\n }\n\n async get(block: number): Promise<WithStorageMeta<BlockBoundWitness>> {\n const head = await this.head()\n // if(isUndefined(head)) return undefined\n // Bail early if the block requested is newer than the current head\n assertEx(head.block >= block, () => `Block requested is newer than the current head [${block}]`)\n const cached = this._blocksByBlockNumber.get(block)\n if (cached) return cached\n // Start at the current head and traverse backwards until the requested block is found\n const startingBlock = head\n const currentBlockHash = await PayloadBuilder.hash(startingBlock)\n let currentBlock = (await this.chainMap.get(currentBlockHash))\n while (isDefined(currentBlock)) {\n assertEx(asBlockBoundWitness(currentBlock), () => `Expected hash to be a block bound witness [${currentBlock?._hash}]`)\n if (isBlockBoundWitnessWithHashMeta(currentBlock)) {\n this._blocksByBlockNumber.set(currentBlock.block, currentBlock)\n if (currentBlock.block === block) {\n return currentBlock\n }\n const { previous } = currentBlock\n if (isNull(previous)) break\n currentBlock = (await this.chainMap.get(previous))\n }\n }\n throw new Error(`Block not found: ${block}`)\n }\n\n async head(): Promise<WithStorageMeta<BlockBoundWitness>> {\n if (isDefined(this._currentHead)) return this._currentHead\n if (isDefined(this.params.head)) {\n const newHead = await this.getBoundWitnessAsBlockBoundWitnessWithStorageMeta(this.params.head)\n this._currentHead = newHead\n return newHead\n }\n throw new Error('Head is not set')\n }\n\n async next(block: number): Promise<WithStorageMeta<BlockBoundWitness> | undefined> {\n const currentBlock = block\n const nextBlockNumber = currentBlock + 1\n return await this.get(nextBlockNumber)\n }\n\n payloadByHash(_hash: Hash): Promisable<WithHashMeta<Payload> | null> {\n throw new Error('Method [payloadByHash] not implemented.')\n }\n\n payloadsByHash(_hashes: Hash[]): Promisable<WithHashMeta<Payload>[]> {\n throw new Error('Method [payloadsByHash] not implemented.')\n }\n\n // TODO: Decide on inclusive/exclusive (probably need inclusive to account for chain head)\n // and then communicate via method name and documentation\n async previous(block: number | undefined = undefined, count: number = 1): Promise<WithStorageMeta<BlockBoundWitness>[]> {\n const results: WithStorageMeta<BlockBoundWitness>[] = []\n let currentBlock: WithStorageMeta<BlockBoundWitness> | undefined = isDefined(block) ? (await this.get(block)) : await this.head()\n while (isDefined(currentBlock) && (results.length < count)) {\n if (isBlockBoundWitnessWithHashMeta(currentBlock)) {\n results.push(currentBlock)\n const { previous } = currentBlock as BlockBoundWitness\n if (isNull(previous)) break\n const nextBlock = await this.chainMap.get(previous)\n currentBlock = asBlockBoundWitnessWithStorageMeta(nextBlock)\n } else {\n const hash = PayloadBuilder.hash(currentBlock)\n assertEx(asBlockBoundWitnessWithStorageMeta(currentBlock), () => `Expected hash to be a block bound witness [${hash}]`)\n }\n }\n return results\n }\n\n async updateHead(head: BlockBoundWitness): Promise<void> {\n const newHead = await this.getBoundWitnessAsBlockBoundWitnessWithStorageMeta(head)\n this._currentHead = newHead\n void this.emit('headUpdated', { blocks: [newHead] })\n }\n\n private async getBoundWitnessAsBlockBoundWitnessWithStorageMeta(head: BlockBoundWitness): Promise<WithStorageMeta<BlockBoundWitness>> {\n const hash = await PayloadBuilder.hash(head)\n const stored = (await this.chainMap.get(hash))\n const newHead = asBlockBoundWitnessWithStorageMeta(stored)\n if (isUndefined(newHead)) throw new Error(`Head block not found in archivist [${hash}]`)\n return newHead\n }\n}\n","import type {\n Address, Hex, Promisable,\n} from '@xylabs/sdk-js'\nimport {\n assertEx, toAddress, toEthAddress,\n} from '@xylabs/sdk-js'\nimport type { StakedXyoChain } from '@xyo-network/typechain'\nimport { StakedXyoChain__factory as StakedXyoChainFactory } from '@xyo-network/typechain'\nimport type { AttoXL1, XL1BlockNumber } from '@xyo-network/xl1-protocol'\nimport type { ChainService } from '@xyo-network/xl1-protocol-sdk'\nimport { getAddress } from 'ethers/address'\nimport type { ContractRunner } from 'ethers/providers'\n\nimport { BaseService } from '../../BaseService.ts'\nimport type { BaseServiceParams } from '../../model/index.ts'\n\nexport interface EvmChainServiceParams extends BaseServiceParams {\n contract: StakedXyoChain\n id: Hex\n runner: ContractRunner\n}\n\n/**\n * A class that represents a chain stake as backed by an EVM smart contract\n */\nexport class EvmChainService extends BaseService<EvmChainServiceParams> implements ChainService {\n async active(): Promise<bigint> {\n return await (await this.contract()).active()\n }\n\n async activeByStaked(staked: Address): Promise<bigint> {\n return await (await this.contract()).activeByAddressStaked(getAddress(toEthAddress(staked)))\n }\n\n async activeByStaker(address: Address): Promise<bigint> {\n return await (await this.contract()).activeByStaker(getAddress(toEthAddress(address)))\n }\n\n async addStake(staked: Address, amount: bigint): Promise<boolean> {\n const result = await (await this.contract()).addStake(getAddress(toEthAddress(staked)), amount)\n await result.wait()\n return true\n }\n\n chainId(): Promisable<Hex> {\n return assertEx(this.params.id)\n }\n\n async contract() {\n if (this.params.contract === undefined) {\n this.params.contract = StakedXyoChainFactory.connect(\n toEthAddress(await this.chainId()),\n this.params.runner,\n ) as StakedXyoChain\n }\n return assertEx(this.params.contract)\n }\n\n async forkedAtBlockNumber(): Promise<bigint> {\n return await (await this.contract()).forkedAtBlockNumber()\n }\n\n async forkedAtHash(): Promise<bigint> {\n return await (await this.contract()).forkedAtHash()\n }\n\n async forkedChainId(): Promise<Address> {\n return toAddress(await (await this.contract()).forkedChainId())\n }\n\n async minWithdrawalBlocks(): Promise<bigint> {\n return await (await this.contract()).minWithdrawalBlocks()\n }\n\n async pending(): Promise<bigint> {\n return await (await this.contract()).pending()\n }\n\n async pendingByStaker(staker: Address): Promise<bigint> {\n return await (await this.contract()).pendingByStaker(getAddress(toEthAddress(staker)))\n }\n\n async removeStake(slot: bigint): Promise<boolean> {\n const result = await (await this.contract()).removeStake(slot)\n await result.wait()\n return true\n }\n\n rewardForBlock(_block: XL1BlockNumber): Promisable<AttoXL1> {\n throw new Error('Method not implemented.')\n }\n\n async rewardsContract(): Promise<string> {\n return await (await this.contract()).rewardsContract()\n }\n\n async stakingTokenAddress(): Promise<string> {\n return await (await this.contract()).stakingTokenAddress()\n }\n\n async withdrawStake(slot: bigint): Promise<boolean> {\n const result = await (await this.contract()).withdrawStake(slot)\n await result.wait()\n return true\n }\n\n async withdrawn(): Promise<bigint> {\n return await (await this.contract()).withdrawn()\n }\n\n async withdrawnByStaker(staker: string): Promise<bigint> {\n return await (await this.contract()).withdrawnByStaker(getAddress(staker))\n }\n}\n","import type {\n Address, Hex, Promisable,\n} from '@xylabs/sdk-js'\nimport {\n assertEx, toAddress, ZERO_ADDRESS,\n} from '@xylabs/sdk-js'\nimport type { AttoXL1, XL1BlockNumber } from '@xyo-network/xl1-protocol'\nimport type { ChainService, Config } from '@xyo-network/xl1-protocol-sdk'\n\nimport { BaseService } from '../../BaseService.ts'\nimport type { BaseServiceParams } from '../../model/index.ts'\n\nexport interface MemoryChainServiceParams extends BaseServiceParams<Pick<Config, 'producer'>> {\n chainId: Hex\n}\n\n/**\n * A class that represents a chain stake as backed in memory\n */\nexport class MemoryChainService extends BaseService<MemoryChainServiceParams> implements ChainService {\n protected _chainId: Hex | undefined\n protected _simulatedStake: bigint = 1n\n\n async active(): Promise<bigint> {\n return await Promise.resolve(this._simulatedStake)\n }\n\n async activeByStaked(_staked: Address): Promise<bigint> {\n return await Promise.resolve(this._simulatedStake)\n }\n\n async activeByStaker(_address: string): Promise<bigint> {\n return await Promise.resolve(this._simulatedStake)\n }\n\n async addStake(_staked: string, _amount: bigint): Promise<boolean> {\n return await Promise.resolve(true)\n }\n\n chainId(): Promisable<Hex> {\n return assertEx(this._chainId, () => 'Chain ID not set')\n }\n\n override createHandler(): void {\n const { minStake = 1 } = this.params.config.producer ?? {}\n this._simulatedStake = BigInt(minStake)\n }\n\n async forkedAtBlockNumber(): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n\n async forkedAtHash(): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n\n async forkedChainId(): Promise<Address> {\n return await Promise.resolve(ZERO_ADDRESS)\n }\n\n async minWithdrawalBlocks(): Promise<bigint> {\n return await Promise.resolve(1n)\n }\n\n async pending(): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n\n async pendingByStaker(_staker: string): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n\n async removeStake(_slot: bigint): Promise<boolean> {\n return await Promise.resolve(true)\n }\n\n rewardForBlock(_block: XL1BlockNumber): Promisable<AttoXL1> {\n throw new Error('Method not implemented.')\n }\n\n async rewardsContract(): Promise<string> {\n return await Promise.resolve('')\n }\n\n async stakingTokenAddress(): Promise<string> {\n return await Promise.resolve('')\n }\n\n async withdrawStake(_slot: bigint): Promise<boolean> {\n return await Promise.resolve(true)\n }\n\n async withdrawn(): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n\n async withdrawnByStaker(_staker: string): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n\n protected override async startHandler(): Promise<void> {\n await super.startHandler()\n this._chainId = this.params.chainId ?? toAddress(1n)\n }\n}\n","import {\n assertEx, creatable, EmptyObject,\n Promisable,\n} from '@xylabs/sdk-js'\nimport {\n BlockBoundWitness,\n SignedHydratedTransactionWithStorageMeta,\n} from '@xyo-network/xl1-protocol'\nimport { BlockViewer, HydratedBlockStateValidationFunction } from '@xyo-network/xl1-protocol-sdk'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\nimport { Validator } from './model/index.ts'\n\nexport interface XyoValidatorParams<TConfig extends EmptyObject = EmptyObject> extends BaseServiceParams<TConfig> {\n // account: AccountInstance\n // blockRewardService: BlockRewardService\n blockViewer: BlockViewer\n // chainId: ChainId\n // electionService: ElectionService\n // pendingBundledTransactionsArchivist: ArchivistInstance\n // stakeIntentService: StakeIntentService\n validateHydratedBlockState: HydratedBlockStateValidationFunction\n}\n\n@creatable()\nexport class XyoValidator<TParams extends XyoValidatorParams = XyoValidatorParams> extends BaseService<TParams> implements Validator {\n // get address() {\n // return this.account.address\n // }\n\n // protected get account() {\n // return assertEx(this.params.account, () => 'account is required')\n // }\n\n protected get blockViewer() {\n return assertEx(this.params.blockViewer, () => 'blockViewer is required')\n }\n\n // protected get chainInfo() {\n // return assertEx(this.params.chainId, () => 'chainInfo is required')\n // }\n\n // protected get electionService() {\n // return assertEx(this.params.electionService, () => 'electionService is required')\n // }\n\n // protected get pendingBundledTransactionsArchivist() {\n // return assertEx(this.params.pendingBundledTransactionsArchivist, () => 'pendingBundledTransactions is required')\n // }\n\n // protected get blockRewardService() {\n // return assertEx(this.params.blockRewardService, () => 'blockRewardService is required')\n // }\n\n validatePendingBlock(_block: BlockBoundWitness): Promisable<Error[]> {\n return [] // await validateBlockProtocol(block, this.chainInfo)\n }\n\n // TODO: Move to validator and inherit this class from validator\n async validatePendingTransaction(hydratedTransaction: SignedHydratedTransactionWithStorageMeta): Promise<boolean> {\n const [tx] = hydratedTransaction\n // Ensure not confirmed already (replay attack)\n if ((await this.blockViewer.blockByHash(tx._hash)) !== undefined) return false\n // TODO: Ensure transaction is valid (double spend, has voucher, has required stake, etc.)\n // TODO: Ensure validator stake is valid\n return await Promise.resolve(true)\n }\n}\n","import {\n Address, assertEx, creatable, Hash,\n} from '@xylabs/sdk-js'\nimport { hexToLast4BytesInt, shuffleWithSeed } from '@xyo-network/chain-utils'\nimport { WithHashMeta } from '@xyo-network/payload-model'\nimport { BlockBoundWitness } from '@xyo-network/xl1-protocol'\nimport type {\n BlockViewer,\n ChainStakeViewer, ElectionService, StakeIntentService,\n} from '@xyo-network/xl1-protocol-sdk'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseElectionServicesParams extends BaseServiceParams {\n blockViewer?: BlockViewer\n chainStakeViewer?: ChainStakeViewer\n stakeIntentService?: StakeIntentService\n}\n\n@creatable()\nexport class BaseElectionService extends BaseService<BaseElectionServicesParams> implements ElectionService {\n get blockViewer() {\n return assertEx(this.params.blockViewer, () => 'No block viewer')\n }\n\n get chainStakeViewer() {\n return assertEx(this.params.chainStakeViewer, () => 'No chain stake viewer')\n }\n\n get stakeIntentService() {\n return assertEx(this.params.stakeIntentService, () => 'No staked intent service')\n }\n\n async getCreatorCommitteeForNextBlock(current: WithHashMeta<BlockBoundWitness>): Promise<Address[]> {\n return await this.spanAsync('getCreatorCommitteeForNextBlock', async () => {\n const nextBlock = current.block + 1\n const candidates = await this.stakeIntentService.getDeclaredCandidatesForBlock(nextBlock, 'producer')\n const previousBlockHash = current._hash\n return this.generateCreatorCommittee(candidates, previousBlockHash)\n })\n }\n\n protected generateCreatorCommittee(candidates: Address[], previousBlockHash: Hash, maxSize = 3): Address[] {\n const creators = new Set<Address>(candidates)\n const seed = hexToLast4BytesInt(previousBlockHash)\n const creatorArray = shuffleWithSeed(creators, seed)\n return creatorArray.slice(0, maxSize)\n }\n}\n","import { isDefined, type Promisable } from '@xylabs/sdk-js'\nimport type { Initializable, InitializableParams } from '@xyo-network/xl1-protocol'\nimport type { AccountBalanceViewer, Config } from '@xyo-network/xl1-protocol-sdk'\nimport {\n AccountBalanceViewerRpcSchemas,\n HttpRpcTransport,\n JsonRpcAccountBalanceViewer,\n} from '@xyo-network/xl1-rpc'\n\nlet balanceServiceSingleton: Promisable<AccountBalanceViewer> | undefined\n\nexport type InitAccountBalanceServiceParams = InitializableParams<{\n config: Config\n}>\n\nexport const initAccountBalanceService: Initializable<InitAccountBalanceServiceParams, AccountBalanceViewer>\n = (params): Promisable<AccountBalanceViewer> => {\n const { config, logger } = params\n if (balanceServiceSingleton) return balanceServiceSingleton\n const endpoint = config.services?.accountBalanceViewerEndpoint ?? config.services?.apiEndpoint\n if (isDefined(endpoint)) {\n const transport = new HttpRpcTransport(endpoint, { ...AccountBalanceViewerRpcSchemas })\n const viewer = new JsonRpcAccountBalanceViewer(transport)\n logger?.log('Using AccountBalanceViewer RPC service at', endpoint)\n return viewer\n } else {\n throw new Error('No AccountBalanceViewer endpoint configured')\n }\n }\n","import { isDefined, type Promisable } from '@xylabs/sdk-js'\nimport type { Initializable, InitializableParams } from '@xyo-network/xl1-protocol'\nimport type { BlockViewer, Config } from '@xyo-network/xl1-protocol-sdk'\nimport {\n BlockViewerRpcSchemas,\n HttpRpcTransport,\n JsonRpcBlockViewer,\n} from '@xyo-network/xl1-rpc'\n\nlet blockViewerSingleton: Promisable<BlockViewer> | undefined\n\nexport type InitBlockViewerParams = InitializableParams<{\n config: Config\n}>\n\nexport const initBlockViewer: Initializable<InitBlockViewerParams, BlockViewer>\n = (params): Promisable<BlockViewer> => {\n const { config, logger } = params\n if (blockViewerSingleton) return blockViewerSingleton\n const endpoint = config.services?.apiEndpoint\n if (isDefined(endpoint)) {\n const transport = new HttpRpcTransport(endpoint, { ...BlockViewerRpcSchemas })\n const viewer = new JsonRpcBlockViewer(transport)\n logger?.log('Using BlockViewer RPC service at', endpoint)\n return viewer\n } else {\n throw new Error('No BlockViewer endpoint configured')\n }\n }\n","import {\n assertEx, type CreatableName, type Promisable,\n} from '@xylabs/sdk-js'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport type { ChainService } from '@xyo-network/xl1-protocol-sdk'\nimport type { Config } from 'cosmiconfig'\n\nimport { MemoryChainService } from '../../ChainService/index.ts'\nimport type { BaseAccountableServiceParams } from '../../model/index.ts'\nimport { canUseEvmContractChainService, initEvmContractChainService } from './evm.ts'\n\nlet chainStakeServiceSingleton: Promisable<ChainService> | undefined\n\nexport const initChainService: Initializable<BaseAccountableServiceParams<\n Pick<Config, 'chain' | 'evm' | 'producer'>>,\nChainService> = ({\n account, config, logger,\n}) => {\n logger?.log('ChainService: Initializing...')\n const result = init({\n config, name: 'ChainService' as CreatableName, account,\n })\n logger?.log('ChainService: Initialized')\n return result\n}\n\nexport const initMemoryChainService: Initializable<BaseAccountableServiceParams<\n Pick<Config, 'producer'>>, ChainService> = async ({ config }) => {\n const result = await MemoryChainService.create({\n config,\n name: 'MemoryChainService' as CreatableName,\n })\n assertEx(await result.start(), () => 'Failed to start MemoryChainService')\n return result\n}\n\nconst init: Initializable<BaseAccountableServiceParams<Pick<Config, 'chain' | 'evm' | 'producer'>>,\n ChainService> = async (params): Promise<ChainService> => {\n if (chainStakeServiceSingleton) return chainStakeServiceSingleton\n const { config } = params\n chainStakeServiceSingleton = canUseEvmContractChainService(config)\n ? await initEvmContractChainService({ ...params, name: 'ChainStakeService' as CreatableName })\n : await initMemoryChainService(params)\n // Create service\n return chainStakeServiceSingleton\n}\n","import type { Address, Promisable } from '@xylabs/sdk-js'\nimport {\n asAddress, assertEx, isDefined, ZERO_ADDRESS,\n} from '@xylabs/sdk-js'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport type { ContractRunner } from 'ethers'\nimport { Wallet } from 'ethers/wallet'\n\nimport { EvmChainService } from '../../ChainService/index.ts'\nimport type { BaseAccountableServiceParams } from '../../model/index.ts'\nimport { canUseEvmProvider, initEvmProvider } from '../evm/index.ts'\n\nlet chainStakeServiceSingleton: Promisable<EvmChainService> | undefined\n\nexport const canUseEvmContractChainService = (config: Pick<Config, 'chain' | 'evm'>) => {\n const { id } = config.chain\n return isDefined(id) && id !== ZERO_ADDRESS && canUseEvmProvider({ config })\n}\n\nexport const initEvmContractChainService: Initializable<BaseAccountableServiceParams<Pick<Config, 'chain' | 'evm'>>, EvmChainService> = async ({\n account, config, traceProvider, meterProvider, logger,\n}) => {\n if (chainStakeServiceSingleton) return chainStakeServiceSingleton\n // Parse config\n const emvStakingContractAddress = assertEx(config.chain.id, () => 'config.chain.id is required')\n // Configure ContractRunner\n const id: Address = assertEx(asAddress(emvStakingContractAddress), () => 'config.chain.id is not a valid address')\n const provider = assertEx(await initEvmProvider({ config }))\n const privateKey = assertEx(account.private?.hex, () => 'Account does not have a private key')\n const runner: ContractRunner = new Wallet(privateKey, provider)\n // Create service\n chainStakeServiceSingleton = EvmChainService.create({\n id, runner, traceProvider, meterProvider, logger,\n })\n const result = await chainStakeServiceSingleton\n await result.start()\n return result\n}\n","import type { Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport type { Provider } from 'ethers'\nimport type { JsonRpcProvider } from 'ethers/providers'\n\nimport { canUseInfuraProvider, initInfuraProvider } from './initInfuraProvider.ts'\nimport { canUseJsonRpcProvider, initJsonRpcProvider } from './initJsonRpcProvider.ts'\n\nlet provider: Promise<JsonRpcProvider> | undefined\n\nexport const initEvmProvider = async ({ config }: { config: Pick<Config, 'evm'>; logger?: Logger }): Promise<Provider> => {\n if (provider) return provider\n if (canUseInfuraProvider(config)) {\n provider = initInfuraProvider(config)\n } else if (canUseJsonRpcProvider(config)) {\n provider = initJsonRpcProvider(config)\n }\n return assertEx(await provider, () => 'No provider available')\n}\n\nexport const canUseEvmProvider = ({ config }: { config: Pick<Config, 'evm'> }) => {\n return canUseInfuraProvider(config) || canUseJsonRpcProvider(config)\n}\n","import { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { InfuraProvider } from 'ethers/providers'\n\nimport { canUseChainId, getChainId } from './initChainId.ts'\n\nlet instance: Promise<InfuraProvider> | undefined\n\nexport const initInfuraProvider = (config: Pick<Config, 'evm'>) => {\n if (instance) return instance\n const providerConfig = getInfuraProviderConfig(config)\n instance = Promise.resolve(new InfuraProvider(...providerConfig))\n return instance\n}\n\nexport const canUseInfuraProvider = (config: Pick<Config, 'evm'>): boolean => {\n return canUseChainId(config)\n && isDefined(config.evm?.infura?.projectId)\n && isDefined(config.evm?.infura?.projectSecret)\n}\n\nexport const getInfuraProviderConfig = (config: Pick<Config, 'evm'>) => {\n const projectId = assertEx(config.evm?.infura?.projectId, () => 'Missing config.evm.infura.projectId')\n const projectSecret = assertEx(config.evm?.infura?.projectSecret, () => 'Missing config.evm.infura.projectSecret')\n return [getChainId(config), projectId, projectSecret] as const\n}\n","import {\n assertEx, hexFrom, isDefined, isHex,\n} from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nexport const canUseChainId = (config: Pick<Config, 'evm'>): boolean => {\n return isDefined(config.evm.chainId)\n}\n\nexport const getChainId = (config: Pick<Config, 'evm'>) => {\n const chainId = assertEx(config.evm.chainId, () => 'Missing config.evm.chainId')\n if (isHex(chainId, { prefix: true })) {\n const hex = hexFrom(chainId)\n const parsed = Number.parseInt(hex, 16)\n return parsed\n } else {\n const parsed = Number.parseInt(chainId, 10)\n return parsed\n }\n}\n","import { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { JsonRpcProvider } from 'ethers/providers'\n\nimport { canUseChainId, getChainId } from './initChainId.ts'\n\nexport const initJsonRpcProvider = (config: Pick<Config, 'evm'>) => {\n const providerConfig = getJsonRpcProviderConfig(config)\n return Promise.resolve(new JsonRpcProvider(...providerConfig))\n}\n\nexport const canUseJsonRpcProvider = (config: Pick<Config, 'evm'>) => {\n return canUseChainId(config)\n && isDefined(config.evm.jsonRpc?.url)\n}\n\nexport const getJsonRpcProviderConfig = (config: Pick<Config, 'evm'>) => {\n const jsonRpcUrl = assertEx(config.evm.jsonRpc?.url, () => 'Missing config.evm.jsonRpc.url')\n return [jsonRpcUrl, getChainId(config)] as const\n}\n","import type { Promisable } from '@xylabs/sdk-js'\nimport { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type { Initializable, SignedBlockBoundWitnessWithHashMeta } from '@xyo-network/xl1-protocol'\nimport { type ChainService, findMostRecentBlock } from '@xyo-network/xl1-protocol-sdk'\n\nimport { createBootstrapHead } from './createBootstrapHead.ts'\nimport { createForkedHead } from './createForkedHead/index.ts'\nimport { getForkFromBlock } from './getForkFromBlock.ts'\nimport { submitNewChain } from './submitNewChain.ts'\n\nlet headSingleton: Promisable<SignedBlockBoundWitnessWithHashMeta> | undefined\n\nexport const initHead: Initializable<{\n account: WalletInstance\n chainArchivist: ArchivistInstance\n chainService: ChainService\n chainSubmissionsArchivistWrite: ArchivistInstance\n}, SignedBlockBoundWitnessWithHashMeta>\n = async (params): Promise<SignedBlockBoundWitnessWithHashMeta> => {\n const {\n account, chainArchivist, chainSubmissionsArchivistWrite, chainService,\n } = params\n if (headSingleton) return headSingleton\n let head = await findMostRecentBlock(chainArchivist)\n\n // If there is a head\n if (head) {\n // If there is a head but check if it matches our chainId or we should fork from it\n const forkFromBlock = await getForkFromBlock(head, chainService, chainArchivist)\n // If we should fork form a block in the current chain\n if (isDefined(forkFromBlock)) {\n // Create a new chain from the fork from block\n const chain = await createForkedHead(forkFromBlock, account, chainService)\n await submitNewChain(chain, chainArchivist, chainSubmissionsArchivistWrite)\n const newBlock = assertEx(chain.at(-1), () => new Error('Failed to get new head after forking'))\n head = newBlock[0]\n }\n } else {\n // If there is no head, create one\n const chain = await createBootstrapHead(account, chainService)\n await submitNewChain(chain, chainArchivist, chainSubmissionsArchivistWrite)\n const newBlock = assertEx(chain.at(-1), () => new Error('Failed to get new head after genesis'))\n head = newBlock[0]\n }\n headSingleton = head\n return headSingleton\n }\n","import {\n buildNextBlock, createDeclarationIntent, createGenesisBlock,\n} from '@xyo-network/chain-protocol'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type { SignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-protocol'\nimport type { ChainService } from '@xyo-network/xl1-protocol-sdk'\n\nexport const createBootstrapHead = async (account: WalletInstance, chainService: ChainService): Promise<SignedHydratedBlockWithHashMeta[]> => {\n const chainId = await chainService.chainId()\n const chain: SignedHydratedBlockWithHashMeta[] = []\n\n // Create genesis block\n const genesisBlock = await createGenesisBlock(account, chainId, 10_000_000n, account.address)\n chain.push(genesisBlock)\n\n // Create producer declaration block\n const producerDeclarationPayload = createDeclarationIntent(\n account.address,\n 'producer',\n genesisBlock[0].block,\n genesisBlock[0].block + 10_000,\n )\n const producerDeclarationBlock = await buildNextBlock(\n genesisBlock[0],\n [],\n [producerDeclarationPayload],\n [account],\n )\n chain.push(producerDeclarationBlock)\n return chain\n}\n","import { buildNextBlock } from '@xyo-network/chain-protocol'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n BridgeDestinationObservation, BridgeDestinationObservationFields,\n HydratedBlockWithHashMeta,\n SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-protocol'\nimport { BridgeDestinationObservationSchema } from '@xyo-network/xl1-protocol'\nimport type { ChainService } from '@xyo-network/xl1-protocol-sdk'\n\nimport {\n getBridgeDestConfirmation, getBridgeDestinationDetails, getBridgeSourceDetails,\n} from './config/index.ts'\n\n/**\n * Get the bridge destination observation for a given block.\n * @param previousBlock The previous block to base the observation on.\n * @param account The wallet account to use for the observation.\n * @param chainService The chain service to use for the observation.\n */\nexport const getBridgeDestinationObservation = async (\n previousBlock: HydratedBlockWithHashMeta,\n account: WalletInstance,\n chainService: ChainService,\n): Promise<SignedHydratedBlockWithHashMeta> => {\n const bridgeDestinationObservationFields: BridgeDestinationObservationFields = {\n ...await getBridgeSourceDetails(account, chainService),\n ...getBridgeDestinationDetails(),\n destConfirmation: getBridgeDestConfirmation(),\n }\n const bridgeDestinationObservation = new PayloadBuilder<BridgeDestinationObservation>({ schema: BridgeDestinationObservationSchema })\n .fields(bridgeDestinationObservationFields)\n .build()\n\n return await buildNextBlock(\n previousBlock[0],\n [],\n [bridgeDestinationObservation],\n [account],\n )\n}\n","import { toHex } from '@xylabs/sdk-js'\nimport type { BridgeDetailsDestinationFields } from '@xyo-network/xl1-protocol'\n\nimport { getForkBlockRewardHex } from './getForkDetails.ts'\n\n// const bridgeableTokenContract = toHex('0x4865Cb10d55cfB0E60DD2B4F9b888f6a49B76733')\n// const bridgeDestAddress = toHex('0xe53218d47913b5f9E58bb74F0a0eD790bbF21972')\n// const destConfirmation = toHex('0x4fa05d7e799f36f1d45c441a4866eb4570a00a753a39377f404a8d113c01a657') // Eth TX for mint\nconst ethChainId = toHex('0x1')\nconst bridgeableTokenContract = toHex('0xf72aE3E0DA743033AbD7A407557D684c1aE66aed')\nconst bridgeDestAddress = toHex('0x0e65b65B10C791942665030402c35023d88B14dA')\nconst destConfirmation = toHex('0x950861b10523b52cdbb4a9ee52ed26601db555d2652bfec21c709e5e70d5b7d3') // Eth TX for mint\n\nexport const getBridgeDestChainId = () => ethChainId\nexport const getBridgeDestToken = () => bridgeableTokenContract\nexport const getBridgeDestAddress = () => bridgeDestAddress\nexport const getBridgeDestAmount = () => getForkBlockRewardHex()\nexport const getBridgeDestConfirmation = () => destConfirmation\n\nexport const getBridgeDestinationDetails = (): BridgeDetailsDestinationFields => {\n return {\n dest: getBridgeDestChainId(),\n destToken: getBridgeDestToken(),\n destAddress: getBridgeDestAddress(),\n destAmount: getBridgeDestAmount(),\n }\n}\n","import { type Hex, toHex } from '@xylabs/sdk-js'\nimport { AttoXL1ConvertFactor } from '@xyo-network/xl1-protocol'\n\nexport const getForkBlockReward = (): bigint => {\n return 18_000_000_000n * AttoXL1ConvertFactor.xl1 // 18b XL1 in AttoXL1\n}\n\nexport const getForkBlockRewardHex = (): Hex => {\n return toHex(getForkBlockReward())\n}\n","import type { AccountInstance } from '@xyo-network/account-model'\nimport type { BridgeDetailsSourceFields } from '@xyo-network/xl1-protocol'\nimport type { ChainService } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getForkBlockRewardHex } from './getForkDetails.ts'\n\nexport const getBridgeSrcChainId = (chainService: ChainService) => chainService.chainId()\nexport const getBridgeSrcAddress = (account: AccountInstance) => account.address\nexport const getBridgeSrcToken = (chainService: ChainService) => chainService.chainId()\nexport const getBridgeSrcAmount = () => getForkBlockRewardHex()\n\nexport const getBridgeSourceDetails = async (account: AccountInstance, chainService: ChainService): Promise<BridgeDetailsSourceFields> => {\n return {\n src: await getBridgeSrcChainId(chainService),\n srcAddress: getBridgeSrcAddress(account),\n srcToken: await getBridgeSrcToken(chainService),\n srcAmount: getBridgeSrcAmount(),\n }\n}\n","import { buildNextBlock, createTransferPayload } from '@xyo-network/chain-protocol'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n BridgeIntent, BridgeIntentFields,\n SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-protocol'\nimport { BridgeIntentSchema, XYO_BRIDGE_ADDRESS } from '@xyo-network/xl1-protocol'\nimport type { ChainService } from '@xyo-network/xl1-protocol-sdk'\n\nimport {\n getBridgeDestinationDetails, getBridgeSourceDetails, getForkBlockReward,\n} from './config/index.ts'\n\n/**\n * Get the bridge intent for a given block.\n * @param previousBlock The previous block to base the intent on.\n * @param account The wallet account to use for the intent.\n * @param chainService The chain service to use for the intent.\n */\nexport const getBridgeIntent = async (\n previousBlock: SignedHydratedBlockWithHashMeta,\n account: WalletInstance,\n chainService: ChainService,\n): Promise<SignedHydratedBlockWithHashMeta> => {\n // Create transfer to bridge address\n const transferPayload = createTransferPayload(\n account.address,\n { [XYO_BRIDGE_ADDRESS]: getForkBlockReward() },\n )\n\n // Use timestamp as nonce\n const nonce = `${Date.now()}`\n\n // Create Bridge Intent\n const bridgeIntentFields: BridgeIntentFields = {\n ...await getBridgeSourceDetails(account, chainService),\n ...getBridgeDestinationDetails(),\n nonce,\n }\n const bridgeIntent = new PayloadBuilder<BridgeIntent>({ schema: BridgeIntentSchema })\n .fields(bridgeIntentFields)\n .build()\n\n return await buildNextBlock(\n previousBlock[0],\n [],\n [bridgeIntent, transferPayload],\n [account],\n )\n}\n","import { buildNextBlock } from '@xyo-network/chain-protocol'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n BridgeSourceObservation, BridgeSourceObservationFields,\n SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-protocol'\nimport { BridgeSourceObservationSchema } from '@xyo-network/xl1-protocol'\nimport type { ChainService } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getBridgeDestinationDetails, getBridgeSourceDetails } from './config/index.ts'\n\n/**\n * Get the bridge source observation for a given block.\n * @param previousBlock The previous block to base the observation on.\n * @param account The wallet account to use for the observation.\n * @param chainService The chain service to use for the observation.\n */\nexport const getBridgeSourceObservation = async (\n previousBlock: SignedHydratedBlockWithHashMeta,\n account: WalletInstance,\n chainService: ChainService,\n): Promise<SignedHydratedBlockWithHashMeta> => {\n // TODO: Find actual transfer TX from previous block/source intent?\n // This hash should contain both the source intent and the transfer to the bridge address\n // As the block is itself both a block and a transaction, we can use its hash for now\n const srcTxHash = previousBlock[0]._hash\n\n const bridgeSourceObservationFields: BridgeSourceObservationFields = {\n ...await getBridgeSourceDetails(account, chainService),\n ...getBridgeDestinationDetails(),\n // Observation\n srcConfirmation: srcTxHash,\n }\n\n const bridgeSourceObservation = new PayloadBuilder<BridgeSourceObservation>({ schema: BridgeSourceObservationSchema })\n .fields(bridgeSourceObservationFields)\n .build()\n\n return await buildNextBlock(\n previousBlock[0],\n [],\n [bridgeSourceObservation],\n [account],\n )\n}\n","import { buildBlock, type BuildNextBlockOptions } from '@xyo-network/chain-protocol'\nimport type { WithHashMeta } from '@xyo-network/payload-model'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n BlockBoundWitness,\n SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-protocol'\nimport { AttoXL1, XYO_STEP_REWARD_ADDRESS } from '@xyo-network/xl1-protocol'\nimport type { ChainService } from '@xyo-network/xl1-protocol-sdk'\n\n/**\n * Get the first block for the new forked chain.\n * @param forkBlock The block to fork from\n * @param account The wallet account to sign the block\n * @param chainService The chain service instance\n * @returns The first block for the new forked chain\n */\nexport const getFirstBlockForNewChain = async (\n forkBlock: WithHashMeta<BlockBoundWitness>,\n account: WalletInstance,\n chainService: ChainService,\n): Promise<SignedHydratedBlockWithHashMeta> => {\n const {\n _hash: previousBlockHash, block: previousBlockNumber, step_hashes: previousStepHashes = [], protocol,\n } = forkBlock\n const chainId = await chainService.chainId()\n const options: BuildNextBlockOptions = {\n blockPayloads: [],\n chainId,\n previousBlockHash,\n previousBlockNumber,\n previousStepHashes,\n signers: [account],\n txs: [],\n protocol,\n chainStepRewardAddress: XYO_STEP_REWARD_ADDRESS,\n stepRewardPoolBalance: AttoXL1(0n),\n }\n // Can not use buildNextBlock because we need to control the chain id change here\n return await buildBlock(options)\n}\n","import type { WalletInstance } from '@xyo-network/wallet-model'\nimport type { SignedBlockBoundWitnessWithHashMeta, SignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-protocol'\nimport type { ChainService } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getBridgeDestinationObservation } from './getBridgeDestinationObservation.ts'\nimport { getBridgeIntent } from './getBridgeIntent.ts'\nimport { getBridgeSourceObservation } from './getBridgeSourceObservation.ts'\nimport { getFirstBlockForNewChain } from './getFirstBlockForNewChain.ts'\n\nexport const createForkedHead = async (\n forkFromBlock: SignedBlockBoundWitnessWithHashMeta,\n account: WalletInstance,\n chainService: ChainService,\n): Promise<SignedHydratedBlockWithHashMeta[]> => {\n const chain: SignedHydratedBlockWithHashMeta[] = []\n // Build the first block for the new chain\n const firstBlockForNewChain = await getFirstBlockForNewChain(forkFromBlock, account, chainService)\n chain.push(firstBlockForNewChain)\n // Build the bridge intent\n const bridgeIntent = await getBridgeIntent(firstBlockForNewChain, account, chainService)\n chain.push(bridgeIntent)\n // Build the bridge source observation\n const bridgeSourceObservation = await getBridgeSourceObservation(bridgeIntent, account, chainService)\n chain.push(bridgeSourceObservation)\n // Build the bridge destination observation\n const bridgeDestinationObservation = await getBridgeDestinationObservation(bridgeSourceObservation, account, chainService)\n chain.push(bridgeDestinationObservation)\n return chain\n}\n","import type { Address, Hash } from '@xylabs/sdk-js'\nimport {\n asHash, hexFromBigInt, isDefined,\n} from '@xylabs/sdk-js'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { SignedBlockBoundWitnessWithHashMeta } from '@xyo-network/xl1-protocol'\nimport { isSignedBlockBoundWitnessWithHashMeta } from '@xyo-network/xl1-protocol'\nimport type { ChainService } from '@xyo-network/xl1-protocol-sdk'\n\n/**\n * Determine if the chain should fork based on the current head and chain configuration.\n * @param head The current head block\n * @param chainService The chain service instance\n * @param chainArchivist The chain archivist instance\n * @returns The block to fork from if the chain should fork, undefined otherwise\n */\nexport const getForkFromBlock = async (\n head: SignedBlockBoundWitnessWithHashMeta,\n chainService: ChainService,\n chainArchivist: ArchivistInstance,\n): Promise<SignedBlockBoundWitnessWithHashMeta | undefined> => {\n // If the head's chain doesn't match our chainId, we may need to fork\n if (head.chain !== await chainService.chainId()) {\n // Get the forked at hash from the chain service\n const forkedAtBigInt = await chainService.forkedAtHash()\n const forkedAtHex = hexFromBigInt(forkedAtBigInt) // Validate it's a proper hex string\n const forkedAtHash: Hash | undefined = asHash(forkedAtHex)\n if (isDefined(forkedAtHash)) {\n // If we have a forkedAtHash, we need to check if the correct block exists\n const [forkedAtBlock] = await chainArchivist.get([forkedAtHash])\n const forkedChainId: Address = await chainService.forkedChainId()\n const forkedAtBlockNumber: number = Number(await chainService.forkedAtBlockNumber())\n // If we found the block hash we should fork at, check if it's a valid BlockBoundWitness\n if (isSignedBlockBoundWitnessWithHashMeta(forkedAtBlock)\n // And it is on the correct forked from chain\n && forkedAtBlock.chain === forkedChainId\n // And it is the correct forked at block number\n && forkedAtBlock.block === forkedAtBlockNumber) {\n return forkedAtBlock\n }\n }\n }\n}\n","import { delay } from '@xylabs/sdk-js'\nimport type { ArchivistInstance, WriteArchivist } from '@xyo-network/archivist-model'\nimport type { SignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-protocol'\nimport { flattenHydratedBlock } from '@xyo-network/xl1-protocol-sdk'\n\n/**\n * Submit a new chain to the archivist.\n * @param chain The new chain to submit\n * @param chainArchivist The chain archivist instance\n * @param chainSubmissionsArchivistWrite The chain submissions archivist instance\n */\nexport const submitNewChain = async (\n chain: SignedHydratedBlockWithHashMeta[],\n chainArchivist: ArchivistInstance,\n chainSubmissionsArchivistWrite: WriteArchivist,\n): Promise<void> => {\n for (const block of chain) {\n const [bw] = block\n await chainSubmissionsArchivistWrite.insert(flattenHydratedBlock(block))\n // Wait for block to show up in finalized archivist\n while (true) {\n const result = await chainArchivist.get([bw._hash])\n if (result.length > 0) break\n await delay(1000) // Wait 1 second before retrying\n }\n }\n}\n","import { isDefined, type Promisable } from '@xylabs/sdk-js'\nimport type { Initializable, InitializableParams } from '@xyo-network/xl1-protocol'\nimport type { Config, MempoolRunner } from '@xyo-network/xl1-protocol-sdk'\nimport {\n HttpRpcTransport,\n JsonRpcMempoolRunner,\n MempoolRunnerRpcSchemas,\n} from '@xyo-network/xl1-rpc'\n\nlet mempoolRunnerSingleton: Promisable<MempoolRunner> | undefined\n\nexport type InitMempoolRunnerParams = InitializableParams<{\n config: Config\n}>\n\nexport const initMempoolRunner: Initializable<InitMempoolRunnerParams, MempoolRunner>\n = (params): Promisable<MempoolRunner> => {\n const { config, logger } = params\n if (mempoolRunnerSingleton) return mempoolRunnerSingleton\n const endpoint = config.services?.apiEndpoint\n if (isDefined(endpoint)) {\n const transport = new HttpRpcTransport(endpoint, { ...MempoolRunnerRpcSchemas })\n const runner = new JsonRpcMempoolRunner(transport)\n logger?.log('Using mempoolRunner RPC service at', endpoint)\n return runner\n } else {\n throw new Error('No MempoolRunner endpoint configured')\n }\n }\n","import { isDefined, type Promisable } from '@xylabs/sdk-js'\nimport type { Initializable, InitializableParams } from '@xyo-network/xl1-protocol'\nimport type { Config, MempoolViewer } from '@xyo-network/xl1-protocol-sdk'\nimport {\n HttpRpcTransport,\n JsonRpcMempoolViewer,\n MempoolViewerRpcSchemas,\n} from '@xyo-network/xl1-rpc'\n\nlet mempoolViewerSingleton: Promisable<MempoolViewer> | undefined\n\nexport type InitMempoolViewerParams = InitializableParams<{\n config: Config\n}>\n\nexport const initMempoolViewer: Initializable<InitMempoolViewerParams, MempoolViewer>\n = (params): Promisable<MempoolViewer> => {\n const { config, logger } = params\n if (mempoolViewerSingleton) return mempoolViewerSingleton\n const endpoint = config.services?.apiEndpoint\n if (isDefined(endpoint)) {\n const transport = new HttpRpcTransport(endpoint, { ...MempoolViewerRpcSchemas })\n const viewer = new JsonRpcMempoolViewer(transport)\n logger?.log('Using MempoolViewer RPC service at', endpoint)\n return viewer\n } else {\n throw new Error('No MempoolViewer endpoint configured')\n }\n }\n","import { isDefined, type Promisable } from '@xylabs/sdk-js'\nimport type { Initializable, InitializableParams } from '@xyo-network/xl1-protocol'\nimport type { Config, MempoolViewer } from '@xyo-network/xl1-protocol-sdk'\nimport { timeBudget } from '@xyo-network/xl1-protocol-sdk'\nimport {\n HttpRpcTransport, JsonRpcMempoolViewer, MempoolViewerRpcSchemas,\n} from '@xyo-network/xl1-rpc'\n\nimport { BasePendingTransactionsService, type BasePendingTransactionsServiceParams } from '../PendingTransactions/index.ts'\n\nlet serviceSingleton: Promisable<MempoolViewer> | undefined\n\nexport type InitPendingTransactionsServiceParams = InitializableParams<{\n config: Config\n params?: BasePendingTransactionsServiceParams\n}>\n\nexport const initPendingTransactions: Initializable<InitPendingTransactionsServiceParams, MempoolViewer> = async (\n {\n config, params, logger,\n }: InitPendingTransactionsServiceParams,\n): Promise<MempoolViewer> => {\n if (serviceSingleton) return serviceSingleton\n return await timeBudget('initPendingTransactions', logger, async () => {\n const endpoint = config.services?.apiEndpoint\n if (isDefined(endpoint)) {\n const transport = new HttpRpcTransport(endpoint, { ...MempoolViewerRpcSchemas })\n const viewer = new JsonRpcMempoolViewer(transport)\n logger?.log('Using MempoolViewer RPC service at', endpoint)\n return viewer\n } else {\n serviceSingleton = await BasePendingTransactionsService.create(params)\n }\n return serviceSingleton\n }, 2000, true)\n}\n","import { ValueType } from '@opentelemetry/api'\nimport {\n assertEx, creatable,\n exists,\n filterAs, filterAsync, forget, Hash,\n isDefined, isUndefined,\n} from '@xylabs/sdk-js'\nimport { MemoryArchivist } from '@xyo-network/archivist-memory'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport {\n Payload, PayloadBundle, Sequence, WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport {\n asBlockBoundWitnessWithHashMeta, asXL1BlockNumber, ChainId, HydratedTransactionValidationFunction, isTransactionBoundWitnessWithStorageMeta,\n SignedHydratedBlockWithHashMeta,\n SignedHydratedTransactionWithHashMeta,\n SignedHydratedTransactionWithStorageMeta,\n XL1BlockNumber,\n} from '@xyo-network/xl1-protocol'\nimport {\n findMostRecentBlock, MempoolViewer, PendingBlocksOptions, PendingTransactionsOptions,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { TransactionJsonSchemaValidator, validateTransaction } from '@xyo-network/xl1-validation'\nimport { Mutex } from 'async-mutex'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\nimport { bundledPayloadToHydratedTransaction } from './bundledPayloadToHydratedTransaction.ts'\nimport { hydratedTransactionToPayloadBundle } from './hydratedTransactionToPayloadBundle.ts'\n\nexport interface BasePendingTransactionsServiceParams extends BaseServiceParams {\n additionalPendingTransactionValidators?: HydratedTransactionValidationFunction[]\n chainArchivist: ArchivistInstance\n chainId: ChainId\n pendingBundledTransactionsArchivist: ArchivistInstance\n rejectedTransactionsArchivist: ArchivistInstance\n}\n\n@creatable()\nexport class BasePendingTransactionsService extends BaseService<BasePendingTransactionsServiceParams> implements MempoolViewer {\n private static readonly MutexPriority = {\n /**\n * Priority for inserting new transactions\n */\n InsertNewTransactions: 5,\n /**\n * Priority for reading pending transactions\n */\n ReadTransactions: 3,\n /**\n * Priority for removing finalized/expired/rejected transactions\n */\n PurgeTransactions: 1,\n } as const\n\n /**\n * A mutex to ensure that the counting the number of pending transactions is\n * not called concurrently\n */\n private _countPendingTransactionsMutex = new Mutex()\n\n /**\n * A local Archivist optimized for fast retrieval that stores only validated\n * pending transactions\n */\n private _curatedPendingBundledTransactionsArchivist: MemoryArchivist | undefined\n\n /**\n * The last count of total pending transactions\n */\n private _pendingTransactionsCount: number = 0\n\n /**\n * A set of transaction hashes that are pending removal from the\n * curated pending transactions archivist. This is used to track\n * which transactions need to be removed from the archivist.\n */\n private _removablePendingTransactionHashes: Set<Hash> = new Set()\n\n /**\n * A mutex to ensure that the curated pending transactions archivist is\n * updated in a thread-safe manner\n */\n private _updateCuratedPendingTransactionsArchivistMutex = new Mutex()\n\n private get additionalPendingTransactionValidators() {\n return this.params.additionalPendingTransactionValidators ?? []\n }\n\n private get chainArchivist() {\n return assertEx(this.params.chainArchivist, () => 'No completed blocks with data archivist')\n }\n\n private get chainId() {\n return assertEx(this.params.chainId, () => 'No chain id')\n }\n\n private get pendingBundledTransactionsArchivist() {\n return assertEx(this.params.pendingBundledTransactionsArchivist, () => 'No pending bundled transactions archivist')\n }\n\n private get pendingBundledTransactionsLocalArchivist() {\n return assertEx(this._curatedPendingBundledTransactionsArchivist, () => 'No pending bundled transactions curated archivist')\n }\n\n private get pendingTransactionsCount() {\n forget(this.countPendingTransactions())\n return this._pendingTransactionsCount\n }\n\n private get rejectedTransactionsArchivist() {\n return assertEx(this.params.rejectedTransactionsArchivist, () => 'No rejected transactions archivist')\n }\n\n override async createHandler() {\n await super.createHandler()\n this._curatedPendingBundledTransactionsArchivist = await MemoryArchivist.create({ account: 'random' })\n\n // On new pending transactions, insert them into the curated archivist\n this.pendingBundledTransactionsArchivist.on('inserted', ({ payloads }) => {\n forget(this.insertNewTransactions(payloads as WithStorageMeta<PayloadBundle>[]))\n })\n\n // On new finalized blocks, remove the transactions from the curated archivist\n this.chainArchivist.on('inserted', ({ payloads }) => {\n this.markAnyIncludedTransactionsForRemoval(payloads)\n forget(this.cleanupWorker())\n })\n\n // On new rejected transactions, remove the transactions from the curated archivist\n this.rejectedTransactionsArchivist.on('inserted', ({ payloads }) => {\n this.markAnyIncludedTransactionsForRemoval(payloads)\n forget(this.cleanupWorker())\n })\n\n const pendingTransactionsCounter = this.meter?.createObservableUpDownCounter(\n 'xyo_pending_transactions_counter',\n {\n description: 'The current number of pending transactions', valueType: ValueType.INT, unit: '1',\n },\n )\n pendingTransactionsCounter?.addCallback((observer) => {\n observer.observe(this.pendingTransactionsCount)\n })\n }\n\n pendingBlocks(_options?: PendingBlocksOptions): Promise<SignedHydratedBlockWithHashMeta[]> {\n throw new Error('Method [pendingBlocks] not implemented.')\n }\n\n async pendingTransactions({ limit = 100 }: PendingTransactionsOptions = {}): Promise<SignedHydratedTransactionWithStorageMeta[]> {\n return await this.spanAsync('getPendingTransactions', async () => {\n // Acquires an exclusive mutex to ensure no race conditions while accessing pending transactions.\n return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {\n // Find the supplied head\n let lastHead = (filterAs(await this.chainArchivist.next({ limit: 100 }), x => asBlockBoundWitnessWithHashMeta(x))).at(-1)\n if (isUndefined(lastHead)) return []\n\n await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash)\n\n const foundPendingTransactions: SignedHydratedTransactionWithStorageMeta[] = []\n let cursor: Sequence | undefined\n\n // Continue fetching until the desired number of transactions is reached.\n while (foundPendingTransactions.length < limit) {\n // Fetch the next batch of payloads\n const pendingBundledTransactions = await this.pendingBundledTransactionsLocalArchivist.next({\n limit: 100,\n order: 'asc',\n cursor,\n }) as WithStorageMeta<PayloadBundle>[]\n\n // Exit if no more payloads are available.\n if (pendingBundledTransactions.length === 0) break\n\n // Update the cursor for the next iteration to fetch subsequent payloads.\n cursor = pendingBundledTransactions.at(-1)?._sequence\n\n // Keep only those payloads that are not marked for deletion.\n const undeletedTransactionBundles = pendingBundledTransactions.filter(tx =>\n !this._removablePendingTransactionHashes.has(tx.root))\n\n // Convert each undeleted payload bundle into a hydrated transaction.\n const transactions = (await Promise.all(\n undeletedTransactionBundles.map(p => bundledPayloadToHydratedTransaction(p)),\n )).filter(exists)\n\n // Filter transactions to only include those that are active for the next\n // potential block based on the last supplied head.\n const activeTransactions = transactions.filter(isTransactionActive(asXL1BlockNumber(lastHead.block + 1, true)))\n\n const txValidationResults = await Promise.all(activeTransactions.map(async tx => ([tx, await validateTransaction(\n tx,\n { chainId: this.chainId },\n this.additionalPendingTransactionValidators,\n )])))\n\n const validTransactions = txValidationResults.filter((\n [, errors],\n ) => errors.length === 0).map(([tx]) => tx) as SignedHydratedTransactionWithStorageMeta[]\n\n const invalidTransactions = txValidationResults.filter((\n [, errors],\n ) => errors.length > 0).map(([tx]) => tx) as SignedHydratedTransactionWithStorageMeta[]\n\n if (invalidTransactions.length > 0) {\n this.logger?.warn(`getPendingTransactions: Found ${invalidTransactions.length} invalid pending transactions`)\n for (const tx of invalidTransactions) {\n this.logger?.warn(tx[0]._hash)\n }\n }\n\n // Add the valid hydrated transactions to the result set.\n foundPendingTransactions.push(...validTransactions)\n }\n\n if (foundPendingTransactions.length > 0) {\n this.logger?.log(`getPendingTransactions: Found ${foundPendingTransactions.length} pending transactions`)\n for (const tx of foundPendingTransactions) {\n this.logger?.log(tx[0]._hash)\n }\n }\n\n return foundPendingTransactions\n }, BasePendingTransactionsService.MutexPriority.ReadTransactions)\n })\n }\n\n private async cleanupWorker() {\n return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {\n const lastHead = await findMostRecentBlock(this.chainArchivist)\n if (isDefined(lastHead)) await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash)\n }, BasePendingTransactionsService.MutexPriority.PurgeTransactions)\n }\n\n private async countPendingTransactions() {\n if (this._countPendingTransactionsMutex.isLocked()) return\n await this._countPendingTransactionsMutex.runExclusive(async () => {\n const payloads = (await this._curatedPendingBundledTransactionsArchivist?.all()) ?? []\n this._pendingTransactionsCount = payloads.length\n })\n }\n\n private async filterAlreadyFinalizedTransactions(\n incomingTransactions: WithStorageMeta<PayloadBundle>[],\n ): Promise<WithStorageMeta<PayloadBundle>[]> {\n const incomingTransactionHashes = incomingTransactions.map(payload => payload.root)\n const finalizedTransactions = await this.chainArchivist.get(incomingTransactionHashes)\n const finalizedTransactionHashes = new Set(finalizedTransactions.map(item => item._hash))\n const nonFinalizedTransactions = incomingTransactions.filter(item => !finalizedTransactionHashes.has(item._hash))\n return nonFinalizedTransactions\n }\n\n private async insertNewTransactions(payloads: WithStorageMeta<PayloadBundle>[]) {\n if (payloads.length === 0) return\n return await this.spanAsync('InsertNewTransactions', async () => {\n return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {\n // Check incoming transactions against finalized transactions\n const unprocessedTransactions = await this.filterAlreadyFinalizedTransactions(payloads)\n // Hydrate all unprocessed transactions\n const hydratedUnprocessedTransactions = (await Promise.all(unprocessedTransactions.map(async (tx) => {\n return await bundledPayloadToHydratedTransaction(tx)\n }))).filter(exists)\n // Filter to only valid transactions\n const validTransactions = await filterAsync(hydratedUnprocessedTransactions, async (tx) => {\n const errors = await validateTransaction(tx, { chainId: this.chainId }, [TransactionJsonSchemaValidator])\n if (errors.length > 0) {\n this.logger?.warn('validateTransaction', errors)\n }\n return errors.length > 0 ? false : true\n })\n if (validTransactions.length > 0) {\n const bundledTransactions = validTransactions.map(tx => hydratedTransactionToPayloadBundle(tx))\n await this.pendingBundledTransactionsLocalArchivist.insert(bundledTransactions)\n }\n }, BasePendingTransactionsService.MutexPriority.InsertNewTransactions)\n })\n }\n\n /**\n * Marks any included transactions in the provided payloads for removal preventing them\n * from being included in the curated pending transactions archivist and from being offered\n * during the next retrieval of pending transactions.\n * @param payloads An array of payloads that may contain transactions.\n */\n private markAnyIncludedTransactionsForRemoval(payloads: WithStorageMeta<Payload>[]) {\n const hashes = payloads.filter(isTransactionBoundWitnessWithStorageMeta).map(p => p._hash)\n for (const hash of hashes) {\n this._removablePendingTransactionHashes.add(hash)\n }\n }\n\n private async pruneCuratedPendingTransactionsArchivist(head: Hash) {\n return await this.spanAsync('pruneCuratedPendingTransactionsArchivist', async () => {\n const foundPendingTransactionsToDeleteHashes: Hash[] = []\n\n let cursor: Sequence | undefined\n let [lastHead] = filterAs(await this.chainArchivist.get([head]), x => asBlockBoundWitnessWithHashMeta(x))\n\n // Continue fetching until the desired number of transactions is reached.\n while (isDefined(lastHead)) {\n // Fetch the next batch of payloads\n const pendingBundledTransactions = await this.pendingBundledTransactionsLocalArchivist.next({\n limit: 100,\n order: 'asc',\n cursor,\n }) as WithStorageMeta<PayloadBundle>[]\n\n // Exit if no more payloads are available.\n if (pendingBundledTransactions.length === 0) {\n break\n }\n\n // Update the cursor for the next iteration to fetch subsequent payloads.\n cursor = pendingBundledTransactions.at(-1)?._sequence\n\n // Filter out bundles that are marked as removable.\n const deletedTransactionBundles = pendingBundledTransactions.filter(tx =>\n this._removablePendingTransactionHashes.has(tx.root))\n\n // Queue the hashes of deletable transactions for deletion and cleanup.\n foundPendingTransactionsToDeleteHashes.push(\n ...deletedTransactionBundles.map(tx => tx._hash).filter(exists),\n )\n\n // Keep only those payloads that are not marked for deletion.\n const undeletedTransactionBundles = pendingBundledTransactions.filter(tx =>\n !this._removablePendingTransactionHashes.has(tx.root))\n\n // Convert each undeleted payload bundle into a hydrated transaction.\n const transactions = (await Promise.all(\n undeletedTransactionBundles.map(p => bundledPayloadToHydratedTransaction(p)),\n )).filter(exists)\n\n // Find expired transactions based on the last supplied head\n const expiredTransactions = transactions.filter(isTransactionExpired(asXL1BlockNumber(lastHead.block + 1, true)))\n // Find the corresponding bundle hashes for the expired transactions\n const expiredBundleHashes = expiredTransactions\n .map(expiredHydratedTx =>\n // Find the corresponding payload bundle hash for the expired transaction\n pendingBundledTransactions.find(bundledTx => bundledTx.root === expiredHydratedTx[0]._hash)?._hash)\n .filter(exists)\n // Mark all expired bundled transactions for deletion.\n foundPendingTransactionsToDeleteHashes.push(...expiredBundleHashes)\n }\n\n // Actually delete the marked payload bundles from the archivist\n const deletedHashes = await this.pendingBundledTransactionsLocalArchivist.delete(foundPendingTransactionsToDeleteHashes)\n\n // Remove all deleted hashes from the \"pending delete\" set now that they are deleted\n for (const payload of deletedHashes) {\n this._removablePendingTransactionHashes.delete(payload._hash)\n }\n\n if (deletedHashes.length > 0) {\n this.logger?.log(`foundPendingTransactionsToDeleteHashes: Found ${deletedHashes.length} deletable transactions`)\n for (const payload of deletedHashes) {\n this.logger?.log(payload._hash)\n }\n }\n })\n }\n}\n\n/**\n * Checks if a transaction is expired for a given block.\n * @param block The block number to check against the transaction's validity period.\n * @returns True if the transaction is expired for the given block, false otherwise.\n */\nconst isTransactionExpired = (block: XL1BlockNumber) =>\n ([txBw]: SignedHydratedTransactionWithHashMeta): boolean =>\n txBw.exp < block\n\n/**\n * Checks if a transaction is active for a given block.\n * @param block The block number to check against the transaction's validity period.\n * @returns True if the transaction is active for the given block, false otherwise.\n */\nconst isTransactionActive = (block: XL1BlockNumber) =>\n ([txBw]: SignedHydratedTransactionWithHashMeta): boolean =>\n txBw.nbf <= block && txBw.exp >= block\n","import { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { PayloadBundle, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { SignedHydratedTransactionWithHashMeta } from '@xyo-network/xl1-protocol'\nimport { asSignedTransactionBoundWitnessWithHashMeta } from '@xyo-network/xl1-protocol'\n\nexport const bundledPayloadToHydratedTransaction = async (\n payload: WithStorageMeta<PayloadBundle>,\n): Promise<SignedHydratedTransactionWithHashMeta | undefined> => {\n const withHashMeta = await PayloadBuilder.addHashMeta(payload.payloads)\n const tx = asSignedTransactionBoundWitnessWithHashMeta(withHashMeta.find(p => p._hash === payload.root))\n if (tx) {\n return [tx, withHashMeta.filter(p => p._hash !== payload.root)]\n }\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { PayloadBundle } from '@xyo-network/payload-model'\nimport { PayloadBundleSchema } from '@xyo-network/payload-model'\nimport type { SignedHydratedTransactionWithHashMeta } from '@xyo-network/xl1-protocol'\nimport { flattenHydratedTransaction } from '@xyo-network/xl1-protocol-sdk'\n\nexport const hydratedTransactionToPayloadBundle = (transaction: SignedHydratedTransactionWithHashMeta): PayloadBundle => {\n const root = transaction[0]._hash\n return bundle(root, transaction)\n}\n\nconst bundle = (root: Hash, transaction: SignedHydratedTransactionWithHashMeta) => {\n const payloads = flattenHydratedTransaction(transaction).flatMap(p => PayloadBuilder.omitStorageMeta(p))\n return new PayloadBuilder<PayloadBundle>({ schema: PayloadBundleSchema })\n .fields({ payloads, root })\n .build()\n}\n","import type { Promisable } from '@xylabs/sdk-js'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport { type BlockProducerService, timeBudget } from '@xyo-network/xl1-protocol-sdk'\n\nimport { SimpleBlockRunner, type SimpleBlockRunnerParams } from '../simple/index.ts'\n\nlet serviceSingleton: Promisable<BlockProducerService> | undefined\n\nexport const initBlockProducer: Initializable<SimpleBlockRunnerParams, BlockProducerService>\n = async (params: SimpleBlockRunnerParams): Promise<BlockProducerService> => {\n if (serviceSingleton) return serviceSingleton\n return await timeBudget('initBlockProducer', params.logger, async () => {\n serviceSingleton = await SimpleBlockRunner.create(params)\n return serviceSingleton\n }, 2000, true)\n }\n","import {\n AbstractCreatable,\n Address,\n AddressZod, asHash, assertEx, creatable, CreatableParams, exists, Hex, hexToBigInt, isDefined, Promisable,\n} from '@xylabs/sdk-js'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { MemoryArchivist } from '@xyo-network/archivist-memory'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport {\n BlockRewardDiviner, FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema,\n} from '@xyo-network/chain-modules'\nimport { buildNextBlock, createDeclarationIntent } from '@xyo-network/chain-protocol'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { WithHashMeta } from '@xyo-network/payload-model'\nimport {\n AllowedBlockPayload, asBlockBoundWitness, AttoXL1, BlockBoundWitness, BlockNumberPayload, BlockNumberSchema,\n ChainId,\n ChainStakeIntent, defaultRewardRatio, SignedBlockBoundWitnessWithHashMeta,\n SignedHydratedBlockWithHashMeta, SignedHydratedTransaction, TimePayload, TimeSchema,\n Transfer, XYO_STEP_REWARD_ADDRESS,\n} from '@xyo-network/xl1-protocol'\nimport {\n AccountBalanceViewer, BlockRewardViewer, BlockRunner, Config,\n HydratedBlockStateValidationFunction,\n MempoolRunner,\n MempoolViewer,\n TimeSyncViewer,\n} from '@xyo-network/xl1-protocol-sdk'\nimport z from 'zod'\n\nimport { generateTransactionFeeTransfers } from './generateTransactionFeeTransfers.ts'\n\n/**\n * The default block size for a block\n */\nexport const DEFAULT_BLOCK_SIZE = 10\n\n/**\n * The amount of time for which a producer will restake their intent\n */\nexport const XYO_PRODUCER_REDECLARATION_DURATION = 10_000\n\n/**\n * The number of blocks within which a producer will redeclare\n * their intent to produce blocks\n */\nexport const XYO_PRODUCER_REDECLARATION_WINDOW = 500\n\nexport const SimpleBlockRunnerParamsZod = z.object({\n balanceViewer: z.object().loose(),\n blockRewardViewer: z.object().loose(),\n chainId: z.string(),\n config: z.object().loose(),\n mempoolViewer: z.object().loose(),\n mempoolRunner: z.object().loose(),\n rejectedTransactionsArchivist: z.object().loose().optional(),\n rewardAddress: AddressZod,\n time: z.object().loose(),\n validateHydratedBlockState: z.function().optional(),\n})\n\nexport type SimpleBlockRunnerParams = CreatableParams & {\n account: AccountInstance\n balanceViewer: AccountBalanceViewer\n blockRewardViewer: BlockRewardViewer\n chainId: ChainId\n config: Config\n mempoolRunner: MempoolRunner\n mempoolViewer: MempoolViewer\n rejectedTransactionsArchivist?: ArchivistInstance\n rewardAddress: Address\n time: TimeSyncViewer\n validateHydratedBlockState?: HydratedBlockStateValidationFunction\n}\n\n@creatable()\nexport class SimpleBlockRunner extends AbstractCreatable<SimpleBlockRunnerParams> implements BlockRunner {\n protected _blockRewardDiviner: BlockRewardDiviner | undefined\n protected _lastRedeclarationBlock: number | undefined\n protected _rejectedTransactionsArchivist: ArchivistInstance | undefined\n\n /**\n * The default block size for a block\n */\n static get DefaultBlockSize(): number {\n return DEFAULT_BLOCK_SIZE\n }\n\n /**\n * The amount of time for which the producer will redeclare\n * their intent to continue producing blocks\n */\n static get RedeclarationDuration(): number {\n return XYO_PRODUCER_REDECLARATION_DURATION\n }\n\n /**\n * The number of blocks within which the producer will redeclare\n * their intent to continue producing blocks\n */\n static get RedeclarationWindow(): number {\n return XYO_PRODUCER_REDECLARATION_WINDOW\n }\n\n get address() {\n return this.account.address\n }\n\n protected get account() {\n return assertEx(this.params.account, () => 'account is required')\n }\n\n protected get balanceViewer() {\n return assertEx(this.params.balanceViewer, () => 'balanceViewer is required')\n }\n\n protected get blockRewardViewer() {\n return assertEx(this.params.blockRewardViewer, () => 'blockRewardViewer is required')\n }\n\n protected get chainId() {\n return assertEx(this.params.chainId, () => 'chainId is required')\n }\n\n // protected get electionService() {\n // return assertEx(this.params.electionService, () => 'electionService is required')\n // }\n\n protected get mempoolRunner() {\n return assertEx(this.params.mempoolRunner, () => 'mempoolRunner is required')\n }\n\n protected get mempoolViewer() {\n return assertEx(this.params.mempoolViewer, () => 'mempoolViewer is required')\n }\n\n // protected get pendingTransactionsService() {\n // return assertEx(this.params.pendingTransactionsService, () => 'Missing pendingTransactionsService')\n // }\n\n protected get rejectedTransactionsArchivist() {\n return this._rejectedTransactionsArchivist!\n }\n\n protected get rewardAddress(): Address {\n return assertEx(this.params.rewardAddress, () => 'No reward address provided')\n }\n\n // protected get stakeIntentService(): StakeIntentService {\n // return assertEx(this.params.stakeIntentService, () => 'No StakeIntentService provided')\n // }\n\n protected get time(): TimeSyncViewer {\n return assertEx(this.params.time, () => 'No TimeSyncViewer provided')\n }\n\n // protected get validateHydratedBlockState() {\n // return assertEx(this.params.validateHydratedBlockState, () => 'validateHydratedBlockState is required')\n // }\n\n static override async paramsHandler(params?: Partial<SimpleBlockRunnerParams> | undefined): Promise<SimpleBlockRunnerParams> {\n // TODO: Use a real zod and move the zod check to the AbstractCreatable class\n SimpleBlockRunnerParamsZod.parse(params)\n const rejectedTransactionsArchivist = params?.rejectedTransactionsArchivist ?? await MemoryArchivist.create()\n return {\n ...(await super.paramsHandler(params)), ...params, rejectedTransactionsArchivist,\n } as SimpleBlockRunnerParams\n }\n\n async next(head: WithHashMeta<BlockBoundWitness>): Promise<SignedHydratedBlockWithHashMeta | undefined> {\n // If the block is for another chain, ignore\n if (head.chain !== this.chainId) return\n // const leadersStart = Date.now()\n // const leaders = await this.electionService.getCreatorCommitteeForNextBlock(head)\n // const leadersDuration = Date.now() - leadersStart\n // if (leadersDuration > 100) {\n // this.logger?.warn(`[Slow] Fetched leaders in ${leadersDuration}ms: ${leaders.map(l => l.slice(0, 6)).join(', ')}`)\n // }\n // TODO: Should we propose block if creator committee is empty?\n // TODO: Handle the case where we're not the 1st leader but they're not responding\n // at a higher level than here as that's a network issue\n // if (!leaders.includes(this.address)) return\n return await this.proposeNextValidBlock(head)\n }\n\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force: true): Promise<SignedHydratedBlockWithHashMeta>\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force?: false): Promise<SignedHydratedBlockWithHashMeta | undefined>\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force?: boolean): Promise<SignedHydratedBlockWithHashMeta | undefined> {\n assertEx(head.chain === this.chainId, () => 'Block chain ID does not match')\n const result = await this.proposeNextValidBlock(head)\n return force ? assertEx(result, () => 'Failed to produce next block') : result\n }\n\n protected async getBlockRewardTransfers(block: number): Promise<Transfer[]> {\n if (!this._blockRewardDiviner) {\n // TODO: Adjust to allow for genesis block reward vs. normal block reward\n this._blockRewardDiviner = await FixedPercentageBlockRewardDiviner.create({\n account: 'random',\n blockRewardViewer: this.blockRewardViewer,\n config: {\n rewardAddress: this.rewardAddress,\n rewardPercentageRatio: defaultRewardRatio,\n schema: FixedPercentageBlockRewardDivinerConfigSchema,\n },\n })\n }\n\n const blockId = new PayloadBuilder<BlockNumberPayload>({ schema: BlockNumberSchema }).fields({ block }).build()\n const rewards = await this._blockRewardDiviner.divine([blockId])\n return rewards as Transfer[]\n }\n\n /**\n * Handles the producer redeclaration logic\n * @param head The current head block\n * @returns chain stake intent for the producer redeclaration, or undefined if no redeclaration is needed\n */\n protected getProducerRedeclaration(head: WithHashMeta<BlockBoundWitness>): Promisable<ChainStakeIntent | undefined> {\n // TODO: Do not redeclare on every block\n // Decide if we should redeclare intent\n if (this.params.config.producer.disableIntentRedeclaration) return\n // Decide if we need to redeclare intent\n // const ranges = await this.stakeIntentService.getDeclaredCandidateRanges(this.address, 'producer')\n // TODO: This doesn't handle the case where the producer had declared a range for the future\n // but we're in a range that's not the future\n // Sort in ascending order based on ending range to get range with highest ending block\n // const lastRange = ranges.toSorted((a, b) => a[1] > b[1] ? 1 : -1).at(-1)\n // if (!lastRange) return\n // const [, currentDeclarationEnd] = lastRange\n const currentBlock = head.block\n // const timeToProducerExpiration = currentDeclarationEnd - currentBlock\n // if (timeToProducerExpiration > BaseBlockProducerService.RedeclarationWindow) return\n return createDeclarationIntent(this.address, 'producer', currentBlock, currentBlock + SimpleBlockRunner.RedeclarationDuration)\n }\n\n protected async proposeNextValidBlock(head: WithHashMeta<BlockBoundWitness>, validateBalances = false, force = false) {\n return await this.spanAsync('proposeNextValidBlock', async () => {\n // Calculate the next block components\n const { block: previousBlock } = assertEx(asBlockBoundWitness(head), () => 'Invalid head block')\n const nextBlock = previousBlock + 1\n const nextBlockTransactionsStart = Date.now()\n const nextBlockTransactions = await this.mempoolViewer.pendingTransactions({ limit: SimpleBlockRunner.DefaultBlockSize })\n const nextBlockTransactionsDuration = Date.now() - nextBlockTransactionsStart\n if (nextBlockTransactionsDuration > 200) {\n this.logger?.warn(`[Slow] Fetched ${nextBlockTransactions.length} pending transactions in ${nextBlockTransactionsDuration}ms}`)\n }\n\n const blockPayloads: AllowedBlockPayload[] = []\n\n // Calculate the optional producer redeclaration and add it if necessary\n const producerRedeclarationPayload = await this.getProducerRedeclaration(head)\n if (producerRedeclarationPayload) blockPayloads.push(producerRedeclarationPayload)\n\n // If there are no transactions, no payloads and no heartbeat required, we don't need to create a block\n if (blockPayloads.length === 0 && nextBlockTransactions.length === 0 && !this.heartbeatRequired(head) && !force) return\n\n // Calculate the optional block reward transfer and add if necessary\n const rewardTransferPayloads = await this.getBlockRewardTransfers(nextBlock)\n blockPayloads.push(...rewardTransferPayloads)\n\n const transactionTransfers = await generateTransactionFeeTransfers(this.address, nextBlockTransactions)\n const timeStart = Date.now()\n const timePayload = await this.generateTimePayload(head)\n const timeDuration = Date.now() - timeStart\n if (timeDuration > 100) {\n this.logger?.warn(`[Slow] Generated time payload in ${timeDuration}ms`)\n }\n\n const [fundedNextBlockTransactions, fundedTransfers] = await this.filterByFunded(head, nextBlockTransactions, transactionTransfers, validateBalances)\n\n blockPayloads.push(...fundedTransfers, timePayload)\n\n // Build the block\n this.logger?.info(`Building block ${head.block + 1}`)\n const startBuild = Date.now()\n const stepRewardPoolBalance = (await this.balanceViewer.accountBalances([XYO_STEP_REWARD_ADDRESS]))[XYO_STEP_REWARD_ADDRESS]\n const block = await buildNextBlock(head, fundedNextBlockTransactions, blockPayloads, [this.account], XYO_STEP_REWARD_ADDRESS, stepRewardPoolBalance)\n\n this.logger?.info(\n `Built block ${block[0].block} in ${Date.now() - startBuild}ms with ${block[1].length} payloads`,\n )\n\n // this.logger?.info(`Validating block ${block[0].block} with ${block[1].length} payloads`)\n // const startValidate = Date.now()\n // const errors = await this.validateHydratedBlockState(block, this.chainId, { accountBalance: this.balanceViewer })\n // this.logger?.info(`Validated block ${block[0].block} in ${Date.now() - startValidate}ms with ${block[1].length} payloads`)\n\n // if (errors.length > 0) {\n // this.logger?.warn(`Validation of produced block failed: ${errors.at(0)?.message}`)\n // const rejectedTransactions = block[1]\n // await this.rejectedTransactionsArchivist.insert(rejectedTransactions)\n // } else {\n await this.mempoolRunner.submitBlocks([block])\n return block\n // }\n })\n }\n\n // remove unfunded transactions and block transfers\n private async filterByFunded(\n head: WithHashMeta<BlockBoundWitness>,\n txs: SignedHydratedTransaction[],\n transfers: Transfer[],\n validateBalances = false,\n ): Promise<[SignedHydratedTransaction[], Transfer[]]> {\n const fundedTransfers: Transfer[] = []\n const fundedTransactions = (await Promise.all(txs.map(async (tx) => {\n const transfer: Transfer | undefined = transfers.find(transfer => transfer.from === tx[0].from)\n if (!transfer) return\n const totalTransferCost = Object.values(transfer?.transfers).reduce((acc, t) => acc + hexToBigInt(t ?? '00' as Hex), 0n)\n if (validateBalances) {\n const balance = (await this.balanceViewer.accountBalances([transfer.from]))[transfer.from] ?? AttoXL1(0n)\n if (balance >= totalTransferCost) {\n fundedTransfers.push(transfer)\n return tx\n }\n } else {\n fundedTransfers.push(transfer)\n return tx\n }\n }))).filter(exists)\n return [fundedTransactions, fundedTransfers]\n }\n\n private async generateTimePayload(head: WithHashMeta<BlockBoundWitness>) {\n const [ethereum, ethHashOrNull] = await this.time.currentTimeAndHash('ethereum')\n const ethereumHash = asHash(ethHashOrNull, () => 'No ethereum hash available from time sync service')\n const timePayload: TimePayload = {\n schema: TimeSchema,\n // this is for the previous block\n xl1: head.block,\n // this is for the previous block\n xl1Hash: head._hash,\n ethereum,\n ethereumHash,\n epoch: Date.now(),\n }\n return timePayload\n }\n\n /**\n * Check if a heartbeat block is required based on network activity.\n * @param head The current head block\n * @returns True if a heartbeat is required, false otherwise\n */\n private heartbeatRequired(head: WithHashMeta<BlockBoundWitness>): boolean {\n const epoch = head.$epoch\n if (isDefined(epoch)) {\n const { heartbeatInterval } = this.params.config.producer\n if (Date.now() - epoch > heartbeatInterval) {\n return true\n }\n }\n return false\n }\n}\n","import { type Address, hexFromBigInt } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n SignedHydratedTransaction,\n Transfer,\n XL1,\n} from '@xyo-network/xl1-protocol'\nimport { TransferSchema, XYO_ZERO_ADDRESS } from '@xyo-network/xl1-protocol'\nimport { transactionRequiredGas } from '@xyo-network/xl1-protocol-sdk'\nimport { HydratedTransactionWrapper } from '@xyo-network/xl1-wrappers'\n\nexport async function generateTransactionFeeTransfers(address: Address, transactions: SignedHydratedTransaction[]): Promise<Transfer[]> {\n const txs = await Promise.all(transactions.map(async (tx) => {\n return HydratedTransactionWrapper.parse([await PayloadBuilder.addStorageMeta(tx[0]), await PayloadBuilder.addStorageMeta(tx[1])])\n }))\n\n // merge transactions with the same from address\n const txBaseFeeCosts: Record<Address, bigint> = {}\n for (const tx of txs) {\n txBaseFeeCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n)\n + tx.fees.base\n }\n\n const txGasCosts: Record<Address, bigint> = {}\n for (const tx of txs) {\n const requiredGas = transactionRequiredGas(tx.data)\n const totalGasCost = requiredGas * tx.fees.gasPrice\n txGasCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n)\n + totalGasCost\n }\n\n // generate actual Transfer Payloads & burn the base fee\n const payloads = (Object.entries(txBaseFeeCosts) as [Address, XL1][]).map(([from, amount]) => {\n const payload: Transfer = {\n schema: TransferSchema,\n epoch: Date.now(),\n from,\n transfers: {\n // burn the base fee\n [XYO_ZERO_ADDRESS]: hexFromBigInt(amount),\n },\n }\n return payload\n })\n\n // transfer gas cost to producer\n for (const [from, amount] of Object.entries(txGasCosts)) {\n // every gas from should also be a base fee from\n const fromPayload = assertEx(payloads.find(p => p.from === from), () => 'from payload not found')\n fromPayload.transfers[address] = hexFromBigInt(amount)\n }\n\n return payloads\n}\n","import type { Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport type {\n BlockRewardViewer, ChainContractViewer, Config, SimpleBlockRewardViewerParams,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { SimpleBlockRewardViewer, timeBudget } from '@xyo-network/xl1-protocol-sdk'\n\nimport { EvmBlockRewardViewer, type EvmBlockRewardViewerParams } from '../BlockReward/index.ts'\nimport { canUseEvmProvider, initEvmProvider } from './evm/index.ts'\n\nlet rewardServiceSingleton: Promise<BlockRewardViewer> | undefined\n\nexport const initBlockRewardViewer: Initializable<\n Partial<SimpleBlockRewardViewerParams> & {\n chainContractViewer: ChainContractViewer\n config: Pick<Config, 'evm'>\n },\n BlockRewardViewer\n> = (params): Promise<BlockRewardViewer> => {\n if (rewardServiceSingleton) return rewardServiceSingleton\n return timeBudget('initBlockRewardViewer', params.logger, () => {\n const { config } = params\n rewardServiceSingleton = canUseEvmBlockRewardViewer({ config })\n ? initEvmBlockRewardViewer(params)\n : initXyoBlockRewardViewer(params as SimpleBlockRewardViewerParams)\n return rewardServiceSingleton\n }, 2000, true)\n}\n\nexport const initXyoBlockRewardViewer = (params: SimpleBlockRewardViewerParams): Promise<BlockRewardViewer> => {\n if (rewardServiceSingleton) return rewardServiceSingleton\n return timeBudget('initXyoBlockRewardViewer', params.logger, () => {\n rewardServiceSingleton = SimpleBlockRewardViewer.create(params)\n return rewardServiceSingleton\n }, 2000, true)\n}\n\nconst canUseEvmBlockRewardViewer = (params: { config: Pick<Config, 'evm'> }) => canUseEvmProvider({ config: params.config })\n\nexport const initEvmBlockRewardViewer = async (params: ({\n chainContractViewer: ChainContractViewer\n config: Pick<Config, 'evm'>\n logger?: Logger\n})): Promise<BlockRewardViewer> => {\n if (rewardServiceSingleton) return rewardServiceSingleton\n return await timeBudget('initEvmBlockRewardViewer', params.logger, async () => {\n const provider = assertEx(await initEvmProvider(params))\n const evmBlockRewardViewerParams: EvmBlockRewardViewerParams = { ...params, provider }\n rewardServiceSingleton = EvmBlockRewardViewer.create(evmBlockRewardViewerParams)\n return rewardServiceSingleton\n }, 2000, true)\n}\n","import type { Promisable } from '@xylabs/sdk-js'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport { timeBudget, type TimeSyncViewer } from '@xyo-network/xl1-protocol-sdk'\nimport type { Config } from 'cosmiconfig'\n\nimport { type BaseTimeServiceParams, BaseTimeSyncService } from '../Time/index.ts'\nimport { canUseEvmProvider, initEvmProvider } from './evm/index.ts'\n\nlet timeSyncServiceSingleton: Promisable<TimeSyncViewer> | undefined\n\nexport const initTimeService: Initializable<BaseTimeServiceParams<Pick<Config, 'evm'>>, TimeSyncViewer> = async ({\n blockViewer, config, logger, meterProvider, traceProvider,\n}) => {\n if (timeSyncServiceSingleton) return timeSyncServiceSingleton\n\n return await timeBudget('initTimeService', logger, async () => {\n // Configure provider for optional Ethereum time sync\n const ethProvider = canUseEvmProvider({ config }) ? await initEvmProvider({ config }) : undefined\n\n // Create service\n timeSyncServiceSingleton = BaseTimeSyncService.create({\n blockViewer, ethProvider, logger, meterProvider, traceProvider,\n })\n return await timeSyncServiceSingleton\n }, 2000, true)\n}\n","import { creatable, EmptyObject } from '@xylabs/sdk-js'\nimport { TimeDomain, TimePayload } from '@xyo-network/xl1-protocol'\nimport {\n BlockViewer,\n SimpleTimeSyncViewer, TimeSyncViewer,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { Provider } from 'ethers'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseTimeServiceParams<TConfig extends EmptyObject = EmptyObject> extends BaseServiceParams<TConfig> {\n blockViewer: BlockViewer\n ethProvider?: Provider\n}\n\n@creatable()\nexport class BaseTimeSyncService extends BaseService<BaseTimeServiceParams> implements TimeSyncViewer {\n protected timeSyncViewer!: TimeSyncViewer\n\n protected get blockViewer() {\n return this.params.blockViewer\n }\n\n protected get ethProvider() {\n return this.params.ethProvider\n }\n\n async convertTime(fromDomain: TimeDomain, toDomain: TimeDomain, from: number): Promise<number> {\n return await this.timeSyncViewer.convertTime(fromDomain, toDomain, from)\n }\n\n override async createHandler(): Promise<void> {\n await super.createHandler()\n this.timeSyncViewer = new SimpleTimeSyncViewer(this.blockViewer, this.ethProvider)\n }\n\n async currentTime(domain: TimeDomain): Promise<[string, number]> {\n return await this.timeSyncViewer.currentTime(domain)\n }\n\n async currentTimeAndHash(domain: TimeDomain): Promise<[number, string | null]> {\n return await this.timeSyncViewer.currentTimeAndHash(domain)\n }\n\n async currentTimePayload(): Promise<TimePayload> {\n return await this.timeSyncViewer.currentTimePayload()\n }\n}\n","import type { Promisable } from '@xylabs/sdk-js'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport type { BlockProducerService } from '@xyo-network/xl1-protocol-sdk'\n\nimport type { SimpleBlockRunnerParams } from '../simple/index.ts'\nimport { initBlockProducer } from './producer.ts'\n\nlet serviceSingleton: Promisable<BlockProducerService> | undefined\n\nexport const initValidator: Initializable<SimpleBlockRunnerParams, BlockProducerService>\n = (params: SimpleBlockRunnerParams): Promisable<BlockProducerService> => {\n if (serviceSingleton) return serviceSingleton\n serviceSingleton = initBlockProducer(params)\n return serviceSingleton\n }\n","import {\n Address, creatable, Promisable,\n} from '@xylabs/sdk-js'\nimport { ReadArchivist } from '@xyo-network/archivist-model'\nimport {\n StepIdentity,\n StepIdentityString,\n} from '@xyo-network/xl1-protocol'\nimport { EventingChainBlockNumberIteratorService, NetworkStakeStepRewardService } from '@xyo-network/xl1-protocol-sdk'\nimport { Provider } from 'ethers'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseNetworkStakeStepRewardServiceParams extends BaseServiceParams {\n chainArchivist: ReadArchivist\n chainIterator: EventingChainBlockNumberIteratorService\n ethProvider?: Provider\n}\n\n@creatable()\nexport class BaseNetworkStakeStepRewardService extends BaseService<BaseNetworkStakeStepRewardServiceParams> implements NetworkStakeStepRewardService {\n networkStakeStepRewardAddressHistory(_address: Address): Promisable<Record<Address, bigint>> {\n throw new Error('Method [networkStakeStepRewardAddressHistory] not implemented.')\n }\n\n networkStakeStepRewardAddressReward(_context: StepIdentity, _address: Address): Promisable<Record<Address, bigint>> {\n throw new Error('Method [networkStakeStepRewardAddressReward] not implemented.')\n }\n\n networkStakeStepRewardAddressShare(_context: StepIdentity, _address: Address): Promisable<[bigint, bigint]> {\n throw new Error('Method [networkStakeStepRewardAddressShare] not implemented.')\n }\n\n networkStakeStepRewardClaimedByAddress(_address: Address): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardClaimedByAddress] not implemented.')\n }\n\n networkStakeStepRewardForPosition(_position: number, _range: [number, number]): Promisable<[bigint, bigint]> {\n throw new Error('Method [networkStakeStepRewardForPosition] not implemented.')\n }\n\n networkStakeStepRewardForStep(_context: StepIdentity): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardForStep] not implemented.')\n }\n\n networkStakeStepRewardForStepForPosition(_context: StepIdentity, _position: number): Promisable<[bigint, bigint]> {\n throw new Error('Method [networkStakeStepRewardForStepForPosition] not implemented.')\n }\n\n networkStakeStepRewardPoolRewards(_context: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method [networkStakeStepRewardPoolRewards] not implemented.')\n }\n\n networkStakeStepRewardPoolShares(_context: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method [networkStakeStepRewardPoolShares] not implemented.')\n }\n\n networkStakeStepRewardPositionWeight(_context: StepIdentity, _position: number): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardPositionWeight] not implemented.')\n }\n\n networkStakeStepRewardPotentialPositionLoss(_context: StepIdentity, _position: number): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardPotentialPositionLoss] not implemented.')\n }\n\n networkStakeStepRewardRandomizer(_context: StepIdentity): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardRandomizer] not implemented.')\n }\n\n networkStakeStepRewardStakerCount(_context: StepIdentity): Promisable<number> {\n throw new Error('Method [networkStakeStepRewardStakerCount] not implemented.')\n }\n\n networkStakeStepRewardUnclaimedByAddress(_address: Address): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardUnclaimedByAddress] not implemented.')\n }\n\n networkStakeStepRewardWeightForAddress(_context: StepIdentity, _address: Address): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardWeightForAddress] not implemented.')\n }\n\n networkStakeStepRewardsForPosition(_position: number, _range: [number, number]): Promisable<Record<StepIdentityString, [bigint, bigint]>> {\n throw new Error('Method [networkStakeStepRewardsForPosition] not implemented.')\n }\n\n networkStakeStepRewardsForRange(_range: [number, number]): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardsForRange] not implemented.')\n }\n\n networkStakeStepRewardsForStepLevel(_stepLevel: number, _range: [number, number]): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardsForStepLevel] not implemented.')\n }\n}\n","import { creatable, Hash } from '@xylabs/sdk-js'\nimport { spanRootAsync } from '@xylabs/telemetry'\nimport { Schema } from '@xyo-network/payload-model'\nimport {\n SchemasService,\n SchemasStepSummaryContext,\n schemasSummary,\n} from '@xyo-network/xl1-protocol-sdk'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseSchemasServiceParams extends BaseServiceParams {\n context: SchemasStepSummaryContext\n}\n\n@creatable()\nexport class BaseSchemasService extends BaseService<BaseSchemasServiceParams> implements SchemasService {\n async schema(head: Hash, schema: Schema): Promise<number> {\n return (await this.schemas(head, [schema]))[schema] ?? 0\n }\n\n async schemas(head: Hash, schemas: Schema[]): Promise<Partial<Record<Schema, number>>> {\n return await spanRootAsync('transfers', async () => {\n const [summary] = await schemasSummary(this.params.context)\n const result: Record<Schema, number> = {}\n for (const schema of schemas) {\n const count = summary[schema] ?? 0\n result[schema] = count\n }\n return result\n })\n }\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport { exists, filterAs } from '@xylabs/sdk-js'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { payloadSchemasContains } from '@xyo-network/boundwitness-validator'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport type {\n BlockBoundWitness, ChainStakeIntent, Intent,\n} from '@xyo-network/xl1-protocol'\nimport { asChainStakeIntent, ChainStakeIntentSchema } from '@xyo-network/xl1-protocol'\n\nexport const getBlockSignedStakeDeclarations = async (block: BlockBoundWitness, archivist: ArchivistInstance, intent: Intent): Promise<ChainStakeIntent[]> => {\n // Get payloads in block\n const blockData = await archivist.get(block.payload_hashes)\n // Filter Payloads in block to BoundWitnesses\n const bwsFromBlock = blockData.filter(x => isBoundWitness(x))\n // Filter to BoundWitnesses with StakeIntent payloads\n const bwsFromBlockWithDeclarations = bwsFromBlock.filter(bw => payloadSchemasContains(bw, ChainStakeIntentSchema))\n // Filter to only valid signed BWs\n const validBlockBwsWithDeclarations = await filterToValidSignedBoundWitnesses(bwsFromBlockWithDeclarations)\n return (await Promise.all(validBlockBwsWithDeclarations.map(async (bw) => {\n // Get staked intent hashes from signed declarations\n const stakeIntentHashes = validBlockBwsWithDeclarations\n .flatMap(mapBoundWitnessToStakeIntentHashes)\n .filter(exists)\n // Get staked intent payloads\n const payloads = await archivist.get(stakeIntentHashes)\n // Filter payloads to staked intents\n const stakeIntents = filterAs(payloads, asChainStakeIntent)\n // that are producers\n .filter(p => p.intent === intent)\n // where the issuer of the intent is also the signer of this BW\n .filter(p => bw.addresses.includes(p.from))\n\n return stakeIntents\n }))).flat()\n}\n\nconst filterToValidSignedBoundWitnesses = async (bws: BoundWitness[]): Promise<BoundWitness[]> => {\n const validBwIndexes = await Promise.all(bws.map(bw => BoundWitnessWrapper.parse(bw).getValid()))\n return bws.filter((_, index) => validBwIndexes[index])\n}\n\nconst mapBoundWitnessToStakeIntentHashes = (bw: BoundWitness): (Hash | undefined)[] => {\n return bw.payload_schemas.map((schema, index) => schema === ChainStakeIntentSchema ? bw.payload_hashes[index] : undefined)\n}\n","import {\n Address, asAddress, assertEx, creatable, filterAs, Hash,\n isUndefined,\n} from '@xylabs/sdk-js'\nimport { ArchivistInstance, ArchivistNextOptions } from '@xyo-network/archivist-model'\nimport {\n analyzeChain, ChainStakeIntentAnalyzer,\n isChainSummaryStakeIntent,\n} from '@xyo-network/chain-analyze'\nimport {\n DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS,\n findFirstMatching, IntervalMap,\n SerializedIntervalMap,\n} from '@xyo-network/chain-utils'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport {\n asBlockBoundWitness, asBlockBoundWitnessWithStorageMeta, asChainStakeIntent, type Intent,\n} from '@xyo-network/xl1-protocol'\nimport {\n asChainIndexingServiceStateWithStorageMeta,\n BlockViewer,\n ChainIndexingServiceState, ChainIndexingServiceStateSchema, ChainStakeViewer,\n Config,\n isChainIndexingServiceState,\n readPayloadMapFromStore,\n StakeIntentService,\n timeBudget,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\nimport { LRUCache } from 'lru-cache'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface XyoStakeIntentServiceParams extends BaseServiceParams<Pick<Config, 'producer'>> {\n blockViewer: BlockViewer\n chainArchivist: ArchivistInstance\n chainStakeViewer: ChainStakeViewer\n stakeIntentStateArchivist: ArchivistInstance\n}\n\n/**\n * The number of blocks to periodically persist state\n */\n// const STATE_PERSISTENCE_INTERVAL = 60n\n\nconst ACTIVE_STAKE_TTL = 1000 * 60 * 60 * 2 // 2 hours in milliseconds\nconst NO_ACTIVE_STAKE_TTL = 1000 * 2 // 2 seconds in milliseconds\nconst STAKE_CACHE_MAX_ENTRIES = 10_000\n\n@creatable()\nexport class XyoStakeIntentService extends BaseService<XyoStakeIntentServiceParams> implements StakeIntentService {\n // TODO: Use hash instead of block number to handle chain reorgs\n protected _lastIndexedBlockHash: Hash | undefined = undefined\n // TODO: Interval tree per declaration (bank, validator, etc.)\n\n // Ideally move to DataIntervalTree to handle declared\n // ranges as it enables range queries in O(min(n, k * log n)) time,\n // where k is the number of intervals in the output list time\n // Currently using set based because it's simpler, equivalent\n // in performance for small sets, and (most importantly) easily\n // persisted so we can recover state on restart.\n protected _producers: IntervalMap<Address> = new IntervalMap()\n protected _stakeCache = new LRUCache<Address, bigint>({ max: STAKE_CACHE_MAX_ENTRIES })\n protected _updateMutex = new Mutex()\n\n protected get blockViewer() {\n return this.params.blockViewer\n }\n\n protected get chainArchivist() {\n return assertEx(this.params.chainArchivist!, () => 'chainArchivist not set')\n }\n\n protected get chainStakeViewer() {\n return assertEx(this.params.chainStakeViewer!, () => 'chainStakeViewer not set')\n }\n\n protected get stakeIntentStateArchivist() {\n return assertEx(this.params.stakeIntentStateArchivist!, () => 'stakeIntentStateArchivist not set')\n }\n\n static override async paramsHandler(params?: Partial<XyoStakeIntentServiceParams>): Promise<XyoStakeIntentServiceParams> {\n return {\n ...await super.paramsHandler(params),\n blockViewer: assertEx(params?.blockViewer, () => 'blockViewer is required'),\n chainArchivist: assertEx(params?.chainArchivist, () => 'chainArchivist is required'),\n chainStakeViewer: assertEx(params?.chainStakeViewer, () => 'chainStakeViewer is required'),\n stakeIntentStateArchivist: assertEx(params?.stakeIntentStateArchivist, () => 'stakeIntentStateArchivist is required'),\n } as XyoStakeIntentServiceParams\n }\n\n override async createHandler() {\n const head = await this.blockViewer.currentBlock()\n if (isUndefined(head)) return\n await this.recoverState(head[0]._hash)\n }\n\n async getDeclaredCandidateRanges(address: Address, intent: Intent): Promise<Readonly<Readonly<[number, number]>[]>> {\n await Promise.resolve()\n assertEx(intent === 'producer', () => `Support not yet added for intent ${intent}`)\n const results = this._producers.get(address)\n return results ?? []\n }\n\n async getDeclaredCandidatesForBlock(block: number, intent: Intent): Promise<Address[]> {\n return await this.spanAsync('getDeclaredCandidatesForBlock', async () => {\n assertEx(intent === 'producer', () => `Support not yet added for intent ${intent}`)\n const results = this._producers.findAllContaining(block)\n const candidates = [...results]\n const requiredMinimumStake = this.getRequiredMinimumStakeForIntent(intent)\n const validCandidates = await this.filterToValidStake(candidates, this.chainStakeViewer, requiredMinimumStake)\n return validCandidates\n })\n }\n\n getRequiredMinimumStakeForIntent(intent: Intent): bigint {\n switch (intent) {\n case 'producer': {\n const { minStake } = this.params.config.producer\n return BigInt(minStake)\n }\n }\n }\n\n async isStakedForBlock(block: number, intent: Intent, address: Address): Promise<boolean> {\n const candidates = await this.getDeclaredCandidatesForBlock(block, intent)\n return candidates.includes(address)\n }\n\n override async startHandler(): Promise<void> {\n await this.updateIndex(true)\n }\n\n private async filterToValidStake(\n candidates: Address[],\n chainStakeViewer: ChainStakeViewer,\n requiredMinimumStake: bigint,\n ): Promise<Address[]> {\n type CandidateStake = { candidate: Address; stake: bigint }\n\n // Find the stake for each candidate\n const candidatesWithStake: CandidateStake[] = await Promise.all(\n candidates.map(async (candidate) => {\n // Check if the stake is already cached\n const stake = this._stakeCache.get(candidate)\n if (stake === undefined) {\n // Fetch from chainStakeViewer if not cached\n const activeStake = await chainStakeViewer.activeByStaked(candidate)\n if (activeStake > 0n) {\n // Store result in cache\n this._stakeCache.set(candidate, activeStake, { ttl: ACTIVE_STAKE_TTL })\n } else {\n this._stakeCache.set(candidate, activeStake, { ttl: NO_ACTIVE_STAKE_TTL })\n }\n return { candidate, stake: activeStake }\n } else {\n return { candidate, stake }\n }\n }),\n )\n\n // Filter out candidates whose stake is greater than or equal to the required minimum\n return candidatesWithStake\n .filter(({ stake }) => stake >= requiredMinimumStake)\n .map(({ candidate }) => candidate)\n }\n\n private async persistState(current: Hash): Promise<void> {\n const state = this._producers.serialize()\n const payload = new PayloadBuilder<ChainIndexingServiceState<SerializedIntervalMap>>({ schema: ChainIndexingServiceStateSchema })\n .fields({ endBlockHash: current, state })\n .build()\n await this.stakeIntentStateArchivist.insert([payload])\n }\n\n private async recoverState(current: Hash): Promise<void> {\n return await timeBudget('XyoStakeIntentService.recoverState', console, async () => {\n const currentBlock = assertEx(asBlockBoundWitness((await this.chainArchivist.get([current]))?.[0]), () => `Block ${current} not found`)\n const currentBlockNum = currentBlock.block\n // Find last state before current head (in case of rollback, we indexed past it on an uncle chain, etc.)\n const opts: ArchivistNextOptions = { ...DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS }\n while (true) {\n const predicate = (p: WithStorageMeta<Payload>) => {\n const state = asChainIndexingServiceStateWithStorageMeta(p)\n return state ? true : false\n }\n const state = await findFirstMatching(this.stakeIntentStateArchivist, predicate, opts)\n if (isChainIndexingServiceState<SerializedIntervalMap>(state)) {\n const indexed = (await this.chainArchivist.get([state.endBlockHash]))?.[0]\n const indexedBlock = asBlockBoundWitnessWithStorageMeta(indexed)\n if (indexedBlock) {\n const indexedBlockNum = indexedBlock.block\n if (indexedBlockNum <= currentBlockNum) {\n const data = state.state as SerializedIntervalMap\n this._producers = new IntervalMap(data)\n this._lastIndexedBlockHash = indexedBlock._hash\n break\n }\n }\n } else {\n // No state found, start from genesis\n break\n }\n opts.open = true\n }\n }, 2000, true)\n }\n\n private async updateIndex(displayProgress = false): Promise<void> {\n if (this._updateMutex.isLocked()) {\n return\n }\n await this._updateMutex.runExclusive(async () => {\n return await this.spanAsync('updateIndex', async () => {\n const currentHead = (await this.blockViewer.currentBlock())[0]\n if (isUndefined(currentHead)) return\n return await timeBudget('XyoStakeIntentService.updateIndex', console, async () => {\n const currentHeadHash = currentHead._hash\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(this.chainArchivist)\n const result = await analyzeChain({ chainMap }, [new ChainStakeIntentAnalyzer('producer')], currentHeadHash, this._lastIndexedBlockHash)\n const signedDeclarations = filterAs(result.find(isChainSummaryStakeIntent)?.intents ?? [], asChainStakeIntent)\n if (currentHead.block === undefined) return\n const currentHeadBlockNum = currentHead.block\n if (displayProgress) this.logger?.log(`Updating index through 0x${currentHeadBlockNum}`)\n for (const signedDeclaration of signedDeclarations) {\n const { exp, nbf } = signedDeclaration\n const start = nbf\n const stop = exp\n const address = asAddress(signedDeclaration?.from)\n if (start !== undefined && stop !== undefined && address !== undefined) {\n this._producers.insert(address, start, stop)\n }\n }\n /*\n if (index % STATE_PERSISTENCE_INTERVAL === 0n) {\n if (displayProgress) this.logger?.info(`Persisting state at block ${index}`)\n await this.persistState(await PayloadBuilder.hash(block))\n }\n */\n this._lastIndexedBlockHash = currentHeadHash\n }, 2000, true)\n })\n })\n }\n}\n","import {\n Address, creatable, Promisable,\n} from '@xylabs/sdk-js'\nimport { ReadArchivist } from '@xyo-network/archivist-model'\nimport { StepIdentity } from '@xyo-network/xl1-protocol'\nimport { StepStakeViewer } from '@xyo-network/xl1-protocol-sdk'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseStepStakeServiceParams extends BaseServiceParams {\n chainArchivist: ReadArchivist\n}\n\n@creatable()\nexport class BaseStepStakeService extends BaseService<BaseStepStakeServiceParams> implements StepStakeViewer {\n stepStake(_step: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method [stepStake] not implemented.')\n }\n\n stepStakeForAddress(_address: Address, _step: StepIdentity): Promisable<bigint> {\n throw new Error('Method [stepStakeForAddress] not implemented.')\n }\n}\n"],"mappings":"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","names":["assertEx","StepSizes","findMostRecentBlock","LruCacheMap","readPayloadMapFromStore","SimpleAccountBalanceViewer","SimpleBlockViewer","Semaphore","accountBalancesViewerFromArchivist","chainId","archivist","summaryMap","LruCacheMap","max","allowStale","noDisposeOnSet","updateAgeOnGet","transferSummaryMap","chainMap","readPayloadMapFromStore","headFunc","head","assertEx","findMostRecentBlock","_hash","block","service","SimpleAccountBalanceViewer","create","context","store","stepSemaphores","StepSizes","map","Semaphore","transfersSummaryContext","blockViewer","SimpleBlockViewer","finalizedArchivist","AbstractCreatable","creatable","Mutex","BaseService","AbstractCreatable","singletonInitMutex","Mutex","singletons","globalThis","initSingleton","params","name","Error","runExclusive","create","BaseAccountableService","creatableService","constructor","AbstractCreatable","assertEx","creatable","toEthAddress","XyoChainRewards__factory","XyoChainRewardsFactory","asAttoXL1","EvmBlockRewardViewer","AbstractCreatable","_contractAddress","chainContractViewer","assertEx","params","contractAddress","provider","allowedRewardForBlock","blockNumber","contract","XyoChainRewardsFactory","connect","toEthAddress","asAttoXL1","calcBlockReward","createHandler","rewardsContract","ex","error","Error","message","isDefined","PayloadBuilder","asSignedBlockBoundWitness","asSignedBlockBoundWitnessWithStorageMeta","blockViewerFromChainIteratorAndArchivist","chainIterator","chainArchivist","result","blockByHash","hash","payload","get","block","asSignedBlockBoundWitnessWithStorageMeta","isDefined","payloads","payload_hashes","blockByNumber","blockNumber","asSignedBlockBoundWitness","PayloadBuilder","addHashMeta","undefined","blocksByHash","limit","results","i","push","blocksByNumber","number","currentBlock","head","_hash","currentBlockHash","currentBlockNumber","payloadByHash","Error","payloadsByHash","_hashes","assertEx","isDefined","isNull","isUndefined","PayloadBuilder","asBlockBoundWitness","asBlockBoundWitnessWithStorageMeta","asSignedHydratedBlockWithHashMeta","asXL1BlockNumber","isBlockBoundWitnessWithHashMeta","hydrateBlock","LRUCache","ChainBlockNumberIterationService","BaseService","_blocksByBlockNumber","LRUCache","max","_currentHead","chainId","assertEx","chain","params","head","chainMap","chainStoreRead","blockByHash","hash","asSignedHydratedBlockWithHashMeta","hydrateBlock","blockByNumber","block","get","blocksByHash","limit","results","currentBlock","isUndefined","length","push","previousHash","previous","isNull","blocksByNumber","blockNumber","previousNumber","asXL1BlockNumber","currentBlockHash","_hash","currentBlockNumber","cached","startingBlock","PayloadBuilder","isDefined","asBlockBoundWitness","isBlockBoundWitnessWithHashMeta","set","Error","newHead","getBoundWitnessAsBlockBoundWitnessWithStorageMeta","next","nextBlockNumber","payloadByHash","payloadsByHash","_hashes","undefined","count","nextBlock","asBlockBoundWitnessWithStorageMeta","updateHead","emit","blocks","stored","assertEx","toAddress","toEthAddress","StakedXyoChain__factory","StakedXyoChainFactory","getAddress","EvmChainService","BaseService","active","contract","activeByStaked","staked","activeByAddressStaked","getAddress","toEthAddress","activeByStaker","address","addStake","amount","result","wait","chainId","assertEx","params","id","undefined","StakedXyoChainFactory","connect","runner","forkedAtBlockNumber","forkedAtHash","forkedChainId","toAddress","minWithdrawalBlocks","pending","pendingByStaker","staker","removeStake","slot","rewardForBlock","_block","Error","rewardsContract","stakingTokenAddress","withdrawStake","withdrawn","withdrawnByStaker","assertEx","toAddress","ZERO_ADDRESS","MemoryChainService","BaseService","_chainId","_simulatedStake","active","Promise","resolve","activeByStaked","_staked","activeByStaker","_address","addStake","_amount","chainId","assertEx","createHandler","minStake","params","config","producer","BigInt","forkedAtBlockNumber","forkedAtHash","forkedChainId","ZERO_ADDRESS","minWithdrawalBlocks","pending","pendingByStaker","_staker","removeStake","_slot","rewardForBlock","_block","Error","rewardsContract","stakingTokenAddress","withdrawStake","withdrawn","withdrawnByStaker","startHandler","toAddress","assertEx","creatable","XyoValidator","BaseService","blockViewer","assertEx","params","validatePendingBlock","_block","validatePendingTransaction","hydratedTransaction","tx","blockByHash","_hash","undefined","Promise","resolve","assertEx","creatable","hexToLast4BytesInt","shuffleWithSeed","BaseElectionService","BaseService","blockViewer","assertEx","params","chainStakeViewer","stakeIntentService","getCreatorCommitteeForNextBlock","current","spanAsync","nextBlock","block","candidates","getDeclaredCandidatesForBlock","previousBlockHash","_hash","generateCreatorCommittee","maxSize","creators","Set","seed","hexToLast4BytesInt","creatorArray","shuffleWithSeed","slice","isDefined","AccountBalanceViewerRpcSchemas","HttpRpcTransport","JsonRpcAccountBalanceViewer","balanceServiceSingleton","initAccountBalanceService","params","config","logger","endpoint","services","accountBalanceViewerEndpoint","apiEndpoint","isDefined","transport","HttpRpcTransport","AccountBalanceViewerRpcSchemas","viewer","JsonRpcAccountBalanceViewer","log","Error","isDefined","BlockViewerRpcSchemas","HttpRpcTransport","JsonRpcBlockViewer","blockViewerSingleton","initBlockViewer","params","config","logger","endpoint","services","apiEndpoint","isDefined","transport","HttpRpcTransport","BlockViewerRpcSchemas","viewer","JsonRpcBlockViewer","log","Error","assertEx","asAddress","assertEx","isDefined","ZERO_ADDRESS","Wallet","assertEx","assertEx","isDefined","InfuraProvider","assertEx","hexFrom","isDefined","isHex","canUseChainId","config","isDefined","evm","chainId","getChainId","assertEx","isHex","prefix","hex","hexFrom","parsed","Number","parseInt","instance","initInfuraProvider","config","providerConfig","getInfuraProviderConfig","Promise","resolve","InfuraProvider","canUseInfuraProvider","canUseChainId","isDefined","evm","infura","projectId","projectSecret","assertEx","getChainId","assertEx","isDefined","JsonRpcProvider","initJsonRpcProvider","config","providerConfig","getJsonRpcProviderConfig","Promise","resolve","JsonRpcProvider","canUseJsonRpcProvider","canUseChainId","isDefined","evm","jsonRpc","url","jsonRpcUrl","assertEx","getChainId","provider","initEvmProvider","config","canUseInfuraProvider","initInfuraProvider","canUseJsonRpcProvider","initJsonRpcProvider","assertEx","canUseEvmProvider","chainStakeServiceSingleton","canUseEvmContractChainService","config","id","chain","isDefined","ZERO_ADDRESS","canUseEvmProvider","initEvmContractChainService","account","traceProvider","meterProvider","logger","emvStakingContractAddress","assertEx","asAddress","provider","initEvmProvider","privateKey","private","hex","runner","Wallet","EvmChainService","create","result","start","chainStakeServiceSingleton","initChainService","account","config","logger","log","result","init","name","initMemoryChainService","MemoryChainService","create","assertEx","start","params","canUseEvmContractChainService","initEvmContractChainService","assertEx","isDefined","findMostRecentBlock","buildNextBlock","createDeclarationIntent","createGenesisBlock","createBootstrapHead","account","chainService","chainId","chain","genesisBlock","createGenesisBlock","address","push","producerDeclarationPayload","createDeclarationIntent","block","producerDeclarationBlock","buildNextBlock","buildNextBlock","PayloadBuilder","BridgeDestinationObservationSchema","toHex","toHex","AttoXL1ConvertFactor","getForkBlockReward","AttoXL1ConvertFactor","xl1","getForkBlockRewardHex","toHex","ethChainId","toHex","bridgeableTokenContract","bridgeDestAddress","destConfirmation","getBridgeDestChainId","getBridgeDestToken","getBridgeDestAddress","getBridgeDestAmount","getForkBlockRewardHex","getBridgeDestConfirmation","getBridgeDestinationDetails","dest","destToken","destAddress","destAmount","getBridgeSrcChainId","chainService","chainId","getBridgeSrcAddress","account","address","getBridgeSrcToken","getBridgeSrcAmount","getForkBlockRewardHex","getBridgeSourceDetails","src","srcAddress","srcToken","srcAmount","getBridgeDestinationObservation","previousBlock","account","chainService","bridgeDestinationObservationFields","getBridgeSourceDetails","getBridgeDestinationDetails","destConfirmation","getBridgeDestConfirmation","bridgeDestinationObservation","PayloadBuilder","schema","BridgeDestinationObservationSchema","fields","build","buildNextBlock","buildNextBlock","createTransferPayload","PayloadBuilder","BridgeIntentSchema","XYO_BRIDGE_ADDRESS","getBridgeIntent","previousBlock","account","chainService","transferPayload","createTransferPayload","address","XYO_BRIDGE_ADDRESS","getForkBlockReward","nonce","Date","now","bridgeIntentFields","getBridgeSourceDetails","getBridgeDestinationDetails","bridgeIntent","PayloadBuilder","schema","BridgeIntentSchema","fields","build","buildNextBlock","buildNextBlock","PayloadBuilder","BridgeSourceObservationSchema","getBridgeSourceObservation","previousBlock","account","chainService","srcTxHash","_hash","bridgeSourceObservationFields","getBridgeSourceDetails","getBridgeDestinationDetails","srcConfirmation","bridgeSourceObservation","PayloadBuilder","schema","BridgeSourceObservationSchema","fields","build","buildNextBlock","buildBlock","AttoXL1","XYO_STEP_REWARD_ADDRESS","getFirstBlockForNewChain","forkBlock","account","chainService","_hash","previousBlockHash","block","previousBlockNumber","step_hashes","previousStepHashes","protocol","chainId","options","blockPayloads","signers","txs","chainStepRewardAddress","XYO_STEP_REWARD_ADDRESS","stepRewardPoolBalance","AttoXL1","buildBlock","createForkedHead","forkFromBlock","account","chainService","chain","firstBlockForNewChain","getFirstBlockForNewChain","push","bridgeIntent","getBridgeIntent","bridgeSourceObservation","getBridgeSourceObservation","bridgeDestinationObservation","getBridgeDestinationObservation","asHash","hexFromBigInt","isDefined","isSignedBlockBoundWitnessWithHashMeta","getForkFromBlock","head","chainService","chainArchivist","chain","chainId","forkedAtBigInt","forkedAtHash","forkedAtHex","hexFromBigInt","asHash","isDefined","forkedAtBlock","get","forkedChainId","forkedAtBlockNumber","Number","isSignedBlockBoundWitnessWithHashMeta","block","delay","flattenHydratedBlock","submitNewChain","chain","chainArchivist","chainSubmissionsArchivistWrite","block","bw","insert","flattenHydratedBlock","result","get","_hash","length","delay","headSingleton","initHead","params","account","chainArchivist","chainSubmissionsArchivistWrite","chainService","head","findMostRecentBlock","forkFromBlock","getForkFromBlock","isDefined","chain","createForkedHead","submitNewChain","newBlock","assertEx","at","Error","createBootstrapHead","isDefined","HttpRpcTransport","JsonRpcMempoolRunner","MempoolRunnerRpcSchemas","mempoolRunnerSingleton","initMempoolRunner","params","config","logger","endpoint","services","apiEndpoint","isDefined","transport","HttpRpcTransport","MempoolRunnerRpcSchemas","runner","JsonRpcMempoolRunner","log","Error","isDefined","HttpRpcTransport","JsonRpcMempoolViewer","MempoolViewerRpcSchemas","mempoolViewerSingleton","initMempoolViewer","params","config","logger","endpoint","services","apiEndpoint","isDefined","transport","HttpRpcTransport","MempoolViewerRpcSchemas","viewer","JsonRpcMempoolViewer","log","Error","isDefined","timeBudget","HttpRpcTransport","JsonRpcMempoolViewer","MempoolViewerRpcSchemas","ValueType","assertEx","creatable","exists","filterAs","filterAsync","forget","isDefined","isUndefined","MemoryArchivist","asBlockBoundWitnessWithHashMeta","asXL1BlockNumber","isTransactionBoundWitnessWithStorageMeta","findMostRecentBlock","TransactionJsonSchemaValidator","validateTransaction","Mutex","PayloadBuilder","asSignedTransactionBoundWitnessWithHashMeta","bundledPayloadToHydratedTransaction","payload","withHashMeta","PayloadBuilder","addHashMeta","payloads","tx","asSignedTransactionBoundWitnessWithHashMeta","find","p","_hash","root","filter","PayloadBuilder","PayloadBundleSchema","flattenHydratedTransaction","hydratedTransactionToPayloadBundle","transaction","root","_hash","bundle","payloads","flattenHydratedTransaction","flatMap","p","PayloadBuilder","omitStorageMeta","schema","PayloadBundleSchema","fields","build","BasePendingTransactionsService","BaseService","MutexPriority","InsertNewTransactions","ReadTransactions","PurgeTransactions","_countPendingTransactionsMutex","Mutex","_curatedPendingBundledTransactionsArchivist","_pendingTransactionsCount","_removablePendingTransactionHashes","Set","_updateCuratedPendingTransactionsArchivistMutex","additionalPendingTransactionValidators","params","chainArchivist","assertEx","chainId","pendingBundledTransactionsArchivist","pendingBundledTransactionsLocalArchivist","pendingTransactionsCount","forget","countPendingTransactions","rejectedTransactionsArchivist","createHandler","MemoryArchivist","create","account","on","payloads","insertNewTransactions","markAnyIncludedTransactionsForRemoval","cleanupWorker","pendingTransactionsCounter","meter","createObservableUpDownCounter","description","valueType","ValueType","INT","unit","addCallback","observer","observe","pendingBlocks","_options","Error","pendingTransactions","limit","spanAsync","runExclusive","lastHead","filterAs","next","x","asBlockBoundWitnessWithHashMeta","at","isUndefined","pruneCuratedPendingTransactionsArchivist","_hash","foundPendingTransactions","cursor","length","pendingBundledTransactions","order","_sequence","undeletedTransactionBundles","filter","tx","has","root","transactions","Promise","all","map","p","bundledPayloadToHydratedTransaction","exists","activeTransactions","isTransactionActive","asXL1BlockNumber","block","txValidationResults","validateTransaction","validTransactions","errors","invalidTransactions","logger","warn","push","log","findMostRecentBlock","isDefined","isLocked","filterAlreadyFinalizedTransactions","incomingTransactions","incomingTransactionHashes","payload","finalizedTransactions","get","finalizedTransactionHashes","item","nonFinalizedTransactions","unprocessedTransactions","hydratedUnprocessedTransactions","filterAsync","TransactionJsonSchemaValidator","bundledTransactions","hydratedTransactionToPayloadBundle","insert","hashes","isTransactionBoundWitnessWithStorageMeta","hash","add","head","foundPendingTransactionsToDeleteHashes","deletedTransactionBundles","expiredTransactions","isTransactionExpired","expiredBundleHashes","expiredHydratedTx","find","bundledTx","deletedHashes","delete","txBw","exp","nbf","serviceSingleton","initPendingTransactions","config","params","logger","timeBudget","endpoint","services","apiEndpoint","isDefined","transport","HttpRpcTransport","MempoolViewerRpcSchemas","viewer","JsonRpcMempoolViewer","log","BasePendingTransactionsService","create","timeBudget","AbstractCreatable","AddressZod","asHash","assertEx","creatable","exists","hexToBigInt","isDefined","MemoryArchivist","FixedPercentageBlockRewardDiviner","FixedPercentageBlockRewardDivinerConfigSchema","buildNextBlock","createDeclarationIntent","PayloadBuilder","asBlockBoundWitness","AttoXL1","BlockNumberSchema","defaultRewardRatio","TimeSchema","XYO_STEP_REWARD_ADDRESS","z","hexFromBigInt","assertEx","PayloadBuilder","TransferSchema","XYO_ZERO_ADDRESS","transactionRequiredGas","HydratedTransactionWrapper","generateTransactionFeeTransfers","address","transactions","txs","Promise","all","map","tx","HydratedTransactionWrapper","parse","PayloadBuilder","addStorageMeta","txBaseFeeCosts","boundWitness","from","fees","base","txGasCosts","requiredGas","transactionRequiredGas","data","totalGasCost","gasPrice","payloads","Object","entries","amount","payload","schema","TransferSchema","epoch","Date","now","transfers","XYO_ZERO_ADDRESS","hexFromBigInt","fromPayload","assertEx","find","p","DEFAULT_BLOCK_SIZE","XYO_PRODUCER_REDECLARATION_DURATION","XYO_PRODUCER_REDECLARATION_WINDOW","SimpleBlockRunnerParamsZod","z","object","balanceViewer","loose","blockRewardViewer","chainId","string","config","mempoolViewer","mempoolRunner","rejectedTransactionsArchivist","optional","rewardAddress","AddressZod","time","validateHydratedBlockState","function","SimpleBlockRunner","AbstractCreatable","_blockRewardDiviner","_lastRedeclarationBlock","_rejectedTransactionsArchivist","DefaultBlockSize","RedeclarationDuration","RedeclarationWindow","address","account","assertEx","params","paramsHandler","parse","MemoryArchivist","create","next","head","chain","proposeNextValidBlock","produceNextBlock","force","result","getBlockRewardTransfers","block","FixedPercentageBlockRewardDiviner","rewardPercentageRatio","defaultRewardRatio","schema","FixedPercentageBlockRewardDivinerConfigSchema","blockId","PayloadBuilder","BlockNumberSchema","fields","build","rewards","divine","getProducerRedeclaration","producer","disableIntentRedeclaration","currentBlock","createDeclarationIntent","validateBalances","spanAsync","previousBlock","asBlockBoundWitness","nextBlock","nextBlockTransactionsStart","Date","now","nextBlockTransactions","pendingTransactions","limit","nextBlockTransactionsDuration","logger","warn","length","blockPayloads","producerRedeclarationPayload","push","heartbeatRequired","rewardTransferPayloads","transactionTransfers","generateTransactionFeeTransfers","timeStart","timePayload","generateTimePayload","timeDuration","fundedNextBlockTransactions","fundedTransfers","filterByFunded","info","startBuild","stepRewardPoolBalance","accountBalances","XYO_STEP_REWARD_ADDRESS","buildNextBlock","submitBlocks","txs","transfers","fundedTransactions","Promise","all","map","tx","transfer","find","from","totalTransferCost","Object","values","reduce","acc","t","hexToBigInt","balance","AttoXL1","filter","exists","ethereum","ethHashOrNull","currentTimeAndHash","ethereumHash","asHash","TimeSchema","xl1","xl1Hash","_hash","epoch","$epoch","isDefined","heartbeatInterval","serviceSingleton","initBlockProducer","params","timeBudget","logger","SimpleBlockRunner","create","assertEx","SimpleBlockRewardViewer","timeBudget","rewardServiceSingleton","initBlockRewardViewer","params","timeBudget","logger","config","canUseEvmBlockRewardViewer","initEvmBlockRewardViewer","initXyoBlockRewardViewer","SimpleBlockRewardViewer","create","canUseEvmProvider","provider","assertEx","initEvmProvider","evmBlockRewardViewerParams","EvmBlockRewardViewer","timeBudget","creatable","SimpleTimeSyncViewer","BaseTimeSyncService","BaseService","timeSyncViewer","blockViewer","params","ethProvider","convertTime","fromDomain","toDomain","from","createHandler","SimpleTimeSyncViewer","currentTime","domain","currentTimeAndHash","currentTimePayload","timeSyncServiceSingleton","initTimeService","blockViewer","config","logger","meterProvider","traceProvider","timeBudget","ethProvider","canUseEvmProvider","initEvmProvider","undefined","BaseTimeSyncService","create","serviceSingleton","initValidator","params","initBlockProducer","creatable","BaseNetworkStakeStepRewardService","BaseService","networkStakeStepRewardAddressHistory","_address","Error","networkStakeStepRewardAddressReward","_context","networkStakeStepRewardAddressShare","networkStakeStepRewardClaimedByAddress","networkStakeStepRewardForPosition","_position","_range","networkStakeStepRewardForStep","networkStakeStepRewardForStepForPosition","networkStakeStepRewardPoolRewards","networkStakeStepRewardPoolShares","networkStakeStepRewardPositionWeight","networkStakeStepRewardPotentialPositionLoss","networkStakeStepRewardRandomizer","networkStakeStepRewardStakerCount","networkStakeStepRewardUnclaimedByAddress","networkStakeStepRewardWeightForAddress","networkStakeStepRewardsForPosition","networkStakeStepRewardsForRange","networkStakeStepRewardsForStepLevel","_stepLevel","creatable","spanRootAsync","schemasSummary","BaseSchemasService","BaseService","schema","head","schemas","spanRootAsync","summary","schemasSummary","params","context","result","count","exists","filterAs","isBoundWitness","payloadSchemasContains","BoundWitnessWrapper","asChainStakeIntent","ChainStakeIntentSchema","getBlockSignedStakeDeclarations","block","archivist","intent","blockData","get","payload_hashes","bwsFromBlock","filter","x","isBoundWitness","bwsFromBlockWithDeclarations","bw","payloadSchemasContains","ChainStakeIntentSchema","validBlockBwsWithDeclarations","filterToValidSignedBoundWitnesses","Promise","all","map","stakeIntentHashes","flatMap","mapBoundWitnessToStakeIntentHashes","exists","payloads","stakeIntents","filterAs","asChainStakeIntent","p","addresses","includes","from","flat","bws","validBwIndexes","BoundWitnessWrapper","parse","getValid","_","index","payload_schemas","schema","undefined","asAddress","assertEx","creatable","filterAs","isUndefined","analyzeChain","ChainStakeIntentAnalyzer","isChainSummaryStakeIntent","DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS","findFirstMatching","IntervalMap","PayloadBuilder","asBlockBoundWitness","asBlockBoundWitnessWithStorageMeta","asChainStakeIntent","asChainIndexingServiceStateWithStorageMeta","ChainIndexingServiceStateSchema","isChainIndexingServiceState","readPayloadMapFromStore","timeBudget","Mutex","LRUCache","ACTIVE_STAKE_TTL","NO_ACTIVE_STAKE_TTL","STAKE_CACHE_MAX_ENTRIES","XyoStakeIntentService","BaseService","_lastIndexedBlockHash","undefined","_producers","IntervalMap","_stakeCache","LRUCache","max","_updateMutex","Mutex","blockViewer","params","chainArchivist","assertEx","chainStakeViewer","stakeIntentStateArchivist","paramsHandler","createHandler","head","currentBlock","isUndefined","recoverState","_hash","getDeclaredCandidateRanges","address","intent","Promise","resolve","results","get","getDeclaredCandidatesForBlock","block","spanAsync","findAllContaining","candidates","requiredMinimumStake","getRequiredMinimumStakeForIntent","validCandidates","filterToValidStake","minStake","config","producer","BigInt","isStakedForBlock","includes","startHandler","updateIndex","candidatesWithStake","all","map","candidate","stake","activeStake","activeByStaked","set","ttl","filter","persistState","current","state","serialize","payload","PayloadBuilder","schema","ChainIndexingServiceStateSchema","fields","endBlockHash","build","insert","timeBudget","console","asBlockBoundWitness","currentBlockNum","opts","DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS","predicate","p","asChainIndexingServiceStateWithStorageMeta","findFirstMatching","isChainIndexingServiceState","indexed","indexedBlock","asBlockBoundWitnessWithStorageMeta","indexedBlockNum","data","open","displayProgress","isLocked","runExclusive","currentHead","currentHeadHash","chainMap","readPayloadMapFromStore","result","analyzeChain","ChainStakeIntentAnalyzer","signedDeclarations","filterAs","find","isChainSummaryStakeIntent","intents","asChainStakeIntent","currentHeadBlockNum","logger","log","signedDeclaration","exp","nbf","start","stop","asAddress","from","creatable","BaseStepStakeService","BaseService","stepStake","_step","Error","stepStakeForAddress","_address"]}
1
+ {"version":3,"sources":["../../src/AccountBalance/accountBalanceServiceFromArchivist.ts","../../src/BaseService.ts","../../src/BlockReward/EvmBlockRewardViewer.ts","../../src/blockViewerFromChainIteratorAndArchivist.ts","../../src/ChainBlockNumberIteration/ChainBlockNumberIterationService.ts","../../src/ChainService/Evm/Evm.ts","../../src/ChainService/Memory/Memory.ts","../../src/ChainValidator/XyoValidator.ts","../../src/Election/BaseElectionService.ts","../../src/implementation/accountBalance.ts","../../src/implementation/blockViewer.ts","../../src/implementation/chain/index.ts","../../src/implementation/chain/evm.ts","../../src/implementation/evm/initEvmProvider.ts","../../src/implementation/evm/initInfuraProvider.ts","../../src/implementation/evm/initChainId.ts","../../src/implementation/evm/initJsonRpcProvider.ts","../../src/implementation/head/head.ts","../../src/implementation/head/createBootstrapHead.ts","../../src/implementation/head/createForkedHead/getBridgeDestinationObservation.ts","../../src/implementation/head/createForkedHead/config/getBridgeDestinationDetails.ts","../../src/implementation/head/createForkedHead/config/getForkDetails.ts","../../src/implementation/head/createForkedHead/config/getBridgeSourceDetails.ts","../../src/implementation/head/createForkedHead/getBridgeIntent.ts","../../src/implementation/head/createForkedHead/getBridgeSourceObservation.ts","../../src/implementation/head/createForkedHead/getFirstBlockForNewChain.ts","../../src/implementation/head/createForkedHead/createForkedHead.ts","../../src/implementation/head/getForkFromBlock.ts","../../src/implementation/head/submitNewChain.ts","../../src/implementation/mempoolRunner.ts","../../src/implementation/mempoolViewer.ts","../../src/implementation/pendingTransactions.ts","../../src/PendingTransactions/BasePendingTransactions.ts","../../src/PendingTransactions/bundledPayloadToHydratedTransaction.ts","../../src/PendingTransactions/hydratedTransactionToPayloadBundle.ts","../../src/implementation/producer.ts","../../src/simple/block/runner/SimpleBlockRunner.ts","../../src/simple/block/runner/generateTransactionFeeTransfers.ts","../../src/implementation/reward.ts","../../src/implementation/time.ts","../../src/Time/BaseTimeSyncService.ts","../../src/implementation/validator.ts","../../src/NetworkStakeStepReward/BaseNetworkStakeStepRewardService.ts","../../src/Schemas/BaseSchemasService.ts","../../src/StakeIntent/lib/getBlockSignedStakeDeclarations.ts","../../src/StakeIntent/XyoStakeIntentService.ts","../../src/StepStake/BaseStepStakeService.ts"],"sourcesContent":["import type { Hash } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { ReadArchivist } from '@xyo-network/archivist-model'\nimport type { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { ChainId } from '@xyo-network/xl1-protocol'\nimport { StepSizes } from '@xyo-network/xl1-protocol'\nimport type {\n AccountBalanceViewer, BalancesStepSummary, SimpleAccountBalanceViewerParams, SimpleBlockViewerParams, TransfersStepSummary,\n} from '@xyo-network/xl1-protocol-sdk'\nimport {\n findMostRecentBlock, LruCacheMap, readPayloadMapFromStore,\n SimpleAccountBalanceViewer,\n SimpleBlockViewer,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { Semaphore } from 'async-mutex'\n\n// this is intended to only be used for testing\nexport const accountBalancesViewerFromArchivist = async (\n chainId: ChainId,\n archivist: ReadArchivist<WithStorageMeta<Payload>>,\n): Promise<AccountBalanceViewer> => {\n const summaryMap = new LruCacheMap<string, BalancesStepSummary>({\n max: 100_000,\n allowStale: true,\n noDisposeOnSet: false,\n updateAgeOnGet: true,\n })\n\n const transferSummaryMap = new LruCacheMap<string, TransfersStepSummary>({\n max: 100_000,\n allowStale: true,\n noDisposeOnSet: false,\n updateAgeOnGet: true,\n })\n\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(archivist)\n const headFunc = async (): Promise<[Hash, number]> => {\n const head = assertEx(await findMostRecentBlock(archivist), () => 'No blocks found in chainArchivist')\n return [head._hash, head.block]\n }\n\n const service = await SimpleAccountBalanceViewer.create({\n context: {\n chainId,\n store: { chainMap },\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap,\n head: headFunc,\n },\n transfersSummaryContext: {\n chainId,\n store: { chainMap },\n stepSemaphores: StepSizes.map(() => new Semaphore(20)),\n summaryMap: transferSummaryMap,\n head: headFunc,\n\n },\n blockViewer: await SimpleBlockViewer.create({\n context: {\n chainId,\n head: headFunc,\n store: { chainMap },\n },\n finalizedArchivist: archivist,\n } satisfies SimpleBlockViewerParams),\n } satisfies SimpleAccountBalanceViewerParams)\n return service\n}\n","import type { EventData, Promisable } from '@xylabs/sdk-js'\nimport { AbstractCreatable, creatable } from '@xylabs/sdk-js'\nimport { Mutex } from 'async-mutex'\n\nimport type { BaseAccountableServiceParams, BaseServiceParams } from './model/index.ts'\n\ndeclare global {\n var xyoServiceSingletons: Record<string, unknown>\n}\n\n@creatable()\nexport class BaseService<TParams extends BaseServiceParams = BaseServiceParams, TEventData extends EventData = EventData>\n extends AbstractCreatable<TParams, TEventData> {\n private static singletonInitMutex = new Mutex()\n\n static get singletons() {\n return globalThis['xyoServiceSingletons'] ?? (globalThis['xyoServiceSingletons'] = {})\n }\n\n static initSingleton<TService extends BaseService<TParams>, TParams extends BaseServiceParams>(params: Partial<TParams>) {\n if (this.singletons[this.name]) throw new Error(`Singleton already initialized for ${this.name}`)\n return this.singletonInitMutex.runExclusive(async () => {\n return await this.create(params) as TService\n })\n }\n}\n\nexport abstract class BaseAccountableService<\n TParams extends BaseAccountableServiceParams = BaseAccountableServiceParams,\n> extends BaseService<TParams> {\n // Base class for services that have an account\n}\n\nexport interface CreatableService<T extends BaseService = BaseService> {\n new(params: T['params']): T\n create<T extends BaseService>(this: CreatableService<T>, params?: Partial<T['params']>): Promisable<T>\n}\n\nexport function creatableService<T extends BaseService = BaseService>() {\n return <U extends CreatableService<T>>(constructor: U) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-expressions\n constructor\n }\n}\n","import {\n AbstractCreatable,\n assertEx, creatable, CreatableParams, toEthAddress,\n} from '@xylabs/sdk-js'\nimport { XyoChainRewards__factory as XyoChainRewardsFactory } from '@xyo-network/typechain'\nimport {\n asAttoXL1, AttoXL1, XL1BlockNumber,\n} from '@xyo-network/xl1-protocol'\nimport {\n BlockRewardViewer,\n BlockRewardViewerMoniker,\n ChainContractViewer,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { Provider } from 'ethers/providers'\n\nexport interface EvmBlockRewardViewerParams extends CreatableParams {\n chainContractViewer: ChainContractViewer\n provider: Provider\n}\n\n@creatable()\nexport class EvmBlockRewardViewer extends AbstractCreatable<EvmBlockRewardViewerParams> implements BlockRewardViewer {\n static readonly defaultMoniker = BlockRewardViewerMoniker\n static readonly monikers = [BlockRewardViewerMoniker]\n moniker = EvmBlockRewardViewer.defaultMoniker\n\n protected _contractAddress: string | undefined\n\n protected get chainContractViewer() {\n return assertEx(this.params.chainContractViewer, () => 'chainContractViewer is required')\n }\n\n protected get contractAddress() {\n return assertEx(this._contractAddress, () => 'contractAddress is required')\n }\n\n protected get provider() {\n return assertEx(this.params.provider, () => 'provider is required')\n }\n\n async allowedRewardForBlock(blockNumber: XL1BlockNumber): Promise<AttoXL1> {\n const contract = XyoChainRewardsFactory.connect(toEthAddress(this.contractAddress), this.provider)\n return asAttoXL1(await contract.calcBlockReward(blockNumber))\n }\n\n override async createHandler() {\n await super.createHandler()\n try {\n this._contractAddress = await this.chainContractViewer.rewardsContract()\n } catch (ex) {\n const error = ex as Error\n throw new Error(`Failed to get rewards contract address: ${error.message}`)\n }\n }\n}\n","import type { Hash, Promisable } from '@xylabs/sdk-js'\nimport { isDefined } from '@xylabs/sdk-js'\nimport type { ReadArchivist } from '@xyo-network/archivist-model'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { Payload, WithHashMeta } from '@xyo-network/payload-model'\nimport type {\n SignedHydratedBlockWithHashMeta,\n XL1BlockNumber,\n} from '@xyo-network/xl1-protocol'\nimport { asSignedBlockBoundWitness, asSignedBlockBoundWitnessWithStorageMeta } from '@xyo-network/xl1-protocol'\nimport {\n type BlockViewer, BlockViewerMoniker, type EventingChainBlockNumberIteratorService,\n} from '@xyo-network/xl1-protocol-sdk'\n\nexport function blockViewerFromChainIteratorAndArchivist(\n chainIterator: EventingChainBlockNumberIteratorService,\n chainArchivist: ReadArchivist,\n): BlockViewer {\n const result = {\n blockByHash: async function (hash: Hash): Promise<SignedHydratedBlockWithHashMeta | null> {\n const [payload] = await chainArchivist.get([hash])\n const block = asSignedBlockBoundWitnessWithStorageMeta(payload)\n if (isDefined(block)) {\n const payloads = await chainArchivist.get(block.payload_hashes)\n return [block, payloads]\n }\n return null\n },\n blockByNumber: async function (blockNumber: XL1BlockNumber): Promise<SignedHydratedBlockWithHashMeta | null> {\n const payload = asSignedBlockBoundWitness(await chainIterator.get(blockNumber))\n const block = payload ? await PayloadBuilder.addHashMeta(payload) : undefined\n if (isDefined(block)) {\n const payloads = await chainArchivist.get(block.payload_hashes)\n return [block, payloads]\n }\n return null\n },\n blocksByHash: async function (hash: Hash, limit = 10): Promise<SignedHydratedBlockWithHashMeta[]> {\n const results: SignedHydratedBlockWithHashMeta[] = []\n for (let i = 0; i < limit; i++) {\n const block = await this.blockByHash(hash)\n if (block) {\n results.push(block)\n } else {\n break\n }\n }\n return results\n },\n blocksByNumber: async function (number: XL1BlockNumber, limit = 10): Promise<SignedHydratedBlockWithHashMeta[]> {\n const results: SignedHydratedBlockWithHashMeta[] = []\n for (let i = 0; i < limit; i++) {\n const block = await this.blockByNumber(number)\n if (block) {\n results.push(block)\n } else {\n break\n }\n }\n return results\n },\n currentBlock: async function (): Promise<SignedHydratedBlockWithHashMeta> {\n const head = await chainIterator.head()\n return this.blockByHash(head._hash) as Promise<SignedHydratedBlockWithHashMeta>\n },\n currentBlockHash: async function (): Promise<Hash> {\n const head = await chainIterator.head()\n return head._hash\n },\n currentBlockNumber: async function (): Promise<XL1BlockNumber> {\n const head = await chainIterator.head()\n return head.block\n },\n moniker: BlockViewerMoniker,\n payloadByHash: function (_hash: Hash): Promisable<WithHashMeta<Payload> | null> {\n throw new Error('Function not implemented.')\n },\n payloadsByHash: function (_hashes: Hash[]): Promisable<WithHashMeta<Payload>[]> {\n throw new Error('Function not implemented.')\n },\n } satisfies BlockViewer\n return result\n}\n","import type {\n Hash, Hex, Promisable,\n} from '@xylabs/sdk-js'\nimport {\n assertEx,\n isDefined, isNull, isUndefined,\n} from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n Payload, WithHashMeta, WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport type {\n BlockBoundWitness, SignedHydratedBlockWithHashMeta, XL1BlockNumber,\n} from '@xyo-network/xl1-protocol'\nimport {\n asBlockBoundWitness, asBlockBoundWitnessWithStorageMeta, asSignedHydratedBlockWithHashMeta, asXL1BlockNumber, isBlockBoundWitnessWithHashMeta,\n} from '@xyo-network/xl1-protocol'\nimport type {\n BlockViewer,\n ChainIteratorServiceEventData,\n ChainStoreRead,\n PayloadMapRead,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { BlockViewerMoniker, hydrateBlock } from '@xyo-network/xl1-protocol-sdk'\nimport { LRUCache } from 'lru-cache'\n\nimport { BaseService } from '../BaseService.ts'\nimport type { XyoChainIteratorParams } from './model/index.ts'\n\nexport class ChainBlockNumberIterationService extends BaseService<XyoChainIteratorParams, ChainIteratorServiceEventData>\n implements BlockViewer {\n static readonly defaultMoniker = BlockViewerMoniker\n static readonly monikers = [BlockViewerMoniker]\n moniker = ChainBlockNumberIterationService.defaultMoniker\n\n protected _blocksByBlockNumber = new LRUCache<number, WithStorageMeta<BlockBoundWitness>>({ max: 10_000 })\n protected _currentHead: WithStorageMeta<BlockBoundWitness> | undefined\n\n get chainId(): Hex { return assertEx(this._currentHead?.chain ?? this.params?.head?.chain, () => 'Current head is not set') }\n\n get chainMap(): PayloadMapRead<WithStorageMeta<Payload>> { return assertEx(this.params.chainMap) }\n\n get chainStoreRead() {\n return { chainMap: this.chainMap } satisfies ChainStoreRead\n }\n\n async blockByHash(hash: Hash): Promise<SignedHydratedBlockWithHashMeta | null> {\n return asSignedHydratedBlockWithHashMeta(await hydrateBlock(this.chainStoreRead, hash)) ?? null\n }\n\n async blockByNumber(block: XL1BlockNumber): Promise<SignedHydratedBlockWithHashMeta | null> {\n return asSignedHydratedBlockWithHashMeta(await this.get(block)) ?? null\n }\n\n async blocksByHash(hash: Hash, limit: number = 100): Promise<SignedHydratedBlockWithHashMeta[]> {\n const results: SignedHydratedBlockWithHashMeta[] = []\n let currentBlock = await this.blockByHash(hash)\n while (currentBlock !== null && (isUndefined(limit) || results.length < limit)) {\n results.push(currentBlock)\n const previousHash = currentBlock[0].previous\n if (isNull(previousHash)) break\n currentBlock = await this.blockByHash(previousHash)\n }\n return results\n }\n\n async blocksByNumber(blockNumber: XL1BlockNumber, limit: number = 100): Promise<SignedHydratedBlockWithHashMeta[]> {\n const results: SignedHydratedBlockWithHashMeta[] = []\n let currentBlock = await this.blockByNumber(blockNumber)\n while (currentBlock !== null && (isUndefined(limit) || results.length < limit)) {\n results.push(currentBlock)\n if (currentBlock[0].block === 0) break\n const previousNumber = asXL1BlockNumber(currentBlock[0].block - 1, true)\n currentBlock = await this.blockByNumber(previousNumber)\n }\n return results\n }\n\n async currentBlock(): Promise<SignedHydratedBlockWithHashMeta> {\n return assertEx(await this.blockByHash(await this.currentBlockHash()), () => 'Current block not found')\n }\n\n async currentBlockHash(): Promise<Hash> {\n const head = assertEx(await this.head(), () => 'Head is not set')\n return head._hash\n }\n\n async currentBlockNumber(): Promise<XL1BlockNumber> {\n const head = assertEx(await this.head(), () => 'Head is not set')\n return head.block\n }\n\n async get(block: number): Promise<WithStorageMeta<BlockBoundWitness>> {\n const head = await this.head()\n // if(isUndefined(head)) return undefined\n // Bail early if the block requested is newer than the current head\n assertEx(head.block >= block, () => `Block requested is newer than the current head [${block}]`)\n const cached = this._blocksByBlockNumber.get(block)\n if (cached) return cached\n // Start at the current head and traverse backwards until the requested block is found\n const startingBlock = head\n const currentBlockHash = await PayloadBuilder.hash(startingBlock)\n let currentBlock = (await this.chainMap.get(currentBlockHash))\n while (isDefined(currentBlock)) {\n assertEx(asBlockBoundWitness(currentBlock), () => `Expected hash to be a block bound witness [${currentBlock?._hash}]`)\n if (isBlockBoundWitnessWithHashMeta(currentBlock)) {\n this._blocksByBlockNumber.set(currentBlock.block, currentBlock)\n if (currentBlock.block === block) {\n return currentBlock\n }\n const { previous } = currentBlock\n if (isNull(previous)) break\n currentBlock = (await this.chainMap.get(previous))\n }\n }\n throw new Error(`Block not found: ${block}`)\n }\n\n async head(): Promise<WithStorageMeta<BlockBoundWitness>> {\n if (isDefined(this._currentHead)) return this._currentHead\n if (isDefined(this.params.head)) {\n const newHead = await this.getBoundWitnessAsBlockBoundWitnessWithStorageMeta(this.params.head)\n this._currentHead = newHead\n return newHead\n }\n throw new Error('Head is not set')\n }\n\n async next(block: number): Promise<WithStorageMeta<BlockBoundWitness> | undefined> {\n const currentBlock = block\n const nextBlockNumber = currentBlock + 1\n return await this.get(nextBlockNumber)\n }\n\n payloadByHash(_hash: Hash): Promisable<WithHashMeta<Payload> | null> {\n throw new Error('Method [payloadByHash] not implemented.')\n }\n\n payloadsByHash(_hashes: Hash[]): Promisable<WithHashMeta<Payload>[]> {\n throw new Error('Method [payloadsByHash] not implemented.')\n }\n\n // TODO: Decide on inclusive/exclusive (probably need inclusive to account for chain head)\n // and then communicate via method name and documentation\n async previous(block: number | undefined = undefined, count: number = 1): Promise<WithStorageMeta<BlockBoundWitness>[]> {\n const results: WithStorageMeta<BlockBoundWitness>[] = []\n let currentBlock: WithStorageMeta<BlockBoundWitness> | undefined = isDefined(block) ? (await this.get(block)) : await this.head()\n while (isDefined(currentBlock) && (results.length < count)) {\n if (isBlockBoundWitnessWithHashMeta(currentBlock)) {\n results.push(currentBlock)\n const { previous } = currentBlock as BlockBoundWitness\n if (isNull(previous)) break\n const nextBlock = await this.chainMap.get(previous)\n currentBlock = asBlockBoundWitnessWithStorageMeta(nextBlock)\n } else {\n const hash = PayloadBuilder.hash(currentBlock)\n assertEx(asBlockBoundWitnessWithStorageMeta(currentBlock), () => `Expected hash to be a block bound witness [${hash}]`)\n }\n }\n return results\n }\n\n async updateHead(head: BlockBoundWitness): Promise<void> {\n const newHead = await this.getBoundWitnessAsBlockBoundWitnessWithStorageMeta(head)\n this._currentHead = newHead\n void this.emit('headUpdated', { blocks: [newHead] })\n }\n\n private async getBoundWitnessAsBlockBoundWitnessWithStorageMeta(head: BlockBoundWitness): Promise<WithStorageMeta<BlockBoundWitness>> {\n const hash = await PayloadBuilder.hash(head)\n const stored = (await this.chainMap.get(hash))\n const newHead = asBlockBoundWitnessWithStorageMeta(stored)\n if (isUndefined(newHead)) throw new Error(`Head block not found in archivist [${hash}]`)\n return newHead\n }\n}\n","import type {\n Address, Hex, Promisable,\n} from '@xylabs/sdk-js'\nimport {\n assertEx, toAddress, toEthAddress,\n} from '@xylabs/sdk-js'\nimport type { StakedXyoChain } from '@xyo-network/typechain'\nimport { StakedXyoChain__factory as StakedXyoChainFactory } from '@xyo-network/typechain'\nimport type { AttoXL1, XL1BlockNumber } from '@xyo-network/xl1-protocol'\nimport { ChainContractViewerMoniker, type ChainService } from '@xyo-network/xl1-protocol-sdk'\nimport { getAddress } from 'ethers/address'\nimport type { ContractRunner } from 'ethers/providers'\n\nimport { BaseService } from '../../BaseService.ts'\nimport type { BaseServiceParams } from '../../model/index.ts'\n\nexport interface EvmChainServiceParams extends BaseServiceParams {\n contract: StakedXyoChain\n id: Hex\n runner: ContractRunner\n}\n\n/**\n * A class that represents a chain stake as backed by an EVM smart contract\n */\nexport class EvmChainService extends BaseService<EvmChainServiceParams> implements ChainService {\n static readonly defaultMoniker = ChainContractViewerMoniker\n static readonly monikers = [ChainContractViewerMoniker]\n moniker = EvmChainService.defaultMoniker\n\n async active(): Promise<bigint> {\n return await (await this.contract()).active()\n }\n\n async activeByStaked(staked: Address): Promise<bigint> {\n return await (await this.contract()).activeByAddressStaked(getAddress(toEthAddress(staked)))\n }\n\n async activeByStaker(address: Address): Promise<bigint> {\n return await (await this.contract()).activeByStaker(getAddress(toEthAddress(address)))\n }\n\n async addStake(staked: Address, amount: bigint): Promise<boolean> {\n const result = await (await this.contract()).addStake(getAddress(toEthAddress(staked)), amount)\n await result.wait()\n return true\n }\n\n chainId(): Promisable<Hex> {\n return assertEx(this.params.id)\n }\n\n async contract() {\n if (this.params.contract === undefined) {\n this.params.contract = StakedXyoChainFactory.connect(\n toEthAddress(await this.chainId()),\n this.params.runner,\n ) as StakedXyoChain\n }\n return assertEx(this.params.contract)\n }\n\n async forkedAtBlockNumber(): Promise<bigint> {\n return await (await this.contract()).forkedAtBlockNumber()\n }\n\n async forkedAtHash(): Promise<bigint> {\n return await (await this.contract()).forkedAtHash()\n }\n\n async forkedChainId(): Promise<Address> {\n return toAddress(await (await this.contract()).forkedChainId())\n }\n\n async minWithdrawalBlocks(): Promise<bigint> {\n return await (await this.contract()).minWithdrawalBlocks()\n }\n\n async pending(): Promise<bigint> {\n return await (await this.contract()).pending()\n }\n\n async pendingByStaker(staker: Address): Promise<bigint> {\n return await (await this.contract()).pendingByStaker(getAddress(toEthAddress(staker)))\n }\n\n async removeStake(slot: bigint): Promise<boolean> {\n const result = await (await this.contract()).removeStake(slot)\n await result.wait()\n return true\n }\n\n rewardForBlock(_block: XL1BlockNumber): Promisable<AttoXL1> {\n throw new Error('Method not implemented.')\n }\n\n async rewardsContract(): Promise<string> {\n return await (await this.contract()).rewardsContract()\n }\n\n async stakingTokenAddress(): Promise<string> {\n return await (await this.contract()).stakingTokenAddress()\n }\n\n async withdrawStake(slot: bigint): Promise<boolean> {\n const result = await (await this.contract()).withdrawStake(slot)\n await result.wait()\n return true\n }\n\n async withdrawn(): Promise<bigint> {\n return await (await this.contract()).withdrawn()\n }\n\n async withdrawnByStaker(staker: string): Promise<bigint> {\n return await (await this.contract()).withdrawnByStaker(getAddress(staker))\n }\n}\n","import type {\n Address, Hex, Promisable,\n} from '@xylabs/sdk-js'\nimport {\n assertEx, toAddress, ZERO_ADDRESS,\n} from '@xylabs/sdk-js'\nimport type { AttoXL1, XL1BlockNumber } from '@xyo-network/xl1-protocol'\nimport {\n ChainContractViewerMoniker,\n type ChainService, type Config,\n} from '@xyo-network/xl1-protocol-sdk'\n\nimport { BaseService } from '../../BaseService.ts'\nimport type { BaseServiceParams } from '../../model/index.ts'\n\nexport interface MemoryChainServiceParams extends BaseServiceParams<Pick<Config, 'producer'>> {\n chainId: Hex\n}\n\n/**\n * A class that represents a chain stake as backed in memory\n */\nexport class MemoryChainService extends BaseService<MemoryChainServiceParams> implements ChainService {\n static readonly defaultMoniker = ChainContractViewerMoniker\n static readonly monikers = [ChainContractViewerMoniker]\n moniker = MemoryChainService.defaultMoniker\n\n protected _chainId: Hex | undefined\n protected _simulatedStake: bigint = 1n\n\n async active(): Promise<bigint> {\n return await Promise.resolve(this._simulatedStake)\n }\n\n async activeByStaked(_staked: Address): Promise<bigint> {\n return await Promise.resolve(this._simulatedStake)\n }\n\n async activeByStaker(_address: string): Promise<bigint> {\n return await Promise.resolve(this._simulatedStake)\n }\n\n async addStake(_staked: string, _amount: bigint): Promise<boolean> {\n return await Promise.resolve(true)\n }\n\n chainId(): Promisable<Hex> {\n return assertEx(this._chainId, () => 'Chain ID not set')\n }\n\n override createHandler(): void {\n const { minStake = 1 } = this.params.config.producer ?? {}\n this._simulatedStake = BigInt(minStake)\n }\n\n async forkedAtBlockNumber(): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n\n async forkedAtHash(): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n\n async forkedChainId(): Promise<Address> {\n return await Promise.resolve(ZERO_ADDRESS)\n }\n\n async minWithdrawalBlocks(): Promise<bigint> {\n return await Promise.resolve(1n)\n }\n\n async pending(): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n\n async pendingByStaker(_staker: string): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n\n async removeStake(_slot: bigint): Promise<boolean> {\n return await Promise.resolve(true)\n }\n\n rewardForBlock(_block: XL1BlockNumber): Promisable<AttoXL1> {\n throw new Error('Method not implemented.')\n }\n\n async rewardsContract(): Promise<string> {\n return await Promise.resolve('')\n }\n\n async stakingTokenAddress(): Promise<string> {\n return await Promise.resolve('')\n }\n\n async withdrawStake(_slot: bigint): Promise<boolean> {\n return await Promise.resolve(true)\n }\n\n async withdrawn(): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n\n async withdrawnByStaker(_staker: string): Promise<bigint> {\n return await Promise.resolve(0n)\n }\n\n protected override async startHandler(): Promise<void> {\n await super.startHandler()\n this._chainId = this.params.chainId ?? toAddress(1n)\n }\n}\n","import {\n assertEx, creatable, EmptyObject,\n Promisable,\n} from '@xylabs/sdk-js'\nimport {\n BlockBoundWitness,\n SignedHydratedTransactionWithStorageMeta,\n} from '@xyo-network/xl1-protocol'\nimport { BlockViewer, HydratedBlockStateValidationFunction } from '@xyo-network/xl1-protocol-sdk'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\nimport { Validator } from './model/index.ts'\n\nexport interface XyoValidatorParams<TConfig extends EmptyObject = EmptyObject> extends BaseServiceParams<TConfig> {\n // account: AccountInstance\n // blockRewardService: BlockRewardService\n blockViewer: BlockViewer\n // chainId: ChainId\n // electionService: ElectionService\n // pendingBundledTransactionsArchivist: ArchivistInstance\n // stakeIntentService: StakeIntentService\n validateHydratedBlockState: HydratedBlockStateValidationFunction\n}\n\n@creatable()\nexport class XyoValidator<TParams extends XyoValidatorParams = XyoValidatorParams> extends BaseService<TParams> implements Validator {\n // get address() {\n // return this.account.address\n // }\n\n // protected get account() {\n // return assertEx(this.params.account, () => 'account is required')\n // }\n\n protected get blockViewer() {\n return assertEx(this.params.blockViewer, () => 'blockViewer is required')\n }\n\n // protected get chainInfo() {\n // return assertEx(this.params.chainId, () => 'chainInfo is required')\n // }\n\n // protected get electionService() {\n // return assertEx(this.params.electionService, () => 'electionService is required')\n // }\n\n // protected get pendingBundledTransactionsArchivist() {\n // return assertEx(this.params.pendingBundledTransactionsArchivist, () => 'pendingBundledTransactions is required')\n // }\n\n // protected get blockRewardService() {\n // return assertEx(this.params.blockRewardService, () => 'blockRewardService is required')\n // }\n\n validatePendingBlock(_block: BlockBoundWitness): Promisable<Error[]> {\n return [] // await validateBlockProtocol(block, this.chainInfo)\n }\n\n // TODO: Move to validator and inherit this class from validator\n async validatePendingTransaction(hydratedTransaction: SignedHydratedTransactionWithStorageMeta): Promise<boolean> {\n const [tx] = hydratedTransaction\n // Ensure not confirmed already (replay attack)\n if ((await this.blockViewer.blockByHash(tx._hash)) !== undefined) return false\n // TODO: Ensure transaction is valid (double spend, has voucher, has required stake, etc.)\n // TODO: Ensure validator stake is valid\n return await Promise.resolve(true)\n }\n}\n","import {\n Address, assertEx, creatable, Hash,\n} from '@xylabs/sdk-js'\nimport { hexToLast4BytesInt, shuffleWithSeed } from '@xyo-network/chain-utils'\nimport { WithHashMeta } from '@xyo-network/payload-model'\nimport { BlockBoundWitness } from '@xyo-network/xl1-protocol'\nimport type {\n BlockViewer,\n ChainStakeViewer, ElectionService, StakeIntentService,\n} from '@xyo-network/xl1-protocol-sdk'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseElectionServicesParams extends BaseServiceParams {\n blockViewer?: BlockViewer\n chainStakeViewer?: ChainStakeViewer\n stakeIntentService?: StakeIntentService\n}\n\n@creatable()\nexport class BaseElectionService extends BaseService<BaseElectionServicesParams> implements ElectionService {\n get blockViewer() {\n return assertEx(this.params.blockViewer, () => 'No block viewer')\n }\n\n get chainStakeViewer() {\n return assertEx(this.params.chainStakeViewer, () => 'No chain stake viewer')\n }\n\n get stakeIntentService() {\n return assertEx(this.params.stakeIntentService, () => 'No staked intent service')\n }\n\n async getCreatorCommitteeForNextBlock(current: WithHashMeta<BlockBoundWitness>): Promise<Address[]> {\n return await this.spanAsync('getCreatorCommitteeForNextBlock', async () => {\n const nextBlock = current.block + 1\n const candidates = await this.stakeIntentService.getDeclaredCandidatesForBlock(nextBlock, 'producer')\n const previousBlockHash = current._hash\n return this.generateCreatorCommittee(candidates, previousBlockHash)\n })\n }\n\n protected generateCreatorCommittee(candidates: Address[], previousBlockHash: Hash, maxSize = 3): Address[] {\n const creators = new Set<Address>(candidates)\n const seed = hexToLast4BytesInt(previousBlockHash)\n const creatorArray = shuffleWithSeed(creators, seed)\n return creatorArray.slice(0, maxSize)\n }\n}\n","import { isDefined, type Promisable } from '@xylabs/sdk-js'\nimport type { Initializable, InitializableParams } from '@xyo-network/xl1-protocol'\nimport type { AccountBalanceViewer, Config } from '@xyo-network/xl1-protocol-sdk'\nimport {\n AccountBalanceViewerRpcSchemas,\n HttpRpcTransport,\n JsonRpcAccountBalanceViewer,\n} from '@xyo-network/xl1-rpc'\n\nlet balanceServiceSingleton: Promisable<AccountBalanceViewer> | undefined\n\nexport type InitAccountBalanceServiceParams = InitializableParams<{\n config: Config\n}>\n\nexport const initAccountBalanceService: Initializable<InitAccountBalanceServiceParams, AccountBalanceViewer>\n = (params): Promisable<AccountBalanceViewer> => {\n const { config, logger } = params\n if (balanceServiceSingleton) return balanceServiceSingleton\n const endpoint = config.services?.accountBalanceViewerEndpoint ?? config.services?.apiEndpoint\n if (isDefined(endpoint)) {\n const transport = new HttpRpcTransport(endpoint, { ...AccountBalanceViewerRpcSchemas })\n const viewer = new JsonRpcAccountBalanceViewer(transport)\n logger?.log('Using AccountBalanceViewer RPC service at', endpoint)\n return viewer\n } else {\n throw new Error('No AccountBalanceViewer endpoint configured')\n }\n }\n","import { isDefined, type Promisable } from '@xylabs/sdk-js'\nimport type { Initializable, InitializableParams } from '@xyo-network/xl1-protocol'\nimport type { BlockViewer, Config } from '@xyo-network/xl1-protocol-sdk'\nimport {\n BlockViewerRpcSchemas,\n HttpRpcTransport,\n JsonRpcBlockViewer,\n} from '@xyo-network/xl1-rpc'\n\nlet blockViewerSingleton: Promisable<BlockViewer> | undefined\n\nexport type InitBlockViewerParams = InitializableParams<{\n config: Config\n}>\n\nexport const initBlockViewer: Initializable<InitBlockViewerParams, BlockViewer>\n = (params): Promisable<BlockViewer> => {\n const { config, logger } = params\n if (blockViewerSingleton) return blockViewerSingleton\n const endpoint = config.services?.apiEndpoint\n if (isDefined(endpoint)) {\n const transport = new HttpRpcTransport(endpoint, { ...BlockViewerRpcSchemas })\n const viewer = new JsonRpcBlockViewer(transport)\n logger?.log('Using BlockViewer RPC service at', endpoint)\n return viewer\n } else {\n throw new Error('No BlockViewer endpoint configured')\n }\n }\n","import {\n assertEx, type CreatableName, type Promisable,\n} from '@xylabs/sdk-js'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport type { ChainService } from '@xyo-network/xl1-protocol-sdk'\nimport type { Config } from 'cosmiconfig'\n\nimport { MemoryChainService } from '../../ChainService/index.ts'\nimport type { BaseAccountableServiceParams } from '../../model/index.ts'\nimport { canUseEvmContractChainService, initEvmContractChainService } from './evm.ts'\n\nlet chainStakeServiceSingleton: Promisable<ChainService> | undefined\n\nexport const initChainService: Initializable<BaseAccountableServiceParams<\n Pick<Config, 'chain' | 'evm' | 'producer'>>,\nChainService> = ({\n account, config, logger,\n}) => {\n logger?.log('ChainService: Initializing...')\n const result = init({\n config, name: 'ChainService' as CreatableName, account,\n })\n logger?.log('ChainService: Initialized')\n return result\n}\n\nexport const initMemoryChainService: Initializable<BaseAccountableServiceParams<\n Pick<Config, 'producer'>>, ChainService> = async ({ config }) => {\n const result = await MemoryChainService.create({\n config,\n name: 'MemoryChainService' as CreatableName,\n })\n assertEx(await result.start(), () => 'Failed to start MemoryChainService')\n return result\n}\n\nconst init: Initializable<BaseAccountableServiceParams<Pick<Config, 'chain' | 'evm' | 'producer'>>,\n ChainService> = async (params): Promise<ChainService> => {\n if (chainStakeServiceSingleton) return chainStakeServiceSingleton\n const { config } = params\n chainStakeServiceSingleton = canUseEvmContractChainService(config)\n ? await initEvmContractChainService({ ...params, name: 'ChainStakeService' as CreatableName })\n : await initMemoryChainService(params)\n // Create service\n return chainStakeServiceSingleton\n}\n","import type { Address, Promisable } from '@xylabs/sdk-js'\nimport {\n asAddress, assertEx, isDefined, ZERO_ADDRESS,\n} from '@xylabs/sdk-js'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport type { ContractRunner } from 'ethers'\nimport { Wallet } from 'ethers/wallet'\n\nimport { EvmChainService } from '../../ChainService/index.ts'\nimport type { BaseAccountableServiceParams } from '../../model/index.ts'\nimport { canUseEvmProvider, initEvmProvider } from '../evm/index.ts'\n\nlet chainStakeServiceSingleton: Promisable<EvmChainService> | undefined\n\nexport const canUseEvmContractChainService = (config: Pick<Config, 'chain' | 'evm'>) => {\n const { id } = config.chain\n return isDefined(id) && id !== ZERO_ADDRESS && canUseEvmProvider({ config })\n}\n\nexport const initEvmContractChainService: Initializable<BaseAccountableServiceParams<Pick<Config, 'chain' | 'evm'>>, EvmChainService> = async ({\n account, config, traceProvider, meterProvider, logger,\n}) => {\n if (chainStakeServiceSingleton) return chainStakeServiceSingleton\n // Parse config\n const emvStakingContractAddress = assertEx(config.chain.id, () => 'config.chain.id is required')\n // Configure ContractRunner\n const id: Address = assertEx(asAddress(emvStakingContractAddress), () => 'config.chain.id is not a valid address')\n const provider = assertEx(await initEvmProvider({ config }))\n const privateKey = assertEx(account.private?.hex, () => 'Account does not have a private key')\n const runner: ContractRunner = new Wallet(privateKey, provider)\n // Create service\n chainStakeServiceSingleton = EvmChainService.create({\n id, runner, traceProvider, meterProvider, logger,\n })\n const result = await chainStakeServiceSingleton\n await result.start()\n return result\n}\n","import type { Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport type { Provider } from 'ethers'\nimport type { JsonRpcProvider } from 'ethers/providers'\n\nimport { canUseInfuraProvider, initInfuraProvider } from './initInfuraProvider.ts'\nimport { canUseJsonRpcProvider, initJsonRpcProvider } from './initJsonRpcProvider.ts'\n\nlet provider: Promise<JsonRpcProvider> | undefined\n\nexport const initEvmProvider = async ({ config }: { config: Pick<Config, 'evm'>; logger?: Logger }): Promise<Provider> => {\n if (provider) return provider\n if (canUseInfuraProvider(config)) {\n provider = initInfuraProvider(config)\n } else if (canUseJsonRpcProvider(config)) {\n provider = initJsonRpcProvider(config)\n }\n return assertEx(await provider, () => 'No provider available')\n}\n\nexport const canUseEvmProvider = ({ config }: { config: Pick<Config, 'evm'> }) => {\n return canUseInfuraProvider(config) || canUseJsonRpcProvider(config)\n}\n","import { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { InfuraProvider } from 'ethers/providers'\n\nimport { canUseChainId, getChainId } from './initChainId.ts'\n\nlet instance: Promise<InfuraProvider> | undefined\n\nexport const initInfuraProvider = (config: Pick<Config, 'evm'>) => {\n if (instance) return instance\n const providerConfig = getInfuraProviderConfig(config)\n instance = Promise.resolve(new InfuraProvider(...providerConfig))\n return instance\n}\n\nexport const canUseInfuraProvider = (config: Pick<Config, 'evm'>): boolean => {\n return canUseChainId(config)\n && isDefined(config.evm?.infura?.projectId)\n && isDefined(config.evm?.infura?.projectSecret)\n}\n\nexport const getInfuraProviderConfig = (config: Pick<Config, 'evm'>) => {\n const projectId = assertEx(config.evm?.infura?.projectId, () => 'Missing config.evm.infura.projectId')\n const projectSecret = assertEx(config.evm?.infura?.projectSecret, () => 'Missing config.evm.infura.projectSecret')\n return [getChainId(config), projectId, projectSecret] as const\n}\n","import {\n assertEx, hexFrom, isDefined, isHex,\n} from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\n\nexport const canUseChainId = (config: Pick<Config, 'evm'>): boolean => {\n return isDefined(config.evm.chainId)\n}\n\nexport const getChainId = (config: Pick<Config, 'evm'>) => {\n const chainId = assertEx(config.evm.chainId, () => 'Missing config.evm.chainId')\n if (isHex(chainId, { prefix: true })) {\n const hex = hexFrom(chainId)\n const parsed = Number.parseInt(hex, 16)\n return parsed\n } else {\n const parsed = Number.parseInt(chainId, 10)\n return parsed\n }\n}\n","import { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type { Config } from '@xyo-network/xl1-protocol-sdk'\nimport { JsonRpcProvider } from 'ethers/providers'\n\nimport { canUseChainId, getChainId } from './initChainId.ts'\n\nexport const initJsonRpcProvider = (config: Pick<Config, 'evm'>) => {\n const providerConfig = getJsonRpcProviderConfig(config)\n return Promise.resolve(new JsonRpcProvider(...providerConfig))\n}\n\nexport const canUseJsonRpcProvider = (config: Pick<Config, 'evm'>) => {\n return canUseChainId(config)\n && isDefined(config.evm.jsonRpc?.url)\n}\n\nexport const getJsonRpcProviderConfig = (config: Pick<Config, 'evm'>) => {\n const jsonRpcUrl = assertEx(config.evm.jsonRpc?.url, () => 'Missing config.evm.jsonRpc.url')\n return [jsonRpcUrl, getChainId(config)] as const\n}\n","import type { Promisable } from '@xylabs/sdk-js'\nimport { assertEx, isDefined } from '@xylabs/sdk-js'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type { Initializable, SignedBlockBoundWitnessWithHashMeta } from '@xyo-network/xl1-protocol'\nimport { type ChainService, findMostRecentBlock } from '@xyo-network/xl1-protocol-sdk'\n\nimport { createBootstrapHead } from './createBootstrapHead.ts'\nimport { createForkedHead } from './createForkedHead/index.ts'\nimport { getForkFromBlock } from './getForkFromBlock.ts'\nimport { submitNewChain } from './submitNewChain.ts'\n\nlet headSingleton: Promisable<SignedBlockBoundWitnessWithHashMeta> | undefined\n\nexport const initHead: Initializable<{\n account: WalletInstance\n chainArchivist: ArchivistInstance\n chainService: ChainService\n chainSubmissionsArchivistWrite: ArchivistInstance\n}, SignedBlockBoundWitnessWithHashMeta>\n = async (params): Promise<SignedBlockBoundWitnessWithHashMeta> => {\n const {\n account, chainArchivist, chainSubmissionsArchivistWrite, chainService,\n } = params\n if (headSingleton) return headSingleton\n let head = await findMostRecentBlock(chainArchivist)\n\n // If there is a head\n if (head) {\n // If there is a head but check if it matches our chainId or we should fork from it\n const forkFromBlock = await getForkFromBlock(head, chainService, chainArchivist)\n // If we should fork form a block in the current chain\n if (isDefined(forkFromBlock)) {\n // Create a new chain from the fork from block\n const chain = await createForkedHead(forkFromBlock, account, chainService)\n await submitNewChain(chain, chainArchivist, chainSubmissionsArchivistWrite)\n const newBlock = assertEx(chain.at(-1), () => new Error('Failed to get new head after forking'))\n head = newBlock[0]\n }\n } else {\n // If there is no head, create one\n const chain = await createBootstrapHead(account, chainService)\n await submitNewChain(chain, chainArchivist, chainSubmissionsArchivistWrite)\n const newBlock = assertEx(chain.at(-1), () => new Error('Failed to get new head after genesis'))\n head = newBlock[0]\n }\n headSingleton = head\n return headSingleton\n }\n","import {\n buildNextBlock, createDeclarationIntent, createGenesisBlock,\n} from '@xyo-network/chain-protocol'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type { SignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-protocol'\nimport type { ChainService } from '@xyo-network/xl1-protocol-sdk'\n\nexport const createBootstrapHead = async (account: WalletInstance, chainService: ChainService): Promise<SignedHydratedBlockWithHashMeta[]> => {\n const chainId = await chainService.chainId()\n const chain: SignedHydratedBlockWithHashMeta[] = []\n\n // Create genesis block\n const genesisBlock = await createGenesisBlock(account, chainId, 10_000_000n, account.address)\n chain.push(genesisBlock)\n\n // Create producer declaration block\n const producerDeclarationPayload = createDeclarationIntent(\n account.address,\n 'producer',\n genesisBlock[0].block,\n genesisBlock[0].block + 10_000,\n )\n const producerDeclarationBlock = await buildNextBlock(\n genesisBlock[0],\n [],\n [producerDeclarationPayload],\n [account],\n )\n chain.push(producerDeclarationBlock)\n return chain\n}\n","import { buildNextBlock } from '@xyo-network/chain-protocol'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n BridgeDestinationObservation, BridgeDestinationObservationFields,\n HydratedBlockWithHashMeta,\n SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-protocol'\nimport { BridgeDestinationObservationSchema } from '@xyo-network/xl1-protocol'\nimport type { ChainService } from '@xyo-network/xl1-protocol-sdk'\n\nimport {\n getBridgeDestConfirmation, getBridgeDestinationDetails, getBridgeSourceDetails,\n} from './config/index.ts'\n\n/**\n * Get the bridge destination observation for a given block.\n * @param previousBlock The previous block to base the observation on.\n * @param account The wallet account to use for the observation.\n * @param chainService The chain service to use for the observation.\n */\nexport const getBridgeDestinationObservation = async (\n previousBlock: HydratedBlockWithHashMeta,\n account: WalletInstance,\n chainService: ChainService,\n): Promise<SignedHydratedBlockWithHashMeta> => {\n const bridgeDestinationObservationFields: BridgeDestinationObservationFields = {\n ...await getBridgeSourceDetails(account, chainService),\n ...getBridgeDestinationDetails(),\n destConfirmation: getBridgeDestConfirmation(),\n }\n const bridgeDestinationObservation = new PayloadBuilder<BridgeDestinationObservation>({ schema: BridgeDestinationObservationSchema })\n .fields(bridgeDestinationObservationFields)\n .build()\n\n return await buildNextBlock(\n previousBlock[0],\n [],\n [bridgeDestinationObservation],\n [account],\n )\n}\n","import { toHex } from '@xylabs/sdk-js'\nimport type { BridgeDetailsDestinationFields } from '@xyo-network/xl1-protocol'\n\nimport { getForkBlockRewardHex } from './getForkDetails.ts'\n\n// const bridgeableTokenContract = toHex('0x4865Cb10d55cfB0E60DD2B4F9b888f6a49B76733')\n// const bridgeDestAddress = toHex('0xe53218d47913b5f9E58bb74F0a0eD790bbF21972')\n// const destConfirmation = toHex('0x4fa05d7e799f36f1d45c441a4866eb4570a00a753a39377f404a8d113c01a657') // Eth TX for mint\nconst ethChainId = toHex('0x1')\nconst bridgeableTokenContract = toHex('0xf72aE3E0DA743033AbD7A407557D684c1aE66aed')\nconst bridgeDestAddress = toHex('0x0e65b65B10C791942665030402c35023d88B14dA')\nconst destConfirmation = toHex('0x950861b10523b52cdbb4a9ee52ed26601db555d2652bfec21c709e5e70d5b7d3') // Eth TX for mint\n\nexport const getBridgeDestChainId = () => ethChainId\nexport const getBridgeDestToken = () => bridgeableTokenContract\nexport const getBridgeDestAddress = () => bridgeDestAddress\nexport const getBridgeDestAmount = () => getForkBlockRewardHex()\nexport const getBridgeDestConfirmation = () => destConfirmation\n\nexport const getBridgeDestinationDetails = (): BridgeDetailsDestinationFields => {\n return {\n dest: getBridgeDestChainId(),\n destToken: getBridgeDestToken(),\n destAddress: getBridgeDestAddress(),\n destAmount: getBridgeDestAmount(),\n }\n}\n","import { type Hex, toHex } from '@xylabs/sdk-js'\nimport { AttoXL1ConvertFactor } from '@xyo-network/xl1-protocol'\n\nexport const getForkBlockReward = (): bigint => {\n return 18_000_000_000n * AttoXL1ConvertFactor.xl1 // 18b XL1 in AttoXL1\n}\n\nexport const getForkBlockRewardHex = (): Hex => {\n return toHex(getForkBlockReward())\n}\n","import type { AccountInstance } from '@xyo-network/account-model'\nimport type { BridgeDetailsSourceFields } from '@xyo-network/xl1-protocol'\nimport type { ChainService } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getForkBlockRewardHex } from './getForkDetails.ts'\n\nexport const getBridgeSrcChainId = (chainService: ChainService) => chainService.chainId()\nexport const getBridgeSrcAddress = (account: AccountInstance) => account.address\nexport const getBridgeSrcToken = (chainService: ChainService) => chainService.chainId()\nexport const getBridgeSrcAmount = () => getForkBlockRewardHex()\n\nexport const getBridgeSourceDetails = async (account: AccountInstance, chainService: ChainService): Promise<BridgeDetailsSourceFields> => {\n return {\n src: await getBridgeSrcChainId(chainService),\n srcAddress: getBridgeSrcAddress(account),\n srcToken: await getBridgeSrcToken(chainService),\n srcAmount: getBridgeSrcAmount(),\n }\n}\n","import { buildNextBlock, createTransferPayload } from '@xyo-network/chain-protocol'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n BridgeIntent, BridgeIntentFields,\n SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-protocol'\nimport { BridgeIntentSchema, XYO_BRIDGE_ADDRESS } from '@xyo-network/xl1-protocol'\nimport type { ChainService } from '@xyo-network/xl1-protocol-sdk'\n\nimport {\n getBridgeDestinationDetails, getBridgeSourceDetails, getForkBlockReward,\n} from './config/index.ts'\n\n/**\n * Get the bridge intent for a given block.\n * @param previousBlock The previous block to base the intent on.\n * @param account The wallet account to use for the intent.\n * @param chainService The chain service to use for the intent.\n */\nexport const getBridgeIntent = async (\n previousBlock: SignedHydratedBlockWithHashMeta,\n account: WalletInstance,\n chainService: ChainService,\n): Promise<SignedHydratedBlockWithHashMeta> => {\n // Create transfer to bridge address\n const transferPayload = createTransferPayload(\n account.address,\n { [XYO_BRIDGE_ADDRESS]: getForkBlockReward() },\n )\n\n // Use timestamp as nonce\n const nonce = `${Date.now()}`\n\n // Create Bridge Intent\n const bridgeIntentFields: BridgeIntentFields = {\n ...await getBridgeSourceDetails(account, chainService),\n ...getBridgeDestinationDetails(),\n nonce,\n }\n const bridgeIntent = new PayloadBuilder<BridgeIntent>({ schema: BridgeIntentSchema })\n .fields(bridgeIntentFields)\n .build()\n\n return await buildNextBlock(\n previousBlock[0],\n [],\n [bridgeIntent, transferPayload],\n [account],\n )\n}\n","import { buildNextBlock } from '@xyo-network/chain-protocol'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n BridgeSourceObservation, BridgeSourceObservationFields,\n SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-protocol'\nimport { BridgeSourceObservationSchema } from '@xyo-network/xl1-protocol'\nimport type { ChainService } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getBridgeDestinationDetails, getBridgeSourceDetails } from './config/index.ts'\n\n/**\n * Get the bridge source observation for a given block.\n * @param previousBlock The previous block to base the observation on.\n * @param account The wallet account to use for the observation.\n * @param chainService The chain service to use for the observation.\n */\nexport const getBridgeSourceObservation = async (\n previousBlock: SignedHydratedBlockWithHashMeta,\n account: WalletInstance,\n chainService: ChainService,\n): Promise<SignedHydratedBlockWithHashMeta> => {\n // TODO: Find actual transfer TX from previous block/source intent?\n // This hash should contain both the source intent and the transfer to the bridge address\n // As the block is itself both a block and a transaction, we can use its hash for now\n const srcTxHash = previousBlock[0]._hash\n\n const bridgeSourceObservationFields: BridgeSourceObservationFields = {\n ...await getBridgeSourceDetails(account, chainService),\n ...getBridgeDestinationDetails(),\n // Observation\n srcConfirmation: srcTxHash,\n }\n\n const bridgeSourceObservation = new PayloadBuilder<BridgeSourceObservation>({ schema: BridgeSourceObservationSchema })\n .fields(bridgeSourceObservationFields)\n .build()\n\n return await buildNextBlock(\n previousBlock[0],\n [],\n [bridgeSourceObservation],\n [account],\n )\n}\n","import { buildBlock, type BuildNextBlockOptions } from '@xyo-network/chain-protocol'\nimport type { WithHashMeta } from '@xyo-network/payload-model'\nimport type { WalletInstance } from '@xyo-network/wallet-model'\nimport type {\n BlockBoundWitness,\n SignedHydratedBlockWithHashMeta,\n} from '@xyo-network/xl1-protocol'\nimport { AttoXL1, XYO_STEP_REWARD_ADDRESS } from '@xyo-network/xl1-protocol'\nimport type { ChainService } from '@xyo-network/xl1-protocol-sdk'\n\n/**\n * Get the first block for the new forked chain.\n * @param forkBlock The block to fork from\n * @param account The wallet account to sign the block\n * @param chainService The chain service instance\n * @returns The first block for the new forked chain\n */\nexport const getFirstBlockForNewChain = async (\n forkBlock: WithHashMeta<BlockBoundWitness>,\n account: WalletInstance,\n chainService: ChainService,\n): Promise<SignedHydratedBlockWithHashMeta> => {\n const {\n _hash: previousBlockHash, block: previousBlockNumber, step_hashes: previousStepHashes = [], protocol,\n } = forkBlock\n const chainId = await chainService.chainId()\n const options: BuildNextBlockOptions = {\n blockPayloads: [],\n chainId,\n previousBlockHash,\n previousBlockNumber,\n previousStepHashes,\n signers: [account],\n txs: [],\n protocol,\n chainStepRewardAddress: XYO_STEP_REWARD_ADDRESS,\n stepRewardPoolBalance: AttoXL1(0n),\n }\n // Can not use buildNextBlock because we need to control the chain id change here\n return await buildBlock(options)\n}\n","import type { WalletInstance } from '@xyo-network/wallet-model'\nimport type { SignedBlockBoundWitnessWithHashMeta, SignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-protocol'\nimport type { ChainService } from '@xyo-network/xl1-protocol-sdk'\n\nimport { getBridgeDestinationObservation } from './getBridgeDestinationObservation.ts'\nimport { getBridgeIntent } from './getBridgeIntent.ts'\nimport { getBridgeSourceObservation } from './getBridgeSourceObservation.ts'\nimport { getFirstBlockForNewChain } from './getFirstBlockForNewChain.ts'\n\nexport const createForkedHead = async (\n forkFromBlock: SignedBlockBoundWitnessWithHashMeta,\n account: WalletInstance,\n chainService: ChainService,\n): Promise<SignedHydratedBlockWithHashMeta[]> => {\n const chain: SignedHydratedBlockWithHashMeta[] = []\n // Build the first block for the new chain\n const firstBlockForNewChain = await getFirstBlockForNewChain(forkFromBlock, account, chainService)\n chain.push(firstBlockForNewChain)\n // Build the bridge intent\n const bridgeIntent = await getBridgeIntent(firstBlockForNewChain, account, chainService)\n chain.push(bridgeIntent)\n // Build the bridge source observation\n const bridgeSourceObservation = await getBridgeSourceObservation(bridgeIntent, account, chainService)\n chain.push(bridgeSourceObservation)\n // Build the bridge destination observation\n const bridgeDestinationObservation = await getBridgeDestinationObservation(bridgeSourceObservation, account, chainService)\n chain.push(bridgeDestinationObservation)\n return chain\n}\n","import type { Address, Hash } from '@xylabs/sdk-js'\nimport {\n asHash, hexFromBigInt, isDefined,\n} from '@xylabs/sdk-js'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { SignedBlockBoundWitnessWithHashMeta } from '@xyo-network/xl1-protocol'\nimport { isSignedBlockBoundWitnessWithHashMeta } from '@xyo-network/xl1-protocol'\nimport type { ChainService } from '@xyo-network/xl1-protocol-sdk'\n\n/**\n * Determine if the chain should fork based on the current head and chain configuration.\n * @param head The current head block\n * @param chainService The chain service instance\n * @param chainArchivist The chain archivist instance\n * @returns The block to fork from if the chain should fork, undefined otherwise\n */\nexport const getForkFromBlock = async (\n head: SignedBlockBoundWitnessWithHashMeta,\n chainService: ChainService,\n chainArchivist: ArchivistInstance,\n): Promise<SignedBlockBoundWitnessWithHashMeta | undefined> => {\n // If the head's chain doesn't match our chainId, we may need to fork\n if (head.chain !== await chainService.chainId()) {\n // Get the forked at hash from the chain service\n const forkedAtBigInt = await chainService.forkedAtHash()\n const forkedAtHex = hexFromBigInt(forkedAtBigInt) // Validate it's a proper hex string\n const forkedAtHash: Hash | undefined = asHash(forkedAtHex)\n if (isDefined(forkedAtHash)) {\n // If we have a forkedAtHash, we need to check if the correct block exists\n const [forkedAtBlock] = await chainArchivist.get([forkedAtHash])\n const forkedChainId: Address = await chainService.forkedChainId()\n const forkedAtBlockNumber: number = Number(await chainService.forkedAtBlockNumber())\n // If we found the block hash we should fork at, check if it's a valid BlockBoundWitness\n if (isSignedBlockBoundWitnessWithHashMeta(forkedAtBlock)\n // And it is on the correct forked from chain\n && forkedAtBlock.chain === forkedChainId\n // And it is the correct forked at block number\n && forkedAtBlock.block === forkedAtBlockNumber) {\n return forkedAtBlock\n }\n }\n }\n}\n","import { delay } from '@xylabs/sdk-js'\nimport type { ArchivistInstance, WriteArchivist } from '@xyo-network/archivist-model'\nimport type { SignedHydratedBlockWithHashMeta } from '@xyo-network/xl1-protocol'\nimport { flattenHydratedBlock } from '@xyo-network/xl1-protocol-sdk'\n\n/**\n * Submit a new chain to the archivist.\n * @param chain The new chain to submit\n * @param chainArchivist The chain archivist instance\n * @param chainSubmissionsArchivistWrite The chain submissions archivist instance\n */\nexport const submitNewChain = async (\n chain: SignedHydratedBlockWithHashMeta[],\n chainArchivist: ArchivistInstance,\n chainSubmissionsArchivistWrite: WriteArchivist,\n): Promise<void> => {\n for (const block of chain) {\n const [bw] = block\n await chainSubmissionsArchivistWrite.insert(flattenHydratedBlock(block))\n // Wait for block to show up in finalized archivist\n while (true) {\n const result = await chainArchivist.get([bw._hash])\n if (result.length > 0) break\n await delay(1000) // Wait 1 second before retrying\n }\n }\n}\n","import { isDefined, type Promisable } from '@xylabs/sdk-js'\nimport type { Initializable, InitializableParams } from '@xyo-network/xl1-protocol'\nimport type { Config, MempoolRunner } from '@xyo-network/xl1-protocol-sdk'\nimport {\n HttpRpcTransport,\n JsonRpcMempoolRunner,\n MempoolRunnerRpcSchemas,\n} from '@xyo-network/xl1-rpc'\n\nlet mempoolRunnerSingleton: Promisable<MempoolRunner> | undefined\n\nexport type InitMempoolRunnerParams = InitializableParams<{\n config: Config\n}>\n\nexport const initMempoolRunner: Initializable<InitMempoolRunnerParams, MempoolRunner>\n = (params): Promisable<MempoolRunner> => {\n const { config, logger } = params\n if (mempoolRunnerSingleton) return mempoolRunnerSingleton\n const endpoint = config.services?.apiEndpoint\n if (isDefined(endpoint)) {\n const transport = new HttpRpcTransport(endpoint, { ...MempoolRunnerRpcSchemas })\n const runner = new JsonRpcMempoolRunner(transport)\n logger?.log('Using mempoolRunner RPC service at', endpoint)\n return runner\n } else {\n throw new Error('No MempoolRunner endpoint configured')\n }\n }\n","import { isDefined, type Promisable } from '@xylabs/sdk-js'\nimport type { Initializable, InitializableParams } from '@xyo-network/xl1-protocol'\nimport type { Config, MempoolViewer } from '@xyo-network/xl1-protocol-sdk'\nimport {\n HttpRpcTransport,\n JsonRpcMempoolViewer,\n MempoolViewerRpcSchemas,\n} from '@xyo-network/xl1-rpc'\n\nlet mempoolViewerSingleton: Promisable<MempoolViewer> | undefined\n\nexport type InitMempoolViewerParams = InitializableParams<{\n config: Config\n}>\n\nexport const initMempoolViewer: Initializable<InitMempoolViewerParams, MempoolViewer>\n = (params): Promisable<MempoolViewer> => {\n const { config, logger } = params\n if (mempoolViewerSingleton) return mempoolViewerSingleton\n const endpoint = config.services?.apiEndpoint\n if (isDefined(endpoint)) {\n const transport = new HttpRpcTransport(endpoint, { ...MempoolViewerRpcSchemas })\n const viewer = new JsonRpcMempoolViewer(transport)\n logger?.log('Using MempoolViewer RPC service at', endpoint)\n return viewer\n } else {\n throw new Error('No MempoolViewer endpoint configured')\n }\n }\n","import { isDefined, type Promisable } from '@xylabs/sdk-js'\nimport type { Initializable, InitializableParams } from '@xyo-network/xl1-protocol'\nimport type { Config, MempoolViewer } from '@xyo-network/xl1-protocol-sdk'\nimport { timeBudget } from '@xyo-network/xl1-protocol-sdk'\nimport {\n HttpRpcTransport, JsonRpcMempoolViewer, MempoolViewerRpcSchemas,\n} from '@xyo-network/xl1-rpc'\n\nimport { BasePendingTransactionsService, type BasePendingTransactionsServiceParams } from '../PendingTransactions/index.ts'\n\nlet serviceSingleton: Promisable<MempoolViewer> | undefined\n\nexport type InitPendingTransactionsServiceParams = InitializableParams<{\n config: Config\n params?: BasePendingTransactionsServiceParams\n}>\n\nexport const initPendingTransactions: Initializable<InitPendingTransactionsServiceParams, MempoolViewer> = async (\n {\n config, params, logger,\n }: InitPendingTransactionsServiceParams,\n): Promise<MempoolViewer> => {\n if (serviceSingleton) return serviceSingleton\n return await timeBudget('initPendingTransactions', logger, async () => {\n const endpoint = config.services?.apiEndpoint\n if (isDefined(endpoint)) {\n const transport = new HttpRpcTransport(endpoint, { ...MempoolViewerRpcSchemas })\n const viewer = new JsonRpcMempoolViewer(transport)\n logger?.log('Using MempoolViewer RPC service at', endpoint)\n return viewer\n } else {\n serviceSingleton = await BasePendingTransactionsService.create(params)\n }\n return serviceSingleton\n }, 2000, true)\n}\n","import { ValueType } from '@opentelemetry/api'\nimport {\n assertEx, creatable,\n exists,\n filterAs, filterAsync, forget, Hash,\n isDefined, isUndefined,\n} from '@xylabs/sdk-js'\nimport { MemoryArchivist } from '@xyo-network/archivist-memory'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport {\n Payload, PayloadBundle, Sequence, WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport {\n asBlockBoundWitnessWithHashMeta, asXL1BlockNumber, ChainId, HydratedTransactionValidationFunction, isTransactionBoundWitnessWithStorageMeta,\n SignedHydratedBlockWithHashMeta,\n SignedHydratedTransactionWithHashMeta,\n SignedHydratedTransactionWithStorageMeta,\n XL1BlockNumber,\n} from '@xyo-network/xl1-protocol'\nimport {\n findMostRecentBlock, MempoolViewer, MempoolViewerMoniker, PendingBlocksOptions, PendingTransactionsOptions,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { TransactionJsonSchemaValidator, validateTransaction } from '@xyo-network/xl1-validation'\nimport { Mutex } from 'async-mutex'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\nimport { bundledPayloadToHydratedTransaction } from './bundledPayloadToHydratedTransaction.ts'\nimport { hydratedTransactionToPayloadBundle } from './hydratedTransactionToPayloadBundle.ts'\n\nexport interface BasePendingTransactionsServiceParams extends BaseServiceParams {\n additionalPendingTransactionValidators?: HydratedTransactionValidationFunction[]\n chainArchivist: ArchivistInstance\n chainId: ChainId\n pendingBundledTransactionsArchivist: ArchivistInstance\n rejectedTransactionsArchivist: ArchivistInstance\n}\n\n@creatable()\nexport class BasePendingTransactionsService extends BaseService<BasePendingTransactionsServiceParams> implements MempoolViewer {\n static readonly defaultMoniker = MempoolViewerMoniker\n static readonly monikers = [MempoolViewerMoniker]\n\n private static readonly MutexPriority = {\n /**\n * Priority for inserting new transactions\n */\n InsertNewTransactions: 5,\n /**\n * Priority for reading pending transactions\n */\n ReadTransactions: 3,\n /**\n * Priority for removing finalized/expired/rejected transactions\n */\n PurgeTransactions: 1,\n } as const\n\n moniker = BasePendingTransactionsService.defaultMoniker\n\n /**\n * A mutex to ensure that the counting the number of pending transactions is\n * not called concurrently\n */\n private _countPendingTransactionsMutex = new Mutex()\n\n /**\n * A local Archivist optimized for fast retrieval that stores only validated\n * pending transactions\n */\n private _curatedPendingBundledTransactionsArchivist: MemoryArchivist | undefined\n\n /**\n * The last count of total pending transactions\n */\n private _pendingTransactionsCount: number = 0\n\n /**\n * A set of transaction hashes that are pending removal from the\n * curated pending transactions archivist. This is used to track\n * which transactions need to be removed from the archivist.\n */\n private _removablePendingTransactionHashes: Set<Hash> = new Set()\n\n /**\n * A mutex to ensure that the curated pending transactions archivist is\n * updated in a thread-safe manner\n */\n private _updateCuratedPendingTransactionsArchivistMutex = new Mutex()\n\n private get additionalPendingTransactionValidators() {\n return this.params.additionalPendingTransactionValidators ?? []\n }\n\n private get chainArchivist() {\n return assertEx(this.params.chainArchivist, () => 'No completed blocks with data archivist')\n }\n\n private get chainId() {\n return assertEx(this.params.chainId, () => 'No chain id')\n }\n\n private get pendingBundledTransactionsArchivist() {\n return assertEx(this.params.pendingBundledTransactionsArchivist, () => 'No pending bundled transactions archivist')\n }\n\n private get pendingBundledTransactionsLocalArchivist() {\n return assertEx(this._curatedPendingBundledTransactionsArchivist, () => 'No pending bundled transactions curated archivist')\n }\n\n private get pendingTransactionsCount() {\n forget(this.countPendingTransactions())\n return this._pendingTransactionsCount\n }\n\n private get rejectedTransactionsArchivist() {\n return assertEx(this.params.rejectedTransactionsArchivist, () => 'No rejected transactions archivist')\n }\n\n override async createHandler() {\n await super.createHandler()\n this._curatedPendingBundledTransactionsArchivist = await MemoryArchivist.create({ account: 'random' })\n\n // On new pending transactions, insert them into the curated archivist\n this.pendingBundledTransactionsArchivist.on('inserted', ({ payloads }) => {\n forget(this.insertNewTransactions(payloads as WithStorageMeta<PayloadBundle>[]))\n })\n\n // On new finalized blocks, remove the transactions from the curated archivist\n this.chainArchivist.on('inserted', ({ payloads }) => {\n this.markAnyIncludedTransactionsForRemoval(payloads)\n forget(this.cleanupWorker())\n })\n\n // On new rejected transactions, remove the transactions from the curated archivist\n this.rejectedTransactionsArchivist.on('inserted', ({ payloads }) => {\n this.markAnyIncludedTransactionsForRemoval(payloads)\n forget(this.cleanupWorker())\n })\n\n const pendingTransactionsCounter = this.meter?.createObservableUpDownCounter(\n 'xyo_pending_transactions_counter',\n {\n description: 'The current number of pending transactions', valueType: ValueType.INT, unit: '1',\n },\n )\n pendingTransactionsCounter?.addCallback((observer) => {\n observer.observe(this.pendingTransactionsCount)\n })\n }\n\n pendingBlocks(_options?: PendingBlocksOptions): Promise<SignedHydratedBlockWithHashMeta[]> {\n throw new Error('Method [pendingBlocks] not implemented.')\n }\n\n async pendingTransactions({ limit = 100 }: PendingTransactionsOptions = {}): Promise<SignedHydratedTransactionWithStorageMeta[]> {\n return await this.spanAsync('getPendingTransactions', async () => {\n // Acquires an exclusive mutex to ensure no race conditions while accessing pending transactions.\n return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {\n // Find the supplied head\n let lastHead = (filterAs(await this.chainArchivist.next({ limit: 100 }), x => asBlockBoundWitnessWithHashMeta(x))).at(-1)\n if (isUndefined(lastHead)) return []\n\n await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash)\n\n const foundPendingTransactions: SignedHydratedTransactionWithStorageMeta[] = []\n let cursor: Sequence | undefined\n\n // Continue fetching until the desired number of transactions is reached.\n while (foundPendingTransactions.length < limit) {\n // Fetch the next batch of payloads\n const pendingBundledTransactions = await this.pendingBundledTransactionsLocalArchivist.next({\n limit: 100,\n order: 'asc',\n cursor,\n }) as WithStorageMeta<PayloadBundle>[]\n\n // Exit if no more payloads are available.\n if (pendingBundledTransactions.length === 0) break\n\n // Update the cursor for the next iteration to fetch subsequent payloads.\n cursor = pendingBundledTransactions.at(-1)?._sequence\n\n // Keep only those payloads that are not marked for deletion.\n const undeletedTransactionBundles = pendingBundledTransactions.filter(tx =>\n !this._removablePendingTransactionHashes.has(tx.root))\n\n // Convert each undeleted payload bundle into a hydrated transaction.\n const transactions = (await Promise.all(\n undeletedTransactionBundles.map(p => bundledPayloadToHydratedTransaction(p)),\n )).filter(exists)\n\n // Filter transactions to only include those that are active for the next\n // potential block based on the last supplied head.\n const activeTransactions = transactions.filter(isTransactionActive(asXL1BlockNumber(lastHead.block + 1, true)))\n\n const txValidationResults = await Promise.all(activeTransactions.map(async tx => ([tx, await validateTransaction(\n tx,\n { chainId: this.chainId },\n this.additionalPendingTransactionValidators,\n )])))\n\n const validTransactions = txValidationResults.filter((\n [, errors],\n ) => errors.length === 0).map(([tx]) => tx) as SignedHydratedTransactionWithStorageMeta[]\n\n const invalidTransactions = txValidationResults.filter((\n [, errors],\n ) => errors.length > 0).map(([tx]) => tx) as SignedHydratedTransactionWithStorageMeta[]\n\n if (invalidTransactions.length > 0) {\n this.logger?.warn(`getPendingTransactions: Found ${invalidTransactions.length} invalid pending transactions`)\n for (const tx of invalidTransactions) {\n this.logger?.warn(tx[0]._hash)\n }\n }\n\n // Add the valid hydrated transactions to the result set.\n foundPendingTransactions.push(...validTransactions)\n }\n\n if (foundPendingTransactions.length > 0) {\n this.logger?.log(`getPendingTransactions: Found ${foundPendingTransactions.length} pending transactions`)\n for (const tx of foundPendingTransactions) {\n this.logger?.log(tx[0]._hash)\n }\n }\n\n return foundPendingTransactions\n }, BasePendingTransactionsService.MutexPriority.ReadTransactions)\n })\n }\n\n private async cleanupWorker() {\n return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {\n const lastHead = await findMostRecentBlock(this.chainArchivist)\n if (isDefined(lastHead)) await this.pruneCuratedPendingTransactionsArchivist(lastHead._hash)\n }, BasePendingTransactionsService.MutexPriority.PurgeTransactions)\n }\n\n private async countPendingTransactions() {\n if (this._countPendingTransactionsMutex.isLocked()) return\n await this._countPendingTransactionsMutex.runExclusive(async () => {\n const payloads = (await this._curatedPendingBundledTransactionsArchivist?.all()) ?? []\n this._pendingTransactionsCount = payloads.length\n })\n }\n\n private async filterAlreadyFinalizedTransactions(\n incomingTransactions: WithStorageMeta<PayloadBundle>[],\n ): Promise<WithStorageMeta<PayloadBundle>[]> {\n const incomingTransactionHashes = incomingTransactions.map(payload => payload.root)\n const finalizedTransactions = await this.chainArchivist.get(incomingTransactionHashes)\n const finalizedTransactionHashes = new Set(finalizedTransactions.map(item => item._hash))\n const nonFinalizedTransactions = incomingTransactions.filter(item => !finalizedTransactionHashes.has(item._hash))\n return nonFinalizedTransactions\n }\n\n private async insertNewTransactions(payloads: WithStorageMeta<PayloadBundle>[]) {\n if (payloads.length === 0) return\n return await this.spanAsync('InsertNewTransactions', async () => {\n return await this._updateCuratedPendingTransactionsArchivistMutex.runExclusive(async () => {\n // Check incoming transactions against finalized transactions\n const unprocessedTransactions = await this.filterAlreadyFinalizedTransactions(payloads)\n // Hydrate all unprocessed transactions\n const hydratedUnprocessedTransactions = (await Promise.all(unprocessedTransactions.map(async (tx) => {\n return await bundledPayloadToHydratedTransaction(tx)\n }))).filter(exists)\n // Filter to only valid transactions\n const validTransactions = await filterAsync(hydratedUnprocessedTransactions, async (tx) => {\n const errors = await validateTransaction(tx, { chainId: this.chainId }, [TransactionJsonSchemaValidator])\n if (errors.length > 0) {\n this.logger?.warn('validateTransaction', errors)\n }\n return errors.length > 0 ? false : true\n })\n if (validTransactions.length > 0) {\n const bundledTransactions = validTransactions.map(tx => hydratedTransactionToPayloadBundle(tx))\n await this.pendingBundledTransactionsLocalArchivist.insert(bundledTransactions)\n }\n }, BasePendingTransactionsService.MutexPriority.InsertNewTransactions)\n })\n }\n\n /**\n * Marks any included transactions in the provided payloads for removal preventing them\n * from being included in the curated pending transactions archivist and from being offered\n * during the next retrieval of pending transactions.\n * @param payloads An array of payloads that may contain transactions.\n */\n private markAnyIncludedTransactionsForRemoval(payloads: WithStorageMeta<Payload>[]) {\n const hashes = payloads.filter(isTransactionBoundWitnessWithStorageMeta).map(p => p._hash)\n for (const hash of hashes) {\n this._removablePendingTransactionHashes.add(hash)\n }\n }\n\n private async pruneCuratedPendingTransactionsArchivist(head: Hash) {\n return await this.spanAsync('pruneCuratedPendingTransactionsArchivist', async () => {\n const foundPendingTransactionsToDeleteHashes: Hash[] = []\n\n let cursor: Sequence | undefined\n let [lastHead] = filterAs(await this.chainArchivist.get([head]), x => asBlockBoundWitnessWithHashMeta(x))\n\n // Continue fetching until the desired number of transactions is reached.\n while (isDefined(lastHead)) {\n // Fetch the next batch of payloads\n const pendingBundledTransactions = await this.pendingBundledTransactionsLocalArchivist.next({\n limit: 100,\n order: 'asc',\n cursor,\n }) as WithStorageMeta<PayloadBundle>[]\n\n // Exit if no more payloads are available.\n if (pendingBundledTransactions.length === 0) {\n break\n }\n\n // Update the cursor for the next iteration to fetch subsequent payloads.\n cursor = pendingBundledTransactions.at(-1)?._sequence\n\n // Filter out bundles that are marked as removable.\n const deletedTransactionBundles = pendingBundledTransactions.filter(tx =>\n this._removablePendingTransactionHashes.has(tx.root))\n\n // Queue the hashes of deletable transactions for deletion and cleanup.\n foundPendingTransactionsToDeleteHashes.push(\n ...deletedTransactionBundles.map(tx => tx._hash).filter(exists),\n )\n\n // Keep only those payloads that are not marked for deletion.\n const undeletedTransactionBundles = pendingBundledTransactions.filter(tx =>\n !this._removablePendingTransactionHashes.has(tx.root))\n\n // Convert each undeleted payload bundle into a hydrated transaction.\n const transactions = (await Promise.all(\n undeletedTransactionBundles.map(p => bundledPayloadToHydratedTransaction(p)),\n )).filter(exists)\n\n // Find expired transactions based on the last supplied head\n const expiredTransactions = transactions.filter(isTransactionExpired(asXL1BlockNumber(lastHead.block + 1, true)))\n // Find the corresponding bundle hashes for the expired transactions\n const expiredBundleHashes = expiredTransactions\n .map(expiredHydratedTx =>\n // Find the corresponding payload bundle hash for the expired transaction\n pendingBundledTransactions.find(bundledTx => bundledTx.root === expiredHydratedTx[0]._hash)?._hash)\n .filter(exists)\n // Mark all expired bundled transactions for deletion.\n foundPendingTransactionsToDeleteHashes.push(...expiredBundleHashes)\n }\n\n // Actually delete the marked payload bundles from the archivist\n const deletedHashes = await this.pendingBundledTransactionsLocalArchivist.delete(foundPendingTransactionsToDeleteHashes)\n\n // Remove all deleted hashes from the \"pending delete\" set now that they are deleted\n for (const payload of deletedHashes) {\n this._removablePendingTransactionHashes.delete(payload._hash)\n }\n\n if (deletedHashes.length > 0) {\n this.logger?.log(`foundPendingTransactionsToDeleteHashes: Found ${deletedHashes.length} deletable transactions`)\n for (const payload of deletedHashes) {\n this.logger?.log(payload._hash)\n }\n }\n })\n }\n}\n\n/**\n * Checks if a transaction is expired for a given block.\n * @param block The block number to check against the transaction's validity period.\n * @returns True if the transaction is expired for the given block, false otherwise.\n */\nconst isTransactionExpired = (block: XL1BlockNumber) =>\n ([txBw]: SignedHydratedTransactionWithHashMeta): boolean =>\n txBw.exp < block\n\n/**\n * Checks if a transaction is active for a given block.\n * @param block The block number to check against the transaction's validity period.\n * @returns True if the transaction is active for the given block, false otherwise.\n */\nconst isTransactionActive = (block: XL1BlockNumber) =>\n ([txBw]: SignedHydratedTransactionWithHashMeta): boolean =>\n txBw.nbf <= block && txBw.exp >= block\n","import { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { PayloadBundle, WithStorageMeta } from '@xyo-network/payload-model'\nimport type { SignedHydratedTransactionWithHashMeta } from '@xyo-network/xl1-protocol'\nimport { asSignedTransactionBoundWitnessWithHashMeta } from '@xyo-network/xl1-protocol'\n\nexport const bundledPayloadToHydratedTransaction = async (\n payload: WithStorageMeta<PayloadBundle>,\n): Promise<SignedHydratedTransactionWithHashMeta | undefined> => {\n const withHashMeta = await PayloadBuilder.addHashMeta(payload.payloads)\n const tx = asSignedTransactionBoundWitnessWithHashMeta(withHashMeta.find(p => p._hash === payload.root))\n if (tx) {\n return [tx, withHashMeta.filter(p => p._hash !== payload.root)]\n }\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type { PayloadBundle } from '@xyo-network/payload-model'\nimport { PayloadBundleSchema } from '@xyo-network/payload-model'\nimport type { SignedHydratedTransactionWithHashMeta } from '@xyo-network/xl1-protocol'\nimport { flattenHydratedTransaction } from '@xyo-network/xl1-protocol-sdk'\n\nexport const hydratedTransactionToPayloadBundle = (transaction: SignedHydratedTransactionWithHashMeta): PayloadBundle => {\n const root = transaction[0]._hash\n return bundle(root, transaction)\n}\n\nconst bundle = (root: Hash, transaction: SignedHydratedTransactionWithHashMeta) => {\n const payloads = flattenHydratedTransaction(transaction).flatMap(p => PayloadBuilder.omitStorageMeta(p))\n return new PayloadBuilder<PayloadBundle>({ schema: PayloadBundleSchema })\n .fields({ payloads, root })\n .build()\n}\n","import type { Promisable } from '@xylabs/sdk-js'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport { type BlockProducerService, timeBudget } from '@xyo-network/xl1-protocol-sdk'\n\nimport { SimpleBlockRunner, type SimpleBlockRunnerParams } from '../simple/index.ts'\n\nlet serviceSingleton: Promisable<BlockProducerService> | undefined\n\nexport const initBlockProducer: Initializable<SimpleBlockRunnerParams, BlockProducerService>\n = async (params: SimpleBlockRunnerParams): Promise<BlockProducerService> => {\n if (serviceSingleton) return serviceSingleton\n return await timeBudget('initBlockProducer', params.logger, async () => {\n serviceSingleton = await SimpleBlockRunner.create(params)\n return serviceSingleton\n }, 2000, true)\n }\n","import {\n AbstractCreatable,\n Address,\n AddressZod, asHash, assertEx, creatable, CreatableParams, exists, Hex, hexToBigInt, isDefined, Promisable,\n} from '@xylabs/sdk-js'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { MemoryArchivist } from '@xyo-network/archivist-memory'\nimport { ArchivistInstance } from '@xyo-network/archivist-model'\nimport {\n BlockRewardDiviner, FixedPercentageBlockRewardDiviner, FixedPercentageBlockRewardDivinerConfigSchema,\n} from '@xyo-network/chain-modules'\nimport { buildNextBlock, createDeclarationIntent } from '@xyo-network/chain-protocol'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { WithHashMeta } from '@xyo-network/payload-model'\nimport {\n AllowedBlockPayload, asBlockBoundWitness, AttoXL1, BlockBoundWitness, BlockNumberPayload, BlockNumberSchema,\n ChainId,\n ChainStakeIntent, defaultRewardRatio, SignedBlockBoundWitnessWithHashMeta,\n SignedHydratedBlockWithHashMeta, SignedHydratedTransaction, TimePayload, TimeSchema,\n Transfer, XYO_STEP_REWARD_ADDRESS,\n} from '@xyo-network/xl1-protocol'\nimport {\n AccountBalanceViewer, BlockRewardViewer, BlockRunner, Config,\n HydratedBlockStateValidationFunction,\n MempoolRunner,\n MempoolViewer,\n TimeSyncViewer,\n} from '@xyo-network/xl1-protocol-sdk'\nimport z from 'zod'\n\nimport { generateTransactionFeeTransfers } from './generateTransactionFeeTransfers.ts'\n\n/**\n * The default block size for a block\n */\nexport const DEFAULT_BLOCK_SIZE = 10\n\n/**\n * The amount of time for which a producer will restake their intent\n */\nexport const XYO_PRODUCER_REDECLARATION_DURATION = 10_000\n\n/**\n * The number of blocks within which a producer will redeclare\n * their intent to produce blocks\n */\nexport const XYO_PRODUCER_REDECLARATION_WINDOW = 500\n\nexport const SimpleBlockRunnerParamsZod = z.object({\n balanceViewer: z.object().loose(),\n blockRewardViewer: z.object().loose(),\n chainId: z.string(),\n config: z.object().loose(),\n mempoolViewer: z.object().loose(),\n mempoolRunner: z.object().loose(),\n rejectedTransactionsArchivist: z.object().loose().optional(),\n rewardAddress: AddressZod,\n time: z.object().loose(),\n validateHydratedBlockState: z.function().optional(),\n})\n\nexport type SimpleBlockRunnerParams = CreatableParams & {\n account: AccountInstance\n balanceViewer: AccountBalanceViewer\n blockRewardViewer: BlockRewardViewer\n chainId: ChainId\n config: Config\n mempoolRunner: MempoolRunner\n mempoolViewer: MempoolViewer\n rejectedTransactionsArchivist?: ArchivistInstance\n rewardAddress: Address\n time: TimeSyncViewer\n validateHydratedBlockState?: HydratedBlockStateValidationFunction\n}\n\n@creatable()\nexport class SimpleBlockRunner extends AbstractCreatable<SimpleBlockRunnerParams> implements BlockRunner {\n protected _blockRewardDiviner: BlockRewardDiviner | undefined\n protected _lastRedeclarationBlock: number | undefined\n protected _rejectedTransactionsArchivist: ArchivistInstance | undefined\n\n /**\n * The default block size for a block\n */\n static get DefaultBlockSize(): number {\n return DEFAULT_BLOCK_SIZE\n }\n\n /**\n * The amount of time for which the producer will redeclare\n * their intent to continue producing blocks\n */\n static get RedeclarationDuration(): number {\n return XYO_PRODUCER_REDECLARATION_DURATION\n }\n\n /**\n * The number of blocks within which the producer will redeclare\n * their intent to continue producing blocks\n */\n static get RedeclarationWindow(): number {\n return XYO_PRODUCER_REDECLARATION_WINDOW\n }\n\n get address() {\n return this.account.address\n }\n\n protected get account() {\n return assertEx(this.params.account, () => 'account is required')\n }\n\n protected get balanceViewer() {\n return assertEx(this.params.balanceViewer, () => 'balanceViewer is required')\n }\n\n protected get blockRewardViewer() {\n return assertEx(this.params.blockRewardViewer, () => 'blockRewardViewer is required')\n }\n\n protected get chainId() {\n return assertEx(this.params.chainId, () => 'chainId is required')\n }\n\n // protected get electionService() {\n // return assertEx(this.params.electionService, () => 'electionService is required')\n // }\n\n protected get mempoolRunner() {\n return assertEx(this.params.mempoolRunner, () => 'mempoolRunner is required')\n }\n\n protected get mempoolViewer() {\n return assertEx(this.params.mempoolViewer, () => 'mempoolViewer is required')\n }\n\n // protected get pendingTransactionsService() {\n // return assertEx(this.params.pendingTransactionsService, () => 'Missing pendingTransactionsService')\n // }\n\n protected get rejectedTransactionsArchivist() {\n return this._rejectedTransactionsArchivist!\n }\n\n protected get rewardAddress(): Address {\n return assertEx(this.params.rewardAddress, () => 'No reward address provided')\n }\n\n // protected get stakeIntentService(): StakeIntentService {\n // return assertEx(this.params.stakeIntentService, () => 'No StakeIntentService provided')\n // }\n\n protected get time(): TimeSyncViewer {\n return assertEx(this.params.time, () => 'No TimeSyncViewer provided')\n }\n\n // protected get validateHydratedBlockState() {\n // return assertEx(this.params.validateHydratedBlockState, () => 'validateHydratedBlockState is required')\n // }\n\n static override async paramsHandler(params?: Partial<SimpleBlockRunnerParams> | undefined): Promise<SimpleBlockRunnerParams> {\n // TODO: Use a real zod and move the zod check to the AbstractCreatable class\n SimpleBlockRunnerParamsZod.parse(params)\n const rejectedTransactionsArchivist = params?.rejectedTransactionsArchivist ?? await MemoryArchivist.create()\n return {\n ...(await super.paramsHandler(params)), ...params, rejectedTransactionsArchivist,\n } as SimpleBlockRunnerParams\n }\n\n async next(head: WithHashMeta<BlockBoundWitness>): Promise<SignedHydratedBlockWithHashMeta | undefined> {\n // If the block is for another chain, ignore\n if (head.chain !== this.chainId) return\n // const leadersStart = Date.now()\n // const leaders = await this.electionService.getCreatorCommitteeForNextBlock(head)\n // const leadersDuration = Date.now() - leadersStart\n // if (leadersDuration > 100) {\n // this.logger?.warn(`[Slow] Fetched leaders in ${leadersDuration}ms: ${leaders.map(l => l.slice(0, 6)).join(', ')}`)\n // }\n // TODO: Should we propose block if creator committee is empty?\n // TODO: Handle the case where we're not the 1st leader but they're not responding\n // at a higher level than here as that's a network issue\n // if (!leaders.includes(this.address)) return\n return await this.proposeNextValidBlock(head)\n }\n\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force: true): Promise<SignedHydratedBlockWithHashMeta>\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force?: false): Promise<SignedHydratedBlockWithHashMeta | undefined>\n async produceNextBlock(head: SignedBlockBoundWitnessWithHashMeta, force?: boolean): Promise<SignedHydratedBlockWithHashMeta | undefined> {\n assertEx(head.chain === this.chainId, () => 'Block chain ID does not match')\n const result = await this.proposeNextValidBlock(head)\n return force ? assertEx(result, () => 'Failed to produce next block') : result\n }\n\n protected async getBlockRewardTransfers(block: number): Promise<Transfer[]> {\n if (!this._blockRewardDiviner) {\n // TODO: Adjust to allow for genesis block reward vs. normal block reward\n this._blockRewardDiviner = await FixedPercentageBlockRewardDiviner.create({\n account: 'random',\n blockRewardViewer: this.blockRewardViewer,\n config: {\n rewardAddress: this.rewardAddress,\n rewardPercentageRatio: defaultRewardRatio,\n schema: FixedPercentageBlockRewardDivinerConfigSchema,\n },\n })\n }\n\n const blockId = new PayloadBuilder<BlockNumberPayload>({ schema: BlockNumberSchema }).fields({ block }).build()\n const rewards = await this._blockRewardDiviner.divine([blockId])\n return rewards as Transfer[]\n }\n\n /**\n * Handles the producer redeclaration logic\n * @param head The current head block\n * @returns chain stake intent for the producer redeclaration, or undefined if no redeclaration is needed\n */\n protected getProducerRedeclaration(head: WithHashMeta<BlockBoundWitness>): Promisable<ChainStakeIntent | undefined> {\n // TODO: Do not redeclare on every block\n // Decide if we should redeclare intent\n if (this.params.config.producer.disableIntentRedeclaration) return\n // Decide if we need to redeclare intent\n // const ranges = await this.stakeIntentService.getDeclaredCandidateRanges(this.address, 'producer')\n // TODO: This doesn't handle the case where the producer had declared a range for the future\n // but we're in a range that's not the future\n // Sort in ascending order based on ending range to get range with highest ending block\n // const lastRange = ranges.toSorted((a, b) => a[1] > b[1] ? 1 : -1).at(-1)\n // if (!lastRange) return\n // const [, currentDeclarationEnd] = lastRange\n const currentBlock = head.block\n // const timeToProducerExpiration = currentDeclarationEnd - currentBlock\n // if (timeToProducerExpiration > BaseBlockProducerService.RedeclarationWindow) return\n return createDeclarationIntent(this.address, 'producer', currentBlock, currentBlock + SimpleBlockRunner.RedeclarationDuration)\n }\n\n protected async proposeNextValidBlock(head: WithHashMeta<BlockBoundWitness>, validateBalances = false, force = false) {\n return await this.spanAsync('proposeNextValidBlock', async () => {\n // Calculate the next block components\n const { block: previousBlock } = assertEx(asBlockBoundWitness(head), () => 'Invalid head block')\n const nextBlock = previousBlock + 1\n const nextBlockTransactionsStart = Date.now()\n const nextBlockTransactions = await this.mempoolViewer.pendingTransactions({ limit: SimpleBlockRunner.DefaultBlockSize })\n const nextBlockTransactionsDuration = Date.now() - nextBlockTransactionsStart\n if (nextBlockTransactionsDuration > 200) {\n this.logger?.warn(`[Slow] Fetched ${nextBlockTransactions.length} pending transactions in ${nextBlockTransactionsDuration}ms}`)\n }\n\n const blockPayloads: AllowedBlockPayload[] = []\n\n // Calculate the optional producer redeclaration and add it if necessary\n const producerRedeclarationPayload = await this.getProducerRedeclaration(head)\n if (producerRedeclarationPayload) blockPayloads.push(producerRedeclarationPayload)\n\n // If there are no transactions, no payloads and no heartbeat required, we don't need to create a block\n if (nextBlockTransactions.length === 0 && !this.heartbeatRequired(head) && !force) return\n\n // Calculate the optional block reward transfer and add if necessary\n const rewardTransferPayloads = await this.getBlockRewardTransfers(nextBlock)\n blockPayloads.push(...rewardTransferPayloads)\n\n const transactionTransfers = await generateTransactionFeeTransfers(this.address, nextBlockTransactions)\n const timeStart = Date.now()\n const timePayload = await this.generateTimePayload(head)\n const timeDuration = Date.now() - timeStart\n if (timeDuration > 100) {\n this.logger?.warn(`[Slow] Generated time payload in ${timeDuration}ms`)\n }\n\n const [fundedNextBlockTransactions, fundedTransfers] = await this.filterByFunded(head, nextBlockTransactions, transactionTransfers, validateBalances)\n\n blockPayloads.push(...fundedTransfers, timePayload)\n\n // Build the block\n this.logger?.info(`Building block ${head.block + 1}`)\n const startBuild = Date.now()\n const stepRewardPoolBalance = (await this.balanceViewer.accountBalances([XYO_STEP_REWARD_ADDRESS]))[XYO_STEP_REWARD_ADDRESS]\n const block = await buildNextBlock(head, fundedNextBlockTransactions, blockPayloads, [this.account], XYO_STEP_REWARD_ADDRESS, stepRewardPoolBalance)\n\n this.logger?.info(\n `Built block ${block[0].block} in ${Date.now() - startBuild}ms with ${block[1].length} payloads`,\n )\n\n // this.logger?.info(`Validating block ${block[0].block} with ${block[1].length} payloads`)\n // const startValidate = Date.now()\n // const errors = await this.validateHydratedBlockState(block, this.chainId, { accountBalance: this.balanceViewer })\n // this.logger?.info(`Validated block ${block[0].block} in ${Date.now() - startValidate}ms with ${block[1].length} payloads`)\n\n // if (errors.length > 0) {\n // this.logger?.warn(`Validation of produced block failed: ${errors.at(0)?.message}`)\n // const rejectedTransactions = block[1]\n // await this.rejectedTransactionsArchivist.insert(rejectedTransactions)\n // } else {\n await this.mempoolRunner.submitBlocks([block])\n return block\n // }\n })\n }\n\n // remove unfunded transactions and block transfers\n private async filterByFunded(\n head: WithHashMeta<BlockBoundWitness>,\n txs: SignedHydratedTransaction[],\n transfers: Transfer[],\n validateBalances = false,\n ): Promise<[SignedHydratedTransaction[], Transfer[]]> {\n const fundedTransfers: Transfer[] = []\n const fundedTransactions = (await Promise.all(txs.map(async (tx) => {\n const transfer: Transfer | undefined = transfers.find(transfer => transfer.from === tx[0].from)\n if (!transfer) return\n const totalTransferCost = Object.values(transfer?.transfers).reduce((acc, t) => acc + hexToBigInt(t ?? '00' as Hex), 0n)\n if (validateBalances) {\n const balance = (await this.balanceViewer.accountBalances([transfer.from]))[transfer.from] ?? AttoXL1(0n)\n if (balance >= totalTransferCost) {\n fundedTransfers.push(transfer)\n return tx\n }\n } else {\n fundedTransfers.push(transfer)\n return tx\n }\n }))).filter(exists)\n return [fundedTransactions, fundedTransfers]\n }\n\n private async generateTimePayload(head: WithHashMeta<BlockBoundWitness>) {\n const [ethereum, ethHashOrNull] = await this.time.currentTimeAndHash('ethereum')\n const ethereumHash = asHash(ethHashOrNull, () => 'No ethereum hash available from time sync service')\n const timePayload: TimePayload = {\n schema: TimeSchema,\n // this is for the previous block\n xl1: head.block,\n // this is for the previous block\n xl1Hash: head._hash,\n ethereum,\n ethereumHash,\n epoch: Date.now(),\n }\n return timePayload\n }\n\n /**\n * Check if a heartbeat block is required based on network activity.\n * @param head The current head block\n * @returns True if a heartbeat is required, false otherwise\n */\n private heartbeatRequired(head: WithHashMeta<BlockBoundWitness>): boolean {\n const epoch = head.$epoch\n if (isDefined(epoch)) {\n const { heartbeatInterval } = this.params.config.producer\n if (Date.now() - epoch > heartbeatInterval) {\n return true\n }\n }\n return false\n }\n}\n","import { type Address, hexFromBigInt } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport type {\n SignedHydratedTransaction,\n Transfer,\n XL1,\n} from '@xyo-network/xl1-protocol'\nimport { TransferSchema, XYO_ZERO_ADDRESS } from '@xyo-network/xl1-protocol'\nimport { transactionRequiredGas } from '@xyo-network/xl1-protocol-sdk'\nimport { HydratedTransactionWrapper } from '@xyo-network/xl1-wrappers'\n\nexport async function generateTransactionFeeTransfers(address: Address, transactions: SignedHydratedTransaction[]): Promise<Transfer[]> {\n const txs = await Promise.all(transactions.map(async (tx) => {\n return HydratedTransactionWrapper.parse([await PayloadBuilder.addStorageMeta(tx[0]), await PayloadBuilder.addStorageMeta(tx[1])])\n }))\n\n // merge transactions with the same from address\n const txBaseFeeCosts: Record<Address, bigint> = {}\n for (const tx of txs) {\n txBaseFeeCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n)\n + tx.fees.base\n }\n\n const txGasCosts: Record<Address, bigint> = {}\n for (const tx of txs) {\n const requiredGas = transactionRequiredGas(tx.data)\n const totalGasCost = requiredGas * tx.fees.gasPrice\n txGasCosts[tx.boundWitness.from] = (txBaseFeeCosts[tx.boundWitness.from] ?? 0n)\n + totalGasCost\n }\n\n // generate actual Transfer Payloads & burn the base fee\n const payloads = (Object.entries(txBaseFeeCosts) as [Address, XL1][]).map(([from, amount]) => {\n const payload: Transfer = {\n schema: TransferSchema,\n epoch: Date.now(),\n from,\n transfers: {\n // burn the base fee\n [XYO_ZERO_ADDRESS]: hexFromBigInt(amount),\n },\n }\n return payload\n })\n\n // transfer gas cost to producer\n for (const [from, amount] of Object.entries(txGasCosts)) {\n // every gas from should also be a base fee from\n const fromPayload = assertEx(payloads.find(p => p.from === from), () => 'from payload not found')\n fromPayload.transfers[address] = hexFromBigInt(amount)\n }\n\n return payloads\n}\n","import type { Logger } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport type {\n BlockRewardViewer, ChainContractViewer, Config, SimpleBlockRewardViewerParams,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { SimpleBlockRewardViewer, timeBudget } from '@xyo-network/xl1-protocol-sdk'\n\nimport { EvmBlockRewardViewer, type EvmBlockRewardViewerParams } from '../BlockReward/index.ts'\nimport { canUseEvmProvider, initEvmProvider } from './evm/index.ts'\n\nlet rewardServiceSingleton: Promise<BlockRewardViewer> | undefined\n\nexport const initBlockRewardViewer: Initializable<\n Partial<SimpleBlockRewardViewerParams> & {\n chainContractViewer: ChainContractViewer\n config: Pick<Config, 'evm'>\n },\n BlockRewardViewer\n> = (params): Promise<BlockRewardViewer> => {\n if (rewardServiceSingleton) return rewardServiceSingleton\n return timeBudget('initBlockRewardViewer', params.logger, () => {\n const { config } = params\n rewardServiceSingleton = canUseEvmBlockRewardViewer({ config })\n ? initEvmBlockRewardViewer(params)\n : initXyoBlockRewardViewer(params as SimpleBlockRewardViewerParams)\n return rewardServiceSingleton\n }, 2000, true)\n}\n\nexport const initXyoBlockRewardViewer = (params: SimpleBlockRewardViewerParams): Promise<BlockRewardViewer> => {\n if (rewardServiceSingleton) return rewardServiceSingleton\n return timeBudget('initXyoBlockRewardViewer', params.logger, () => {\n rewardServiceSingleton = SimpleBlockRewardViewer.create(params)\n return rewardServiceSingleton\n }, 2000, true)\n}\n\nconst canUseEvmBlockRewardViewer = (params: { config: Pick<Config, 'evm'> }) => canUseEvmProvider({ config: params.config })\n\nexport const initEvmBlockRewardViewer = async (params: ({\n chainContractViewer: ChainContractViewer\n config: Pick<Config, 'evm'>\n logger?: Logger\n})): Promise<BlockRewardViewer> => {\n if (rewardServiceSingleton) return rewardServiceSingleton\n return await timeBudget('initEvmBlockRewardViewer', params.logger, async () => {\n const provider = assertEx(await initEvmProvider(params))\n const evmBlockRewardViewerParams: EvmBlockRewardViewerParams = { ...params, provider }\n rewardServiceSingleton = EvmBlockRewardViewer.create(evmBlockRewardViewerParams)\n return rewardServiceSingleton\n }, 2000, true)\n}\n","import type { Promisable } from '@xylabs/sdk-js'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport { timeBudget, type TimeSyncViewer } from '@xyo-network/xl1-protocol-sdk'\nimport type { Config } from 'cosmiconfig'\n\nimport { type BaseTimeServiceParams, BaseTimeSyncService } from '../Time/index.ts'\nimport { canUseEvmProvider, initEvmProvider } from './evm/index.ts'\n\nlet timeSyncServiceSingleton: Promisable<TimeSyncViewer> | undefined\n\nexport const initTimeService: Initializable<BaseTimeServiceParams<Pick<Config, 'evm'>>, TimeSyncViewer> = async ({\n blockViewer, config, logger, meterProvider, traceProvider,\n}) => {\n if (timeSyncServiceSingleton) return timeSyncServiceSingleton\n\n return await timeBudget('initTimeService', logger, async () => {\n // Configure provider for optional Ethereum time sync\n const ethProvider = canUseEvmProvider({ config }) ? await initEvmProvider({ config }) : undefined\n\n // Create service\n timeSyncServiceSingleton = BaseTimeSyncService.create({\n blockViewer, ethProvider, logger, meterProvider, traceProvider,\n })\n return await timeSyncServiceSingleton\n }, 2000, true)\n}\n","import { creatable, EmptyObject } from '@xylabs/sdk-js'\nimport { TimeDomain, TimePayload } from '@xyo-network/xl1-protocol'\nimport {\n BlockViewer,\n SimpleTimeSyncViewer, TimeSyncViewer,\n TimeSyncViewerMoniker,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { Provider } from 'ethers'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseTimeServiceParams<TConfig extends EmptyObject = EmptyObject> extends BaseServiceParams<TConfig> {\n blockViewer: BlockViewer\n ethProvider?: Provider\n}\n\n@creatable()\nexport class BaseTimeSyncService extends BaseService<BaseTimeServiceParams> implements TimeSyncViewer {\n static readonly defaultMoniker = TimeSyncViewerMoniker\n static readonly monikers = [TimeSyncViewerMoniker]\n moniker = BaseTimeSyncService.defaultMoniker\n\n protected timeSyncViewer!: TimeSyncViewer\n\n protected get blockViewer() {\n return this.params.blockViewer\n }\n\n protected get ethProvider() {\n return this.params.ethProvider\n }\n\n async convertTime(fromDomain: TimeDomain, toDomain: TimeDomain, from: number): Promise<number> {\n return await this.timeSyncViewer.convertTime(fromDomain, toDomain, from)\n }\n\n override async createHandler(): Promise<void> {\n await super.createHandler()\n this.timeSyncViewer = await SimpleTimeSyncViewer.create({ blockViewer: this.blockViewer, ethProvider: this.ethProvider })\n }\n\n async currentTime(domain: TimeDomain): Promise<[string, number]> {\n return await this.timeSyncViewer.currentTime(domain)\n }\n\n async currentTimeAndHash(domain: TimeDomain): Promise<[number, string | null]> {\n return await this.timeSyncViewer.currentTimeAndHash(domain)\n }\n\n async currentTimePayload(): Promise<TimePayload> {\n return await this.timeSyncViewer.currentTimePayload()\n }\n}\n","import type { Promisable } from '@xylabs/sdk-js'\nimport type { Initializable } from '@xyo-network/xl1-protocol'\nimport type { BlockProducerService } from '@xyo-network/xl1-protocol-sdk'\n\nimport type { SimpleBlockRunnerParams } from '../simple/index.ts'\nimport { initBlockProducer } from './producer.ts'\n\nlet serviceSingleton: Promisable<BlockProducerService> | undefined\n\nexport const initValidator: Initializable<SimpleBlockRunnerParams, BlockProducerService>\n = (params: SimpleBlockRunnerParams): Promisable<BlockProducerService> => {\n if (serviceSingleton) return serviceSingleton\n serviceSingleton = initBlockProducer(params)\n return serviceSingleton\n }\n","import {\n Address, creatable, Promisable,\n} from '@xylabs/sdk-js'\nimport { ReadArchivist } from '@xyo-network/archivist-model'\nimport {\n StepIdentity,\n StepIdentityString,\n} from '@xyo-network/xl1-protocol'\nimport {\n EventingChainBlockNumberIteratorService, NetworkStakeStepRewardService, NetworkStakeStepRewardViewerMoniker,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { Provider } from 'ethers'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseNetworkStakeStepRewardServiceParams extends BaseServiceParams {\n chainArchivist: ReadArchivist\n chainIterator: EventingChainBlockNumberIteratorService\n ethProvider?: Provider\n}\n\n@creatable()\nexport class BaseNetworkStakeStepRewardService extends BaseService<BaseNetworkStakeStepRewardServiceParams> implements NetworkStakeStepRewardService {\n static readonly defaultMoniker = NetworkStakeStepRewardViewerMoniker\n static readonly monikers = [NetworkStakeStepRewardViewerMoniker]\n moniker = BaseNetworkStakeStepRewardService.defaultMoniker\n\n networkStakeStepRewardAddressHistory(_address: Address): Promisable<Record<Address, bigint>> {\n throw new Error('Method [networkStakeStepRewardAddressHistory] not implemented.')\n }\n\n networkStakeStepRewardAddressReward(_context: StepIdentity, _address: Address): Promisable<Record<Address, bigint>> {\n throw new Error('Method [networkStakeStepRewardAddressReward] not implemented.')\n }\n\n networkStakeStepRewardAddressShare(_context: StepIdentity, _address: Address): Promisable<[bigint, bigint]> {\n throw new Error('Method [networkStakeStepRewardAddressShare] not implemented.')\n }\n\n networkStakeStepRewardClaimedByAddress(_address: Address): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardClaimedByAddress] not implemented.')\n }\n\n networkStakeStepRewardForPosition(_position: number, _range: [number, number]): Promisable<[bigint, bigint]> {\n throw new Error('Method [networkStakeStepRewardForPosition] not implemented.')\n }\n\n networkStakeStepRewardForStep(_context: StepIdentity): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardForStep] not implemented.')\n }\n\n networkStakeStepRewardForStepForPosition(_context: StepIdentity, _position: number): Promisable<[bigint, bigint]> {\n throw new Error('Method [networkStakeStepRewardForStepForPosition] not implemented.')\n }\n\n networkStakeStepRewardPoolRewards(_context: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method [networkStakeStepRewardPoolRewards] not implemented.')\n }\n\n networkStakeStepRewardPoolShares(_context: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method [networkStakeStepRewardPoolShares] not implemented.')\n }\n\n networkStakeStepRewardPositionWeight(_context: StepIdentity, _position: number): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardPositionWeight] not implemented.')\n }\n\n networkStakeStepRewardPotentialPositionLoss(_context: StepIdentity, _position: number): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardPotentialPositionLoss] not implemented.')\n }\n\n networkStakeStepRewardRandomizer(_context: StepIdentity): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardRandomizer] not implemented.')\n }\n\n networkStakeStepRewardStakerCount(_context: StepIdentity): Promisable<number> {\n throw new Error('Method [networkStakeStepRewardStakerCount] not implemented.')\n }\n\n networkStakeStepRewardUnclaimedByAddress(_address: Address): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardUnclaimedByAddress] not implemented.')\n }\n\n networkStakeStepRewardWeightForAddress(_context: StepIdentity, _address: Address): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardWeightForAddress] not implemented.')\n }\n\n networkStakeStepRewardsForPosition(_position: number, _range: [number, number]): Promisable<Record<StepIdentityString, [bigint, bigint]>> {\n throw new Error('Method [networkStakeStepRewardsForPosition] not implemented.')\n }\n\n networkStakeStepRewardsForRange(_range: [number, number]): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardsForRange] not implemented.')\n }\n\n networkStakeStepRewardsForStepLevel(_stepLevel: number, _range: [number, number]): Promisable<bigint> {\n throw new Error('Method [networkStakeStepRewardsForStepLevel] not implemented.')\n }\n}\n","import {\n creatable, Hash, spanRootAsync,\n} from '@xylabs/sdk-js'\nimport { Schema } from '@xyo-network/payload-model'\nimport {\n SchemasService,\n SchemasStepSummaryContext,\n schemasSummary,\n} from '@xyo-network/xl1-protocol-sdk'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseSchemasServiceParams extends BaseServiceParams {\n context: SchemasStepSummaryContext\n}\n\n@creatable()\nexport class BaseSchemasService extends BaseService<BaseSchemasServiceParams> implements SchemasService {\n async schema(head: Hash, schema: Schema): Promise<number> {\n return (await this.schemas(head, [schema]))[schema] ?? 0\n }\n\n async schemas(head: Hash, schemas: Schema[]): Promise<Partial<Record<Schema, number>>> {\n return await spanRootAsync('transfers', async () => {\n const [summary] = await schemasSummary(this.params.context)\n const result: Record<Schema, number> = {}\n for (const schema of schemas) {\n const count = summary[schema] ?? 0\n result[schema] = count\n }\n return result\n })\n }\n}\n","import type { Hash } from '@xylabs/sdk-js'\nimport { exists, filterAs } from '@xylabs/sdk-js'\nimport type { ArchivistInstance } from '@xyo-network/archivist-model'\nimport type { BoundWitness } from '@xyo-network/boundwitness-model'\nimport { isBoundWitness } from '@xyo-network/boundwitness-model'\nimport { payloadSchemasContains } from '@xyo-network/boundwitness-validator'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport type {\n BlockBoundWitness, ChainStakeIntent, Intent,\n} from '@xyo-network/xl1-protocol'\nimport { asChainStakeIntent, ChainStakeIntentSchema } from '@xyo-network/xl1-protocol'\n\nexport const getBlockSignedStakeDeclarations = async (block: BlockBoundWitness, archivist: ArchivistInstance, intent: Intent): Promise<ChainStakeIntent[]> => {\n // Get payloads in block\n const blockData = await archivist.get(block.payload_hashes)\n // Filter Payloads in block to BoundWitnesses\n const bwsFromBlock = blockData.filter(x => isBoundWitness(x))\n // Filter to BoundWitnesses with StakeIntent payloads\n const bwsFromBlockWithDeclarations = bwsFromBlock.filter(bw => payloadSchemasContains(bw, ChainStakeIntentSchema))\n // Filter to only valid signed BWs\n const validBlockBwsWithDeclarations = await filterToValidSignedBoundWitnesses(bwsFromBlockWithDeclarations)\n return (await Promise.all(validBlockBwsWithDeclarations.map(async (bw) => {\n // Get staked intent hashes from signed declarations\n const stakeIntentHashes = validBlockBwsWithDeclarations\n .flatMap(mapBoundWitnessToStakeIntentHashes)\n .filter(exists)\n // Get staked intent payloads\n const payloads = await archivist.get(stakeIntentHashes)\n // Filter payloads to staked intents\n const stakeIntents = filterAs(payloads, asChainStakeIntent)\n // that are producers\n .filter(p => p.intent === intent)\n // where the issuer of the intent is also the signer of this BW\n .filter(p => bw.addresses.includes(p.from))\n\n return stakeIntents\n }))).flat()\n}\n\nconst filterToValidSignedBoundWitnesses = async (bws: BoundWitness[]): Promise<BoundWitness[]> => {\n const validBwIndexes = await Promise.all(bws.map(bw => BoundWitnessWrapper.parse(bw).getValid()))\n return bws.filter((_, index) => validBwIndexes[index])\n}\n\nconst mapBoundWitnessToStakeIntentHashes = (bw: BoundWitness): (Hash | undefined)[] => {\n return bw.payload_schemas.map((schema, index) => schema === ChainStakeIntentSchema ? bw.payload_hashes[index] : undefined)\n}\n","import {\n Address, asAddress, assertEx, creatable, filterAs, Hash,\n isUndefined,\n} from '@xylabs/sdk-js'\nimport { ArchivistInstance, ArchivistNextOptions } from '@xyo-network/archivist-model'\nimport {\n analyzeChain, ChainStakeIntentAnalyzer,\n isChainSummaryStakeIntent,\n} from '@xyo-network/chain-analyze'\nimport {\n DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS,\n findFirstMatching, IntervalMap,\n SerializedIntervalMap,\n} from '@xyo-network/chain-utils'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { Payload, WithStorageMeta } from '@xyo-network/payload-model'\nimport {\n asBlockBoundWitness, asBlockBoundWitnessWithStorageMeta, asChainStakeIntent, type Intent,\n} from '@xyo-network/xl1-protocol'\nimport {\n asChainIndexingServiceStateWithStorageMeta,\n BlockViewer,\n ChainIndexingServiceState, ChainIndexingServiceStateSchema, ChainStakeViewer,\n Config,\n isChainIndexingServiceState,\n readPayloadMapFromStore,\n StakeIntentService,\n timeBudget,\n} from '@xyo-network/xl1-protocol-sdk'\nimport { Mutex } from 'async-mutex'\nimport { LRUCache } from 'lru-cache'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface XyoStakeIntentServiceParams extends BaseServiceParams<Pick<Config, 'producer'>> {\n blockViewer: BlockViewer\n chainArchivist: ArchivistInstance\n chainStakeViewer: ChainStakeViewer\n stakeIntentStateArchivist: ArchivistInstance\n}\n\n/**\n * The number of blocks to periodically persist state\n */\n// const STATE_PERSISTENCE_INTERVAL = 60n\n\nconst ACTIVE_STAKE_TTL = 1000 * 60 * 60 * 2 // 2 hours in milliseconds\nconst NO_ACTIVE_STAKE_TTL = 1000 * 2 // 2 seconds in milliseconds\nconst STAKE_CACHE_MAX_ENTRIES = 10_000\n\n@creatable()\nexport class XyoStakeIntentService extends BaseService<XyoStakeIntentServiceParams> implements StakeIntentService {\n // TODO: Use hash instead of block number to handle chain reorgs\n protected _lastIndexedBlockHash: Hash | undefined = undefined\n // TODO: Interval tree per declaration (bank, validator, etc.)\n\n // Ideally move to DataIntervalTree to handle declared\n // ranges as it enables range queries in O(min(n, k * log n)) time,\n // where k is the number of intervals in the output list time\n // Currently using set based because it's simpler, equivalent\n // in performance for small sets, and (most importantly) easily\n // persisted so we can recover state on restart.\n protected _producers: IntervalMap<Address> = new IntervalMap()\n protected _stakeCache = new LRUCache<Address, bigint>({ max: STAKE_CACHE_MAX_ENTRIES })\n protected _updateMutex = new Mutex()\n\n protected get blockViewer() {\n return this.params.blockViewer\n }\n\n protected get chainArchivist() {\n return assertEx(this.params.chainArchivist!, () => 'chainArchivist not set')\n }\n\n protected get chainStakeViewer() {\n return assertEx(this.params.chainStakeViewer!, () => 'chainStakeViewer not set')\n }\n\n protected get stakeIntentStateArchivist() {\n return assertEx(this.params.stakeIntentStateArchivist!, () => 'stakeIntentStateArchivist not set')\n }\n\n static override async paramsHandler(params?: Partial<XyoStakeIntentServiceParams>): Promise<XyoStakeIntentServiceParams> {\n return {\n ...await super.paramsHandler(params),\n blockViewer: assertEx(params?.blockViewer, () => 'blockViewer is required'),\n chainArchivist: assertEx(params?.chainArchivist, () => 'chainArchivist is required'),\n chainStakeViewer: assertEx(params?.chainStakeViewer, () => 'chainStakeViewer is required'),\n stakeIntentStateArchivist: assertEx(params?.stakeIntentStateArchivist, () => 'stakeIntentStateArchivist is required'),\n } as XyoStakeIntentServiceParams\n }\n\n override async createHandler() {\n const head = await this.blockViewer.currentBlock()\n if (isUndefined(head)) return\n await this.recoverState(head[0]._hash)\n }\n\n async getDeclaredCandidateRanges(address: Address, intent: Intent): Promise<Readonly<Readonly<[number, number]>[]>> {\n await Promise.resolve()\n assertEx(intent === 'producer', () => `Support not yet added for intent ${intent}`)\n const results = this._producers.get(address)\n return results ?? []\n }\n\n async getDeclaredCandidatesForBlock(block: number, intent: Intent): Promise<Address[]> {\n return await this.spanAsync('getDeclaredCandidatesForBlock', async () => {\n assertEx(intent === 'producer', () => `Support not yet added for intent ${intent}`)\n const results = this._producers.findAllContaining(block)\n const candidates = [...results]\n const requiredMinimumStake = this.getRequiredMinimumStakeForIntent(intent)\n const validCandidates = await this.filterToValidStake(candidates, this.chainStakeViewer, requiredMinimumStake)\n return validCandidates\n })\n }\n\n getRequiredMinimumStakeForIntent(intent: Intent): bigint {\n switch (intent) {\n case 'producer': {\n const { minStake } = this.params.config.producer\n return BigInt(minStake)\n }\n }\n }\n\n async isStakedForBlock(block: number, intent: Intent, address: Address): Promise<boolean> {\n const candidates = await this.getDeclaredCandidatesForBlock(block, intent)\n return candidates.includes(address)\n }\n\n override async startHandler(): Promise<void> {\n await this.updateIndex(true)\n }\n\n private async filterToValidStake(\n candidates: Address[],\n chainStakeViewer: ChainStakeViewer,\n requiredMinimumStake: bigint,\n ): Promise<Address[]> {\n type CandidateStake = { candidate: Address; stake: bigint }\n\n // Find the stake for each candidate\n const candidatesWithStake: CandidateStake[] = await Promise.all(\n candidates.map(async (candidate) => {\n // Check if the stake is already cached\n const stake = this._stakeCache.get(candidate)\n if (stake === undefined) {\n // Fetch from chainStakeViewer if not cached\n const activeStake = await chainStakeViewer.activeByStaked(candidate)\n if (activeStake > 0n) {\n // Store result in cache\n this._stakeCache.set(candidate, activeStake, { ttl: ACTIVE_STAKE_TTL })\n } else {\n this._stakeCache.set(candidate, activeStake, { ttl: NO_ACTIVE_STAKE_TTL })\n }\n return { candidate, stake: activeStake }\n } else {\n return { candidate, stake }\n }\n }),\n )\n\n // Filter out candidates whose stake is greater than or equal to the required minimum\n return candidatesWithStake\n .filter(({ stake }) => stake >= requiredMinimumStake)\n .map(({ candidate }) => candidate)\n }\n\n private async persistState(current: Hash): Promise<void> {\n const state = this._producers.serialize()\n const payload = new PayloadBuilder<ChainIndexingServiceState<SerializedIntervalMap>>({ schema: ChainIndexingServiceStateSchema })\n .fields({ endBlockHash: current, state })\n .build()\n await this.stakeIntentStateArchivist.insert([payload])\n }\n\n private async recoverState(current: Hash): Promise<void> {\n return await timeBudget('XyoStakeIntentService.recoverState', console, async () => {\n const currentBlock = assertEx(asBlockBoundWitness((await this.chainArchivist.get([current]))?.[0]), () => `Block ${current} not found`)\n const currentBlockNum = currentBlock.block\n // Find last state before current head (in case of rollback, we indexed past it on an uncle chain, etc.)\n const opts: ArchivistNextOptions = { ...DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS }\n while (true) {\n const predicate = (p: WithStorageMeta<Payload>) => {\n const state = asChainIndexingServiceStateWithStorageMeta(p)\n return state ? true : false\n }\n const state = await findFirstMatching(this.stakeIntentStateArchivist, predicate, opts)\n if (isChainIndexingServiceState<SerializedIntervalMap>(state)) {\n const indexed = (await this.chainArchivist.get([state.endBlockHash]))?.[0]\n const indexedBlock = asBlockBoundWitnessWithStorageMeta(indexed)\n if (indexedBlock) {\n const indexedBlockNum = indexedBlock.block\n if (indexedBlockNum <= currentBlockNum) {\n const data = state.state as SerializedIntervalMap\n this._producers = new IntervalMap(data)\n this._lastIndexedBlockHash = indexedBlock._hash\n break\n }\n }\n } else {\n // No state found, start from genesis\n break\n }\n opts.open = true\n }\n }, 2000, true)\n }\n\n private async updateIndex(displayProgress = false): Promise<void> {\n if (this._updateMutex.isLocked()) {\n return\n }\n await this._updateMutex.runExclusive(async () => {\n return await this.spanAsync('updateIndex', async () => {\n const currentHead = (await this.blockViewer.currentBlock())[0]\n if (isUndefined(currentHead)) return\n return await timeBudget('XyoStakeIntentService.updateIndex', console, async () => {\n const currentHeadHash = currentHead._hash\n const chainMap = readPayloadMapFromStore<WithStorageMeta<Payload>>(this.chainArchivist)\n const result = await analyzeChain({ chainMap }, [new ChainStakeIntentAnalyzer('producer')], currentHeadHash, this._lastIndexedBlockHash)\n const signedDeclarations = filterAs(result.find(isChainSummaryStakeIntent)?.intents ?? [], asChainStakeIntent)\n if (currentHead.block === undefined) return\n const currentHeadBlockNum = currentHead.block\n if (displayProgress) this.logger?.log(`Updating index through 0x${currentHeadBlockNum}`)\n for (const signedDeclaration of signedDeclarations) {\n const { exp, nbf } = signedDeclaration\n const start = nbf\n const stop = exp\n const address = asAddress(signedDeclaration?.from)\n if (start !== undefined && stop !== undefined && address !== undefined) {\n this._producers.insert(address, start, stop)\n }\n }\n /*\n if (index % STATE_PERSISTENCE_INTERVAL === 0n) {\n if (displayProgress) this.logger?.info(`Persisting state at block ${index}`)\n await this.persistState(await PayloadBuilder.hash(block))\n }\n */\n this._lastIndexedBlockHash = currentHeadHash\n }, 2000, true)\n })\n })\n }\n}\n","import {\n Address, creatable, Promisable,\n} from '@xylabs/sdk-js'\nimport { ReadArchivist } from '@xyo-network/archivist-model'\nimport { StepIdentity } from '@xyo-network/xl1-protocol'\nimport { StepStakeViewer, StepStakeViewerMoniker } from '@xyo-network/xl1-protocol-sdk'\n\nimport { BaseService } from '../BaseService.ts'\nimport { BaseServiceParams } from '../model/index.ts'\n\nexport interface BaseStepStakeServiceParams extends BaseServiceParams {\n chainArchivist: ReadArchivist\n}\n\n@creatable()\nexport class BaseStepStakeService extends BaseService<BaseStepStakeServiceParams> implements StepStakeViewer {\n static readonly defaultMoniker = StepStakeViewerMoniker\n static readonly monikers = [StepStakeViewerMoniker]\n moniker = BaseStepStakeService.defaultMoniker\n\n stepStake(_step: StepIdentity): Promisable<Record<Address, bigint>> {\n throw new Error('Method [stepStake] not implemented.')\n }\n\n stepStakeForAddress(_address: Address, _step: StepIdentity): Promisable<bigint> {\n throw new Error('Method [stepStakeForAddress] not implemented.')\n }\n}\n"],"mappings":"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","names":["assertEx","StepSizes","findMostRecentBlock","LruCacheMap","readPayloadMapFromStore","SimpleAccountBalanceViewer","SimpleBlockViewer","Semaphore","accountBalancesViewerFromArchivist","chainId","archivist","summaryMap","LruCacheMap","max","allowStale","noDisposeOnSet","updateAgeOnGet","transferSummaryMap","chainMap","readPayloadMapFromStore","headFunc","head","assertEx","findMostRecentBlock","_hash","block","service","SimpleAccountBalanceViewer","create","context","store","stepSemaphores","StepSizes","map","Semaphore","transfersSummaryContext","blockViewer","SimpleBlockViewer","finalizedArchivist","AbstractCreatable","creatable","Mutex","BaseService","AbstractCreatable","singletonInitMutex","Mutex","singletons","globalThis","initSingleton","params","name","Error","runExclusive","create","BaseAccountableService","creatableService","constructor","AbstractCreatable","assertEx","creatable","toEthAddress","XyoChainRewards__factory","XyoChainRewardsFactory","asAttoXL1","BlockRewardViewerMoniker","EvmBlockRewardViewer","AbstractCreatable","defaultMoniker","BlockRewardViewerMoniker","monikers","moniker","_contractAddress","chainContractViewer","assertEx","params","contractAddress","provider","allowedRewardForBlock","blockNumber","contract","XyoChainRewardsFactory","connect","toEthAddress","asAttoXL1","calcBlockReward","createHandler","rewardsContract","ex","error","Error","message","isDefined","PayloadBuilder","asSignedBlockBoundWitness","asSignedBlockBoundWitnessWithStorageMeta","BlockViewerMoniker","blockViewerFromChainIteratorAndArchivist","chainIterator","chainArchivist","result","blockByHash","hash","payload","get","block","asSignedBlockBoundWitnessWithStorageMeta","isDefined","payloads","payload_hashes","blockByNumber","blockNumber","asSignedBlockBoundWitness","PayloadBuilder","addHashMeta","undefined","blocksByHash","limit","results","i","push","blocksByNumber","number","currentBlock","head","_hash","currentBlockHash","currentBlockNumber","moniker","BlockViewerMoniker","payloadByHash","Error","payloadsByHash","_hashes","assertEx","isDefined","isNull","isUndefined","PayloadBuilder","asBlockBoundWitness","asBlockBoundWitnessWithStorageMeta","asSignedHydratedBlockWithHashMeta","asXL1BlockNumber","isBlockBoundWitnessWithHashMeta","BlockViewerMoniker","hydrateBlock","LRUCache","ChainBlockNumberIterationService","BaseService","defaultMoniker","BlockViewerMoniker","monikers","moniker","_blocksByBlockNumber","LRUCache","max","_currentHead","chainId","assertEx","chain","params","head","chainMap","chainStoreRead","blockByHash","hash","asSignedHydratedBlockWithHashMeta","hydrateBlock","blockByNumber","block","get","blocksByHash","limit","results","currentBlock","isUndefined","length","push","previousHash","previous","isNull","blocksByNumber","blockNumber","previousNumber","asXL1BlockNumber","currentBlockHash","_hash","currentBlockNumber","cached","startingBlock","PayloadBuilder","isDefined","asBlockBoundWitness","isBlockBoundWitnessWithHashMeta","set","Error","newHead","getBoundWitnessAsBlockBoundWitnessWithStorageMeta","next","nextBlockNumber","payloadByHash","payloadsByHash","_hashes","undefined","count","nextBlock","asBlockBoundWitnessWithStorageMeta","updateHead","emit","blocks","stored","assertEx","toAddress","toEthAddress","StakedXyoChain__factory","StakedXyoChainFactory","ChainContractViewerMoniker","getAddress","EvmChainService","BaseService","defaultMoniker","ChainContractViewerMoniker","monikers","moniker","active","contract","activeByStaked","staked","activeByAddressStaked","getAddress","toEthAddress","activeByStaker","address","addStake","amount","result","wait","chainId","assertEx","params","id","undefined","StakedXyoChainFactory","connect","runner","forkedAtBlockNumber","forkedAtHash","forkedChainId","toAddress","minWithdrawalBlocks","pending","pendingByStaker","staker","removeStake","slot","rewardForBlock","_block","Error","rewardsContract","stakingTokenAddress","withdrawStake","withdrawn","withdrawnByStaker","assertEx","toAddress","ZERO_ADDRESS","ChainContractViewerMoniker","MemoryChainService","BaseService","defaultMoniker","ChainContractViewerMoniker","monikers","moniker","_chainId","_simulatedStake","active","Promise","resolve","activeByStaked","_staked","activeByStaker","_address","addStake","_amount","chainId","assertEx","createHandler","minStake","params","config","producer","BigInt","forkedAtBlockNumber","forkedAtHash","forkedChainId","ZERO_ADDRESS","minWithdrawalBlocks","pending","pendingByStaker","_staker","removeStake","_slot","rewardForBlock","_block","Error","rewardsContract","stakingTokenAddress","withdrawStake","withdrawn","withdrawnByStaker","startHandler","toAddress","assertEx","creatable","XyoValidator","BaseService","blockViewer","assertEx","params","validatePendingBlock","_block","validatePendingTransaction","hydratedTransaction","tx","blockByHash","_hash","undefined","Promise","resolve","assertEx","creatable","hexToLast4BytesInt","shuffleWithSeed","BaseElectionService","BaseService","blockViewer","assertEx","params","chainStakeViewer","stakeIntentService","getCreatorCommitteeForNextBlock","current","spanAsync","nextBlock","block","candidates","getDeclaredCandidatesForBlock","previousBlockHash","_hash","generateCreatorCommittee","maxSize","creators","Set","seed","hexToLast4BytesInt","creatorArray","shuffleWithSeed","slice","isDefined","AccountBalanceViewerRpcSchemas","HttpRpcTransport","JsonRpcAccountBalanceViewer","balanceServiceSingleton","initAccountBalanceService","params","config","logger","endpoint","services","accountBalanceViewerEndpoint","apiEndpoint","isDefined","transport","HttpRpcTransport","AccountBalanceViewerRpcSchemas","viewer","JsonRpcAccountBalanceViewer","log","Error","isDefined","BlockViewerRpcSchemas","HttpRpcTransport","JsonRpcBlockViewer","blockViewerSingleton","initBlockViewer","params","config","logger","endpoint","services","apiEndpoint","isDefined","transport","HttpRpcTransport","BlockViewerRpcSchemas","viewer","JsonRpcBlockViewer","log","Error","assertEx","asAddress","assertEx","isDefined","ZERO_ADDRESS","Wallet","assertEx","assertEx","isDefined","InfuraProvider","assertEx","hexFrom","isDefined","isHex","canUseChainId","config","isDefined","evm","chainId","getChainId","assertEx","isHex","prefix","hex","hexFrom","parsed","Number","parseInt","instance","initInfuraProvider","config","providerConfig","getInfuraProviderConfig","Promise","resolve","InfuraProvider","canUseInfuraProvider","canUseChainId","isDefined","evm","infura","projectId","projectSecret","assertEx","getChainId","assertEx","isDefined","JsonRpcProvider","initJsonRpcProvider","config","providerConfig","getJsonRpcProviderConfig","Promise","resolve","JsonRpcProvider","canUseJsonRpcProvider","canUseChainId","isDefined","evm","jsonRpc","url","jsonRpcUrl","assertEx","getChainId","provider","initEvmProvider","config","canUseInfuraProvider","initInfuraProvider","canUseJsonRpcProvider","initJsonRpcProvider","assertEx","canUseEvmProvider","chainStakeServiceSingleton","canUseEvmContractChainService","config","id","chain","isDefined","ZERO_ADDRESS","canUseEvmProvider","initEvmContractChainService","account","traceProvider","meterProvider","logger","emvStakingContractAddress","assertEx","asAddress","provider","initEvmProvider","privateKey","private","hex","runner","Wallet","EvmChainService","create","result","start","chainStakeServiceSingleton","initChainService","account","config","logger","log","result","init","name","initMemoryChainService","MemoryChainService","create","assertEx","start","params","canUseEvmContractChainService","initEvmContractChainService","assertEx","isDefined","findMostRecentBlock","buildNextBlock","createDeclarationIntent","createGenesisBlock","createBootstrapHead","account","chainService","chainId","chain","genesisBlock","createGenesisBlock","address","push","producerDeclarationPayload","createDeclarationIntent","block","producerDeclarationBlock","buildNextBlock","buildNextBlock","PayloadBuilder","BridgeDestinationObservationSchema","toHex","toHex","AttoXL1ConvertFactor","getForkBlockReward","AttoXL1ConvertFactor","xl1","getForkBlockRewardHex","toHex","ethChainId","toHex","bridgeableTokenContract","bridgeDestAddress","destConfirmation","getBridgeDestChainId","getBridgeDestToken","getBridgeDestAddress","getBridgeDestAmount","getForkBlockRewardHex","getBridgeDestConfirmation","getBridgeDestinationDetails","dest","destToken","destAddress","destAmount","getBridgeSrcChainId","chainService","chainId","getBridgeSrcAddress","account","address","getBridgeSrcToken","getBridgeSrcAmount","getForkBlockRewardHex","getBridgeSourceDetails","src","srcAddress","srcToken","srcAmount","getBridgeDestinationObservation","previousBlock","account","chainService","bridgeDestinationObservationFields","getBridgeSourceDetails","getBridgeDestinationDetails","destConfirmation","getBridgeDestConfirmation","bridgeDestinationObservation","PayloadBuilder","schema","BridgeDestinationObservationSchema","fields","build","buildNextBlock","buildNextBlock","createTransferPayload","PayloadBuilder","BridgeIntentSchema","XYO_BRIDGE_ADDRESS","getBridgeIntent","previousBlock","account","chainService","transferPayload","createTransferPayload","address","XYO_BRIDGE_ADDRESS","getForkBlockReward","nonce","Date","now","bridgeIntentFields","getBridgeSourceDetails","getBridgeDestinationDetails","bridgeIntent","PayloadBuilder","schema","BridgeIntentSchema","fields","build","buildNextBlock","buildNextBlock","PayloadBuilder","BridgeSourceObservationSchema","getBridgeSourceObservation","previousBlock","account","chainService","srcTxHash","_hash","bridgeSourceObservationFields","getBridgeSourceDetails","getBridgeDestinationDetails","srcConfirmation","bridgeSourceObservation","PayloadBuilder","schema","BridgeSourceObservationSchema","fields","build","buildNextBlock","buildBlock","AttoXL1","XYO_STEP_REWARD_ADDRESS","getFirstBlockForNewChain","forkBlock","account","chainService","_hash","previousBlockHash","block","previousBlockNumber","step_hashes","previousStepHashes","protocol","chainId","options","blockPayloads","signers","txs","chainStepRewardAddress","XYO_STEP_REWARD_ADDRESS","stepRewardPoolBalance","AttoXL1","buildBlock","createForkedHead","forkFromBlock","account","chainService","chain","firstBlockForNewChain","getFirstBlockForNewChain","push","bridgeIntent","getBridgeIntent","bridgeSourceObservation","getBridgeSourceObservation","bridgeDestinationObservation","getBridgeDestinationObservation","asHash","hexFromBigInt","isDefined","isSignedBlockBoundWitnessWithHashMeta","getForkFromBlock","head","chainService","chainArchivist","chain","chainId","forkedAtBigInt","forkedAtHash","forkedAtHex","hexFromBigInt","asHash","isDefined","forkedAtBlock","get","forkedChainId","forkedAtBlockNumber","Number","isSignedBlockBoundWitnessWithHashMeta","block","delay","flattenHydratedBlock","submitNewChain","chain","chainArchivist","chainSubmissionsArchivistWrite","block","bw","insert","flattenHydratedBlock","result","get","_hash","length","delay","headSingleton","initHead","params","account","chainArchivist","chainSubmissionsArchivistWrite","chainService","head","findMostRecentBlock","forkFromBlock","getForkFromBlock","isDefined","chain","createForkedHead","submitNewChain","newBlock","assertEx","at","Error","createBootstrapHead","isDefined","HttpRpcTransport","JsonRpcMempoolRunner","MempoolRunnerRpcSchemas","mempoolRunnerSingleton","initMempoolRunner","params","config","logger","endpoint","services","apiEndpoint","isDefined","transport","HttpRpcTransport","MempoolRunnerRpcSchemas","runner","JsonRpcMempoolRunner","log","Error","isDefined","HttpRpcTransport","JsonRpcMempoolViewer","MempoolViewerRpcSchemas","mempoolViewerSingleton","initMempoolViewer","params","config","logger","endpoint","services","apiEndpoint","isDefined","transport","HttpRpcTransport","MempoolViewerRpcSchemas","viewer","JsonRpcMempoolViewer","log","Error","isDefined","timeBudget","HttpRpcTransport","JsonRpcMempoolViewer","MempoolViewerRpcSchemas","ValueType","assertEx","creatable","exists","filterAs","filterAsync","forget","isDefined","isUndefined","MemoryArchivist","asBlockBoundWitnessWithHashMeta","asXL1BlockNumber","isTransactionBoundWitnessWithStorageMeta","findMostRecentBlock","MempoolViewerMoniker","TransactionJsonSchemaValidator","validateTransaction","Mutex","PayloadBuilder","asSignedTransactionBoundWitnessWithHashMeta","bundledPayloadToHydratedTransaction","payload","withHashMeta","PayloadBuilder","addHashMeta","payloads","tx","asSignedTransactionBoundWitnessWithHashMeta","find","p","_hash","root","filter","PayloadBuilder","PayloadBundleSchema","flattenHydratedTransaction","hydratedTransactionToPayloadBundle","transaction","root","_hash","bundle","payloads","flattenHydratedTransaction","flatMap","p","PayloadBuilder","omitStorageMeta","schema","PayloadBundleSchema","fields","build","BasePendingTransactionsService","BaseService","defaultMoniker","MempoolViewerMoniker","monikers","MutexPriority","InsertNewTransactions","ReadTransactions","PurgeTransactions","moniker","_countPendingTransactionsMutex","Mutex","_curatedPendingBundledTransactionsArchivist","_pendingTransactionsCount","_removablePendingTransactionHashes","Set","_updateCuratedPendingTransactionsArchivistMutex","additionalPendingTransactionValidators","params","chainArchivist","assertEx","chainId","pendingBundledTransactionsArchivist","pendingBundledTransactionsLocalArchivist","pendingTransactionsCount","forget","countPendingTransactions","rejectedTransactionsArchivist","createHandler","MemoryArchivist","create","account","on","payloads","insertNewTransactions","markAnyIncludedTransactionsForRemoval","cleanupWorker","pendingTransactionsCounter","meter","createObservableUpDownCounter","description","valueType","ValueType","INT","unit","addCallback","observer","observe","pendingBlocks","_options","Error","pendingTransactions","limit","spanAsync","runExclusive","lastHead","filterAs","next","x","asBlockBoundWitnessWithHashMeta","at","isUndefined","pruneCuratedPendingTransactionsArchivist","_hash","foundPendingTransactions","cursor","length","pendingBundledTransactions","order","_sequence","undeletedTransactionBundles","filter","tx","has","root","transactions","Promise","all","map","p","bundledPayloadToHydratedTransaction","exists","activeTransactions","isTransactionActive","asXL1BlockNumber","block","txValidationResults","validateTransaction","validTransactions","errors","invalidTransactions","logger","warn","push","log","findMostRecentBlock","isDefined","isLocked","filterAlreadyFinalizedTransactions","incomingTransactions","incomingTransactionHashes","payload","finalizedTransactions","get","finalizedTransactionHashes","item","nonFinalizedTransactions","unprocessedTransactions","hydratedUnprocessedTransactions","filterAsync","TransactionJsonSchemaValidator","bundledTransactions","hydratedTransactionToPayloadBundle","insert","hashes","isTransactionBoundWitnessWithStorageMeta","hash","add","head","foundPendingTransactionsToDeleteHashes","deletedTransactionBundles","expiredTransactions","isTransactionExpired","expiredBundleHashes","expiredHydratedTx","find","bundledTx","deletedHashes","delete","txBw","exp","nbf","serviceSingleton","initPendingTransactions","config","params","logger","timeBudget","endpoint","services","apiEndpoint","isDefined","transport","HttpRpcTransport","MempoolViewerRpcSchemas","viewer","JsonRpcMempoolViewer","log","BasePendingTransactionsService","create","timeBudget","AbstractCreatable","AddressZod","asHash","assertEx","creatable","exists","hexToBigInt","isDefined","MemoryArchivist","FixedPercentageBlockRewardDiviner","FixedPercentageBlockRewardDivinerConfigSchema","buildNextBlock","createDeclarationIntent","PayloadBuilder","asBlockBoundWitness","AttoXL1","BlockNumberSchema","defaultRewardRatio","TimeSchema","XYO_STEP_REWARD_ADDRESS","z","hexFromBigInt","assertEx","PayloadBuilder","TransferSchema","XYO_ZERO_ADDRESS","transactionRequiredGas","HydratedTransactionWrapper","generateTransactionFeeTransfers","address","transactions","txs","Promise","all","map","tx","HydratedTransactionWrapper","parse","PayloadBuilder","addStorageMeta","txBaseFeeCosts","boundWitness","from","fees","base","txGasCosts","requiredGas","transactionRequiredGas","data","totalGasCost","gasPrice","payloads","Object","entries","amount","payload","schema","TransferSchema","epoch","Date","now","transfers","XYO_ZERO_ADDRESS","hexFromBigInt","fromPayload","assertEx","find","p","DEFAULT_BLOCK_SIZE","XYO_PRODUCER_REDECLARATION_DURATION","XYO_PRODUCER_REDECLARATION_WINDOW","SimpleBlockRunnerParamsZod","z","object","balanceViewer","loose","blockRewardViewer","chainId","string","config","mempoolViewer","mempoolRunner","rejectedTransactionsArchivist","optional","rewardAddress","AddressZod","time","validateHydratedBlockState","function","SimpleBlockRunner","AbstractCreatable","_blockRewardDiviner","_lastRedeclarationBlock","_rejectedTransactionsArchivist","DefaultBlockSize","RedeclarationDuration","RedeclarationWindow","address","account","assertEx","params","paramsHandler","parse","MemoryArchivist","create","next","head","chain","proposeNextValidBlock","produceNextBlock","force","result","getBlockRewardTransfers","block","FixedPercentageBlockRewardDiviner","rewardPercentageRatio","defaultRewardRatio","schema","FixedPercentageBlockRewardDivinerConfigSchema","blockId","PayloadBuilder","BlockNumberSchema","fields","build","rewards","divine","getProducerRedeclaration","producer","disableIntentRedeclaration","currentBlock","createDeclarationIntent","validateBalances","spanAsync","previousBlock","asBlockBoundWitness","nextBlock","nextBlockTransactionsStart","Date","now","nextBlockTransactions","pendingTransactions","limit","nextBlockTransactionsDuration","logger","warn","length","blockPayloads","producerRedeclarationPayload","push","heartbeatRequired","rewardTransferPayloads","transactionTransfers","generateTransactionFeeTransfers","timeStart","timePayload","generateTimePayload","timeDuration","fundedNextBlockTransactions","fundedTransfers","filterByFunded","info","startBuild","stepRewardPoolBalance","accountBalances","XYO_STEP_REWARD_ADDRESS","buildNextBlock","submitBlocks","txs","transfers","fundedTransactions","Promise","all","map","tx","transfer","find","from","totalTransferCost","Object","values","reduce","acc","t","hexToBigInt","balance","AttoXL1","filter","exists","ethereum","ethHashOrNull","currentTimeAndHash","ethereumHash","asHash","TimeSchema","xl1","xl1Hash","_hash","epoch","$epoch","isDefined","heartbeatInterval","serviceSingleton","initBlockProducer","params","timeBudget","logger","SimpleBlockRunner","create","assertEx","SimpleBlockRewardViewer","timeBudget","rewardServiceSingleton","initBlockRewardViewer","params","timeBudget","logger","config","canUseEvmBlockRewardViewer","initEvmBlockRewardViewer","initXyoBlockRewardViewer","SimpleBlockRewardViewer","create","canUseEvmProvider","provider","assertEx","initEvmProvider","evmBlockRewardViewerParams","EvmBlockRewardViewer","timeBudget","creatable","SimpleTimeSyncViewer","TimeSyncViewerMoniker","BaseTimeSyncService","BaseService","defaultMoniker","TimeSyncViewerMoniker","monikers","moniker","timeSyncViewer","blockViewer","params","ethProvider","convertTime","fromDomain","toDomain","from","createHandler","SimpleTimeSyncViewer","create","currentTime","domain","currentTimeAndHash","currentTimePayload","timeSyncServiceSingleton","initTimeService","blockViewer","config","logger","meterProvider","traceProvider","timeBudget","ethProvider","canUseEvmProvider","initEvmProvider","undefined","BaseTimeSyncService","create","serviceSingleton","initValidator","params","initBlockProducer","creatable","NetworkStakeStepRewardViewerMoniker","BaseNetworkStakeStepRewardService","BaseService","defaultMoniker","NetworkStakeStepRewardViewerMoniker","monikers","moniker","networkStakeStepRewardAddressHistory","_address","Error","networkStakeStepRewardAddressReward","_context","networkStakeStepRewardAddressShare","networkStakeStepRewardClaimedByAddress","networkStakeStepRewardForPosition","_position","_range","networkStakeStepRewardForStep","networkStakeStepRewardForStepForPosition","networkStakeStepRewardPoolRewards","networkStakeStepRewardPoolShares","networkStakeStepRewardPositionWeight","networkStakeStepRewardPotentialPositionLoss","networkStakeStepRewardRandomizer","networkStakeStepRewardStakerCount","networkStakeStepRewardUnclaimedByAddress","networkStakeStepRewardWeightForAddress","networkStakeStepRewardsForPosition","networkStakeStepRewardsForRange","networkStakeStepRewardsForStepLevel","_stepLevel","creatable","spanRootAsync","schemasSummary","BaseSchemasService","BaseService","schema","head","schemas","spanRootAsync","summary","schemasSummary","params","context","result","count","exists","filterAs","isBoundWitness","payloadSchemasContains","BoundWitnessWrapper","asChainStakeIntent","ChainStakeIntentSchema","getBlockSignedStakeDeclarations","block","archivist","intent","blockData","get","payload_hashes","bwsFromBlock","filter","x","isBoundWitness","bwsFromBlockWithDeclarations","bw","payloadSchemasContains","ChainStakeIntentSchema","validBlockBwsWithDeclarations","filterToValidSignedBoundWitnesses","Promise","all","map","stakeIntentHashes","flatMap","mapBoundWitnessToStakeIntentHashes","exists","payloads","stakeIntents","filterAs","asChainStakeIntent","p","addresses","includes","from","flat","bws","validBwIndexes","BoundWitnessWrapper","parse","getValid","_","index","payload_schemas","schema","undefined","asAddress","assertEx","creatable","filterAs","isUndefined","analyzeChain","ChainStakeIntentAnalyzer","isChainSummaryStakeIntent","DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS","findFirstMatching","IntervalMap","PayloadBuilder","asBlockBoundWitness","asBlockBoundWitnessWithStorageMeta","asChainStakeIntent","asChainIndexingServiceStateWithStorageMeta","ChainIndexingServiceStateSchema","isChainIndexingServiceState","readPayloadMapFromStore","timeBudget","Mutex","LRUCache","ACTIVE_STAKE_TTL","NO_ACTIVE_STAKE_TTL","STAKE_CACHE_MAX_ENTRIES","XyoStakeIntentService","BaseService","_lastIndexedBlockHash","undefined","_producers","IntervalMap","_stakeCache","LRUCache","max","_updateMutex","Mutex","blockViewer","params","chainArchivist","assertEx","chainStakeViewer","stakeIntentStateArchivist","paramsHandler","createHandler","head","currentBlock","isUndefined","recoverState","_hash","getDeclaredCandidateRanges","address","intent","Promise","resolve","results","get","getDeclaredCandidatesForBlock","block","spanAsync","findAllContaining","candidates","requiredMinimumStake","getRequiredMinimumStakeForIntent","validCandidates","filterToValidStake","minStake","config","producer","BigInt","isStakedForBlock","includes","startHandler","updateIndex","candidatesWithStake","all","map","candidate","stake","activeStake","activeByStaked","set","ttl","filter","persistState","current","state","serialize","payload","PayloadBuilder","schema","ChainIndexingServiceStateSchema","fields","endBlockHash","build","insert","timeBudget","console","asBlockBoundWitness","currentBlockNum","opts","DEFAULT_FIND_FIRST_MATCHING_NEXT_OPTIONS","predicate","p","asChainIndexingServiceStateWithStorageMeta","findFirstMatching","isChainIndexingServiceState","indexed","indexedBlock","asBlockBoundWitnessWithStorageMeta","indexedBlockNum","data","open","displayProgress","isLocked","runExclusive","currentHead","currentHeadHash","chainMap","readPayloadMapFromStore","result","analyzeChain","ChainStakeIntentAnalyzer","signedDeclarations","filterAs","find","isChainSummaryStakeIntent","intents","asChainStakeIntent","currentHeadBlockNum","logger","log","signedDeclaration","exp","nbf","start","stop","asAddress","from","creatable","StepStakeViewerMoniker","BaseStepStakeService","BaseService","defaultMoniker","StepStakeViewerMoniker","monikers","moniker","stepStake","_step","Error","stepStakeForAddress","_address"]}