Skip to main content

Contract

Struct Contract 

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

A deployed contract instance bound to its interface identity.

call and view encode the argument value (typically a tuple of the method’s arguments) with the contract (CXS) codec and decode the return the same way, so a test works in Rust values rather than raw calldata. The argument and return types must implement xdrs WriteXDR / ReadXDR (the method’s own argument/return types from a contract’s interface crate do).

Each method takes anything that can reach a Caller: an agent’s &ctx, or a Caller cloned out of it with AgentContext::caller.

Prefer an interface’s generated <Iface>Remote proxy (see the module docs), which checks method names and argument types at compile time. A Contract suits a contract with no interface crate to generate one from:

use thruput_testkit::xdr::types::ContractAddress;
use thruput_testkit::{AgentContext, Contract, Result};

async fn bump(ctx: &AgentContext, address: ContractAddress) -> Result<u64> {
    let counter = Contract::new(address, "Counter", "0.1.0");
    // One argument is passed as itself; several, as a tuple.
    counter.call(ctx, "increment", &1u64).await?;
    let count: u64 = counter.call_returning(ctx, "increment", &1u64).await?;
    let read: u64 = counter.view(ctx, "get", &(), Some(ctx.address())).await?;
    assert_eq!(read, count);
    Ok(count)
}

Implementations§

Source§

impl Contract

Source

pub fn new( address: ContractAddress, interface: impl Into<String>, version: impl Into<String>, ) -> Self

Bind a handle to a deployed address and its interface identity.

Source

pub fn address(&self) -> ContractAddress

The deployed contract address.

Source

pub fn prepare_call<R, A>( &self, ctx: &(impl AsRef<Caller> + ?Sized), method: &str, args: &A, ) -> ContractCall<R>
where A: WriteXDR + ?Sized,

Prepare a state-changing call to method from ctx’s account, whose return decodes as R. Nothing is submitted until the ContractCall is awaited or submitted.

The arguments are encoded now, so the call borrows nothing: it can be held, moved into another task, or returned from a typed client method.

Source

pub async fn call<A>( &self, ctx: &(impl AsRef<Caller> + ?Sized), method: &str, args: &A, ) -> Result<TransactionReceipt>
where A: WriteXDR + ?Sized,

Submit a state-changing call to method through the agent’s wallet, awaiting the receipt and requiring successful execution.

Returns TestkitError::Reverted if the transaction executed but its status was not Ok, so callers can ? a call they expect to succeed instead of asserting on the receipt. Add call-site context with map_err where the method name alone does not identify the call.

Source

pub async fn submit_call<A>( &self, ctx: &(impl AsRef<Caller> + ?Sized), method: &str, args: &A, ) -> Result<SubmittedContractCall>
where A: WriteXDR + ?Sized,

Submit a state-changing call without waiting for its receipt.

Source

pub async fn call_returning<A, R>( &self, ctx: &(impl AsRef<Caller> + ?Sized), method: &str, args: &A, ) -> Result<R>
where A: WriteXDR + ?Sized, R: for<'r> ReadXDR<'r>,

Call method, requiring success, and decode the return value to R.

Source

pub async fn view<A, R>( &self, ctx: &(impl AsRef<Caller> + ?Sized), method: &str, args: &A, caller: Option<ContractAddress>, ) -> Result<R>
where A: WriteXDR + ?Sized, R: for<'r> ReadXDR<'r>,

Simulate a read-only view of method, decoding the return to R.

caller sets the simulated msg.sender; pass an agent’s own address for state keyed by the caller.

Trait Implementations§

Source§

impl Clone for Contract

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Contract

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> DynClone for T
where T: Clone,

Source§

fn __clone_box(&self, _: Private) -> *mut ()

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> MaybeSend for T
where T: Send,

Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> StaticIfNoAlloc for T

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

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

Source§

type Error = !

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

fn try_from(value: U) -> Result<T, !>

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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

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