Struct Promise

Source
pub struct Promise { /* private fields */ }
Expand description

A structure representing a result of the scheduled execution on another contract.

Smart contract developers will explicitly use Promise in two situations:

  • When they need to return Promise.

    In the following code if someone calls method ContractA::a they will internally cause an execution of method ContractB::b of bob_near account, and the return value of ContractA::a will be what ContractB::b returned.

#[ext_contract]
pub trait ContractB {
    fn b(&mut self);
}

#[near(contract_state)]
#[derive(Default)]
struct ContractA {}

#[near]
impl ContractA {
    pub fn a(&self) -> Promise {
        contract_b::ext("bob_near".parse().unwrap()).b()
    }
}
  • When they need to create a transaction with one or many actions, e.g. the following code schedules a transaction that creates an account, transfers tokens, and assigns a public key:
Promise::new("bob_near".parse().unwrap())
  .create_account()
  .transfer(NearToken::from_yoctonear(1000))
  .add_full_access_key(env::signer_account_pk());

More information about promises in NEAR documentation

Implementations§

Source§

impl Promise

Source

pub fn new(account_id: AccountId) -> Self

Create a promise that acts on the given account. Uses low-level crate::env::promise_batch_create

Source

pub fn create_account(self) -> Self

Create account on which this promise acts. Uses low-level crate::env::promise_batch_action_create_account

Source

pub fn deploy_contract(self, code: Vec<u8>) -> Self

Deploy a smart contract to the account on which this promise acts. Uses low-level crate::env::promise_batch_action_deploy_contract

Source

pub fn function_call( self, function_name: String, arguments: Vec<u8>, amount: NearToken, gas: Gas, ) -> Self

A low-level interface for making a function call to the account that this promise acts on. Uses low-level crate::env::promise_batch_action_function_call

Source

pub fn function_call_weight( self, function_name: String, arguments: Vec<u8>, amount: NearToken, gas: Gas, weight: GasWeight, ) -> Self

A low-level interface for making a function call to the account that this promise acts on. unlike Promise::function_call, this function accepts a weight to use relative unused gas on this function call at the end of the scheduling method execution. Uses low-level crate::env::promise_batch_action_function_call_weight

Source

pub fn transfer(self, amount: NearToken) -> Self

Transfer tokens to the account that this promise acts on. Uses low-level crate::env::promise_batch_action_transfer

Source

pub fn stake(self, amount: NearToken, public_key: PublicKey) -> Self

Stake the account for the given amount of tokens using the given public key. Uses low-level crate::env::promise_batch_action_stake

Source

pub fn add_full_access_key(self, public_key: PublicKey) -> Self

Add full access key to the given account. Uses low-level crate::env::promise_batch_action_add_key_with_full_access

Source

pub fn add_full_access_key_with_nonce( self, public_key: PublicKey, nonce: u64, ) -> Self

Add full access key to the given account with a provided nonce. Uses low-level crate::env::promise_batch_action_add_key_with_full_access

Source

pub fn add_access_key_allowance( self, public_key: PublicKey, allowance: Allowance, receiver_id: AccountId, function_names: String, ) -> Self

Add an access key that is restricted to only calling a smart contract on some account using only a restricted set of methods. Here function_names is a comma separated list of methods, e.g. "method_a,method_b".to_string(). Uses low-level crate::env::promise_batch_action_add_key_with_function_call

Source

pub fn add_access_key( self, public_key: PublicKey, allowance: NearToken, receiver_id: AccountId, function_names: String, ) -> Self

👎Deprecated since 5.0.0: Use add_access_key_allowance instead
Source

pub fn add_access_key_allowance_with_nonce( self, public_key: PublicKey, allowance: Allowance, receiver_id: AccountId, function_names: String, nonce: u64, ) -> Self

Add an access key with a provided nonce. Uses low-level crate::env::promise_batch_action_add_key_with_function_call

Source

