# Deterministic deposits in typescript ## TL:DR; SLOW CODE, DON'T HAVE THE ANSWER THAT IT CAN RUN IN FRONTEND ## IT CAN RUN A NETWORK! TS: @Chainsafe/lodestar packages/beacon-node/src/node/utils/interop/deposits.ts ```typescript= // deterministicDeposits assume that dataRootList will be committed within a function body export function deterministicDeposits( config: IChainConfig, depositDataRootList: DepositTree, deposits: phase0.DepositData[], ): phase0.Deposit[] { depositDataRootList.commit(); const depositTreeDepth = depositDataRootList.type.depth; return deposits.map((depositData, i) => { depositDataRootList.push(ssz.phase0.DepositData.hashTreeRoot(depositData)); depositDataRootList.commit(); return { proof: new Tree(depositDataRootList.node).getSingleProof(toGindex(depositTreeDepth, BigInt(i))), data: depositData, }; }); } ``` ```typescript= // Apply deposits applyDeposits(config, state, deposits, fullDepositDataRootList); export function applyDeposits( config: IChainForkConfig, state: CachedBeaconStateAllForks, newDeposits: phase0.Deposit[], fullDepositDataRootList?: DepositDataRootViewDU ): {activatedValidatorCount: number} { const initDepositCount = depositDataRootList.length; const depositDatas = fullDepositDataRootList ? null : newDeposits.map((deposit) => deposit.data); const {DepositData, DepositDataRootList} = ssz.phase0; for (const [index, deposit] of newDeposits.entries()) { if (fullDepositDataRootArr) { depositDataRootList.push(fullDepositDataRootArr[index + initDepositCount]); state.eth1Data.depositRoot = DepositDataRootList.hashTreeRoot(depositDataRootList); } else if (depositDatas) { const depositDataList = depositDatas.slice(0, index + 1); state.eth1Data.depositRoot = DepositDataRootList.hashTreeRoot( depositDataList.map((d) => DepositData.hashTreeRoot(d)) ); } // THIS MUST BE 0 IF THE POS CONFIG APPLIES FROM THE START (BLOCK 0)! state.eth1Data.depositCount = 0; const fork = config.getForkSeq(GENESIS_SLOT); processDeposit(fork, state, deposit); } // Set genesis validators root for domain separation and chain versioning // .hashTreeRoot() automatically commits() state.genesisValidatorsRoot = state.validators.hashTreeRoot(); } ```