Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 34 additions & 1 deletion tests/waku_rln_relay/test_waku_rln_relay.nim
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ import
chronos,
chronicles,
stint,
libp2p/crypto/crypto
libp2p/crypto/crypto,
random

import
waku/[
waku_core,
Expand Down Expand Up @@ -638,3 +640,34 @@ suite "Waku rln relay":
var testEpochSizes: seq[uint] = @[1, 5, 10, 30, 60, 600]
for i in testEpochSizes:
await runTestForEpochSizeSec(i)

asyncTest "testing rln-relay rate limit testing ":
let index = MembershipIndex(7)

# Generate a random rate limit between 20 and 600
randomize()
let randomRateLimit = rand(20 .. 600).uint

let wakuRlnConfig = getWakuRlnConfig(manager = manager, index = index)
let wakuRlnRelay = (await WakuRlnRelay.new(wakuRlnConfig)).valueOr:
raiseAssert $error

let manager = cast[OnchainGroupManager](wakuRlnRelay.groupManager)
let idCredentials = generateCredentials(manager.rlnInstance)

# Register the membership with the random rate limit
try:
waitFor manager.register(idCredentials, UserMessageLimit(randomRateLimit))
except Exception, CatchableError:
assert false,
"exception raised when calling register: " & getCurrentExceptionMsg()

# Fetch the rate limit for the registered membership
let rateLimitRes =
await manager.fetchMembershipRateLimit(idCredentials.idCommitment)
if rateLimitRes.isErr():
raiseAssert "Failed to fetch membership rate limit: " & rateLimitRes.error

let rateLimit = rateLimitRes.get()
check:
rateLimit == randomRateLimit.u256 # Check against the random rate limit
26 changes: 26 additions & 0 deletions waku/waku_rln_relay/group_manager/on_chain/group_manager.nim
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,32 @@ proc fetchMembershipStatus*(
error "Failed to fetch membership set membership", error = getCurrentExceptionMsg()
return err("Failed to fetch membership set membership: " & getCurrentExceptionMsg())

proc fetchMembershipRateLimit*(
g: OnchainGroupManager, idCommitment: IDCommitment
): Future[Result[UInt256, string]] {.async.} =
## Fetch the `rateLimit` of a membership by its idCommitment.
## Decodes the first 32-byte word returned by `getMembershipInfo`.
try:
let params = idCommitment.reversed()
let resultBytes = await sendEthCallWithParams(
ethRpc = g.ethRpc.get(),
functionSignature = "getMembershipInfo(uint256)",
params = params,
fromAddress = g.ethRpc.get().defaultAccount,
toAddress = fromHex(Address, g.ethContractAddress),
chainId = g.chainId,
)
if resultBytes.isErr():
return err(resultBytes.error)
let bytes = resultBytes.get()
if bytes.len < 32:
return err("unexpected ABI response length " & $bytes.len)
let rateLimit = UInt256.fromBytesBE(bytes[0 .. 31])
return ok(rateLimit)
except CatchableError:
error "Failed to fetch membership rate limit", error = getCurrentExceptionMsg()
return err("Failed to fetch membership rate limit: " & getCurrentExceptionMsg())

proc fetchMaxMembershipRateLimit*(
g: OnchainGroupManager
): Future[Result[UInt256, string]] {.async.} =
Expand Down
Loading