Skip to main content

rain_metadata/meta/
magic.rs

1/// All known Rain magic numbers
2#[derive(
3    serde::Serialize,
4    Clone,
5    Copy,
6    strum::EnumIter,
7    strum::EnumString,
8    strum::Display,
9    Debug,
10    PartialEq,
11    serde::Deserialize,
12)]
13#[strum(serialize_all = "kebab_case")]
14#[serde(rename_all = "kebab-case")]
15#[repr(u64)]
16pub enum KnownMagic {
17    /// Prefixes every rain meta document
18    RainMetaDocumentV1 = 0xff0a89c674ee7874,
19
20    /// Ops meta v1
21    OpMetaV1 = 0xffe5282f43e495b4,
22    /// Dotrain meta v1
23    DotrainV1 = 0xffdac2f2f37be894,
24    /// Rainlang meta v1
25    RainlangV1 = 0xff1c198cec3b48a7,
26    /// Solidity ABI meta v2
27    SolidityAbiV2 = 0xffe5ffb4a3ff2cde,
28    /// Authoring meta v1
29    AuthoringMetaV1 = 0xffe9e3a02ca8e235,
30    // Authoring meta v2
31    AuthoringMetaV2 = 0xff52fe42f1a05093,
32    /// InterpreterCaller meta v1
33    InterpreterCallerMetaV1 = 0xffc21bbf86cc199b,
34    /// ExpressionDeployer deployed bytecode meta v1
35    ExpressionDeployerV2BytecodeV1 = 0xffdb988a8cd04d32,
36    /// Rainlang source code meta v1
37    RainlangSourceV1 = 0xff13109e41336ff2,
38    //Address list meta
39    AddressList = 0xffb2637608c09e38,
40    /// Dotrain source code meta v1
41    DotrainSourceV1 = 0xffa15ef0fc437099,
42    /// Order builder state meta v1
43    OrderBuilderStateV1 = 0xffda7b2fb167c286,
44    /// Signed context oracle endpoint v1
45    /// Payload is raw UTF-8 bytes containing the oracle endpoint URL.
46    /// Used in order metadata to tell takers where to GET signed context data.
47    RaindexSignedContextOracleV1 = 0xff7a1507ba4419ca,
48    /// OffchainAsset schema reference for offchain asset data
49    OaSchema = 0xffa8e8a9b9cf4a31,
50    /// OffchainAsset IPFS hash list for offchain assets
51    OaHashList = 0xff9fae3cc645f463,
52    /// OffchainAsset structured data (e.g. receipt information)
53    OaStructure = 0xffc47a6299e8a911,
54    /// OffchainAsset token image metadata
55    OaTokenImage = 0xff8cd2927c8c86cb,
56    /// OffchainAsset token credential links
57    OaTokenCredentialLinks = 0xffbc38eb14ad2209,
58}
59
60impl KnownMagic {
61    pub fn to_prefix_bytes(&self) -> [u8; 8] {
62        // Use big endian here as the magic numbers are for binary data prefixes.
63        (*self as u64).to_be_bytes()
64    }
65}
66
67impl TryFrom<u64> for KnownMagic {
68    type Error = crate::error::Error;
69    fn try_from(value: u64) -> Result<Self, Self::Error> {
70        match value {
71            v if v == KnownMagic::OpMetaV1 as u64 => Ok(KnownMagic::OpMetaV1),
72            v if v == KnownMagic::DotrainV1 as u64 => Ok(KnownMagic::DotrainV1),
73            v if v == KnownMagic::RainlangV1 as u64 => Ok(KnownMagic::RainlangV1),
74            v if v == KnownMagic::SolidityAbiV2 as u64 => Ok(KnownMagic::SolidityAbiV2),
75            v if v == KnownMagic::AuthoringMetaV1 as u64 => Ok(KnownMagic::AuthoringMetaV1),
76            v if v == KnownMagic::AuthoringMetaV2 as u64 => Ok(KnownMagic::AuthoringMetaV2),
77            v if v == KnownMagic::AddressList as u64 => Ok(KnownMagic::AddressList),
78            v if v == KnownMagic::RainMetaDocumentV1 as u64 => Ok(KnownMagic::RainMetaDocumentV1),
79            v if v == KnownMagic::InterpreterCallerMetaV1 as u64 => {
80                Ok(KnownMagic::InterpreterCallerMetaV1)
81            }
82            v if v == KnownMagic::ExpressionDeployerV2BytecodeV1 as u64 => {
83                Ok(KnownMagic::ExpressionDeployerV2BytecodeV1)
84            }
85            v if v == KnownMagic::RainlangSourceV1 as u64 => Ok(KnownMagic::RainlangSourceV1),
86            v if v == KnownMagic::DotrainSourceV1 as u64 => Ok(KnownMagic::DotrainSourceV1),
87            v if v == KnownMagic::OrderBuilderStateV1 as u64 => Ok(KnownMagic::OrderBuilderStateV1),
88            v if v == KnownMagic::RaindexSignedContextOracleV1 as u64 => {
89                Ok(KnownMagic::RaindexSignedContextOracleV1)
90            }
91            v if v == KnownMagic::OaSchema as u64 => Ok(KnownMagic::OaSchema),
92            v if v == KnownMagic::OaHashList as u64 => Ok(KnownMagic::OaHashList),
93            v if v == KnownMagic::OaStructure as u64 => Ok(KnownMagic::OaStructure),
94            v if v == KnownMagic::OaTokenImage as u64 => Ok(KnownMagic::OaTokenImage),
95            v if v == KnownMagic::OaTokenCredentialLinks as u64 => {
96                Ok(KnownMagic::OaTokenCredentialLinks)
97            }
98            _ => Err(crate::error::Error::UnknownMagic),
99        }
100    }
101}
102
103#[cfg(test)]
104mod tests {
105    use super::KnownMagic;
106    use alloy::primitives::hex;
107
108    #[test]
109    fn test_rain_meta_document_v1() {
110        let magic_number = KnownMagic::RainMetaDocumentV1;
111        let magic_number_after_prefix = magic_number.to_prefix_bytes();
112
113        assert_eq!(hex::encode(magic_number_after_prefix), "ff0a89c674ee7874");
114    }
115
116    #[test]
117    fn test_solidity_abi_v2() {
118        let magic_number = KnownMagic::SolidityAbiV2;
119        let magic_number_after_prefix = magic_number.to_prefix_bytes();
120
121        assert_eq!(hex::encode(magic_number_after_prefix), "ffe5ffb4a3ff2cde");
122    }
123
124    #[test]
125    fn test_op_meta_v1() {
126        let magic_number = KnownMagic::OpMetaV1;
127        let magic_number_after_prefix = magic_number.to_prefix_bytes();
128
129        assert_eq!(hex::encode(magic_number_after_prefix), "ffe5282f43e495b4");
130    }
131
132    #[test]
133    fn test_interpreter_caller_meta_v1() {
134        let magic_number = KnownMagic::InterpreterCallerMetaV1;
135        let magic_number_after_prefix = magic_number.to_prefix_bytes();
136
137        assert_eq!(hex::encode(magic_number_after_prefix), "ffc21bbf86cc199b");
138    }
139
140    #[test]
141    fn test_authoring_meta_v1() {
142        let magic_number = KnownMagic::AuthoringMetaV1;
143        let magic_number_after_prefix = magic_number.to_prefix_bytes();
144
145        assert_eq!(hex::encode(magic_number_after_prefix), "ffe9e3a02ca8e235");
146    }
147
148    #[test]
149    fn test_authoring_meta_v2() {
150        let magic_number = KnownMagic::AuthoringMetaV2;
151        let magic_number_after_prefix = magic_number.to_prefix_bytes();
152
153        assert_eq!(hex::encode(magic_number_after_prefix), "ff52fe42f1a05093");
154    }
155
156    #[test]
157    fn test_dotrain_meta_v1() {
158        let magic_number = KnownMagic::DotrainV1;
159        let magic_number_after_prefix = magic_number.to_prefix_bytes();
160
161        assert_eq!(hex::encode(magic_number_after_prefix), "ffdac2f2f37be894");
162    }
163
164    #[test]
165    fn test_rainlang_meta_v1() {
166        let magic_number = KnownMagic::RainlangV1;
167        let magic_number_after_prefix = magic_number.to_prefix_bytes();
168
169        assert_eq!(hex::encode(magic_number_after_prefix), "ff1c198cec3b48a7");
170    }
171
172    #[test]
173    fn test_expression_deployer_v2_bytecode_meta_v1() {
174        let magic_number = KnownMagic::ExpressionDeployerV2BytecodeV1;
175        let magic_number_after_prefix = magic_number.to_prefix_bytes();
176
177        assert_eq!(hex::encode(magic_number_after_prefix), "ffdb988a8cd04d32");
178    }
179
180    #[test]
181    fn test_rainlang_source_meta_v1() {
182        let magic_number = KnownMagic::RainlangSourceV1;
183        let magic_number_after_prefix = magic_number.to_prefix_bytes();
184
185        assert_eq!(hex::encode(magic_number_after_prefix), "ff13109e41336ff2");
186    }
187
188    #[test]
189    fn test_dotrain_source_meta_v1() {
190        let magic_number = KnownMagic::DotrainSourceV1;
191        let magic_number_after_prefix = magic_number.to_prefix_bytes();
192
193        assert_eq!(hex::encode(magic_number_after_prefix), "ffa15ef0fc437099");
194    }
195
196    #[test]
197    fn test_dotrain_instance_meta_v1() {
198        let magic_number = KnownMagic::OrderBuilderStateV1;
199        let magic_number_after_prefix = magic_number.to_prefix_bytes();
200
201        assert_eq!(hex::encode(magic_number_after_prefix), "ffda7b2fb167c286");
202    }
203
204    #[test]
205    fn test_signed_context_oracle_v1() {
206        let magic_number = KnownMagic::RaindexSignedContextOracleV1;
207        let magic_number_after_prefix = magic_number.to_prefix_bytes();
208
209        assert_eq!(hex::encode(magic_number_after_prefix), "ff7a1507ba4419ca");
210    }
211
212    #[test]
213    fn test_signed_context_oracle_v1_roundtrip() {
214        let magic_number = KnownMagic::RaindexSignedContextOracleV1;
215        let from_u64 = KnownMagic::try_from(magic_number as u64).unwrap();
216        assert_eq!(magic_number, from_u64);
217    }
218
219    #[test]
220    fn test_oa_schema() {
221        let magic_number = KnownMagic::OaSchema;
222        let magic_number_after_prefix = magic_number.to_prefix_bytes();
223
224        assert_eq!(hex::encode(magic_number_after_prefix), "ffa8e8a9b9cf4a31");
225    }
226
227    #[test]
228    fn test_oa_hash_list() {
229        let magic_number = KnownMagic::OaHashList;
230        let magic_number_after_prefix = magic_number.to_prefix_bytes();
231
232        assert_eq!(hex::encode(magic_number_after_prefix), "ff9fae3cc645f463");
233    }
234
235    #[test]
236    fn test_oa_structure() {
237        let magic_number = KnownMagic::OaStructure;
238        let magic_number_after_prefix = magic_number.to_prefix_bytes();
239
240        assert_eq!(hex::encode(magic_number_after_prefix), "ffc47a6299e8a911");
241    }
242
243    #[test]
244    fn test_oa_token_image() {
245        let magic_number = KnownMagic::OaTokenImage;
246        let magic_number_after_prefix = magic_number.to_prefix_bytes();
247
248        assert_eq!(hex::encode(magic_number_after_prefix), "ff8cd2927c8c86cb");
249    }
250
251    #[test]
252    fn test_oa_token_credential_links() {
253        let magic_number = KnownMagic::OaTokenCredentialLinks;
254        let magic_number_after_prefix = magic_number.to_prefix_bytes();
255
256        assert_eq!(hex::encode(magic_number_after_prefix), "ffbc38eb14ad2209");
257    }
258
259    #[test]
260    fn test_oa_magics_roundtrip() {
261        for magic_number in [
262            KnownMagic::OaSchema,
263            KnownMagic::OaHashList,
264            KnownMagic::OaStructure,
265            KnownMagic::OaTokenImage,
266            KnownMagic::OaTokenCredentialLinks,
267        ] {
268            let from_u64 = KnownMagic::try_from(magic_number as u64).unwrap();
269            assert_eq!(magic_number, from_u64);
270        }
271    }
272}