use of io.nuls.utxo.accounts.storage.po.LockedBalance in project nuls by nuls-io.
the class UtxoAccountsServiceImpl method buildUtxoAccountsBalance.
/**
* build utxoAccounts Map(address,balance)
*
* @param utxoAccountsMap
* @param coin
* @param tx
* @param txIndex
* @param isInput
*/
private void buildUtxoAccountsBalance(Map<String, UtxoAccountsBalancePo> utxoAccountsMap, Coin coin, Transaction tx, int txIndex, boolean isInput) {
long netBlockHeight = NulsContext.getInstance().getNetBestBlockHeight();
// change coin.getOwner() to coin.getAddress() for support multiSig
String address = AddressTool.getStringAddressByBytes(coin.getAddress());
UtxoAccountsBalancePo balance = utxoAccountsMap.get(address);
if (null == balance) {
balance = new UtxoAccountsBalancePo();
balance.setOwner(coin.getOwner());
utxoAccountsMap.put(address, balance);
}
if (isInput) {
if (coin.getLockTime() == -1) {
// remove balance
balance.setUnLockedPermanentBalance(balance.getUnLockedPermanentBalance() + (coin.getNa().getValue()));
}
balance.setInputBalance(balance.getInputBalance() + (coin.getNa().getValue()));
} else {
// add locked balance
if (coin.getLockTime() == -1) {
balance.setLockedPermanentBalance(balance.getLockedPermanentBalance() + (coin.getNa().getValue()));
} else // by time
if (coin.getLockTime() > TimeService.currentTimeMillis()) {
LockedBalance lockedBalance = new LockedBalance();
lockedBalance.setLockedBalance(coin.getNa().getValue());
lockedBalance.setLockedTime(coin.getLockTime());
balance.getLockedTimeList().add(lockedBalance);
} else if (coin.getLockTime() > netBlockHeight) {
LockedBalance lockedBalance = new LockedBalance();
lockedBalance.setLockedBalance(coin.getNa().getValue());
lockedBalance.setLockedTime(coin.getLockTime());
balance.getLockedHeightList().add(lockedBalance);
}
balance.setOutputBalance(balance.getOutputBalance() + (coin.getNa()).getValue());
}
// balance.setOwner(coin.getOwner());
balance.setBlockHeight(tx.getBlockHeight());
balance.setTxIndex(txIndex);
}
use of io.nuls.utxo.accounts.storage.po.LockedBalance in project nuls by nuls-io.
the class UtxoAccountsResource method get.
@GET
@Path("/{address}")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation("[查询] 查询账户信息")
@ApiResponses(value = { @ApiResponse(code = 200, message = "success", response = RpcClientResult.class) })
public RpcClientResult get(@ApiParam(name = "address", value = "账户地址", required = true) @PathParam("address") String address) {
if (!AddressTool.validAddress(address)) {
return Result.getFailed(AccountErrorCode.ADDRESS_ERROR).toRpcClientResult();
}
try {
Result<UtxoAccountsBalancePo> utxoAccountsBalance = utxoAccountsStorageService.getUtxoAccountsBalanceByAddress(AddressTool.getAddress(address));
long synBlockHeight = utxoAccountsStorageService.getHadSynBlockHeight();
if (null == utxoAccountsBalance || null == utxoAccountsBalance.getData()) {
return Result.getFailed(UtxoAccountsErrorCode.DATA_NOT_FOUND).toRpcClientResult();
}
UtxoAccountsBalancePo dbAccountsBalance = utxoAccountsBalance.getData();
AccountBalanceDto accountBalance = new AccountBalanceDto();
accountBalance.setLockedTimeList(new ArrayList<>());
accountBalance.setLockedHeightList(new ArrayList<>());
accountBalance.setAddress(address);
long totalNa = dbAccountsBalance.getOutputBalance() - (dbAccountsBalance.getInputBalance());
totalNa += dbAccountsBalance.getContractToBalance();
totalNa -= dbAccountsBalance.getContractFromBalance();
accountBalance.setNuls(new BigDecimal(totalNa).toPlainString());
long timeLockedNa = 0;
long heightLockedNa = 0;
long permanentLockedNa = dbAccountsBalance.getLockedPermanentBalance() - (dbAccountsBalance.getUnLockedPermanentBalance());
long lockedNa = permanentLockedNa;
List<LockedBalance> timeLockedBalance = dbAccountsBalance.getLockedTimeList();
long currentTime = TimeService.currentTimeMillis();
for (LockedBalance balance : timeLockedBalance) {
if (balance.getLockedTime() > currentTime) {
lockedNa += balance.getLockedBalance();
timeLockedNa += balance.getLockedBalance();
accountBalance.getLockedTimeList().add(balance);
} else {
break;
}
}
List<LockedBalance> heightLockedBalance = dbAccountsBalance.getLockedHeightList();
for (LockedBalance balance : heightLockedBalance) {
if (balance.getLockedTime() > synBlockHeight) {
lockedNa += balance.getLockedBalance();
heightLockedNa += balance.getLockedBalance();
accountBalance.getLockedHeightList().add(balance);
} else {
break;
}
}
accountBalance.setPermanentLocked(new BigDecimal(permanentLockedNa).toPlainString());
accountBalance.setLocked(new BigDecimal(lockedNa).toPlainString());
accountBalance.setTimeLocked(new BigDecimal(timeLockedNa).toPlainString());
accountBalance.setHeightLocked(new BigDecimal(heightLockedNa).toPlainString());
accountBalance.setSynBlockHeight(String.valueOf(synBlockHeight));
long netHeight = NulsContext.getInstance().getNetBestBlockHeight();
accountBalance.setNetBlockHeight(String.valueOf(netHeight));
accountBalance.setContractIn(String.valueOf(dbAccountsBalance.getContractToBalance()));
accountBalance.setContractOut(String.valueOf(dbAccountsBalance.getContractFromBalance()));
return Result.getSuccess().setData(accountBalance).toRpcClientResult();
} catch (NulsException e) {
Log.error(e);
}
return Result.getFailed(UtxoAccountsErrorCode.SYS_UNKOWN_EXCEPTION).toRpcClientResult();
}
use of io.nuls.utxo.accounts.storage.po.LockedBalance in project nuls by nuls-io.
the class UtxoAccountsServiceImpl method clearLockedBalance.
private void clearLockedBalance(UtxoAccountsBalancePo dbBalance, UtxoAccountsBalancePo addBalance, UtxoAccountsBalancePo newBalance) {
List<LockedBalance> newTimeList = new ArrayList<>();
List<LockedBalance> newHeightList = new ArrayList<>();
List<LockedBalance> heightList = dbBalance.getLockedHeightList();
List<LockedBalance> timeList = dbBalance.getLockedTimeList();
long netBlockHeight = NulsContext.getInstance().getNetBestBlockHeight();
for (LockedBalance heightBalance : heightList) {
if (heightBalance.getLockedTime() > netBlockHeight) {
newHeightList.add(heightBalance);
} else {
break;
}
}
newHeightList.addAll(addBalance.getLockedHeightList());
newHeightList.sort(LockedBalance::compareByLockedTime);
newBalance.setLockedHeightList(newHeightList);
long serverTime = TimeService.currentTimeMillis();
for (LockedBalance timeBalance : timeList) {
if (timeBalance.getLockedTime() > serverTime) {
newTimeList.add(timeBalance);
} else {
break;
}
}
newTimeList.addAll(addBalance.getLockedTimeList());
newTimeList.sort(LockedBalance::compareByLockedTime);
newBalance.setLockedTimeList(newTimeList);
}
use of io.nuls.utxo.accounts.storage.po.LockedBalance in project nuls by nuls-io.
the class UtxoAccountsResource method getBalance.
@GET
@Path("/balance/{address}")
@Produces(MediaType.APPLICATION_JSON)
@ApiOperation("[查询] 查询账户余额信息")
@ApiResponses(value = { @ApiResponse(code = 200, message = "success", response = RpcClientResult.class) })
public RpcClientResult getBalance(@ApiParam(name = "address", value = "账户地址", required = true) @PathParam("address") String address) {
if (!AddressTool.validAddress(address)) {
return Result.getFailed(AccountErrorCode.ADDRESS_ERROR).toRpcClientResult();
}
try {
Result<UtxoAccountsBalancePo> utxoAccountsBalance = utxoAccountsStorageService.getUtxoAccountsBalanceByAddress(AddressTool.getAddress(address));
long synBlockHeight = utxoAccountsStorageService.getHadSynBlockHeight();
if (null == utxoAccountsBalance || null == utxoAccountsBalance.getData()) {
return Result.getFailed(UtxoAccountsErrorCode.DATA_NOT_FOUND).toRpcClientResult();
}
UtxoAccountsBalancePo dbAccountsBalance = utxoAccountsBalance.getData();
AccountBalanceDto accountBalance = new AccountBalanceDto();
accountBalance.setAddress(address);
long totalNa = dbAccountsBalance.getOutputBalance() - (dbAccountsBalance.getInputBalance());
totalNa += dbAccountsBalance.getContractToBalance();
totalNa -= dbAccountsBalance.getContractFromBalance();
accountBalance.setNuls(new BigDecimal(totalNa).toPlainString());
long permanentLockedNa = dbAccountsBalance.getLockedPermanentBalance() - (dbAccountsBalance.getUnLockedPermanentBalance());
long lockedNa = permanentLockedNa;
List<LockedBalance> timeLockedBalance = dbAccountsBalance.getLockedTimeList();
long currentTime = TimeService.currentTimeMillis();
for (LockedBalance balance : timeLockedBalance) {
if (balance.getLockedTime() > currentTime) {
lockedNa += balance.getLockedBalance();
} else {
break;
}
}
List<LockedBalance> heightLockedBalance = dbAccountsBalance.getLockedHeightList();
for (LockedBalance balance : heightLockedBalance) {
if (balance.getLockedTime() > synBlockHeight) {
lockedNa += balance.getLockedBalance();
} else {
break;
}
}
accountBalance.setLocked(new BigDecimal(lockedNa).toPlainString());
accountBalance.setSynBlockHeight(String.valueOf(synBlockHeight));
long netHeight = NulsContext.getInstance().getNetBestBlockHeight();
accountBalance.setNetBlockHeight(String.valueOf(netHeight));
return Result.getSuccess().setData(accountBalance).toRpcClientResult();
} catch (NulsException e) {
Log.error(e);
}
return Result.getFailed(UtxoAccountsErrorCode.SYS_UNKOWN_EXCEPTION).toRpcClientResult();
}
use of io.nuls.utxo.accounts.storage.po.LockedBalance in project nuls by nuls-io.
the class UtxoAccountsBalanceServiceImpl method getUtxoAccountsBalance.
@Override
public Result<UtxoAccountsBalance> getUtxoAccountsBalance(byte[] owner) {
if (!AddressTool.validAddress(AddressTool.getStringAddressByBytes(owner))) {
return Result.getFailed(AccountErrorCode.ADDRESS_ERROR);
}
try {
Result<UtxoAccountsBalancePo> utxoAccountsBalance = utxoAccountsStorageService.getUtxoAccountsBalanceByAddress(owner);
long synBlockHeight = utxoAccountsStorageService.getHadSynBlockHeight();
if (null == utxoAccountsBalance || null == utxoAccountsBalance.getData()) {
return Result.getFailed(UtxoAccountsErrorCode.DATA_NOT_FOUND);
}
UtxoAccountsBalancePo dbAccountsBalance = utxoAccountsBalance.getData();
UtxoAccountsBalance accountBalance = new UtxoAccountsBalance();
accountBalance.setOwner(dbAccountsBalance.getOwner());
long totalNa = dbAccountsBalance.getOutputBalance() - (dbAccountsBalance.getInputBalance());
totalNa += dbAccountsBalance.getContractToBalance();
totalNa -= dbAccountsBalance.getContractFromBalance();
accountBalance.setBalance(Na.valueOf(totalNa));
long permanentLockedNa = dbAccountsBalance.getLockedPermanentBalance() - (dbAccountsBalance.getUnLockedPermanentBalance());
long lockedNa = permanentLockedNa;
List<LockedBalance> timeLockedBalance = dbAccountsBalance.getLockedTimeList();
long currentTime = TimeService.currentTimeMillis();
for (LockedBalance balance : timeLockedBalance) {
if (balance.getLockedTime() > currentTime) {
lockedNa += balance.getLockedBalance();
} else {
break;
}
}
List<LockedBalance> heightLockedBalance = dbAccountsBalance.getLockedHeightList();
for (LockedBalance balance : heightLockedBalance) {
if (balance.getLockedTime() > synBlockHeight) {
lockedNa += balance.getLockedBalance();
} else {
break;
}
}
accountBalance.setHadLocked(Na.valueOf(lockedNa));
return Result.getSuccess().setData(accountBalance);
} catch (NulsException e) {
Log.error(e);
}
return Result.getFailed(UtxoAccountsErrorCode.SYS_UNKOWN_EXCEPTION);
}
Aggregations