@@ -1663,35 +1663,41 @@ func (l *signatureTreeSapientLeaf) reduceImageHash() (core.ImageHash, error) {
16631663func (l * signatureTreeSapientLeaf ) write (writer io.Writer ) error {
16641664 sigLen := uint64 (len (l .Signature ))
16651665 sizeSize := minBytesFor (sigLen )
1666+ if sizeSize == 0 {
1667+ // Ensure at least 1 byte for the length, even if 0
1668+ sizeSize = 1
1669+ }
16661670 if sizeSize > 3 {
16671671 return fmt .Errorf ("signature length %d requires %d bytes, exceeds maximum of 3" , sigLen , sizeSize )
16681672 }
16691673
1670- var firstByte byte
1671- if l .Weight <= 3 && l .Weight > 0 {
1672- firstByte = FLAG_SIGNATURE_SAPIENT << 4 | (byte (sizeSize ) << 2 ) | l .Weight
1673- _ , err := writer .Write ([]byte {firstByte })
1674- if err != nil {
1675- return fmt .Errorf ("unable to write Sapient leaf type: %w" , err )
1676- }
1674+ var firstByte byte = FLAG_SIGNATURE_SAPIENT << 4 | (byte (sizeSize ) << 2 )
1675+ var weightBytes []byte
1676+
1677+ if l .Weight >= 1 && l .Weight <= 3 {
1678+ firstByte |= l .Weight
16771679 } else {
1678- firstByte = FLAG_SIGNATURE_SAPIENT << 4 | (byte (sizeSize ) << 2 )
1679- _ , err := writer .Write ([]byte {firstByte })
1680- if err != nil {
1681- return fmt .Errorf ("unable to write Sapient leaf type: %w" , err )
1682- }
1683- _ , err = writer .Write ([]byte {l .Weight })
1680+ weightBytes = []byte {l .Weight }
1681+ }
1682+
1683+ _ , err := writer .Write ([]byte {firstByte })
1684+ if err != nil {
1685+ return fmt .Errorf ("unable to write Sapient leaf type: %w" , err )
1686+ }
1687+
1688+ if len (weightBytes ) > 0 {
1689+ _ , err = writer .Write (weightBytes )
16841690 if err != nil {
16851691 return fmt .Errorf ("unable to write dynamic weight: %w" , err )
16861692 }
16871693 }
16881694
1689- _ , err : = writer .Write (l .Address .Bytes ())
1695+ _ , err = writer .Write (l .Address .Bytes ())
16901696 if err != nil {
16911697 return fmt .Errorf ("unable to write address: %w" , err )
16921698 }
16931699
1694- err = writeUintX (writer , uint64 ( len ( l . Signature )) , sizeSize )
1700+ err = writeUintX (writer , sigLen , sizeSize )
16951701 if err != nil {
16961702 return fmt .Errorf ("unable to write signature length: %w" , err )
16971703 }
@@ -1794,35 +1800,41 @@ func (l *signatureTreeSapientCompactLeaf) reduceImageHash() (core.ImageHash, err
17941800func (l * signatureTreeSapientCompactLeaf ) write (writer io.Writer ) error {
17951801 sigLen := uint64 (len (l .Signature ))
17961802 sizeSize := minBytesFor (sigLen )
1803+ if sizeSize == 0 {
1804+ // Ensure at least 1 byte for the length, even if 0
1805+ sizeSize = 1
1806+ }
17971807 if sizeSize > 3 {
17981808 return fmt .Errorf ("signature length %d requires %d bytes, exceeds maximum of 3" , sigLen , sizeSize )
17991809 }
18001810
1801- var firstByte byte
1802- if l .Weight <= 3 && l .Weight > 0 {
1803- firstByte = FLAG_SIGNATURE_SAPIENT << 4 | (byte (sizeSize ) << 2 ) | l .Weight
1804- _ , err := writer .Write ([]byte {firstByte })
1805- if err != nil {
1806- return fmt .Errorf ("unable to write Sapient leaf type: %w" , err )
1807- }
1811+ var firstByte byte = FLAG_SIGNATURE_SAPIENT_COMPACT << 4 | (byte (sizeSize ) << 2 )
1812+ var weightBytes []byte
1813+
1814+ if l .Weight >= 1 && l .Weight <= 3 {
1815+ firstByte |= l .Weight
18081816 } else {
1809- firstByte = FLAG_SIGNATURE_SAPIENT << 4 | (byte (sizeSize ) << 2 )
1810- _ , err := writer .Write ([]byte {firstByte })
1811- if err != nil {
1812- return fmt .Errorf ("unable to write Sapient leaf type: %w" , err )
1813- }
1814- _ , err = writer .Write ([]byte {l .Weight })
1817+ weightBytes = []byte {l .Weight }
1818+ }
1819+
1820+ _ , err := writer .Write ([]byte {firstByte })
1821+ if err != nil {
1822+ return fmt .Errorf ("unable to write SapientCompact leaf type: %w" , err )
1823+ }
1824+
1825+ if len (weightBytes ) > 0 {
1826+ _ , err = writer .Write (weightBytes )
18151827 if err != nil {
18161828 return fmt .Errorf ("unable to write dynamic weight: %w" , err )
18171829 }
18181830 }
18191831
1820- _ , err : = writer .Write (l .Address .Bytes ())
1832+ _ , err = writer .Write (l .Address .Bytes ())
18211833 if err != nil {
18221834 return fmt .Errorf ("unable to write address: %w" , err )
18231835 }
18241836
1825- err = writeUintX (writer , uint64 ( len ( l . Signature )) , sizeSize )
1837+ err = writeUintX (writer , sigLen , sizeSize )
18261838 if err != nil {
18271839 return fmt .Errorf ("unable to write signature length: %w" , err )
18281840 }
@@ -2528,10 +2540,21 @@ func (l *WalletConfigTreeSapientSignerLeaf) unverifiedWeight(signers map[common.
25282540
25292541func (l * WalletConfigTreeSapientSignerLeaf ) buildSignatureTree (signerSignatures map [common.Address ]signerSignature ) signatureTree {
25302542 if signature , ok := signerSignatures [l .Address ]; ok {
2531- return & signatureTreeSapientLeaf {
2532- Weight : l .Weight ,
2533- Address : l .Address ,
2534- Signature : signature .signature ,
2543+ switch signature .type_ {
2544+ case core .SignerSignatureTypeSapient :
2545+ return & signatureTreeSapientLeaf {
2546+ Weight : l .Weight ,
2547+ Address : l .Address ,
2548+ Signature : signature .signature ,
2549+ }
2550+ case core .SignerSignatureTypeSapientCompact :
2551+ return & signatureTreeSapientCompactLeaf {
2552+ Weight : l .Weight ,
2553+ Address : l .Address ,
2554+ Signature : signature .signature ,
2555+ }
2556+ default :
2557+ panic (fmt .Sprintf ("unexpected signature type for sapient signer: %v" , signature .type_ ))
25352558 }
25362559 }
25372560 hashedImage := l .ImageHash ()
0 commit comments