mirror of
https://github.com/AthanorLabs/atomic-swap.git
synced 2026-01-08 21:58:07 -05:00
131 lines
4.7 KiB
Go
131 lines
4.7 KiB
Go
package xmrtaker
|
|
|
|
import (
|
|
"context"
|
|
"crypto/ecdsa"
|
|
"math/big"
|
|
"testing"
|
|
|
|
ethcommon "github.com/ethereum/go-ethereum/common"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/athanorlabs/atomic-swap/coins"
|
|
"github.com/athanorlabs/atomic-swap/common/types"
|
|
contracts "github.com/athanorlabs/atomic-swap/ethereum"
|
|
"github.com/athanorlabs/atomic-swap/ethereum/block"
|
|
"github.com/athanorlabs/atomic-swap/ethereum/extethclient"
|
|
"github.com/athanorlabs/atomic-swap/tests"
|
|
)
|
|
|
|
func deployTestToken(t *testing.T, ownerKey *ecdsa.PrivateKey) (ethcommon.Address, *coins.ERC20TokenInfo) {
|
|
ctx := context.Background()
|
|
ec := extethclient.CreateTestClient(t, ownerKey)
|
|
|
|
txOpts, err := ec.TxOpts(ctx)
|
|
require.NoError(t, err)
|
|
|
|
tokenAddr, tx, _, err := contracts.DeployTestERC20(
|
|
txOpts,
|
|
ec.Raw(),
|
|
"Min Max Testing Token",
|
|
"MMTT",
|
|
6,
|
|
ec.Address(),
|
|
big.NewInt(1000e6), // 1000 standard units
|
|
)
|
|
require.NoError(t, err)
|
|
_, err = block.WaitForReceipt(ctx, ec.Raw(), tx.Hash())
|
|
require.NoError(t, err)
|
|
|
|
tokenInfo, err := ec.ERC20Info(ctx, tokenAddr)
|
|
require.NoError(t, err)
|
|
|
|
return tokenAddr, tokenInfo
|
|
}
|
|
|
|
func Test_validateMinBalForETHSwap(t *testing.T) {
|
|
balanceWei := coins.EtherToWei(coins.StrToDecimal("0.5"))
|
|
providesAmt := coins.StrToDecimal("0.25")
|
|
gasPriceWei := big.NewInt(35e9) // 35 GWei
|
|
err := validateMinBalForETHSwap(balanceWei, providesAmt, gasPriceWei)
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func Test_validateMinBalForETHSwap_InsufficientBalance(t *testing.T) {
|
|
balanceWei := coins.EtherToWei(coins.StrToDecimal("0.5"))
|
|
providesAmt := balanceWei.AsEther() // provided amount consumes whole balance leaving nothing for gas
|
|
gasPriceWei := big.NewInt(35e9) // 35 GWei
|
|
err := validateMinBalForETHSwap(balanceWei, providesAmt, gasPriceWei)
|
|
// Amount in check below is truncated, so minor adjustments in the
|
|
// expected gas won't break the test. The full message looks like:
|
|
// "balance of 0.5 ETH is under required amount of 0.504541005 ETH"
|
|
require.ErrorContains(t, err, "balance of 0.5 ETH is under required amount of 0.504")
|
|
}
|
|
|
|
func Test_validateMinBalForTokenSwap(t *testing.T) {
|
|
tokenInfo := &coins.ERC20TokenInfo{
|
|
Address: ethcommon.Address{0x1},
|
|
NumDecimals: 6,
|
|
Name: "Token",
|
|
Symbol: "TK",
|
|
}
|
|
balanceWei := coins.EtherToWei(coins.StrToDecimal("0.5"))
|
|
tokenBalance := coins.NewTokenAmountFromDecimals(coins.StrToDecimal("10"), tokenInfo)
|
|
providesAmt := coins.StrToDecimal("5")
|
|
gasPriceWei := big.NewInt(35e9) // 35 GWei
|
|
err := validateMinBalForTokenSwap(balanceWei, tokenBalance, providesAmt, gasPriceWei)
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func Test_validateMinBalForTokenSwap_InsufficientTokenBalance(t *testing.T) {
|
|
tokenInfo := &coins.ERC20TokenInfo{
|
|
Address: ethcommon.Address{0x1},
|
|
NumDecimals: 6,
|
|
Name: "Token",
|
|
Symbol: "TK",
|
|
}
|
|
balanceWei := coins.EtherToWei(coins.StrToDecimal("0.5"))
|
|
tokenBalance := coins.NewTokenAmountFromDecimals(coins.StrToDecimal("10"), tokenInfo)
|
|
providesAmt := coins.StrToDecimal("20")
|
|
gasPriceWei := big.NewInt(35e9) // 35 GWei
|
|
err := validateMinBalForTokenSwap(balanceWei, tokenBalance, providesAmt, gasPriceWei)
|
|
require.ErrorContains(t, err, `balance of 10 "TK" is below provided 20 "TK"`)
|
|
}
|
|
|
|
func Test_validateMinBalForTokenSwap_InsufficientETHBalance(t *testing.T) {
|
|
tokenInfo := &coins.ERC20TokenInfo{
|
|
Address: ethcommon.Address{0x1},
|
|
NumDecimals: 6,
|
|
Name: "Token",
|
|
Symbol: "TK",
|
|
}
|
|
balanceWei := coins.EtherToWei(coins.StrToDecimal("0.007"))
|
|
tokenBalance := coins.NewTokenAmountFromDecimals(coins.StrToDecimal("10"), tokenInfo)
|
|
providesAmt := coins.StrToDecimal("1")
|
|
gasPriceWei := big.NewInt(35e9) // 35 GWei
|
|
err := validateMinBalForTokenSwap(balanceWei, tokenBalance, providesAmt, gasPriceWei)
|
|
// Amount in check below is truncated, so minor adjustments in the
|
|
// expected gas won't break the test. The full message looks like:
|
|
// "balance of 0.007 ETH is under required amount of 0.00743302 ETH"
|
|
require.ErrorContains(t, err, `balance of 0.007 ETH is under required amount of 0.0074`)
|
|
}
|
|
|
|
func Test_validateMinBalanceETH(t *testing.T) {
|
|
ctx := context.Background()
|
|
pk := tests.GetTakerTestKey(t)
|
|
ec := extethclient.CreateTestClient(t, pk)
|
|
providesAmt := coins.StrToDecimal("0.3") // ganache taker key will have more than this
|
|
err := validateMinBalance(ctx, ec, providesAmt, types.EthAssetETH)
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func Test_validateMinBalanceToken(t *testing.T) {
|
|
ctx := context.Background()
|
|
pk := tests.GetTakerTestKey(t)
|
|
ec := extethclient.CreateTestClient(t, pk)
|
|
tokenAddr, _ := deployTestToken(t, pk)
|
|
providesAmt := coins.StrToDecimal("1") // less than the 1k tokens belonging to the taker
|
|
err := validateMinBalance(ctx, ec, providesAmt, types.EthAsset(tokenAddr))
|
|
require.NoError(t, err)
|
|
}
|