diff --git a/modAionImpl/src/org/aion/zero/impl/vm/fvm/ExternalStateForFvm.java b/modAionImpl/src/org/aion/zero/impl/vm/fvm/ExternalStateForFvm.java index 33f56534d9..89eea53afe 100644 --- a/modAionImpl/src/org/aion/zero/impl/vm/fvm/ExternalStateForFvm.java +++ b/modAionImpl/src/org/aion/zero/impl/vm/fvm/ExternalStateForFvm.java @@ -269,7 +269,11 @@ public BigInteger getBalance(AionAddress address) { * @param amount The amount. */ @Override - public void addBalance(AionAddress address, BigInteger amount) { + public void addBalance(AionAddress address, BigInteger amount) + { + if (!this.isLocalCall && getBalance(address).add(amount).signum() < 0) { + throw new IllegalArgumentException("This balance adjustment leads to a negative balance!"); + } this.repository.addBalance(address, amount); } @@ -376,6 +380,9 @@ public boolean accountBalanceIsAtLeast(AionAddress address, BigInteger balance) @Override public void deductEnergyCost(AionAddress address, BigInteger energyCost) { if (!this.isLocalCall) { + if (getBalance(address).subtract(energyCost).signum() < 0) { + throw new IllegalArgumentException("This energy cost deduction leads to a negative balance!"); + } this.repository.addBalance(address, energyCost.negate()); } } diff --git a/modAvmVersion1/src/org/aion/avm/version1/internal/ExternalStateForAvm.java b/modAvmVersion1/src/org/aion/avm/version1/internal/ExternalStateForAvm.java index 65515972cf..ac6274228e 100644 --- a/modAvmVersion1/src/org/aion/avm/version1/internal/ExternalStateForAvm.java +++ b/modAvmVersion1/src/org/aion/avm/version1/internal/ExternalStateForAvm.java @@ -153,6 +153,9 @@ public BigInteger getBalance(AionAddress address) { @Override public void adjustBalance(AionAddress address, BigInteger delta) { + if (!this.isLocalCall && getBalance(address).add(delta).signum() < 0) { + throw new IllegalArgumentException("This balance adjustment leads to a negative balance!"); + } this.repositoryCache.addBalance(address, delta); } @@ -176,6 +179,9 @@ public void incrementNonce(AionAddress address) { @Override public void refundAccount(AionAddress address, BigInteger amount) { if (!this.isLocalCall) { + if (getBalance(address).add(amount).signum() < 0) { + throw new IllegalArgumentException("This refund leads to a negative balance!"); + } this.repositoryCache.addBalance(address, amount); } } diff --git a/modAvmVersion2/src/org/aion/avm/version2/internal/ExternalStateForAvm.java b/modAvmVersion2/src/org/aion/avm/version2/internal/ExternalStateForAvm.java index d6d747db6b..e357ca2ff9 100644 --- a/modAvmVersion2/src/org/aion/avm/version2/internal/ExternalStateForAvm.java +++ b/modAvmVersion2/src/org/aion/avm/version2/internal/ExternalStateForAvm.java @@ -154,7 +154,10 @@ public BigInteger getBalance(AionAddress address) { @Override public void adjustBalance(AionAddress address, BigInteger delta) { - this.repositoryCache.addBalance(address, delta); + if (!this.isLocalCall && getBalance(address).add(delta).signum() < 0) { + throw new IllegalArgumentException("This balance adjustment leads to a negative balance!"); + } + this.repositoryCache.addBalance(address, delta); } @Override @@ -177,6 +180,9 @@ public void incrementNonce(AionAddress address) { @Override public void refundAccount(AionAddress address, BigInteger amount) { if (!this.isLocalCall) { + if (getBalance(address).add(amount).signum() < 0) { + throw new IllegalArgumentException("This refund leads to a negative balance!"); + } this.repositoryCache.addBalance(address, amount); } }