forked from TrueCloudLab/neoneo-go
71 lines
2.3 KiB
Go
71 lines
2.3 KiB
Go
|
package core
|
||
|
|
||
|
import (
|
||
|
"math/big"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/nspcc-dev/neo-go/internal/random"
|
||
|
"github.com/nspcc-dev/neo-go/pkg/vm"
|
||
|
"github.com/nspcc-dev/neo-go/pkg/wallet"
|
||
|
"github.com/stretchr/testify/require"
|
||
|
)
|
||
|
|
||
|
func TestGAS_Refuel(t *testing.T) {
|
||
|
bc := newTestChain(t)
|
||
|
|
||
|
cs, _ := getTestContractState(bc)
|
||
|
require.NoError(t, bc.contracts.Management.PutContractState(bc.dao, cs))
|
||
|
|
||
|
const (
|
||
|
sysFee = 10_000000
|
||
|
burnFee = sysFee + 12345678
|
||
|
)
|
||
|
|
||
|
accs := []*wallet.Account{
|
||
|
newAccountWithGAS(t, bc),
|
||
|
newAccountWithGAS(t, bc),
|
||
|
}
|
||
|
|
||
|
t.Run("good, refuel from self", func(t *testing.T) {
|
||
|
before0 := bc.GetUtilityTokenBalance(accs[0].Contract.ScriptHash())
|
||
|
aer, err := invokeContractMethodGeneric(bc, sysFee, bc.contracts.GAS.Hash, "refuel",
|
||
|
accs[0], accs[0].Contract.ScriptHash(), int64(burnFee))
|
||
|
require.NoError(t, err)
|
||
|
require.Equal(t, vm.HaltState, aer.VMState)
|
||
|
|
||
|
after0 := bc.GetUtilityTokenBalance(accs[0].Contract.ScriptHash())
|
||
|
tx, _, _ := bc.GetTransaction(aer.Container)
|
||
|
require.Equal(t, before0, new(big.Int).Add(after0, big.NewInt(tx.SystemFee+tx.NetworkFee+burnFee)))
|
||
|
})
|
||
|
|
||
|
t.Run("good, refuel from other", func(t *testing.T) {
|
||
|
before0 := bc.GetUtilityTokenBalance(accs[0].Contract.ScriptHash())
|
||
|
before1 := bc.GetUtilityTokenBalance(accs[1].Contract.ScriptHash())
|
||
|
aer, err := invokeContractMethodGeneric(bc, sysFee, cs.Hash, "refuelGas",
|
||
|
accs, accs[1].Contract.ScriptHash(), int64(burnFee), int64(burnFee))
|
||
|
require.NoError(t, err)
|
||
|
require.Equal(t, vm.HaltState, aer.VMState)
|
||
|
|
||
|
after0 := bc.GetUtilityTokenBalance(accs[0].Contract.ScriptHash())
|
||
|
after1 := bc.GetUtilityTokenBalance(accs[1].Contract.ScriptHash())
|
||
|
|
||
|
tx, _, _ := bc.GetTransaction(aer.Container)
|
||
|
require.Equal(t, before0, new(big.Int).Add(after0, big.NewInt(tx.SystemFee+tx.NetworkFee)))
|
||
|
require.Equal(t, before1, new(big.Int).Add(after1, big.NewInt(burnFee)))
|
||
|
})
|
||
|
|
||
|
t.Run("bad, invalid witness", func(t *testing.T) {
|
||
|
aer, err := invokeContractMethodGeneric(bc, sysFee, cs.Hash, "refuelGas",
|
||
|
accs, random.Uint160(), int64(1), int64(1))
|
||
|
require.NoError(t, err)
|
||
|
require.Equal(t, vm.FaultState, aer.VMState)
|
||
|
})
|
||
|
|
||
|
t.Run("bad, invalid GAS amount", func(t *testing.T) {
|
||
|
aer, err := invokeContractMethodGeneric(bc, sysFee, cs.Hash, "refuelGas",
|
||
|
accs, accs[0].Contract.ScriptHash(), int64(0), int64(1))
|
||
|
require.NoError(t, err)
|
||
|
require.Equal(t, vm.FaultState, aer.VMState)
|
||
|
})
|
||
|
}
|