Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions src/main/java/org/tron/core/capsule/ReceiptCapsule.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package org.tron.core.capsule;

import org.tron.common.utils.Sha256Hash;
import org.tron.common.utils.StringUtil;
import org.tron.core.Constant;
import org.tron.core.db.EnergyProcessor;
import org.tron.core.db.Manager;
import org.tron.core.exception.BalanceInsufficientException;
import org.tron.protos.Protocol.ResourceReceipt;
import org.tron.protos.Protocol.Transaction.Result.contractResult;

Expand Down Expand Up @@ -87,7 +89,7 @@ public long getNetFee() {
* payEnergyBill pay receipt energy bill by energy processor.
*/
public void payEnergyBill(Manager manager, AccountCapsule origin, AccountCapsule caller,
long percent, EnergyProcessor energyProcessor, long now) {
long percent, EnergyProcessor energyProcessor, long now) throws BalanceInsufficientException {
if (0 == receipt.getEnergyUsageTotal()) {
return;
}
Expand All @@ -110,7 +112,7 @@ private void payEnergyBill(
AccountCapsule account,
long usage,
EnergyProcessor energyProcessor,
long now) {
long now) throws BalanceInsufficientException {
long accountEnergyLeft = energyProcessor.getAccountLeftEnergyFromFreeze(account);
if (accountEnergyLeft >= usage) {
energyProcessor.useEnergy(account, usage, now);
Expand All @@ -124,7 +126,12 @@ private void payEnergyBill(
(usage - accountEnergyLeft) * SUN_PER_ENERGY;
this.setEnergyUsage(accountEnergyLeft);
this.setEnergyFee(energyFee);
account.setBalance(account.getBalance() - energyFee);
long balance = account.getBalance();
if (balance < energyFee) {
throw new BalanceInsufficientException(
StringUtil.createReadableString(account.createDbKey()) + " insufficient balance");
}
account.setBalance(balance - energyFee);
}

manager.getAccountStore().put(account.getAddress().toByteArray(), account);
Expand Down
11 changes: 8 additions & 3 deletions src/main/java/org/tron/core/db/TransactionTrace.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.tron.core.capsule.ContractCapsule;
import org.tron.core.capsule.ReceiptCapsule;
import org.tron.core.capsule.TransactionCapsule;
import org.tron.core.exception.BalanceInsufficientException;
import org.tron.core.exception.ContractExeException;
import org.tron.core.exception.ContractValidateException;
import org.tron.core.exception.ReceiptCheckErrException;
Expand Down Expand Up @@ -106,15 +107,19 @@ public void exec(Runtime runtime)
runtime.go();
}

public void finalization(Runtime runtime) {
pay();
public void finalization(Runtime runtime) throws ContractExeException {
try {
pay();
} catch (BalanceInsufficientException e) {
throw new ContractExeException(e.getMessage());
}
runtime.finalization();
}

/**
* pay actually bill(include ENERGY and storage).
*/
public void pay() {
public void pay() throws BalanceInsufficientException {
byte[] originAccount;
byte[] callerAccount;
long percent = 0;
Expand Down
11 changes: 9 additions & 2 deletions src/test/java/org/tron/core/db/TransactionTraceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
import org.tron.core.capsule.TransactionCapsule;
import org.tron.core.config.DefaultConfig;
import org.tron.core.config.args.Args;
import org.tron.core.exception.BalanceInsufficientException;
import org.tron.core.exception.ContractExeException;
import org.tron.core.exception.ContractValidateException;
import org.tron.protos.Contract.CreateSmartContract;
Expand Down Expand Up @@ -194,6 +195,8 @@ public void testUseUsage() throws InvalidProtocolBufferException {
e.printStackTrace();
} catch (ContractValidateException e) {
e.printStackTrace();
} catch (BalanceInsufficientException e) {
e.printStackTrace();
}
}

Expand Down Expand Up @@ -250,8 +253,12 @@ public void testPay() {
TransactionCapsule transactionCapsule = new TransactionCapsule(transaction);
TransactionTrace transactionTrace = new TransactionTrace(transactionCapsule, dbManager);
// transactionTrace.setBill(this.energyUsage, this.storageUsage);
transactionTrace.pay();
AccountCapsule accountCapsule1 = dbManager.getAccountStore().get(ownerAddress.toByteArray());
try {
transactionTrace.pay();
AccountCapsule accountCapsule1 = dbManager.getAccountStore().get(ownerAddress.toByteArray());
} catch (BalanceInsufficientException e) {
e.printStackTrace();
}
}

/**
Expand Down