From 0749043d09c7e4f5a0897adff835188a59678620 Mon Sep 17 00:00:00 2001 From: TimothyBanks Date: Tue, 11 Aug 2026 12:03:39 -0400 Subject: [PATCH] feat: Clean up a few errant host function signatures --- crates/xrpl-wasm-vm/src/abi.rs | 11 ++++ crates/xrpl-wasm-vm/src/register.rs | 82 ++++++++++++++++++------ crates/xrpl-wasm-vm/tests/budgets.rs | 40 ++++++------ crates/xrpl-wasm-vm/tests/host_calls.rs | 30 ++++++--- crates/xrpl-wasm-vm/tests/support/mod.rs | 20 +++--- 5 files changed, 122 insertions(+), 61 deletions(-) diff --git a/crates/xrpl-wasm-vm/src/abi.rs b/crates/xrpl-wasm-vm/src/abi.rs index 3dba7f9785..9cb2a88788 100644 --- a/crates/xrpl-wasm-vm/src/abi.rs +++ b/crates/xrpl-wasm-vm/src/abi.rs @@ -78,6 +78,17 @@ pub(crate) fn read_borrowed<'a>( input.read(mem.data(caller)) } +/// Decode a guest `u32` argument — a keylet's sequence number or document id — from +/// its four little-endian bytes, carried on to the host as its `i32` bit pattern. +/// +/// The ABI transports these as a 4-byte region rather than a wasm scalar (the guest +/// SDK passes `seq.to_le_bytes()`), so the region must be exactly four bytes; +/// `InvalidParams` otherwise, matching the C-ABI wrapper's `getDataUInt32`. +pub(crate) fn read_u32_arg(bytes: &[u8]) -> HostResult { + let arr: [u8; 4] = bytes.try_into().map_err(|_| HostError::InvalidParams)?; + Ok(i32::from_le_bytes(arr)) +} + /// Service a call whose answer is bytes, written straight into the guest's output /// region. /// diff --git a/crates/xrpl-wasm-vm/src/register.rs b/crates/xrpl-wasm-vm/src/register.rs index c6397204be..34e9aa1212 100644 --- a/crates/xrpl-wasm-vm/src/register.rs +++ b/crates/xrpl-wasm-vm/src/register.rs @@ -1,4 +1,6 @@ -use crate::abi::{charged, read_borrowed, write_buffered, write_into, write_mant_exp}; +use crate::abi::{ + charged, read_borrowed, read_u32_arg, write_buffered, write_into, write_mant_exp, +}; use crate::region::Region; use crate::vm::VmState; use wasmi::{Caller, Linker}; @@ -369,15 +371,19 @@ pub(crate) fn register_host_functions( |mut caller: Caller<'_, VmState<'_>>, acc_ptr: i32, acc_len: i32, - seq: i32, + seq_ptr: i32, + seq_len: i32, out_ptr: i32, out_len: i32| -> Result { charged(&mut caller, HostFunctionSpec::CheckKeylet, |c| { let out = Region::new(out_ptr, out_len); let account = Region::new(acc_ptr, acc_len); + let seq = Region::new(seq_ptr, seq_len); write_buffered(c, out, |host, data, buf| { - host.check_keylet(account.read(data)?, seq, buf) + let account = account.read(data)?; + let seq = read_u32_arg(seq.read(data)?)?; + host.check_keylet(account, seq, buf) }) }) }, @@ -481,15 +487,19 @@ pub(crate) fn register_host_functions( |mut caller: Caller<'_, VmState<'_>>, acc_ptr: i32, acc_len: i32, - seq: i32, + seq_ptr: i32, + seq_len: i32, out_ptr: i32, out_len: i32| -> Result { charged(&mut caller, HostFunctionSpec::EscrowKeylet, |c| { let out = Region::new(out_ptr, out_len); let account = Region::new(acc_ptr, acc_len); + let seq = Region::new(seq_ptr, seq_len); write_buffered(c, out, |host, data, buf| { - host.escrow_keylet(account.read(data)?, seq, buf) + let account = account.read(data)?; + let seq = read_u32_arg(seq.read(data)?)?; + host.escrow_keylet(account, seq, buf) }) }) }, @@ -529,15 +539,19 @@ pub(crate) fn register_host_functions( |mut caller: Caller<'_, VmState<'_>>, acc_ptr: i32, acc_len: i32, - seq: i32, + seq_ptr: i32, + seq_len: i32, out_ptr: i32, out_len: i32| -> Result { charged(&mut caller, HostFunctionSpec::MptokenIssuanceKeylet, |c| { let out = Region::new(out_ptr, out_len); let issuer = Region::new(acc_ptr, acc_len); + let seq = Region::new(seq_ptr, seq_len); write_buffered(c, out, |host, data, buf| { - host.mptoken_issuance_keylet(issuer.read(data)?, seq, buf) + let issuer = issuer.read(data)?; + let seq = read_u32_arg(seq.read(data)?)?; + host.mptoken_issuance_keylet(issuer, seq, buf) }) }) }, @@ -569,15 +583,19 @@ pub(crate) fn register_host_functions( |mut caller: Caller<'_, VmState<'_>>, acc_ptr: i32, acc_len: i32, - seq: i32, + seq_ptr: i32, + seq_len: i32, out_ptr: i32, out_len: i32| -> Result { charged(&mut caller, HostFunctionSpec::NftokenOfferKeylet, |c| { let out = Region::new(out_ptr, out_len); let account = Region::new(acc_ptr, acc_len); + let seq = Region::new(seq_ptr, seq_len); write_buffered(c, out, |host, data, buf| { - host.nftoken_offer_keylet(account.read(data)?, seq, buf) + let account = account.read(data)?; + let seq = read_u32_arg(seq.read(data)?)?; + host.nftoken_offer_keylet(account, seq, buf) }) }) }, @@ -588,15 +606,19 @@ pub(crate) fn register_host_functions( |mut caller: Caller<'_, VmState<'_>>, acc_ptr: i32, acc_len: i32, - seq: i32, + seq_ptr: i32, + seq_len: i32, out_ptr: i32, out_len: i32| -> Result { charged(&mut caller, HostFunctionSpec::OfferKeylet, |c| { let out = Region::new(out_ptr, out_len); let account = Region::new(acc_ptr, acc_len); + let seq = Region::new(seq_ptr, seq_len); write_buffered(c, out, |host, data, buf| { - host.offer_keylet(account.read(data)?, seq, buf) + let account = account.read(data)?; + let seq = read_u32_arg(seq.read(data)?)?; + host.offer_keylet(account, seq, buf) }) }) }, @@ -607,15 +629,19 @@ pub(crate) fn register_host_functions( |mut caller: Caller<'_, VmState<'_>>, acc_ptr: i32, acc_len: i32, - doc_id: i32, + doc_ptr: i32, + doc_len: i32, out_ptr: i32, out_len: i32| -> Result { charged(&mut caller, HostFunctionSpec::OracleKeylet, |c| { let out = Region::new(out_ptr, out_len); let account = Region::new(acc_ptr, acc_len); + let doc_id = Region::new(doc_ptr, doc_len); write_buffered(c, out, |host, data, buf| { - host.oracle_keylet(account.read(data)?, doc_id, buf) + let account = account.read(data)?; + let doc_id = read_u32_arg(doc_id.read(data)?)?; + host.oracle_keylet(account, doc_id, buf) }) }) }, @@ -628,7 +654,8 @@ pub(crate) fn register_host_functions( acc_len: i32, dst_ptr: i32, dst_len: i32, - seq: i32, + seq_ptr: i32, + seq_len: i32, out_ptr: i32, out_len: i32| -> Result { @@ -636,11 +663,12 @@ pub(crate) fn register_host_functions( let out = Region::new(out_ptr, out_len); let account = Region::new(acc_ptr, acc_len); let destination = Region::new(dst_ptr, dst_len); + let seq = Region::new(seq_ptr, seq_len); write_buffered(c, out, |host, data, buf| { host.paychannel_keylet( account.read(data)?, destination.read(data)?, - seq, + read_u32_arg(seq.read(data)?)?, buf, ) }) @@ -653,7 +681,8 @@ pub(crate) fn register_host_functions( |mut caller: Caller<'_, VmState<'_>>, acc_ptr: i32, acc_len: i32, - seq: i32, + seq_ptr: i32, + seq_len: i32, out_ptr: i32, out_len: i32| -> Result { @@ -663,8 +692,11 @@ pub(crate) fn register_host_functions( |c| { let out = Region::new(out_ptr, out_len); let account = Region::new(acc_ptr, acc_len); + let seq = Region::new(seq_ptr, seq_len); write_buffered(c, out, |host, data, buf| { - host.permissioned_domain_keylet(account.read(data)?, seq, buf) + let account = account.read(data)?; + let seq = read_u32_arg(seq.read(data)?)?; + host.permissioned_domain_keylet(account, seq, buf) }) }, ) @@ -694,15 +726,19 @@ pub(crate) fn register_host_functions( |mut caller: Caller<'_, VmState<'_>>, acc_ptr: i32, acc_len: i32, - seq: i32, + seq_ptr: i32, + seq_len: i32, out_ptr: i32, out_len: i32| -> Result { charged(&mut caller, HostFunctionSpec::TicketKeylet, |c| { let out = Region::new(out_ptr, out_len); let account = Region::new(acc_ptr, acc_len); + let seq = Region::new(seq_ptr, seq_len); write_buffered(c, out, |host, data, buf| { - host.ticket_keylet(account.read(data)?, seq, buf) + let account = account.read(data)?; + let seq = read_u32_arg(seq.read(data)?)?; + host.ticket_keylet(account, seq, buf) }) }) }, @@ -713,15 +749,19 @@ pub(crate) fn register_host_functions( |mut caller: Caller<'_, VmState<'_>>, acc_ptr: i32, acc_len: i32, - seq: i32, + seq_ptr: i32, + seq_len: i32, out_ptr: i32, out_len: i32| -> Result { charged(&mut caller, HostFunctionSpec::VaultKeylet, |c| { let out = Region::new(out_ptr, out_len); let account = Region::new(acc_ptr, acc_len); + let seq = Region::new(seq_ptr, seq_len); write_buffered(c, out, |host, data, buf| { - host.vault_keylet(account.read(data)?, seq, buf) + let account = account.read(data)?; + let seq = read_u32_arg(seq.read(data)?)?; + host.vault_keylet(account, seq, buf) }) }) }, diff --git a/crates/xrpl-wasm-vm/tests/budgets.rs b/crates/xrpl-wasm-vm/tests/budgets.rs index d20eca02a1..baa5e51d41 100644 --- a/crates/xrpl-wasm-vm/tests/budgets.rs +++ b/crates/xrpl-wasm-vm/tests/budgets.rs @@ -156,8 +156,8 @@ fn call_for(op: HostFunctionSpec) -> Call { ), HostFunctionSpec::CheckKeylet => ( import::CHECK_ID, - "(call $check_id (i32.const 0) (i32.const 20) (i32.const 5) (i32.const 32) (i32.const 32))", - 5, + "(call $check_id (i32.const 0) (i32.const 20) (i32.const 0) (i32.const 4) (i32.const 32) (i32.const 32))", + 6, ), HostFunctionSpec::CredentialKeylet => ( import::CREDENTIAL_ID, @@ -181,8 +181,8 @@ fn call_for(op: HostFunctionSpec) -> Call { ), HostFunctionSpec::EscrowKeylet => ( import::ESCROW_ID, - "(call $escrow_id (i32.const 0) (i32.const 20) (i32.const 5) (i32.const 32) (i32.const 32))", - 5, + "(call $escrow_id (i32.const 0) (i32.const 20) (i32.const 0) (i32.const 4) (i32.const 32) (i32.const 32))", + 6, ), HostFunctionSpec::TrustLineKeylet => ( import::TRUSTLINE_ID, @@ -191,8 +191,8 @@ fn call_for(op: HostFunctionSpec) -> Call { ), HostFunctionSpec::MptokenIssuanceKeylet => ( import::MPT_ISSUANCE_ID, - "(call $mpt_issuance_id (i32.const 0) (i32.const 20) (i32.const 5) (i32.const 32) (i32.const 32))", - 5, + "(call $mpt_issuance_id (i32.const 0) (i32.const 20) (i32.const 0) (i32.const 4) (i32.const 32) (i32.const 32))", + 6, ), HostFunctionSpec::MptokenKeylet => ( import::MPTOKEN_ID, @@ -201,28 +201,28 @@ fn call_for(op: HostFunctionSpec) -> Call { ), HostFunctionSpec::NftokenOfferKeylet => ( import::NFT_OFFER_ID, - "(call $nft_offer_id (i32.const 0) (i32.const 20) (i32.const 5) (i32.const 32) (i32.const 32))", - 5, + "(call $nft_offer_id (i32.const 0) (i32.const 20) (i32.const 0) (i32.const 4) (i32.const 32) (i32.const 32))", + 6, ), HostFunctionSpec::OfferKeylet => ( import::OFFER_ID, - "(call $offer_id (i32.const 0) (i32.const 20) (i32.const 5) (i32.const 32) (i32.const 32))", - 5, + "(call $offer_id (i32.const 0) (i32.const 20) (i32.const 0) (i32.const 4) (i32.const 32) (i32.const 32))", + 6, ), HostFunctionSpec::OracleKeylet => ( import::ORACLE_ID, - "(call $oracle_id (i32.const 0) (i32.const 20) (i32.const 5) (i32.const 32) (i32.const 32))", - 5, + "(call $oracle_id (i32.const 0) (i32.const 20) (i32.const 0) (i32.const 4) (i32.const 32) (i32.const 32))", + 6, ), HostFunctionSpec::PaychannelKeylet => ( import::PAYCHAN_ID, - "(call $paychan_id (i32.const 0) (i32.const 20) (i32.const 20) (i32.const 20) (i32.const 5) (i32.const 40) (i32.const 20))", - 7, + "(call $paychan_id (i32.const 0) (i32.const 20) (i32.const 20) (i32.const 20) (i32.const 0) (i32.const 4) (i32.const 40) (i32.const 20))", + 8, ), HostFunctionSpec::PermissionedDomainKeylet => ( import::PERMISSIONED_DOMAIN_ID, - "(call $permissioned_domain_id (i32.const 0) (i32.const 20) (i32.const 5) (i32.const 32) (i32.const 32))", - 5, + "(call $permissioned_domain_id (i32.const 0) (i32.const 20) (i32.const 0) (i32.const 4) (i32.const 32) (i32.const 32))", + 6, ), HostFunctionSpec::SignerListKeylet => ( import::SIGNERS_ID, @@ -231,13 +231,13 @@ fn call_for(op: HostFunctionSpec) -> Call { ), HostFunctionSpec::TicketKeylet => ( import::TICKET_ID, - "(call $ticket_id (i32.const 0) (i32.const 20) (i32.const 5) (i32.const 32) (i32.const 32))", - 5, + "(call $ticket_id (i32.const 0) (i32.const 20) (i32.const 0) (i32.const 4) (i32.const 32) (i32.const 32))", + 6, ), HostFunctionSpec::VaultKeylet => ( import::VAULT_ID, - "(call $vault_id (i32.const 0) (i32.const 20) (i32.const 5) (i32.const 32) (i32.const 32))", - 5, + "(call $vault_id (i32.const 0) (i32.const 20) (i32.const 0) (i32.const 4) (i32.const 32) (i32.const 32))", + 6, ), HostFunctionSpec::Sha512Half => ( import::SHA512_HALF, diff --git a/crates/xrpl-wasm-vm/tests/host_calls.rs b/crates/xrpl-wasm-vm/tests/host_calls.rs index 5f5be107b8..eb84734d53 100644 --- a/crates/xrpl-wasm-vm/tests/host_calls.rs +++ b/crates/xrpl-wasm-vm/tests/host_calls.rs @@ -425,7 +425,8 @@ fn check_id_reads_the_account_and_seq_and_writes_the_keylet() { let wat = module( &[import::CHECK_ID, ONE_PAGE], - "(call $check_id (i32.const 0) (i32.const 20) (i32.const 5) (i32.const 64) (i32.const 64))", + "(i32.store (i32.const 20) (i32.const 5)) + (call $check_id (i32.const 0) (i32.const 20) (i32.const 20) (i32.const 4) (i32.const 64) (i32.const 64))", ); assert_eq!(status(&wat, &host), 32, "the 32-byte keylet length"); assert_eq!(*host.check_keylets_asked.borrow(), vec![(account, 5)]); @@ -536,7 +537,8 @@ fn escrow_id_reads_the_account_and_seq_and_writes_the_keylet() { let wat = module( &[import::ESCROW_ID, ONE_PAGE], - "(call $escrow_id (i32.const 0) (i32.const 20) (i32.const 5) (i32.const 64) (i32.const 64))", + "(i32.store (i32.const 20) (i32.const 5)) + (call $escrow_id (i32.const 0) (i32.const 20) (i32.const 20) (i32.const 4) (i32.const 64) (i32.const 64))", ); assert_eq!(status(&wat, &host), 32, "the 32-byte keylet length"); assert_eq!(*host.escrow_keylets_asked.borrow(), vec![(account, 5)]); @@ -583,7 +585,8 @@ fn mpt_issuance_id_reads_the_issuer_and_seq() { let wat = module( &[import::MPT_ISSUANCE_ID, ONE_PAGE], - "(call $mpt_issuance_id (i32.const 0) (i32.const 20) (i32.const 5) (i32.const 64) (i32.const 64))", + "(i32.store (i32.const 20) (i32.const 5)) + (call $mpt_issuance_id (i32.const 0) (i32.const 20) (i32.const 20) (i32.const 4) (i32.const 64) (i32.const 64))", ); assert_eq!(status(&wat, &host), 32, "the 32-byte keylet length"); assert_eq!(*host.mpt_issuance_keylets_asked.borrow(), vec![(issuer, 5)]); @@ -621,7 +624,8 @@ fn nft_offer_id_reads_the_account_and_seq() { let wat = module( &[import::NFT_OFFER_ID, ONE_PAGE], - "(call $nft_offer_id (i32.const 0) (i32.const 20) (i32.const 5) (i32.const 64) (i32.const 64))", + "(i32.store (i32.const 20) (i32.const 5)) + (call $nft_offer_id (i32.const 0) (i32.const 20) (i32.const 20) (i32.const 4) (i32.const 64) (i32.const 64))", ); assert_eq!(status(&wat, &host), 32, "the 32-byte keylet length"); assert_eq!(*host.nft_offer_keylets_asked.borrow(), vec![(account, 5)]); @@ -637,7 +641,8 @@ fn offer_id_reads_the_account_and_seq() { let wat = module( &[import::OFFER_ID, ONE_PAGE], - "(call $offer_id (i32.const 0) (i32.const 20) (i32.const 5) (i32.const 64) (i32.const 64))", + "(i32.store (i32.const 20) (i32.const 5)) + (call $offer_id (i32.const 0) (i32.const 20) (i32.const 20) (i32.const 4) (i32.const 64) (i32.const 64))", ); assert_eq!(status(&wat, &host), 32, "the 32-byte keylet length"); assert_eq!(*host.offer_keylets_asked.borrow(), vec![(account, 5)]); @@ -653,7 +658,8 @@ fn oracle_id_reads_the_account_and_doc_id() { let wat = module( &[import::ORACLE_ID, ONE_PAGE], - "(call $oracle_id (i32.const 0) (i32.const 20) (i32.const 5) (i32.const 64) (i32.const 64))", + "(i32.store (i32.const 20) (i32.const 5)) + (call $oracle_id (i32.const 0) (i32.const 20) (i32.const 20) (i32.const 4) (i32.const 64) (i32.const 64))", ); assert_eq!(status(&wat, &host), 32, "the 32-byte keylet length"); assert_eq!(*host.oracle_keylets_asked.borrow(), vec![(account, 5)]); @@ -674,7 +680,8 @@ fn paychan_id_reads_both_accounts_and_the_seq() { let wat = module( &[import::PAYCHAN_ID, ONE_PAGE], - "(call $paychan_id (i32.const 0) (i32.const 20) (i32.const 32) (i32.const 20) (i32.const 5) (i32.const 64) (i32.const 64))", + "(i32.store (i32.const 24) (i32.const 5)) + (call $paychan_id (i32.const 0) (i32.const 20) (i32.const 32) (i32.const 20) (i32.const 24) (i32.const 4) (i32.const 64) (i32.const 64))", ); assert_eq!(status(&wat, &host), 32, "the 32-byte keylet length"); assert_eq!( @@ -696,7 +703,8 @@ fn permissioned_domain_id_reads_the_account_and_seq() { let wat = module( &[import::PERMISSIONED_DOMAIN_ID, ONE_PAGE], - "(call $permissioned_domain_id (i32.const 0) (i32.const 20) (i32.const 5) (i32.const 64) (i32.const 64))", + "(i32.store (i32.const 20) (i32.const 5)) + (call $permissioned_domain_id (i32.const 0) (i32.const 20) (i32.const 20) (i32.const 4) (i32.const 64) (i32.const 64))", ); assert_eq!(status(&wat, &host), 32, "the 32-byte keylet length"); assert_eq!(*host.domain_keylets_asked.borrow(), vec![(account, 5)]); @@ -727,7 +735,8 @@ fn ticket_id_reads_the_account_and_seq() { let wat = module( &[import::TICKET_ID, ONE_PAGE], - "(call $ticket_id (i32.const 0) (i32.const 20) (i32.const 5) (i32.const 64) (i32.const 64))", + "(i32.store (i32.const 20) (i32.const 5)) + (call $ticket_id (i32.const 0) (i32.const 20) (i32.const 20) (i32.const 4) (i32.const 64) (i32.const 64))", ); assert_eq!(status(&wat, &host), 32, "the 32-byte keylet length"); assert_eq!(*host.ticket_keylets_asked.borrow(), vec![(account, 5)]); @@ -742,7 +751,8 @@ fn vault_id_reads_the_account_and_seq() { let wat = module( &[import::VAULT_ID, ONE_PAGE], - "(call $vault_id (i32.const 0) (i32.const 20) (i32.const 5) (i32.const 64) (i32.const 64))", + "(i32.store (i32.const 20) (i32.const 5)) + (call $vault_id (i32.const 0) (i32.const 20) (i32.const 20) (i32.const 4) (i32.const 64) (i32.const 64))", ); assert_eq!(status(&wat, &host), 32, "the 32-byte keylet length"); assert_eq!(*host.vault_keylets_asked.borrow(), vec![(account, 5)]); diff --git a/crates/xrpl-wasm-vm/tests/support/mod.rs b/crates/xrpl-wasm-vm/tests/support/mod.rs index 350f3a1f9b..56300c2a2e 100644 --- a/crates/xrpl-wasm-vm/tests/support/mod.rs +++ b/crates/xrpl-wasm-vm/tests/support/mod.rs @@ -1406,24 +1406,24 @@ pub mod import { pub const CHECK_SIG: &str = r#"(import "host_lib" "check_sig" (func $check_sig (param i32 i32 i32 i32 i32 i32) (result i32)))"#; pub const ACCOUNTROOT_ID: &str = r#"(import "host_lib" "accountroot_id" (func $accountroot_id (param i32 i32 i32 i32) (result i32)))"#; pub const AMM_ID: &str = r#"(import "host_lib" "amm_id" (func $amm_id (param i32 i32 i32 i32 i32 i32) (result i32)))"#; - pub const CHECK_ID: &str = r#"(import "host_lib" "check_id" (func $check_id (param i32 i32 i32 i32 i32) (result i32)))"#; + pub const CHECK_ID: &str = r#"(import "host_lib" "check_id" (func $check_id (param i32 i32 i32 i32 i32 i32) (result i32)))"#; pub const CREDENTIAL_ID: &str = r#"(import "host_lib" "credential_id" (func $credential_id (param i32 i32 i32 i32 i32 i32 i32 i32) (result i32)))"#; pub const DELEGATE_ID: &str = r#"(import "host_lib" "delegate_id" (func $delegate_id (param i32 i32 i32 i32 i32 i32) (result i32)))"#; pub const DEPOSIT_PREAUTH_ID: &str = r#"(import "host_lib" "deposit_preauth_id" (func $deposit_preauth_id (param i32 i32 i32 i32 i32 i32) (result i32)))"#; pub const DID_ID: &str = r#"(import "host_lib" "did_id" (func $did_id (param i32 i32 i32 i32) (result i32)))"#; - pub const ESCROW_ID: &str = r#"(import "host_lib" "escrow_id" (func $escrow_id (param i32 i32 i32 i32 i32) (result i32)))"#; + pub const ESCROW_ID: &str = r#"(import "host_lib" "escrow_id" (func $escrow_id (param i32 i32 i32 i32 i32 i32) (result i32)))"#; pub const TRUSTLINE_ID: &str = r#"(import "host_lib" "trustline_id" (func $trustline_id (param i32 i32 i32 i32 i32 i32 i32 i32) (result i32)))"#; - pub const MPT_ISSUANCE_ID: &str = r#"(import "host_lib" "mpt_issuance_id" (func $mpt_issuance_id (param i32 i32 i32 i32 i32) (result i32)))"#; + pub const MPT_ISSUANCE_ID: &str = r#"(import "host_lib" "mpt_issuance_id" (func $mpt_issuance_id (param i32 i32 i32 i32 i32 i32) (result i32)))"#; pub const MPTOKEN_ID: &str = r#"(import "host_lib" "mptoken_id" (func $mptoken_id (param i32 i32 i32 i32 i32 i32) (result i32)))"#; - pub const NFT_OFFER_ID: &str = r#"(import "host_lib" "nft_offer_id" (func $nft_offer_id (param i32 i32 i32 i32 i32) (result i32)))"#; - pub const OFFER_ID: &str = r#"(import "host_lib" "offer_id" (func $offer_id (param i32 i32 i32 i32 i32) (result i32)))"#; - pub const ORACLE_ID: &str = r#"(import "host_lib" "oracle_id" (func $oracle_id (param i32 i32 i32 i32 i32) (result i32)))"#; - pub const PAYCHAN_ID: &str = r#"(import "host_lib" "paychan_id" (func $paychan_id (param i32 i32 i32 i32 i32 i32 i32) (result i32)))"#; - pub const PERMISSIONED_DOMAIN_ID: &str = r#"(import "host_lib" "permissioned_domain_id" (func $permissioned_domain_id (param i32 i32 i32 i32 i32) (result i32)))"#; + pub const NFT_OFFER_ID: &str = r#"(import "host_lib" "nft_offer_id" (func $nft_offer_id (param i32 i32 i32 i32 i32 i32) (result i32)))"#; + pub const OFFER_ID: &str = r#"(import "host_lib" "offer_id" (func $offer_id (param i32 i32 i32 i32 i32 i32) (result i32)))"#; + pub const ORACLE_ID: &str = r#"(import "host_lib" "oracle_id" (func $oracle_id (param i32 i32 i32 i32 i32 i32) (result i32)))"#; + pub const PAYCHAN_ID: &str = r#"(import "host_lib" "paychan_id" (func $paychan_id (param i32 i32 i32 i32 i32 i32 i32 i32) (result i32)))"#; + pub const PERMISSIONED_DOMAIN_ID: &str = r#"(import "host_lib" "permissioned_domain_id" (func $permissioned_domain_id (param i32 i32 i32 i32 i32 i32) (result i32)))"#; pub const SIGNERS_ID: &str = r#"(import "host_lib" "signers_id" (func $signers_id (param i32 i32 i32 i32) (result i32)))"#; - pub const TICKET_ID: &str = r#"(import "host_lib" "ticket_id" (func $ticket_id (param i32 i32 i32 i32 i32) (result i32)))"#; - pub const VAULT_ID: &str = r#"(import "host_lib" "vault_id" (func $vault_id (param i32 i32 i32 i32 i32) (result i32)))"#; + pub const TICKET_ID: &str = r#"(import "host_lib" "ticket_id" (func $ticket_id (param i32 i32 i32 i32 i32 i32) (result i32)))"#; + pub const VAULT_ID: &str = r#"(import "host_lib" "vault_id" (func $vault_id (param i32 i32 i32 i32 i32 i32) (result i32)))"#; pub const SHA512_HALF: &str = r#"(import "host_lib" "sha512_half" (func $sha512_half (param i32 i32 i32 i32) (result i32)))"#; pub const TRACE: &str = r#"(import "host_lib" "trace" (func $trace (param i32 i32 i32 i32 i32) (result i32)))"#;