22#include "eEVM/processor.h"
24#include "glog/logging.h"
30 const auto pre_size = code.size();
31 code.resize(pre_size + 32u);
32 eevm::to_big_endian(arg, code.data() + pre_size);
40 gs_ = std::make_unique<eevm::SimpleGlobalState>();
43std::string ContractManager::GetFuncAddress(
const Address& contract_address,
44 const std::string& func_name) {
45 return func_address_[contract_address][func_name];
48void ContractManager::SetFuncAddress(
const Address& contract_address,
49 const FuncInfo& func) {
50 func_address_[contract_address][func.func_name()] = func.hash();
54 const DeployInfo& deploy_info) {
55 const auto contract_address =
58 auto contract_constructor = eevm::to_bytes(deploy_info.contract_bin());
59 for (
const std::string& param : deploy_info.init_param()) {
64 auto contract = gs_->create(contract_address, 0u, contract_constructor);
66 auto result = Execute(owner_address, contract_address, {});
69 contract.acc.set_code(std::move(*result));
71 for (
const auto& info : deploy_info.func_info()) {
72 SetFuncAddress(contract_address, info);
74 return contract.acc.get_address();
76 gs_->remove(contract_address);
80 LOG(ERROR) <<
"Deploy throw expection";
87 if (!gs_->exists(address)) {
88 return absl::InvalidArgumentError(
"Contract not exist.");
91 return gs_->get(address);
96 const Params& func_param) {
97 std::string func_addr =
98 GetFuncAddress(contract_address, func_param.func_name());
99 if (func_addr.empty()) {
100 LOG(ERROR) <<
"no fouction:" << func_param.func_name();
101 return absl::InvalidArgumentError(
"Func not exist.");
104 std::vector<uint8_t> inputs = eevm::to_bytes(func_addr);
105 for (
const std::string& param : func_param.param()) {
109 auto result = Execute(caller_address, contract_address, inputs);
112 return eevm::to_hex_string(*result);
114 return result.status();
117absl::StatusOr<std::vector<uint8_t>> ContractManager::Execute(
119 const std::vector<uint8_t>& input) {
121 eevm::NullLogHandler ignore;
122 eevm::Transaction tx(caller_address, ignore);
126 eevm::Processor p(*gs_);
130 const auto exec_result =
131 p.run(tx, caller_address, gs_->get(contract_address), input, 0u, &tr);
133 if (exec_result.er != eevm::ExitReason::returned) {
135 if (exec_result.er == eevm::ExitReason::threw) {
136 return absl::InternalError(
137 fmt::format(
"Execution error: {}", exec_result.exmsg));
139 return absl::InternalError(
"Deployment did not return");
141 return exec_result.output;
143 return absl::InternalError(fmt::format(
"Execution error:"));
static Address CreateContractAddress(const Address &owner)
Address DeployContract(const Address &owner_address, const DeployInfo &deploy_info)
absl::StatusOr< eevm::AccountState > GetContract(const Address &address)
absl::StatusOr< std::string > ExecContract(const Address &caller_address, const Address &contract_address, const Params &func_param)
void AppendArgToInput(std::vector< uint8_t > &code, const uint256_t &arg)