Skip to content

Commit 9b880d0

Browse files
committed
Add test for verifier
1 parent 1b759ce commit 9b880d0

File tree

3 files changed

+101
-10
lines changed

3 files changed

+101
-10
lines changed

target_chains/ethereum/contracts/forge-test/Pyth.WormholeMerkleAccumulator.t.sol

Lines changed: 76 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,8 @@ contract PythWormholeMerkleAccumulatorTest is Test, PythTestUtils {
139139
}
140140

141141
function createWormholeMerkleUpdateData(
142-
PriceFeedMessage[] memory priceFeedMessages
142+
PriceFeedMessage[] memory priceFeedMessages,
143+
Signer signer
143144
) internal returns (bytes[] memory updateData, uint updateFee) {
144145
updateData = new bytes[](1);
145146

@@ -150,11 +151,29 @@ contract PythWormholeMerkleAccumulatorTest is Test, PythTestUtils {
150151

151152
depth += getRandUint8() % 3;
152153

153-
updateData[0] = generateWhMerkleUpdate(priceFeedMessages, depth, 1);
154+
uint8 numSigners = 1;
155+
if (signer == Signer.Wormhole)
156+
numSigners = _wormholeTestUtils.getTotalSigners();
157+
if (signer == Signer.Verifier)
158+
numSigners = _verifierTestUtils.getTotalSigners();
159+
160+
updateData[0] = generateWhMerkleUpdate(
161+
priceFeedMessages,
162+
depth,
163+
numSigners,
164+
signer
165+
);
154166

155167
updateFee = pyth.getUpdateFee(updateData);
156168
}
157169

170+
function createWormholeMerkleUpdateData(
171+
PriceFeedMessage[] memory priceFeedMessages
172+
) internal returns (bytes[] memory updateData, uint updateFee) {
173+
return
174+
createWormholeMerkleUpdateData(priceFeedMessages, Signer.Wormhole);
175+
}
176+
158177
/// @notice This method creates a forward compatible wormhole update data by using a newer minor version,
159178
/// setting a trailing header size and generating additional trailing header data of size `trailingHeaderSize`
160179
function createFowardCompatibleWormholeMerkleUpdateData(
@@ -1145,4 +1164,59 @@ contract PythWormholeMerkleAccumulatorTest is Test, PythTestUtils {
11451164
assertPriceFeedMessageStored(priceFeedMessages[i]);
11461165
}
11471166
}
1167+
1168+
/// Testing update price feeds method using wormhole merkle update type.
1169+
function testUpdatePriceFeedWithWormholeMerkleAndVerifierSignerWorks(
1170+
uint seed
1171+
) public {
1172+
setRandSeed(seed);
1173+
setVerifier(address(pyth), 10);
1174+
1175+
uint numPriceFeeds = (getRandUint() % 10) + 1;
1176+
PriceFeedMessage[]
1177+
memory priceFeedMessages = generateRandomPriceFeedMessage(
1178+
numPriceFeeds
1179+
);
1180+
(
1181+
bytes[] memory updateData,
1182+
uint updateFee
1183+
) = createWormholeMerkleUpdateData(priceFeedMessages, Signer.Verifier);
1184+
1185+
pyth.updatePriceFeeds{value: updateFee}(updateData);
1186+
1187+
for (uint i = 0; i < numPriceFeeds; i++) {
1188+
assertPriceFeedMessageStored(priceFeedMessages[i]);
1189+
}
1190+
1191+
// Update the prices again with the same data should work
1192+
pyth.updatePriceFeeds{value: updateFee}(updateData);
1193+
1194+
for (uint i = 0; i < numPriceFeeds; i++) {
1195+
assertPriceFeedMessageStored(priceFeedMessages[i]);
1196+
}
1197+
1198+
// Update the prices again with updated data should update the prices
1199+
for (uint i = 0; i < numPriceFeeds; i++) {
1200+
priceFeedMessages[i].price = getRandInt64();
1201+
priceFeedMessages[i].conf = getRandUint64();
1202+
priceFeedMessages[i].expo = getRandInt32();
1203+
1204+
// Increase the publish time if it is not causing an overflow
1205+
if (priceFeedMessages[i].publishTime != type(uint64).max) {
1206+
priceFeedMessages[i].publishTime += 1;
1207+
}
1208+
priceFeedMessages[i].emaPrice = getRandInt64();
1209+
priceFeedMessages[i].emaConf = getRandUint64();
1210+
}
1211+
1212+
(updateData, updateFee) = createWormholeMerkleUpdateData(
1213+
priceFeedMessages
1214+
);
1215+
1216+
pyth.updatePriceFeeds{value: updateFee}(updateData);
1217+
1218+
for (uint i = 0; i < numPriceFeeds; i++) {
1219+
assertPriceFeedMessageStored(priceFeedMessages[i]);
1220+
}
1221+
}
11481222
}

