scrypto/component/
object.rs

1use crate::engine::scrypto_env::ScryptoVmV1Api;
2use crate::prelude::{scrypto_encode, ScryptoEncode, ScryptoSbor};
3use crate::runtime::*;
4use crate::*;
5use radix_common::data::scrypto::{scrypto_decode, ScryptoDecode};
6use radix_engine_interface::types::*;
7use sbor::rust::prelude::*;
8
9#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, ScryptoSbor)]
10pub enum ObjectStubHandle {
11    Own(Own),
12    Global(GlobalAddress),
13}
14
15impl ObjectStubHandle {
16    pub fn as_node_id(&self) -> &NodeId {
17        match self {
18            ObjectStubHandle::Own(own) => own.as_node_id(),
19            ObjectStubHandle::Global(address) => address.as_node_id(),
20        }
21    }
22}
23
24pub trait ObjectStub: Copy {
25    type AddressType: TryFrom<[u8; NodeId::LENGTH]>;
26
27    fn new(handle: ObjectStubHandle) -> Self;
28
29    fn handle(&self) -> &ObjectStubHandle;
30
31    fn call<A: ScryptoEncode, T: ScryptoDecode>(&self, method: &str, args: &A) -> T {
32        let output = ScryptoVmV1Api::object_call(
33            self.handle().as_node_id(),
34            method,
35            scrypto_encode(args).unwrap(),
36        );
37        scrypto_decode(&output).unwrap()
38    }
39
40    fn call_ignore_rtn<A: ScryptoEncode>(&self, method: &str, args: &A) {
41        ScryptoVmV1Api::object_call(
42            self.handle().as_node_id(),
43            method,
44            scrypto_encode(args).unwrap(),
45        );
46    }
47
48    fn call_raw<T: ScryptoDecode>(&self, method: &str, args: Vec<u8>) -> T {
49        let output = ScryptoVmV1Api::object_call(self.handle().as_node_id(), method, args);
50        scrypto_decode(&output).unwrap()
51    }
52
53    fn instance_of(&self, blueprint_id: &BlueprintId) -> bool {
54        ScryptoVmV1Api::object_instance_of(self.handle().as_node_id(), blueprint_id)
55    }
56
57    fn blueprint_id(&self) -> BlueprintId {
58        ScryptoVmV1Api::object_get_blueprint_id(self.handle().as_node_id())
59    }
60}