88 tap "github.com/lightninglabs/taproot-assets"
99 "github.com/lightninglabs/taproot-assets/fn"
1010 "github.com/lightninglabs/taproot-assets/internal/test"
11+ "github.com/lightninglabs/taproot-assets/proof"
1112 "github.com/lightninglabs/taproot-assets/tappsbt"
1213 "github.com/lightninglabs/taproot-assets/taprpc"
1314 wrpc "github.com/lightninglabs/taproot-assets/taprpc/assetwalletrpc"
@@ -40,10 +41,6 @@ func testAddresses(t *harnessTest) {
4041 // assets made above.
4142 secondTapd := setupTapdHarness (
4243 t .t , t , t .lndHarness .Bob , t .universeServer ,
43- func (params * tapdHarnessParams ) {
44- params .startupSyncNode = t .tapd
45- params .startupSyncNumAssets = len (rpcAssets )
46- },
4744 )
4845 defer func () {
4946 require .NoError (t .t , secondTapd .stop (! * noDelete ))
@@ -79,12 +76,6 @@ func testAddresses(t *harnessTest) {
7976 // Eventually the event should be marked as confirmed.
8077 AssertAddrEvent (t .t , secondTapd , addr , 1 , statusConfirmed )
8178
82- // To complete the transfer, we'll export the proof from the
83- // sender and import it into the receiver for each asset set.
84- sendProof (
85- t , t .tapd , secondTapd , addr .ScriptKey , a .AssetGenesis ,
86- )
87-
8879 // Make sure we have imported and finalized all proofs.
8980 AssertNonInteractiveRecvComplete (t .t , secondTapd , idx + 1 )
9081
@@ -175,10 +166,6 @@ func testMultiAddress(t *harnessTest) {
175166 alice := t .tapd
176167 bob := setupTapdHarness (
177168 t .t , t , t .lndHarness .Bob , t .universeServer ,
178- func (params * tapdHarnessParams ) {
179- params .startupSyncNode = alice
180- params .startupSyncNumAssets = len (rpcAssets )
181- },
182169 )
183170 defer func () {
184171 require .NoError (t .t , bob .stop (! * noDelete ))
@@ -195,7 +182,12 @@ func testMultiAddress(t *harnessTest) {
195182func testAddressAssetSyncer (t * harnessTest ) {
196183 // We'll kick off the test by making a new node, without hooking it up
197184 // to any existing Universe server.
198- bob := setupTapdHarness (t .t , t , t .lndHarness .Bob , nil )
185+ bob := setupTapdHarness (
186+ t .t , t , t .lndHarness .Bob , t .universeServer ,
187+ func (params * tapdHarnessParams ) {
188+ params .noDefaultUniverseSync = true
189+ },
190+ )
199191 defer func () {
200192 require .NoError (t .t , bob .stop (! * noDelete ))
201193 }()
@@ -321,8 +313,9 @@ func testAddressAssetSyncer(t *harnessTest) {
321313 restartBobNoUniSync := func (disableSyncer bool ) {
322314 require .NoError (t .t , bob .stop (! * noDelete ))
323315 bob = setupTapdHarness (
324- t .t , t , t .lndHarness .Bob , nil ,
316+ t .t , t , t .lndHarness .Bob , t . universeServer ,
325317 func (params * tapdHarnessParams ) {
318+ params .noDefaultUniverseSync = true
326319 params .addrAssetSyncerDisable = disableSyncer
327320 },
328321 )
@@ -436,21 +429,18 @@ func runMultiSendTest(ctxt context.Context, t *harnessTest, alice,
436429
437430 // In order to force a split, we don't try to send the full asset.
438431 const sendAmt = 100
439- var bobAddresses []* taprpc.Addr
440432 bobAddr1 , err := bob .NewAddr (ctxt , & taprpc.NewAddrRequest {
441433 AssetId : genInfo .AssetId ,
442434 Amt : sendAmt ,
443435 })
444436 require .NoError (t .t , err )
445- bobAddresses = append (bobAddresses , bobAddr1 )
446437 AssertAddrCreated (t .t , bob , mintedAsset , bobAddr1 )
447438
448439 bobAddr2 , err := bob .NewAddr (ctxt , & taprpc.NewAddrRequest {
449440 AssetId : genInfo .AssetId ,
450441 Amt : sendAmt ,
451442 })
452443 require .NoError (t .t , err )
453- bobAddresses = append (bobAddresses , bobAddr2 )
454444 AssertAddrCreated (t .t , bob , mintedAsset , bobAddr2 )
455445
456446 // To test that Alice can also receive to multiple addresses in a single
@@ -492,14 +482,6 @@ func runMultiSendTest(ctxt context.Context, t *harnessTest, alice,
492482 // this point, so the status should go to completed directly.
493483 AssertAddrEventByStatus (t .t , alice , statusCompleted , numRuns * 2 )
494484
495- // To complete the transfer, we'll export the proof from the sender and
496- // import it into the receiver for each asset set. This should not be
497- // necessary for the sends to Alice, as she is both the sender and
498- // receiver and should detect the local proof once it's written to disk.
499- for i := range bobAddresses {
500- sendProof (t , alice , bob , bobAddresses [i ].ScriptKey , genInfo )
501- }
502-
503485 // Make sure we have imported and finalized all proofs.
504486 AssertNonInteractiveRecvComplete (t .t , bob , numRuns * 2 )
505487 AssertNonInteractiveRecvComplete (t .t , alice , numRuns * 2 )
@@ -531,6 +513,8 @@ func runMultiSendTest(ctxt context.Context, t *harnessTest, alice,
531513 require .NoError (t .t , err )
532514}
533515
516+ // sendProof manually exports a proof from the given source node and imports it
517+ // using the development only ImportProof RPC on the destination node.
534518func sendProof (t * harnessTest , src , dst * tapdHarness , scriptKey []byte ,
535519 genInfo * taprpc.GenesisInfo ) * tapdevrpc.ImportProofResponse {
536520
@@ -562,6 +546,85 @@ func sendProof(t *harnessTest, src, dst *tapdHarness, scriptKey []byte,
562546 return importResp
563547}
564548
549+ // sendProofUniRPC manually exports a proof from the given source node and
550+ // imports it using the universe related InsertProof RPC on the destination
551+ // node.
552+ func sendProofUniRPC (t * harnessTest , src , dst * tapdHarness , scriptKey []byte ,
553+ genInfo * taprpc.GenesisInfo ) * unirpc.AssetProofResponse {
554+
555+ ctxb := context .Background ()
556+
557+ var proofResp * taprpc.ProofFile
558+ waitErr := wait .NoError (func () error {
559+ resp , err := src .ExportProof (ctxb , & taprpc.ExportProofRequest {
560+ AssetId : genInfo .AssetId ,
561+ ScriptKey : scriptKey ,
562+ })
563+ if err != nil {
564+ return err
565+ }
566+
567+ proofResp = resp
568+ return nil
569+ }, defaultWaitTimeout )
570+ require .NoError (t .t , waitErr )
571+
572+ t .Logf ("Importing proof %x using InsertProof" , proofResp .RawProofFile )
573+
574+ f := proof.File {}
575+ err := f .Decode (bytes .NewReader (proofResp .RawProofFile ))
576+ require .NoError (t .t , err )
577+
578+ lastProof , err := f .LastProof ()
579+ require .NoError (t .t , err )
580+
581+ var lastProofBytes bytes.Buffer
582+ err = lastProof .Encode (& lastProofBytes )
583+ require .NoError (t .t , err )
584+ asset := lastProof .Asset
585+
586+ proofType := universe .ProofTypeTransfer
587+ if asset .IsGenesisAsset () {
588+ proofType = universe .ProofTypeIssuance
589+ }
590+
591+ uniID := universe.Identifier {
592+ AssetID : asset .ID (),
593+ ProofType : proofType ,
594+ }
595+ if asset .GroupKey != nil {
596+ uniID .GroupKey = & asset .GroupKey .GroupPubKey
597+ }
598+
599+ rpcUniID , err := tap .MarshalUniID (uniID )
600+ require .NoError (t .t , err )
601+
602+ outpoint := & unirpc.Outpoint {
603+ HashStr : lastProof .AnchorTx .TxHash ().String (),
604+ Index : int32 (lastProof .InclusionProof .OutputIndex ),
605+ }
606+
607+ importResp , err := dst .InsertProof (ctxb , & unirpc.AssetProof {
608+ Key : & unirpc.UniverseKey {
609+ Id : rpcUniID ,
610+ LeafKey : & unirpc.AssetKey {
611+ Outpoint : & unirpc.AssetKey_Op {
612+ Op : outpoint ,
613+ },
614+ ScriptKey : & unirpc.AssetKey_ScriptKeyBytes {
615+ ScriptKeyBytes : scriptKey ,
616+ },
617+ },
618+ },
619+ AssetLeaf : & unirpc.AssetLeaf {
620+ Proof : lastProofBytes .Bytes (),
621+ },
622+ })
623+ require .NoError (t .t , err )
624+
625+ return importResp
626+ }
627+
565628// sendAssetsToAddr spends the given input asset and sends the amount specified
566629// in the address to the Taproot output derived from the address.
567630func sendAssetsToAddr (t * harnessTest , sender * tapdHarness ,
0 commit comments