casperlabs_contract_utils/
contract_storage.rs

1use alloc::vec::Vec;
2use casper_contract::contract_api::runtime;
3use casper_types::system::CallStackElement;
4use once_cell::unsync::OnceCell;
5
6pub trait ContractStorage {
7    fn call_stack(&self) -> &[CallStackElement];
8}
9
10#[derive(Default)]
11pub struct OnChainContractStorage {
12    call_stack: OnceCell<Vec<CallStackElement>>,
13}
14
15impl ContractStorage for OnChainContractStorage {
16    fn call_stack(&self) -> &[CallStackElement] {
17        let call_stack = self.call_stack.get_or_init(runtime::get_call_stack);
18        call_stack.as_slice()
19    }
20}