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
use near_sdk::borsh::{self, BorshDeserialize, BorshSerialize};
use near_sdk::json_types::U128;
use near_sdk::serde::{Deserialize, Serialize};
use near_sdk::AccountId;
#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize)]
#[serde(crate = "near_sdk::serde")]
#[cfg_attr(feature = "abi", derive(schemars::JsonSchema))]
pub struct StorageBalance {
pub total: U128,
pub available: U128,
}
#[derive(BorshDeserialize, BorshSerialize, Serialize, Deserialize)]
#[serde(crate = "near_sdk::serde")]
#[cfg_attr(feature = "abi", derive(schemars::JsonSchema))]
pub struct StorageBalanceBounds {
pub min: U128,
pub max: Option<U128>,
}
pub trait StorageManagement {
// if `registration_only=true` MUST refund above the minimum balance if the account didn't exist and
// refund full deposit if the account exists.
fn storage_deposit(
&mut self,
account_id: Option<AccountId>,
registration_only: Option<bool>,
) -> StorageBalance;
/// Withdraw specified amount of available Ⓝ for predecessor account.
///
/// This method is safe to call. It MUST NOT remove data.
///
/// `amount` is sent as a string representing an unsigned 128-bit integer. If
/// omitted, contract MUST refund full `available` balance. If `amount` exceeds
/// predecessor account's available balance, contract MUST panic.
///
/// If predecessor account not registered, contract MUST panic.
///
/// MUST require exactly 1 yoctoNEAR attached balance to prevent restricted
/// function-call access-key call (UX wallet security)
///
/// Returns the StorageBalance structure showing updated balances.
fn storage_withdraw(&mut self, amount: Option<U128>) -> StorageBalance;
/// Unregisters the predecessor account and returns the storage NEAR deposit back.
///
/// If the predecessor account is not registered, the function MUST return `false` without panic.
///
/// If `force=true` the function SHOULD ignore account balances (burn them) and close the account.
/// Otherwise, MUST panic if caller has a positive registered balance (eg token holdings) or
/// the contract doesn't support force unregistration.
/// MUST require exactly 1 yoctoNEAR attached balance to prevent restricted function-call access-key call
/// (UX wallet security)
/// Returns `true` iff the account was unregistered.
/// Returns `false` iff account was not registered before.
fn storage_unregister(&mut self, force: Option<bool>) -> bool;
fn storage_balance_bounds(&self) -> StorageBalanceBounds;
fn storage_balance_of(&self, account_id: AccountId) -> Option<StorageBalance>;
}