@@ -739,3 +739,136 @@ func PublicKeyOptionDecoder(r io.Reader, val any, buf *[8]byte,
739739 val , "*fn.Option[btcec.PublicKey]" , l , l ,
740740 )
741741}
742+
743+ func FragmentVersionEncoder (w io.Writer , val any , buf * [8 ]byte ) error {
744+ if t , ok := val .(* SendFragmentVersion ); ok {
745+ return tlv .EUint8T (w , uint8 (* t ), buf )
746+ }
747+ return tlv .NewTypeForEncodingErr (val , "SendFragmentVersion" )
748+ }
749+
750+ func FragmentVersionDecoder (r io.Reader , val any , buf * [8 ]byte ,
751+ l uint64 ) error {
752+
753+ if typ , ok := val .(* SendFragmentVersion ); ok {
754+ var t uint8
755+ if err := tlv .DUint8 (r , & t , buf , l ); err != nil {
756+ return err
757+ }
758+ * typ = SendFragmentVersion (t )
759+ return nil
760+ }
761+ return tlv .NewTypeForDecodingErr (val , "SendFragmentVersion" , l , 1 )
762+ }
763+
764+ func SendOutputEncoder (w io.Writer , val any , buf * [8 ]byte ) error {
765+ if t , ok := val .(* SendOutput ); ok {
766+ err := tlv .EUint8T (w , uint8 (t .AssetVersion ), buf )
767+ if err != nil {
768+ return err
769+ }
770+ if err := tlv .EUint64T (w , t .Amount , buf ); err != nil {
771+ return err
772+ }
773+ err = tlv .EUint8T (w , uint8 (t .DerivationMethod ), buf )
774+ if err != nil {
775+ return err
776+ }
777+
778+ keyArr := ([btcec .PubKeyBytesLenCompressed ]byte )(t .ScriptKey )
779+ return tlv .EBytes33 (w , & keyArr , buf )
780+ }
781+ return tlv .NewTypeForEncodingErr (val , "*SendOutput" )
782+ }
783+
784+ func SendOutputDecoder (r io.Reader , val any , buf * [8 ]byte ) error {
785+ if typ , ok := val .(* SendOutput ); ok {
786+ var assetVersion uint8
787+ if err := tlv .DUint8 (r , & assetVersion , buf , 1 ); err != nil {
788+ return err
789+ }
790+ typ .AssetVersion = asset .Version (assetVersion )
791+
792+ if err := tlv .DUint64 (r , & typ .Amount , buf , 8 ); err != nil {
793+ return err
794+ }
795+
796+ var derivationMethod uint8
797+ if err := tlv .DUint8 (r , & derivationMethod , buf , 1 ); err != nil {
798+ return err
799+ }
800+ typ .DerivationMethod = asset .ScriptKeyDerivationMethod (
801+ derivationMethod ,
802+ )
803+
804+ keyArr := ([btcec .PubKeyBytesLenCompressed ]byte )(typ .ScriptKey )
805+ if err := tlv .DBytes33 (
806+ r , & keyArr , buf , btcec .PubKeyBytesLenCompressed ,
807+ ); err != nil {
808+ return err
809+ }
810+ typ .ScriptKey = keyArr
811+
812+ return nil
813+ }
814+ return tlv .NewTypeForEncodingErr (val , "*SendOutput" )
815+ }
816+
817+ func SendOutputsEncoder (w io.Writer , val any , buf * [8 ]byte ) error {
818+ if t , ok := val .(* map [asset.ID ]SendOutput ); ok {
819+ numOutputs := uint64 (len (* t ))
820+ if err := tlv .WriteVarInt (w , numOutputs , buf ); err != nil {
821+ return err
822+ }
823+
824+ for id , output := range * t {
825+ idArr := ([32 ]byte )(id )
826+ if err := tlv .EBytes32 (w , & idArr , buf ); err != nil {
827+ return err
828+ }
829+
830+ err := SendOutputEncoder (w , & output , buf )
831+ if err != nil {
832+ return err
833+ }
834+ }
835+ return nil
836+ }
837+ return tlv .NewTypeForEncodingErr (val , "map[asset.ID]SendOutput" )
838+ }
839+
840+ func SendOutputsDecoder (r io.Reader , val any , buf * [8 ]byte , l uint64 ) error {
841+ if typ , ok := val .(* map [asset.ID ]SendOutput ); ok {
842+ numOutputs , err := tlv .ReadVarInt (r , buf )
843+ if err != nil {
844+ return err
845+ }
846+
847+ // Avoid OOM by limiting the number of send outputs we accept.
848+ if numOutputs > MaxSendFragmentOutputs {
849+ return fmt .Errorf ("%w: too many send outputs" ,
850+ ErrProofInvalid )
851+ }
852+
853+ result := make (map [asset.ID ]SendOutput , numOutputs )
854+ for i := uint64 (0 ); i < numOutputs ; i ++ {
855+ var id [32 ]byte
856+ if err := tlv .DBytes32 (r , & id , buf , 32 ); err != nil {
857+ return err
858+ }
859+
860+ var output SendOutput
861+ err := SendOutputDecoder (r , & output , buf )
862+ if err != nil {
863+ return err
864+ }
865+
866+ result [id ] = output
867+ }
868+
869+ * typ = result
870+
871+ return nil
872+ }
873+ return tlv .NewTypeForEncodingErr (val , "map[asset.ID]SendOutput" )
874+ }
0 commit comments