Contract DIAOracle(
mut admin: Address
) extends DIAOracleBase(admin) implements IDIAOracle {
mapping[ByteVec, DIAOracleValue] onchainValues
event OracleUpdate(key: ByteVec, value: U256, timestamp: U256)
const MaxBatchSize = 10
enum ErrorCodes {
InvalidBatchSize = 1
InvalidKey = 2
}
pub fn getValue(key: ByteVec) -> DIAOracleValue {
if (!onchainValues.contains!(key)) {
panic!(ErrorCodes.InvalidKey)
}
return onchainValues[key]
}
@using(preapprovedAssets = true)
pub fn setValue(key: ByteVec, value: U256, timestamp: U256) -> () {
checkAdmin(callerAddress!())
updateValue{admin -> ALPH: mapEntryDeposit!()}(key, value, timestamp)
}
@using(preapprovedAssets = true)
pub fn setMultipleValues(
keys: [ByteVec; 10],
values: [U256; 10],
timestamps: [U256; 10],
batchSize: U256
) -> () {
checkAdmin(callerAddress!())
assert!(batchSize <= MaxBatchSize, ErrorCodes.InvalidBatchSize)
for (let mut i = 0; i < batchSize; i = i + 1) {
updateValue{admin -> ALPH: mapEntryDeposit!()}(
keys[i],
values[i],
timestamps[i]
)
}
}
@using(preapprovedAssets = true)
fn updateValue(key: ByteVec, value: U256, timestamp: U256) -> () {
if (!onchainValues.contains!(key)) {
onchainValues.insert!(admin, key, DIAOracleValue{value, timestamp})
} else {
onchainValues[key] = DIAOracleValue{value, timestamp}
}
emit OracleUpdate(key, value, timestamp)
}
}