pub fn add_access_key_with_nonce( self, public_key: PublicKey, allowance: NearToken, receiver_id: AccountId, function_names: String, nonce: u64, ) -> Self

👎Deprecated since 5.0.0: Use add_access_key_allowance_with_nonce instead
Source

pub fn delete_key(self, public_key: PublicKey) -> Self

Delete access key from the given account. Uses low-level crate::env::promise_batch_action_delete_key

Source

pub fn delete_account(self, beneficiary_id: AccountId) -> Self

Delete the given account. Uses low-level crate::env::promise_batch_action_delete_account

Source

pub fn and(self, other: Promise) -> Promise

Merge this promise with another promise, so that we can schedule execution of another smart contract right after all merged promises finish.

Note, once the promises are merged it is not possible to add actions to them, e.g. the following code will panic during the execution of the smart contract:

let p1 = Promise::new("bob_near".parse().unwrap()).create_account();
let p2 = Promise::new("carol_near".parse().unwrap()).create_account();
let p3 = p1.and(p2);
// p3.create_account();

Uses low-level crate::env::promise_and

Source

pub fn then(self, other: Promise) -> Promise

Schedules execution of another promise right after the current promise finish executing.

In the following code bob_near and dave_near will be created concurrently. carol_near creation will wait for bob_near to be created, and eva_near will wait for both carol_near and dave_near to be created first.

let p1 = Promise::new("bob_near".parse().unwrap()).create_account();
let p2 = Promise::new("carol_near".parse().unwrap()).create_account();
let p3 = Promise::new("dave_near".parse().unwrap()).create_account();
let p4 = Promise::new("eva_near".parse().unwrap()).create_account();
p1.then(p2).and(p3).then(p4);

Uses low-level crate::env::promise_batch_then

Source

pub fn as_return(self) -> Self

A specialized, relatively low-level API method. Allows to mark the given promise as the one that should be considered as a return value.

In the below code a1 and a2 functions are equivalent.

#[ext_contract]
pub trait ContractB {
    fn b(&mut self);
}

#[near(contract_state)]
#[derive(Default)]
struct ContractA {}

#[near]
impl ContractA {
    pub fn a1(&self) {
       contract_b::ext("bob_near".parse().unwrap()).b().as_return();
    }

    pub fn a2(&self) -> Promise {
       contract_b::ext("bob_near".parse().unwrap()).b()
    }
}

Makes the promise to use low-level crate::env::promise_return.

Trait Implementations§

Source§

impl BorshSchema for Promise

Until we implement strongly typed promises we serialize them as unit struct.

Source§

fn add_definitions_recursively( definitions: &mut BTreeMap<Declaration, Definition>, )

Recursively, using DFS, add type definitions required for this type. Type definition partially explains how to serialize/deserialize a type.
Source§

fn declaration() -> Declaration

Get the name of the type without brackets.
Source§

impl BorshSerialize for Promise

Source§

fn serialize<W: Write>(&self, _writer: &mut W) -> Result<(), Error>

Source§

impl Drop for Promise

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

impl<T> From<Promise> for PromiseOrValue<T>

Source§

fn from(promise: Promise) -> Self

Converts to this type from the input type.
Source§

impl JsonSchema for Promise

Source§

fn schema_name() -> String

The name of the generated JSON Schema. Read more
Source§

fn json_schema(_gen: &mut SchemaGenerator) -> Schema

Generates a JSON Schema for this type. Read more
Source§

fn is_referenceable() -> bool

Whether JSON Schemas generated for this type should be re-used where possible using the $ref keyword. Read more
Source§

fn schema_id() -> Cow<'static, str>

Returns a string that uniquely identifies the schema produced by this type. Read more
Source§

impl Serialize for Promise

Source§

fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where S: Serializer,

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations§

§

impl !Freeze for Promise

§

impl !RefUnwindSafe for Promise

§

impl !Send for Promise

§

impl !Sync for Promise

§

impl Unpin for Promise

§

impl !UnwindSafe for Promise

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more