Contract DIARandomOracle(
mut admin: Address,
mut lastRound: U256
) extends DIAOracleBase(admin) implements IDIARandomOracle {
mapping[U256, DIARandomValue] randomValues
event OracleUpdate(
round: U256,
randomness: ByteVec,
signature: ByteVec
)
const MaxSlot = 1000
enum ErrorCodes {
InvalidRound = 1
RoundKeyNotExist = 2
RoundIsExpired = 3
}
pub fn getLastRound() -> U256 {
return lastRound
}
pub fn getRandomValue(realRound: U256) -> DIARandomValue {
let roundKey = realRound % MaxSlot
assert!(randomValues.contains!(roundKey), ErrorCodes.RoundKeyNotExist)
let randomValue = randomValues[roundKey]
assert!(randomValue.round == realRound, ErrorCodes.RoundIsExpired)
return randomValue
}
@using(preapprovedAssets = true, updateFields = true)
pub fn setRandomValue(value: DIARandomValue) -> () {
checkAdmin(callerAddress!())
assert!(value.round > lastRound, ErrorCodes.InvalidRound)
let roundKey = value.round % MaxSlot
lastRound = value.round
if (randomValues.contains!(roundKey)) {
randomValues[roundKey] = value
} else {
randomValues.insert!(admin, roundKey, value)
}
emit OracleUpdate(value.round, value.randomness, value.signature)
}
}