fix: start timeout watchers for xmrtaker when restarting ongoing swap (#456)

This commit is contained in:
noot
2023-05-03 14:09:27 -04:00
committed by GitHub
parent 998347ded0
commit f7862219a8
4 changed files with 25 additions and 13 deletions

View File

@@ -6,6 +6,8 @@ package protocol
import (
"testing"
"github.com/athanorlabs/atomic-swap/common"
"github.com/stretchr/testify/require"
)
@@ -21,4 +23,5 @@ func TestKeysAndProof(t *testing.T) {
require.NoError(t, err)
require.Equal(t, kp.Secp256k1PublicKey.String(), res.Secp256k1PublicKey.String())
require.Equal(t, kp.PublicKeyPair.SpendKey().String(), res.Ed25519PublicKey.String())
require.Equal(t, [32]byte(common.Reverse(kp.PrivateKeyPair.SpendKey().Bytes())), kp.DLEqProof.Secret())
}

View File

@@ -188,6 +188,11 @@ func (s *swapState) checkForXMRLock() {
func (s *swapState) runT1ExpirationHandler() {
defer log.Debugf("returning from runT1ExpirationHandler")
if time.Until(s.t1) <= 0 {
log.Debugf("T1 already passed, not starting T1 expiration handler")
return
}
// TODO: this variable is so that we definitely refund before t1.
// Current algorithm is to trigger the timeout when only 15% of the allotted
// time is remaining. If the block interval is 1 second on a test network and

View File

@@ -203,6 +203,9 @@ func newSwapStateFromOngoing(
if info.Status == types.ETHLocked {
go s.checkForXMRLock()
}
go s.runT1ExpirationHandler()
go s.runT2ExpirationHandler()
return s, nil
}
@@ -540,12 +543,14 @@ func (s *swapState) setTimeouts(t1, t2 *big.Int) {
s.info.Timeout2 = &s.t2
}
// generateAndSetKeys generates and sets the XMRTaker's monero spend and view keys (S_b, V_b), a secp256k1 public key,
// and a DLEq proof proving that the two keys correspond.
func (s *swapState) generateAndSetKeys() error {
if s.privkeys != nil {
panic("generateAndSetKeys should only be called once")
}
keysAndProof, err := generateKeys()
keysAndProof, err := pcommon.GenerateKeysAndProof()
if err != nil {
return err
}
@@ -560,6 +565,11 @@ func (s *swapState) generateAndSetKeys() error {
// getSecret secrets returns the current secret scalar used to unlock funds from the contract.
func (s *swapState) getSecret() [32]byte {
if s.dleqProof == nil {
// the EVM expects the bytes to be big endian, and the ed25519 lib uses little endian
return [32]byte(common.Reverse(s.privkeys.SpendKey().Bytes()))
}
secret := s.dleqProof.Secret()
var sc [32]byte
copy(sc[:], secret[:])
@@ -721,9 +731,3 @@ func (s *swapState) refund() (*ethtypes.Receipt, error) {
s.clearNextExpectedEvent(types.CompletedRefund)
return receipt, nil
}
// generateKeys generates XMRTaker's monero spend and view keys (S_b, V_b), a secp256k1 public key,
// and a DLEq proof proving that the two keys correspond.
func generateKeys() (*pcommon.KeysAndProof, error) {
return pcommon.GenerateKeysAndProof()
}

View File

@@ -289,7 +289,7 @@ func TestSwapState_NotifyXMRLock(t *testing.T) {
defer s.cancel()
s.nextExpectedEvent = EventXMRLockedType
xmrmakerKeysAndProof, err := generateKeys()
xmrmakerKeysAndProof, err := pcommon.GenerateKeysAndProof()
require.NoError(t, err)
err = s.setXMRMakerKeys(
@@ -322,7 +322,7 @@ func TestSwapState_NotifyXMRLock_Refund(t *testing.T) {
s.nextExpectedEvent = EventXMRLockedType
s.SetSwapTimeout(time.Second * 3)
xmrmakerKeysAndProof, err := generateKeys()
xmrmakerKeysAndProof, err := pcommon.GenerateKeysAndProof()
require.NoError(t, err)
err = s.setXMRMakerKeys(
@@ -378,7 +378,7 @@ func TestExit_afterNotifyXMRLock(t *testing.T) {
defer s.cancel()
s.nextExpectedEvent = EventXMRLockedType
xmrmakerKeysAndProof, err := generateKeys()
xmrmakerKeysAndProof, err := pcommon.GenerateKeysAndProof()
require.NoError(t, err)
err = s.setXMRMakerKeys(
@@ -405,7 +405,7 @@ func TestExit_afterNotifyClaimed(t *testing.T) {
defer s.cancel()
s.nextExpectedEvent = EventETHClaimedType
xmrmakerKeysAndProof, err := generateKeys()
xmrmakerKeysAndProof, err := pcommon.GenerateKeysAndProof()
require.NoError(t, err)
err = s.setXMRMakerKeys(
@@ -433,7 +433,7 @@ func TestExit_invalidNextMessageType(t *testing.T) {
defer s.cancel()
s.nextExpectedEvent = EventExitType
xmrmakerKeysAndProof, err := generateKeys()
xmrmakerKeysAndProof, err := pcommon.GenerateKeysAndProof()
require.NoError(t, err)
err = s.setXMRMakerKeys(
@@ -461,7 +461,7 @@ func TestSwapState_ApproveToken(t *testing.T) {
s, contract := newTestSwapStateWithERC20(t, providesAmt)
xmrmakerKeysAndProof, err := generateKeys()
xmrmakerKeysAndProof, err := pcommon.GenerateKeysAndProof()
require.NoError(t, err)
err = s.setXMRMakerKeys(