@@ -292,19 +292,17 @@ func (d *MetadataStoreSqlite) SetTransaction(
292292 }
293293 // Extract and save witness set data
294294 // Delete existing witness records to ensure idempotency on retry
295- if tmpTx .ID != 0 {
296- if result := txn .Where ("transaction_id = ?" , tmpTx .ID ).Delete (& models.KeyWitness {}); result .Error != nil {
297- return fmt .Errorf ("delete existing key witnesses: %w" , result .Error )
298- }
299- if result := txn .Where ("transaction_id = ?" , tmpTx .ID ).Delete (& models.Script {}); result .Error != nil {
300- return fmt .Errorf ("delete existing scripts: %w" , result .Error )
301- }
302- if result := txn .Where ("transaction_id = ?" , tmpTx .ID ).Delete (& models.Redeemer {}); result .Error != nil {
303- return fmt .Errorf ("delete existing redeemers: %w" , result .Error )
304- }
305- if result := txn .Where ("transaction_id = ?" , tmpTx .ID ).Delete (& models.PlutusData {}); result .Error != nil {
306- return fmt .Errorf ("delete existing plutus data: %w" , result .Error )
307- }
295+ if result := txn .Where ("transaction_id = ?" , tmpTx .ID ).Delete (& models.KeyWitness {}); result .Error != nil {
296+ return fmt .Errorf ("delete existing key witnesses: %w" , result .Error )
297+ }
298+ if result := txn .Where ("transaction_id = ?" , tmpTx .ID ).Delete (& models.WitnessScripts {}); result .Error != nil {
299+ return fmt .Errorf ("delete existing witness scripts: %w" , result .Error )
300+ }
301+ if result := txn .Where ("transaction_id = ?" , tmpTx .ID ).Delete (& models.Redeemer {}); result .Error != nil {
302+ return fmt .Errorf ("delete existing redeemers: %w" , result .Error )
303+ }
304+ if result := txn .Where ("transaction_id = ?" , tmpTx .ID ).Delete (& models.PlutusData {}); result .Error != nil {
305+ return fmt .Errorf ("delete existing plutus data: %w" , result .Error )
308306 }
309307 ws := tx .Witnesses ()
310308 if ws != nil {
@@ -336,108 +334,75 @@ func (d *MetadataStoreSqlite) SetTransaction(
336334 }
337335 }
338336
339- // Add Native Scripts
340- for _ , script := range ws .NativeScripts () {
341- scriptHash := script .Hash ()
342- scriptRecord := models.Script {
343- TransactionID : tmpTx .ID ,
344- Type : uint8 (lcommon .ScriptRefTypeNativeScript ),
345- ScriptHash : scriptHash .Bytes (),
346- }
347- if result := txn .Create (& scriptRecord ); result .Error != nil {
348- return fmt .Errorf ("create native script: %w" , result .Error )
349- }
350- // Also store the script content separately to avoid duplicates
351- scriptContent := models.ScriptContent {
352- Hash : scriptHash .Bytes (),
353- Type : uint8 (lcommon .ScriptRefTypeNativeScript ),
354- Content : script .Cbor (),
355- CreatedSlot : point .Slot ,
356- }
357- if result := txn .Clauses (clause.OnConflict {
358- Columns : []clause.Column {{Name : "hash" }},
359- DoNothing : true ,
360- }).Create (& scriptContent ); result .Error != nil {
361- return fmt .Errorf ("create native script content: %w" , result .Error )
337+ // Helper function to process scripts - deduplicates the 4 script type blocks
338+ processScripts := func (scriptType uint8 , scripts interface {}) error {
339+ // Common logic for creating script records
340+ createScriptRecords := func (scriptHash lcommon.ScriptHash , content []byte ) error {
341+ witnessScript := models.WitnessScripts {
342+ TransactionID : tmpTx .ID ,
343+ Type : scriptType ,
344+ ScriptHash : scriptHash .Bytes (),
345+ }
346+ if result := txn .Create (& witnessScript ); result .Error != nil {
347+ return fmt .Errorf ("create witness script: %w" , result .Error )
348+ }
349+ scriptContent := models.Script {
350+ Hash : scriptHash .Bytes (),
351+ Type : scriptType ,
352+ Content : content ,
353+ CreatedSlot : point .Slot ,
354+ }
355+ if result := txn .Clauses (clause.OnConflict {
356+ Columns : []clause.Column {{Name : "hash" }},
357+ DoNothing : true ,
358+ }).Create (& scriptContent ); result .Error != nil {
359+ return fmt .Errorf ("create script content: %w" , result .Error )
360+ }
361+ return nil
362362 }
363- }
364363
365- // Add PlutusV1 Scripts
366- for _ , script := range ws .PlutusV1Scripts () {
367- scriptHash := script .Hash ()
368- scriptRecord := models.Script {
369- TransactionID : tmpTx .ID ,
370- Type : uint8 (lcommon .ScriptRefTypePlutusV1 ),
371- ScriptHash : scriptHash .Bytes (),
372- }
373- if result := txn .Create (& scriptRecord ); result .Error != nil {
374- return fmt .Errorf ("create plutus v1 script: %w" , result .Error )
375- }
376- // Also store the script content separately to avoid duplicates
377- scriptContent := models.ScriptContent {
378- Hash : scriptHash .Bytes (),
379- Type : uint8 (lcommon .ScriptRefTypePlutusV1 ),
380- Content : script .RawScriptBytes (),
381- CreatedSlot : point .Slot ,
382- }
383- if result := txn .Clauses (clause.OnConflict {
384- Columns : []clause.Column {{Name : "hash" }},
385- DoNothing : true ,
386- }).Create (& scriptContent ); result .Error != nil {
387- return fmt .Errorf ("create plutus v1 script content: %w" , result .Error )
364+ // Type switch to handle different script types
365+ switch s := scripts .(type ) {
366+ case []lcommon.NativeScript :
367+ for _ , script := range s {
368+ if err := createScriptRecords (script .Hash (), script .Cbor ()); err != nil {
369+ return err
370+ }
371+ }
372+ case []lcommon.PlutusV1Script :
373+ for _ , script := range s {
374+ if err := createScriptRecords (script .Hash (), script .RawScriptBytes ()); err != nil {
375+ return err
376+ }
377+ }
378+ case []lcommon.PlutusV2Script :
379+ for _ , script := range s {
380+ if err := createScriptRecords (script .Hash (), script .RawScriptBytes ()); err != nil {
381+ return err
382+ }
383+ }
384+ case []lcommon.PlutusV3Script :
385+ for _ , script := range s {
386+ if err := createScriptRecords (script .Hash (), script .RawScriptBytes ()); err != nil {
387+ return err
388+ }
389+ }
388390 }
391+ return nil
389392 }
390393
391- // Add PlutusV2 Scripts
392- for _ , script := range ws .PlutusV2Scripts () {
393- scriptHash := script .Hash ()
394- scriptRecord := models.Script {
395- TransactionID : tmpTx .ID ,
396- Type : uint8 (lcommon .ScriptRefTypePlutusV2 ),
397- ScriptHash : scriptHash .Bytes (),
398- }
399- if result := txn .Create (& scriptRecord ); result .Error != nil {
400- return fmt .Errorf ("create plutus v2 script: %w" , result .Error )
401- }
402- // Also store the script content separately to avoid duplicates
403- scriptContent := models.ScriptContent {
404- Hash : scriptHash .Bytes (),
405- Type : uint8 (lcommon .ScriptRefTypePlutusV2 ),
406- Content : script .RawScriptBytes (),
407- CreatedSlot : point .Slot ,
408- }
409- if result := txn .Clauses (clause.OnConflict {
410- Columns : []clause.Column {{Name : "hash" }},
411- DoNothing : true ,
412- }).Create (& scriptContent ); result .Error != nil {
413- return fmt .Errorf ("create plutus v2 script content: %w" , result .Error )
414- }
394+ // Process all script types
395+ if err := processScripts (uint8 (lcommon .ScriptRefTypeNativeScript ), ws .NativeScripts ()); err != nil {
396+ return err
415397 }
416-
417- // Add PlutusV3 Scripts
418- for _ , script := range ws .PlutusV3Scripts () {
419- scriptHash := script .Hash ()
420- scriptRecord := models.Script {
421- TransactionID : tmpTx .ID ,
422- Type : uint8 (lcommon .ScriptRefTypePlutusV3 ),
423- ScriptHash : scriptHash .Bytes (),
424- }
425- if result := txn .Create (& scriptRecord ); result .Error != nil {
426- return fmt .Errorf ("create plutus v3 script: %w" , result .Error )
427- }
428- // Also store the script content separately to avoid duplicates
429- scriptContent := models.ScriptContent {
430- Hash : scriptHash .Bytes (),
431- Type : uint8 (lcommon .ScriptRefTypePlutusV3 ),
432- Content : script .RawScriptBytes (),
433- CreatedSlot : point .Slot ,
434- }
435- if result := txn .Clauses (clause.OnConflict {
436- Columns : []clause.Column {{Name : "hash" }},
437- DoNothing : true ,
438- }).Create (& scriptContent ); result .Error != nil {
439- return fmt .Errorf ("create plutus v3 script content: %w" , result .Error )
440- }
398+ if err := processScripts (uint8 (lcommon .ScriptRefTypePlutusV1 ), ws .PlutusV1Scripts ()); err != nil {
399+ return err
400+ }
401+ if err := processScripts (uint8 (lcommon .ScriptRefTypePlutusV2 ), ws .PlutusV2Scripts ()); err != nil {
402+ return err
403+ }
404+ if err := processScripts (uint8 (lcommon .ScriptRefTypePlutusV3 ), ws .PlutusV3Scripts ()); err != nil {
405+ return err
441406 }
442407
443408 // Add PlutusData (Datums)
0 commit comments