1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// Copyright 2019-2025 PureStake Inc.
// This file is part of Moonbeam.

// Moonbeam is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// Moonbeam is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with Moonbeam.  If not, see <http://www.gnu.org/licenses/>.

//! Solidity types for randomness precompile.
use precompile_utils::{
	prelude::*,
	solidity::codec::{Reader, Writer},
};

pub enum RequestStatus {
	DoesNotExist,
	Pending,
	Ready,
	Expired,
}

pub enum RandomnessSource {
	LocalVRF,
	RelayBabeEpoch,
}

impl solidity::Codec for RequestStatus {
	fn read(reader: &mut Reader) -> MayRevert<Self> {
		match reader.read().in_field("variant")? {
			0u8 => Ok(RequestStatus::DoesNotExist),
			1u8 => Ok(RequestStatus::Pending),
			2u8 => Ok(RequestStatus::Ready),
			3u8 => Ok(RequestStatus::Expired),
			_ => Err(RevertReason::custom("Unknown RequestStatus variant").into()),
		}
	}

	fn write(writer: &mut Writer, value: Self) {
		let encoded: u8 = match value {
			RequestStatus::DoesNotExist => 0u8,
			RequestStatus::Pending => 1u8,
			RequestStatus::Ready => 2u8,
			RequestStatus::Expired => 3u8,
		};
		solidity::Codec::write(writer, encoded);
	}

	fn has_static_size() -> bool {
		true
	}

	fn signature() -> String {
		u8::signature()
	}
}

impl solidity::Codec for RandomnessSource {
	fn read(reader: &mut Reader) -> MayRevert<Self> {
		match reader.read().in_field("variant")? {
			0u8 => Ok(RandomnessSource::LocalVRF),
			1u8 => Ok(RandomnessSource::RelayBabeEpoch),
			_ => Err(RevertReason::custom("Unknown RandomnessSource variant").into()),
		}
	}

	fn write(writer: &mut Writer, value: Self) {
		let encoded: u8 = match value {
			RandomnessSource::LocalVRF => 0u8,
			RandomnessSource::RelayBabeEpoch => 1u8,
		};
		solidity::Codec::write(writer, encoded);
	}

	fn has_static_size() -> bool {
		true
	}

	fn signature() -> String {
		u8::signature()
	}
}