1. 功能
對于許多用例,需要從合同代碼向另一個合同發送新操作,這是合同之間能夠積極溝通的唯一途徑,它為特定智能合約代碼的特定操作創建“操作模板”,然后可使用該模板來呼叫此操作,
第一個引數是動作名稱,第二個引數是動作的方法_declaration_,
2. action_wrapper 類的定義
template <eossys::name::raw Name, auto Action>
struct action_wrapper {
template <typename Code>
constexpr action_wrapper(Code&& code, std::vector<eossys::permission_level>&& perms)
: code_name(std::forward<Code>(code)), permissions(std::move(perms)) {}
template <typename Code>
constexpr action_wrapper(Code&& code, const std::vector<eossys::permission_level>& perms)
: code_name(std::forward<Code>(code)), permissions(perms) {}
template <typename Code>
constexpr action_wrapper(Code&& code, eossys::permission_level&& perm)
: code_name(std::forward<Code>(code)), permissions({1, std::move(perm)}) {}
template <typename Code>
constexpr action_wrapper(Code&& code, const eossys::permission_level& perm)
: code_name(std::forward<Code>(code)), permissions({1, perm}) {}
template <typename Code>
constexpr action_wrapper(Code&& code)
: code_name(std::forward<Code>(code)) {}
static constexpr eossys::name action_name = eossys::name(Name);
eossys::text_name code_name;
std::vector<eossys::permission_level> permissions;
static constexpr auto get_mem_ptr() {
return Action;
}
template <typename... Args>
action to_action(Args&&... args)const {
static_assert(detail::type_check<Action, Args...>());
return action(permissions, code_name, action_name, detail::deduced<Action>{std::forward<Args>(args)...});
}
template <typename... Args>
void send(Args&&... args)const {
to_action(std::forward<Args>(args)...).send();
}
template <typename... Args>
void send_context_free(Args&&... args)const {
to_action(std::forward<Args>(args)...).send_context_free();
}
};
2.1 呼叫示例
#include <eosio_token/include/eosio_token.hpp>
// can specify the contract to send the action to as first argument
token::transfer_action payout("eosio.token"_n, {get_self(), "active"_n});
// transfer arguments are now passed as postional arguments
payout.send(get_self(), to, quantity, memo);
token::transfer_action payout("eosio.token"_n, {get_self(), "active"_n});
transaction t{};
t.actions.emplace_back(payout.to_action(get_self(), to, quantity, memo));
t.delay_sec = 10;
t.send(0 /* sender id */, get_self(), false);
參考:
- EOS系列 - WASM智能合約 - 內置方法
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/310635.html
標籤:區塊鏈
下一篇:區塊鏈擴展——文獻筆記(一)
