eva_asm/instruction/
environment.rs

1//! Environmental information.
2
3use derive_more::Display;
4
5use crate::{
6    instruction::Instruction,
7    opcode::{Mnemonic, OpCode},
8};
9
10/// Get address of currently executing account.
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display)]
12#[display("{}", self.opcode())]
13pub struct Address;
14
15impl Instruction for Address {
16    fn opcode(&self) -> OpCode {
17        OpCode::Known(Mnemonic::ADDRESS)
18    }
19}
20
21/// Get balance of the given account.
22#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display)]
23#[display("{}", self.opcode())]
24pub struct Balance;
25
26impl Instruction for Balance {
27    fn opcode(&self) -> OpCode {
28        OpCode::Known(Mnemonic::BALANCE)
29    }
30}
31
32/// Get execution origination address.
33#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display)]
34#[display("{}", self.opcode())]
35pub struct Origin;
36
37impl Instruction for Origin {
38    fn opcode(&self) -> OpCode {
39        OpCode::Known(Mnemonic::ORIGIN)
40    }
41}
42
43/// Get caller address.
44#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display)]
45#[display("{}", self.opcode())]
46pub struct Caller;
47
48impl Instruction for Caller {
49    fn opcode(&self) -> OpCode {
50        OpCode::Known(Mnemonic::CALLER)
51    }
52}
53
54/// Get deposited value by the instruction/transaction responsible for this execution.
55#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display)]
56#[display("{}", self.opcode())]
57pub struct CallValue;
58
59impl Instruction for CallValue {
60    fn opcode(&self) -> OpCode {
61        OpCode::Known(Mnemonic::CALLVALUE)
62    }
63}
64
65/// Get input data of current environment.
66#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display)]
67#[display("{}", self.opcode())]
68pub struct CallDataLoad;
69
70impl Instruction for CallDataLoad {
71    fn opcode(&self) -> OpCode {
72        OpCode::Known(Mnemonic::CALLDATALOAD)
73    }
74}
75
76/// Get size of input data in current environment.
77#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display)]
78#[display("{}", self.opcode())]
79pub struct CallDataSize;
80
81impl Instruction for CallDataSize {
82    fn opcode(&self) -> OpCode {
83        OpCode::Known(Mnemonic::CALLDATASIZE)
84    }
85}
86
87/// Copy input data in current environment to memory.
88#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display)]
89#[display("{}", self.opcode())]
90pub struct CallDataCopy;
91
92impl Instruction for CallDataCopy {
93    fn opcode(&self) -> OpCode {
94        OpCode::Known(Mnemonic::CALLDATACOPY)
95    }
96}
97
98/// Get size of code running in current environment.
99#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display)]
100#[display("{}", self.opcode())]
101pub struct CodeSize;
102
103impl Instruction for CodeSize {
104    fn opcode(&self) -> OpCode {
105        OpCode::Known(Mnemonic::CODESIZE)
106    }
107}
108
109/// Copy code running in current environment to memory.
110#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display)]
111#[display("{}", self.opcode())]
112pub struct CodeCopy;
113
114impl Instruction for CodeCopy {
115    fn opcode(&self) -> OpCode {
116        OpCode::Known(Mnemonic::CODECOPY)
117    }
118}
119
120/// Get price of gas in current environment.
121#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display)]
122#[display("{}", self.opcode())]
123pub struct GasPrice;
124
125impl Instruction for GasPrice {
126    fn opcode(&self) -> OpCode {
127        OpCode::Known(Mnemonic::GASPRICE)
128    }
129}
130
131/// Get size of an account’s code.
132#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display)]
133#[display("{}", self.opcode())]
134pub struct ExtCodeSize;
135
136impl Instruction for ExtCodeSize {
137    fn opcode(&self) -> OpCode {
138        OpCode::Known(Mnemonic::EXTCODESIZE)
139    }
140}
141
142/// Copy an account’s code to memory.
143#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display)]
144#[display("{}", self.opcode())]
145pub struct ExtCodeCopy;
146
147impl Instruction for ExtCodeCopy {
148    fn opcode(&self) -> OpCode {
149        OpCode::Known(Mnemonic::EXTCODECOPY)
150    }
151}
152
153/// Get size of output data from the previous call from the current environment.
154#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display)]
155#[display("{}", self.opcode())]
156pub struct ReturnDataSize;
157
158impl Instruction for ReturnDataSize {
159    fn opcode(&self) -> OpCode {
160        OpCode::Known(Mnemonic::RETURNDATASIZE)
161    }
162}
163
164/// Copy output data from the previous call to memory.
165#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display)]
166#[display("{}", self.opcode())]
167pub struct ReturnDataCopy;
168
169impl Instruction for ReturnDataCopy {
170    fn opcode(&self) -> OpCode {
171        OpCode::Known(Mnemonic::RETURNDATACOPY)
172    }
173}
174
175/// Get hash of an account’s code.
176#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Display)]
177#[display("{}", self.opcode())]
178pub struct ExtCodeHash;
179
180impl Instruction for ExtCodeHash {
181    fn opcode(&self) -> OpCode {
182        OpCode::Known(Mnemonic::EXTCODEHASH)
183    }
184}