I have the below code, if you see I am storing the ContractSender struct as OptionQuery.
Later on, I am trying to read the data from the Struct, but was not able to.
#[pallet::storage]
#[pallet::getter(fn contract_sender)]
pub(super) type ContractSender<T: Config> =
StorageMap<_, Blake2_128Concat, T::AccountId, Contract<T::AccountId, T::AccountId, BalanceOf<T>>, OptionQuery>;
#[pallet::storage]
#[pallet::getter(fn contract_receiver)]
pub(super) type ContractReceiver<T: Config> =
StorageMap<_, Blake2_128Concat, T::AccountId, Contract<T::AccountId, T::AccountId, BalanceOf<T>>, OptionQuery>;
#[pallet::event]
#[pallet::generate_deposit(pub(super) fn deposit_event)]
pub enum Event<T: Config> {
/// Sign Contract
ContractEvent(T::AccountId, T::AccountId, BalanceOf<T>, u64, u64, u64),
/// Lock funds
Locked(T::AccountId, BalanceOf<T>),
/// Unlock funds
UnLock(T::AccountId, BalanceOf<T>),
/// Transfer
Transfer(T::AccountId, T::AccountId, BalanceOf<T>),
}
#[pallet::error]
pub enum Error<T> {
/// The requested user has not stored a value yet
NoValueStored,
/// Expiring Date was wrong/older than current date
WrongExpiringDate,
/// Contract is signed by the same addresses
SameAddressError
}
#[pallet::call]
impl<T: Config> Pallet<T> {
/// Sign contract between two addresses
#[pallet::weight(T::WeightInfo::sign_contract())]
pub fn sign_contract(
origin: OriginFor<T>,
to: T::AccountId,
amount: BalanceOf<T>,
work_days: u64,
take_action_days: u64,
) -> DispatchResultWithPostInfo {
// Check if Tx is signed
let from = ensure_signed(origin)?;
// Check if the sender and receiver have not the same address
ensure!(from != to, Error::<T>::SameAddressError);
// calculate how many blocks per day gets generated
let prod_block_per_sec = 6;
let day_per_second = 86400;
let prod_block_per_day = day_per_second / prod_block_per_sec;
let current_block_number: u64 = frame_system::Pallet::<T>::block_number().try_into().unwrap_or(0);
let work_days_in_block_number = current_block_number + (work_days * prod_block_per_day);
let take_action_days_in_block = work_days_in_block_number + (take_action_days * prod_block_per_day);
//Creating a Contract object
let contract = Contract {
origin: from.clone(),
to: to.clone(),
amount: amount.clone(),
current_block_number: current_block_number.clone(),
work_days_in_block_number: work_days_in_block_number.clone(),
take_action_days_in_block: take_action_days_in_block.clone(),
};
// Save in storage the sender and the contract
<ContractSender<T>>::insert(from.clone(), &contract);
// Save in storage the reciever and the contract
<ContractReceiver<T>>::insert(to.clone(), contract);
//Throw Contract event
let work_days_in_block_number = <ContractSender<T>>::get(&from).work_days_in_block_number;
Ok(().into())
}
When I am trying to read from the storage and get the work_days_in_block_number value but not possible. Error:
error[E0609]: no field `work_days_in_block_number` on type `Option<Contract<<T as frame_system::Config>::AccountId, <T as frame_system::Config>::AccountId, <<T as pallet::Config>::Currency as Currency<<T as frame_system::Config>::AccountId>>::Balance>>`
--> /Users/elioprifti/substrate-node-template/pallets/escrow/src/lib.rs:161:68
|
161 | let work_days_in_block_number = <ContractSender<T>>::get(&from).work_days_in_block_number;
| ^^^^^^^^^^^^^^^^^^^^^^^^^
For more information about this error, try `rustc --explain E0609`.
warning: `escrow` (lib) generated 3 warnings
error: could not compile `escrow` due to previous error; 3 warnings emitted
What should I do?