diff --git a/asset/asset.go b/asset/asset.go index 4a20723fc..9a705a68b 100644 --- a/asset/asset.go +++ b/asset/asset.go @@ -2168,3 +2168,39 @@ func FromAltLeaves(leaves []AltLeaf[Asset]) []*Asset { return l.(*Asset) }) } + +// CollectSTXO returns the assets spent by the given output asset in the form of +// a minimal assets that can be used to create an STXO commitment. +func CollectSTXO(outAsset *Asset) ([]AltLeaf[Asset], error) { + // Genesis assets have no input asset, so they should have an empty + // STXO tree. Split leaves will also have a zero PrevID; we will use + // an empty STXO tree for them as well. + if !outAsset.IsTransferRoot() { + return nil, nil + } + + // At this point, the asset must have at least one witness. + if len(outAsset.PrevWitnesses) == 0 { + return nil, fmt.Errorf("asset has no witnesses") + } + + // We'll convert the PrevID of each witness into a minimal Asset, where + // the PrevID is the tweak for an un-spendable script key. + altLeaves := make([]*Asset, len(outAsset.PrevWitnesses)) + for idx, wit := range outAsset.PrevWitnesses { + if wit.PrevID == nil { + return nil, fmt.Errorf("witness %d has no prevID", idx) + } + + scriptKey := NewScriptKey(DeriveBurnKey(*wit.PrevID)) + altLeaf, err := NewAltLeaf(scriptKey, ScriptV0) + if err != nil { + return nil, fmt.Errorf("error creating altLeaf: %w", + err) + } + + altLeaves[idx] = altLeaf + } + + return ToAltLeaves(altLeaves), nil +} diff --git a/itest/assertions.go b/itest/assertions.go index d8e6afcfe..7b45d5169 100644 --- a/itest/assertions.go +++ b/itest/assertions.go @@ -566,10 +566,12 @@ func AssertProofAltLeaves(t *testing.T, tapClient taprpc.TaprootAssetsClient, // not. E.x. a passive asset created inside the freighter will not be // anchored with any alt leaves. altLeavesBytes := decodeResp.DecodedProof.AltLeaves - expectedAltLeaves, ok := leafMap[string(scriptKey)] - emptyAltLeaves := len(altLeavesBytes) == 0 + expectedAltLeaves := leafMap[string(scriptKey)] + emptyAltLeaves := len(expectedAltLeaves) == 0 - require.Equal(t, ok, !emptyAltLeaves) + // If we expect no alt leaves, there might be alt leaves in the proof, + // but that is from an asset that wasn't transferred just now. We don't + // need to check those alt leaves. if emptyAltLeaves { return } diff --git a/itest/psbt_test.go b/itest/psbt_test.go index 51c7f1c62..bf8d16146 100644 --- a/itest/psbt_test.go +++ b/itest/psbt_test.go @@ -13,6 +13,7 @@ import ( "github.com/btcsuite/btcd/btcutil/hdkeychain" "github.com/btcsuite/btcd/btcutil/psbt" "github.com/btcsuite/btcd/txscript" + "github.com/btcsuite/btcd/wire" "github.com/btcsuite/btcwallet/waddrmgr" "github.com/davecgh/go-spew/spew" "github.com/lightninglabs/taproot-assets/address" @@ -653,6 +654,35 @@ func runPsbtInteractiveFullValueSendTest(ctxt context.Context, t *harnessTest, ) require.NoError(t.t, err) + activeAsset, err := tappsbt.Decode(fundResp.FundedPsbt) + require.NoError(t.t, err) + + // We expect stxo alt leaves as well, so we'll create those to + // use in an assertion comparison later. + var stxoAltLeaves []*asset.Asset + for _, output := range activeAsset.Outputs { + if !output.Asset.IsTransferRoot() { + continue + } + + witnesses, err := output.PrevWitnesses() + require.NoError(t.t, err) + for _, wit := range witnesses { + prevIdKey := asset.DeriveBurnKey(*wit.PrevID) + scriptKey := asset.NewScriptKey(prevIdKey) + altLeaf, err := asset.NewAltLeaf( + scriptKey, asset.ScriptV0, + ) + require.NoError(t.t, err) + + stxoAltLeaves = append(stxoAltLeaves, altLeaf) + } + } + leafMap[string(receiverScriptKeyBytes)] = append( + leafMap[string(receiverScriptKeyBytes)], + stxoAltLeaves..., + ) + numOutputs := 1 amounts := []uint64{fullAmt} ConfirmAndAssertOutboundTransferWithOutputs( @@ -2486,6 +2516,175 @@ func testPsbtTrustlessSwap(t *harnessTest) { require.Equal(t.t, bobScriptKeyBytes, bobAssets.Assets[0].ScriptKey) } +// testPsbtSTXOExclusionProofs tests that we can properly send normal assets +// back and forth, using partial amounts, between nodes with the use of PSBTs, +// and that we see the expected STXO exclusion proofs. +func testPsbtSTXOExclusionProofs(t *harnessTest) { + // First, we'll make a normal asset with a bunch of units that we are + // going to send backand forth. We're also minting a passive asset that + // should remain where it is. + rpcAssets := MintAssetsConfirmBatch( + t.t, t.lndHarness.Miner().Client, t.tapd, + []*mintrpc.MintAssetRequest{ + simpleAssets[0], + // Our "passive" asset. + { + Asset: &mintrpc.MintAsset{ + AssetType: taprpc.AssetType_NORMAL, + Name: "itestbuxx-passive", + AssetMeta: &taprpc.AssetMeta{ + Data: []byte("some metadata"), + }, + Amount: 123, + }, + }, + }, + ) + + ctxb := context.Background() + ctxt, cancel := context.WithTimeout(ctxb, defaultWaitTimeout) + defer cancel() + + mintedAsset := rpcAssets[0] + genInfo := rpcAssets[0].AssetGenesis + var assetId asset.ID + copy(assetId[:], genInfo.AssetId) + + // Now that we have the asset created, we'll make a new node that'll + // serve as the node which'll receive the assets. + bobLnd := t.lndHarness.NewNodeWithCoins("Bob", nil) + bob := setupTapdHarness(t.t, t, bobLnd, t.universeServer) + defer func() { + require.NoError(t.t, bob.stop(!*noDelete)) + }() + + alice := t.tapd + + // We need to derive two keys, one for the new script key and + // one for the internal key. + bobScriptKey, bobAnchorIntKeyDesc := DeriveKeys(t.t, bob) + + var id [32]byte + copy(id[:], genInfo.AssetId) + sendAmt := uint64(2400) + + vPkt := tappsbt.ForInteractiveSend( + id, sendAmt, bobScriptKey, 0, 0, 0, + bobAnchorIntKeyDesc, asset.V0, chainParams, + ) + + // Next, we'll attempt to complete a transfer with PSBTs from + // alice to bob, using the partial amount. + fundResp := fundPacket(t, alice, vPkt) + signResp, err := alice.SignVirtualPsbt( + ctxt, &wrpc.SignVirtualPsbtRequest{ + FundedPsbt: fundResp.FundedPsbt, + }, + ) + require.NoError(t.t, err) + + // Now we'll attempt to complete the transfer. + sendResp, err := alice.AnchorVirtualPsbts( + ctxt, &wrpc.AnchorVirtualPsbtsRequest{ + VirtualPsbts: [][]byte{signResp.SignedPsbt}, + }, + ) + require.NoError(t.t, err) + + numOutputs := 2 + changeAmt := mintedAsset.Amount - sendAmt + ConfirmAndAssertOutboundTransferWithOutputs( + t.t, t.lndHarness.Miner().Client, alice, sendResp, + genInfo.AssetId, []uint64{changeAmt, sendAmt}, 0, 1, numOutputs, + ) + + // We want the proof of the change asset since that is the root asset. + aliceScriptKeyBytes := sendResp.Transfer.Outputs[0].ScriptKey + proofResp := exportProof( + t, alice, sendResp, aliceScriptKeyBytes, genInfo, + ) + proofFile, err := proof.DecodeFile(proofResp.RawProofFile) + require.NoError(t.t, err) + require.Equal(t.t, proofFile.NumProofs(), 2) + latestProof, err := proofFile.LastProof() + require.NoError(t.t, err) + + // This proof should contain the STXO exclusion proofs + stxoProofs := latestProof.ExclusionProofs[0].CommitmentProof.STXOProofs + require.NotNil(t.t, stxoProofs) + + // We expect a single exclusion proof for the change output, which is + // the input asset that we spent which should not be committed to in the + // other anchor output. + outpoint, err := wire.NewOutPointFromString( + mintedAsset.ChainAnchor.AnchorOutpoint, + ) + require.NoError(t.t, err) + + prevId := asset.PrevID{ + OutPoint: *outpoint, + ID: id, + ScriptKey: asset.SerializedKey(mintedAsset.ScriptKey), + } + + prevIdKey := asset.DeriveBurnKey(prevId) + expectedScriptKey := asset.NewScriptKey(prevIdKey) + + pubKey := expectedScriptKey.PubKey + identifier := asset.ToSerialized(pubKey) + + require.Len(t.t, stxoProofs, 1) + + // If we derive the identifier from the script key we expect of the + // minimal asset, it should yield a proof when used as a key for the + // stxoProofs. + require.NotNil(t.t, stxoProofs[identifier]) + + // Create the minimal asset for which we expect to see the STXO + // exclusion. + minAsset, err := asset.NewAltLeaf(expectedScriptKey, asset.ScriptV0) + require.NoError(t.t, err) + + // We need to copy the base exclusion proof for each STXO because we'll + // modify it with the specific asset and taproot proofs. + stxoProof := stxoProofs[identifier] + stxoExclProof := proof.MakeSTXOProof( + latestProof.ExclusionProofs[0], &stxoProof, + ) + + // Derive the possible taproot keys assuming the exclusion proof is + // correct. + derivedKeys, err := stxoExclProof.DeriveByAssetExclusion( + minAsset.AssetCommitmentKey(), + minAsset.TapCommitmentKey(), + ) + require.NoError(t.t, err) + + // Extract the actual taproot key from the anchor tx. + expectedTaprootKey, err := proof.ExtractTaprootKey( + &latestProof.AnchorTx, stxoExclProof.OutputIndex, + ) + require.NoError(t.t, err) + expectedKey := schnorr.SerializePubKey(expectedTaprootKey) + + // Convert the derived (possible) keys into their schnorr serialized + // counterparts. + serializedKeys := make([][]byte, 0, len(derivedKeys)) + for derivedKey := range derivedKeys { + serializedKeys = append( + serializedKeys, derivedKey.SchnorrSerialized(), + ) + } + + // The derived keys should contain the expected key. + require.Contains(t.t, serializedKeys, expectedKey) + + // This is an interactive transfer, so we do need to manually + // send the proof from the sender to the receiver. + bobScriptKeyBytes := bobScriptKey.PubKey.SerializeCompressed() + sendProof(t, alice, bob, sendResp, bobScriptKeyBytes, genInfo) +} + // testPsbtExternalCommit tests the ability to fully customize the BTC level of // an asset transfer using a PSBT. This exercises the CommitVirtualPsbts and // PublishAndLogTransfer RPCs. The test case moves some assets into an output diff --git a/itest/test_list_on_test.go b/itest/test_list_on_test.go index f478d2924..f3b6f407d 100644 --- a/itest/test_list_on_test.go +++ b/itest/test_list_on_test.go @@ -5,6 +5,10 @@ package itest import "github.com/lightninglabs/taproot-assets/proof" var testCases = []*testCase{ + { + name: "psbt stxo exclusion proofs", + test: testPsbtSTXOExclusionProofs, + }, { name: "mint assets", test: testMintAssets, diff --git a/proof/append.go b/proof/append.go index 2f879f823..90cf00c75 100644 --- a/proof/append.go +++ b/proof/append.go @@ -160,6 +160,49 @@ func CreateTransitionProof(prevOut wire.OutPoint, TapSiblingPreimage: params.TapscriptSibling, } + if proof.Asset.IsTransferRoot() { + stxoInclusionProofs := make( + map[asset.SerializedKey]commitment.Proof, + len(proof.Asset.PrevWitnesses), + ) + for _, wit := range proof.Asset.PrevWitnesses { + if wit.PrevID == nil { + return nil, fmt.Errorf("witness %v has no "+ + "prevID", wit) + } + + prevIdKey := asset.DeriveBurnKey(*wit.PrevID) + scriptKey := asset.NewScriptKey(prevIdKey) + spentAsset, err := asset.NewAltLeaf( + scriptKey, asset.ScriptV0, + ) + if err != nil { + return nil, fmt.Errorf("error creating "+ + "altLeaf: %w", err) + } + + // Generate an STXO inclusion proof for each prev + // witness. + _, stxoProof, err := params.TaprootAssetRoot.Proof( + asset.EmptyGenesisID, + spentAsset.AssetCommitmentKey(), + ) + if err != nil { + return nil, err + } + + keySerialized := asset.ToSerialized(scriptKey.PubKey) + stxoInclusionProofs[keySerialized] = *stxoProof + } + + if len(stxoInclusionProofs) == 0 { + return nil, fmt.Errorf("no stxo inclusion proofs") + } + + proof.InclusionProof.CommitmentProof.STXOProofs = + stxoInclusionProofs + } + // If the asset is a split asset, we also need to generate MS-SMT // inclusion proofs that prove the existence of the split root asset. if proof.Asset.HasSplitCommitmentWitness() { diff --git a/proof/append_test.go b/proof/append_test.go index 23cf4cea5..63948a758 100644 --- a/proof/append_test.go +++ b/proof/append_test.go @@ -71,7 +71,7 @@ func TestAppendTransition(t *testing.T) { withBip86Change: true, }, { - name: "normal with change", + name: "normal with change (with split)", assetType: asset.Normal, amt: 100, withSplit: true, @@ -135,6 +135,16 @@ func runAppendTransitionTest(t *testing.T, assetType asset.Type, amt uint64, // Add some alt leaves to the commitment anchoring the asset transfer. altLeaves := asset.ToAltLeaves(asset.RandAltLeaves(t, true)) + + // Commit to the stxo of the previous asset. Otherwise, the inclusion + // proofs will fail. + prevIdKey := asset.DeriveBurnKey(*newAsset.PrevWitnesses[0].PrevID) + scriptKey := asset.NewScriptKey(prevIdKey) + stxoAsset, err := asset.NewAltLeaf(scriptKey, asset.ScriptV0) + require.NoError(t, err) + + stxoLeaf := asset.ToAltLeaves([]*asset.Asset{stxoAsset}) + altLeaves = append(altLeaves, stxoLeaf...) err = tapCommitment.MergeAltLeaves(altLeaves) require.NoError(t, err) @@ -293,8 +303,19 @@ func runAppendTransitionTest(t *testing.T, assetType asset.Type, amt uint64, nil, split1Commitment, ) require.NoError(t, err) + + // Commit to the stxo of the previous asset. Otherwise, the inclusion + // proofs will fail. With splits this is only needed for the root asset. + prevIdKey1 := asset.DeriveBurnKey(*split1Asset.PrevWitnesses[0].PrevID) + scriptKey1 := asset.NewScriptKey(prevIdKey1) + stxoAsset1, err := asset.NewAltLeaf(scriptKey1, asset.ScriptV0) + require.NoError(t, err) + + stxoLeaf1 := asset.ToAltLeaves([]*asset.Asset{stxoAsset1}) + split1AltLeaves = append(split1AltLeaves, stxoLeaf1...) err = tap1Commitment.MergeAltLeaves(split1AltLeaves) require.NoError(t, err) + tap2Commitment, err := commitment.NewTapCommitment( nil, split2Commitment, ) diff --git a/proof/encoding.go b/proof/encoding.go index cb5bcbda0..1f94737c7 100644 --- a/proof/encoding.go +++ b/proof/encoding.go @@ -11,6 +11,7 @@ import ( "github.com/btcsuite/btcd/btcec/v2" "github.com/btcsuite/btcd/wire" "github.com/lightninglabs/taproot-assets/asset" + "github.com/lightninglabs/taproot-assets/commitment" "github.com/lightninglabs/taproot-assets/fn" "github.com/lightningnetwork/lnd/tlv" ) @@ -346,6 +347,102 @@ func CommitmentProofDecoder(r io.Reader, val any, buf *[8]byte, l uint64) error return tlv.NewTypeForEncodingErr(val, "*CommitmentProof") } +func CommitmentProofsEncoder(w io.Writer, val any, buf *[8]byte) error { + if t, ok := val.(*map[asset.SerializedKey]commitment.Proof); ok { + numProofs := uint64(len(*t)) + if err := tlv.WriteVarInt(w, numProofs, buf); err != nil { + return err + } + + var proofBuf bytes.Buffer + for key, proof := range *t { + var keyBytes [33]byte + copy(keyBytes[:], key[:]) + + err := tlv.EBytes33(w, &keyBytes, buf) + if err != nil { + return err + } + + if err := proof.Encode(&proofBuf); err != nil { + return err + } + + proofBytes := proofBuf.Bytes() + err = asset.InlineVarBytesEncoder(w, &proofBytes, buf) + if err != nil { + return err + } + + proofBuf.Reset() + } + return nil + } + + return tlv.NewTypeForEncodingErr( + val, "map[asset.SerializedKey]CommitmentProof", + ) +} + +func CommitmentProofsDecoder(r io.Reader, val any, buf *[8]byte, + _ uint64) error { + + if typ, ok := val.(*map[asset.SerializedKey]commitment.Proof); ok { + numProofs, err := tlv.ReadVarInt(r, buf) + if err != nil { + return err + } + + // Avoid OOM by limiting the number of commitment proofs we + // accept. + if numProofs > MaxNumTaprootProofs { + return fmt.Errorf("%w: too many commitment proofs", + ErrProofInvalid) + } + + proofs := make( + map[asset.SerializedKey]commitment.Proof, numProofs, + ) + for i := uint64(0); i < numProofs; i++ { + var keyBytes [33]byte + + err := tlv.DBytes33( + r, &keyBytes, buf, + btcec.PubKeyBytesLenCompressed, + ) + if err != nil { + return err + } + + var proofBytes []byte + err = asset.InlineVarBytesDecoder( + r, &proofBytes, buf, MaxTaprootProofSizeBytes, + ) + if err != nil { + return err + } + + var key asset.SerializedKey + copy(key[:], keyBytes[:]) + + var proof commitment.Proof + err = proof.Decode(bytes.NewReader(proofBytes)) + if err != nil { + return err + } + + proofs[key] = proof + } + + *typ = proofs + return nil + } + + return tlv.NewTypeForEncodingErr( + val, "map[asset.SerializedKey]CommitmentProof", + ) +} + func TapscriptProofEncoder(w io.Writer, val any, buf *[8]byte) error { if t, ok := val.(**TapscriptProof); ok { return (*t).Encode(w) diff --git a/proof/encoding_test.go b/proof/encoding_test.go new file mode 100644 index 000000000..f797b31ef --- /dev/null +++ b/proof/encoding_test.go @@ -0,0 +1,89 @@ +package proof + +import ( + "bytes" + "testing" + + "github.com/lightninglabs/taproot-assets/asset" + "github.com/lightninglabs/taproot-assets/commitment" + "github.com/lightninglabs/taproot-assets/internal/test" + "github.com/stretchr/testify/require" +) + +func TestCommitmentProofsDecoderRoundTrip(t *testing.T) { + t.Parallel() + + testBlocks := readTestData(t) + oddTxBlock := testBlocks[0] + + numProofs := 4 + proofs := make(map[asset.SerializedKey]commitment.Proof, numProofs) + for range numProofs { + genesis := asset.RandGenesis(t, asset.Collectible) + scriptKey := test.RandPubKey(t) + randProof := RandProof(t, genesis, scriptKey, oddTxBlock, 0, 1) + randCommitmentProof := randProof.InclusionProof.CommitmentProof + serializedKey := asset.SerializedKey( + test.RandPubKey(t).SerializeCompressed(), + ) + proofs[serializedKey] = randCommitmentProof.Proof + } + + var buf [8]byte + + // Helper function to encode a map of commitment proofs. + encodeProofs := func( + proofs map[asset.SerializedKey]commitment.Proof) []byte { + + var b bytes.Buffer + err := CommitmentProofsEncoder(&b, &proofs, &buf) + require.NoError(t, err) + return b.Bytes() + } + + // Helper function to decode a map of commitment proofs. + decodeProofs := func( + encoded []byte) map[asset.SerializedKey]commitment.Proof { + + var decodedProofs map[asset.SerializedKey]commitment.Proof + err := CommitmentProofsDecoder( + bytes.NewReader(encoded), &decodedProofs, &buf, + uint64(len(encoded)), + ) + require.NoError(t, err) + return decodedProofs + } + + // Test case: round trip encoding and decoding. + t.Run( + "encode and decode map of 4 random commitment proofs", + func(t *testing.T) { + // Encode the proofs. + encoded := encodeProofs(proofs) + + // Decode the proofs. + decodedProofs := decodeProofs(encoded) + + // Assert the decoded proofs match the original. + require.Equal(t, proofs, decodedProofs) + }, + ) + + // Test case: empty map. + t.Run( + "encode and decode empty map of commitment proofs", + func(t *testing.T) { + // Create an empty map of commitment emptyMap. + emptyMap := map[asset.SerializedKey]commitment.Proof{} + + // Encode the proofs. + encoded := encodeProofs(emptyMap) + + // Decode the proofs. + decodedMap := decodeProofs(encoded) + + // Assert the decoded proofs match the original. + require.Equal(t, emptyMap, decodedMap) + }, + ) +} diff --git a/proof/mint.go b/proof/mint.go index dfc85fdb9..a83e4c4f6 100644 --- a/proof/mint.go +++ b/proof/mint.go @@ -158,6 +158,23 @@ func (p *BaseProofParams) HaveInclusionProof(anchorOutputIndex uint32) bool { return p.OutputIndex == int(anchorOutputIndex) } +// HaveSTXOExclusionProof returns true if the inclusion proof is for the given +// anchor output index. +func (p *BaseProofParams) HaveSTXOExclusionProof( + anchorOutputIndex uint32) bool { + + for _, proof := range p.ExclusionProofs { + if proof.OutputIndex == anchorOutputIndex && + proof.CommitmentProof != nil && + len(proof.CommitmentProof.STXOProofs) > 0 { + + return true + } + } + + return false +} + // MintParams holds the set of chain level information needed to make a proof // file for the set of assets minted in a batch. type MintParams struct { @@ -289,6 +306,13 @@ func baseProof(params *BaseProofParams, prevOut wire.OutPoint) (*Proof, error) { InternalKey: params.InternalKey, } proof.ExclusionProofs = params.ExclusionProofs + + // We set the proof version to V1, which is the first version that + // supports STXO proofs for root transfer assets. A root transfer is an + // asset that is neither a genesis asset nor contains split commitment + // witness data. + proof.Version = TransitionV1 + return proof, nil } diff --git a/proof/mock.go b/proof/mock.go index 6a84d9c9e..240802233 100644 --- a/proof/mock.go +++ b/proof/mock.go @@ -578,6 +578,7 @@ func NewTestFromProof(t testing.TB, p *Proof) *TestProof { t.Helper() tp := &TestProof{ + Version: p.Version, PrevOut: p.PrevOut.String(), BlockHeader: NewTestFromBlockHeader(t, &p.BlockHeader), BlockHeight: p.BlockHeight, @@ -651,6 +652,7 @@ func NewTestFromProof(t testing.TB, p *Proof) *TestProof { } type TestProof struct { + Version TransitionVersion `json:"version"` PrevOut string `json:"prev_out"` BlockHeader *TestBlockHeader `json:"block_header"` BlockHeight uint32 `json:"block_height"` @@ -673,6 +675,7 @@ func (tp *TestProof) ToProof(t testing.TB) *Proof { t.Helper() p := &Proof{ + Version: tp.Version, PrevOut: test.ParseOutPoint(t, tp.PrevOut), BlockHeader: *tp.BlockHeader.ToBlockHeader(t), BlockHeight: tp.BlockHeight, @@ -872,14 +875,30 @@ func NewTestFromCommitmentProof(t testing.TB, TapscriptSibling: commitment.HexTapscriptSibling( t, p.TapSiblingPreimage, ), + STXOProofs: NewTestFromSTXOProofs(t, p), UnknownOddTypes: p.UnknownOddTypes, } } +func NewTestFromSTXOProofs(t testing.TB, + p *CommitmentProof) *map[string]commitment.TestProof { + + t.Helper() + + stxoProofs := make(map[string]commitment.TestProof) + for key, proof := range p.STXOProofs { + keyHex := hex.EncodeToString(key[:]) + stxoProofs[keyHex] = *commitment.NewTestFromProof(t, &proof) + } + return &stxoProofs +} + +// nolint: lll type TestCommitmentProof struct { - Proof *commitment.TestProof `json:"proof"` - TapscriptSibling string `json:"tapscript_sibling"` - UnknownOddTypes tlv.TypeMap `json:"unknown_odd_types"` + Proof *commitment.TestProof `json:"proof"` + TapscriptSibling string `json:"tapscript_sibling"` + STXOProofs *map[string]commitment.TestProof `json:"stxo_proofs"` + UnknownOddTypes tlv.TypeMap `json:"unknown_odd_types"` } func (tcp *TestCommitmentProof) ToCommitmentProof( @@ -887,13 +906,27 @@ func (tcp *TestCommitmentProof) ToCommitmentProof( t.Helper() - return &CommitmentProof{ + stxoProofs := make(map[asset.SerializedKey]commitment.Proof) + for key, proof := range *tcp.STXOProofs { + keyBytes, err := hex.DecodeString(key) + require.NoError(t, err) + key := asset.SerializedKey(keyBytes) + stxoProofs[key] = *proof.ToProof(t) + } + + cp := &CommitmentProof{ Proof: *tcp.Proof.ToProof(t), TapSiblingPreimage: commitment.ParseTapscriptSibling( t, tcp.TapscriptSibling, ), UnknownOddTypes: tcp.UnknownOddTypes, } + + if len(stxoProofs) > 0 { + cp.STXOProofs = stxoProofs + } + + return cp } func NewTestFromTapscriptProof(t testing.TB, diff --git a/proof/proof.go b/proof/proof.go index 3de05cf46..be0e472ae 100644 --- a/proof/proof.go +++ b/proof/proof.go @@ -228,6 +228,10 @@ type TransitionVersion uint32 const ( // TransitionV0 is the first version of the state transition proof. TransitionV0 TransitionVersion = 0 + + // TransitionV1 is the second version of the state transition proof. + // This version added STXO inclusion and exclusion proofs. + TransitionV1 TransitionVersion = 1 ) // Proof encodes all of the data necessary to prove a valid state transition for @@ -494,11 +498,18 @@ func (p *Proof) IsUnknownVersion() bool { switch p.Version { case TransitionV0: return false + case TransitionV1: + return false default: return true } } +// IsVersionV1 returns true if the proof is of version V1. +func (p *Proof) IsVersionV1() bool { + return p.Version == TransitionV1 +} + // ToChainAsset converts the proof to a ChainAsset. func (p *Proof) ToChainAsset() (asset.ChainAsset, error) { emptyAsset := asset.ChainAsset{} diff --git a/proof/records.go b/proof/records.go index 4a882f719..ee8302cca 100644 --- a/proof/records.go +++ b/proof/records.go @@ -40,6 +40,10 @@ const ( // count from where commitment.ProofTaprootAssetProofType left off. CommitmentProofTapSiblingPreimageType tlv.Type = 5 + // CommitmentProofSTXOProofsType is the type of the TLV record for the + // Exclusion proof CommitmentProof's STXOProofs field. + CommitmentProofSTXOProofsType tlv.Type = 7 + TapscriptProofTapPreimage1 tlv.Type = 1 TapscriptProofTapPreimage2 tlv.Type = 3 TapscriptProofBip86 tlv.Type = 4 @@ -74,7 +78,7 @@ var KnownTaprootProofTypes = fn.NewSet( // tests. var KnownCommitmentProofTypes = fn.NewSet( commitment.ProofAssetProofType, commitment.ProofTaprootAssetProofType, - CommitmentProofTapSiblingPreimageType, + CommitmentProofTapSiblingPreimageType, CommitmentProofSTXOProofsType, ) // KnownTapscriptProofTypes is a set of all known Tapscript proof TLV types. @@ -288,6 +292,26 @@ func CommitmentProofTapSiblingPreimageRecord( ) } +func CommitmentProofSTXOProofsRecord( + stxoProofs *map[asset.SerializedKey]commitment.Proof) tlv.Record { + + sizeFunc := func() uint64 { + var buf bytes.Buffer + err := CommitmentProofsEncoder( + &buf, stxoProofs, &[8]byte{}, + ) + if err != nil { + panic(err) + } + return uint64(len(buf.Bytes())) + } + return tlv.MakeDynamicRecord( + CommitmentProofSTXOProofsType, stxoProofs, sizeFunc, + CommitmentProofsEncoder, + CommitmentProofsDecoder, + ) +} + func TapscriptProofTapPreimage1Record( preimage **commitment.TapscriptPreimage) tlv.Record { diff --git a/proof/taproot.go b/proof/taproot.go index 721dfe2e0..f690b5d47 100644 --- a/proof/taproot.go +++ b/proof/taproot.go @@ -38,6 +38,13 @@ type CommitmentProof struct { // at the tapscript root of the expected output. TapSiblingPreimage *commitment.TapscriptPreimage + // STXOProofs is a list of proofs that either prove the spend of the + // inputs as referenced in the asset's previous witnesses' prevIDs when + // this is in an inclusion proof, or the non-spend of an input if this + // is in an exclusion proof. Only the root assets in a transfer (so no + // minted or split assets) will have STXO inclusion or exclusion proofs. + STXOProofs map[asset.SerializedKey]commitment.Proof + // UnknownOddTypes is a map of unknown odd types that were encountered // during decoding. This map is used to preserve unknown types that we // don't know of yet, so we can still encode them back when serializing. @@ -57,6 +64,11 @@ func (p CommitmentProof) EncodeRecords() []tlv.Record { ), ) } + if len(p.STXOProofs) > 0 { + records = append(records, CommitmentProofSTXOProofsRecord( + &p.STXOProofs, + )) + } // Add any unknown odd types that were encountered during decoding. return asset.CombineRecords(records, p.UnknownOddTypes) @@ -65,10 +77,14 @@ func (p CommitmentProof) EncodeRecords() []tlv.Record { // DecodeRecords returns the decoding records for the CommitmentProof. func (p *CommitmentProof) DecodeRecords() []tlv.Record { records := p.Proof.DecodeRecords() - return append( + records = append( records, CommitmentProofTapSiblingPreimageRecord(&p.TapSiblingPreimage), ) + return append( + records, + CommitmentProofSTXOProofsRecord(&p.STXOProofs), + ) } // Encode attempts to encode the CommitmentProof into the passed io.Writer. diff --git a/proof/testdata/ownership-proof.hex b/proof/testdata/ownership-proof.hex index 9900a37fc..634be3567 100644 --- a/proof/testdata/ownership-proof.hex +++ b/proof/testdata/ownership-proof.hex @@ -1 +1 @@ -5441505000040000000002244146fded5052d4d6666f2e3aad153de175f0300335eeef1d1796ddf8771b8e9b00000001045000004020f8b7cdd6f9d28ace33ce0a4065f92d7de9f4b73be10818d27f116530d316326ea8cbe7ba88ec8404872776918c153ee13d777c05c8b3da03cf4be76d8a56b12748725367ffff7f200000000006fd018c020000000001024146fded5052d4d6666f2e3aad153de175f0300335eeef1d1796ddf8771b8e9b0100000000000000007a6aed31fe675df9f3cbb30ec93c6aa64c0357ee95e041b68209dd0405126ea100000000000000000003e803000000000000225120b39d40166eab936be97ba489bd3e0b804fbd3c405b6b4dd853a7ecd645c7b8c9e803000000000000225120c439941c12ce99347f4a629a938835f2cdd7cc2646da97f18c52b4f17a18b0f4a9d0f505000000002251208ea64fa1adc917b9a9f7b6f4d671faa71a3ce538e4d22f2bc7696b2228448a2801400a89ab38452e2851d9b8a8faa24078d5517588fa2c857a2b4be65c0ac56631771139a245721a0b70e75e0c33a6eec16ee1d540c00489c8321569edc4e0d3e57f02473044022053b3677ee4a83b5b64d25f6c9f6d03a6678f2daeecad0966b7f1bfcb43f86b6a022041be57f3ca6ce364e28ae4991633ba9a4198f2a8ecd4489e4e1998cd447d8ff3012102dd95677d998373268ea2e0fd1a9bdd62e74eaee0db36ae080957c8f4732448c400000000082201568673ad5cad10893ce5f16f5943297a3a5d3d0e669ea3a337a32654c7533125000afd02b400010002590028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000f66697273742d6974657374627578788d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea00000000000401000603fd02580bfd022301fd021f0165000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fd01b44a000171eba4c1f1a64d5342c68cfcfce96a3332c936824f676cc047db8c79bf24f8ba0000000000000258ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffd016600010002590028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000f66697273742d6974657374627578788d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea00000000000401000603fd02580bad01ab01654146fded5052d4d6666f2e3aad153de175f0300335eeef1d1796ddf8771b8e9b00000001898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd002e2356b87d6435363aaa7a763eeeb3818000527783c0c4ed72999a4853ef2a23b0342014062f411bf03948cb3ca8a887a6449b1b99f93458e1c2f837ec20c7759461ad433bdeb43fc3abf29cde2cb2680e3f1c7a5ac60dc5833042ed31067f80c57b285370d2894c638977dfebc6426564611a74aedddb57c7664e9278213cfcce97de38733f000000000000004b00e02000010210273567b487064507c8bb16c912e8ec608bf09f2d461a89bfe63c37a7b3fdd21fa0e020000102102550807e261f1add28272dd1dc99979f7bb0e87982c296d52d7b58fba2c1a68e40c9f0004000000010221026f8944cb3cc0e077dedfbe312cbe6071861bec5cdc055ff6fe7fe26f5a5b8357037401490001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd004220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0df802c70004000000000221028d87ba784f1639cb7d85f0d1f79e3a0f36a32b745aa84ef5e175aee24ab4631f039c01710001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0044a00014c598c9376185fd1dfb86659a5c3675bab19595cf1abf5a1cc7b7dc887d607cf0000000000000258fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2e0004000000020221027e12e36f36b1b39f15cf888cc4ec443dea1f07082fb35ea2f2d170c782687e7305030401010f9f0004000000000221028d87ba784f1639cb7d85f0d1f79e3a0f36a32b745aa84ef5e175aee24ab4631f037401490001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd004220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff154201405a9d3325ceddab77bbb43583930ab428d76c89b11b3af6fe4e97daee4c4eb34422c1d8e9e67bfde1d3b1a8bfeb8ec7e458ffe0e4f8b9f2faf1ad946e43b6a9ec1604000001be \ No newline at end of file +5441505000040000000102247927994f88ab2a772d7596b9399334e10f421cabd4983d5132f816c9e3e9afd300000001045000004020bad2d2efe51230fa85abc90d209ded6ce7da9fe9ee11cac5bf977f26893bfc0846c87534ea250a21b51d97f5229d703b0652f4d9d34d3b46659a48916fbb9a637b171b68ffff7f200000000006fd018c020000000001027927994f88ab2a772d7596b9399334e10f421cabd4983d5132f816c9e3e9afd3010000000000000000840cb35380def99e176c847593a130130503c99077b9368b50364cb98eeefa8f00000000000000000003e803000000000000225120ab81d41661f2b8a3401f8d9303279e3021686979f3aa0e2d327a5f6dcfdae5dae803000000000000225120093ddfcb23ee2396d3d7c9797ba2d14190298362fb1f49afff253045b313e9aba0cff50500000000225120029597d98d911f027a053603674eb4b0775a184437f71611bfc6a934075fee6701400995f52d1eb51781d5ea32d6ed68b9de997e11573e1ade6b32378159637417021ae54061ba7c92cdbcc75c5688991d69fb0d1290ceb6d6346ecd06efd2a1aef802473044022047b887847dc08ecf0d2f0ffe3dbfc640a29941c89e5a2fbece78ce52622c898a02204e05575f33e8225de0b693d276b1fe69d66404f327da0b32fb7176d7f8e2a4c401210264d6a3866048257a98bd8f0b031a6d0a6fb04d2978b3991bb07a1c679bce82ca00000000082201e4beddeba4be0aa62b7354a28fad8b0a832206ff5d70df40dd355050453d72aa000afd02b400010002594b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d2149686039000000000f66697273742d6974657374627578782903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb200000000000401000603fd02580bfd022301fd021f0165000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fd01b44a000104ff34d7602b93f4de90c950cabc0786041ca8ea181874b7a62a1853bd2fc26b0000000000000258ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffd016600010002594b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d2149686039000000000f66697273742d6974657374627578782903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb200000000000401000603fd02580bad01ab01657927994f88ab2a772d7596b9399334e10f421cabd4983d5132f816c9e3e9afd3000000018b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982702e64ca3dd8dab4edaeff6c1e40f321e4d711821427719dfa35927e472a3147a660342014089e2b3dfa864dcc4e6f431ea5a02fa8f75fdd4d5e5afc39b35fa9f99196cc2170a3c59b18d804917d6e6483605a2be43d1a492e3e044a2e486ff2378d64767390d284959b54e380d3cf0060dc2f243591ed4e573fe20d58ac16c0083f672b728955000000000000004b00e02000010210237917fdd78c0170e0c84d8c7094e675614ec9779e7ba480bbadfd4f6e5395b840e0200001021022f116a38175b27e2dbb6a1cd809086e1a30c73e116831d41df2f4d1b825539ab0c9f000400000001022103816d48eb51bc220f7bd1234c439f8a8701e582784a79bf25721dba4979526f5f0374014900010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982704220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0dfd012002ef000400000000022102f3539c14a7f7edb9969a39b47a49bf25b40e159845b3640669be51ead2e0eb3603c4017100010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827044a000166f3036b2d11969be7909bd31a463b2dd164b7e8b8c3a031732b0369754d505b0000000000000258ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f024f000102024a000143891c4822d4efc0702e21b8769d503d8ff1c852ec538e34f89172f57a0a31080000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f2e000400000002022102b8ef3ea2e4de049f54a367c99dcd6ea4767fb440899b8d6fea65f830f697f7af05030401010fc7000400000000022102f3539c14a7f7edb9969a39b47a49bf25b40e159845b3640669be51ead2e0eb36039c014900010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982704220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024f000102024a000143891c4822d4efc0702e21b8769d503d8ff1c852ec538e34f89172f57a0a31080000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f15420140fa1cbc3b168b9b76471b507702a2a39e41e044657e965e002a9af8b2f41096d99c0cf8b23962e73f76a760ca899f65540aa3a22deee573db426b98a03560db451604000001bc \ No newline at end of file diff --git a/proof/testdata/proof-file.hex b/proof/testdata/proof-file.hex index 1acc5e2d1..74a59e64d 100644 --- a/proof/testdata/proof-file.hex +++ b/proof/testdata/proof-file.hex @@ -1 +1 @@ -544150460000000003fd04095441505000040000000002240028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000450000040209a8faa84e2081e2407752e522ac9f156d01343a32cb404dd305c33fdd5e1353b9920869feb397a0b595e5055e617e641d608e88ac1ecb600d469f9262cd823bd47725367ffff7f200000000006f6020000000001010028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e4700000000000000000002e8030000000000002251201de5c42c8a8b746e8546333f77af17351aacab80ad69bccb38c80bce6e9b8bef5fd5f5050000000022512007138e14f350280a1d8ddee3269e63475c460ec569f92c4e0a8d4699bf41f4bb0247304402204f36d4142a0766b659ad3de205cd6f6b2ff9799d2ba9678150a3d1dbfc81d2f602201ea43dbfa55ab6d603b89aae66751b3c0c858d0b1982bd38403b29d95bdfdb1a0121022a00c959d98510b311dec09ad2214f1267edfdea434a491d33f837192617c364000000000822017663b78cc1cce4f4ed4025d08d9b168348af2cf162f4daf664b47d875a068b39000af800010002590028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000f66697273742d6974657374627578788d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea00000000000401000603fd05dc0b690167016500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0200001021025a5db7890fdd454db5d189d06880286b0d132c4709f1baee470a558276e3af5c0cc700040000000002210352a78f4268168a1219a30bb96ce37e5a73d6175a336947fa7376661667805e0a039c01490001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd004220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024f000102024a0001076553d07d1e80b22b6852656e98b3f090db89de729e0389bdd654050635ae4500000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf0d30012e000400000001022102773d842605766a0803e2ac601310b43cd2acbecd951a4910a915e8943e53ecb505030401011113000100020e69746573742d6d657461646174611604000001bb17590028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000f66697273742d6974657374627578788d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea000000000020332d7f9570213f0eaee3ef0117ef150993418974949e16be8fb97050ba91aafd07825441505000040000000002244cd8f1e992034416b45c969e89316eaaa700daf02f15147e8816bc31d339e22b00000000045000004020db037715a922e92846f09ce5db1842bd2e129cc887bbc3528e4e03deddb9d64de82bf7ef1762fe1e02548783fe4675636fbe6e76ac92535d3fd4a8fceefa36d447725367ffff7f200100000006fd018c020000000001024cd8f1e992034416b45c969e89316eaaa700daf02f15147e8816bc31d339e22b000000000000000000062736a1f2dbc0332040eafe375e4922ace3da94f88ada2ce397e7914014a32500000000000000000003e8030000000000002251203efafc563c1ffb16afc844abe35e48ea0303bf8b03753c640da1924f81b79408e8030000000000002251208eb3db333954f26aa1eacd5f057b60a32c59987e0226b58dc8debb033bdee3e6a9d0f50500000000225120f09fc5609b3c82f778d27fe3f8e9b88a10edcebc7c35864940049991bf4445650140b4622c62287ae87d96fffa7fd34f58708b0d1e6f4ae5a85fc6705781dd92711129d9cd0e3774fdb0fa048d3bbc559dd3d8d76b84d56928025ef24ba0b1940a7d02473044022006229b6e9c59a1c5d68ced672808f075382b3b5c5bf44eb1c9e993593d4807c102206667b3a902f71aab2ddbaafe2cef32f1bde17da6522444e87fe1fd50d5aa90f20121025d3b26142dcb90504cbfbbbf70d92fc7579198ffe9bf497a3bf2c55df892512600000000082201da05c3e7425eaccaf6bbd57fd73b12f5cd84c17807ba58b9570a5a53aa73eec2000afd02b400010002590028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000f66697273742d6974657374627578788d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea00000000000401000603fd04b00bfd022301fd021f0165000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fd01b44a00019f433ee26a1e6288bce58cbd0d77858201e55803f967db9e746197d059b1c422000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbffd016600010002590028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000f66697273742d6974657374627578788d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea00000000000401000603fd012c0bad01ab01654cd8f1e992034416b45c969e89316eaaa700daf02f15147e8816bc31d339e22b00000000898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0025a5db7890fdd454db5d189d06880286b0d132c4709f1baee470a558276e3af5c03420140db1a68629f9408fd95e5dbd819380435bbad52c66746baabcc037ef6076cf215ecab264159bbbd922ae57a4890599f657dacc5a09d56785f08f7adad54e974d10d28c96ba1c3534f04149b2480923fc13d0e55e5251c01610317d48e1f0e7b9d219500000000000005dc0e020000102102adc1cf482226b3c4d0fac399e97302f4d7260f4ba782cd9cfbdb3c7ce94cd1e40e020000102102e2356b87d6435363aaa7a763eeeb3818000527783c0c4ed72999a4853ef2a23b0c9f000400000001022103687c05eb0dade4141769314d1fe89ac712b1c6de66a228110189bd3b278f0fe9037401490001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd004220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0dfd012002ef000400000000022103f8a796072d4b2f087f67973504600feafc628eaf76359d319470b186d8ccea0a03c401710001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0044a00016201f1a088494f6a5b061a15c62c509b5a9f412bc067f6bb279c5597ea97cecf000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdf024f000102024a0001464f6165e2b5fc1660dcecb3c02aabbae36fa0426457c5d976fd6d073328e49400000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf2e0004000000020221026019f70d187fdb882da16113e08014f667d05980997df3abd39bb322801b834b05030401010fc7000400000000022103f8a796072d4b2f087f67973504600feafc628eaf76359d319470b186d8ccea0a039c01490001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd004220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024f000102024a0001464f6165e2b5fc1660dcecb3c02aabbae36fa0426457c5d976fd6d073328e49400000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf1604000001bca18b7515459f1db78d6285670ea55408f45c81effd6f3f6e62a72c316b191757fd07305441505000040000000002244146fded5052d4d6666f2e3aad153de175f0300335eeef1d1796ddf8771b8e9b00000001045000004020f8b7cdd6f9d28ace33ce0a4065f92d7de9f4b73be10818d27f116530d316326ea8cbe7ba88ec8404872776918c153ee13d777c05c8b3da03cf4be76d8a56b12748725367ffff7f200000000006fd018c020000000001024146fded5052d4d6666f2e3aad153de175f0300335eeef1d1796ddf8771b8e9b0100000000000000007a6aed31fe675df9f3cbb30ec93c6aa64c0357ee95e041b68209dd0405126ea100000000000000000003e803000000000000225120b39d40166eab936be97ba489bd3e0b804fbd3c405b6b4dd853a7ecd645c7b8c9e803000000000000225120c439941c12ce99347f4a629a938835f2cdd7cc2646da97f18c52b4f17a18b0f4a9d0f505000000002251208ea64fa1adc917b9a9f7b6f4d671faa71a3ce538e4d22f2bc7696b2228448a2801400a89ab38452e2851d9b8a8faa24078d5517588fa2c857a2b4be65c0ac56631771139a245721a0b70e75e0c33a6eec16ee1d540c00489c8321569edc4e0d3e57f02473044022053b3677ee4a83b5b64d25f6c9f6d03a6678f2daeecad0966b7f1bfcb43f86b6a022041be57f3ca6ce364e28ae4991633ba9a4198f2a8ecd4489e4e1998cd447d8ff3012102dd95677d998373268ea2e0fd1a9bdd62e74eaee0db36ae080957c8f4732448c400000000082201568673ad5cad10893ce5f16f5943297a3a5d3d0e669ea3a337a32654c7533125000afd02b400010002590028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000f66697273742d6974657374627578788d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea00000000000401000603fd02580bfd022301fd021f0165000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fd01b44a000171eba4c1f1a64d5342c68cfcfce96a3332c936824f676cc047db8c79bf24f8ba0000000000000258ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffd016600010002590028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000f66697273742d6974657374627578788d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea00000000000401000603fd02580bad01ab01654146fded5052d4d6666f2e3aad153de175f0300335eeef1d1796ddf8771b8e9b00000001898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd002e2356b87d6435363aaa7a763eeeb3818000527783c0c4ed72999a4853ef2a23b0342014062f411bf03948cb3ca8a887a6449b1b99f93458e1c2f837ec20c7759461ad433bdeb43fc3abf29cde2cb2680e3f1c7a5ac60dc5833042ed31067f80c57b285370d2894c638977dfebc6426564611a74aedddb57c7664e9278213cfcce97de38733f000000000000004b00e02000010210273567b487064507c8bb16c912e8ec608bf09f2d461a89bfe63c37a7b3fdd21fa0e020000102102550807e261f1add28272dd1dc99979f7bb0e87982c296d52d7b58fba2c1a68e40c9f0004000000010221026f8944cb3cc0e077dedfbe312cbe6071861bec5cdc055ff6fe7fe26f5a5b8357037401490001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd004220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0df802c70004000000000221028d87ba784f1639cb7d85f0d1f79e3a0f36a32b745aa84ef5e175aee24ab4631f039c01710001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0044a00014c598c9376185fd1dfb86659a5c3675bab19595cf1abf5a1cc7b7dc887d607cf0000000000000258fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2e0004000000020221027e12e36f36b1b39f15cf888cc4ec443dea1f07082fb35ea2f2d170c782687e7305030401010f9f0004000000000221028d87ba784f1639cb7d85f0d1f79e3a0f36a32b745aa84ef5e175aee24ab4631f037401490001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd004220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1604000001be41fe827f500d461fb8dc9853f215d2b035fd961b7a4b6c0cd63cdbd58b0c721a \ No newline at end of file +544150460000000003fd040f5441505000040000000102244b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d214968603900000000045000004020ebe7d064b7c1e2a01eb5735f80df5469cd6c55f14bc1485641edbbf95810933c3bcc6e9b36d6c86093fdbebc596b7be9bd04fdd323cf1fe1de59ae741073fab97b171b68ffff7f200000000006f6020000000001014b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d214968603900000000000000000002e8030000000000002251204c30c8bb3a1a3a5f55e1ebda4241d03193bc6c9154fdfd8d00f3435510861b7bbbd4f50500000000225120c2274fef4bd6ad7f5987436d79b3ba36372a68322d84c99ac29f7ebb6ca8112f0247304402207cdf34b4aeeff413ca928193f9fb2f4ddbb80bba0609c7c7a1246fae278cb08302202f0ae0dc7c966bb96b5523da324f78194bd02d74233161d290231abf1b9925780121033a1c7ae1018b60f5442d41901f5fff4b7edeb55ebe8320e70bdbdae19eacd3b600000000082201163d56141cba415dcb4b50d9649837117178dfd242682afe877f471c4d7e5f0c000af800010002594b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d2149686039000000000f66697273742d6974657374627578782903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb200000000000401000603fd05dc0b690167016500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0200001021023052b4c980baeba1526b3904e28473dbe8b3043b470c8e8a8bb331c62f9151370cc7000400000000022103ad9320aa0ee72927e3a5e86dcd01df24b73627f4abe2aa7ed45f631524c62dce039c014900010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982704220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024f000102024a0001e630f19c519c1d8785c7dbd04a7de8b2d651ae98ad2c3cd7e4dec8d95c3d2efa00000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0d30012e000400000001022102667ea48169e6d324b6cf160385647cb37289c7237f38b8e1b20695620200e79f05030401011119000100020e69746573742d6d657461646174610504000000001604000001b817594b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d2149686039000000000f66697273742d6974657374627578782903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb200000000006fd58176bce7e530f9e82bb332b1fe6ef2aee67d8ac82d7227400660732d12fffd07835441505000040000000102245e17a76d20d138e4c3705aacc1b738625fbb8888b8882bddf145ac5d6e0963f400000000045000004020d3ead2557733318c7c285048654872dfbef92c32f7e99675257092c2198160556d6e57e2a1e4230788d7698ecda42c95f379736728a264d43585f9bde39bf14f7b171b68ffff7f200000000006fd018d020000000001025e17a76d20d138e4c3705aacc1b738625fbb8888b8882bddf145ac5d6e0963f40000000000000000007ec13f2cadbacf5cd70dba6b9ca81c6031f9ca13a61ea015490c663ed26062de00000000000000000003e80300000000000022512066bad917311f886e3daad2314db2d57d7f7de247cad3f6894630698af12269b6e803000000000000225120268297537e4bc910a16f4da764c2b19ea9afcf1cdb284b702c6a88a4b4138b01a0cff505000000002251206f45635211bf49ccee0eba7b6fc333ba5cfcb26369592e689ddc38dd2720bfe80140161a318f5341fd9726932ea6a5153c1f12e9b55887e0d8b780251e66aedbe262cccf7b466c599c96c7b4a31055d333c71aeaa974beafd195a32e9fb18d55bbd502483045022100f230a8a247e4a81922a9a0c5601de898199f72fcb23976fd844b2485b3802fd902207ed47d48a2c4c9b80a899ee209888ba2d510d047398df4b9c1e08bee68545b77012102bc0b975ee15425e28f6f0f45c70006d88fe53332a8122941be26bdb0d5315d260000000008220162f34efb5c1a8b97a452a66ef7449cc4c0a75c0d72aeac578454ef99cb32c231000afd02b400010002594b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d2149686039000000000f66697273742d6974657374627578782903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb200000000000401000603fd04b00bfd022301fd021f0165000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fd01b44a00018da6fc4e296871e0358f5c1fc8bd25fc2cdc10239ed9348a0d12a917a5aef05f000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffd016600010002594b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d2149686039000000000f66697273742d6974657374627578782903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb200000000000401000603fd012c0bad01ab01655e17a76d20d138e4c3705aacc1b738625fbb8888b8882bddf145ac5d6e0963f4000000008b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827023052b4c980baeba1526b3904e28473dbe8b3043b470c8e8a8bb331c62f915137034201404790e7b5a859402602f0311be947807fe439e0db54bca2ffe900cf19913f8b027aa1a6252022c8185d1513fb6644d2949957cc8f80392cc96b4ce53036107e3b0d28cf4b64ddca9189e4a4ae95be04f3803a0bf94173ed89c5d4948a75c2b6eb76a200000000000005dc0e0200001021023c99cc00a4a984d2ca54650f7b84beced5694ca9cfcde797625b5897209a2f310e020000102102e64ca3dd8dab4edaeff6c1e40f321e4d711821427719dfa35927e472a3147a660c9f0004000000010221025471f8ec9a258c589bb3fd88034c26916e4610fe2891f56d089fe93f2097a3190374014900010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982704220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0dfd012002ef0004000000000221028eea48c8614c55e5da36a3c62f03721ae08b498b9944c1d698f7cc64a32a8ee903c4017100010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827044a000107cebd3d1c01550b10448b3467b26d05a60b17d4bdf0b479c7d7991f5d6e8c1a000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f024f000102024a0001dd257d24585d78435cda93f55fd3b0f95d8885af3aae9dea6d39f8284e1f9ce000000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f2e0004000000020221025138fa85569580f78cdbb9d602a7d1d0443f01fb3bf52ad62a4539db3d90024e05030401010fc70004000000000221028eea48c8614c55e5da36a3c62f03721ae08b498b9944c1d698f7cc64a32a8ee9039c014900010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982704220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024f000102024a0001dd257d24585d78435cda93f55fd3b0f95d8885af3aae9dea6d39f8284e1f9ce000000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f1604000001bacab7f3fc8c1fc53516d4e41a0f226316d8f017971dd471a7289df71796b45f1efd07825441505000040000000102247927994f88ab2a772d7596b9399334e10f421cabd4983d5132f816c9e3e9afd300000001045000004020bad2d2efe51230fa85abc90d209ded6ce7da9fe9ee11cac5bf977f26893bfc0846c87534ea250a21b51d97f5229d703b0652f4d9d34d3b46659a48916fbb9a637b171b68ffff7f200000000006fd018c020000000001027927994f88ab2a772d7596b9399334e10f421cabd4983d5132f816c9e3e9afd3010000000000000000840cb35380def99e176c847593a130130503c99077b9368b50364cb98eeefa8f00000000000000000003e803000000000000225120ab81d41661f2b8a3401f8d9303279e3021686979f3aa0e2d327a5f6dcfdae5dae803000000000000225120093ddfcb23ee2396d3d7c9797ba2d14190298362fb1f49afff253045b313e9aba0cff50500000000225120029597d98d911f027a053603674eb4b0775a184437f71611bfc6a934075fee6701400995f52d1eb51781d5ea32d6ed68b9de997e11573e1ade6b32378159637417021ae54061ba7c92cdbcc75c5688991d69fb0d1290ceb6d6346ecd06efd2a1aef802473044022047b887847dc08ecf0d2f0ffe3dbfc640a29941c89e5a2fbece78ce52622c898a02204e05575f33e8225de0b693d276b1fe69d66404f327da0b32fb7176d7f8e2a4c401210264d6a3866048257a98bd8f0b031a6d0a6fb04d2978b3991bb07a1c679bce82ca00000000082201e4beddeba4be0aa62b7354a28fad8b0a832206ff5d70df40dd355050453d72aa000afd02b400010002594b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d2149686039000000000f66697273742d6974657374627578782903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb200000000000401000603fd02580bfd022301fd021f0165000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fd01b44a000104ff34d7602b93f4de90c950cabc0786041ca8ea181874b7a62a1853bd2fc26b0000000000000258ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffd016600010002594b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d2149686039000000000f66697273742d6974657374627578782903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb200000000000401000603fd02580bad01ab01657927994f88ab2a772d7596b9399334e10f421cabd4983d5132f816c9e3e9afd3000000018b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982702e64ca3dd8dab4edaeff6c1e40f321e4d711821427719dfa35927e472a3147a660342014089e2b3dfa864dcc4e6f431ea5a02fa8f75fdd4d5e5afc39b35fa9f99196cc2170a3c59b18d804917d6e6483605a2be43d1a492e3e044a2e486ff2378d64767390d284959b54e380d3cf0060dc2f243591ed4e573fe20d58ac16c0083f672b728955000000000000004b00e02000010210237917fdd78c0170e0c84d8c7094e675614ec9779e7ba480bbadfd4f6e5395b840e0200001021022f116a38175b27e2dbb6a1cd809086e1a30c73e116831d41df2f4d1b825539ab0c9f000400000001022103816d48eb51bc220f7bd1234c439f8a8701e582784a79bf25721dba4979526f5f0374014900010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982704220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0dfd012002ef000400000000022102f3539c14a7f7edb9969a39b47a49bf25b40e159845b3640669be51ead2e0eb3603c4017100010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827044a000166f3036b2d11969be7909bd31a463b2dd164b7e8b8c3a031732b0369754d505b0000000000000258ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f024f000102024a000143891c4822d4efc0702e21b8769d503d8ff1c852ec538e34f89172f57a0a31080000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f2e000400000002022102b8ef3ea2e4de049f54a367c99dcd6ea4767fb440899b8d6fea65f830f697f7af05030401010fc7000400000000022102f3539c14a7f7edb9969a39b47a49bf25b40e159845b3640669be51ead2e0eb36039c014900010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982704220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024f000102024a000143891c4822d4efc0702e21b8769d503d8ff1c852ec538e34f89172f57a0a31080000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f1604000001bc5ecf8fba917ead114518abc8b71e24968f0aa97fe4eb72f1255225cc7f7752ca \ No newline at end of file diff --git a/proof/testdata/proof.hex b/proof/testdata/proof.hex index bc97c1b78..3c5d25221 100644 --- a/proof/testdata/proof.hex +++ b/proof/testdata/proof.hex @@ -1 +1 @@ -5441505000040000000002244cd8f1e992034416b45c969e89316eaaa700daf02f15147e8816bc31d339e22b000000000450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096e88000000000000000006fd018c020000000001024cd8f1e992034416b45c969e89316eaaa700daf02f15147e8816bc31d339e22b000000000000000000062736a1f2dbc0332040eafe375e4922ace3da94f88ada2ce397e7914014a32500000000000000000003e8030000000000002251203efafc563c1ffb16afc844abe35e48ea0303bf8b03753c640da1924f81b79408e8030000000000002251208eb3db333954f26aa1eacd5f057b60a32c59987e0226b58dc8debb033bdee3e6a9d0f50500000000225120f09fc5609b3c82f778d27fe3f8e9b88a10edcebc7c35864940049991bf4445650140b4622c62287ae87d96fffa7fd34f58708b0d1e6f4ae5a85fc6705781dd92711129d9cd0e3774fdb0fa048d3bbc559dd3d8d76b84d56928025ef24ba0b1940a7d02473044022006229b6e9c59a1c5d68ced672808f075382b3b5c5bf44eb1c9e993593d4807c102206667b3a902f71aab2ddbaafe2cef32f1bde17da6522444e87fe1fd50d5aa90f20121025d3b26142dcb90504cbfbbbf70d92fc7579198ffe9bf497a3bf2c55df8925126000000000801000afd016600010002590028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000f66697273742d6974657374627578788d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea00000000000401000603fd012c0bad01ab01654cd8f1e992034416b45c969e89316eaaa700daf02f15147e8816bc31d339e22b00000000898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0025a5db7890fdd454db5d189d06880286b0d132c4709f1baee470a558276e3af5c03420140db1a68629f9408fd95e5dbd819380435bbad52c66746baabcc037ef6076cf215ecab264159bbbd922ae57a4890599f657dacc5a09d56785f08f7adad54e974d10d28c96ba1c3534f04149b2480923fc13d0e55e5251c01610317d48e1f0e7b9d219500000000000005dc0e020000102102adc1cf482226b3c4d0fac399e97302f4d7260f4ba782cd9cfbdb3c7ce94cd1e40cc7000400000000022103f8a796072d4b2f087f67973504600feafc628eaf76359d319470b186d8ccea0a039c01490001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd004220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024f000102024a0001464f6165e2b5fc1660dcecb3c02aabbae36fa0426457c5d976fd6d073328e49400000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf0df802c7000400000001022103687c05eb0dade4141769314d1fe89ac712b1c6de66a228110189bd3b278f0fe9039c01710001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0044a0001b44d27361609c463ec20dfa02d1fd2c489254ad82c6385ea29521553f1754b4600000000000004b0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdf022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2e0004000000020221026019f70d187fdb882da16113e08014f667d05980997df3abd39bb322801b834b0503040101160400000000 \ No newline at end of file +5441505000040000000102245e17a76d20d138e4c3705aacc1b738625fbb8888b8882bddf145ac5d6e0963f4000000000450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096e88000000000000000006fd018d020000000001025e17a76d20d138e4c3705aacc1b738625fbb8888b8882bddf145ac5d6e0963f40000000000000000007ec13f2cadbacf5cd70dba6b9ca81c6031f9ca13a61ea015490c663ed26062de00000000000000000003e80300000000000022512066bad917311f886e3daad2314db2d57d7f7de247cad3f6894630698af12269b6e803000000000000225120268297537e4bc910a16f4da764c2b19ea9afcf1cdb284b702c6a88a4b4138b01a0cff505000000002251206f45635211bf49ccee0eba7b6fc333ba5cfcb26369592e689ddc38dd2720bfe80140161a318f5341fd9726932ea6a5153c1f12e9b55887e0d8b780251e66aedbe262cccf7b466c599c96c7b4a31055d333c71aeaa974beafd195a32e9fb18d55bbd502483045022100f230a8a247e4a81922a9a0c5601de898199f72fcb23976fd844b2485b3802fd902207ed47d48a2c4c9b80a899ee209888ba2d510d047398df4b9c1e08bee68545b77012102bc0b975ee15425e28f6f0f45c70006d88fe53332a8122941be26bdb0d5315d26000000000801000afd016600010002594b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d2149686039000000000f66697273742d6974657374627578782903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb200000000000401000603fd012c0bad01ab01655e17a76d20d138e4c3705aacc1b738625fbb8888b8882bddf145ac5d6e0963f4000000008b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827023052b4c980baeba1526b3904e28473dbe8b3043b470c8e8a8bb331c62f915137034201404790e7b5a859402602f0311be947807fe439e0db54bca2ffe900cf19913f8b027aa1a6252022c8185d1513fb6644d2949957cc8f80392cc96b4ce53036107e3b0d28cf4b64ddca9189e4a4ae95be04f3803a0bf94173ed89c5d4948a75c2b6eb76a200000000000005dc0e0200001021023c99cc00a4a984d2ca54650f7b84beced5694ca9cfcde797625b5897209a2f310cfd01dc0004000000000221028eea48c8614c55e5da36a3c62f03721ae08b498b9944c1d698f7cc64a32a8ee903fd01af014900010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982704220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024f000102024a0001dd257d24585d78435cda93f55fd3b0f95d8885af3aae9dea6d39f8284e1f9ce000000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f07fd010f0102959f8df7ef56034b5c0dae0bd63a3b7aa1faea64ea4340faa6ff01da07d494b8ec01710001000220c2e9e9c378d76e4a15b98b9658436444995a76affe04ffe4331ff029e0de1e69044a0001d945b5d10a4180842f074bea3e72800590775217c81ef101e7f1ae9416d796fd0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf0277000102027200029d957c5addbba823738ffa64c89923ed940f44236a5b5a05d6f2b40d1ea6a60500000000000007d0f5cd079bfab80034007fc1a404ca376e03d12f5e4110105908ce14a33526d3e8000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f0dfd017202fd013f0004000000010221025471f8ec9a258c589bb3fd88034c26916e4610fe2891f56d089fe93f2097a31903fd0112017100010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827044a0001840523eef74f6df205b594a28228dcf524160fcf916989ee835ce168ee2e139600000000000004b0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff07740102959f8df7ef56034b5c0dae0bd63a3b7aa1faea64ea4340faa6ff01da07d494b851024f000102024a0001270607f50d9a0a5cece2f05700cb2e46c48feb48282fac9d04380c4978e1382300000000000004b0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f2e0004000000020221025138fa85569580f78cdbb9d602a7d1d0443f01fb3bf52ad62a4539db3d90024e05030401011604000000001b5102270e0200001021026f123ec8bf2ba9e29e6a02147307468f3ff4ee395bc947afa198d335e3ebceeb270e020000102102959f8df7ef56034b5c0dae0bd63a3b7aa1faea64ea4340faa6ff01da07d494b8 \ No newline at end of file diff --git a/proof/testdata/proof_tlv_encoding_generated.json b/proof/testdata/proof_tlv_encoding_generated.json index 83a5dc669..4d0043443 100644 --- a/proof/testdata/proof_tlv_encoding_generated.json +++ b/proof/testdata/proof_tlv_encoding_generated.json @@ -2,6 +2,7 @@ "valid_test_cases": [ { "proof": { + "version": 0, "prev_out": "8d73ec3f2525632186845c95d4491d1b3a768b7c4e0b6804951aa42655d9b95f:2092150027", "block_header": { "version": 0, @@ -67,6 +68,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -148,6 +150,7 @@ }, { "proof": { + "version": 0, "prev_out": "cd36e9f7676678e7aa2d92faded7e41173fac825416fed825e117039374b7964:3197016449", "block_header": { "version": 0, @@ -213,6 +216,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -260,6 +264,7 @@ }, { "proof": { + "version": 0, "prev_out": "098047936c9c64b74e91e98b02c9173a0c2bf9fc6568bb5389421657ffb92d01:3276740653", "block_header": { "version": 0, @@ -325,6 +330,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "00c01876a914f6c97547d73156abb300ae059905c4acaadd09dd88", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -406,6 +412,7 @@ }, { "proof": { + "version": 0, "prev_out": "ba3a5aceec2c8aaaacfc5dc154086425fcd6090ec04ff5f26283efc6c65ca80d:2394154145", "block_header": { "version": 0, @@ -471,6 +478,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "016c2e4bb01e316abaaee288d69c06cc608cedefd6e1a06813786c4ec51b6e1d3868ba2662554025b18af167c2ab17cd720b0c46ac7bd5750800b93c0b26a4af43", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -518,6 +526,7 @@ }, { "proof": { + "version": 0, "prev_out": "3a7d712e166bdfbeaa0fe2f8c1fe0aedf1a6e222f59e3bdcdc02b390baf44754:1840451127", "block_header": { "version": 0, @@ -583,6 +592,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -647,6 +657,7 @@ }, { "proof": { + "version": 0, "prev_out": "4fbff2770eb58f0d25580a4f5ae17c02d5b55397b4926431624c583b0a7f2080:1409563238", "block_header": { "version": 0, @@ -712,6 +723,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -741,6 +753,7 @@ }, { "proof": { + "version": 0, "prev_out": "0efd7a84af6747c045d99121ebdd8f44c9ab40aaab031f765a41fc24541c3b6b:2955392992", "block_header": { "version": 0, @@ -806,6 +819,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "00c01876a914f6c97547d73156abb300ae059905c4acaadd09dd88", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -853,6 +867,7 @@ }, { "proof": { + "version": 0, "prev_out": "5c92e2b89ad1bdc176163dea42afc12d154eb95e8cca59939285764813883142:3818717915", "block_header": { "version": 0, @@ -918,6 +933,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "016c2e4bb01e316abaaee288d69c06cc608cedefd6e1a06813786c4ec51b6e1d3868ba2662554025b18af167c2ab17cd720b0c46ac7bd5750800b93c0b26a4af43", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -965,6 +981,7 @@ }, { "proof": { + "version": 0, "prev_out": "a14c5136fd600756ff805584aa5403510d6531e066191291a585e696d511e10f:1312193188", "block_header": { "version": 0, @@ -1030,6 +1047,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -1067,6 +1085,7 @@ }, { "proof": { + "version": 0, "prev_out": "dfc122306066091f323f491a95baf7d30e4b85439851da45809354827163240d:2200192249", "block_header": { "version": 0, @@ -1132,6 +1151,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -1187,6 +1207,7 @@ }, { "proof": { + "version": 0, "prev_out": "7de34688825d31521f73085cddf29420b53e139a8ecad480ca0d379b5bf1350c:4074289298", "block_header": { "version": 0, @@ -1252,6 +1273,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -1309,6 +1331,7 @@ }, { "proof": { + "version": 0, "prev_out": "42bb7a587d976edf598dd3a5962b00cb9f048fe6b5780b2194ba1cceb7074974:2992579926", "block_header": { "version": 0, @@ -1374,6 +1397,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -1465,6 +1489,7 @@ }, { "proof": { + "version": 0, "prev_out": "f52bfe55e280959e40fd3182a38aae50dc0977d1d2a8dee9e4b406ea6f9c6427:1573797138", "block_header": { "version": 0, @@ -1530,6 +1555,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -1587,6 +1613,7 @@ }, { "proof": { + "version": 0, "prev_out": "4ce6979ab1bc2dce1e8b8992f678e1bd4132c8f4a49a233fe5d74c1c45c2c834:3986124895", "block_header": { "version": 0, @@ -1652,6 +1679,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, diff --git a/proof/testdata/proof_tlv_encoding_regtest.json b/proof/testdata/proof_tlv_encoding_regtest.json index 59ea2c6ce..82cb5d81b 100644 --- a/proof/testdata/proof_tlv_encoding_regtest.json +++ b/proof/testdata/proof_tlv_encoding_regtest.json @@ -2,20 +2,21 @@ "valid_test_cases": [ { "proof": { - "prev_out": "473e0595de903c0ae6b627790bc1555a4a631e3a88d608603a28982c50ff2800:0", + "version": 1, + "prev_out": "39606849213d33394c4fc8d0b890852fd97963399a204419f760af2267375f4b:0", "block_header": { "version": 541065216, - "prev_block": "3b35e1d5fd335c30dd04b42ca34313d056f1c92a522e7507241e08e284aa8f9a", - "merkle_root": "bd23d82c26f969d400b6ecc18ae808d641e617e655505e590b7a39eb9f862099", - "timestamp": 1733521991, + "prev_block": "3c931058f9bbed415648c14bf1556ccd6954df805f73b51ea0e2c1b764d0e7eb", + "merkle_root": "b9fa731074ae59dee11fcf23d3fd04bde97b6b59bcbefd9360c8d6369b6ecc3b", + "timestamp": 1746605947, "bits": 545259519, "nonce": 0 }, - "block_height": 443, - "anchor_tx": "020000000001010028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e4700000000000000000002e8030000000000002251201de5c42c8a8b746e8546333f77af17351aacab80ad69bccb38c80bce6e9b8bef5fd5f5050000000022512007138e14f350280a1d8ddee3269e63475c460ec569f92c4e0a8d4699bf41f4bb0247304402204f36d4142a0766b659ad3de205cd6f6b2ff9799d2ba9678150a3d1dbfc81d2f602201ea43dbfa55ab6d603b89aae66751b3c0c858d0b1982bd38403b29d95bdfdb1a0121022a00c959d98510b311dec09ad2214f1267edfdea434a491d33f837192617c36400000000", + "block_height": 440, + "anchor_tx": "020000000001014b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d214968603900000000000000000002e8030000000000002251204c30c8bb3a1a3a5f55e1ebda4241d03193bc6c9154fdfd8d00f3435510861b7bbbd4f50500000000225120c2274fef4bd6ad7f5987436d79b3ba36372a68322d84c99ac29f7ebb6ca8112f0247304402207cdf34b4aeeff413ca928193f9fb2f4ddbb80bba0609c7c7a1246fae278cb08302202f0ae0dc7c966bb96b5523da324f78194bd02d74233161d290231abf1b9925780121033a1c7ae1018b60f5442d41901f5fff4b7edeb55ebe8320e70bdbdae19eacd3b600000000", "tx_merkle_proof": { "nodes": [ - "398b065a877db464f6daf462f12caf4883169b8dd02540edf4e4ccc18cb76376" + "0c5f7e4d1c477f87fe2a6842d2df787111379864d9504bcb5d41ba1c14563d16" ], "bits": [ false @@ -23,9 +24,9 @@ }, "asset": { "version": 0, - "genesis_first_prev_out": "473e0595de903c0ae6b627790bc1555a4a631e3a88d608603a28982c50ff2800:0", + "genesis_first_prev_out": "39606849213d33394c4fc8d0b890852fd97963399a204419f760af2267375f4b:0", "genesis_tag": "first-itestbuxx", - "genesis_meta_hash": "8d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea", + "genesis_meta_hash": "2903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb2", "genesis_output_index": 0, "genesis_type": 0, "amount": 1500, @@ -44,29 +45,30 @@ ], "split_commitment_root": null, "script_version": 0, - "script_key": "025a5db7890fdd454db5d189d06880286b0d132c4709f1baee470a558276e3af5c", + "script_key": "023052b4c980baeba1526b3904e28473dbe8b3043b470c8e8a8bb331c62f915137", "group_key": null, "unknown_odd_types": null }, "inclusion_proof": { "output_index": 0, - "internal_key": "0352a78f4268168a1219a30bb96ce37e5a73d6175a336947fa7376661667805e0a", + "internal_key": "03ad9320aa0ee72927e3a5e86dcd01df24b73627f4abe2aa7ed45f631524c62dce", "commitment_proof": { "proof": { "asset_proof": { "proof": "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "version": 0, - "tap_key": "898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0", + "tap_key": "8b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827", "unknown_odd_types": null }, "taproot_asset_proof": { - "proof": "0001076553d07d1e80b22b6852656e98b3f090db89de729e0389bdd654050635ae4500000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf", + "proof": "0001e630f19c519c1d8785c7dbd04a7de8b2d651ae98ad2c3cd7e4dec8d95c3d2efa00000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", "version": 2, "unknown_odd_types": null }, "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -75,7 +77,7 @@ "exclusion_proofs": [ { "output_index": 1, - "internal_key": "02773d842605766a0803e2ac601310b43cd2acbecd951a4910a915e8943e53ecb5", + "internal_key": "02667ea48169e6d324b6cf160385647cb37289c7237f38b8e1b20695620200e79f", "commitment_proof": null, "tapscript_proof": { "tap_preimage_1": "", @@ -90,14 +92,18 @@ "meta_reveal": { "type": 0, "data": "69746573742d6d65746164617461", + "decimal_display": 0, + "universe_commitments": null, + "canonical_universes": null, + "delegation_key": null, "unknown_odd_types": null }, "additional_inputs": null, "challenge_witness": null, "genesis_reveal": { - "first_prev_out": "473e0595de903c0ae6b627790bc1555a4a631e3a88d608603a28982c50ff2800:0", + "first_prev_out": "39606849213d33394c4fc8d0b890852fd97963399a204419f760af2267375f4b:0", "tag": "first-itestbuxx", - "meta_hash": "8d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea", + "meta_hash": "2903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb2", "output_index": 0, "type": 0 }, @@ -105,12 +111,13 @@ "alt_leaves": null, "unknown_odd_types": null }, - "expected": "5441505000040000000002240028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000450000040209a8faa84e2081e2407752e522ac9f156d01343a32cb404dd305c33fdd5e1353b9920869feb397a0b595e5055e617e641d608e88ac1ecb600d469f9262cd823bd47725367ffff7f200000000006f6020000000001010028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e4700000000000000000002e8030000000000002251201de5c42c8a8b746e8546333f77af17351aacab80ad69bccb38c80bce6e9b8bef5fd5f5050000000022512007138e14f350280a1d8ddee3269e63475c460ec569f92c4e0a8d4699bf41f4bb0247304402204f36d4142a0766b659ad3de205cd6f6b2ff9799d2ba9678150a3d1dbfc81d2f602201ea43dbfa55ab6d603b89aae66751b3c0c858d0b1982bd38403b29d95bdfdb1a0121022a00c959d98510b311dec09ad2214f1267edfdea434a491d33f837192617c364000000000822017663b78cc1cce4f4ed4025d08d9b168348af2cf162f4daf664b47d875a068b39000af800010002590028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000f66697273742d6974657374627578788d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea00000000000401000603fd05dc0b690167016500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0200001021025a5db7890fdd454db5d189d06880286b0d132c4709f1baee470a558276e3af5c0cc700040000000002210352a78f4268168a1219a30bb96ce37e5a73d6175a336947fa7376661667805e0a039c01490001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd004220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024f000102024a0001076553d07d1e80b22b6852656e98b3f090db89de729e0389bdd654050635ae4500000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf0d30012e000400000001022102773d842605766a0803e2ac601310b43cd2acbecd951a4910a915e8943e53ecb505030401011113000100020e69746573742d6d657461646174611604000001bb17590028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000f66697273742d6974657374627578788d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea0000000000", + "expected": "5441505000040000000102244b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d214968603900000000045000004020ebe7d064b7c1e2a01eb5735f80df5469cd6c55f14bc1485641edbbf95810933c3bcc6e9b36d6c86093fdbebc596b7be9bd04fdd323cf1fe1de59ae741073fab97b171b68ffff7f200000000006f6020000000001014b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d214968603900000000000000000002e8030000000000002251204c30c8bb3a1a3a5f55e1ebda4241d03193bc6c9154fdfd8d00f3435510861b7bbbd4f50500000000225120c2274fef4bd6ad7f5987436d79b3ba36372a68322d84c99ac29f7ebb6ca8112f0247304402207cdf34b4aeeff413ca928193f9fb2f4ddbb80bba0609c7c7a1246fae278cb08302202f0ae0dc7c966bb96b5523da324f78194bd02d74233161d290231abf1b9925780121033a1c7ae1018b60f5442d41901f5fff4b7edeb55ebe8320e70bdbdae19eacd3b600000000082201163d56141cba415dcb4b50d9649837117178dfd242682afe877f471c4d7e5f0c000af800010002594b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d2149686039000000000f66697273742d6974657374627578782903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb200000000000401000603fd05dc0b690167016500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0200001021023052b4c980baeba1526b3904e28473dbe8b3043b470c8e8a8bb331c62f9151370cc7000400000000022103ad9320aa0ee72927e3a5e86dcd01df24b73627f4abe2aa7ed45f631524c62dce039c014900010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982704220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024f000102024a0001e630f19c519c1d8785c7dbd04a7de8b2d651ae98ad2c3cd7e4dec8d95c3d2efa00000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0d30012e000400000001022102667ea48169e6d324b6cf160385647cb37289c7237f38b8e1b20695620200e79f05030401011119000100020e69746573742d6d657461646174610504000000001604000001b817594b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d2149686039000000000f66697273742d6974657374627578782903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb20000000000", "comment": "valid regtest genesis proof with meta reveal" }, { "proof": { - "prev_out": "2be239d331bc16887e14152ff0da00a7aa6e31899e965cb416440392e9f1d84c:0", + "version": 1, + "prev_out": "f463096e5dac45f1dd2b88b88888bb5f6238b7c1ac5a70c3e438d1206da7175e:0", "block_header": { "version": 0, "prev_block": "0000000000000000000000000000000000000000000000000000000000000000", @@ -120,16 +127,16 @@ "nonce": 0 }, "block_height": 0, - "anchor_tx": "020000000001024cd8f1e992034416b45c969e89316eaaa700daf02f15147e8816bc31d339e22b000000000000000000062736a1f2dbc0332040eafe375e4922ace3da94f88ada2ce397e7914014a32500000000000000000003e8030000000000002251203efafc563c1ffb16afc844abe35e48ea0303bf8b03753c640da1924f81b79408e8030000000000002251208eb3db333954f26aa1eacd5f057b60a32c59987e0226b58dc8debb033bdee3e6a9d0f50500000000225120f09fc5609b3c82f778d27fe3f8e9b88a10edcebc7c35864940049991bf4445650140b4622c62287ae87d96fffa7fd34f58708b0d1e6f4ae5a85fc6705781dd92711129d9cd0e3774fdb0fa048d3bbc559dd3d8d76b84d56928025ef24ba0b1940a7d02473044022006229b6e9c59a1c5d68ced672808f075382b3b5c5bf44eb1c9e993593d4807c102206667b3a902f71aab2ddbaafe2cef32f1bde17da6522444e87fe1fd50d5aa90f20121025d3b26142dcb90504cbfbbbf70d92fc7579198ffe9bf497a3bf2c55df892512600000000", + "anchor_tx": "020000000001025e17a76d20d138e4c3705aacc1b738625fbb8888b8882bddf145ac5d6e0963f40000000000000000007ec13f2cadbacf5cd70dba6b9ca81c6031f9ca13a61ea015490c663ed26062de00000000000000000003e80300000000000022512066bad917311f886e3daad2314db2d57d7f7de247cad3f6894630698af12269b6e803000000000000225120268297537e4bc910a16f4da764c2b19ea9afcf1cdb284b702c6a88a4b4138b01a0cff505000000002251206f45635211bf49ccee0eba7b6fc333ba5cfcb26369592e689ddc38dd2720bfe80140161a318f5341fd9726932ea6a5153c1f12e9b55887e0d8b780251e66aedbe262cccf7b466c599c96c7b4a31055d333c71aeaa974beafd195a32e9fb18d55bbd502483045022100f230a8a247e4a81922a9a0c5601de898199f72fcb23976fd844b2485b3802fd902207ed47d48a2c4c9b80a899ee209888ba2d510d047398df4b9c1e08bee68545b77012102bc0b975ee15425e28f6f0f45c70006d88fe53332a8122941be26bdb0d5315d2600000000", "tx_merkle_proof": { "nodes": [], "bits": [] }, "asset": { "version": 0, - "genesis_first_prev_out": "473e0595de903c0ae6b627790bc1555a4a631e3a88d608603a28982c50ff2800:0", + "genesis_first_prev_out": "39606849213d33394c4fc8d0b890852fd97963399a204419f760af2267375f4b:0", "genesis_tag": "first-itestbuxx", - "genesis_meta_hash": "8d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea", + "genesis_meta_hash": "2903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb2", "genesis_output_index": 0, "genesis_type": 0, "amount": 300, @@ -138,44 +145,60 @@ "prev_witnesses": [ { "prev_id": { - "out_point": "2be239d331bc16887e14152ff0da00a7aa6e31899e965cb416440392e9f1d84c:0", - "asset_id": "898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0", - "script_key": "025a5db7890fdd454db5d189d06880286b0d132c4709f1baee470a558276e3af5c" + "out_point": "f463096e5dac45f1dd2b88b88888bb5f6238b7c1ac5a70c3e438d1206da7175e:0", + "asset_id": "8b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827", + "script_key": "023052b4c980baeba1526b3904e28473dbe8b3043b470c8e8a8bb331c62f915137" }, "tx_witness": [ - "db1a68629f9408fd95e5dbd819380435bbad52c66746baabcc037ef6076cf215ecab264159bbbd922ae57a4890599f657dacc5a09d56785f08f7adad54e974d1" + "4790e7b5a859402602f0311be947807fe439e0db54bca2ffe900cf19913f8b027aa1a6252022c8185d1513fb6644d2949957cc8f80392cc96b4ce53036107e3b" ], "split_commitment": null } ], "split_commitment_root": { - "hash": "c96ba1c3534f04149b2480923fc13d0e55e5251c01610317d48e1f0e7b9d2195", + "hash": "cf4b64ddca9189e4a4ae95be04f3803a0bf94173ed89c5d4948a75c2b6eb76a2", "sum": "1500" }, "script_version": 0, - "script_key": "02adc1cf482226b3c4d0fac399e97302f4d7260f4ba782cd9cfbdb3c7ce94cd1e4", + "script_key": "023c99cc00a4a984d2ca54650f7b84beced5694ca9cfcde797625b5897209a2f31", "group_key": null, "unknown_odd_types": null }, "inclusion_proof": { "output_index": 0, - "internal_key": "03f8a796072d4b2f087f67973504600feafc628eaf76359d319470b186d8ccea0a", + "internal_key": "028eea48c8614c55e5da36a3c62f03721ae08b498b9944c1d698f7cc64a32a8ee9", "commitment_proof": { "proof": { "asset_proof": { "proof": "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "version": 0, - "tap_key": "898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0", + "tap_key": "8b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827", "unknown_odd_types": null }, "taproot_asset_proof": { - "proof": "0001464f6165e2b5fc1660dcecb3c02aabbae36fa0426457c5d976fd6d073328e49400000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf", + "proof": "0001dd257d24585d78435cda93f55fd3b0f95d8885af3aae9dea6d39f8284e1f9ce000000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", "version": 2, "unknown_odd_types": null }, "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": { + "02959f8df7ef56034b5c0dae0bd63a3b7aa1faea64ea4340faa6ff01da07d494b8": { + "asset_proof": { + "proof": "0001d945b5d10a4180842f074bea3e72800590775217c81ef101e7f1ae9416d796fd0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf", + "version": 0, + "tap_key": "c2e9e9c378d76e4a15b98b9658436444995a76affe04ffe4331ff029e0de1e69", + "unknown_odd_types": null + }, + "taproot_asset_proof": { + "proof": "00029d957c5addbba823738ffa64c89923ed940f44236a5b5a05d6f2b40d1ea6a60500000000000007d0f5cd079bfab80034007fc1a404ca376e03d12f5e4110105908ce14a33526d3e8000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f", + "version": 2, + "unknown_odd_types": null + }, + "unknown_odd_types": null + } + }, "unknown_odd_types": null }, "tapscript_proof": null, @@ -184,13 +207,13 @@ "exclusion_proofs": [ { "output_index": 1, - "internal_key": "03687c05eb0dade4141769314d1fe89ac712b1c6de66a228110189bd3b278f0fe9", + "internal_key": "025471f8ec9a258c589bb3fd88034c26916e4610fe2891f56d089fe93f2097a319", "commitment_proof": { "proof": { "asset_proof": { - "proof": "0001b44d27361609c463ec20dfa02d1fd2c489254ad82c6385ea29521553f1754b4600000000000004b0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdf", + "proof": "0001840523eef74f6df205b594a28228dcf524160fcf916989ee835ce168ee2e139600000000000004b0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", "version": 0, - "tap_key": "898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0", + "tap_key": "8b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827", "unknown_odd_types": null }, "taproot_asset_proof": { @@ -201,6 +224,17 @@ "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": { + "02959f8df7ef56034b5c0dae0bd63a3b7aa1faea64ea4340faa6ff01da07d494b8": { + "asset_proof": null, + "taproot_asset_proof": { + "proof": "0001270607f50d9a0a5cece2f05700cb2e46c48feb48282fac9d04380c4978e1382300000000000004b0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "version": 2, + "unknown_odd_types": null + }, + "unknown_odd_types": null + } + }, "unknown_odd_types": null }, "tapscript_proof": null, @@ -208,7 +242,7 @@ }, { "output_index": 2, - "internal_key": "026019f70d187fdb882da16113e08014f667d05980997df3abd39bb322801b834b", + "internal_key": "025138fa85569580f78cdbb9d602a7d1d0443f01fb3bf52ad62a4539db3d90024e", "commitment_proof": null, "tapscript_proof": { "tap_preimage_1": "", @@ -225,15 +259,51 @@ "challenge_witness": null, "genesis_reveal": null, "group_key_reveal": null, - "alt_leaves": null, + "alt_leaves": [ + { + "version": 0, + "genesis_first_prev_out": "0000000000000000000000000000000000000000000000000000000000000000:0", + "genesis_tag": "", + "genesis_meta_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "genesis_output_index": 0, + "genesis_type": 0, + "amount": 0, + "lock_time": 0, + "relative_lock_time": 0, + "prev_witnesses": null, + "split_commitment_root": null, + "script_version": 0, + "script_key": "026f123ec8bf2ba9e29e6a02147307468f3ff4ee395bc947afa198d335e3ebceeb", + "group_key": null, + "unknown_odd_types": null + }, + { + "version": 0, + "genesis_first_prev_out": "0000000000000000000000000000000000000000000000000000000000000000:0", + "genesis_tag": "", + "genesis_meta_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "genesis_output_index": 0, + "genesis_type": 0, + "amount": 0, + "lock_time": 0, + "relative_lock_time": 0, + "prev_witnesses": null, + "split_commitment_root": null, + "script_version": 0, + "script_key": "02959f8df7ef56034b5c0dae0bd63a3b7aa1faea64ea4340faa6ff01da07d494b8", + "group_key": null, + "unknown_odd_types": null + } + ], "unknown_odd_types": null }, - "expected": "5441505000040000000002244cd8f1e992034416b45c969e89316eaaa700daf02f15147e8816bc31d339e22b000000000450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096e88000000000000000006fd018c020000000001024cd8f1e992034416b45c969e89316eaaa700daf02f15147e8816bc31d339e22b000000000000000000062736a1f2dbc0332040eafe375e4922ace3da94f88ada2ce397e7914014a32500000000000000000003e8030000000000002251203efafc563c1ffb16afc844abe35e48ea0303bf8b03753c640da1924f81b79408e8030000000000002251208eb3db333954f26aa1eacd5f057b60a32c59987e0226b58dc8debb033bdee3e6a9d0f50500000000225120f09fc5609b3c82f778d27fe3f8e9b88a10edcebc7c35864940049991bf4445650140b4622c62287ae87d96fffa7fd34f58708b0d1e6f4ae5a85fc6705781dd92711129d9cd0e3774fdb0fa048d3bbc559dd3d8d76b84d56928025ef24ba0b1940a7d02473044022006229b6e9c59a1c5d68ced672808f075382b3b5c5bf44eb1c9e993593d4807c102206667b3a902f71aab2ddbaafe2cef32f1bde17da6522444e87fe1fd50d5aa90f20121025d3b26142dcb90504cbfbbbf70d92fc7579198ffe9bf497a3bf2c55df8925126000000000801000afd016600010002590028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000f66697273742d6974657374627578788d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea00000000000401000603fd012c0bad01ab01654cd8f1e992034416b45c969e89316eaaa700daf02f15147e8816bc31d339e22b00000000898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0025a5db7890fdd454db5d189d06880286b0d132c4709f1baee470a558276e3af5c03420140db1a68629f9408fd95e5dbd819380435bbad52c66746baabcc037ef6076cf215ecab264159bbbd922ae57a4890599f657dacc5a09d56785f08f7adad54e974d10d28c96ba1c3534f04149b2480923fc13d0e55e5251c01610317d48e1f0e7b9d219500000000000005dc0e020000102102adc1cf482226b3c4d0fac399e97302f4d7260f4ba782cd9cfbdb3c7ce94cd1e40cc7000400000000022103f8a796072d4b2f087f67973504600feafc628eaf76359d319470b186d8ccea0a039c01490001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd004220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024f000102024a0001464f6165e2b5fc1660dcecb3c02aabbae36fa0426457c5d976fd6d073328e49400000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf0df802c7000400000001022103687c05eb0dade4141769314d1fe89ac712b1c6de66a228110189bd3b278f0fe9039c01710001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0044a0001b44d27361609c463ec20dfa02d1fd2c489254ad82c6385ea29521553f1754b4600000000000004b0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdf022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2e0004000000020221026019f70d187fdb882da16113e08014f667d05980997df3abd39bb322801b834b0503040101160400000000", + "expected": "5441505000040000000102245e17a76d20d138e4c3705aacc1b738625fbb8888b8882bddf145ac5d6e0963f4000000000450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096e88000000000000000006fd018d020000000001025e17a76d20d138e4c3705aacc1b738625fbb8888b8882bddf145ac5d6e0963f40000000000000000007ec13f2cadbacf5cd70dba6b9ca81c6031f9ca13a61ea015490c663ed26062de00000000000000000003e80300000000000022512066bad917311f886e3daad2314db2d57d7f7de247cad3f6894630698af12269b6e803000000000000225120268297537e4bc910a16f4da764c2b19ea9afcf1cdb284b702c6a88a4b4138b01a0cff505000000002251206f45635211bf49ccee0eba7b6fc333ba5cfcb26369592e689ddc38dd2720bfe80140161a318f5341fd9726932ea6a5153c1f12e9b55887e0d8b780251e66aedbe262cccf7b466c599c96c7b4a31055d333c71aeaa974beafd195a32e9fb18d55bbd502483045022100f230a8a247e4a81922a9a0c5601de898199f72fcb23976fd844b2485b3802fd902207ed47d48a2c4c9b80a899ee209888ba2d510d047398df4b9c1e08bee68545b77012102bc0b975ee15425e28f6f0f45c70006d88fe53332a8122941be26bdb0d5315d26000000000801000afd016600010002594b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d2149686039000000000f66697273742d6974657374627578782903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb200000000000401000603fd012c0bad01ab01655e17a76d20d138e4c3705aacc1b738625fbb8888b8882bddf145ac5d6e0963f4000000008b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827023052b4c980baeba1526b3904e28473dbe8b3043b470c8e8a8bb331c62f915137034201404790e7b5a859402602f0311be947807fe439e0db54bca2ffe900cf19913f8b027aa1a6252022c8185d1513fb6644d2949957cc8f80392cc96b4ce53036107e3b0d28cf4b64ddca9189e4a4ae95be04f3803a0bf94173ed89c5d4948a75c2b6eb76a200000000000005dc0e0200001021023c99cc00a4a984d2ca54650f7b84beced5694ca9cfcde797625b5897209a2f310cfd01dc0004000000000221028eea48c8614c55e5da36a3c62f03721ae08b498b9944c1d698f7cc64a32a8ee903fd01af014900010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982704220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024f000102024a0001dd257d24585d78435cda93f55fd3b0f95d8885af3aae9dea6d39f8284e1f9ce000000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f07fd010f0102959f8df7ef56034b5c0dae0bd63a3b7aa1faea64ea4340faa6ff01da07d494b8ec01710001000220c2e9e9c378d76e4a15b98b9658436444995a76affe04ffe4331ff029e0de1e69044a0001d945b5d10a4180842f074bea3e72800590775217c81ef101e7f1ae9416d796fd0000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf0277000102027200029d957c5addbba823738ffa64c89923ed940f44236a5b5a05d6f2b40d1ea6a60500000000000007d0f5cd079bfab80034007fc1a404ca376e03d12f5e4110105908ce14a33526d3e8000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3f0dfd017202fd013f0004000000010221025471f8ec9a258c589bb3fd88034c26916e4610fe2891f56d089fe93f2097a31903fd0112017100010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827044a0001840523eef74f6df205b594a28228dcf524160fcf916989ee835ce168ee2e139600000000000004b0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff07740102959f8df7ef56034b5c0dae0bd63a3b7aa1faea64ea4340faa6ff01da07d494b851024f000102024a0001270607f50d9a0a5cece2f05700cb2e46c48feb48282fac9d04380c4978e1382300000000000004b0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f2e0004000000020221025138fa85569580f78cdbb9d602a7d1d0443f01fb3bf52ad62a4539db3d90024e05030401011604000000001b5102270e0200001021026f123ec8bf2ba9e29e6a02147307468f3ff4ee395bc947afa198d335e3ebceeb270e020000102102959f8df7ef56034b5c0dae0bd63a3b7aa1faea64ea4340faa6ff01da07d494b8", "comment": "valid regtest proof for split root" }, { "proof": { - "prev_out": "2be239d331bc16887e14152ff0da00a7aa6e31899e965cb416440392e9f1d84c:0", + "version": 1, + "prev_out": "f463096e5dac45f1dd2b88b88888bb5f6238b7c1ac5a70c3e438d1206da7175e:0", "block_header": { "version": 0, "prev_block": "0000000000000000000000000000000000000000000000000000000000000000", @@ -243,16 +313,16 @@ "nonce": 0 }, "block_height": 0, - "anchor_tx": "020000000001024cd8f1e992034416b45c969e89316eaaa700daf02f15147e8816bc31d339e22b000000000000000000062736a1f2dbc0332040eafe375e4922ace3da94f88ada2ce397e7914014a32500000000000000000003e8030000000000002251203efafc563c1ffb16afc844abe35e48ea0303bf8b03753c640da1924f81b79408e8030000000000002251208eb3db333954f26aa1eacd5f057b60a32c59987e0226b58dc8debb033bdee3e6a9d0f50500000000225120f09fc5609b3c82f778d27fe3f8e9b88a10edcebc7c35864940049991bf4445650140b4622c62287ae87d96fffa7fd34f58708b0d1e6f4ae5a85fc6705781dd92711129d9cd0e3774fdb0fa048d3bbc559dd3d8d76b84d56928025ef24ba0b1940a7d02473044022006229b6e9c59a1c5d68ced672808f075382b3b5c5bf44eb1c9e993593d4807c102206667b3a902f71aab2ddbaafe2cef32f1bde17da6522444e87fe1fd50d5aa90f20121025d3b26142dcb90504cbfbbbf70d92fc7579198ffe9bf497a3bf2c55df892512600000000", + "anchor_tx": "020000000001025e17a76d20d138e4c3705aacc1b738625fbb8888b8882bddf145ac5d6e0963f40000000000000000007ec13f2cadbacf5cd70dba6b9ca81c6031f9ca13a61ea015490c663ed26062de00000000000000000003e80300000000000022512066bad917311f886e3daad2314db2d57d7f7de247cad3f6894630698af12269b6e803000000000000225120268297537e4bc910a16f4da764c2b19ea9afcf1cdb284b702c6a88a4b4138b01a0cff505000000002251206f45635211bf49ccee0eba7b6fc333ba5cfcb26369592e689ddc38dd2720bfe80140161a318f5341fd9726932ea6a5153c1f12e9b55887e0d8b780251e66aedbe262cccf7b466c599c96c7b4a31055d333c71aeaa974beafd195a32e9fb18d55bbd502483045022100f230a8a247e4a81922a9a0c5601de898199f72fcb23976fd844b2485b3802fd902207ed47d48a2c4c9b80a899ee209888ba2d510d047398df4b9c1e08bee68545b77012102bc0b975ee15425e28f6f0f45c70006d88fe53332a8122941be26bdb0d5315d2600000000", "tx_merkle_proof": { "nodes": [], "bits": [] }, "asset": { "version": 0, - "genesis_first_prev_out": "473e0595de903c0ae6b627790bc1555a4a631e3a88d608603a28982c50ff2800:0", + "genesis_first_prev_out": "39606849213d33394c4fc8d0b890852fd97963399a204419f760af2267375f4b:0", "genesis_tag": "first-itestbuxx", - "genesis_meta_hash": "8d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea", + "genesis_meta_hash": "2903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb2", "genesis_output_index": 0, "genesis_type": 0, "amount": 1200, @@ -267,12 +337,12 @@ }, "tx_witness": null, "split_commitment": { - "proof": "00019f433ee26a1e6288bce58cbd0d77858201e55803f967db9e746197d059b1c422000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf", + "proof": "00018da6fc4e296871e0358f5c1fc8bd25fc2cdc10239ed9348a0d12a917a5aef05f000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", "root_asset": { "version": 0, - "genesis_first_prev_out": "473e0595de903c0ae6b627790bc1555a4a631e3a88d608603a28982c50ff2800:0", + "genesis_first_prev_out": "39606849213d33394c4fc8d0b890852fd97963399a204419f760af2267375f4b:0", "genesis_tag": "first-itestbuxx", - "genesis_meta_hash": "8d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea", + "genesis_meta_hash": "2903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb2", "genesis_output_index": 0, "genesis_type": 0, "amount": 300, @@ -281,22 +351,22 @@ "prev_witnesses": [ { "prev_id": { - "out_point": "2be239d331bc16887e14152ff0da00a7aa6e31899e965cb416440392e9f1d84c:0", - "asset_id": "898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0", - "script_key": "025a5db7890fdd454db5d189d06880286b0d132c4709f1baee470a558276e3af5c" + "out_point": "f463096e5dac45f1dd2b88b88888bb5f6238b7c1ac5a70c3e438d1206da7175e:0", + "asset_id": "8b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827", + "script_key": "023052b4c980baeba1526b3904e28473dbe8b3043b470c8e8a8bb331c62f915137" }, "tx_witness": [ - "db1a68629f9408fd95e5dbd819380435bbad52c66746baabcc037ef6076cf215ecab264159bbbd922ae57a4890599f657dacc5a09d56785f08f7adad54e974d1" + "4790e7b5a859402602f0311be947807fe439e0db54bca2ffe900cf19913f8b027aa1a6252022c8185d1513fb6644d2949957cc8f80392cc96b4ce53036107e3b" ], "split_commitment": null } ], "split_commitment_root": { - "hash": "c96ba1c3534f04149b2480923fc13d0e55e5251c01610317d48e1f0e7b9d2195", + "hash": "cf4b64ddca9189e4a4ae95be04f3803a0bf94173ed89c5d4948a75c2b6eb76a2", "sum": "1500" }, "script_version": 0, - "script_key": "02adc1cf482226b3c4d0fac399e97302f4d7260f4ba782cd9cfbdb3c7ce94cd1e4", + "script_key": "023c99cc00a4a984d2ca54650f7b84beced5694ca9cfcde797625b5897209a2f31", "group_key": null, "unknown_odd_types": null } @@ -305,19 +375,19 @@ ], "split_commitment_root": null, "script_version": 0, - "script_key": "02e2356b87d6435363aaa7a763eeeb3818000527783c0c4ed72999a4853ef2a23b", + "script_key": "02e64ca3dd8dab4edaeff6c1e40f321e4d711821427719dfa35927e472a3147a66", "group_key": null, "unknown_odd_types": null }, "inclusion_proof": { "output_index": 1, - "internal_key": "03687c05eb0dade4141769314d1fe89ac712b1c6de66a228110189bd3b278f0fe9", + "internal_key": "025471f8ec9a258c589bb3fd88034c26916e4610fe2891f56d089fe93f2097a319", "commitment_proof": { "proof": { "asset_proof": { "proof": "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "version": 0, - "tap_key": "898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0", + "tap_key": "8b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827", "unknown_odd_types": null }, "taproot_asset_proof": { @@ -328,6 +398,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -336,23 +407,24 @@ "exclusion_proofs": [ { "output_index": 0, - "internal_key": "03f8a796072d4b2f087f67973504600feafc628eaf76359d319470b186d8ccea0a", + "internal_key": "028eea48c8614c55e5da36a3c62f03721ae08b498b9944c1d698f7cc64a32a8ee9", "commitment_proof": { "proof": { "asset_proof": { - "proof": "00016201f1a088494f6a5b061a15c62c509b5a9f412bc067f6bb279c5597ea97cecf000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdf", + "proof": "000107cebd3d1c01550b10448b3467b26d05a60b17d4bdf0b479c7d7991f5d6e8c1a000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", "version": 0, - "tap_key": "898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0", + "tap_key": "8b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827", "unknown_odd_types": null }, "taproot_asset_proof": { - "proof": "0001464f6165e2b5fc1660dcecb3c02aabbae36fa0426457c5d976fd6d073328e49400000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf", + "proof": "0001dd257d24585d78435cda93f55fd3b0f95d8885af3aae9dea6d39f8284e1f9ce000000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", "version": 2, "unknown_odd_types": null }, "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -360,7 +432,7 @@ }, { "output_index": 2, - "internal_key": "026019f70d187fdb882da16113e08014f667d05980997df3abd39bb322801b834b", + "internal_key": "025138fa85569580f78cdbb9d602a7d1d0443f01fb3bf52ad62a4539db3d90024e", "commitment_proof": null, "tapscript_proof": { "tap_preimage_1": "", @@ -373,23 +445,24 @@ ], "split_root_proof": { "output_index": 0, - "internal_key": "03f8a796072d4b2f087f67973504600feafc628eaf76359d319470b186d8ccea0a", + "internal_key": "028eea48c8614c55e5da36a3c62f03721ae08b498b9944c1d698f7cc64a32a8ee9", "commitment_proof": { "proof": { "asset_proof": { "proof": "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "version": 0, - "tap_key": "898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0", + "tap_key": "8b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827", "unknown_odd_types": null }, "taproot_asset_proof": { - "proof": "0001464f6165e2b5fc1660dcecb3c02aabbae36fa0426457c5d976fd6d073328e49400000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf", + "proof": "0001dd257d24585d78435cda93f55fd3b0f95d8885af3aae9dea6d39f8284e1f9ce000000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", "version": 2, "unknown_odd_types": null }, "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -403,25 +476,26 @@ "alt_leaves": null, "unknown_odd_types": null }, - "expected": "5441505000040000000002244cd8f1e992034416b45c969e89316eaaa700daf02f15147e8816bc31d339e22b000000000450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096e88000000000000000006fd018c020000000001024cd8f1e992034416b45c969e89316eaaa700daf02f15147e8816bc31d339e22b000000000000000000062736a1f2dbc0332040eafe375e4922ace3da94f88ada2ce397e7914014a32500000000000000000003e8030000000000002251203efafc563c1ffb16afc844abe35e48ea0303bf8b03753c640da1924f81b79408e8030000000000002251208eb3db333954f26aa1eacd5f057b60a32c59987e0226b58dc8debb033bdee3e6a9d0f50500000000225120f09fc5609b3c82f778d27fe3f8e9b88a10edcebc7c35864940049991bf4445650140b4622c62287ae87d96fffa7fd34f58708b0d1e6f4ae5a85fc6705781dd92711129d9cd0e3774fdb0fa048d3bbc559dd3d8d76b84d56928025ef24ba0b1940a7d02473044022006229b6e9c59a1c5d68ced672808f075382b3b5c5bf44eb1c9e993593d4807c102206667b3a902f71aab2ddbaafe2cef32f1bde17da6522444e87fe1fd50d5aa90f20121025d3b26142dcb90504cbfbbbf70d92fc7579198ffe9bf497a3bf2c55df8925126000000000801000afd02b400010002590028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000f66697273742d6974657374627578788d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea00000000000401000603fd04b00bfd022301fd021f0165000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fd01b44a00019f433ee26a1e6288bce58cbd0d77858201e55803f967db9e746197d059b1c422000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbffd016600010002590028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000f66697273742d6974657374627578788d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea00000000000401000603fd012c0bad01ab01654cd8f1e992034416b45c969e89316eaaa700daf02f15147e8816bc31d339e22b00000000898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0025a5db7890fdd454db5d189d06880286b0d132c4709f1baee470a558276e3af5c03420140db1a68629f9408fd95e5dbd819380435bbad52c66746baabcc037ef6076cf215ecab264159bbbd922ae57a4890599f657dacc5a09d56785f08f7adad54e974d10d28c96ba1c3534f04149b2480923fc13d0e55e5251c01610317d48e1f0e7b9d219500000000000005dc0e020000102102adc1cf482226b3c4d0fac399e97302f4d7260f4ba782cd9cfbdb3c7ce94cd1e40e020000102102e2356b87d6435363aaa7a763eeeb3818000527783c0c4ed72999a4853ef2a23b0c9f000400000001022103687c05eb0dade4141769314d1fe89ac712b1c6de66a228110189bd3b278f0fe9037401490001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd004220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0dfd012002ef000400000000022103f8a796072d4b2f087f67973504600feafc628eaf76359d319470b186d8ccea0a03c401710001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0044a00016201f1a088494f6a5b061a15c62c509b5a9f412bc067f6bb279c5597ea97cecf000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdf024f000102024a0001464f6165e2b5fc1660dcecb3c02aabbae36fa0426457c5d976fd6d073328e49400000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf2e0004000000020221026019f70d187fdb882da16113e08014f667d05980997df3abd39bb322801b834b05030401010fc7000400000000022103f8a796072d4b2f087f67973504600feafc628eaf76359d319470b186d8ccea0a039c01490001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd004220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024f000102024a0001464f6165e2b5fc1660dcecb3c02aabbae36fa0426457c5d976fd6d073328e49400000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf160400000000", + "expected": "5441505000040000000102245e17a76d20d138e4c3705aacc1b738625fbb8888b8882bddf145ac5d6e0963f4000000000450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000096e88000000000000000006fd018d020000000001025e17a76d20d138e4c3705aacc1b738625fbb8888b8882bddf145ac5d6e0963f40000000000000000007ec13f2cadbacf5cd70dba6b9ca81c6031f9ca13a61ea015490c663ed26062de00000000000000000003e80300000000000022512066bad917311f886e3daad2314db2d57d7f7de247cad3f6894630698af12269b6e803000000000000225120268297537e4bc910a16f4da764c2b19ea9afcf1cdb284b702c6a88a4b4138b01a0cff505000000002251206f45635211bf49ccee0eba7b6fc333ba5cfcb26369592e689ddc38dd2720bfe80140161a318f5341fd9726932ea6a5153c1f12e9b55887e0d8b780251e66aedbe262cccf7b466c599c96c7b4a31055d333c71aeaa974beafd195a32e9fb18d55bbd502483045022100f230a8a247e4a81922a9a0c5601de898199f72fcb23976fd844b2485b3802fd902207ed47d48a2c4c9b80a899ee209888ba2d510d047398df4b9c1e08bee68545b77012102bc0b975ee15425e28f6f0f45c70006d88fe53332a8122941be26bdb0d5315d26000000000801000afd02b400010002594b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d2149686039000000000f66697273742d6974657374627578782903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb200000000000401000603fd04b00bfd022301fd021f0165000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fd01b44a00018da6fc4e296871e0358f5c1fc8bd25fc2cdc10239ed9348a0d12a917a5aef05f000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffd016600010002594b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d2149686039000000000f66697273742d6974657374627578782903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb200000000000401000603fd012c0bad01ab01655e17a76d20d138e4c3705aacc1b738625fbb8888b8882bddf145ac5d6e0963f4000000008b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827023052b4c980baeba1526b3904e28473dbe8b3043b470c8e8a8bb331c62f915137034201404790e7b5a859402602f0311be947807fe439e0db54bca2ffe900cf19913f8b027aa1a6252022c8185d1513fb6644d2949957cc8f80392cc96b4ce53036107e3b0d28cf4b64ddca9189e4a4ae95be04f3803a0bf94173ed89c5d4948a75c2b6eb76a200000000000005dc0e0200001021023c99cc00a4a984d2ca54650f7b84beced5694ca9cfcde797625b5897209a2f310e020000102102e64ca3dd8dab4edaeff6c1e40f321e4d711821427719dfa35927e472a3147a660c9f0004000000010221025471f8ec9a258c589bb3fd88034c26916e4610fe2891f56d089fe93f2097a3190374014900010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982704220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0dfd012002ef0004000000000221028eea48c8614c55e5da36a3c62f03721ae08b498b9944c1d698f7cc64a32a8ee903c4017100010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827044a000107cebd3d1c01550b10448b3467b26d05a60b17d4bdf0b479c7d7991f5d6e8c1a000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f024f000102024a0001dd257d24585d78435cda93f55fd3b0f95d8885af3aae9dea6d39f8284e1f9ce000000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f2e0004000000020221025138fa85569580f78cdbb9d602a7d1d0443f01fb3bf52ad62a4539db3d90024e05030401010fc70004000000000221028eea48c8614c55e5da36a3c62f03721ae08b498b9944c1d698f7cc64a32a8ee9039c014900010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982704220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024f000102024a0001dd257d24585d78435cda93f55fd3b0f95d8885af3aae9dea6d39f8284e1f9ce000000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f160400000000", "comment": "valid regtest split proof" }, { "proof": { - "prev_out": "9b8e1b77f8dd96171defee350330f075e13d15ad3a2e6f66d6d45250edfd4641:1", + "version": 1, + "prev_out": "d3afe9e3c916f832513d98d4ab1c420fe1349339b996752d772aab884f992779:1", "block_header": { "version": 541065216, - "prev_block": "6e3216d33065117fd21808e13bb7f4e97d2df965400ace33ce8ad2f9d6cdb7f8", - "merkle_root": "27b1568a6de74bcf03dab3c8057c773de13e158c917627870484ec88bae7cba8", - "timestamp": 1733521992, + "prev_block": "08fc3b89267f97bfc5ca11eee99fdae76ced9d200dc9ab85fa3012e5efd2d2ba", + "merkle_root": "639abb6f91489a65463b4dd3d9f452063b709d22f5971db5210a25ea3475c846", + "timestamp": 1746605947, "bits": 545259519, "nonce": 0 }, - "block_height": 446, - "anchor_tx": "020000000001024146fded5052d4d6666f2e3aad153de175f0300335eeef1d1796ddf8771b8e9b0100000000000000007a6aed31fe675df9f3cbb30ec93c6aa64c0357ee95e041b68209dd0405126ea100000000000000000003e803000000000000225120b39d40166eab936be97ba489bd3e0b804fbd3c405b6b4dd853a7ecd645c7b8c9e803000000000000225120c439941c12ce99347f4a629a938835f2cdd7cc2646da97f18c52b4f17a18b0f4a9d0f505000000002251208ea64fa1adc917b9a9f7b6f4d671faa71a3ce538e4d22f2bc7696b2228448a2801400a89ab38452e2851d9b8a8faa24078d5517588fa2c857a2b4be65c0ac56631771139a245721a0b70e75e0c33a6eec16ee1d540c00489c8321569edc4e0d3e57f02473044022053b3677ee4a83b5b64d25f6c9f6d03a6678f2daeecad0966b7f1bfcb43f86b6a022041be57f3ca6ce364e28ae4991633ba9a4198f2a8ecd4489e4e1998cd447d8ff3012102dd95677d998373268ea2e0fd1a9bdd62e74eaee0db36ae080957c8f4732448c400000000", + "block_height": 444, + "anchor_tx": "020000000001027927994f88ab2a772d7596b9399334e10f421cabd4983d5132f816c9e3e9afd3010000000000000000840cb35380def99e176c847593a130130503c99077b9368b50364cb98eeefa8f00000000000000000003e803000000000000225120ab81d41661f2b8a3401f8d9303279e3021686979f3aa0e2d327a5f6dcfdae5dae803000000000000225120093ddfcb23ee2396d3d7c9797ba2d14190298362fb1f49afff253045b313e9aba0cff50500000000225120029597d98d911f027a053603674eb4b0775a184437f71611bfc6a934075fee6701400995f52d1eb51781d5ea32d6ed68b9de997e11573e1ade6b32378159637417021ae54061ba7c92cdbcc75c5688991d69fb0d1290ceb6d6346ecd06efd2a1aef802473044022047b887847dc08ecf0d2f0ffe3dbfc640a29941c89e5a2fbece78ce52622c898a02204e05575f33e8225de0b693d276b1fe69d66404f327da0b32fb7176d7f8e2a4c401210264d6a3866048257a98bd8f0b031a6d0a6fb04d2978b3991bb07a1c679bce82ca00000000", "tx_merkle_proof": { "nodes": [ - "253153c75426a337a3a39e660e3d5d3a7a2943596ff1e53c8910ad5cad738656" + "aa723d45505035dd40df705dff0622830a8bad8fa254732ba60abea4ebddbee4" ], "bits": [ false @@ -429,9 +503,9 @@ }, "asset": { "version": 0, - "genesis_first_prev_out": "473e0595de903c0ae6b627790bc1555a4a631e3a88d608603a28982c50ff2800:0", + "genesis_first_prev_out": "39606849213d33394c4fc8d0b890852fd97963399a204419f760af2267375f4b:0", "genesis_tag": "first-itestbuxx", - "genesis_meta_hash": "8d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea", + "genesis_meta_hash": "2903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb2", "genesis_output_index": 0, "genesis_type": 0, "amount": 600, @@ -446,12 +520,12 @@ }, "tx_witness": null, "split_commitment": { - "proof": "000171eba4c1f1a64d5342c68cfcfce96a3332c936824f676cc047db8c79bf24f8ba0000000000000258ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "proof": "000104ff34d7602b93f4de90c950cabc0786041ca8ea181874b7a62a1853bd2fc26b0000000000000258ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", "root_asset": { "version": 0, - "genesis_first_prev_out": "473e0595de903c0ae6b627790bc1555a4a631e3a88d608603a28982c50ff2800:0", + "genesis_first_prev_out": "39606849213d33394c4fc8d0b890852fd97963399a204419f760af2267375f4b:0", "genesis_tag": "first-itestbuxx", - "genesis_meta_hash": "8d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea", + "genesis_meta_hash": "2903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb2", "genesis_output_index": 0, "genesis_type": 0, "amount": 600, @@ -460,22 +534,22 @@ "prev_witnesses": [ { "prev_id": { - "out_point": "9b8e1b77f8dd96171defee350330f075e13d15ad3a2e6f66d6d45250edfd4641:1", - "asset_id": "898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0", - "script_key": "02e2356b87d6435363aaa7a763eeeb3818000527783c0c4ed72999a4853ef2a23b" + "out_point": "d3afe9e3c916f832513d98d4ab1c420fe1349339b996752d772aab884f992779:1", + "asset_id": "8b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827", + "script_key": "02e64ca3dd8dab4edaeff6c1e40f321e4d711821427719dfa35927e472a3147a66" }, "tx_witness": [ - "62f411bf03948cb3ca8a887a6449b1b99f93458e1c2f837ec20c7759461ad433bdeb43fc3abf29cde2cb2680e3f1c7a5ac60dc5833042ed31067f80c57b28537" + "89e2b3dfa864dcc4e6f431ea5a02fa8f75fdd4d5e5afc39b35fa9f99196cc2170a3c59b18d804917d6e6483605a2be43d1a492e3e044a2e486ff2378d6476739" ], "split_commitment": null } ], "split_commitment_root": { - "hash": "94c638977dfebc6426564611a74aedddb57c7664e9278213cfcce97de38733f0", + "hash": "4959b54e380d3cf0060dc2f243591ed4e573fe20d58ac16c0083f672b7289550", "sum": "1200" }, "script_version": 0, - "script_key": "0273567b487064507c8bb16c912e8ec608bf09f2d461a89bfe63c37a7b3fdd21fa", + "script_key": "0237917fdd78c0170e0c84d8c7094e675614ec9779e7ba480bbadfd4f6e5395b84", "group_key": null, "unknown_odd_types": null } @@ -484,19 +558,19 @@ ], "split_commitment_root": null, "script_version": 0, - "script_key": "02550807e261f1add28272dd1dc99979f7bb0e87982c296d52d7b58fba2c1a68e4", + "script_key": "022f116a38175b27e2dbb6a1cd809086e1a30c73e116831d41df2f4d1b825539ab", "group_key": null, "unknown_odd_types": null }, "inclusion_proof": { "output_index": 1, - "internal_key": "026f8944cb3cc0e077dedfbe312cbe6071861bec5cdc055ff6fe7fe26f5a5b8357", + "internal_key": "03816d48eb51bc220f7bd1234c439f8a8701e582784a79bf25721dba4979526f5f", "commitment_proof": { "proof": { "asset_proof": { "proof": "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "version": 0, - "tap_key": "898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0", + "tap_key": "8b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827", "unknown_odd_types": null }, "taproot_asset_proof": { @@ -507,6 +581,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -515,23 +590,24 @@ "exclusion_proofs": [ { "output_index": 0, - "internal_key": "028d87ba784f1639cb7d85f0d1f79e3a0f36a32b745aa84ef5e175aee24ab4631f", + "internal_key": "02f3539c14a7f7edb9969a39b47a49bf25b40e159845b3640669be51ead2e0eb36", "commitment_proof": { "proof": { "asset_proof": { - "proof": "00014c598c9376185fd1dfb86659a5c3675bab19595cf1abf5a1cc7b7dc887d607cf0000000000000258fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7", + "proof": "000166f3036b2d11969be7909bd31a463b2dd164b7e8b8c3a031732b0369754d505b0000000000000258ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", "version": 0, - "tap_key": "898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0", + "tap_key": "8b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827", "unknown_odd_types": null }, "taproot_asset_proof": { - "proof": "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "proof": "000143891c4822d4efc0702e21b8769d503d8ff1c852ec538e34f89172f57a0a31080000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", "version": 2, "unknown_odd_types": null }, "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -539,7 +615,7 @@ }, { "output_index": 2, - "internal_key": "027e12e36f36b1b39f15cf888cc4ec443dea1f07082fb35ea2f2d170c782687e73", + "internal_key": "02b8ef3ea2e4de049f54a367c99dcd6ea4767fb440899b8d6fea65f830f697f7af", "commitment_proof": null, "tapscript_proof": { "tap_preimage_1": "", @@ -552,23 +628,24 @@ ], "split_root_proof": { "output_index": 0, - "internal_key": "028d87ba784f1639cb7d85f0d1f79e3a0f36a32b745aa84ef5e175aee24ab4631f", + "internal_key": "02f3539c14a7f7edb9969a39b47a49bf25b40e159845b3640669be51ead2e0eb36", "commitment_proof": { "proof": { "asset_proof": { "proof": "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "version": 0, - "tap_key": "898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0", + "tap_key": "8b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827", "unknown_odd_types": null }, "taproot_asset_proof": { - "proof": "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "proof": "000143891c4822d4efc0702e21b8769d503d8ff1c852ec538e34f89172f57a0a31080000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", "version": 2, "unknown_odd_types": null }, "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -577,32 +654,33 @@ "meta_reveal": null, "additional_inputs": null, "challenge_witness": [ - "5a9d3325ceddab77bbb43583930ab428d76c89b11b3af6fe4e97daee4c4eb34422c1d8e9e67bfde1d3b1a8bfeb8ec7e458ffe0e4f8b9f2faf1ad946e43b6a9ec" + "fa1cbc3b168b9b76471b507702a2a39e41e044657e965e002a9af8b2f41096d99c0cf8b23962e73f76a760ca899f65540aa3a22deee573db426b98a03560db45" ], "genesis_reveal": null, "group_key_reveal": null, "alt_leaves": null, "unknown_odd_types": null }, - "expected": "5441505000040000000002244146fded5052d4d6666f2e3aad153de175f0300335eeef1d1796ddf8771b8e9b00000001045000004020f8b7cdd6f9d28ace33ce0a4065f92d7de9f4b73be10818d27f116530d316326ea8cbe7ba88ec8404872776918c153ee13d777c05c8b3da03cf4be76d8a56b12748725367ffff7f200000000006fd018c020000000001024146fded5052d4d6666f2e3aad153de175f0300335eeef1d1796ddf8771b8e9b0100000000000000007a6aed31fe675df9f3cbb30ec93c6aa64c0357ee95e041b68209dd0405126ea100000000000000000003e803000000000000225120b39d40166eab936be97ba489bd3e0b804fbd3c405b6b4dd853a7ecd645c7b8c9e803000000000000225120c439941c12ce99347f4a629a938835f2cdd7cc2646da97f18c52b4f17a18b0f4a9d0f505000000002251208ea64fa1adc917b9a9f7b6f4d671faa71a3ce538e4d22f2bc7696b2228448a2801400a89ab38452e2851d9b8a8faa24078d5517588fa2c857a2b4be65c0ac56631771139a245721a0b70e75e0c33a6eec16ee1d540c00489c8321569edc4e0d3e57f02473044022053b3677ee4a83b5b64d25f6c9f6d03a6678f2daeecad0966b7f1bfcb43f86b6a022041be57f3ca6ce364e28ae4991633ba9a4198f2a8ecd4489e4e1998cd447d8ff3012102dd95677d998373268ea2e0fd1a9bdd62e74eaee0db36ae080957c8f4732448c400000000082201568673ad5cad10893ce5f16f5943297a3a5d3d0e669ea3a337a32654c7533125000afd02b400010002590028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000f66697273742d6974657374627578788d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea00000000000401000603fd02580bfd022301fd021f0165000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fd01b44a000171eba4c1f1a64d5342c68cfcfce96a3332c936824f676cc047db8c79bf24f8ba0000000000000258ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffd016600010002590028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000f66697273742d6974657374627578788d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea00000000000401000603fd02580bad01ab01654146fded5052d4d6666f2e3aad153de175f0300335eeef1d1796ddf8771b8e9b00000001898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd002e2356b87d6435363aaa7a763eeeb3818000527783c0c4ed72999a4853ef2a23b0342014062f411bf03948cb3ca8a887a6449b1b99f93458e1c2f837ec20c7759461ad433bdeb43fc3abf29cde2cb2680e3f1c7a5ac60dc5833042ed31067f80c57b285370d2894c638977dfebc6426564611a74aedddb57c7664e9278213cfcce97de38733f000000000000004b00e02000010210273567b487064507c8bb16c912e8ec608bf09f2d461a89bfe63c37a7b3fdd21fa0e020000102102550807e261f1add28272dd1dc99979f7bb0e87982c296d52d7b58fba2c1a68e40c9f0004000000010221026f8944cb3cc0e077dedfbe312cbe6071861bec5cdc055ff6fe7fe26f5a5b8357037401490001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd004220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0df802c70004000000000221028d87ba784f1639cb7d85f0d1f79e3a0f36a32b745aa84ef5e175aee24ab4631f039c01710001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0044a00014c598c9376185fd1dfb86659a5c3675bab19595cf1abf5a1cc7b7dc887d607cf0000000000000258fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2e0004000000020221027e12e36f36b1b39f15cf888cc4ec443dea1f07082fb35ea2f2d170c782687e7305030401010f9f0004000000000221028d87ba784f1639cb7d85f0d1f79e3a0f36a32b745aa84ef5e175aee24ab4631f037401490001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd004220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff154201405a9d3325ceddab77bbb43583930ab428d76c89b11b3af6fe4e97daee4c4eb34422c1d8e9e67bfde1d3b1a8bfeb8ec7e458ffe0e4f8b9f2faf1ad946e43b6a9ec1604000001be", + "expected": "5441505000040000000102247927994f88ab2a772d7596b9399334e10f421cabd4983d5132f816c9e3e9afd300000001045000004020bad2d2efe51230fa85abc90d209ded6ce7da9fe9ee11cac5bf977f26893bfc0846c87534ea250a21b51d97f5229d703b0652f4d9d34d3b46659a48916fbb9a637b171b68ffff7f200000000006fd018c020000000001027927994f88ab2a772d7596b9399334e10f421cabd4983d5132f816c9e3e9afd3010000000000000000840cb35380def99e176c847593a130130503c99077b9368b50364cb98eeefa8f00000000000000000003e803000000000000225120ab81d41661f2b8a3401f8d9303279e3021686979f3aa0e2d327a5f6dcfdae5dae803000000000000225120093ddfcb23ee2396d3d7c9797ba2d14190298362fb1f49afff253045b313e9aba0cff50500000000225120029597d98d911f027a053603674eb4b0775a184437f71611bfc6a934075fee6701400995f52d1eb51781d5ea32d6ed68b9de997e11573e1ade6b32378159637417021ae54061ba7c92cdbcc75c5688991d69fb0d1290ceb6d6346ecd06efd2a1aef802473044022047b887847dc08ecf0d2f0ffe3dbfc640a29941c89e5a2fbece78ce52622c898a02204e05575f33e8225de0b693d276b1fe69d66404f327da0b32fb7176d7f8e2a4c401210264d6a3866048257a98bd8f0b031a6d0a6fb04d2978b3991bb07a1c679bce82ca00000000082201e4beddeba4be0aa62b7354a28fad8b0a832206ff5d70df40dd355050453d72aa000afd02b400010002594b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d2149686039000000000f66697273742d6974657374627578782903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb200000000000401000603fd02580bfd022301fd021f0165000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fd01b44a000104ff34d7602b93f4de90c950cabc0786041ca8ea181874b7a62a1853bd2fc26b0000000000000258ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffd016600010002594b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d2149686039000000000f66697273742d6974657374627578782903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb200000000000401000603fd02580bad01ab01657927994f88ab2a772d7596b9399334e10f421cabd4983d5132f816c9e3e9afd3000000018b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982702e64ca3dd8dab4edaeff6c1e40f321e4d711821427719dfa35927e472a3147a660342014089e2b3dfa864dcc4e6f431ea5a02fa8f75fdd4d5e5afc39b35fa9f99196cc2170a3c59b18d804917d6e6483605a2be43d1a492e3e044a2e486ff2378d64767390d284959b54e380d3cf0060dc2f243591ed4e573fe20d58ac16c0083f672b728955000000000000004b00e02000010210237917fdd78c0170e0c84d8c7094e675614ec9779e7ba480bbadfd4f6e5395b840e0200001021022f116a38175b27e2dbb6a1cd809086e1a30c73e116831d41df2f4d1b825539ab0c9f000400000001022103816d48eb51bc220f7bd1234c439f8a8701e582784a79bf25721dba4979526f5f0374014900010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982704220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0dfd012002ef000400000000022102f3539c14a7f7edb9969a39b47a49bf25b40e159845b3640669be51ead2e0eb3603c4017100010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827044a000166f3036b2d11969be7909bd31a463b2dd164b7e8b8c3a031732b0369754d505b0000000000000258ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f024f000102024a000143891c4822d4efc0702e21b8769d503d8ff1c852ec538e34f89172f57a0a31080000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f2e000400000002022102b8ef3ea2e4de049f54a367c99dcd6ea4767fb440899b8d6fea65f830f697f7af05030401010fc7000400000000022102f3539c14a7f7edb9969a39b47a49bf25b40e159845b3640669be51ead2e0eb36039c014900010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982704220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024f000102024a000143891c4822d4efc0702e21b8769d503d8ff1c852ec538e34f89172f57a0a31080000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f15420140fa1cbc3b168b9b76471b507702a2a39e41e044657e965e002a9af8b2f41096d99c0cf8b23962e73f76a760ca899f65540aa3a22deee573db426b98a03560db451604000001bc", "comment": "valid regtest ownership proof" }, { "proof": { - "prev_out": "473e0595de903c0ae6b627790bc1555a4a631e3a88d608603a28982c50ff2800:0", + "version": 1, + "prev_out": "39606849213d33394c4fc8d0b890852fd97963399a204419f760af2267375f4b:0", "block_header": { "version": 541065216, - "prev_block": "3b35e1d5fd335c30dd04b42ca34313d056f1c92a522e7507241e08e284aa8f9a", - "merkle_root": "bd23d82c26f969d400b6ecc18ae808d641e617e655505e590b7a39eb9f862099", - "timestamp": 1733521991, + "prev_block": "3c931058f9bbed415648c14bf1556ccd6954df805f73b51ea0e2c1b764d0e7eb", + "merkle_root": "b9fa731074ae59dee11fcf23d3fd04bde97b6b59bcbefd9360c8d6369b6ecc3b", + "timestamp": 1746605947, "bits": 545259519, "nonce": 0 }, - "block_height": 443, - "anchor_tx": "020000000001010028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e4700000000000000000002e8030000000000002251201de5c42c8a8b746e8546333f77af17351aacab80ad69bccb38c80bce6e9b8bef5fd5f5050000000022512007138e14f350280a1d8ddee3269e63475c460ec569f92c4e0a8d4699bf41f4bb0247304402204f36d4142a0766b659ad3de205cd6f6b2ff9799d2ba9678150a3d1dbfc81d2f602201ea43dbfa55ab6d603b89aae66751b3c0c858d0b1982bd38403b29d95bdfdb1a0121022a00c959d98510b311dec09ad2214f1267edfdea434a491d33f837192617c36400000000", + "block_height": 440, + "anchor_tx": "020000000001014b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d214968603900000000000000000002e8030000000000002251204c30c8bb3a1a3a5f55e1ebda4241d03193bc6c9154fdfd8d00f3435510861b7bbbd4f50500000000225120c2274fef4bd6ad7f5987436d79b3ba36372a68322d84c99ac29f7ebb6ca8112f0247304402207cdf34b4aeeff413ca928193f9fb2f4ddbb80bba0609c7c7a1246fae278cb08302202f0ae0dc7c966bb96b5523da324f78194bd02d74233161d290231abf1b9925780121033a1c7ae1018b60f5442d41901f5fff4b7edeb55ebe8320e70bdbdae19eacd3b600000000", "tx_merkle_proof": { "nodes": [ - "398b065a877db464f6daf462f12caf4883169b8dd02540edf4e4ccc18cb76376" + "0c5f7e4d1c477f87fe2a6842d2df787111379864d9504bcb5d41ba1c14563d16" ], "bits": [ false @@ -610,9 +688,9 @@ }, "asset": { "version": 0, - "genesis_first_prev_out": "473e0595de903c0ae6b627790bc1555a4a631e3a88d608603a28982c50ff2800:0", + "genesis_first_prev_out": "39606849213d33394c4fc8d0b890852fd97963399a204419f760af2267375f4b:0", "genesis_tag": "first-itestbuxx", - "genesis_meta_hash": "8d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea", + "genesis_meta_hash": "2903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb2", "genesis_output_index": 0, "genesis_type": 0, "amount": 1500, @@ -631,29 +709,30 @@ ], "split_commitment_root": null, "script_version": 0, - "script_key": "025a5db7890fdd454db5d189d06880286b0d132c4709f1baee470a558276e3af5c", + "script_key": "023052b4c980baeba1526b3904e28473dbe8b3043b470c8e8a8bb331c62f915137", "group_key": null, "unknown_odd_types": null }, "inclusion_proof": { "output_index": 0, - "internal_key": "0352a78f4268168a1219a30bb96ce37e5a73d6175a336947fa7376661667805e0a", + "internal_key": "03ad9320aa0ee72927e3a5e86dcd01df24b73627f4abe2aa7ed45f631524c62dce", "commitment_proof": { "proof": { "asset_proof": { "proof": "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "version": 0, - "tap_key": "898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0", + "tap_key": "8b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827", "unknown_odd_types": null }, "taproot_asset_proof": { - "proof": "0001076553d07d1e80b22b6852656e98b3f090db89de729e0389bdd654050635ae4500000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf", + "proof": "0001e630f19c519c1d8785c7dbd04a7de8b2d651ae98ad2c3cd7e4dec8d95c3d2efa00000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", "version": 2, "unknown_odd_types": null }, "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -662,7 +741,7 @@ "exclusion_proofs": [ { "output_index": 1, - "internal_key": "02773d842605766a0803e2ac601310b43cd2acbecd951a4910a915e8943e53ecb5", + "internal_key": "02667ea48169e6d324b6cf160385647cb37289c7237f38b8e1b20695620200e79f", "commitment_proof": null, "tapscript_proof": { "tap_preimage_1": "", @@ -677,14 +756,18 @@ "meta_reveal": { "type": 0, "data": "69746573742d6d65746164617461", + "decimal_display": 0, + "universe_commitments": null, + "canonical_universes": null, + "delegation_key": null, "unknown_odd_types": null }, "additional_inputs": null, "challenge_witness": null, "genesis_reveal": { - "first_prev_out": "473e0595de903c0ae6b627790bc1555a4a631e3a88d608603a28982c50ff2800:0", + "first_prev_out": "39606849213d33394c4fc8d0b890852fd97963399a204419f760af2267375f4b:0", "tag": "first-itestbuxx", - "meta_hash": "8d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea", + "meta_hash": "2903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb2", "output_index": 0, "type": 0 }, @@ -692,25 +775,26 @@ "alt_leaves": null, "unknown_odd_types": null }, - "expected": "5441505000040000000002240028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000450000040209a8faa84e2081e2407752e522ac9f156d01343a32cb404dd305c33fdd5e1353b9920869feb397a0b595e5055e617e641d608e88ac1ecb600d469f9262cd823bd47725367ffff7f200000000006f6020000000001010028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e4700000000000000000002e8030000000000002251201de5c42c8a8b746e8546333f77af17351aacab80ad69bccb38c80bce6e9b8bef5fd5f5050000000022512007138e14f350280a1d8ddee3269e63475c460ec569f92c4e0a8d4699bf41f4bb0247304402204f36d4142a0766b659ad3de205cd6f6b2ff9799d2ba9678150a3d1dbfc81d2f602201ea43dbfa55ab6d603b89aae66751b3c0c858d0b1982bd38403b29d95bdfdb1a0121022a00c959d98510b311dec09ad2214f1267edfdea434a491d33f837192617c364000000000822017663b78cc1cce4f4ed4025d08d9b168348af2cf162f4daf664b47d875a068b39000af800010002590028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000f66697273742d6974657374627578788d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea00000000000401000603fd05dc0b690167016500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0200001021025a5db7890fdd454db5d189d06880286b0d132c4709f1baee470a558276e3af5c0cc700040000000002210352a78f4268168a1219a30bb96ce37e5a73d6175a336947fa7376661667805e0a039c01490001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd004220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024f000102024a0001076553d07d1e80b22b6852656e98b3f090db89de729e0389bdd654050635ae4500000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf0d30012e000400000001022102773d842605766a0803e2ac601310b43cd2acbecd951a4910a915e8943e53ecb505030401011113000100020e69746573742d6d657461646174611604000001bb17590028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000f66697273742d6974657374627578788d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea0000000000", + "expected": "5441505000040000000102244b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d214968603900000000045000004020ebe7d064b7c1e2a01eb5735f80df5469cd6c55f14bc1485641edbbf95810933c3bcc6e9b36d6c86093fdbebc596b7be9bd04fdd323cf1fe1de59ae741073fab97b171b68ffff7f200000000006f6020000000001014b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d214968603900000000000000000002e8030000000000002251204c30c8bb3a1a3a5f55e1ebda4241d03193bc6c9154fdfd8d00f3435510861b7bbbd4f50500000000225120c2274fef4bd6ad7f5987436d79b3ba36372a68322d84c99ac29f7ebb6ca8112f0247304402207cdf34b4aeeff413ca928193f9fb2f4ddbb80bba0609c7c7a1246fae278cb08302202f0ae0dc7c966bb96b5523da324f78194bd02d74233161d290231abf1b9925780121033a1c7ae1018b60f5442d41901f5fff4b7edeb55ebe8320e70bdbdae19eacd3b600000000082201163d56141cba415dcb4b50d9649837117178dfd242682afe877f471c4d7e5f0c000af800010002594b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d2149686039000000000f66697273742d6974657374627578782903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb200000000000401000603fd05dc0b690167016500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0200001021023052b4c980baeba1526b3904e28473dbe8b3043b470c8e8a8bb331c62f9151370cc7000400000000022103ad9320aa0ee72927e3a5e86dcd01df24b73627f4abe2aa7ed45f631524c62dce039c014900010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982704220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024f000102024a0001e630f19c519c1d8785c7dbd04a7de8b2d651ae98ad2c3cd7e4dec8d95c3d2efa00000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f0d30012e000400000001022102667ea48169e6d324b6cf160385647cb37289c7237f38b8e1b20695620200e79f05030401011119000100020e69746573742d6d657461646174610504000000001604000001b817594b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d2149686039000000000f66697273742d6974657374627578782903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb20000000000", "comment": "valid regtest proof file index 0" }, { "proof": { - "prev_out": "2be239d331bc16887e14152ff0da00a7aa6e31899e965cb416440392e9f1d84c:0", + "version": 1, + "prev_out": "f463096e5dac45f1dd2b88b88888bb5f6238b7c1ac5a70c3e438d1206da7175e:0", "block_header": { "version": 541065216, - "prev_block": "4dd6b9ddde034e8e52c3bb87c89c122ebd4218dbe59cf04628e922a9157703db", - "merkle_root": "d436faeefca8d43f5d5392ac766ebe6f637546fe838754021efe6217eff72be8", - "timestamp": 1733521991, + "prev_block": "55608119c29270257596e9f7322cf9bedf7248654850287c8c31337755d2ead3", + "merkle_root": "4ff19be3bdf98535d464a228677379f3952ca4cd8e69d7880723e4a1e2576e6d", + "timestamp": 1746605947, "bits": 545259519, - "nonce": 1 + "nonce": 0 }, - "block_height": 444, - "anchor_tx": "020000000001024cd8f1e992034416b45c969e89316eaaa700daf02f15147e8816bc31d339e22b000000000000000000062736a1f2dbc0332040eafe375e4922ace3da94f88ada2ce397e7914014a32500000000000000000003e8030000000000002251203efafc563c1ffb16afc844abe35e48ea0303bf8b03753c640da1924f81b79408e8030000000000002251208eb3db333954f26aa1eacd5f057b60a32c59987e0226b58dc8debb033bdee3e6a9d0f50500000000225120f09fc5609b3c82f778d27fe3f8e9b88a10edcebc7c35864940049991bf4445650140b4622c62287ae87d96fffa7fd34f58708b0d1e6f4ae5a85fc6705781dd92711129d9cd0e3774fdb0fa048d3bbc559dd3d8d76b84d56928025ef24ba0b1940a7d02473044022006229b6e9c59a1c5d68ced672808f075382b3b5c5bf44eb1c9e993593d4807c102206667b3a902f71aab2ddbaafe2cef32f1bde17da6522444e87fe1fd50d5aa90f20121025d3b26142dcb90504cbfbbbf70d92fc7579198ffe9bf497a3bf2c55df892512600000000", + "block_height": 442, + "anchor_tx": "020000000001025e17a76d20d138e4c3705aacc1b738625fbb8888b8882bddf145ac5d6e0963f40000000000000000007ec13f2cadbacf5cd70dba6b9ca81c6031f9ca13a61ea015490c663ed26062de00000000000000000003e80300000000000022512066bad917311f886e3daad2314db2d57d7f7de247cad3f6894630698af12269b6e803000000000000225120268297537e4bc910a16f4da764c2b19ea9afcf1cdb284b702c6a88a4b4138b01a0cff505000000002251206f45635211bf49ccee0eba7b6fc333ba5cfcb26369592e689ddc38dd2720bfe80140161a318f5341fd9726932ea6a5153c1f12e9b55887e0d8b780251e66aedbe262cccf7b466c599c96c7b4a31055d333c71aeaa974beafd195a32e9fb18d55bbd502483045022100f230a8a247e4a81922a9a0c5601de898199f72fcb23976fd844b2485b3802fd902207ed47d48a2c4c9b80a899ee209888ba2d510d047398df4b9c1e08bee68545b77012102bc0b975ee15425e28f6f0f45c70006d88fe53332a8122941be26bdb0d5315d2600000000", "tx_merkle_proof": { "nodes": [ - "c2ee73aa535a0a57b958ba0778c184cdf5123bd77fd5bbf6caac5e42e7c305da" + "31c232cb99ef548457acae720d5ca7c0c49c44f76ea652a4978b1a5cfb4ef362" ], "bits": [ false @@ -718,9 +802,9 @@ }, "asset": { "version": 0, - "genesis_first_prev_out": "473e0595de903c0ae6b627790bc1555a4a631e3a88d608603a28982c50ff2800:0", + "genesis_first_prev_out": "39606849213d33394c4fc8d0b890852fd97963399a204419f760af2267375f4b:0", "genesis_tag": "first-itestbuxx", - "genesis_meta_hash": "8d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea", + "genesis_meta_hash": "2903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb2", "genesis_output_index": 0, "genesis_type": 0, "amount": 1200, @@ -735,12 +819,12 @@ }, "tx_witness": null, "split_commitment": { - "proof": "00019f433ee26a1e6288bce58cbd0d77858201e55803f967db9e746197d059b1c422000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf", + "proof": "00018da6fc4e296871e0358f5c1fc8bd25fc2cdc10239ed9348a0d12a917a5aef05f000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", "root_asset": { "version": 0, - "genesis_first_prev_out": "473e0595de903c0ae6b627790bc1555a4a631e3a88d608603a28982c50ff2800:0", + "genesis_first_prev_out": "39606849213d33394c4fc8d0b890852fd97963399a204419f760af2267375f4b:0", "genesis_tag": "first-itestbuxx", - "genesis_meta_hash": "8d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea", + "genesis_meta_hash": "2903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb2", "genesis_output_index": 0, "genesis_type": 0, "amount": 300, @@ -749,22 +833,22 @@ "prev_witnesses": [ { "prev_id": { - "out_point": "2be239d331bc16887e14152ff0da00a7aa6e31899e965cb416440392e9f1d84c:0", - "asset_id": "898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0", - "script_key": "025a5db7890fdd454db5d189d06880286b0d132c4709f1baee470a558276e3af5c" + "out_point": "f463096e5dac45f1dd2b88b88888bb5f6238b7c1ac5a70c3e438d1206da7175e:0", + "asset_id": "8b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827", + "script_key": "023052b4c980baeba1526b3904e28473dbe8b3043b470c8e8a8bb331c62f915137" }, "tx_witness": [ - "db1a68629f9408fd95e5dbd819380435bbad52c66746baabcc037ef6076cf215ecab264159bbbd922ae57a4890599f657dacc5a09d56785f08f7adad54e974d1" + "4790e7b5a859402602f0311be947807fe439e0db54bca2ffe900cf19913f8b027aa1a6252022c8185d1513fb6644d2949957cc8f80392cc96b4ce53036107e3b" ], "split_commitment": null } ], "split_commitment_root": { - "hash": "c96ba1c3534f04149b2480923fc13d0e55e5251c01610317d48e1f0e7b9d2195", + "hash": "cf4b64ddca9189e4a4ae95be04f3803a0bf94173ed89c5d4948a75c2b6eb76a2", "sum": "1500" }, "script_version": 0, - "script_key": "02adc1cf482226b3c4d0fac399e97302f4d7260f4ba782cd9cfbdb3c7ce94cd1e4", + "script_key": "023c99cc00a4a984d2ca54650f7b84beced5694ca9cfcde797625b5897209a2f31", "group_key": null, "unknown_odd_types": null } @@ -773,19 +857,19 @@ ], "split_commitment_root": null, "script_version": 0, - "script_key": "02e2356b87d6435363aaa7a763eeeb3818000527783c0c4ed72999a4853ef2a23b", + "script_key": "02e64ca3dd8dab4edaeff6c1e40f321e4d711821427719dfa35927e472a3147a66", "group_key": null, "unknown_odd_types": null }, "inclusion_proof": { "output_index": 1, - "internal_key": "03687c05eb0dade4141769314d1fe89ac712b1c6de66a228110189bd3b278f0fe9", + "internal_key": "025471f8ec9a258c589bb3fd88034c26916e4610fe2891f56d089fe93f2097a319", "commitment_proof": { "proof": { "asset_proof": { "proof": "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "version": 0, - "tap_key": "898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0", + "tap_key": "8b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827", "unknown_odd_types": null }, "taproot_asset_proof": { @@ -796,6 +880,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -804,23 +889,24 @@ "exclusion_proofs": [ { "output_index": 0, - "internal_key": "03f8a796072d4b2f087f67973504600feafc628eaf76359d319470b186d8ccea0a", + "internal_key": "028eea48c8614c55e5da36a3c62f03721ae08b498b9944c1d698f7cc64a32a8ee9", "commitment_proof": { "proof": { "asset_proof": { - "proof": "00016201f1a088494f6a5b061a15c62c509b5a9f412bc067f6bb279c5597ea97cecf000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdf", + "proof": "000107cebd3d1c01550b10448b3467b26d05a60b17d4bdf0b479c7d7991f5d6e8c1a000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", "version": 0, - "tap_key": "898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0", + "tap_key": "8b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827", "unknown_odd_types": null }, "taproot_asset_proof": { - "proof": "0001464f6165e2b5fc1660dcecb3c02aabbae36fa0426457c5d976fd6d073328e49400000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf", + "proof": "0001dd257d24585d78435cda93f55fd3b0f95d8885af3aae9dea6d39f8284e1f9ce000000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", "version": 2, "unknown_odd_types": null }, "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -828,7 +914,7 @@ }, { "output_index": 2, - "internal_key": "026019f70d187fdb882da16113e08014f667d05980997df3abd39bb322801b834b", + "internal_key": "025138fa85569580f78cdbb9d602a7d1d0443f01fb3bf52ad62a4539db3d90024e", "commitment_proof": null, "tapscript_proof": { "tap_preimage_1": "", @@ -841,23 +927,24 @@ ], "split_root_proof": { "output_index": 0, - "internal_key": "03f8a796072d4b2f087f67973504600feafc628eaf76359d319470b186d8ccea0a", + "internal_key": "028eea48c8614c55e5da36a3c62f03721ae08b498b9944c1d698f7cc64a32a8ee9", "commitment_proof": { "proof": { "asset_proof": { "proof": "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "version": 0, - "tap_key": "898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0", + "tap_key": "8b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827", "unknown_odd_types": null }, "taproot_asset_proof": { - "proof": "0001464f6165e2b5fc1660dcecb3c02aabbae36fa0426457c5d976fd6d073328e49400000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf", + "proof": "0001dd257d24585d78435cda93f55fd3b0f95d8885af3aae9dea6d39f8284e1f9ce000000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", "version": 2, "unknown_odd_types": null }, "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -871,25 +958,26 @@ "alt_leaves": null, "unknown_odd_types": null }, - "expected": "5441505000040000000002244cd8f1e992034416b45c969e89316eaaa700daf02f15147e8816bc31d339e22b00000000045000004020db037715a922e92846f09ce5db1842bd2e129cc887bbc3528e4e03deddb9d64de82bf7ef1762fe1e02548783fe4675636fbe6e76ac92535d3fd4a8fceefa36d447725367ffff7f200100000006fd018c020000000001024cd8f1e992034416b45c969e89316eaaa700daf02f15147e8816bc31d339e22b000000000000000000062736a1f2dbc0332040eafe375e4922ace3da94f88ada2ce397e7914014a32500000000000000000003e8030000000000002251203efafc563c1ffb16afc844abe35e48ea0303bf8b03753c640da1924f81b79408e8030000000000002251208eb3db333954f26aa1eacd5f057b60a32c59987e0226b58dc8debb033bdee3e6a9d0f50500000000225120f09fc5609b3c82f778d27fe3f8e9b88a10edcebc7c35864940049991bf4445650140b4622c62287ae87d96fffa7fd34f58708b0d1e6f4ae5a85fc6705781dd92711129d9cd0e3774fdb0fa048d3bbc559dd3d8d76b84d56928025ef24ba0b1940a7d02473044022006229b6e9c59a1c5d68ced672808f075382b3b5c5bf44eb1c9e993593d4807c102206667b3a902f71aab2ddbaafe2cef32f1bde17da6522444e87fe1fd50d5aa90f20121025d3b26142dcb90504cbfbbbf70d92fc7579198ffe9bf497a3bf2c55df892512600000000082201da05c3e7425eaccaf6bbd57fd73b12f5cd84c17807ba58b9570a5a53aa73eec2000afd02b400010002590028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000f66697273742d6974657374627578788d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea00000000000401000603fd04b00bfd022301fd021f0165000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fd01b44a00019f433ee26a1e6288bce58cbd0d77858201e55803f967db9e746197d059b1c422000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbffd016600010002590028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000f66697273742d6974657374627578788d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea00000000000401000603fd012c0bad01ab01654cd8f1e992034416b45c969e89316eaaa700daf02f15147e8816bc31d339e22b00000000898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0025a5db7890fdd454db5d189d06880286b0d132c4709f1baee470a558276e3af5c03420140db1a68629f9408fd95e5dbd819380435bbad52c66746baabcc037ef6076cf215ecab264159bbbd922ae57a4890599f657dacc5a09d56785f08f7adad54e974d10d28c96ba1c3534f04149b2480923fc13d0e55e5251c01610317d48e1f0e7b9d219500000000000005dc0e020000102102adc1cf482226b3c4d0fac399e97302f4d7260f4ba782cd9cfbdb3c7ce94cd1e40e020000102102e2356b87d6435363aaa7a763eeeb3818000527783c0c4ed72999a4853ef2a23b0c9f000400000001022103687c05eb0dade4141769314d1fe89ac712b1c6de66a228110189bd3b278f0fe9037401490001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd004220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0dfd012002ef000400000000022103f8a796072d4b2f087f67973504600feafc628eaf76359d319470b186d8ccea0a03c401710001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0044a00016201f1a088494f6a5b061a15c62c509b5a9f412bc067f6bb279c5597ea97cecf000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffdf024f000102024a0001464f6165e2b5fc1660dcecb3c02aabbae36fa0426457c5d976fd6d073328e49400000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf2e0004000000020221026019f70d187fdb882da16113e08014f667d05980997df3abd39bb322801b834b05030401010fc7000400000000022103f8a796072d4b2f087f67973504600feafc628eaf76359d319470b186d8ccea0a039c01490001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd004220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024f000102024a0001464f6165e2b5fc1660dcecb3c02aabbae36fa0426457c5d976fd6d073328e49400000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbf1604000001bc", + "expected": "5441505000040000000102245e17a76d20d138e4c3705aacc1b738625fbb8888b8882bddf145ac5d6e0963f400000000045000004020d3ead2557733318c7c285048654872dfbef92c32f7e99675257092c2198160556d6e57e2a1e4230788d7698ecda42c95f379736728a264d43585f9bde39bf14f7b171b68ffff7f200000000006fd018d020000000001025e17a76d20d138e4c3705aacc1b738625fbb8888b8882bddf145ac5d6e0963f40000000000000000007ec13f2cadbacf5cd70dba6b9ca81c6031f9ca13a61ea015490c663ed26062de00000000000000000003e80300000000000022512066bad917311f886e3daad2314db2d57d7f7de247cad3f6894630698af12269b6e803000000000000225120268297537e4bc910a16f4da764c2b19ea9afcf1cdb284b702c6a88a4b4138b01a0cff505000000002251206f45635211bf49ccee0eba7b6fc333ba5cfcb26369592e689ddc38dd2720bfe80140161a318f5341fd9726932ea6a5153c1f12e9b55887e0d8b780251e66aedbe262cccf7b466c599c96c7b4a31055d333c71aeaa974beafd195a32e9fb18d55bbd502483045022100f230a8a247e4a81922a9a0c5601de898199f72fcb23976fd844b2485b3802fd902207ed47d48a2c4c9b80a899ee209888ba2d510d047398df4b9c1e08bee68545b77012102bc0b975ee15425e28f6f0f45c70006d88fe53332a8122941be26bdb0d5315d260000000008220162f34efb5c1a8b97a452a66ef7449cc4c0a75c0d72aeac578454ef99cb32c231000afd02b400010002594b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d2149686039000000000f66697273742d6974657374627578782903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb200000000000401000603fd04b00bfd022301fd021f0165000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fd01b44a00018da6fc4e296871e0358f5c1fc8bd25fc2cdc10239ed9348a0d12a917a5aef05f000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffd016600010002594b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d2149686039000000000f66697273742d6974657374627578782903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb200000000000401000603fd012c0bad01ab01655e17a76d20d138e4c3705aacc1b738625fbb8888b8882bddf145ac5d6e0963f4000000008b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827023052b4c980baeba1526b3904e28473dbe8b3043b470c8e8a8bb331c62f915137034201404790e7b5a859402602f0311be947807fe439e0db54bca2ffe900cf19913f8b027aa1a6252022c8185d1513fb6644d2949957cc8f80392cc96b4ce53036107e3b0d28cf4b64ddca9189e4a4ae95be04f3803a0bf94173ed89c5d4948a75c2b6eb76a200000000000005dc0e0200001021023c99cc00a4a984d2ca54650f7b84beced5694ca9cfcde797625b5897209a2f310e020000102102e64ca3dd8dab4edaeff6c1e40f321e4d711821427719dfa35927e472a3147a660c9f0004000000010221025471f8ec9a258c589bb3fd88034c26916e4610fe2891f56d089fe93f2097a3190374014900010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982704220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0dfd012002ef0004000000000221028eea48c8614c55e5da36a3c62f03721ae08b498b9944c1d698f7cc64a32a8ee903c4017100010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827044a000107cebd3d1c01550b10448b3467b26d05a60b17d4bdf0b479c7d7991f5d6e8c1a000000000000012cffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f024f000102024a0001dd257d24585d78435cda93f55fd3b0f95d8885af3aae9dea6d39f8284e1f9ce000000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f2e0004000000020221025138fa85569580f78cdbb9d602a7d1d0443f01fb3bf52ad62a4539db3d90024e05030401010fc70004000000000221028eea48c8614c55e5da36a3c62f03721ae08b498b9944c1d698f7cc64a32a8ee9039c014900010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982704220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024f000102024a0001dd257d24585d78435cda93f55fd3b0f95d8885af3aae9dea6d39f8284e1f9ce000000000000007d0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f1604000001ba", "comment": "valid regtest proof file index 1" }, { "proof": { - "prev_out": "9b8e1b77f8dd96171defee350330f075e13d15ad3a2e6f66d6d45250edfd4641:1", + "version": 1, + "prev_out": "d3afe9e3c916f832513d98d4ab1c420fe1349339b996752d772aab884f992779:1", "block_header": { "version": 541065216, - "prev_block": "6e3216d33065117fd21808e13bb7f4e97d2df965400ace33ce8ad2f9d6cdb7f8", - "merkle_root": "27b1568a6de74bcf03dab3c8057c773de13e158c917627870484ec88bae7cba8", - "timestamp": 1733521992, + "prev_block": "08fc3b89267f97bfc5ca11eee99fdae76ced9d200dc9ab85fa3012e5efd2d2ba", + "merkle_root": "639abb6f91489a65463b4dd3d9f452063b709d22f5971db5210a25ea3475c846", + "timestamp": 1746605947, "bits": 545259519, "nonce": 0 }, - "block_height": 446, - "anchor_tx": "020000000001024146fded5052d4d6666f2e3aad153de175f0300335eeef1d1796ddf8771b8e9b0100000000000000007a6aed31fe675df9f3cbb30ec93c6aa64c0357ee95e041b68209dd0405126ea100000000000000000003e803000000000000225120b39d40166eab936be97ba489bd3e0b804fbd3c405b6b4dd853a7ecd645c7b8c9e803000000000000225120c439941c12ce99347f4a629a938835f2cdd7cc2646da97f18c52b4f17a18b0f4a9d0f505000000002251208ea64fa1adc917b9a9f7b6f4d671faa71a3ce538e4d22f2bc7696b2228448a2801400a89ab38452e2851d9b8a8faa24078d5517588fa2c857a2b4be65c0ac56631771139a245721a0b70e75e0c33a6eec16ee1d540c00489c8321569edc4e0d3e57f02473044022053b3677ee4a83b5b64d25f6c9f6d03a6678f2daeecad0966b7f1bfcb43f86b6a022041be57f3ca6ce364e28ae4991633ba9a4198f2a8ecd4489e4e1998cd447d8ff3012102dd95677d998373268ea2e0fd1a9bdd62e74eaee0db36ae080957c8f4732448c400000000", + "block_height": 444, + "anchor_tx": "020000000001027927994f88ab2a772d7596b9399334e10f421cabd4983d5132f816c9e3e9afd3010000000000000000840cb35380def99e176c847593a130130503c99077b9368b50364cb98eeefa8f00000000000000000003e803000000000000225120ab81d41661f2b8a3401f8d9303279e3021686979f3aa0e2d327a5f6dcfdae5dae803000000000000225120093ddfcb23ee2396d3d7c9797ba2d14190298362fb1f49afff253045b313e9aba0cff50500000000225120029597d98d911f027a053603674eb4b0775a184437f71611bfc6a934075fee6701400995f52d1eb51781d5ea32d6ed68b9de997e11573e1ade6b32378159637417021ae54061ba7c92cdbcc75c5688991d69fb0d1290ceb6d6346ecd06efd2a1aef802473044022047b887847dc08ecf0d2f0ffe3dbfc640a29941c89e5a2fbece78ce52622c898a02204e05575f33e8225de0b693d276b1fe69d66404f327da0b32fb7176d7f8e2a4c401210264d6a3866048257a98bd8f0b031a6d0a6fb04d2978b3991bb07a1c679bce82ca00000000", "tx_merkle_proof": { "nodes": [ - "253153c75426a337a3a39e660e3d5d3a7a2943596ff1e53c8910ad5cad738656" + "aa723d45505035dd40df705dff0622830a8bad8fa254732ba60abea4ebddbee4" ], "bits": [ false @@ -897,9 +985,9 @@ }, "asset": { "version": 0, - "genesis_first_prev_out": "473e0595de903c0ae6b627790bc1555a4a631e3a88d608603a28982c50ff2800:0", + "genesis_first_prev_out": "39606849213d33394c4fc8d0b890852fd97963399a204419f760af2267375f4b:0", "genesis_tag": "first-itestbuxx", - "genesis_meta_hash": "8d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea", + "genesis_meta_hash": "2903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb2", "genesis_output_index": 0, "genesis_type": 0, "amount": 600, @@ -914,12 +1002,12 @@ }, "tx_witness": null, "split_commitment": { - "proof": "000171eba4c1f1a64d5342c68cfcfce96a3332c936824f676cc047db8c79bf24f8ba0000000000000258ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", + "proof": "000104ff34d7602b93f4de90c950cabc0786041ca8ea181874b7a62a1853bd2fc26b0000000000000258ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", "root_asset": { "version": 0, - "genesis_first_prev_out": "473e0595de903c0ae6b627790bc1555a4a631e3a88d608603a28982c50ff2800:0", + "genesis_first_prev_out": "39606849213d33394c4fc8d0b890852fd97963399a204419f760af2267375f4b:0", "genesis_tag": "first-itestbuxx", - "genesis_meta_hash": "8d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea", + "genesis_meta_hash": "2903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb2", "genesis_output_index": 0, "genesis_type": 0, "amount": 600, @@ -928,22 +1016,22 @@ "prev_witnesses": [ { "prev_id": { - "out_point": "9b8e1b77f8dd96171defee350330f075e13d15ad3a2e6f66d6d45250edfd4641:1", - "asset_id": "898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0", - "script_key": "02e2356b87d6435363aaa7a763eeeb3818000527783c0c4ed72999a4853ef2a23b" + "out_point": "d3afe9e3c916f832513d98d4ab1c420fe1349339b996752d772aab884f992779:1", + "asset_id": "8b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827", + "script_key": "02e64ca3dd8dab4edaeff6c1e40f321e4d711821427719dfa35927e472a3147a66" }, "tx_witness": [ - "62f411bf03948cb3ca8a887a6449b1b99f93458e1c2f837ec20c7759461ad433bdeb43fc3abf29cde2cb2680e3f1c7a5ac60dc5833042ed31067f80c57b28537" + "89e2b3dfa864dcc4e6f431ea5a02fa8f75fdd4d5e5afc39b35fa9f99196cc2170a3c59b18d804917d6e6483605a2be43d1a492e3e044a2e486ff2378d6476739" ], "split_commitment": null } ], "split_commitment_root": { - "hash": "94c638977dfebc6426564611a74aedddb57c7664e9278213cfcce97de38733f0", + "hash": "4959b54e380d3cf0060dc2f243591ed4e573fe20d58ac16c0083f672b7289550", "sum": "1200" }, "script_version": 0, - "script_key": "0273567b487064507c8bb16c912e8ec608bf09f2d461a89bfe63c37a7b3fdd21fa", + "script_key": "0237917fdd78c0170e0c84d8c7094e675614ec9779e7ba480bbadfd4f6e5395b84", "group_key": null, "unknown_odd_types": null } @@ -952,19 +1040,19 @@ ], "split_commitment_root": null, "script_version": 0, - "script_key": "02550807e261f1add28272dd1dc99979f7bb0e87982c296d52d7b58fba2c1a68e4", + "script_key": "022f116a38175b27e2dbb6a1cd809086e1a30c73e116831d41df2f4d1b825539ab", "group_key": null, "unknown_odd_types": null }, "inclusion_proof": { "output_index": 1, - "internal_key": "026f8944cb3cc0e077dedfbe312cbe6071861bec5cdc055ff6fe7fe26f5a5b8357", + "internal_key": "03816d48eb51bc220f7bd1234c439f8a8701e582784a79bf25721dba4979526f5f", "commitment_proof": { "proof": { "asset_proof": { "proof": "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "version": 0, - "tap_key": "898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0", + "tap_key": "8b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827", "unknown_odd_types": null }, "taproot_asset_proof": { @@ -975,6 +1063,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -983,23 +1072,24 @@ "exclusion_proofs": [ { "output_index": 0, - "internal_key": "028d87ba784f1639cb7d85f0d1f79e3a0f36a32b745aa84ef5e175aee24ab4631f", + "internal_key": "02f3539c14a7f7edb9969a39b47a49bf25b40e159845b3640669be51ead2e0eb36", "commitment_proof": { "proof": { "asset_proof": { - "proof": "00014c598c9376185fd1dfb86659a5c3675bab19595cf1abf5a1cc7b7dc887d607cf0000000000000258fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7", + "proof": "000166f3036b2d11969be7909bd31a463b2dd164b7e8b8c3a031732b0369754d505b0000000000000258ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", "version": 0, - "tap_key": "898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0", + "tap_key": "8b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827", "unknown_odd_types": null }, "taproot_asset_proof": { - "proof": "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "proof": "000143891c4822d4efc0702e21b8769d503d8ff1c852ec538e34f89172f57a0a31080000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", "version": 2, "unknown_odd_types": null }, "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -1007,7 +1097,7 @@ }, { "output_index": 2, - "internal_key": "027e12e36f36b1b39f15cf888cc4ec443dea1f07082fb35ea2f2d170c782687e73", + "internal_key": "02b8ef3ea2e4de049f54a367c99dcd6ea4767fb440899b8d6fea65f830f697f7af", "commitment_proof": null, "tapscript_proof": { "tap_preimage_1": "", @@ -1020,23 +1110,24 @@ ], "split_root_proof": { "output_index": 0, - "internal_key": "028d87ba784f1639cb7d85f0d1f79e3a0f36a32b745aa84ef5e175aee24ab4631f", + "internal_key": "02f3539c14a7f7edb9969a39b47a49bf25b40e159845b3640669be51ead2e0eb36", "commitment_proof": { "proof": { "asset_proof": { "proof": "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "version": 0, - "tap_key": "898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0", + "tap_key": "8b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827", "unknown_odd_types": null }, "taproot_asset_proof": { - "proof": "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + "proof": "000143891c4822d4efc0702e21b8769d503d8ff1c852ec538e34f89172f57a0a31080000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f", "version": 2, "unknown_odd_types": null }, "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -1050,7 +1141,7 @@ "alt_leaves": null, "unknown_odd_types": null }, - "expected": "5441505000040000000002244146fded5052d4d6666f2e3aad153de175f0300335eeef1d1796ddf8771b8e9b00000001045000004020f8b7cdd6f9d28ace33ce0a4065f92d7de9f4b73be10818d27f116530d316326ea8cbe7ba88ec8404872776918c153ee13d777c05c8b3da03cf4be76d8a56b12748725367ffff7f200000000006fd018c020000000001024146fded5052d4d6666f2e3aad153de175f0300335eeef1d1796ddf8771b8e9b0100000000000000007a6aed31fe675df9f3cbb30ec93c6aa64c0357ee95e041b68209dd0405126ea100000000000000000003e803000000000000225120b39d40166eab936be97ba489bd3e0b804fbd3c405b6b4dd853a7ecd645c7b8c9e803000000000000225120c439941c12ce99347f4a629a938835f2cdd7cc2646da97f18c52b4f17a18b0f4a9d0f505000000002251208ea64fa1adc917b9a9f7b6f4d671faa71a3ce538e4d22f2bc7696b2228448a2801400a89ab38452e2851d9b8a8faa24078d5517588fa2c857a2b4be65c0ac56631771139a245721a0b70e75e0c33a6eec16ee1d540c00489c8321569edc4e0d3e57f02473044022053b3677ee4a83b5b64d25f6c9f6d03a6678f2daeecad0966b7f1bfcb43f86b6a022041be57f3ca6ce364e28ae4991633ba9a4198f2a8ecd4489e4e1998cd447d8ff3012102dd95677d998373268ea2e0fd1a9bdd62e74eaee0db36ae080957c8f4732448c400000000082201568673ad5cad10893ce5f16f5943297a3a5d3d0e669ea3a337a32654c7533125000afd02b400010002590028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000f66697273742d6974657374627578788d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea00000000000401000603fd02580bfd022301fd021f0165000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fd01b44a000171eba4c1f1a64d5342c68cfcfce96a3332c936824f676cc047db8c79bf24f8ba0000000000000258ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffd016600010002590028ff502c98283a6008d6883a1e634a5a55c10b7927b6e60a3c90de95053e47000000000f66697273742d6974657374627578788d3b306cb9fc3bc5478adccf848583d8952d793747c31dddfd486d7d5d84efea00000000000401000603fd02580bad01ab01654146fded5052d4d6666f2e3aad153de175f0300335eeef1d1796ddf8771b8e9b00000001898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd002e2356b87d6435363aaa7a763eeeb3818000527783c0c4ed72999a4853ef2a23b0342014062f411bf03948cb3ca8a887a6449b1b99f93458e1c2f837ec20c7759461ad433bdeb43fc3abf29cde2cb2680e3f1c7a5ac60dc5833042ed31067f80c57b285370d2894c638977dfebc6426564611a74aedddb57c7664e9278213cfcce97de38733f000000000000004b00e02000010210273567b487064507c8bb16c912e8ec608bf09f2d461a89bfe63c37a7b3fdd21fa0e020000102102550807e261f1add28272dd1dc99979f7bb0e87982c296d52d7b58fba2c1a68e40c9f0004000000010221026f8944cb3cc0e077dedfbe312cbe6071861bec5cdc055ff6fe7fe26f5a5b8357037401490001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd004220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0df802c70004000000000221028d87ba784f1639cb7d85f0d1f79e3a0f36a32b745aa84ef5e175aee24ab4631f039c01710001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd0044a00014c598c9376185fd1dfb86659a5c3675bab19595cf1abf5a1cc7b7dc887d607cf0000000000000258fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff2e0004000000020221027e12e36f36b1b39f15cf888cc4ec443dea1f07082fb35ea2f2d170c782687e7305030401010f9f0004000000000221028d87ba784f1639cb7d85f0d1f79e3a0f36a32b745aa84ef5e175aee24ab4631f037401490001000220898e84dbe0f54e8c551fa7f45e8299c57239a4cdd9d5641da75eaf83a577fdd004220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1604000001be", + "expected": "5441505000040000000102247927994f88ab2a772d7596b9399334e10f421cabd4983d5132f816c9e3e9afd300000001045000004020bad2d2efe51230fa85abc90d209ded6ce7da9fe9ee11cac5bf977f26893bfc0846c87534ea250a21b51d97f5229d703b0652f4d9d34d3b46659a48916fbb9a637b171b68ffff7f200000000006fd018c020000000001027927994f88ab2a772d7596b9399334e10f421cabd4983d5132f816c9e3e9afd3010000000000000000840cb35380def99e176c847593a130130503c99077b9368b50364cb98eeefa8f00000000000000000003e803000000000000225120ab81d41661f2b8a3401f8d9303279e3021686979f3aa0e2d327a5f6dcfdae5dae803000000000000225120093ddfcb23ee2396d3d7c9797ba2d14190298362fb1f49afff253045b313e9aba0cff50500000000225120029597d98d911f027a053603674eb4b0775a184437f71611bfc6a934075fee6701400995f52d1eb51781d5ea32d6ed68b9de997e11573e1ade6b32378159637417021ae54061ba7c92cdbcc75c5688991d69fb0d1290ceb6d6346ecd06efd2a1aef802473044022047b887847dc08ecf0d2f0ffe3dbfc640a29941c89e5a2fbece78ce52622c898a02204e05575f33e8225de0b693d276b1fe69d66404f327da0b32fb7176d7f8e2a4c401210264d6a3866048257a98bd8f0b031a6d0a6fb04d2978b3991bb07a1c679bce82ca00000000082201e4beddeba4be0aa62b7354a28fad8b0a832206ff5d70df40dd355050453d72aa000afd02b400010002594b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d2149686039000000000f66697273742d6974657374627578782903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb200000000000401000603fd02580bfd022301fd021f0165000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fd01b44a000104ff34d7602b93f4de90c950cabc0786041ca8ea181874b7a62a1853bd2fc26b0000000000000258ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7ffd016600010002594b5f376722af60f71944209a396379d92f8590b8d0c84f4c39333d2149686039000000000f66697273742d6974657374627578782903629f38feee5e92059430922a9f474fa5afb3cca01fa29eb9e376e7680cb200000000000401000603fd02580bad01ab01657927994f88ab2a772d7596b9399334e10f421cabd4983d5132f816c9e3e9afd3000000018b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982702e64ca3dd8dab4edaeff6c1e40f321e4d711821427719dfa35927e472a3147a660342014089e2b3dfa864dcc4e6f431ea5a02fa8f75fdd4d5e5afc39b35fa9f99196cc2170a3c59b18d804917d6e6483605a2be43d1a492e3e044a2e486ff2378d64767390d284959b54e380d3cf0060dc2f243591ed4e573fe20d58ac16c0083f672b728955000000000000004b00e02000010210237917fdd78c0170e0c84d8c7094e675614ec9779e7ba480bbadfd4f6e5395b840e0200001021022f116a38175b27e2dbb6a1cd809086e1a30c73e116831d41df2f4d1b825539ab0c9f000400000001022103816d48eb51bc220f7bd1234c439f8a8701e582784a79bf25721dba4979526f5f0374014900010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982704220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff022700010202220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0dfd012002ef000400000000022102f3539c14a7f7edb9969a39b47a49bf25b40e159845b3640669be51ead2e0eb3603c4017100010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb69827044a000166f3036b2d11969be7909bd31a463b2dd164b7e8b8c3a031732b0369754d505b0000000000000258ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f024f000102024a000143891c4822d4efc0702e21b8769d503d8ff1c852ec538e34f89172f57a0a31080000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f2e000400000002022102b8ef3ea2e4de049f54a367c99dcd6ea4767fb440899b8d6fea65f830f697f7af05030401010fc7000400000000022102f3539c14a7f7edb9969a39b47a49bf25b40e159845b3640669be51ead2e0eb36039c014900010002208b18d2844dfc86e7f6b158e2d280f0c8f36bf2f58aa66a34ba7219b04bb6982704220000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff024f000102024a000143891c4822d4efc0702e21b8769d503d8ff1c852ec538e34f89172f57a0a31080000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f1604000001bc", "comment": "valid regtest proof file index 2" } ], diff --git a/proof/verifier.go b/proof/verifier.go index ebca81f1e..96c43994e 100644 --- a/proof/verifier.go +++ b/proof/verifier.go @@ -79,6 +79,12 @@ type Verifier interface { type BaseVerifier struct { } +// P2TROutputsSTXOs is used to track stxo proofs per p2tr output in the anchor +// transaction. +type P2TROutputsSTXOs = map[uint32]fn.Set[asset.SerializedKey] + +type CommittedVersions = map[uint32][]commitment.TapCommitmentVersion + // Verify takes the passed serialized proof file, and returns a nil // error if the proof file is valid. A valid file should return an // AssetSnapshot of the final state transition of the file. @@ -165,9 +171,52 @@ func verifyTaprootProof(anchor *wire.MsgTx, proof *TaprootProof, // verifyInclusionProof verifies the InclusionProof is valid. func (p *Proof) verifyInclusionProof() (*commitment.TapCommitment, error) { - return verifyTaprootProof( - &p.AnchorTx, &p.InclusionProof, &p.Asset, true, + // Determine if we're dealing with v0 or v1 proofs. + hasV1Proofs := p.IsVersionV1() && + p.InclusionProof.CommitmentProof != nil && + len(p.InclusionProof.CommitmentProof.STXOProofs) > 0 + + if !hasV1Proofs { + return verifyTaprootProof( + &p.AnchorTx, &p.InclusionProof, &p.Asset, true, + ) + } + + commitVersions := make(map[uint32][]commitment.TapCommitmentVersion) + p2trOutputs := make(P2TROutputsSTXOs) + outIdx := p.InclusionProof.OutputIndex + p2trOutputs[outIdx] = make(fn.Set[asset.SerializedKey]) + + // Collect the STXOs from the new asset. + stxoAssets, err := asset.CollectSTXO(&p.Asset) + if err != nil { + return nil, fmt.Errorf("error collecting STXO assets: %w", err) + } + + // Map STXOs by serialized key. + assetMap := make(map[asset.SerializedKey]*asset.Asset) + for idx := range stxoAssets { + stxoAsset := stxoAssets[idx].(*asset.Asset) + key := asset.ToSerialized(stxoAsset.ScriptKey.PubKey) + assetMap[key] = stxoAsset + p2trOutputs[outIdx].Add(key) + } + + baseProof := p.InclusionProof + + verifiedCommitment, err := verifySTXOProofSet( + &p.AnchorTx, baseProof, assetMap, p2trOutputs, commitVersions, + true, ) + if err != nil { + return nil, err + } + + if len(p2trOutputs) > 0 { + return nil, ErrInvalidCommitmentProof + } + + return verifiedCommitment, nil } // verifySplitRootProof verifies the SplitRootProof is valid. @@ -184,67 +233,221 @@ func (p *Proof) verifySplitRootProof() error { func (p *Proof) verifyExclusionProofs() (*commitment.TapCommitmentVersion, error) { - // Gather all P2TR outputs in the on-chain transaction. - p2trOutputs := make(map[uint32]struct{}) + // Gather all P2TR outputs in the on-chain transaction. The STXO proofs + // are tracked using a set of serialized keys. We ignore that set when + // verifying V0 exclusion proofs. + p2trOutputs := make(fn.Set[uint32]) for i, txOut := range p.AnchorTx.TxOut { if uint32(i) == p.InclusionProof.OutputIndex { continue } - if txscript.IsPayToTaproot(txOut.PkScript) { - p2trOutputs[uint32(i)] = struct{}{} + if !txscript.IsPayToTaproot(txOut.PkScript) { + continue } + + p2trOutputs.Add(uint32(i)) } - // Verify all of the encoded exclusion proofs. - commitVersions := make(map[uint32]commitment.TapCommitmentVersion) - for _, exclusionProof := range p.ExclusionProofs { - exclusionProof := exclusionProof + // There is nothing to check so return early. + if len(p2trOutputs) == 0 { + return nil, nil + } + + commitVersions := make(CommittedVersions) + + p2trOutputCopy := fn.NewSet(p2trOutputs.ToSlice()...) + err := p.verifyV0ExclusionProofs(p2trOutputCopy, commitVersions) + if err != nil { + return nil, err + } + + // Early pass to determine if we're dealing with v0 or v1 proofs. + hasV1Proofs := p.IsVersionV1() && + len(p.ExclusionProofs) > 0 && + p.ExclusionProofs[0].CommitmentProof != nil && + len(p.ExclusionProofs[0].CommitmentProof.STXOProofs) > 0 + + if hasV1Proofs { + p2trOutputCopy = fn.NewSet(p2trOutputs.ToSlice()...) + err := p.verifyV1ExclusionProofs(p2trOutputCopy, commitVersions) + if err != nil { + return nil, err + } + } + + // If no commitments in proofs, no version to return. + if len(commitVersions) == 0 { + return nil, nil + } + + // All proofs must have similar versions. + return verifySTXOVersions(commitVersions) +} + +// verifyV0ExclusionProofs verifies all version 1 exclusion proofs. +func (p *Proof) verifyV0ExclusionProofs(p2trOutputs fn.Set[uint32], + commitVersions CommittedVersions) error { + + // Verify all of the encoded v0 exclusion proofs. + for idx := range p.ExclusionProofs { + exclusionProof := p.ExclusionProofs[idx] + derivedCommitment, err := verifyTaprootProof( &p.AnchorTx, &exclusionProof, &p.Asset, false, ) if err != nil { - return nil, err + return fmt.Errorf("error verifying STXO proof: %w", err) } outputIdx := exclusionProof.OutputIndex - delete(p2trOutputs, outputIdx) + delete(p2trOutputs, exclusionProof.OutputIndex) - // Store the commitment version. If there was no Taproot Asset - // commitment present, then there is nothing to store. + // Store commitment version if Taproot Asset commitment present. if derivedCommitment != nil { - commitVersions[outputIdx] = derivedCommitment.Version + commitVersions[outputIdx] = append( + commitVersions[outputIdx], + derivedCommitment.Version, + ) } } // If any outputs are missing a proof, fail. if len(p2trOutputs) > 0 { - return nil, ErrMissingExclusionProofs + return ErrMissingExclusionProofs } - // If there were no commitments in any exclusion proofs, then there is - // no version to return. - if len(commitVersions) == 0 { - return nil, nil + return nil +} + +// verifyV1ExclusionProofs verifies all version 2 exclusion proofs. +func (p *Proof) verifyV1ExclusionProofs(p2trOutputs fn.Set[uint32], + commitVersions CommittedVersions) error { + + // Collect the STXOs from the new asset. + stxoAssets, err := asset.CollectSTXO(&p.Asset) + if err != nil { + return fmt.Errorf("error collecting STXO assets: %w", err) + } + + // Create a P2TROutputsSTXOs from p2trOutputs and map STXOs by + // serialized key. + assetMap := make(map[asset.SerializedKey]*asset.Asset) + p2trOutputsSTXOs := make(P2TROutputsSTXOs) + for outIdx := range p2trOutputs { + p2trOutputsSTXOs[outIdx] = make(fn.Set[asset.SerializedKey]) + } + + for idx := range stxoAssets { + stxoAsset := stxoAssets[idx].(*asset.Asset) + key := asset.ToSerialized(stxoAsset.ScriptKey.PubKey) + assetMap[key] = stxoAsset + for outIdx := range p2trOutputs { + p2trOutputsSTXOs[outIdx].Add(key) + } } - // All ExclusionProofs must have similar versions. - firstCommitVersion := maps.Values(commitVersions)[0] - for outputIdx, commitVersion := range commitVersions { - outputCommitVersion := commitVersion - if !commitment.IsSimilarTapCommitmentVersion( - &firstCommitVersion, &outputCommitVersion, - ) { + for idx := range p.ExclusionProofs { + exclusionProof := p.ExclusionProofs[idx] + if exclusionProof.TapscriptProof != nil && + exclusionProof.TapscriptProof.Bip86 { - log.Tracef("output %d commit version %d, first output "+ - "commit version %d", outputIdx, commitVersion, - firstCommitVersion) + continue + } - return nil, fmt.Errorf("mixed anchor commitment " + - "versions for exclusion proofs") + _, err := verifySTXOProofSet( + &p.AnchorTx, exclusionProof, assetMap, p2trOutputsSTXOs, + commitVersions, false, + ) + if err != nil { + return err + } + } + + return nil +} + +// verifySTXOProofSet verifies a set of STXO proofs. +func verifySTXOProofSet(anchorTx *wire.MsgTx, baseProof TaprootProof, + assetMap map[asset.SerializedKey]*asset.Asset, + p2trOutputs P2TROutputsSTXOs, + commitVersions map[uint32][]commitment.TapCommitmentVersion, + inclusion bool) (*commitment.TapCommitment, error) { + + var verifiedCommitment *commitment.TapCommitment + for key := range baseProof.CommitmentProof.STXOProofs { + stxoProof := baseProof.CommitmentProof.STXOProofs[key] + stxoAsset := assetMap[key] + stxoCombinedProof := MakeSTXOProof(baseProof, &stxoProof) + + var err error + verifiedCommitment, err = verifyTaprootProof( + anchorTx, &stxoCombinedProof, stxoAsset, inclusion, + ) + if err != nil { + return nil, fmt.Errorf("error verifying STXO "+ + "proof: %w", err) + } + + outIdx := stxoCombinedProof.OutputIndex + delete(p2trOutputs[outIdx], key) + if len(p2trOutputs[outIdx]) == 0 { + delete(p2trOutputs, outIdx) + } + + commitVersions[outIdx] = append( + commitVersions[outIdx], verifiedCommitment.Version, + ) + } + + return verifiedCommitment, nil +} + +// MakeSTXOProof creates a new proof for an STXO reusing the base proof while +// replacing commitmentProof but the stxoProof. +func MakeSTXOProof(baseProof TaprootProof, + stxoProof *commitment.Proof) TaprootProof { + + return TaprootProof{ + OutputIndex: baseProof.OutputIndex, + InternalKey: baseProof.InternalKey, + CommitmentProof: &CommitmentProof{ + Proof: commitment.Proof{ + TaprootAssetProof: stxoProof.TaprootAssetProof, + AssetProof: stxoProof.AssetProof, + UnknownOddTypes: stxoProof.UnknownOddTypes, + }, + TapSiblingPreimage: baseProof.CommitmentProof. + TapSiblingPreimage, + }, + TapscriptProof: baseProof.TapscriptProof, + UnknownOddTypes: baseProof.UnknownOddTypes, + } +} + +// verifySTXOVersions verifies all STXO versions match. +func verifySTXOVersions(versions map[uint32][]commitment.TapCommitmentVersion) ( + *commitment.TapCommitmentVersion, error) { + + firstVersion := maps.Values(versions)[0][0] + + for outIdx, stxoVersions := range versions { + for idx := range stxoVersions { + ver := stxoVersions[idx] + if !commitment.IsSimilarTapCommitmentVersion( + &firstVersion, &ver, + ) { + + log.Tracef("output %d commit version %d, "+ + "first version %d", + outIdx, ver, firstVersion) + + return nil, fmt.Errorf("mixed anchor " + + "commitment versions") + } } } - return &firstCommitVersion, nil + return &firstVersion, nil } // verifyAssetStateTransition verifies an asset's witnesses resulting from a diff --git a/tapfreighter/fund.go b/tapfreighter/fund.go index 41130f588..cba32f127 100644 --- a/tapfreighter/fund.go +++ b/tapfreighter/fund.go @@ -460,16 +460,6 @@ func createAndSetInput(vPkt *tappsbt.VPacket, idx int, } vPkt.SetInputAsset(idx, assetInput.Asset) - inputAltLeaves, err := assetInput.Commitment.FetchAltLeaves() - if err != nil { - return fmt.Errorf("cannot fetch alt leaves from input: %w", err) - } - - err = vPkt.Inputs[idx].SetAltLeaves(inputAltLeaves) - if err != nil { - return fmt.Errorf("cannot set alt leaves on vInput: %w", err) - } - return nil } diff --git a/tapfreighter/parcel.go b/tapfreighter/parcel.go index 3c30f1dd7..4c8b15fb7 100644 --- a/tapfreighter/parcel.go +++ b/tapfreighter/parcel.go @@ -561,11 +561,6 @@ func ConvertToTransfer(currentHeight uint32, activeTransfers []*tappsbt.VPacket, Label: label, } - allPackets := append(activeTransfers, passiveAssets...) - if err := tapsend.AssertInputsUnique(allPackets); err != nil { - return nil, fmt.Errorf("unable to convert to transfer: %w", err) - } - for pIdx := range activeTransfers { vPkt := activeTransfers[pIdx] diff --git a/tapfreighter/wallet.go b/tapfreighter/wallet.go index 2436054b0..1cfde8bea 100644 --- a/tapfreighter/wallet.go +++ b/tapfreighter/wallet.go @@ -277,8 +277,7 @@ func (f *AssetWallet) FundAddressSend(ctx context.Context, func createPassivePacket(passiveAsset *asset.Asset, activePackets []*tappsbt.VPacket, anchorOutputIndex uint32, anchorOutputInternalKey keychain.KeyDescriptor, prevOut wire.OutPoint, - inputProof *proof.Proof, - inputAltLeaves []*asset.Asset) (*tappsbt.VPacket, error) { + inputProof *proof.Proof) (*tappsbt.VPacket, error) { if len(activePackets) == 0 { return nil, errors.New("no active packets provided") @@ -298,12 +297,8 @@ func createPassivePacket(passiveAsset *asset.Asset, SighashType: txscript.SigHashDefault, }, } - err := vInput.SetAltLeaves(inputAltLeaves) - if err != nil { - return nil, err - } - err = tapsend.ValidateVPacketVersions(activePackets) + err := tapsend.ValidateVPacketVersions(activePackets) if err != nil { return nil, err } @@ -951,7 +946,7 @@ func CreatePassiveAssets(ctx context.Context, keyRing KeyRing, // removing the active assets. But we don't want to count the // alt leaves as "assets" in this context, so we'll trim them // out. - trimmedPassives, altLeaves, err := commitment.TrimAltLeaves( + trimmedPassives, _, err := commitment.TrimAltLeaves( passiveCommitments, ) if err != nil { @@ -987,7 +982,7 @@ func CreatePassiveAssets(ctx context.Context, keyRing KeyRing, passivePacket, err := createPassivePacket( passiveAsset, activePackets, anchorOutIdx, *anchorOutDesc, prevID.OutPoint, - inputProof, altLeaves, + inputProof, ) if err != nil { return nil, fmt.Errorf("unable to create "+ diff --git a/tappsbt/decode.go b/tappsbt/decode.go index 4b2a50ae4..c32d828a5 100644 --- a/tappsbt/decode.go +++ b/tappsbt/decode.go @@ -173,9 +173,6 @@ func (i *VInput) decode(pIn psbt.PInput) error { }, { key: PsbtKeyTypeInputTapAssetProof, decoder: proofDecoder(&i.Proof), - }, { - key: PsbtKeyTypeInputAltLeaves, - decoder: altLeavesDecoder(&i.AltLeaves), }} for idx := range mapping { diff --git a/tappsbt/decode_test.go b/tappsbt/decode_test.go index 1b84c9580..8957b3ea0 100644 --- a/tappsbt/decode_test.go +++ b/tappsbt/decode_test.go @@ -255,7 +255,6 @@ func TestEncodingDecoding(t *testing.T) { firstLeaf, secondLeaf, } - pkt.Inputs[0].AltLeaves = asset.CopyAltLeaves(altLeaves) pkt.Outputs[0].AltLeaves = asset.CopyAltLeaves( altLeaves, ) @@ -279,7 +278,6 @@ func TestEncodingDecoding(t *testing.T) { altLeaves[idx] = asset.RandAltLeaf(t) } - pkt.Inputs[0].AltLeaves = altLeaves pkt.Outputs[0].AltLeaves = altLeaves pkt.Outputs[1].AltLeaves = altLeaves diff --git a/tappsbt/encode.go b/tappsbt/encode.go index f578703b0..d64163f76 100644 --- a/tappsbt/encode.go +++ b/tappsbt/encode.go @@ -183,9 +183,6 @@ func (i *VInput) encode() (psbt.PInput, error) { { key: PsbtKeyTypeInputTapAssetProof, encoder: proofEncoder(i.Proof), - }, { - key: PsbtKeyTypeInputAltLeaves, - encoder: altLeavesEncoder(i.AltLeaves), }, } diff --git a/tappsbt/interface.go b/tappsbt/interface.go index 006eb267a..0f5f38ebb 100644 --- a/tappsbt/interface.go +++ b/tappsbt/interface.go @@ -43,7 +43,6 @@ var ( PsbtKeyTypeInputTapAnchorTapscriptSibling = []byte{0x78} PsbtKeyTypeInputTapAsset = []byte{0x79} PsbtKeyTypeInputTapAssetProof = []byte{0x7a} - PsbtKeyTypeInputAltLeaves = []byte{0x7b} PsbtKeyTypeOutputTapType = []byte{0x70} PsbtKeyTypeOutputTapIsInteractive = []byte{0x71} @@ -394,12 +393,6 @@ type VInput struct { // Proof is a transition proof that proves the asset being spent was // committed to in the anchor transaction above. Proof *proof.Proof - - // AltLeaves represent data used to construct an Asset commitment, that - // will be inserted in the input anchor Tap commitment. These - // data-carrying leaves are used for a purpose distinct from - // representing individual Taproot Assets. - AltLeaves []asset.AltLeaf[asset.Asset] } // Copy creates a deep copy of the VInput. @@ -417,8 +410,7 @@ func (i *VInput) Copy() *VInput { // We never expect the individual fields of the proof to change // while it is assigned to a virtual input. So not deep copying // it here is fine. - Proof: i.Proof, - AltLeaves: asset.CopyAltLeaves(i.AltLeaves), + Proof: i.Proof, } } @@ -427,27 +419,6 @@ func (i *VInput) Asset() *asset.Asset { return i.asset } -// SetAltLeaves asserts that a set of AltLeaves are valid, and updates a VInput -// to set the AltLeaves. Setting the input's AltLeaves twice is disallowed. -func (i *VInput) SetAltLeaves(altLeafAssets []*asset.Asset) error { - // AltLeaves can be set exactly once on a VInput. - if len(i.AltLeaves) != 0 { - return fmt.Errorf("%w: input", ErrAltLeavesAlreadySet) - } - - // Each asset must be a valid AltLeaf, and the set of AltLeaves must be - // valid, by not having overlapping keys in the AltCommitment. - altLeaves := asset.ToAltLeaves(altLeafAssets) - err := asset.ValidAltLeaves(altLeaves) - if err != nil { - return err - } - - i.AltLeaves = asset.CopyAltLeaves(altLeaves) - - return nil -} - // serializeScriptKey serializes the input asset's script key as the PSBT // derivation information on the virtual input. func (i *VInput) serializeScriptKey(key asset.ScriptKey, coinType uint32) { diff --git a/tappsbt/mock.go b/tappsbt/mock.go index e8a534f79..d196b9f67 100644 --- a/tappsbt/mock.go +++ b/tappsbt/mock.go @@ -173,10 +173,8 @@ func RandPacket(t testing.TB, setVersion, altLeaves bool) *VPacket { } if altLeaves { - inputLeaves := asset.RandAltLeaves(t, true) output1Leaves := asset.RandAltLeaves(t, true) output2Leaves := asset.RandAltLeaves(t, true) - randVInput.AltLeaves = asset.ToAltLeaves(inputLeaves) randVOutput1.AltLeaves = asset.ToAltLeaves(output1Leaves) randVOutput2.AltLeaves = asset.ToAltLeaves(output2Leaves) } @@ -308,22 +306,6 @@ func NewTestFromVInput(t testing.TB, i *VInput) *TestVInput { ti.Proof = proof.NewTestFromProof(t, i.Proof) } - if len(i.AltLeaves) > 0 { - // Assert that the concrete type of AltLeaf is supported. - require.IsTypef( - t, &asset.Asset{}, i.AltLeaves[0], - "AltLeaves must be of type *asset.Asset", - ) - - ti.AltLeaves = make([]*asset.TestAsset, 0, len(i.AltLeaves)) - for idx := range i.AltLeaves { - leaf := i.AltLeaves[idx].(*asset.Asset) - ti.AltLeaves = append( - ti.AltLeaves, asset.NewTestFromAsset(t, leaf), - ) - } - } - return ti } @@ -336,7 +318,6 @@ type TestVInput struct { Anchor *TestAnchor `json:"anchor"` Asset *asset.TestAsset `json:"asset"` Proof *proof.TestProof `json:"proof"` - AltLeaves []*asset.TestAsset `json:"alt_leaves"` } func (ti *TestVInput) ToVInput(t testing.TB) *VInput { @@ -379,15 +360,6 @@ func (ti *TestVInput) ToVInput(t testing.TB) *VInput { vi.Proof = ti.Proof.ToProof(t) } - if len(ti.AltLeaves) > 0 { - vi.AltLeaves = make( - []asset.AltLeaf[asset.Asset], len(ti.AltLeaves), - ) - for idx, leaf := range ti.AltLeaves { - vi.AltLeaves[idx] = leaf.ToAsset(t) - } - } - return vi } diff --git a/tappsbt/testdata/psbt_encoding_generated.json b/tappsbt/testdata/psbt_encoding_generated.json index d911271f7..d7c50bbe2 100644 --- a/tappsbt/testdata/psbt_encoding_generated.json +++ b/tappsbt/testdata/psbt_encoding_generated.json @@ -24,8 +24,7 @@ "tr_bip32_derivation": null }, "asset": null, - "proof": null, - "alt_leaves": null + "proof": null } ], "outputs": [ @@ -210,6 +209,7 @@ "unknown_odd_types": null }, "proof": { + "version": 0, "prev_out": "676678e7aa2d92faded7e41173fac825416fed825e117039374b7964976f269a:3197016449", "block_header": { "version": 1, @@ -285,6 +285,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "00c00101", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -310,6 +311,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "00c00101", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -359,6 +361,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -391,60 +394,7 @@ }, "alt_leaves": null, "unknown_odd_types": null - }, - "alt_leaves": [ - { - "version": 0, - "genesis_first_prev_out": "0000000000000000000000000000000000000000000000000000000000000000:0", - "genesis_tag": "", - "genesis_meta_hash": "0000000000000000000000000000000000000000000000000000000000000000", - "genesis_output_index": 0, - "genesis_type": 0, - "amount": 0, - "lock_time": 0, - "relative_lock_time": 0, - "prev_witnesses": null, - "split_commitment_root": null, - "script_version": 29735, - "script_key": "02dd756e50caeef8caba0acf73db4e5b2e7f4c229644f01d538ec4427b7b194b23", - "group_key": null, - "unknown_odd_types": null - }, - { - "version": 0, - "genesis_first_prev_out": "0000000000000000000000000000000000000000000000000000000000000000:0", - "genesis_tag": "", - "genesis_meta_hash": "0000000000000000000000000000000000000000000000000000000000000000", - "genesis_output_index": 0, - "genesis_type": 0, - "amount": 0, - "lock_time": 0, - "relative_lock_time": 0, - "prev_witnesses": null, - "split_commitment_root": null, - "script_version": 57578, - "script_key": "02116adf7ccbf6ad3a10de4817ab7bd7b2d9c25f853203a79ca261fa98ce0dfd36", - "group_key": null, - "unknown_odd_types": null - }, - { - "version": 0, - "genesis_first_prev_out": "0000000000000000000000000000000000000000000000000000000000000000:0", - "genesis_tag": "", - "genesis_meta_hash": "0000000000000000000000000000000000000000000000000000000000000000", - "genesis_output_index": 0, - "genesis_type": 0, - "amount": 0, - "lock_time": 0, - "relative_lock_time": 0, - "prev_witnesses": null, - "split_commitment_root": null, - "script_version": 45968, - "script_key": "0230753a2f1ab5b025514d4fd233839e4d2a1932ec1b376754dc50d20475a51230", - "group_key": null, - "unknown_odd_types": null - } - ] + } }, { "bip32_derivation": null, @@ -467,8 +417,7 @@ "tr_bip32_derivation": null }, "asset": null, - "proof": null, - "alt_leaves": null + "proof": null } ], "outputs": [ @@ -576,6 +525,7 @@ "tr_merkle_root": "", "proof_delivery_address": "https://example.com", "proof_suffix": { + "version": 0, "prev_out": "676678e7aa2d92faded7e41173fac825416fed825e117039374b7964976f269a:3197016449", "block_header": { "version": 1, @@ -651,6 +601,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "00c00101", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -676,6 +627,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "00c00101", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -725,6 +677,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -773,8 +726,8 @@ "relative_lock_time": 0, "prev_witnesses": null, "split_commitment_root": null, - "script_version": 21434, - "script_key": "02b20fe0c0826121800688751f5d084a168fdc941702895b423da23b839ff55858", + "script_version": 29735, + "script_key": "02dd756e50caeef8caba0acf73db4e5b2e7f4c229644f01d538ec4427b7b194b23", "group_key": null, "unknown_odd_types": null }, @@ -790,8 +743,25 @@ "relative_lock_time": 0, "prev_witnesses": null, "split_commitment_root": null, - "script_version": 7255, - "script_key": "023a4301b480aa69e12c1c9aceee371b607110bae9969b7b502e5eb049c02e682a", + "script_version": 57578, + "script_key": "02116adf7ccbf6ad3a10de4817ab7bd7b2d9c25f853203a79ca261fa98ce0dfd36", + "group_key": null, + "unknown_odd_types": null + }, + { + "version": 0, + "genesis_first_prev_out": "0000000000000000000000000000000000000000000000000000000000000000:0", + "genesis_tag": "", + "genesis_meta_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "genesis_output_index": 0, + "genesis_type": 0, + "amount": 0, + "lock_time": 0, + "relative_lock_time": 0, + "prev_witnesses": null, + "split_commitment_root": null, + "script_version": 45968, + "script_key": "0230753a2f1ab5b025514d4fd233839e4d2a1932ec1b376754dc50d20475a51230", "group_key": null, "unknown_odd_types": null } @@ -886,8 +856,25 @@ "relative_lock_time": 0, "prev_witnesses": null, "split_commitment_root": null, - "script_version": 48428, - "script_key": "0252050ff1a0732e70709b424af5172f9a9cab982a07a000b4f140c75a0430951f", + "script_version": 21434, + "script_key": "02b20fe0c0826121800688751f5d084a168fdc941702895b423da23b839ff55858", + "group_key": null, + "unknown_odd_types": null + }, + { + "version": 0, + "genesis_first_prev_out": "0000000000000000000000000000000000000000000000000000000000000000:0", + "genesis_tag": "", + "genesis_meta_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "genesis_output_index": 0, + "genesis_type": 0, + "amount": 0, + "lock_time": 0, + "relative_lock_time": 0, + "prev_witnesses": null, + "split_commitment_root": null, + "script_version": 7255, + "script_key": "023a4301b480aa69e12c1c9aceee371b607110bae9969b7b502e5eb049c02e682a", "group_key": null, "unknown_odd_types": null } @@ -897,7 +884,7 @@ "version": 1, "chain_params_hrp": "tapbc" }, - "expected": "cHNidP8BALICAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACewAAAAAAAAAiUSA9L1ax/Ek3xCa1tlXhDqe89wMYb3zpU+aznVVCaOXsvVkBAAAAAAAAIlEgPS9WsfxJN8QmtbZV4Q6nvPcDGG986VPms51VQmjl7L0AAAAAAXABAQFxBXRhcGJjAXIBAQAiBgJpeS3VMT0m3+lE4B1q2KDgw421r0ferxWYHPndvd6sGxgAAAAA+QMAgAAAAIB7AACAAAAAAMgBAAAhFml5LdUxPSbf6UTgHWrYoODDjbWvR96vFZgc+d293qwbGQAAAAAA+QMAgAAAAIB7AACAAAAAAMgBAAABFyBpeS3VMT0m3+lE4B1q2KDgw421r0ferxWYHPndvd6sGwEYC21lcmtsZSByb290AXBlvI+effHZKTM/+ZOTO+pvWzr23gN0NmxHGeQ6GwZ9ibyxhrUfwA4J1vwlZAhUwV38rKqKLOzOWjq6U6twWxjblLTTOKUDTxz7fVQodMvsXwJOSLGYn9ej6Km2VHKub5ms6VAvDFEBcQgAAAAAAAADCQFyD2FuY2hvciBwa3NjcmlwdAFzCAAAAAAAAAADAXQhAml5LdUxPSbf6UTgHWrYoODDjbWvR96vFZgc+d293qwbAXULbWVya2xlIHJvb3QidgJpeS3VMT0m3+lE4B1q2KDgw421r0ferxWYHPndvd6sGxgAAAAA+QMAgAAAAIB7AACAAAAAAMgBAAAhd2l5LdUxPSbf6UTgHWrYoODDjbWvR96vFZgc+d293qwbGQAAAAAA+QMAgAAAAIB7AACAAAAAAMgBAAABeAdzaWJsaW5nAXn9kgEAAQACipomb5dkeUs3OXARXoLtb0ElyPpzEeTX3vqSLarneGZnvo6ZgUA3ZjAxZjFmNTczOTgxNjU5YTQ0ZmYxN2E0YzcyMTVhM2I1MzllYjFlNTg0OWM2MDc3ZGJiNTcyMmY1NzE3YTI4fwHx9XOYFlmkT/F6THIVo7U56x5YScYHfbtXIvVxeigkT802AAQBAAYF/q9j5Y4LrQGrAWUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANCAUCXji6DmoNhjnVEqRdRKkpv2+Ki239wRSh4P6fB7SRyjPGcLXJ6eGpLaFhPg1p8ZZ80hsn6D8BwZwis0a3DaldzDgIAABAhAzdb3PMLcpLE4s5/hRHGjP1Yu89chGEoKCW+I96gZ1IEESECaLjOzwxTHUrlltfXNBjf9ED1ANQg1mz9tA58Maebr0sBev3bBlRBUFAABAAAAAACJJomb5dkeUs3OXARXoLtb0ElyPpzEeTX3vqSLarneGZnvo6ZgQRQAQAAAJDwqfEQcC+Aghnr6hFzBWBCpxS61RuRbLaAAAAAAAAAUnUolVj1HJlmaZQEriKUcww8n5vaU1I85Q6bleVY2i/bJhtNTIYEGxqxv5MGnwEAAAABlmCMy6+harrakCeA2k3DXa/XrwX6DaCM+DNXX4z56DYAAAAASkkwRgIhANqySIkhPK9DrmrcQc8ck5bAgkDBmfUiWs9FQWMw/X29AiEA/jeQDgZEv1dEk6B/xe26BtvAfDEblHUgwtUUvFcl3LQB/////wEA8gUqAQAAABl2qRTxXRkh9S5AB7FG36YPNp7S/Dk84oisAAAAAAiCBKPzrGBdXkcn9Opy6TRqXVhvAjFGD9Uq2YlbyCQNhx3vUi2zOcGGwRSYQ6SEiZDm3bmmBl9LwUIq9T9LyG8bCEqJGJ/wMWzcEFEdpx2nV+VTytqfO1sUNPOSNnOttX2Dyqw5LDivFW1vwwtV+tQRLfK5VTHmgRTprRABHnL3t8/bDgr9AZYAAQACipomb5dkeUs3OXARXoLtb0ElyPpzEeTX3vqSLarneGZnvo6ZgUA3ZjAxZjFmNTczOTgxNjU5YTQ0ZmYxN2E0YzcyMTVhM2I1MzllYjFlNTg0OWM2MDc3ZGJiNTcyMmY1NzE3YTI4fwHx9XOYFlmkT/F6THIVo7U56x5YScYHfbtXIvVxeigkT802AAQBAAYBAQcD/QU5CQEGC60BqwFlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQgFAiSPLtHNohncvRWwoHQk/n7a8MULWAJb/GEUQz2aVU195KmdkhKuRntep5m+WMupCDc45iNjwaCchYvK7+IcOQw4CAAAQIQJfz4z3uiy5VzldF476bYAhPcAEeJY62tpFvtuRuEh0jxEhA2UTAl6KbpcUwff9S4huPQmJWEC1Px3/9/J106rt/TLoDKUABAAAAAACIQI3K/m5u8B9sw33y7+rryWSU8fMHe2lOCuLlVsPj3r3pgN6AUkAAQACIL+vqU644RS3UJXQrOaGM50+tQvgD4FKniYSXU0+uPAaBCIAAP//////////////////////////////////////////AicAAQACIgAA//////////////////////////////////////////8FBADAAQEN/QFOA6UABAAAAAICIQKdduJO68wj8q4t0El3US2r3Jv8RaCPKegGybH+dotn2AN6AUkAAQACIL+vqU644RS3UJXQrOaGM50+tQvgD4FKniYSXU0+uPAaBCIAAP//////////////////////////////////////////AicAAQACIgAA//////////////////////////////////////////8FBADAAQF3AAQAAAADAiECrlX4aHDxCYQOkF66cz+iW8Mbdj8klIK3zpN2KpsLjR4FTAFBARqsJUCKTSgjPNMl+u+t6e8Prnb8seNdCBQARbuqOBsw7vRuRjA1VmAu8TzvXS//Pcai7OZlf8keSwpbui3tTv8DBADAAQIEAQEuAAQAAAAEAiECNMRdtB31mzfE7bm6QkP7+dW0STw/tQdWi6dptA/0FrQFAwQBAQ+fAAQAAAAEAiEC3DSUSNywYyaZaAbttpBj5yJY+cEct5LWT8co3tD8+TwDdAFJAAEAAiC/r6lOuOEUt1CV0KzmhjOdPrUL4A+BSp4mEl1NPrjwGgQiAAD//////////////////////////////////////////wInAAEAAiIAAP//////////////////////////////////////////ER4AAQACGXF1b3RoIHRoZSByYXZlbiBuZXZlcm1vcmUVCQIDZm9vA2JhchYEAAAAKheKmiZvl2R5Szc5cBFegu1vQSXI+nMR5Nfe+pItqud4Zme+jpmBQDdmMDFm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wRSYQ6SEiZDm3bmmBl9LwUIq9T9LyG8bCEqJGJ/wMWzcEFEdpx2nV+VTytqfO1sUNPOSNnOttX2Dyqw5LDivFW1vwwtV+tQRLfK5VTHmgRTprRABHnL3t8/bDgr9AZYAAQACipomb5dkeUs3OXARXoLtb0ElyPpzEeTX3vqSLarneGZnvo6ZgUA3ZjAxZjFmNTczOTgxNjU5YTQ0ZmYxN2E0YzcyMTVhM2I1MzllYjFlNTg0OWM2MDc3ZGJiNTcyMmY1NzE3YTI4fwHx9XOYFlmkT/F6THIVo7U56x5YScYHfbtXIvVxeigkT802AAQBAAYBAQcD/QU5CQEGC60BqwFlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQgFAiSPLtHNohncvRWwoHQk/n7a8MULWAJb/GEUQz2aVU195KmdkhKuRntep5m+WMupCDc45iNjwaCchYvK7+IcOQw4CAAAQIQJfz4z3uiy5VzldF476bYAhPcAEeJY62tpFvtuRuEh0jxEhA2UTAl6KbpcUwff9S4huPQmJWEC1Px3/9/J106rt/TLoDKUABAAAAAACIQI3K/m5u8B9sw33y7+rryWSU8fMHe2lOCuLlVsPj3r3pgN6AUkAAQACIL+vqU644RS3UJXQrOaGM50+tQvgD4FKniYSXU0+uPAaBCIAAP//////////////////////////////////////////AicAAQACIgAA//////////////////////////////////////////8FBADAAQEN/QFOA6UABAAAAAICIQKdduJO68wj8q4t0El3US2r3Jv8RaCPKegGybH+dotn2AN6AUkAAQACIL+vqU644RS3UJXQrOaGM50+tQvgD4FKniYSXU0+uPAaBCIAAP//////////////////////////////////////////AicAAQACIgAA//////////////////////////////////////////8FBADAAQF3AAQAAAADAiECrlX4aHDxCYQOkF66cz+iW8Mbdj8klIK3zpN2KpsLjR4FTAFBARqsJUCKTSgjPNMl+u+t6e8Prnb8seNdCBQARbuqOBsw7vRuRjA1VmAu8TzvXS//Pcai7OZlf8keSwpbui3tTv8DBADAAQIEAQEuAAQAAAAEAiECNMRdtB31mzfE7bm6QkP7+dW0STw/tQdWi6dptA/0FrQFAwQBAQ+fAAQAAAAEAiEC3DSUSNywYyaZaAbttpBj5yJY+cEct5LWT8co3tD8+TwDdAFJAAEAAiC/r6lOuOEUt1CV0KzmhjOdPrUL4A+BSp4mEl1NPrjwGgQiAAD//////////////////////////////////////////wInAAEAAiIAAP//////////////////////////////////////////ER4AAQACGXF1b3RoIHRoZSByYXZlbiBuZXZlcm1vcmUVCQIDZm9vA2JhchYEAAAAKheKmiZvl2R5Szc5cBFegu1vQSXI+nMR5Nfe+pItqud4Zme+jpmBQDdmMDFmMWY1NzM5ODE2NTlhNDRmZjE3YTRjNzIxNWEzYjUzOWViMWU1ODQ5YzYwNzdkYmI1NzIyZjU3MTdhMjh/AfH1c5gWWaRP8XpMchWjtTnrHlhJxgd9u1ci9XF6KCRPzTYAGUEDZRMCXopulxTB9/1LiG49CYlYQLU/Hf/38nXTqu39MuhwOTS/UKKNoQKXXe2nfnWFeeo9/kE2q/dSs7gnHQPpRAF8CAAAAAAAAAHIAX0IAAAAAAAAAVkBflECJw4CU7oQIQKyD+DAgmEhgAaIdR9dCEoWj9yUFwKJW0I9ojuDn/VYWCcOAhxXECECOkMBtICqaeEsHJrO7jcbYHEQuumWm3tQLl6wScAuaCoAAXABAQFxAQABcggAAAAAAAAAAQFzIQJpeS3VMT0m3+lE4B1q2KDgw421r0ferxWYHPndvd6sGyJ0Aml5LdUxPSbf6UTgHWrYoODDjbWvR96vFZgc+d293qwbGAAAAAD5AwCAAAAAgHsAAIAAAAAAyAEAACF1aXkt1TE9Jt/pROAdatig4MONta9H3q8VmBz53b3erBsZAAAAAAD5AwCAAAAAgHsAAIAAAAAAyAEAAAF2/ZIBAAEAAooPJmhtNUzeFgfuKUs58yt8eCK6ZPhKtDygxua5HB/Tvib78ptAYTBmM2NhOTkzNmU4NDYxZjEwZDc3Yzk2ZWE4MGE3YTY2NWY2MDZmNmE2M2I3ZjNkZmQyNTY3YzE4OTc5ZTRkNqDzypk26EYfENd8luqAp6Zl9gb2pjt/Pf0lZ8GJeeTWQUOQiQAEAQAGBf5snGS4C60BqwFlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQgFAZdwnwBq04DClxJWwvHBQ9EnY+3nD1MXHQYqLWDo2gjJpNZWsdZ9voCEBFy7wfX1nHcGRtaaEaDIucEFl+Ze80g4CAAAQIQI9L1ax/Ek3xCa1tlXhDqe89wMYb3zpU+aznVVCaOXsvREhAhPhdm67vBwYyGoCShzuCJXFtjScQ2WUbBKLJGhXDHcjAXhBARl84i0SvFqZWHUzr0EWn6Hcn/hmwNTTAhFY1ikzZy0RGXziLRK8WplYdTOvQRafodyf+GbA1NMCEVjWKTNnLREBeQEAAXwIAAAAAAAAAAABfQgAAAAAAAAAAAF+KQEnDgK9LBAhAlIFD/Ggcy5wcJtCSvUXL5qcq5gqB6AAtPFAx1oEMJUfAA==", + "expected": "cHNidP8BALICAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACewAAAAAAAAAiUSA9L1ax/Ek3xCa1tlXhDqe89wMYb3zpU+aznVVCaOXsvVkBAAAAAAAAIlEgPS9WsfxJN8QmtbZV4Q6nvPcDGG986VPms51VQmjl7L0AAAAAAXABAQFxBXRhcGJjAXIBAQAiBgJpeS3VMT0m3+lE4B1q2KDgw421r0ferxWYHPndvd6sGxgAAAAA+QMAgAAAAIB7AACAAAAAAMgBAAAhFml5LdUxPSbf6UTgHWrYoODDjbWvR96vFZgc+d293qwbGQAAAAAA+QMAgAAAAIB7AACAAAAAAMgBAAABFyBpeS3VMT0m3+lE4B1q2KDgw421r0ferxWYHPndvd6sGwEYC21lcmtsZSByb290AXBlvI+effHZKTM/+ZOTO+pvWzr23gN0NmxHGeQ6GwZ9ibyxhrUfwA4J1vwlZAhUwV38rKqKLOzOWjq6U6twWxjblLTTOKUDTxz7fVQodMvsXwJOSLGYn9ej6Km2VHKub5ms6VAvDFEBcQgAAAAAAAADCQFyD2FuY2hvciBwa3NjcmlwdAFzCAAAAAAAAAADAXQhAml5LdUxPSbf6UTgHWrYoODDjbWvR96vFZgc+d293qwbAXULbWVya2xlIHJvb3QidgJpeS3VMT0m3+lE4B1q2KDgw421r0ferxWYHPndvd6sGxgAAAAA+QMAgAAAAIB7AACAAAAAAMgBAAAhd2l5LdUxPSbf6UTgHWrYoODDjbWvR96vFZgc+d293qwbGQAAAAAA+QMAgAAAAIB7AACAAAAAAMgBAAABeAdzaWJsaW5nAXn9kgEAAQACipomb5dkeUs3OXARXoLtb0ElyPpzEeTX3vqSLarneGZnvo6ZgUA3ZjAxZjFmNTczOTgxNjU5YTQ0ZmYxN2E0YzcyMTVhM2I1MzllYjFlNTg0OWM2MDc3ZGJiNTcyMmY1NzE3YTI4fwHx9XOYFlmkT/F6THIVo7U56x5YScYHfbtXIvVxeigkT802AAQBAAYF/q9j5Y4LrQGrAWUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANCAUCXji6DmoNhjnVEqRdRKkpv2+Ki239wRSh4P6fB7SRyjPGcLXJ6eGpLaFhPg1p8ZZ80hsn6D8BwZwis0a3DaldzDgIAABAhAzdb3PMLcpLE4s5/hRHGjP1Yu89chGEoKCW+I96gZ1IEESECaLjOzwxTHUrlltfXNBjf9ED1ANQg1mz9tA58Maebr0sBev3bBlRBUFAABAAAAAACJJomb5dkeUs3OXARXoLtb0ElyPpzEeTX3vqSLarneGZnvo6ZgQRQAQAAAJDwqfEQcC+Aghnr6hFzBWBCpxS61RuRbLaAAAAAAAAAUnUolVj1HJlmaZQEriKUcww8n5vaU1I85Q6bleVY2i/bJhtNTIYEGxqxv5MGnwEAAAABlmCMy6+harrakCeA2k3DXa/XrwX6DaCM+DNXX4z56DYAAAAASkkwRgIhANqySIkhPK9DrmrcQc8ck5bAgkDBmfUiWs9FQWMw/X29AiEA/jeQDgZEv1dEk6B/xe26BtvAfDEblHUgwtUUvFcl3LQB/////wEA8gUqAQAAABl2qRTxXRkh9S5AB7FG36YPNp7S/Dk84oisAAAAAAiCBKPzrGBdXkcn9Opy6TRqXVhvAjFGD9Uq2YlbyCQNhx3vUi2zOcGGwRSYQ6SEiZDm3bmmBl9LwUIq9T9LyG8bCEqJGJ/wMWzcEFEdpx2nV+VTytqfO1sUNPOSNnOttX2Dyqw5LDivFW1vwwtV+tQRLfK5VTHmgRTprRABHnL3t8/bDgr9AZYAAQACipomb5dkeUs3OXARXoLtb0ElyPpzEeTX3vqSLarneGZnvo6ZgUA3ZjAxZjFmNTczOTgxNjU5YTQ0ZmYxN2E0YzcyMTVhM2I1MzllYjFlNTg0OWM2MDc3ZGJiNTcyMmY1NzE3YTI4fwHx9XOYFlmkT/F6THIVo7U56x5YScYHfbtXIvVxeigkT802AAQBAAYBAQcD/QU5CQEGC60BqwFlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQgFAiSPLtHNohncvRWwoHQk/n7a8MULWAJb/GEUQz2aVU195KmdkhKuRntep5m+WMupCDc45iNjwaCchYvK7+IcOQw4CAAAQIQJfz4z3uiy5VzldF476bYAhPcAEeJY62tpFvtuRuEh0jxEhA2UTAl6KbpcUwff9S4huPQmJWEC1Px3/9/J106rt/TLoDKUABAAAAAACIQI3K/m5u8B9sw33y7+rryWSU8fMHe2lOCuLlVsPj3r3pgN6AUkAAQACIL+vqU644RS3UJXQrOaGM50+tQvgD4FKniYSXU0+uPAaBCIAAP//////////////////////////////////////////AicAAQACIgAA//////////////////////////////////////////8FBADAAQEN/QFOA6UABAAAAAICIQKdduJO68wj8q4t0El3US2r3Jv8RaCPKegGybH+dotn2AN6AUkAAQACIL+vqU644RS3UJXQrOaGM50+tQvgD4FKniYSXU0+uPAaBCIAAP//////////////////////////////////////////AicAAQACIgAA//////////////////////////////////////////8FBADAAQF3AAQAAAADAiECrlX4aHDxCYQOkF66cz+iW8Mbdj8klIK3zpN2KpsLjR4FTAFBARqsJUCKTSgjPNMl+u+t6e8Prnb8seNdCBQARbuqOBsw7vRuRjA1VmAu8TzvXS//Pcai7OZlf8keSwpbui3tTv8DBADAAQIEAQEuAAQAAAAEAiECNMRdtB31mzfE7bm6QkP7+dW0STw/tQdWi6dptA/0FrQFAwQBAQ+fAAQAAAAEAiEC3DSUSNywYyaZaAbttpBj5yJY+cEct5LWT8co3tD8+TwDdAFJAAEAAiC/r6lOuOEUt1CV0KzmhjOdPrUL4A+BSp4mEl1NPrjwGgQiAAD//////////////////////////////////////////wInAAEAAiIAAP//////////////////////////////////////////ER4AAQACGXF1b3RoIHRoZSByYXZlbiBuZXZlcm1vcmUVCQIDZm9vA2JhchYEAAAAKheKmiZvl2R5Szc5cBFegu1vQSXI+nMR5Nfe+pItqud4Zme+jpmBQDdmMDFm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+pItqud4Zme+jpmBQDdmMDFmMWY1NzM5ODE2NTlhNDRmZjE3YTRjNzIxNWEzYjUzOWViMWU1ODQ5YzYwNzdkYmI1NzIyZjU3MTdhMjh/AfH1c5gWWaRP8XpMchWjtTnrHlhJxgd9u1ci9XF6KCRPzTYABAEABgEBBwP9BTkJAQYLrQGrAWUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANCAUCJI8u0c2iGdy9FbCgdCT+ftrwxQtYAlv8YRRDPZpVTX3kqZ2SEq5Ge16nmb5Yy6kINzjmI2PBoJyFi8rv4hw5DDgIAABAhAl/PjPe6LLlXOV0XjvptgCE9wAR4ljra2kW+25G4SHSPESEDZRMCXopulxTB9/1LiG49CYlYQLU/Hf/38nXTqu39MugMpQAEAAAAAAIhAjcr+bm7wH2zDffLv6uvJZJTx8wd7aU4K4uVWw+PevemA3oBSQABAAIgv6+pTrjhFLdQldCs5oYznT61C+APgUqeJhJdTT648BoEIgAA//////////////////////////////////////////8CJwABAAIiAAD//////////////////////////////////////////wUEAMABAQ39AU4DpQAEAAAAAgIhAp124k7rzCPyri3QSXdRLavcm/xFoI8p6AbJsf52i2fYA3oBSQABAAIgv6+pTrjhFLdQldCs5oYznT61C+APgUqeJhJdTT648BoEIgAA//////////////////////////////////////////8CJwABAAIiAAD//////////////////////////////////////////wUEAMABAXcABAAAAAMCIQKuVfhocPEJhA6QXrpzP6Jbwxt2PySUgrfOk3YqmwuNHgVMAUEBGqwlQIpNKCM80yX6763p7w+udvyx410IFABFu6o4GzDu9G5GMDVWYC7xPO9dL/89xqLs5mV/yR5LClu6Le1O/wMEAMABAgQBAS4ABAAAAAQCIQI0xF20HfWbN8TtubpCQ/v51bRJPD+1B1aLp2m0D/QWtAUDBAEBD58ABAAAAAQCIQLcNJRI3LBjJploBu22kGPnIlj5wRy3ktZPxyje0Pz5PAN0AUkAAQACIL+vqU644RS3UJXQrOaGM50+tQvgD4FKniYSXU0+uPAaBCIAAP//////////////////////////////////////////AicAAQACIgAA//////////////////////////////////////////8RHgABAAIZcXVvdGggdGhlIHJhdmVuIG5ldmVybW9yZRUJAgNmb28DYmFyFgQAAAAqF4qaJm+XZHlLNzlwEV6C7W9BJcj6cxHk1976ki2q53hmZ76OmYFAN2YwMWYxZjU3Mzk4MTY1OWE0NGZmMTdhNGM3MjE1YTNiNTM5ZWIxZTU4NDljNjA3N2RiYjU3MjJmNTcxN2EyOH8B8fVzmBZZpE/xekxyFaO1OeseWEnGB327VyL1cXooJE/NNgAZQQNlEwJeim6XFMH3/UuIbj0JiVhAtT8d//fyddOq7f0y6HA5NL9Qoo2hApdd7ad+dYV56j3+QTar91KzuCcdA+lEAXwIAAAAAAAAAcgBfQgAAAAAAAABWQF+eQMnDgJ0JxAhAt11blDK7vjKugrPc9tOWy5/TCKWRPAdU47EQnt7GUsjJw4C4OoQIQIRat98y/atOhDeSBere9ey2cJfhTIDp5yiYfqYzg39NicOArOQECECMHU6Lxq1sCVRTU/SM4OeTSoZMuwbN2dU3FDSBHWlEjAAAXABAQFxAQABcggAAAAAAAAAAQFzIQJpeS3VMT0m3+lE4B1q2KDgw421r0ferxWYHPndvd6sGyJ0Aml5LdUxPSbf6UTgHWrYoODDjbWvR96vFZgc+d293qwbGAAAAAD5AwCAAAAAgHsAAIAAAAAAyAEAACF1aXkt1TE9Jt/pROAdatig4MONta9H3q8VmBz53b3erBsZAAAAAAD5AwCAAAAAgHsAAIAAAAAAyAEAAAF2/ZIBAAEAAooPJmhtNUzeFgfuKUs58yt8eCK6ZPhKtDygxua5HB/Tvib78ptAYTBmM2NhOTkzNmU4NDYxZjEwZDc3Yzk2ZWE4MGE3YTY2NWY2MDZmNmE2M2I3ZjNkZmQyNTY3YzE4OTc5ZTRkNqDzypk26EYfENd8luqAp6Zl9gb2pjt/Pf0lZ8GJeeTWQUOQiQAEAQAGBf5snGS4C60BqwFlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQgFAZdwnwBq04DClxJWwvHBQ9EnY+3nD1MXHQYqLWDo2gjJpNZWsdZ9voCEBFy7wfX1nHcGRtaaEaDIucEFl+Ze80g4CAAAQIQI9L1ax/Ek3xCa1tlXhDqe89wMYb3zpU+aznVVCaOXsvREhAhPhdm67vBwYyGoCShzuCJXFtjScQ2WUbBKLJGhXDHcjAXhBARl84i0SvFqZWHUzr0EWn6Hcn/hmwNTTAhFY1ikzZy0RGXziLRK8WplYdTOvQRafodyf+GbA1NMCEVjWKTNnLREBeQEAAXwIAAAAAAAAAAABfQgAAAAAAAAAAAF+UQInDgJTuhAhArIP4MCCYSGABoh1H10IShaP3JQXAolbQj2iO4Of9VhYJw4CHFcQIQI6QwG0gKpp4Swcms7uNxtgcRC66Zabe1AuXrBJwC5oKgA=", "comment": "random packet" }, { @@ -906,7 +893,7 @@ { "bip32_derivation": [ { - "pub_key": "0281dd48d26da9f9020ed6d5647bc69f8d8a418721f73befeb69bdf6f7acfd2b6f", + "pub_key": "0252050ff1a0732e70709b424af5172f9a9cab982a07a000b4f140c75a0430951f", "fingerprint": 0, "bip32_path": [ 2147484665, @@ -919,7 +906,7 @@ ], "tr_bip32_derivation": [ { - "pub_key": "81dd48d26da9f9020ed6d5647bc69f8d8a418721f73befeb69bdf6f7acfd2b6f", + "pub_key": "52050ff1a0732e70709b424af5172f9a9cab982a07a000b4f140c75a0430951f", "leaf_hashes": [], "fingerprint": 0, "bip32_path": [ @@ -931,23 +918,23 @@ ] } ], - "tr_internal_key": "81dd48d26da9f9020ed6d5647bc69f8d8a418721f73befeb69bdf6f7acfd2b6f", + "tr_internal_key": "52050ff1a0732e70709b424af5172f9a9cab982a07a000b4f140c75a0430951f", "tr_merkle_root": "6d65726b6c6520726f6f74", "prev_id": { - "out_point": "0d6fb73c32ed8c4694a54af747ed64e9bcd44eb4a44786139efccab1f57b0bb1:1034241884", - "asset_id": "2b54bfc9d00532adf5aaa7c3a96bc59b489f77d9042c5bce26b163defde5ee6a", - "script_key": "0310639ed4e8544bdc5fd4ab9702ff3260d2bd234cbabe880a6fb22cfa6a37f906" + "out_point": "251722cee10365790c96d24a03c6d982930cf840a79c3ba2d5288946f23d0064:681360684", + "asset_id": "23d728b45347eada650af24c56d0800a8691332088a805bd55c446e25eb07590", + "script_key": "0262a692930c4a1e5f9eb6333ab389a384955dccf0690bc0952a3dba8a99d0c5ba" }, "anchor": { "value": 777, "pk_script": "616e63686f7220706b736372697074", "sig_hash_type": 3, - "internal_key": "0281dd48d26da9f9020ed6d5647bc69f8d8a418721f73befeb69bdf6f7acfd2b6f", + "internal_key": "0252050ff1a0732e70709b424af5172f9a9cab982a07a000b4f140c75a0430951f", "merkle_root": "6d65726b6c6520726f6f74", "tapscript_sibling": "7369626c696e67", "bip32_derivation": [ { - "pub_key": "0281dd48d26da9f9020ed6d5647bc69f8d8a418721f73befeb69bdf6f7acfd2b6f", + "pub_key": "0252050ff1a0732e70709b424af5172f9a9cab982a07a000b4f140c75a0430951f", "fingerprint": 0, "bip32_path": [ 2147484665, @@ -960,7 +947,7 @@ ], "tr_bip32_derivation": [ { - "pub_key": "81dd48d26da9f9020ed6d5647bc69f8d8a418721f73befeb69bdf6f7acfd2b6f", + "pub_key": "52050ff1a0732e70709b424af5172f9a9cab982a07a000b4f140c75a0430951f", "leaf_hashes": [], "fingerprint": 0, "bip32_path": [ @@ -975,12 +962,12 @@ }, "asset": { "version": 1, - "genesis_first_prev_out": "6a467079b76fbe974b9d7f803594d4e552014fbff2770eb58f0d2558b55397b4:3783000789", - "genesis_tag": "3fac476c9fb03fc9228fbae88fd580663a0454b68312207f0a3b584c62316492", - "genesis_meta_hash": "3fac476c9fb03fc9228fbae88fd580663a0454b68312207f0a3b584c62316492", - "genesis_output_index": 872293974, + "genesis_first_prev_out": "0a7f201283b654043a6680d58fe8ba8f22c93fb09f6c47ac3f0d6fb73c32eded:2773153607", + "genesis_tag": "f50caf1fbfe831b10b7bf5b15c47a53dbf8e7dcafc9e138647a4b44ed4bce964", + "genesis_meta_hash": "f50caf1fbfe831b10b7bf5b15c47a53dbf8e7dcafc9e138647a4b44ed4bce964", + "genesis_output_index": 3029492785, "genesis_type": 0, - "amount": 3000344852, + "amount": 2042064831, "lock_time": 0, "relative_lock_time": 0, "prev_witnesses": [ @@ -991,21 +978,22 @@ "script_key": "000000000000000000000000000000000000000000000000000000000000000000" }, "tx_witness": [ - "ca4e3eb6360a746a22cb3482553f8c8e36cc3af9d609e7c4767e0884307237ea2c88fc85ea121a225a5e0ac58f792cf24be51b892120e44a75066243660a4cee" + "ecf977951a991f4e80d604dbfae74cb0c1444b819d3fb4200eeeb0da58e4b6d2b8763b775eb1ab8601a4b58c6da79d88b7a7ebb42e74a359ac16b32cb0e35427" ], "split_commitment": null } ], "split_commitment_root": null, "script_version": 0, - "script_key": "0369a894577ba243c461a7d1bb469a59a23524099dfdb60d9e89214ce5fee7e955", + "script_key": "02e9c55d4aa47773a3c3ddc9d2c9a94c9a37f0500d423f9e8a18d9481e765a0939", "group_key": { - "group_key": "0318f26b2c0962d559f9464e60491495b5b9e846418f325e2e1e1f04827467c596" + "group_key": "027f5f3ecbb1bd1cfc0dc2b8fff9e052c6f3581934e12b5c85a6f52fc621a47b47" }, "unknown_odd_types": null }, "proof": { - "prev_out": "6a467079b76fbe974b9d7f803594d4e552014fbff2770eb58f0d2558b55397b4:3783000789", + "version": 0, + "prev_out": "0a7f201283b654043a6680d58fe8ba8f22c93fb09f6c47ac3f0d6fb73c32eded:2773153607", "block_header": { "version": 1, "prev_block": "00000000000080b66c911bd5ba14a74260057311eaeb1982802f7010f1a9f090", @@ -1032,10 +1020,10 @@ }, "asset": { "version": 0, - "genesis_first_prev_out": "6a467079b76fbe974b9d7f803594d4e552014fbff2770eb58f0d2558b55397b4:3783000789", - "genesis_tag": "3fac476c9fb03fc9228fbae88fd580663a0454b68312207f0a3b584c62316492", - "genesis_meta_hash": "3fac476c9fb03fc9228fbae88fd580663a0454b68312207f0a3b584c62316492", - "genesis_output_index": 872293974, + "genesis_first_prev_out": "0a7f201283b654043a6680d58fe8ba8f22c93fb09f6c47ac3f0d6fb73c32eded:2773153607", + "genesis_tag": "f50caf1fbfe831b10b7bf5b15c47a53dbf8e7dcafc9e138647a4b44ed4bce964", + "genesis_meta_hash": "f50caf1fbfe831b10b7bf5b15c47a53dbf8e7dcafc9e138647a4b44ed4bce964", + "genesis_output_index": 3029492785, "genesis_type": 0, "amount": 1, "lock_time": 1337, @@ -1048,28 +1036,28 @@ "script_key": "000000000000000000000000000000000000000000000000000000000000000000" }, "tx_witness": [ - "9d9dcc41d5df938a3ddc01b8b1333ad0405a2b2511587ded6884f822d444d251dd1b3e8bf3403c9045f6350d8d52bb1564d310a935e71effbab3cd5b49bd22a4" + "65db9dcbaf343a25a00718c9f4171e332e77744b3de0ce0943a77770e0a974978aa0898b81f6824fc588c8bdfe635643ab4a334b624df521ca3462105bcb9428" ], "split_commitment": null } ], "split_commitment_root": null, "script_version": 0, - "script_key": "02bc13754106e03bd49f195387863417502cef3e30d8a7bdebe1bed9cc9d590b1a", + "script_key": "02ff17edcb1cf273f2fa15a6be722058dd2bec12f1105963de658ae20878008d08", "group_key": { - "group_key": "0348b4244d830b91833198c923f38c77c7694f0c57bcd6ac0755e7fbad9462a74b" + "group_key": "02b05dabff99aada76af4f67672b1e5464f85e72ec5dbd286e62586bba76d37cf0" }, "unknown_odd_types": null }, "inclusion_proof": { "output_index": 0, - "internal_key": "02877c14c5a09132ea9d9d31e49936d66f084c3cdb25fe6aa9923090fb490e89ae", + "internal_key": "027d7a7a230360619b4e574b117c8acd818ad7215fa0b80bbd12d13531037fb0b0", "commitment_proof": { "proof": { "asset_proof": { "proof": "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "version": 0, - "tap_key": "c0bbe5adf274743cb08a9229094617ad5a7cbe91276bfd38368c6d7f31fc4111", + "tap_key": "42aec58f851b38022040bb5e0d74b2ac99115ae9d77f718347fc1ecc23a3bdd6", "unknown_odd_types": null }, "taproot_asset_proof": { @@ -1080,6 +1068,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "00c00101", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -1088,13 +1077,13 @@ "exclusion_proofs": [ { "output_index": 2, - "internal_key": "02a4bff6a509c06e89a3db7db939cbb21c9747863aba8043a299089844ff7941bf", + "internal_key": "026d8ea41efa8ba84fd6fc5afaf026956182edc9bc1e12e9881ac5fc54cdd69667", "commitment_proof": { "proof": { "asset_proof": { "proof": "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "version": 0, - "tap_key": "c0bbe5adf274743cb08a9229094617ad5a7cbe91276bfd38368c6d7f31fc4111", + "tap_key": "42aec58f851b38022040bb5e0d74b2ac99115ae9d77f718347fc1ecc23a3bdd6", "unknown_odd_types": null }, "taproot_asset_proof": { @@ -1105,6 +1094,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "00c00101", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -1112,7 +1102,7 @@ }, { "output_index": 3, - "internal_key": "02e909a082ea515d7be2472f3e55114380e69aba0deef5480660f8b1564a1bbf88", + "internal_key": "028d4fcfcffa206ee9c79e642d326283480d5b4a73e436ed8a8c99186f6907c796", "commitment_proof": null, "tapscript_proof": { "tap_preimage_1": "011aac25408a4d28233cd325faefade9ef0fae76fcb1e35d08140045bbaa381b30eef46e46303556602ef13cef5d2fff3dc6a2ece6657fc91e4b0a5bba2ded4eff", @@ -1124,7 +1114,7 @@ }, { "output_index": 4, - "internal_key": "026180ff9648ec79af11e7f5574f78604577a5a1a04f8ccc6fcfb72323fb1ff809", + "internal_key": "02d0589acec520c8c1ffb40672c1fcf506986a6062b264f90b521d55e6800592e9", "commitment_proof": null, "tapscript_proof": { "tap_preimage_1": "", @@ -1137,13 +1127,13 @@ ], "split_root_proof": { "output_index": 4, - "internal_key": "022080204ea7fe87f800ce0bd2c765c25b5be16a68440cc58e0f5ae240d360e951", + "internal_key": "0253a0339ebf6d2e16923ac7128299667cc88566282f8b19c35556749e0a9640e1", "commitment_proof": { "proof": { "asset_proof": { "proof": "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "version": 0, - "tap_key": "c0bbe5adf274743cb08a9229094617ad5a7cbe91276bfd38368c6d7f31fc4111", + "tap_key": "42aec58f851b38022040bb5e0d74b2ac99115ae9d77f718347fc1ecc23a3bdd6", "unknown_odd_types": null }, "taproot_asset_proof": { @@ -1154,6 +1144,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -1174,38 +1165,19 @@ "626172" ], "genesis_reveal": { - "first_prev_out": "6a467079b76fbe974b9d7f803594d4e552014fbff2770eb58f0d2558b55397b4:3783000789", - "tag": "3fac476c9fb03fc9228fbae88fd580663a0454b68312207f0a3b584c62316492", - "meta_hash": "3fac476c9fb03fc9228fbae88fd580663a0454b68312207f0a3b584c62316492", - "output_index": 872293974, + "first_prev_out": "0a7f201283b654043a6680d58fe8ba8f22c93fb09f6c47ac3f0d6fb73c32eded:2773153607", + "tag": "f50caf1fbfe831b10b7bf5b15c47a53dbf8e7dcafc9e138647a4b44ed4bce964", + "meta_hash": "f50caf1fbfe831b10b7bf5b15c47a53dbf8e7dcafc9e138647a4b44ed4bce964", + "output_index": 3029492785, "type": 0 }, "group_key_reveal": { - "raw_key": "0348b4244d830b91833198c923f38c77c7694f0c57bcd6ac0755e7fbad9462a74b", - "tapscript_root": "78021851f5d9ac0f313a89ddfc454c5f8f72ac89b38b19f53784c19e9beac03c" + "raw_key": "02b05dabff99aada76af4f67672b1e5464f85e72ec5dbd286e62586bba76d37cf0", + "tapscript_root": "8406e877073ff08834e197a4034aa48afa3f85b8a62708caebbac880b5b89b93" }, "alt_leaves": null, "unknown_odd_types": null - }, - "alt_leaves": [ - { - "version": 0, - "genesis_first_prev_out": "0000000000000000000000000000000000000000000000000000000000000000:0", - "genesis_tag": "", - "genesis_meta_hash": "0000000000000000000000000000000000000000000000000000000000000000", - "genesis_output_index": 0, - "genesis_type": 0, - "amount": 0, - "lock_time": 0, - "relative_lock_time": 0, - "prev_witnesses": null, - "split_commitment_root": null, - "script_version": 33031, - "script_key": "027eeb4e3e5bb3435a6f11ebdf6a7320c34c7eb8e0e9cd31fc79f54e95a47e8454", - "group_key": null, - "unknown_odd_types": null - } - ] + } }, { "bip32_derivation": null, @@ -1228,21 +1200,20 @@ "tr_bip32_derivation": null }, "asset": null, - "proof": null, - "alt_leaves": null + "proof": null } ], "outputs": [ { "amount": 123, "type": 1, - "asset_version": 0, + "asset_version": 1, "interactive": true, "anchor_output_index": 0, - "anchor_output_internal_key": "0281dd48d26da9f9020ed6d5647bc69f8d8a418721f73befeb69bdf6f7acfd2b6f", + "anchor_output_internal_key": "0252050ff1a0732e70709b424af5172f9a9cab982a07a000b4f140c75a0430951f", "anchor_output_bip32_derivation": [ { - "pub_key": "0281dd48d26da9f9020ed6d5647bc69f8d8a418721f73befeb69bdf6f7acfd2b6f", + "pub_key": "0252050ff1a0732e70709b424af5172f9a9cab982a07a000b4f140c75a0430951f", "fingerprint": 0, "bip32_path": [ 2147484665, @@ -1255,7 +1226,7 @@ ], "anchor_output_tr_bip32_derivation": [ { - "pub_key": "81dd48d26da9f9020ed6d5647bc69f8d8a418721f73befeb69bdf6f7acfd2b6f", + "pub_key": "52050ff1a0732e70709b424af5172f9a9cab982a07a000b4f140c75a0430951f", "leaf_hashes": [], "fingerprint": 0, "bip32_path": [ @@ -1269,13 +1240,13 @@ ], "anchor_output_tapscript_sibling": "00c0126e6f7420612076616c696420736372697074", "asset": { - "version": 1, - "genesis_first_prev_out": "ff4a8eb1ac99b757885ddb0efd7a84af6747c045d99121ebdd8f44c9ab40e672:527850049", - "genesis_tag": "527ea64729a861d2f6497a3235c37f4192779ec1d96b3b1c5424fce0b727b030", - "genesis_meta_hash": "527ea64729a861d2f6497a3235c37f4192779ec1d96b3b1c5424fce0b727b030", - "genesis_output_index": 2827658879, + "version": 0, + "genesis_first_prev_out": "541c3b6bd9c19e7792417fc335327a49f6d261a82947a67e52b118fa6e04f9ce:3410233680", + "genesis_tag": "c05a4b13a1d5b2f5bfef5a6ed92da482caa9568e5b6fe9d8a9ddd9eb09277b92", + "genesis_meta_hash": "c05a4b13a1d5b2f5bfef5a6ed92da482caa9568e5b6fe9d8a9ddd9eb09277b92", + "genesis_output_index": 2955392992, "genesis_type": 0, - "amount": 828040880, + "amount": 3819700043, "lock_time": 0, "relative_lock_time": 0, "prev_witnesses": [ @@ -1286,27 +1257,27 @@ "script_key": "000000000000000000000000000000000000000000000000000000000000000000" }, "tx_witness": [ - "5075d8a54a73ce1a79e5239ccd9781a13a6440d4727320f0eda22211936a047c72d9de658df0727bd988ca6e15a00d493d660234a9548cef8ad85451c42c5a30" + "60e0ee8530cdfd6191a5d1be4cd143c6d11b914b448d1e3d7ad6765eb8212f2298a751a1c8651d456cc48716dd911055363f0612ec3f616469ae994e097242ea" ], "split_commitment": null } ], "split_commitment_root": null, "script_version": 0, - "script_key": "0239591fb3baa59f3a6c4b79a19360fad4476443687e2a8b5c15ccf6fdd9575e1e", + "script_key": "02484a4f43cefb92fd22133d26c737b94fc50ae8192d668c820afdf6428d51099c", "group_key": { - "group_key": "025d71c34c9e2d910f99d27617666acb52d73e133ca1ccc0f5c3dbe15e3a6d74d3" + "group_key": "03dffff1117719feb3a414b7b24b27f2da96be03b6f5d84c1eec8c73f1d8007640" }, "unknown_odd_types": null }, "split_asset": { - "version": 1, - "genesis_first_prev_out": "ff4a8eb1ac99b757885ddb0efd7a84af6747c045d99121ebdd8f44c9ab40e672:527850049", - "genesis_tag": "527ea64729a861d2f6497a3235c37f4192779ec1d96b3b1c5424fce0b727b030", - "genesis_meta_hash": "527ea64729a861d2f6497a3235c37f4192779ec1d96b3b1c5424fce0b727b030", - "genesis_output_index": 2827658879, + "version": 0, + "genesis_first_prev_out": "541c3b6bd9c19e7792417fc335327a49f6d261a82947a67e52b118fa6e04f9ce:3410233680", + "genesis_tag": "c05a4b13a1d5b2f5bfef5a6ed92da482caa9568e5b6fe9d8a9ddd9eb09277b92", + "genesis_meta_hash": "c05a4b13a1d5b2f5bfef5a6ed92da482caa9568e5b6fe9d8a9ddd9eb09277b92", + "genesis_output_index": 2955392992, "genesis_type": 0, - "amount": 828040880, + "amount": 3819700043, "lock_time": 0, "relative_lock_time": 0, "prev_witnesses": [ @@ -1317,27 +1288,28 @@ "script_key": "000000000000000000000000000000000000000000000000000000000000000000" }, "tx_witness": [ - "5075d8a54a73ce1a79e5239ccd9781a13a6440d4727320f0eda22211936a047c72d9de658df0727bd988ca6e15a00d493d660234a9548cef8ad85451c42c5a30" + "60e0ee8530cdfd6191a5d1be4cd143c6d11b914b448d1e3d7ad6765eb8212f2298a751a1c8651d456cc48716dd911055363f0612ec3f616469ae994e097242ea" ], "split_commitment": null } ], "split_commitment_root": null, "script_version": 0, - "script_key": "0239591fb3baa59f3a6c4b79a19360fad4476443687e2a8b5c15ccf6fdd9575e1e", + "script_key": "02484a4f43cefb92fd22133d26c737b94fc50ae8192d668c820afdf6428d51099c", "group_key": { - "group_key": "025d71c34c9e2d910f99d27617666acb52d73e133ca1ccc0f5c3dbe15e3a6d74d3" + "group_key": "03dffff1117719feb3a414b7b24b27f2da96be03b6f5d84c1eec8c73f1d8007640" }, "unknown_odd_types": null }, - "pk_script": "512039591fb3baa59f3a6c4b79a19360fad4476443687e2a8b5c15ccf6fdd9575e1e", + "pk_script": "5120484a4f43cefb92fd22133d26c737b94fc50ae8192d668c820afdf6428d51099c", "bip32_derivation": null, "tr_bip32_derivation": null, "tr_internal_key": "", "tr_merkle_root": "", "proof_delivery_address": "https://example.com", "proof_suffix": { - "prev_out": "6a467079b76fbe974b9d7f803594d4e552014fbff2770eb58f0d2558b55397b4:3783000789", + "version": 0, + "prev_out": "0a7f201283b654043a6680d58fe8ba8f22c93fb09f6c47ac3f0d6fb73c32eded:2773153607", "block_header": { "version": 1, "prev_block": "00000000000080b66c911bd5ba14a74260057311eaeb1982802f7010f1a9f090", @@ -1364,10 +1336,10 @@ }, "asset": { "version": 0, - "genesis_first_prev_out": "6a467079b76fbe974b9d7f803594d4e552014fbff2770eb58f0d2558b55397b4:3783000789", - "genesis_tag": "3fac476c9fb03fc9228fbae88fd580663a0454b68312207f0a3b584c62316492", - "genesis_meta_hash": "3fac476c9fb03fc9228fbae88fd580663a0454b68312207f0a3b584c62316492", - "genesis_output_index": 872293974, + "genesis_first_prev_out": "0a7f201283b654043a6680d58fe8ba8f22c93fb09f6c47ac3f0d6fb73c32eded:2773153607", + "genesis_tag": "f50caf1fbfe831b10b7bf5b15c47a53dbf8e7dcafc9e138647a4b44ed4bce964", + "genesis_meta_hash": "f50caf1fbfe831b10b7bf5b15c47a53dbf8e7dcafc9e138647a4b44ed4bce964", + "genesis_output_index": 3029492785, "genesis_type": 0, "amount": 1, "lock_time": 1337, @@ -1380,28 +1352,28 @@ "script_key": "000000000000000000000000000000000000000000000000000000000000000000" }, "tx_witness": [ - "9d9dcc41d5df938a3ddc01b8b1333ad0405a2b2511587ded6884f822d444d251dd1b3e8bf3403c9045f6350d8d52bb1564d310a935e71effbab3cd5b49bd22a4" + "65db9dcbaf343a25a00718c9f4171e332e77744b3de0ce0943a77770e0a974978aa0898b81f6824fc588c8bdfe635643ab4a334b624df521ca3462105bcb9428" ], "split_commitment": null } ], "split_commitment_root": null, "script_version": 0, - "script_key": "02bc13754106e03bd49f195387863417502cef3e30d8a7bdebe1bed9cc9d590b1a", + "script_key": "02ff17edcb1cf273f2fa15a6be722058dd2bec12f1105963de658ae20878008d08", "group_key": { - "group_key": "0348b4244d830b91833198c923f38c77c7694f0c57bcd6ac0755e7fbad9462a74b" + "group_key": "02b05dabff99aada76af4f67672b1e5464f85e72ec5dbd286e62586bba76d37cf0" }, "unknown_odd_types": null }, "inclusion_proof": { "output_index": 0, - "internal_key": "02877c14c5a09132ea9d9d31e49936d66f084c3cdb25fe6aa9923090fb490e89ae", + "internal_key": "027d7a7a230360619b4e574b117c8acd818ad7215fa0b80bbd12d13531037fb0b0", "commitment_proof": { "proof": { "asset_proof": { "proof": "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "version": 0, - "tap_key": "c0bbe5adf274743cb08a9229094617ad5a7cbe91276bfd38368c6d7f31fc4111", + "tap_key": "42aec58f851b38022040bb5e0d74b2ac99115ae9d77f718347fc1ecc23a3bdd6", "unknown_odd_types": null }, "taproot_asset_proof": { @@ -1412,6 +1384,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "00c00101", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -1420,13 +1393,13 @@ "exclusion_proofs": [ { "output_index": 2, - "internal_key": "02a4bff6a509c06e89a3db7db939cbb21c9747863aba8043a299089844ff7941bf", + "internal_key": "026d8ea41efa8ba84fd6fc5afaf026956182edc9bc1e12e9881ac5fc54cdd69667", "commitment_proof": { "proof": { "asset_proof": { "proof": "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "version": 0, - "tap_key": "c0bbe5adf274743cb08a9229094617ad5a7cbe91276bfd38368c6d7f31fc4111", + "tap_key": "42aec58f851b38022040bb5e0d74b2ac99115ae9d77f718347fc1ecc23a3bdd6", "unknown_odd_types": null }, "taproot_asset_proof": { @@ -1437,6 +1410,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "00c00101", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -1444,7 +1418,7 @@ }, { "output_index": 3, - "internal_key": "02e909a082ea515d7be2472f3e55114380e69aba0deef5480660f8b1564a1bbf88", + "internal_key": "028d4fcfcffa206ee9c79e642d326283480d5b4a73e436ed8a8c99186f6907c796", "commitment_proof": null, "tapscript_proof": { "tap_preimage_1": "011aac25408a4d28233cd325faefade9ef0fae76fcb1e35d08140045bbaa381b30eef46e46303556602ef13cef5d2fff3dc6a2ece6657fc91e4b0a5bba2ded4eff", @@ -1456,7 +1430,7 @@ }, { "output_index": 4, - "internal_key": "026180ff9648ec79af11e7f5574f78604577a5a1a04f8ccc6fcfb72323fb1ff809", + "internal_key": "02d0589acec520c8c1ffb40672c1fcf506986a6062b264f90b521d55e6800592e9", "commitment_proof": null, "tapscript_proof": { "tap_preimage_1": "", @@ -1469,13 +1443,13 @@ ], "split_root_proof": { "output_index": 4, - "internal_key": "022080204ea7fe87f800ce0bd2c765c25b5be16a68440cc58e0f5ae240d360e951", + "internal_key": "0253a0339ebf6d2e16923ac7128299667cc88566282f8b19c35556749e0a9640e1", "commitment_proof": { "proof": { "asset_proof": { "proof": "0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "version": 0, - "tap_key": "c0bbe5adf274743cb08a9229094617ad5a7cbe91276bfd38368c6d7f31fc4111", + "tap_key": "42aec58f851b38022040bb5e0d74b2ac99115ae9d77f718347fc1ecc23a3bdd6", "unknown_odd_types": null }, "taproot_asset_proof": { @@ -1486,6 +1460,7 @@ "unknown_odd_types": null }, "tapscript_sibling": "", + "stxo_proofs": {}, "unknown_odd_types": null }, "tapscript_proof": null, @@ -1506,15 +1481,15 @@ "626172" ], "genesis_reveal": { - "first_prev_out": "6a467079b76fbe974b9d7f803594d4e552014fbff2770eb58f0d2558b55397b4:3783000789", - "tag": "3fac476c9fb03fc9228fbae88fd580663a0454b68312207f0a3b584c62316492", - "meta_hash": "3fac476c9fb03fc9228fbae88fd580663a0454b68312207f0a3b584c62316492", - "output_index": 872293974, + "first_prev_out": "0a7f201283b654043a6680d58fe8ba8f22c93fb09f6c47ac3f0d6fb73c32eded:2773153607", + "tag": "f50caf1fbfe831b10b7bf5b15c47a53dbf8e7dcafc9e138647a4b44ed4bce964", + "meta_hash": "f50caf1fbfe831b10b7bf5b15c47a53dbf8e7dcafc9e138647a4b44ed4bce964", + "output_index": 3029492785, "type": 0 }, "group_key_reveal": { - "raw_key": "0348b4244d830b91833198c923f38c77c7694f0c57bcd6ac0755e7fbad9462a74b", - "tapscript_root": "78021851f5d9ac0f313a89ddfc454c5f8f72ac89b38b19f53784c19e9beac03c" + "raw_key": "02b05dabff99aada76af4f67672b1e5464f85e72ec5dbd286e62586bba76d37cf0", + "tapscript_root": "8406e877073ff08834e197a4034aa48afa3f85b8a62708caebbac880b5b89b93" }, "alt_leaves": null, "unknown_odd_types": null @@ -1534,8 +1509,42 @@ "relative_lock_time": 0, "prev_witnesses": null, "split_commitment_root": null, - "script_version": 18789, - "script_key": "0292ca5acfd079e64756fd9cd0fce8839ccbd9ff58bf3a1bbc675ca27992ee6c41", + "script_version": 65408, + "script_key": "021cc80a15b715539063341dfbacd661eafdd2db318701ba97eb4ee897ef17e6f4", + "group_key": null, + "unknown_odd_types": null + }, + { + "version": 0, + "genesis_first_prev_out": "0000000000000000000000000000000000000000000000000000000000000000:0", + "genesis_tag": "", + "genesis_meta_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "genesis_output_index": 0, + "genesis_type": 0, + "amount": 0, + "lock_time": 0, + "relative_lock_time": 0, + "prev_witnesses": null, + "split_commitment_root": null, + "script_version": 28333, + "script_key": "02773bdcf43714bb150e7a6de49d8f2061aceeef229d79f9cad38edd1e7299cd6c", + "group_key": null, + "unknown_odd_types": null + }, + { + "version": 0, + "genesis_first_prev_out": "0000000000000000000000000000000000000000000000000000000000000000:0", + "genesis_tag": "", + "genesis_meta_hash": "0000000000000000000000000000000000000000000000000000000000000000", + "genesis_output_index": 0, + "genesis_type": 0, + "amount": 0, + "lock_time": 0, + "relative_lock_time": 0, + "prev_witnesses": null, + "split_commitment_root": null, + "script_version": 39423, + "script_key": "02f9ecd60d652bdfb86737ee52805a2389afb474f16cf6ca12911e71f874250236", "group_key": null, "unknown_odd_types": null } @@ -1544,13 +1553,13 @@ { "amount": 345, "type": 1, - "asset_version": 0, + "asset_version": 1, "interactive": false, "anchor_output_index": 1, - "anchor_output_internal_key": "0281dd48d26da9f9020ed6d5647bc69f8d8a418721f73befeb69bdf6f7acfd2b6f", + "anchor_output_internal_key": "0252050ff1a0732e70709b424af5172f9a9cab982a07a000b4f140c75a0430951f", "anchor_output_bip32_derivation": [ { - "pub_key": "0281dd48d26da9f9020ed6d5647bc69f8d8a418721f73befeb69bdf6f7acfd2b6f", + "pub_key": "0252050ff1a0732e70709b424af5172f9a9cab982a07a000b4f140c75a0430951f", "fingerprint": 0, "bip32_path": [ 2147484665, @@ -1563,7 +1572,7 @@ ], "anchor_output_tr_bip32_derivation": [ { - "pub_key": "81dd48d26da9f9020ed6d5647bc69f8d8a418721f73befeb69bdf6f7acfd2b6f", + "pub_key": "52050ff1a0732e70709b424af5172f9a9cab982a07a000b4f140c75a0430951f", "leaf_hashes": [], "fingerprint": 0, "bip32_path": [ @@ -1577,13 +1586,13 @@ ], "anchor_output_tapscript_sibling": "01197ce22d12bc5a99587533af41169fa1dc9ff866c0d4d3021158d62933672d11197ce22d12bc5a99587533af41169fa1dc9ff866c0d4d3021158d62933672d11", "asset": { - "version": 1, - "genesis_first_prev_out": "ff4a8eb1ac99b757885ddb0efd7a84af6747c045d99121ebdd8f44c9ab40e672:527850049", - "genesis_tag": "527ea64729a861d2f6497a3235c37f4192779ec1d96b3b1c5424fce0b727b030", - "genesis_meta_hash": "527ea64729a861d2f6497a3235c37f4192779ec1d96b3b1c5424fce0b727b030", - "genesis_output_index": 2827658879, + "version": 0, + "genesis_first_prev_out": "541c3b6bd9c19e7792417fc335327a49f6d261a82947a67e52b118fa6e04f9ce:3410233680", + "genesis_tag": "c05a4b13a1d5b2f5bfef5a6ed92da482caa9568e5b6fe9d8a9ddd9eb09277b92", + "genesis_meta_hash": "c05a4b13a1d5b2f5bfef5a6ed92da482caa9568e5b6fe9d8a9ddd9eb09277b92", + "genesis_output_index": 2955392992, "genesis_type": 0, - "amount": 828040880, + "amount": 3819700043, "lock_time": 0, "relative_lock_time": 0, "prev_witnesses": [ @@ -1594,21 +1603,21 @@ "script_key": "000000000000000000000000000000000000000000000000000000000000000000" }, "tx_witness": [ - "5075d8a54a73ce1a79e5239ccd9781a13a6440d4727320f0eda22211936a047c72d9de658df0727bd988ca6e15a00d493d660234a9548cef8ad85451c42c5a30" + "60e0ee8530cdfd6191a5d1be4cd143c6d11b914b448d1e3d7ad6765eb8212f2298a751a1c8651d456cc48716dd911055363f0612ec3f616469ae994e097242ea" ], "split_commitment": null } ], "split_commitment_root": null, "script_version": 0, - "script_key": "0239591fb3baa59f3a6c4b79a19360fad4476443687e2a8b5c15ccf6fdd9575e1e", + "script_key": "02484a4f43cefb92fd22133d26c737b94fc50ae8192d668c820afdf6428d51099c", "group_key": { - "group_key": "025d71c34c9e2d910f99d27617666acb52d73e133ca1ccc0f5c3dbe15e3a6d74d3" + "group_key": "03dffff1117719feb3a414b7b24b27f2da96be03b6f5d84c1eec8c73f1d8007640" }, "unknown_odd_types": null }, "split_asset": null, - "pk_script": "512039591fb3baa59f3a6c4b79a19360fad4476443687e2a8b5c15ccf6fdd9575e1e", + "pk_script": "5120484a4f43cefb92fd22133d26c737b94fc50ae8192d668c820afdf6428d51099c", "bip32_derivation": null, "tr_bip32_derivation": null, "tr_internal_key": "", @@ -1630,8 +1639,8 @@ "relative_lock_time": 0, "prev_witnesses": null, "split_commitment_root": null, - "script_version": 17657, - "script_key": "028e1b9d2dc3d6e305b7e9c7de87f531a6932280d7f7ebe1539e709b61a6821d0a", + "script_version": 2189, + "script_key": "02bfe47b76305b0b88d1e616278a25b2d6b52c8345e0995e8629c083f376b334e9", "group_key": null, "unknown_odd_types": null }, @@ -1647,8 +1656,8 @@ "relative_lock_time": 0, "prev_witnesses": null, "split_commitment_root": null, - "script_version": 40633, - "script_key": "029dcd0432f5cff23b4addac370c8c2e7b0b3bc182d549e441f32a97cfb053fb63", + "script_version": 18714, + "script_key": "02b90d4aed8bfeb0df3e72df00b59a79fd3a84c3ef05eb884bbe46741db9f60867", "group_key": null, "unknown_odd_types": null }, @@ -1664,8 +1673,8 @@ "relative_lock_time": 0, "prev_witnesses": null, "split_commitment_root": null, - "script_version": 4212, - "script_key": "020afa1a8f67129f515bcb0cbb681b258217090d699cce498ac6e01c43aeedced1", + "script_version": 25363, + "script_key": "02d8e759976a5a65c7d32a1130fdc595448720a248535cd8daa4991bacaf37e1a3", "group_key": null, "unknown_odd_types": null }, @@ -1681,8 +1690,8 @@ "relative_lock_time": 0, "prev_witnesses": null, "split_commitment_root": null, - "script_version": 24362, - "script_key": "023185a61ac3970a2a0cd75b27d57d5a623014dc9bfbc5cea3b00682c02aefcbad", + "script_version": 43751, + "script_key": "024a57bca43e2374f69dc13049b5fcb189d15151e3d1bb55d050b6a711e7d1c617", "group_key": null, "unknown_odd_types": null } @@ -1692,7 +1701,7 @@ "version": 0, "chain_params_hrp": "tapbc" }, - "expected": "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QgFAnZ3MQdXfk4o93AG4sTM60EBaKyURWH3taIT4ItRE0lHdGz6L80A8kEX2NQ2NUrsVZNMQqTXnHv+6s81bSb0ipA4CAAAQIQK8E3VBBuA71J8ZU4eGNBdQLO8+MNinvevhvtnMnVkLGhEhA0i0JE2DC5GDMZjJI/OMd8dpTwxXvNasB1Xn+62UYqdLDKUABAAAAAACIQKHfBTFoJEy6p2dMeSZNtZvCEw82yX+aqmSMJD7SQ6JrgN6AUkAAQACIMC75a3ydHQ8sIqSKQlGF61afL6RJ2v9ODaMbX8x/EERBCIAAP//////////////////////////////////////////AicAAQACIgAA//////////////////////////////////////////8FBADAAQEN/QFOA6UABAAAAAICIQKkv/alCcBuiaPbfbk5y7Icl0eGOrqAQ6KZCJhE/3lBvwN6AUkAAQACIMC75a3ydHQ8sIqSKQlGF61afL6RJ2v9ODaMbX8x/EERBCIAAP//////////////////////////////////////////AicAAQACIgAA//////////////////////////////////////////8FBADAAQF3AAQAAAADAiEC6QmggupRXXviRy8+VRFDgOaaug3u9UgGYPixVkobv4gFTAFBARqsJUCKTSgjPNMl+u+t6e8Prnb8seNdCBQARbuqOBsw7vRuRjA1VmAu8TzvXS//Pcai7OZlf8keSwpbui3tTv8DBADAAQIEAQEuAAQAAAAEAiECYYD/lkjsea8R5/VXT3hgRXeloaBPjMxvz7cjI/sf+AkFAwQBAQ+fAAQAAAAEAiECIIAgTqf+h/gAzgvSx2XCW1vhamhEDMWOD1riQNNg6VEDdAFJAAEAAiDAu+Wt8nR0PLCKkikJRhetWny+kSdr/Tg2jG1/MfxBEQQiAAD//////////////////////////////////////////wInAAEAAiIAAP//////////////////////////////////////////ER4AAQACGXF1b3RoIHRoZSByYXZlbiBuZXZlcm1vcmUVCQIDZm9vA2JhchYEAAAAKheKtJdTtVglDY+1Dnfyv08BUuXUlDWAf51Ll75vt3lwRmrhfALVQDNmYWM0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6a0QAR5y97fP2w4K/QGWAAEAAoq0l1O1WCUNj7UOd/K/TwFS5dSUNYB/nUuXvm+3eXBGauF8AtVAM2ZhYzQ3NmM5ZmIwM2ZjOTIyOGZiYWU4OGZkNTgwNjYzYTA0NTRiNjgzMTIyMDdmMGEzYjU4NGM2MjMxNjQ5Mj+sR2yfsD/JIo+66I/VgGY6BFS2gxIgfwo7WExiMWSSM/4mVgAEAQAGAQEHA/0FOQkBBgutAasBZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0IBQJ2dzEHV35OKPdwBuLEzOtBAWislEVh97WiE+CLURNJR3Rs+i/NAPJBF9jUNjVK7FWTTEKk15x7/urPNW0m9IqQOAgAAECECvBN1QQbgO9SfGVOHhjQXUCzvPjDYp73r4b7ZzJ1ZCxoRIQNItCRNgwuRgzGYySPzjHfHaU8MV7zWrAdV5/utlGKnSwylAAQAAAAAAiECh3wUxaCRMuqdnTHkmTbWbwhMPNsl/mqpkjCQ+0kOia4DegFJAAEAAiDAu+Wt8nR0PLCKkikJRhetWny+kSdr/Tg2jG1/MfxBEQQiAAD//////////////////////////////////////////wInAAEAAiIAAP//////////////////////////////////////////BQQAwAEBDf0BTgOlAAQAAAACAiECpL/2pQnAbomj2325OcuyHJdHhjq6gEOimQiYRP95Qb8DegFJAAEAAiDAu+Wt8nR0PLCKkikJRhetWny+kSdr/Tg2jG1/MfxBEQQiAAD//////////////////////////////////////////wInAAEAAiIAAP//////////////////////////////////////////BQQAwAEBdwAEAAAAAwIhAukJoILqUV174kcvPlURQ4DmmroN7vVIBmD4sVZKG7+IBUwBQQEarCVAik0oIzzTJfrvrenvD652/LHjXQgUAEW7qjgbMO70bkYwNVZgLvE8710v/z3GouzmZX/JHksKW7ot7U7/AwQAwAECBAEBLgAEAAAABAIhAmGA/5ZI7HmvEef1V094YEV3paGgT4zMb8+3IyP7H/gJBQMEAQEPnwAEAAAABAIhAiCAIE6n/of4AM4L0sdlwltb4WpoRAzFjg9a4kDTYOlRA3QBSQABAAIgwLvlrfJ0dDywipIpCUYXrVp8vpEna/04NoxtfzH8QREEIgAA//////////////////////////////////////////8CJwABAAIiAAD//////////////////////////////////////////xEeAAEAAhlxdW90aCB0aGUgcmF2ZW4gbmV2ZXJtb3JlFQkCA2ZvbwNiYXIWBAAAACoXirSXU7VYJQ2PtQ538r9PAVLl1JQ1gH+dS5e+b7d5cEZq4XwC1UAzZmFjNDc2YzlmYjAzZmM5MjI4ZmJhZTg4ZmQ1ODA2NjNhMDQ1NGI2ODMxMjIwN2YwYTNiNTg0YzYyMzE2NDkyP6xHbJ+wP8kij7roj9WAZjoEVLaDEiB/CjtYTGIxZJIz/iZWABlBA0i0JE2DC5GDMZjJI/OMd8dpTwxXvNasB1Xn+62UYqdLeAIYUfXZrA8xOond/EVMX49yrImzixn1N4TBnpvqwDwBfAgAAAAAAAAByAF9CAAAAAAAAAFZAX4pAScOAkllECECkspaz9B55kdW/ZzQ/OiDnMvZ/1i/Ohu8Z1yieZLubEEAAXABAQFxAQABcggAAAAAAAAAAQFzIQKB3UjSban5Ag7W1WR7xp+NikGHIfc77+tpvfb3rP0rbyJ0AoHdSNJtqfkCDtbVZHvGn42KQYch9zvv62m99ves/StvGAAAAAD5AwCAAAAAgHsAAIAAAAAAyAEAACF1gd1I0m2p+QIO1tVke8afjYpBhyH3O+/rab3296z9K28ZAAAAAAD5AwCAAAAAgHsAAIAAAAAAyAEAAAF2/ZIBAAEBAopy5kCryUSP3eshkdlFwEdnr4R6/Q7bXYhXt5mssY5K/x92WkFANTI3ZWE2NDcyOWE4NjFkMmY2NDk3YTMyMzVjMzdmNDE5Mjc3OWVjMWQ5NmIzYjFjNTQyNGZjZTBiNzI3YjAzMFJ+pkcpqGHS9kl6MjXDf0GSd57B2Ws7HFQk/OC3J7AwqIqmfwAEAQAGBf4xWuawC60BqwFlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQgFAUHXYpUpzzhp55SOczZeBoTpkQNRycyDw7aIiEZNqBHxy2d5ljfBye9mIym4VoA1JPWYCNKlUjO+K2FRRxCxaMA4CAAAQIQI5WR+zuqWfOmxLeaGTYPrUR2RDaH4qi1wVzPb92VdeHhEhAl1xw0yeLZEPmdJ2F2Zqy1LXPhM8oczA9cPb4V46bXTTAXhBARl84i0SvFqZWHUzr0EWn6Hcn/hmwNTTAhFY1ikzZy0RGXziLRK8WplYdTOvQRafodyf+GbA1NMCEVjWKTNnLREBeQEAAXwIAAAAAAAAAAABfQgAAAAAAAAAAAF+oQQnDgJE+RAhAo4bnS3D1uMFt+nH3of1MaaTIoDX9+vhU55wm2Gmgh0KJw4CnrkQIQKdzQQy9c/yO0rdrDcMjC57CzvBgtVJ5EHzKpfPsFP7YycOAhB0ECECCvoaj2cSn1Fbywy7aBslghcJDWmczkmKxuAcQ67tztEnDgJfKhAhAjGFphrDlwoqDNdbJ9V9WmIwFNyb+8XOo7AGgsAq78utAA==", + "expected": "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QgFAZdudy680OiWgBxjJ9BceMy53dEs94M4JQ6d3cOCpdJeKoImLgfaCT8WIyL3+Y1ZDq0ozS2JN9SHKNGIQW8uUKA4CAAAQIQL/F+3LHPJz8voVpr5yIFjdK+wS8RBZY95liuIIeACNCBEhArBdq/+Zqtp2r09nZyseVGT4XnLsXb0obmJYa7p203zwDKUABAAAAAACIQJ9enojA2Bhm05XSxF8is2BitchX6C4C70S0TUxA3+wsAN6AUkAAQACIEKuxY+FGzgCIEC7Xg10sqyZEVrp139xg0f8Hswjo73WBCIAAP//////////////////////////////////////////AicAAQACIgAA//////////////////////////////////////////8FBADAAQEN/QFOA6UABAAAAAICIQJtjqQe+ouoT9b8WvrwJpVhgu3JvB4S6YgaxfxUzdaWZwN6AUkAAQACIEKuxY+FGzgCIEC7Xg10sqyZEVrp139xg0f8Hswjo73WBCIAAP//////////////////////////////////////////AicAAQACIgAA//////////////////////////////////////////8FBADAAQF3AAQAAAADAiECjU/Pz/ogbunHnmQtMmKDSA1bSnPkNu2KjJkYb2kHx5YFTAFBARqsJUCKTSgjPNMl+u+t6e8Prnb8seNdCBQARbuqOBsw7vRuRjA1VmAu8TzvXS//Pcai7OZlf8keSwpbui3tTv8DBADAAQIEAQEuAAQAAAAEAiEC0FiazsUgyMH/tAZywfz1BphqYGKyZPkLUh1V5oAFkukFAwQBAQ+fAAQAAAAEAiECU6Aznr9tLhaSOscSgplmfMiFZigvixnDVVZ0ngqWQOEDdAFJAAEAAiBCrsWPhRs4AiBAu14NdLKsmRFa6dd/cYNH/B7MI6O91gQiAAD//////////////////////////////////////////wInAAEAAiIAAP//////////////////////////////////////////ER4AAQACGXF1b3RoIHRoZSByYXZlbiBuZXZlcm1vcmUVCQIDZm9vA2JhchYEAAAAKheK7e0yPLdvDT+sR2yfsD/JIo+66I/VgGY6BFS2gxIgfwqlSvdHQGY1MGNh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BFS2gxIgfwqlSvdHQGY1MGNhZjFmYmZlODMxYjEwYjdiZjViMTVjNDdhNTNkYmY4ZTdkY2FmYzllMTM4NjQ3YTRiNDRlZDRiY2U5NjT1DK8fv+gxsQt79bFcR6U9v459yvyeE4ZHpLRO1LzpZLSSZDEABAEABgEBBwP9BTkJAQYLrQGrAWUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANCAUBl253LrzQ6JaAHGMn0Fx4zLnd0Sz3gzglDp3dw4Kl0l4qgiYuB9oJPxYjIvf5jVkOrSjNLYk31Ico0YhBby5QoDgIAABAhAv8X7csc8nPy+hWmvnIgWN0r7BLxEFlj3mWK4gh4AI0IESECsF2r/5mq2navT2dnKx5UZPhecuxdvShuYlhrunbTfPAMpQAEAAAAAAIhAn16eiMDYGGbTldLEXyKzYGK1yFfoLgLvRLRNTEDf7CwA3oBSQABAAIgQq7Fj4UbOAIgQLteDXSyrJkRWunXf3GDR/wezCOjvdYEIgAA//////////////////////////////////////////8CJwABAAIiAAD//////////////////////////////////////////wUEAMABAQ39AU4DpQAEAAAAAgIhAm2OpB76i6hP1vxa+vAmlWGC7cm8HhLpiBrF/FTN1pZnA3oBSQABAAIgQq7Fj4UbOAIgQLteDXSyrJkRWunXf3GDR/wezCOjvdYEIgAA//////////////////////////////////////////8CJwABAAIiAAD//////////////////////////////////////////wUEAMABAXcABAAAAAMCIQKNT8/P+iBu6ceeZC0yYoNIDVtKc+Q27YqMmRhvaQfHlgVMAUEBGqwlQIpNKCM80yX6763p7w+udvyx410IFABFu6o4GzDu9G5GMDVWYC7xPO9dL/89xqLs5mV/yR5LClu6Le1O/wMEAMABAgQBAS4ABAAAAAQCIQLQWJrOxSDIwf+0BnLB/PUGmGpgYrJk+QtSHVXmgAWS6QUDBAEBD58ABAAAAAQCIQJToDOev20uFpI6xxKCmWZ8yIVmKC+LGcNVVnSeCpZA4QN0AUkAAQACIEKuxY+FGzgCIEC7Xg10sqyZEVrp139xg0f8Hswjo73WBCIAAP//////////////////////////////////////////AicAAQACIgAA//////////////////////////////////////////8RHgABAAIZcXVvdGggdGhlIHJhdmVuIG5ldmVybW9yZRUJAgNmb28DYmFyFgQAAAAqF4rt7TI8t28NP6xHbJ+wP8kij7roj9WAZjoEVLaDEiB/CqVK90dAZjUwY2FmMWZiZmU4MzFiMTBiN2JmNWIxNWM0N2E1M2RiZjhlN2RjYWZjOWUxMzg2NDdhNGI0NGVkNGJjZTk2NPUMrx+/6DGxC3v1sVxHpT2/jn3K/J4ThkektE7UvOlktJJkMQAZQQKwXav/maradq9PZ2crHlRk+F5y7F29KG5iWGu6dtN88IQG6HcHP/CINOGXpANKpIr6P4W4picIyuu6yIC1uJuTAXwIAAAAAAAAAcgBfQgAAAAAAAABWQF+eQMnDgL/gBAhAhzIChW3FVOQYzQd+6zWYer90tsxhwG6l+tO6JfvF+b0Jw4Cbq0QIQJ3O9z0NxS7FQ56beSdjyBhrO7vIp15+crTjt0ecpnNbCcOApn/ECEC+ezWDWUr37hnN+5SgFojia+0dPFs9soSkR5x+HQlAjYAAXABAQFxAQABcggAAAAAAAAAAQFzIQJSBQ/xoHMucHCbQkr1Fy+anKuYKgegALTxQMdaBDCVHyJ0AlIFD/Ggcy5wcJtCSvUXL5qcq5gqB6AAtPFAx1oEMJUfGAAAAAD5AwCAAAAAgHsAAIAAAAAAyAEAACF1UgUP8aBzLnBwm0JK9RcvmpyrmCoHoAC08UDHWgQwlR8ZAAAAAAD5AwCAAAAAgHsAAIAAAAAAyAEAAAF2/ZIBAAEAAorO+QRu+hixUn6mRymoYdL2SXoyNcN/QZJ3nsHZazscVMtECVBAYzA1YTRiMTNhMWQ1YjJmNWJmZWY1YTZlZDkyZGE0ODJjYWE5NTY4ZTViNmZlOWQ4YTlkZGQ5ZWIwOTI3N2I5MsBaSxOh1bL1v+9abtktpILKqVaOW2/p2Knd2esJJ3uSsCe34AAEAQAGBf7jq/9LC60BqwFlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQgFAYODuhTDN/WGRpdG+TNFDxtEbkUtEjR49etZ2XrghLyKYp1GhyGUdRWzEhxbdkRBVNj8GEuw/YWRprplOCXJC6g4CAAAQIQJISk9DzvuS/SITPSbHN7lPxQroGS1mjIIK/fZCjVEJnBEhA9//8RF3Gf6zpBS3sksn8tqWvgO29dhMHuyMc/HYAHZAAXhBARl84i0SvFqZWHUzr0EWn6Hcn/hmwNTTAhFY1ikzZy0RGXziLRK8WplYdTOvQRafodyf+GbA1NMCEVjWKTNnLREBeQEBAXwIAAAAAAAAAAABfQgAAAAAAAAAAAF+oQQnDgIIjRAhAr/ke3YwWwuI0eYWJ4olsta1LINF4JlehinAg/N2szTpJw4CSRoQIQK5DUrti/6w3z5y3wC1mnn9OoTD7wXriEu+RnQdufYIZycOAmMTECEC2OdZl2paZcfTKhEw/cWVRIcgokhTXNjapJkbrK834aMnDgKq5xAhAkpXvKQ+I3T2ncEwSbX8sYnRUVHj0btV0FC2pxHn0cYXAA==", "comment": "random packet with no explicit version" } ], diff --git a/tapsend/proof.go b/tapsend/proof.go index f15e01730..73ecbdc53 100644 --- a/tapsend/proof.go +++ b/tapsend/proof.go @@ -265,6 +265,19 @@ func proofParams(finalTx *wire.MsgTx, vPkt *tappsbt.VPacket, allVirtualOutputs, rootOut.Asset, rootParams, outputCommitments, ) + + // Add STXO exclusion proofs for all the other outputs, for all + // STXOs spent by _all_ VOutputs that anchor in this output. + // First Collect all STXOs for this anchor output. Then add + // exclusion proofs for all the other anchor outputs. Add these + // in proofParams in tapsend/proof.go Those proofParams end up + // in `CreateTransitionProof` in tapsend/append.go, where we + // create the basic proof template. There we drop the STXO + // exclusion proofs in proof.UnknownOddTypes. + err := addSTXOExclusionProofs( + allVirtualOutputs, rootOut.Asset, rootParams, + outputCommitments, + ) if err != nil { return nil, err } @@ -326,9 +339,99 @@ func proofParams(finalTx *wire.MsgTx, vPkt *tappsbt.VPacket, return splitParams, nil } +// addSTXOExclusionProofs adds exclusion proofs for all the STXOs of the asset, +// for all the outputs that are asset outputs but haven't been processed yet, +// otherwise they'll be skipped. This should only be called after +// `addOtherOutputExclusionProofs` because it depends on +// `params.ExclusionProofs` already being set. +func addSTXOExclusionProofs(outputs []*tappsbt.VOutput, + newAsset *asset.Asset, params *proof.TransitionParams, + outputCommitments map[uint32]*commitment.TapCommitment) error { + + stxoAssets, err := asset.CollectSTXO(newAsset) + if err != nil { + return fmt.Errorf("error collecting STXO assets: %w", err) + } + + for idx := range outputs { + vOut := outputs[idx] + + outIndex := vOut.AnchorOutputIndex + + // We can use `HaveInclusionProof` here because it is just a + // check on whether we are processing our own anchor output. + haveIProof := params.HaveInclusionProof(outIndex) + haveEProof := params.HaveSTXOExclusionProof(outIndex) + if haveIProof || haveEProof { + continue + } + + tapTree := outputCommitments[outIndex] + + // Find the exclusion proofs for this output. + var eProof *proof.TaprootProof + for idx := range params.ExclusionProofs { + e := params.ExclusionProofs[idx] + if e.OutputIndex == outIndex { + eProof = ¶ms.ExclusionProofs[idx] + break + } + } + if eProof == nil { + return fmt.Errorf("no exclusion proof for "+ + "output %d", outIndex) + } + + // There aren't any assets in this output, we can skip + // creating exclusion proofs for it. + if eProof.CommitmentProof == nil { + continue + } + + commitmentProof := eProof.CommitmentProof + + commitmentProof.STXOProofs = make( + map[asset.SerializedKey]commitment.Proof, + len(stxoAssets), + ) + + for idx := range stxoAssets { + stxoAsset := stxoAssets[idx].(*asset.Asset) + pubKey := stxoAsset.ScriptKey.PubKey + identifier := asset.ToSerialized(pubKey) + + _, exclusionProof, err := tapTree.Proof( + stxoAsset.TapCommitmentKey(), + stxoAsset.AssetCommitmentKey(), + ) + if err != nil { + return err + } + + // Confirm that we are creating the stxo proofs for the + // asset that is being created. We do this by confirming + // that the exclusion proof for the newly created asset + // is already present. + _, err = eProof.DeriveByAssetExclusion( + newAsset.AssetCommitmentKey(), + newAsset.TapCommitmentKey(), + ) + if err != nil { + return fmt.Errorf("v1 proof for newly created "+ + "asset not found during creation of "+ + "stxo proofs: %w", err) + } + + commitmentProof.STXOProofs[identifier] = *exclusionProof + } + } + + return nil +} + // addOtherOutputExclusionProofs adds exclusion proofs for all the outputs that -// are asset outputs but haven't been processed yet (the skip function needs to -// return false for not yet processed outputs, otherwise they'll be skipped). +// are asset outputs but haven't been processed yet, otherwise they'll be +// skipped. func addOtherOutputExclusionProofs(outputs []*tappsbt.VOutput, asset *asset.Asset, params *proof.TransitionParams, outputCommitments map[uint32]*commitment.TapCommitment) error { diff --git a/tapsend/proof_test.go b/tapsend/proof_test.go index 7b69c1b1f..19e58e9bd 100644 --- a/tapsend/proof_test.go +++ b/tapsend/proof_test.go @@ -27,6 +27,32 @@ var ( // TestCreateProofSuffix tests the creation of suffix proofs for a given anchor // transaction. func TestCreateProofSuffix(t *testing.T) { + testCases := []struct { + name string + stxoProof bool + expectedErr string + }{ + { + name: "Correct inclusion and exclusion proofs", + stxoProof: true, + }, + { + name: "No stxo proof", + stxoProof: false, + expectedErr: "error verifying STXO proof: missing " + + "asset proof", + }, + } + for _, tc := range testCases { + tc := tc + + t.Run(tc.name, func(tt *testing.T) { + createProofSuffix(t, tc.stxoProof, tc.expectedErr) + }) + } +} + +func createProofSuffix(t *testing.T, stxoProof bool, expectedErr string) { testAssets := []*asset.Asset{ asset.RandAsset(t, asset.RandAssetType(t)), asset.RandAsset(t, asset.RandAssetType(t)), @@ -83,7 +109,10 @@ func TestCreateProofSuffix(t *testing.T) { } outputCommitments := make(map[uint32]*commitment.TapCommitment) - addOutputCommitment(t, anchorTx, outputCommitments, testPackets...) + addOutputCommitment( + t, anchorTx, outputCommitments, stxoProof, + testPackets..., + ) addBip86Output(t, anchorTx.FundedPsbt.Pkt) // Create a proof suffix for all 4 packets now and validate it. @@ -106,18 +135,32 @@ func TestCreateProofSuffix(t *testing.T) { ) // Checking the transfer witness is the very last step - // of the proof verification. Since we didn't properly + // of the proof verification. Since we don't properly // sign the transfer, we expect the witness to be // invalid. But if we get to that point, we know that - // all inclusion and exclusion proofs are correct (which - // is what this test is testing). + // all inclusion and exclusion proofs are correct. So + // for successful cases we still expect an error, namely + // the invalid witness error. + errCode := txscript.ErrTaprootSigInvalid invalidWitnessErr := vm.Error{ Kind: vm.ErrInvalidTransferWitness, Inner: txscript.Error{ - ErrorCode: txscript.ErrTaprootSigInvalid, + ErrorCode: errCode, }, } - require.ErrorIs(t, err, invalidWitnessErr) + if expectedErr == "" { + require.ErrorIs(t, err, invalidWitnessErr) + } else { + if vPkt.Outputs[outIdx].Asset.IsTransferRoot() { + require.ErrorContains( + t, err, expectedErr, + ) + } else { + require.ErrorIs( + t, err, invalidWitnessErr, + ) + } + } } } } @@ -206,7 +249,7 @@ func createPacket(t *testing.T, a *asset.Asset, split bool, func addOutputCommitment(t *testing.T, anchorTx *AnchorTransaction, outputCommitments map[uint32]*commitment.TapCommitment, - vPackets ...*tappsbt.VPacket) { + stxoProof bool, vPackets ...*tappsbt.VPacket) { packet := anchorTx.FundedPsbt.Pkt @@ -222,27 +265,42 @@ func addOutputCommitment(t *testing.T, anchorTx *AnchorTransaction, } } - for idx, assets := range assetsByOutput { - for idx := range assets { - if !assets[idx].HasSplitCommitmentWitness() { + stxoAssetsByOutput := make(map[uint32][]asset.AltLeaf[asset.Asset]) + for idx1, assets := range assetsByOutput { + for idx2 := range assets { + if assets[idx2].IsTransferRoot() { + stxoAssets, err := asset.CollectSTXO( + assets[idx2], + ) + stxoAssetsByOutput[idx1] = append( + stxoAssetsByOutput[idx1], stxoAssets..., + ) + require.NoError(t, err) + } + + if !assets[idx2].HasSplitCommitmentWitness() { continue } - assets[idx] = assets[idx].Copy() - assets[idx].PrevWitnesses[0].SplitCommitment = nil + + assets[idx2] = assets[idx2].Copy() + assets[idx2].PrevWitnesses[0].SplitCommitment = nil } c, err := commitment.FromAssets(nil, assets...) require.NoError(t, err) + if stxoProof { + err = c.MergeAltLeaves(stxoAssetsByOutput[idx1]) + require.NoError(t, err) + } - internalKey := keyByOutput[idx] + internalKey := keyByOutput[idx1] script, err := tapscript.PayToAddrScript(*internalKey, nil, *c) require.NoError(t, err) - packet.UnsignedTx.TxOut[idx].PkScript = script - packet.Outputs[idx].TaprootInternalKey = schnorr.SerializePubKey( - internalKey, - ) - outputCommitments[idx] = c + packet.UnsignedTx.TxOut[idx1].PkScript = script + packet.Outputs[idx1].TaprootInternalKey = + schnorr.SerializePubKey(internalKey) + outputCommitments[idx1] = c } } diff --git a/tapsend/send.go b/tapsend/send.go index 9a3810768..a33359c93 100644 --- a/tapsend/send.go +++ b/tapsend/send.go @@ -27,7 +27,6 @@ import ( "github.com/lightninglabs/taproot-assets/fn" "github.com/lightninglabs/taproot-assets/tappsbt" "github.com/lightninglabs/taproot-assets/tapscript" - lfn "github.com/lightningnetwork/lnd/fn/v2" "github.com/lightningnetwork/lnd/input" "github.com/lightningnetwork/lnd/lnwallet/btcwallet" "golang.org/x/exp/maps" @@ -915,11 +914,6 @@ func addKeyTweaks(unknowns []*psbt.Unknown, desc *lndclient.SignDescriptor) { func CreateOutputCommitments( packets []*tappsbt.VPacket) (tappsbt.OutputCommitments, error) { - // Inputs must be unique. - if err := AssertInputsUnique(packets); err != nil { - return nil, err - } - // We require all outputs that reference the same anchor output to be // identical, otherwise some assumptions in the code below don't hold. if err := AssertInputAnchorsEqual(packets); err != nil { @@ -995,6 +989,18 @@ func commitPacket(vPkt *tappsbt.VPacket, return fmt.Errorf("error committing assets: %w", err) } + // Collect the spent assets for this output. + stxoAssets, err := asset.CollectSTXO(vOut.Asset) + if err != nil { + return fmt.Errorf("error collecting STXO assets: %w", + err) + } + + // If we have STXOs, we will encumber vOut.AltLeaves with + // them.They will be merged into the commitment later with + // MergeAltLeaves. + vOut.AltLeaves = append(vOut.AltLeaves, stxoAssets...) + // Because the receiver of this output might be receiving // through an address (non-interactive), we need to blank out // the split commitment proof, as the receiver doesn't know of @@ -1444,26 +1450,6 @@ func AssertInputAnchorsEqual(packets []*tappsbt.VPacket) error { return nil } -// AssertInputsUnique makes sure that every input across all virtual packets is -// referencing a unique input asset, which is identified by the input PrevID. -func AssertInputsUnique(packets []*tappsbt.VPacket) error { - // PrevIDs are comparable enough to serve as a map key without hashing. - inputs := make(lfn.Set[asset.PrevID]) - - for _, vPkt := range packets { - for _, vIn := range vPkt.Inputs { - if inputs.Contains(vIn.PrevID) { - return fmt.Errorf("input %v is duplicated", - vIn.PrevID) - } - - inputs.Add(vIn.PrevID) - } - } - - return nil -} - // AssertOutputAltLeavesValid checks that, for each anchor output, the AltLeaves // carried by all packets assigned to that output can be used to construct an // AltCommitment. @@ -1995,12 +1981,21 @@ func ValidateAnchorInputs(anchorPacket *psbt.Packet, packets []*tappsbt.VPacket, inputAssets[outpoint], vIn.Asset(), ) inputSiblings[outpoint] = sibling - inputAltLeaves[outpoint] = append( - inputAltLeaves[outpoint], - asset.CopyAltLeaves(vIn.AltLeaves)..., - ) inputScripts[outpoint] = anchorIn.WitnessUtxo.PkScript inputAnchors[outpoint] = vIn.Anchor + + // AltLeaves are the same for all assets from the same + // outpoint. So we only need to store them once for each + // outpoint. + if vIn.Proof == nil { + continue + } + + if _, ok := inputAltLeaves[outpoint]; !ok { + inputAltLeaves[outpoint] = asset.CopyAltLeaves( + vIn.Proof.AltLeaves, + ) + } } } @@ -2012,15 +2007,6 @@ func ValidateAnchorInputs(anchorPacket *psbt.Packet, packets []*tappsbt.VPacket, ) } - // Each input must have a valid set of AltLeaves at this point. - for outpoint, leaves := range inputAltLeaves { - err := asset.ValidAltLeaves(leaves) - if err != nil { - return fmt.Errorf("input %v invalid alt leaves: %w", - outpoint.String(), err) - } - } - // We can now go through each anchor input that contains assets being // spent and check that we arrive at the correct script. for anchorOutpoint, assets := range inputAssets { diff --git a/tapsend/send_test.go b/tapsend/send_test.go index 6eb9b33ee..72d42fc4d 100644 --- a/tapsend/send_test.go +++ b/tapsend/send_test.go @@ -682,6 +682,8 @@ func checkOutputCommitments(t *testing.T, vPkt *tappsbt.VPacket, default: require.Fail(t, "unknown vPacket version") } + + // TODO(jhb): Check for correct STXOs } func checkTaprootOutputs(t *testing.T, outputs []*tappsbt.VOutput,