@@ -33,26 +33,11 @@ export class EvmAddress implements Address {
33
33
34
34
this . address = getAddress ( address ) ;
35
35
} else if ( address instanceof Uint8Array ) {
36
- if ( address . length !== EvmAddress . byteSize )
37
- throw new Error (
38
- `Invalid EVM address, expected ${ EvmAddress . byteSize } bytes but got ${ address . length } ` ,
39
- ) ;
40
-
36
+ address = this . trimUniversalAddress ( address ) ;
41
37
this . address = getAddress ( encoding . hex . encode ( address ) ) ;
42
38
} else if ( UniversalAddress . instanceof ( address ) ) {
43
- // If its a universal address and we want it to be an ethereum address,
44
- // we need to chop off the first 12 bytes of padding
45
- const addressBytes = address . toUint8Array ( ) ;
46
- // double check to make sure there are no non zero bytes
47
- if (
48
- addressBytes . slice ( 0 , 12 ) . some ( ( v ) => {
49
- v !== 0 ;
50
- } )
51
- )
52
- throw new Error ( `Invalid EVM address ${ address } ` ) ;
53
-
54
- const suffix = encoding . hex . encode ( addressBytes . slice ( 12 ) ) ;
55
- this . address = getAddress ( suffix ) ;
39
+ const addressBytes = this . trimUniversalAddress ( address . toUint8Array ( ) ) ;
40
+ this . address = getAddress ( encoding . hex . encode ( addressBytes ) ) ;
56
41
} else throw new Error ( `Invalid EVM address ${ address } ` ) ;
57
42
}
58
43
@@ -71,6 +56,30 @@ export class EvmAddress implements Address {
71
56
toUniversalAddress ( ) {
72
57
return new UniversalAddress ( this . address , 'hex' ) ;
73
58
}
59
+
60
+ private trimUniversalAddress ( address : Uint8Array ) : Uint8Array {
61
+ if ( address . length === EvmAddress . byteSize ) return address ;
62
+
63
+ if ( address . length < EvmAddress . byteSize )
64
+ throw new Error (
65
+ `Invalid evm address, expected ${ EvmAddress . byteSize } bytes` ,
66
+ ) ;
67
+
68
+ if ( address . length !== UniversalAddress . byteSize )
69
+ throw new Error (
70
+ `Invalid universal address, expected ${ UniversalAddress . byteSize } bytes` ,
71
+ ) ;
72
+
73
+ // If the address is longer than 20 bytes, it is a universal address
74
+ // that has been padded with 12 bytes of zeros
75
+ if ( encoding . bignum . decode ( address . slice ( 0 , 12 ) ) !== 0n ) {
76
+ throw new Error (
77
+ `Invalid EVM address ${ address } expected first 12 bytes to be 0s` ,
78
+ ) ;
79
+ }
80
+
81
+ return address . slice ( 12 ) ;
82
+ }
74
83
static isValidAddress ( address : string ) {
75
84
return isAddress ( address ) ;
76
85
}
0 commit comments