32 const std::string& client_request) {
36 if (!request.ParseFromString(client_request)) {
37 LOG(ERROR) <<
"parse data fail";
42 if (request.cmd() == Request::CREATE_ACCOUNT) {
43 absl::StatusOr<Account> account_or = CreateAccount();
44 if (account_or.ok()) {
45 response.mutable_account()->Swap(&(*account_or));
49 }
else if (request.cmd() == Request::DEPLOY) {
50 absl::StatusOr<Contract> contract_or = Deploy(request);
51 if (contract_or.ok()) {
52 response.mutable_contract()->Swap(&(*contract_or));
56 }
else if (request.cmd() == Request::EXECUTE) {
57 auto res_or = Execute(request);
59 response.set_res(*res_or);
65 response.set_ret(ret);
67 std::unique_ptr<std::string> resp_str = std::make_unique<std::string>();
68 if (!response.SerializeToString(resp_str.get())) {
75absl::StatusOr<Account> ContractTransactionManager::CreateAccount() {
79 account.set_address(address);
83absl::StatusOr<Contract> ContractTransactionManager::Deploy(
84 const Request& request) {
87 if (!address_manager_->Exist(caller_address)) {
88 LOG(ERROR) <<
"caller doesn't have an account";
89 return absl::InvalidArgumentError(
"Account not exist.");
93 contract_manager_->DeployContract(caller_address, request.deploy_info());
95 if (contract_address > 0) {
97 contract.set_owner_address(request.caller_address());
98 contract.set_contract_address(
100 contract.set_contract_name(request.deploy_info().contract_name());
103 return absl::InternalError(
"Deploy Contract fail.");
106absl::StatusOr<std::string> ContractTransactionManager::Execute(
107 const Request& request) {
110 if (!address_manager_->Exist(caller_address)) {
111 LOG(ERROR) <<
"caller doesn't have an account";
112 return absl::InvalidArgumentError(
"Account not exist.");
115 return contract_manager_->ExecContract(
117 request.func_params());