diff --git a/tests/waku_rln_relay/test_rln_group_manager_onchain.nim b/tests/waku_rln_relay/test_rln_group_manager_onchain.nim index f9137cb08..e8527e4e2 100644 --- a/tests/waku_rln_relay/test_rln_group_manager_onchain.nim +++ b/tests/waku_rln_relay/test_rln_group_manager_onchain.nim @@ -333,7 +333,7 @@ suite "Onchain group manager": debug "epoch in bytes", epochHex = epoch.inHex() # generate proof - let validProofRes = manager.generateProof( + let validProofRes = await manager.generateProof( data = messageBytes, epoch = epoch, messageId = MessageId(1) ) @@ -367,10 +367,13 @@ suite "Onchain group manager": debug "epoch in bytes", epochHex = epoch.inHex() # generate proof - let validProof = manager.generateProof( + let validProofRes = await manager.generateProof( data = messageBytes, epoch = epoch, messageId = MessageId(0) - ).valueOr: - raiseAssert $error + ) + + check: + validProofRes.isOk() + let validProof = validProofRes.get() # validate the root (should be false) let validated = manager.validateRoot(validProof.merkleRoot) @@ -410,10 +413,13 @@ suite "Onchain group manager": debug "epoch in bytes", epochHex = epoch.inHex() # generate proof - let validProof = manager.generateProof( + let validProofRes = await manager.generateProof( data = messageBytes, epoch = epoch, messageId = MessageId(0) - ).valueOr: - raiseAssert $error + ) + + check: + validProofRes.isOk() + let validProof = validProofRes.get() # verify the proof (should be true) let verified = manager.verifyProof(messageBytes, validProof).valueOr: @@ -454,7 +460,7 @@ suite "Onchain group manager": debug "epoch in bytes", epochHex = epoch.inHex() # generate proof - let invalidProofRes = manager.generateProof( + let invalidProofRes = await manager.generateProof( data = messageBytes, epoch = epoch, messageId = MessageId(0) ) diff --git a/waku/waku_rln_relay/group_manager/on_chain/group_manager.nim b/waku/waku_rln_relay/group_manager/on_chain/group_manager.nim index 38c657534..4cb7fdbc9 100644 --- a/waku/waku_rln_relay/group_manager/on_chain/group_manager.nim +++ b/waku/waku_rln_relay/group_manager/on_chain/group_manager.nim @@ -64,6 +64,30 @@ type keystorePassword*: Option[string] registrationHandler*: Option[RegistrationHandler] validRootBuffer*: Deque[MerkleNode] + latestProcessedBlock*: BlockNumber + +proc setMetadata*( + g: OnchainGroupManager, lastProcessedBlock = none(BlockNumber) +): GroupManagerResult[void] = + let normalizedBlock = + if lastProcessedBlock.isSome(): + lastProcessedBlock.get() + else: + g.latestProcessedBlock + try: + let metadataSetRes = g.rlnInstance.setMetadata( + RlnMetadata( + lastProcessedBlock: normalizedBlock.uint64, + chainId: g.chainId, + contractAddress: g.ethContractAddress, + validRoots: g.validRootBuffer.toSeq(), + ) + ) + if metadataSetRes.isErr(): + return err("failed to persist rln metadata: " & metadataSetRes.error) + except CatchableError: + return err("failed to persist rln metadata: " & getCurrentExceptionMsg()) + return ok() proc fetchMerkleProofElements*( g: OnchainGroupManager @@ -369,6 +393,12 @@ method verifyProof*( else: return ok(true) +method onRegister*(g: OnchainGroupManager, cb: OnRegisterCallback) {.gcsafe.} = + g.registerCb = some(cb) + +method onWithdraw*(g: OnchainGroupManager, cb: OnWithdrawCallback) {.gcsafe.} = + g.withdrawCb = some(cb) + method init*(g: OnchainGroupManager): Future[GroupManagerResult[void]] {.async.} = # check if the Ethereum client is reachable var ethRpc: Web3