Skip to content

Commit 766e7bc

Browse files
authored
Reject interoperable addresses whith both chain reference and addresses empty (#6331)
1 parent 9e6fa29 commit 766e7bc

File tree

3 files changed

+18
-7
lines changed

3 files changed

+18
-7
lines changed

.changeset/smooth-cows-notice.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'openzeppelin-solidity': minor
3+
---
4+
5+
`InteroperableAddress`: reject inputs with both chain reference and addresses empty.

contracts/utils/draft-InteroperableAddress.sol

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,10 @@ library InteroperableAddress {
9696
bytes memory self
9797
) internal pure returns (bool success, bytes2 chainType, bytes memory chainReference, bytes memory addr) {
9898
unchecked {
99-
success = true;
10099
if (self.length < 0x06) return (false, 0x0000, _emptyBytesMemory(), _emptyBytesMemory());
101100

102101
bytes2 version = _readBytes2(self, 0x00);
103102
if (version != bytes2(0x0001)) return (false, 0x0000, _emptyBytesMemory(), _emptyBytesMemory());
104-
chainType = _readBytes2(self, 0x02);
105103

106104
uint8 chainReferenceLength = uint8(self[0x04]);
107105
if (self.length < 0x06 + chainReferenceLength)
@@ -112,6 +110,10 @@ library InteroperableAddress {
112110
if (self.length < 0x06 + chainReferenceLength + addrLength)
113111
return (false, 0x0000, _emptyBytesMemory(), _emptyBytesMemory());
114112
addr = self.slice(0x06 + chainReferenceLength, 0x06 + chainReferenceLength + addrLength);
113+
114+
// At least one of chainReference or addr must be non-empty
115+
success = (chainReferenceLength > 0) || (addrLength > 0);
116+
chainType = success ? _readBytes2(self, 0x02) : bytes2(0);
115117
}
116118
}
117119

@@ -122,12 +124,10 @@ library InteroperableAddress {
122124
bytes calldata self
123125
) internal pure returns (bool success, bytes2 chainType, bytes calldata chainReference, bytes calldata addr) {
124126
unchecked {
125-
success = true;
126127
if (self.length < 0x06) return (false, 0x0000, Calldata.emptyBytes(), Calldata.emptyBytes());
127128

128129
bytes2 version = _readBytes2Calldata(self, 0x00);
129130
if (version != bytes2(0x0001)) return (false, 0x0000, Calldata.emptyBytes(), Calldata.emptyBytes());
130-
chainType = _readBytes2Calldata(self, 0x02);
131131

132132
uint8 chainReferenceLength = uint8(self[0x04]);
133133
if (self.length < 0x06 + chainReferenceLength)
@@ -138,6 +138,10 @@ library InteroperableAddress {
138138
if (self.length < 0x06 + chainReferenceLength + addrLength)
139139
return (false, 0x0000, Calldata.emptyBytes(), Calldata.emptyBytes());
140140
addr = self[0x06 + chainReferenceLength:0x06 + chainReferenceLength + addrLength];
141+
142+
// At least one of chainReference or addr must be non-empty
143+
success = (chainReferenceLength > 0) || (addrLength > 0);
144+
chainType = success ? _readBytes2Calldata(self, 0x02) : bytes2(0);
141145
}
142146
}
143147

test/utils/draft-InteroperableAddress.test.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,11 +116,13 @@ describe('ERC7390', function () {
116116
// version 2 + some data
117117
'unsupported version': '0x00020000010100',
118118
// version + ref: missing chainReferenceLength and addressLength
119-
'too short (case 1)': '0x00010000',
119+
'too short (case 1)': '0x00010042',
120120
// version + ref + chainReference: missing addressLength
121-
'too short (case 2)': '0x000100000101',
121+
'too short (case 2)': '0x000100420101',
122122
// version + ref + chainReference + addressLength + part of the address: missing 2 bytes of the address
123-
'too short (case 3)': '0x00010000010114d8da6bf26964af9d7eed9e03e53415d37aa9',
123+
'too short (case 3)': '0x00010042010114d8da6bf26964af9d7eed9e03e53415d37aa9',
124+
// empty chain reference and address
125+
'empty chain reference and address': '0x000100420000',
124126
})) {
125127
it(title, async function () {
126128
await expect(this.mock.$parseV1(binary))

0 commit comments

Comments
 (0)