
io.eosif.lib.OfflineSign Maven / Gradle / Ivy
package io.eosif.lib;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.eosif.lib.esc.Action;
import io.eosif.lib.esc.DataParam;
import io.eosif.lib.esc.DataType;
import io.eosif.lib.esc.Ese;
import io.eosif.lib.rpc.vo.SignParam;
import io.eosif.lib.rpc.vo.transaction.push.Tx;
import io.eosif.lib.rpc.vo.transaction.push.TxAction;
import io.eosif.lib.rpc.vo.transaction.push.TxRequest;
import io.eosif.lib.rpc.vo.transaction.push.TxSign;
import java.text.SimpleDateFormat;
import java.util.*;
/**
*
* @author espritblock http://eblock.io
*
*/
public class OfflineSign {
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
public OfflineSign() {
dateFormatter.setTimeZone(TimeZone.getTimeZone("UTC"));
}
/**
*
* @param compression
* @param pushTransaction
* @param signatures
* @return
* @throws Exception
*/
public String pushTransaction(String compression, Tx pushTransaction, String[] signatures) throws Exception {
ObjectMapper mapper = new ObjectMapper();
String mapJakcson = mapper.writeValueAsString(new TxRequest(compression, pushTransaction, signatures));
return mapJakcson;
}
/**
* 离线签名转账
*
* @param signParam
* @param pk
* @param contractAccount
* @param from
* @param to
* @param quantity
* @param memo
* @return
* @throws Exception
*/
public String transfer(SignParam signParam, String pk, String contractAccount, String from, String to,
String quantity, String memo) throws Exception {
Tx tx = new Tx();
tx.setExpiration(signParam.getHeadBlockTime().getTime() / 1000 + signParam.getExp());
tx.setRef_block_num(signParam.getLastIrreversibleBlockNum());
tx.setRef_block_prefix(signParam.getRefBlockPrefix());
tx.setNet_usage_words(0l);
tx.setMax_cpu_usage_ms(0l);
tx.setDelay_sec(0l);
// actions
List actions = new ArrayList();
// data
Map dataMap = new LinkedHashMap();
dataMap.put("from", from);
dataMap.put("to", to);
dataMap.put("quantity", new DataParam(quantity, DataType.asset, Action.transfer).getValue());
dataMap.put("memo", memo);
// action
TxAction action = new TxAction(from, contractAccount, "transfer", dataMap);
actions.add(action);
tx.setActions(actions);
// sgin
String sign = Ecc.signTransaction(pk, new TxSign(signParam.getChainId(), tx));
// data parse
String data = Ecc.parseTransferData(from, to, quantity, memo);
// reset data
action.setData(data);
// reset expiration
tx.setExpiration(dateFormatter.format(new Date(1000 * Long.parseLong(tx.getExpiration().toString()))));
return pushTransaction("none", tx, new String[] { sign });
}
/**
* 离线签名创建账户
*
* @param signParam
* @param pk
* @param creator
* @param newAccount
* @param owner
* @param active
* @param buyRam
* @return
* @throws Exception
*/
public String createAccount(SignParam signParam, String pk, String creator, String newAccount, String owner,
String active, Long buyRam) throws Exception {
Tx tx = new Tx();
tx.setExpiration(signParam.getHeadBlockTime().getTime() / 1000 + signParam.getExp());
tx.setRef_block_num(signParam.getLastIrreversibleBlockNum());
tx.setRef_block_prefix(signParam.getRefBlockPrefix());
tx.setNet_usage_words(0l);
tx.setMax_cpu_usage_ms(0l);
tx.setDelay_sec(0l);
// actions
List actions = new ArrayList();
tx.setActions(actions);
// create
Map createMap = new LinkedHashMap<>();
createMap.put("creator", creator);
createMap.put("name", newAccount);
createMap.put("owner", owner);
createMap.put("active", active);
TxAction createAction = new TxAction(creator, "eosio", "newaccount", createMap);
actions.add(createAction);
// buyrap
Map buyMap = new LinkedHashMap();
buyMap.put("payer", creator);
buyMap.put("receiver", newAccount);
buyMap.put("bytes", buyRam);
TxAction buyAction = new TxAction(creator, "eosio", "buyrambytes", buyMap);
actions.add(buyAction);
// sgin
String sign = Ecc.signTransaction(pk, new TxSign(signParam.getChainId(), tx));
// data parse
String accountData = Ese.parseAccountData(creator, newAccount, owner, active);
createAction.setData(accountData);
// data parse
String ramData = Ese.parseBuyRamData(creator, newAccount, buyRam);
buyAction.setData(ramData);
// reset expiration
tx.setExpiration(dateFormatter.format(new Date(1000 * Long.parseLong(tx.getExpiration().toString()))));
return pushTransaction("none", tx, new String[] { sign });
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy