@@ -1126,39 +1126,43 @@ func (l *signatureTreeSignatureERC1271Leaf) reduceImageHash() (core.ImageHash, e
11261126
11271127func (l * signatureTreeSignatureERC1271Leaf ) write (writer io.Writer ) error {
11281128 sigLen := uint64 (len (l .Signature ))
1129+
11291130 sizeSize := minBytesFor (sigLen )
1131+ if sizeSize == 0 {
1132+ // Ensure at least 1 byte for the length, even if 0
1133+ sizeSize = 1
1134+ }
11301135 if sizeSize > 3 {
11311136 return fmt .Errorf ("signature length %d requires %d bytes, exceeds maximum of 3" , sigLen , sizeSize )
11321137 }
11331138
1134- weightSize := minWeightBytes (uint64 (l .Weight ))
1135- var firstByte byte
1136- if weightSize == 0 && l .Weight <= 3 {
1137- firstByte = FLAG_SIGNATURE_ERC1271 << 4 | (byte (sizeSize ) << 2 ) | l .Weight
1138- _ , err := writer .Write ([]byte {firstByte })
1139- if err != nil {
1140- return fmt .Errorf ("unable to write ERC-1271 leaf type: %w" , err )
1141- }
1142- } else if weightSize <= 1 {
1143- firstByte = FLAG_SIGNATURE_ERC1271 << 4 | (byte (sizeSize ) << 2 )
1144- _ , err := writer .Write ([]byte {firstByte })
1145- if err != nil {
1146- return fmt .Errorf ("unable to write ERC-1271 leaf type: %w" , err )
1147- }
1148- _ , err = writer .Write ([]byte {l .Weight })
1139+ var firstByte byte = FLAG_SIGNATURE_ERC1271 << 4 | (byte (sizeSize ) << 2 )
1140+ var weightBytes []byte
1141+
1142+ if l .Weight >= 1 && l .Weight <= 3 {
1143+ firstByte |= l .Weight
1144+ } else {
1145+ weightBytes = []byte {l .Weight }
1146+ }
1147+
1148+ _ , err := writer .Write ([]byte {firstByte })
1149+ if err != nil {
1150+ return fmt .Errorf ("unable to write ERC-1271 leaf type: %w" , err )
1151+ }
1152+
1153+ if len (weightBytes ) > 0 {
1154+ _ , err = writer .Write (weightBytes )
11491155 if err != nil {
11501156 return fmt .Errorf ("unable to write dynamic weight: %w" , err )
11511157 }
1152- } else {
1153- return fmt .Errorf ("weight %d requires %d bytes, exceeds maximum of 1" , l .Weight , weightSize )
11541158 }
11551159
1156- _ , err : = writer .Write (l .Address .Bytes ())
1160+ _ , err = writer .Write (l .Address .Bytes ())
11571161 if err != nil {
11581162 return fmt .Errorf ("unable to write address: %w" , err )
11591163 }
11601164
1161- err = writeUintX (writer , uint64 ( len ( l . Signature )) , sizeSize )
1165+ err = writeUintX (writer , sigLen , sizeSize )
11621166 if err != nil {
11631167 return fmt .Errorf ("unable to write signature length: %w" , err )
11641168 }
@@ -2661,6 +2665,13 @@ func readUintX(size uint8, data *[]byte) (uint64, error) {
26612665}
26622666
26632667func writeUintX (writer io.Writer , value uint64 , size byte ) error {
2668+ if size == 0 {
2669+ _ , err := writer .Write ([]byte {0 })
2670+ if err != nil {
2671+ return fmt .Errorf ("unable to write uint0: %w" , err )
2672+ }
2673+ return nil
2674+ }
26642675 buf := make ([]byte , size )
26652676 for i := int (size ) - 1 ; i >= 0 ; i -- {
26662677 buf [i ] = byte (value & 0xff )
0 commit comments