use crate::structs::*;
use crate::transaction::{
Transaction,
};
use crate::action::{
PermissionLevel,
};
use crate::privileged::{
BlockchainParameters,
};
use crate::name::{
Name,
};
use crate::serializer::{
Packer,
Encoder
};
use crate::{
vec::Vec,
};
use core::slice;
use chaintester::{
get_vm_api_client,
interfaces::{
TApplySyncClient,
}
};
pub fn memcpy( dst: *mut u8, src: *const u8, length: usize) -> *mut u8 {
let mut _dst = unsafe {
slice::from_raw_parts_mut(dst, length)
};
let _src = unsafe {
slice::from_raw_parts(src, length)
};
_dst.copy_from_slice(_src);
dst
}
pub fn eosio_memcpy( dst: *mut u8, src: *const u8, length: usize) {
memcpy(dst, src, length);
}
pub fn slice_copy( dst: &mut [u8], src: &[u8]) {
check(dst.len() == src.len(), "copy_slice: length not the same!");
eosio_memcpy(dst.as_mut_ptr(), src.as_ptr(), dst.len());
}
pub fn get_active_producers() -> Vec<Name> {
let ret = get_vm_api_client().get_active_producers();
let data = ret.unwrap();
let mut ret: Vec<Name> = vec![Name::default();data.len()/8];
let mut i = 0usize;
for v in &mut ret {
v.unpack(data[i..].into());
i += 8;
}
ret
}
pub fn check_transaction_authorization(
trx: &Transaction,
perms: &Vec<PermissionLevel>,
pubkeys: &Vec<PublicKey>
) -> i32 {
let ret = get_vm_api_client().check_transaction_authorization(Encoder::pack(trx), Encoder::pack(pubkeys), Encoder::pack(perms));
ret.unwrap()
}
pub fn check_permission_authorization(
account: Name,
permission: Name,
perms: &Vec<PermissionLevel>,
pubkeys: &Vec<PublicKey>,
delay_us: u64
) -> i32 {
let perms_data = Encoder::pack(perms);
let pubkeys_data = Encoder::pack(pubkeys);
let ret = get_vm_api_client().check_permission_authorization(account.n.into(), permission.n.into(), pubkeys_data, perms_data, delay_us.into());
ret.unwrap()
}
pub fn get_permission_last_used(account: Name, permission: Name ) -> TimePoint {
let ret = get_vm_api_client().get_permission_last_used(account.n.into(), permission.n.into());
let elapsed = ret.unwrap();
return TimePoint{elapsed: elapsed as u64};
}
pub fn get_account_creation_time(account: Name) -> TimePoint {
let ret = get_vm_api_client().get_account_creation_time(account.n.into());
let elapsed = ret.unwrap();
return TimePoint{elapsed: elapsed as u64};
}
pub fn read_action_data() -> Vec<u8> {
let ret = get_vm_api_client().read_action_data();
ret.unwrap()
}
pub fn action_data_size() -> usize {
let ret = get_vm_api_client().action_data_size();
ret.unwrap() as usize
}
pub fn require_recipient(name: Name) {
let ret = get_vm_api_client().require_recipient(name.n.into());
ret.unwrap()
}
pub fn require_auth(name: Name) {
let ret = get_vm_api_client().require_auth(name.n.into());
ret.unwrap()
}
pub fn has_auth(name: Name) -> bool {
let ret = get_vm_api_client().has_auth(name.n.into());
ret.unwrap()
}
pub fn require_auth2(name: Name, permission: Name) {
let ret = get_vm_api_client().require_auth2(name.n.into(), permission.n.into());
ret.unwrap()
}
pub fn is_account(name: Name) -> bool {
let ret = get_vm_api_client().is_account(name.n.into());
ret.unwrap()
}
pub fn send_inline(_serialized_action: &[u8]) {
let ret = get_vm_api_client().send_inline(_serialized_action.to_vec());
ret.unwrap();
}
pub fn send_context_free_inline(_serialized_action: &[u8]) {
let ret = get_vm_api_client().send_context_free_inline(_serialized_action.to_vec());
ret.unwrap();
}
pub fn publication_time() -> TimePoint {
let ret = get_vm_api_client().publication_time();
let elapsed = ret.unwrap();
return TimePoint{elapsed: elapsed.into()};
}
pub fn current_receiver() -> Name {
let ret = get_vm_api_client().current_receiver();
let n = ret.unwrap();
return Name{n: n.into()};
}
pub fn eosio_assert(test: bool, msg: &str) {
let ret = get_vm_api_client().eosio_assert(test, msg.into());
ret.unwrap()
}
pub fn eosio_assert_message(test: u32, msg: *const u8, msg_len: u32) {
if test >= 1 {
return;
}
let dst = unsafe {
slice::from_raw_parts(msg, msg_len as usize)
};
if !get_vm_api_client().is_in_apply() {
panic!("{}", String::from_utf8(dst.to_vec()).unwrap());
}
let ret = get_vm_api_client().eosio_assert_message(false, dst.into());
ret.unwrap();
}
pub fn eosio_assert_code(test: u32, code: u64) {
let _test = match test {
0 => false,
_ => true,
};
let ret = get_vm_api_client().eosio_assert_code(_test, code.into());
ret.unwrap()
}
pub fn check(test: bool, msg: &str) {
if test {
return
}
eosio_assert_message(0, msg.as_ptr(), msg.len() as u32);
}
pub fn eosio_exit(code: i32) {
let ret = get_vm_api_client().eosio_exit(code);
ret.unwrap()
}
pub fn current_time() -> TimePoint {
let ret = get_vm_api_client().current_time();
let elapsed = ret.unwrap().into();
return TimePoint{elapsed: elapsed};
}
pub fn is_feature_activated(feature_digest: &Checksum256) -> bool {
let ret = get_vm_api_client().is_feature_activated(feature_digest.data.into());
ret.unwrap()
}
pub fn get_sender() -> Name {
let ret = get_vm_api_client().get_sender();
let n = ret.unwrap().into();
return Name{n: n};
}
pub fn get_resource_limits(account: Name) -> (i64, i64, i64) {
let _ret = get_vm_api_client().get_resource_limits(account.n.into());
let ret = _ret.unwrap();
(
ret.ram_bytes.unwrap(),
ret.net_weight.unwrap(),
ret.cpu_weight.unwrap(),
)
}
pub fn set_resource_limits(account: Name, ram_bytes: i64, net_weight: i64, cpu_weight: i64) {
let ret = get_vm_api_client().set_resource_limits(account.n.into(), ram_bytes, net_weight, cpu_weight);
ret.unwrap()
}
pub fn set_proposed_producers(producer_keys: &Vec<ProducerKey>) -> i64 {
let packed = Encoder::pack(producer_keys);
let ret = get_vm_api_client().set_proposed_producers(packed);
ret.unwrap()
}
pub fn set_proposed_producers_ex(producer_keys: &Vec<ProducerAuthority>) -> i64 {
let packed = Encoder::pack(producer_keys);
let ret = get_vm_api_client().set_proposed_producers_ex(1u64.into(), packed);
ret.unwrap()
}
pub fn is_privileged(account: Name) -> bool {
let ret = get_vm_api_client().is_privileged(account.n.into());
ret.unwrap()
}
pub fn set_privileged(account: Name, is_priv: bool) {
let ret = get_vm_api_client().set_privileged(account.n.into(), is_priv);
ret.unwrap();
}
pub fn set_blockchain_parameters(params: &BlockchainParameters) {
let data = Encoder::pack(params);
let ret = get_vm_api_client().set_blockchain_parameters_packed(data);
ret.unwrap();
}
pub fn get_blockchain_parameters() -> BlockchainParameters {
let mut params = BlockchainParameters::default();
let ret = get_vm_api_client().get_blockchain_parameters_packed();
let data = ret.unwrap();
params.unpack(&data);
return params;
}
pub fn preactivate_feature(_feature_digest: &Checksum256) {
}
pub fn send_deferred(sender_id: &Uint128, payer: Name, serialized_transaction: &[u8], replace_existing: u32) {
let _sender_id = unsafe {
slice::from_raw_parts(sender_id as *const Uint128 as *const u8, 16)
};
let ret = get_vm_api_client().send_deferred(_sender_id.into(), payer.n.into(), serialized_transaction.into(), replace_existing as i32);
ret.unwrap()
}
pub fn cancel_deferred(sender_id: &Uint128) -> i32 {
let _sender_id = unsafe {
slice::from_raw_parts(sender_id as *const Uint128 as *const u8, 16)
};
let ret = get_vm_api_client().cancel_deferred(_sender_id.into());
ret.unwrap()
}
pub fn read_transaction() -> Transaction {
let ret = get_vm_api_client().read_transaction();
let data = ret.unwrap();
let mut ret = Transaction::default();
ret.unpack(&data);
return ret;
}
pub fn transaction_size() -> usize {
let ret = get_vm_api_client().transaction_size();
ret.unwrap() as usize
}
pub fn tapos_block_num() -> u32 {
let ret = get_vm_api_client().tapos_block_num();
ret.unwrap() as u32
}
pub fn tapos_block_prefix() -> u32 {
let ret = get_vm_api_client().tapos_block_prefix();
ret.unwrap() as u32
}
pub fn expiration() -> u32 {
let ret = get_vm_api_client().expiration();
ret.unwrap() as u32
}
pub fn get_action(tp: u32, index: u32) -> Vec<u8> {
let ret = get_vm_api_client().get_action(tp as i32, index as i32);
ret.unwrap()
}
pub fn get_context_free_data(index: u32) -> Vec<u8> {
let ret = get_vm_api_client().get_context_free_data(index as i32);
ret.unwrap()
}