mirror of
https://github.com/aljazceru/ark.git
synced 2026-02-23 12:12:49 +01:00
Add support for Out Of Round txs (#359)
* [common] rework address encoding * new address encoding * replace offchain address by vtxo output key in DB * merge migrations files into init one * fix txbuilder fixtures * fix transaction events * OOR scheme * fix conflicts * [sdk] OOR * update WASM wrappers * revert renaming * revert API changes * update parser.go * fix vtxosToTxsCovenantless * add settled and spent in Utxo and Transaction * Fixes (#5) * Revert unneeded changes and rename claim to settle * Revert changes to wasm and rename claim to settle --------- Co-authored-by: Pietralberto Mazza <18440657+altafan@users.noreply.github.com>
This commit is contained in:
@@ -74,7 +74,7 @@ func TestSendOffchain(t *testing.T) {
|
||||
|
||||
time.Sleep(5 * time.Second)
|
||||
|
||||
_, err = runArkCommand("claim", "--password", utils.Password)
|
||||
_, err = runArkCommand("settle", "--password", utils.Password)
|
||||
require.NoError(t, err)
|
||||
|
||||
time.Sleep(3 * time.Second)
|
||||
@@ -101,7 +101,7 @@ func TestUnilateralExit(t *testing.T) {
|
||||
|
||||
time.Sleep(5 * time.Second)
|
||||
|
||||
_, err = runArkCommand("claim", "--password", utils.Password)
|
||||
_, err = runArkCommand("settle", "--password", utils.Password)
|
||||
require.NoError(t, err)
|
||||
|
||||
time.Sleep(3 * time.Second)
|
||||
@@ -142,7 +142,7 @@ func TestCollaborativeExit(t *testing.T) {
|
||||
|
||||
time.Sleep(5 * time.Second)
|
||||
|
||||
_, err = runArkCommand("claim", "--password", utils.Password)
|
||||
_, err = runArkCommand("settle", "--password", utils.Password)
|
||||
require.NoError(t, err)
|
||||
|
||||
time.Sleep(3 * time.Second)
|
||||
@@ -164,7 +164,7 @@ func TestReactToSpentVtxosRedemption(t *testing.T) {
|
||||
|
||||
time.Sleep(5 * time.Second)
|
||||
|
||||
_, err = client.Claim(ctx)
|
||||
_, err = client.Settle(ctx)
|
||||
require.NoError(t, err)
|
||||
|
||||
time.Sleep(3 * time.Second)
|
||||
@@ -216,7 +216,7 @@ func TestSweep(t *testing.T) {
|
||||
|
||||
time.Sleep(5 * time.Second)
|
||||
|
||||
_, err = runArkCommand("claim", "--password", utils.Password)
|
||||
_, err = runArkCommand("settle", "--password", utils.Password)
|
||||
require.NoError(t, err)
|
||||
|
||||
time.Sleep(3 * time.Second)
|
||||
|
||||
@@ -77,7 +77,7 @@ func TestSendOffchain(t *testing.T) {
|
||||
|
||||
time.Sleep(5 * time.Second)
|
||||
|
||||
_, err = runClarkCommand("claim", "--password", utils.Password)
|
||||
_, err = runClarkCommand("settle", "--password", utils.Password)
|
||||
require.NoError(t, err)
|
||||
|
||||
time.Sleep(3 * time.Second)
|
||||
@@ -91,7 +91,7 @@ func TestSendOffchain(t *testing.T) {
|
||||
require.NoError(t, json.Unmarshal([]byte(balanceStr), &balance))
|
||||
require.NotZero(t, balance.Offchain.Total)
|
||||
|
||||
_, err = runClarkCommand("claim", "--password", utils.Password)
|
||||
_, err = runClarkCommand("settle", "--password", utils.Password)
|
||||
require.NoError(t, err)
|
||||
|
||||
balanceStr, err = runClarkCommand("balance")
|
||||
@@ -113,7 +113,7 @@ func TestUnilateralExit(t *testing.T) {
|
||||
|
||||
time.Sleep(5 * time.Second)
|
||||
|
||||
_, err = runClarkCommand("claim", "--password", utils.Password)
|
||||
_, err = runClarkCommand("settle", "--password", utils.Password)
|
||||
require.NoError(t, err)
|
||||
|
||||
time.Sleep(3 * time.Second)
|
||||
@@ -155,11 +155,6 @@ func TestCollaborativeExit(t *testing.T) {
|
||||
|
||||
time.Sleep(5 * time.Second)
|
||||
|
||||
_, err = runClarkCommand("claim", "--password", utils.Password)
|
||||
require.NoError(t, err)
|
||||
|
||||
time.Sleep(3 * time.Second)
|
||||
|
||||
_, err = runClarkCommand("redeem", "--amount", "1000", "--address", redeemAddress, "--password", utils.Password)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
@@ -177,7 +172,7 @@ func TestReactToSpentVtxosRedemption(t *testing.T) {
|
||||
|
||||
time.Sleep(5 * time.Second)
|
||||
|
||||
_, err = client.Claim(ctx)
|
||||
_, err = client.Settle(ctx)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = client.SendOffChain(ctx, false, []arksdk.Receiver{arksdk.NewBitcoinReceiver(offchainAddress, 1000)})
|
||||
@@ -217,71 +212,105 @@ func TestReactToSpentVtxosRedemption(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestReactToAsyncSpentVtxosRedemption(t *testing.T) {
|
||||
t.Run("receiver claimed funds", func(t *testing.T) {
|
||||
ctx := context.Background()
|
||||
sdkClient, grpcClient := setupArkSDK(t)
|
||||
defer grpcClient.Close()
|
||||
ctx := context.Background()
|
||||
sdkClient, grpcClient := setupArkSDK(t)
|
||||
defer grpcClient.Close()
|
||||
|
||||
offchainAddress, boardingAddress, err := sdkClient.Receive(ctx)
|
||||
require.NoError(t, err)
|
||||
offchainAddress, boardingAddress, err := sdkClient.Receive(ctx)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = utils.RunCommand("nigiri", "faucet", boardingAddress)
|
||||
require.NoError(t, err)
|
||||
_, err = utils.RunCommand("nigiri", "faucet", boardingAddress)
|
||||
require.NoError(t, err)
|
||||
|
||||
time.Sleep(5 * time.Second)
|
||||
time.Sleep(5 * time.Second)
|
||||
|
||||
roundId, err := sdkClient.Claim(ctx)
|
||||
require.NoError(t, err)
|
||||
roundId, err := sdkClient.Settle(ctx)
|
||||
require.NoError(t, err)
|
||||
|
||||
err = utils.GenerateBlock()
|
||||
require.NoError(t, err)
|
||||
err = utils.GenerateBlock()
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = sdkClient.SendAsync(ctx, false, []arksdk.Receiver{arksdk.NewBitcoinReceiver(offchainAddress, 1000)})
|
||||
require.NoError(t, err)
|
||||
_, err = sdkClient.SendOffChain(ctx, false, []arksdk.Receiver{arksdk.NewBitcoinReceiver(offchainAddress, 1000)})
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = sdkClient.Claim(ctx)
|
||||
require.NoError(t, err)
|
||||
_, err = sdkClient.Settle(ctx)
|
||||
require.NoError(t, err)
|
||||
|
||||
time.Sleep(5 * time.Second)
|
||||
time.Sleep(5 * time.Second)
|
||||
|
||||
_, spentVtxos, err := sdkClient.ListVtxos(ctx)
|
||||
require.NoError(t, err)
|
||||
require.NotEmpty(t, spentVtxos)
|
||||
_, spentVtxos, err := sdkClient.ListVtxos(ctx)
|
||||
require.NoError(t, err)
|
||||
require.NotEmpty(t, spentVtxos)
|
||||
|
||||
var vtxo client.Vtxo
|
||||
var vtxo client.Vtxo
|
||||
|
||||
for _, v := range spentVtxos {
|
||||
if v.RoundTxid == roundId {
|
||||
vtxo = v
|
||||
break
|
||||
}
|
||||
for _, v := range spentVtxos {
|
||||
if v.RoundTxid == roundId {
|
||||
vtxo = v
|
||||
break
|
||||
}
|
||||
require.NotEmpty(t, vtxo)
|
||||
}
|
||||
require.NotEmpty(t, vtxo)
|
||||
|
||||
round, err := grpcClient.GetRound(ctx, vtxo.RoundTxid)
|
||||
round, err := grpcClient.GetRound(ctx, vtxo.RoundTxid)
|
||||
require.NoError(t, err)
|
||||
|
||||
expl := explorer.NewExplorer("http://localhost:3000", common.BitcoinRegTest)
|
||||
|
||||
branch, err := redemption.NewCovenantlessRedeemBranch(expl, round.Tree, vtxo)
|
||||
require.NoError(t, err)
|
||||
|
||||
txs, err := branch.RedeemPath()
|
||||
require.NoError(t, err)
|
||||
|
||||
for _, tx := range txs {
|
||||
_, err := expl.Broadcast(tx)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
|
||||
expl := explorer.NewExplorer("http://localhost:3000", common.BitcoinRegTest)
|
||||
// give time for the ASP to detect and process the fraud
|
||||
time.Sleep(50 * time.Second)
|
||||
|
||||
branch, err := redemption.NewCovenantlessRedeemBranch(expl, round.Tree, vtxo)
|
||||
require.NoError(t, err)
|
||||
balance, err := sdkClient.Balance(ctx, false)
|
||||
require.NoError(t, err)
|
||||
|
||||
txs, err := branch.RedeemPath()
|
||||
require.NoError(t, err)
|
||||
require.Empty(t, balance.OnchainBalance.LockedAmount)
|
||||
}
|
||||
|
||||
for _, tx := range txs {
|
||||
_, err := expl.Broadcast(tx)
|
||||
require.NoError(t, err)
|
||||
}
|
||||
func TestChainAsyncPayments(t *testing.T) {
|
||||
var receive utils.ArkReceive
|
||||
receiveStr, err := runClarkCommand("receive")
|
||||
require.NoError(t, err)
|
||||
|
||||
// give time for the ASP to detect and process the fraud
|
||||
time.Sleep(50 * time.Second)
|
||||
err = json.Unmarshal([]byte(receiveStr), &receive)
|
||||
require.NoError(t, err)
|
||||
|
||||
balance, err := sdkClient.Balance(ctx, false)
|
||||
require.NoError(t, err)
|
||||
_, err = utils.RunCommand("nigiri", "faucet", receive.Boarding)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Empty(t, balance.OnchainBalance.LockedAmount)
|
||||
})
|
||||
time.Sleep(5 * time.Second)
|
||||
|
||||
_, err = runClarkCommand("settle", "--password", utils.Password)
|
||||
require.NoError(t, err)
|
||||
|
||||
time.Sleep(3 * time.Second)
|
||||
|
||||
_, err = runClarkCommand("send", "--amount", "10000", "--to", receive.Offchain, "--password", utils.Password)
|
||||
require.NoError(t, err)
|
||||
|
||||
var balance utils.ArkBalance
|
||||
balanceStr, err := runClarkCommand("balance")
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, json.Unmarshal([]byte(balanceStr), &balance))
|
||||
require.NotZero(t, balance.Offchain.Total)
|
||||
|
||||
_, err = runClarkCommand("send", "--amount", "10000", "--to", receive.Offchain, "--password", utils.Password)
|
||||
require.NoError(t, err)
|
||||
|
||||
balanceStr, err = runClarkCommand("balance")
|
||||
require.NoError(t, err)
|
||||
require.NoError(t, json.Unmarshal([]byte(balanceStr), &balance))
|
||||
require.NotZero(t, balance.Offchain.Total)
|
||||
}
|
||||
|
||||
func TestAliceSeveralPaymentsToBob(t *testing.T) {
|
||||
@@ -300,9 +329,6 @@ func TestAliceSeveralPaymentsToBob(t *testing.T) {
|
||||
|
||||
time.Sleep(5 * time.Second)
|
||||
|
||||
_, err = alice.Claim(ctx)
|
||||
require.NoError(t, err)
|
||||
|
||||
bobAddress, _, err := bob.Receive(ctx)
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -315,12 +341,6 @@ func TestAliceSeveralPaymentsToBob(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
require.Len(t, bobVtxos, 1)
|
||||
|
||||
_, err = bob.Claim(ctx)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = alice.Claim(ctx)
|
||||
require.NoError(t, err)
|
||||
|
||||
_, err = alice.SendOffChain(ctx, false, []arksdk.Receiver{arksdk.NewBitcoinReceiver(bobAddress, 10000)})
|
||||
require.NoError(t, err)
|
||||
|
||||
@@ -339,7 +359,7 @@ func TestAliceSeveralPaymentsToBob(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
require.Len(t, bobVtxos, 3)
|
||||
|
||||
_, err = alice.SendAsync(ctx, false, []arksdk.Receiver{arksdk.NewBitcoinReceiver(bobAddress, 10000)})
|
||||
_, err = alice.SendOffChain(ctx, false, []arksdk.Receiver{arksdk.NewBitcoinReceiver(bobAddress, 10000)})
|
||||
require.NoError(t, err)
|
||||
|
||||
time.Sleep(2 * time.Second)
|
||||
@@ -348,9 +368,6 @@ func TestAliceSeveralPaymentsToBob(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
require.Len(t, bobVtxos, 4)
|
||||
|
||||
_, err = alice.Claim(ctx)
|
||||
require.NoError(t, err)
|
||||
|
||||
// bobVtxos should be unique
|
||||
uniqueVtxos := make(map[string]struct{})
|
||||
for _, v := range bobVtxos {
|
||||
@@ -358,9 +375,7 @@ func TestAliceSeveralPaymentsToBob(t *testing.T) {
|
||||
}
|
||||
require.Len(t, uniqueVtxos, 4)
|
||||
|
||||
_, err = bob.Claim(ctx)
|
||||
require.NoError(t, err)
|
||||
|
||||
}
|
||||
|
||||
func TestSweep(t *testing.T) {
|
||||
@@ -376,7 +391,7 @@ func TestSweep(t *testing.T) {
|
||||
|
||||
time.Sleep(5 * time.Second)
|
||||
|
||||
_, err = runClarkCommand("claim", "--password", utils.Password)
|
||||
_, err = runClarkCommand("settle", "--password", utils.Password)
|
||||
require.NoError(t, err)
|
||||
|
||||
time.Sleep(3 * time.Second)
|
||||
|
||||
Reference in New Issue
Block a user