target_chains/ethereum/contracts/forge-test/Pyth.t.sol

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,8 @@ contract PythTest is Test, PythTestUtils {
134134

135135
updateData[i / batchSize] = generateWhMerkleUpdateWithSource(
136136
batchMessages,
137-
config
137+
config,
138+
Signer.Wormhole
138139
);
139140
}
140141

target_chains/ethereum/contracts/forge-test/utils/PythTestUtils.t.sol

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import "@pythnetwork/pyth-sdk-solidity/IPyth.sol";
1717
import "@pythnetwork/pyth-sdk-solidity/PythUtils.sol";
1818

1919
import "forge-std/Test.sol";
20-
import "forge-std/console.sol";
2120
import "./RandTestUtils.t.sol";
2221
import "./WormholeTestUtils.t.sol";
2322

@@ -213,7 +212,8 @@ abstract contract PythTestUtils is
213212

214213
function generateWhMerkleUpdateWithSource(
215214
PriceFeedMessage[] memory priceFeedMessages,
216-
MerkleUpdateConfig memory config
215+
MerkleUpdateConfig memory config,
216+
Signer signer
217217
) internal returns (bytes memory whMerkleUpdateData) {
218218
bytes[] memory encodedPriceFeedMessages = encodePriceFeedMessages(
219219
priceFeedMessages
@@ -237,7 +237,7 @@ abstract contract PythTestUtils is
237237
0,
238238
wormholePayload,
239239
config.numSigners,
240-
Signer.Wormhole
240+
signer
241241
);
242242

243243
if (config.brokenVaa) {
@@ -249,16 +249,17 @@ abstract contract PythTestUtils is
249249
);
250250
}
251251

252+
uint256 priceFeedMessageLength = priceFeedMessages.length;
252253
whMerkleUpdateData = abi.encodePacked(
253254
uint32(0x504e4155), // PythAccumulator.ACCUMULATOR_MAGIC
254255
uint8(1), // major version
255256
uint8(0), // minor version
256257
uint8(1), // trailing header size
257-
uint8(0), // Signer
258+
uint8(signer), // Signer
258259
uint8(PythAccumulator.UpdateType.WormholeMerkle),
259260
uint16(wormholeMerkleVaa.length),
260261
wormholeMerkleVaa,
261-
uint8(priceFeedMessages.length)
262+
uint8(priceFeedMessageLength)
262263
);
263264

264265
for (uint i = 0; i < priceFeedMessages.length; i++) {
@@ -334,7 +335,8 @@ abstract contract PythTestUtils is
334335
function generateWhMerkleUpdate(
335336
PriceFeedMessage[] memory priceFeedMessages,
336337
uint8 depth,
337-
uint8 numSigners
338+
uint8 numSigners,
339+
Signer signer
338340
) internal returns (bytes memory whMerkleUpdateData) {
339341
whMerkleUpdateData = generateWhMerkleUpdateWithSource(
340342
priceFeedMessages,
@@ -344,7 +346,21 @@ abstract contract PythTestUtils is
344346
SOURCE_EMITTER_CHAIN_ID,
345347
SOURCE_EMITTER_ADDRESS,
346348
false
347-
)
349+
),
350+
signer
351+
);
352+
}
353+
354+
function generateWhMerkleUpdate(
355+
PriceFeedMessage[] memory priceFeedMessages,
356+
uint8 depth,
357+
uint8 numSigners
358+
) internal returns (bytes memory whMerkleUpdateData) {
359+
whMerkleUpdateData = generateWhMerkleUpdate(
360+
priceFeedMessages,
361+
depth,
362+
numSigners,
363+
Signer.Wormhole
348364
);
349365
}
350366

0 commit comments

Comments
 (0)