ink_codegen/generator/
solidity.rs

1use ir::{
2    Callable,
3    CallableWithSelector,
4    Message,
5};
6use proc_macro2::{
7    Ident,
8    TokenStream as TokenStream2,
9};
10use quote::{
11    format_ident,
12    quote,
13};
14
15/// Returns Solidity ABI compatible selector of an ink! message.
16pub(crate) fn solidity_selector(message: &CallableWithSelector<Message>) -> TokenStream2 {
17    let call_type_ident = solidity_call_type_ident(message);
18    quote!(
19        {
20            <__ink_sol_interop__::#call_type_ident>::SELECTOR
21        }
22    )
23}
24
25/// Returns a `u32` representation of the Solidity ABI compatible selector of an ink!
26/// message.
27pub(crate) fn solidity_selector_id(
28    message: &CallableWithSelector<Message>,
29) -> TokenStream2 {
30    let call_type_ident = solidity_call_type_ident(message);
31    quote!(
32        {
33            <__ink_sol_interop__::#call_type_ident>::SELECTOR_ID
34        }
35    )
36}
37
38/// Returns the Solidity call info type identifier for an ink! message.
39pub(crate) fn solidity_call_type_ident(message: &CallableWithSelector<Message>) -> Ident {
40    let ident = message.ident();
41    let id = message.composed_selector().into_be_u32();
42    format_ident!("{ident}{id}Call")
43}