scrypto/component/
object.rs1use 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}