// (c) 2019-2020, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package evm
import (
"testing"
"github.com/ava-labs/avalanchego/ids"
"github.com/ava-labs/avalanchego/vms/components/avax"
"github.com/ava-labs/avalanchego/vms/secp256k1fx"
)
func TestImportTxVerifyNil(t *testing.T) {
var importTx UnsignedImportTx
if err := importTx.Verify(testXChainID, NewContext(), testTxFee, testAvaxAssetID); err == nil {
t.Fatal("Verify should have failed due to nil transaction")
}
}
func TestImportTxVerify(t *testing.T) {
var importAmount uint64 = 10000000
txID := ids.NewID([32]byte{0xff})
importTx := &UnsignedImportTx{
NetworkID: testNetworkID,
BlockchainID: testCChainID,
SourceChain: testXChainID,
ImportedInputs: []*avax.TransferableInput{
{
UTXOID: avax.UTXOID{
TxID: txID,
OutputIndex: uint32(0),
},
Asset: avax.Asset{ID: testAvaxAssetID},
In: &secp256k1fx.TransferInput{
Amt: importAmount,
Input: secp256k1fx.Input{
SigIndices: []uint32{0},
},
},
},
{
UTXOID: avax.UTXOID{
TxID: txID,
OutputIndex: uint32(1),
},
Asset: avax.Asset{ID: testAvaxAssetID},
In: &secp256k1fx.TransferInput{
Amt: importAmount,
Input: secp256k1fx.Input{
SigIndices: []uint32{0},
},
},
},
},
Outs: []EVMOutput{
{
Address: testEthAddrs[0],
Amount: importAmount,
AssetID: testAvaxAssetID,
},
{
Address: testEthAddrs[1],
Amount: importAmount,
AssetID: testAvaxAssetID,
},
},
}
ctx := NewContext()
if err := importTx.Verify(testXChainID, ctx, testTxFee, testAvaxAssetID); err != nil {
t.Fatalf("Failed to verify ImportTx: %w", err)
}
// // Sort the inputs and outputs to ensure the transaction is canonical
// avax.SortTransferableOutputs(exportTx.ExportedOutputs, Codec)
// // Pass in a list of signers here with the appropriate length
// // to avoid causing a nil-pointer error in the helper method
// emptySigners := make([][]*crypto.PrivateKeySECP256K1R, 2)
// SortEVMInputsAndSigners(exportTx.Ins, emptySigners)
// // Test Valid Export Tx
// if err := exportTx.Verify(testXChainID, ctx, testTxFee, testAvaxAssetID); err != nil {
// t.Fatalf("Failed to verify valid ExportTx: %w", err)
// }
// exportTx.syntacticallyVerified = false
// exportTx.NetworkID = testNetworkID + 1
// // Test Incorrect Network ID Errors
// if err := exportTx.Verify(testXChainID, ctx, testTxFee, testAvaxAssetID); err == nil {
// t.Fatal("ExportTx should have failed verification due to incorrect network ID")
// }
// exportTx.syntacticallyVerified = false
// exportTx.NetworkID = testNetworkID
// exportTx.BlockchainID = nonExistentID
// // Test Incorrect Blockchain ID Errors
// if err := exportTx.Verify(testXChainID, ctx, testTxFee, testAvaxAssetID); err == nil {
// t.Fatal("ExportTx should have failed verification due to incorrect blockchain ID")
// }
// exportTx.syntacticallyVerified = false
// exportTx.BlockchainID = testCChainID
// exportTx.DestinationChain = nonExistentID
// // Test Incorrect Destination Chain ID Errors
// if err := exportTx.Verify(testXChainID, ctx, testTxFee, testAvaxAssetID); err == nil {
// t.Fatal("ExportTx should have failed verification due to incorrect destination chain")
// }
// exportTx.syntacticallyVerified = false
// exportTx.DestinationChain = testXChainID
// exportedOuts := exportTx.ExportedOutputs
// exportTx.ExportedOutputs = nil
// // Test No Exported Outputs Errors
// if err := exportTx.Verify(testXChainID, ctx, testTxFee, testAvaxAssetID); err == nil {
// t.Fatal("ExportTx should have failed verification due to no exported outputs")
// }
// exportTx.syntacticallyVerified = false
// exportTx.ExportedOutputs = []*avax.TransferableOutput{exportedOuts[1], exportedOuts[0]}
// // Test Unsorted outputs Errors
// if err := exportTx.Verify(testXChainID, ctx, testTxFee, testAvaxAssetID); err == nil {
// t.Fatal("ExportTx should have failed verification due to no exported outputs")
// }
}