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:
Louis Singer
2024-10-24 17:43:27 +02:00
committed by GitHub
parent b536a9e652
commit bcb2b2075f
41 changed files with 1103 additions and 1390 deletions

View File

@@ -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)

View File

@@ -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)