Skip to content

Commit 9cff2ad

Browse files
WIP
1 parent f400610 commit 9cff2ad

File tree

3 files changed

+45
-5
lines changed

3 files changed

+45
-5
lines changed

src/main/scala/units/ELUpdater.scala

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ class ELUpdater(
212212

213213
val withdrawals = rewardWithdrawal ++ nativeTransferWithdrawals
214214

215-
val (depositedTransactions, addedAssets, updateAssetRegistryTransaction, _, nativeTransfersViaDeposits, assetTransfers) =
215+
val (depositedTransactions, addedAssets, updateAssetRegistryTransaction, transferTransactions, nativeTransfersViaDeposits, assetTransfers) =
216216
prepareTransactions(epochInfo.number, chainContractOptions, lastAssetRegistryIndex + 1, chainContractClient.getAssetRegistrySize, transfers)
217217

218218
val prevRandao = calculateRandao(epochInfo.hitSource, parentBlock.hash)
@@ -237,7 +237,9 @@ class ELUpdater(
237237
nextBlockUnixTs = nextBlockUnixTs,
238238
lastC2ETransferIndex = transfers.lastOption.fold(lastC2ETransferIndex)(_.index),
239239
lastElWithdrawalIndex = lastElWithdrawalIndex + withdrawals.size,
240-
lastAssetRegistryIndex = addedAssets.lastOption.fold(lastAssetRegistryIndex)(_.index)
240+
lastAssetRegistryIndex = addedAssets.lastOption.fold(lastAssetRegistryIndex)(_.index),
241+
transfers = transfers,
242+
transferTransactions = transferTransactions
241243
)
242244
}
243245
} else {
@@ -268,7 +270,9 @@ class ELUpdater(
268270
nextBlockUnixTs = nextBlockUnixTs,
269271
lastC2ETransferIndex = transfers.lastOption.fold(lastC2ETransferIndex)(_.index),
270272
lastElWithdrawalIndex = lastElWithdrawalIndex + withdrawals.size,
271-
lastAssetRegistryIndex = addedAssets.lastOption.fold(lastAssetRegistryIndex)(_.index)
273+
lastAssetRegistryIndex = addedAssets.lastOption.fold(lastAssetRegistryIndex)(_.index),
274+
transfers = transfers,
275+
transferTransactions = transferTransactions
272276
)
273277
}
274278
}
@@ -336,6 +340,8 @@ class ELUpdater(
336340
scheduler.scheduleOnceLabeled("tryToForgeNextBlock", (miningData.nextBlockUnixTs - currentUnixTs).seconds)(
337341
tryToForgeNextBlock(
338342
miningData.payload,
343+
miningData.transfers,
344+
miningData.transferTransactions,
339345
parentBlock.hash,
340346
miningData.nextBlockUnixTs,
341347
newState.options.startEpochChainFunction(epochInfo.number, parentBlock.hash, epochInfo.hitSource, nodeChainInfo.toOption),
@@ -353,6 +359,8 @@ class ELUpdater(
353359

354360
private def tryToForgeNextBlock(
355361
payloadOrId: PayloadId | JsObject,
362+
transfers: Seq[ContractTransfer],
363+
transferTransactions: Seq[DepositedTransaction],
356364
referenceHash: BlockHash,
357365
timestamp: Long,
358366
contractFunction: ContractFunction,
@@ -373,7 +381,15 @@ class ELUpdater(
373381
waitForRefApprovalOnCl match {
374382
case Some(waitingTime) =>
375383
scheduler.scheduleOnceLabeled("waitForApproval", waitingTime) {
376-
tryToForgeNextBlock(payloadOrId, referenceHash, timestamp, contractFunction, chainContractOptions)
384+
tryToForgeNextBlock(
385+
payloadOrId,
386+
transfers,
387+
transferTransactions,
388+
referenceHash,
389+
timestamp,
390+
contractFunction,
391+
chainContractOptions
392+
)
377393
}
378394
case _ =>
379395
val getAndApplyPayloadResult = for {
@@ -414,6 +430,11 @@ class ELUpdater(
414430
hash = ecBlock.hash,
415431
addresses = chainContractOptions.bridgeAddresses(epochInfo.number)
416432
)
433+
434+
failedTransfers = getFailedTransfers(ecBlockLogs, transfers.zip(transferTransactions))
435+
436+
failedTransferIndexes = failedTransfers.map(_.index)
437+
failedTransfersRootHash = BridgeMerkleTree.getFailedTransfersRootHash(failedTransferIndexes)
417438
transfersRootHash <- BridgeMerkleTree.getE2CTransfersRootHash(ecBlockLogs)
418439
// A forged block can be invalid for some reason. In this case we won't send it and its confirmation transaction to the network.
419440
expectedContractBlock = ContractBlock(
@@ -478,6 +499,8 @@ class ELUpdater(
478499
scheduler.scheduleOnceLabeled("forgeSecond", (nextBlockUnixTs - time.correctedTime() / 1000).min(1).seconds)(
479500
tryToForgeNextBlock(
480501
payloadOrId = nextMiningData.payload,
502+
nextMiningData.transfers, // TODO: nextMiningData.transfers or transfers
503+
nextMiningData.transferTransactions, // TODO: nextMiningData.transferTransactions or transferTransactions
481504
referenceHash = ecBlock.hash,
482505
timestamp = nextBlockUnixTs,
483506
contractFunction = chainContractOptions.appendFunction(epochInfo.number, ecBlock.hash),
@@ -1880,7 +1903,9 @@ object ELUpdater {
18801903
nextBlockUnixTs: Long,
18811904
lastC2ETransferIndex: WithdrawalIndex,
18821905
lastElWithdrawalIndex: WithdrawalIndex,
1883-
lastAssetRegistryIndex: Int
1906+
lastAssetRegistryIndex: Int,
1907+
transfers: Seq[ContractTransfer],
1908+
transferTransactions: Seq[DepositedTransaction]
18841909
)
18851910

18861911
private case class BlockForValidation(contractBlock: ContractBlock, ecBlock: EcBlock) {

src/main/scala/units/el/BridgeMerkleTree.scala

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,18 @@ object BridgeMerkleTree {
4848

4949
case _ => List.empty[Array[Byte]].asRight
5050
}
51+
52+
def getFailedTransfersRootHash(transferIndexes: Seq[Long]): Digest =
53+
mkFailedTransfersHash(getFailedTransferData(transferIndexes))
54+
55+
def mkFailedTransfersHash(data: Seq[Array[Byte]]): Digest =
56+
if (data.isEmpty) Array.emptyByteArray
57+
else {
58+
val levels = Merkle.mkLevels(padData(data, MinC2EFailedTransfers))
59+
val rootHash = levels.head.head
60+
rootHash
61+
}
62+
63+
def getFailedTransferData(indexes: Seq[Long]): Seq[Array[Byte]] =
64+
indexes.map(index => BigInt(index).toByteArray)
5165
}

src/main/scala/units/el/package.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ package object el {
1010

1111
val MaxWithdrawals = 16
1212
val MinE2CTransfers = 1024
13+
val MinC2EFailedTransfers = 1024
1314

1415
val C2ETopics: Seq[String] = List(StandardBridge.ERC20BridgeFinalized.Topic, StandardBridge.ETHBridgeFinalized.Topic)
1516
val E2CTopics: Seq[String] = List(NativeBridge.ElSentNativeEventTopic, StandardBridge.ERC20BridgeInitiated.Topic)

0 commit comments

Comments
 (0)