ethereum/: use publishTime instead of attestationTime for queries (#196)

commit-id:b3c87e4e
This commit is contained in:
Stanisław Drozd 2022-05-04 21:29:35 +02:00 committed by GitHub
parent ec7dcf7817
commit 7b9d5b1c22
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 18 deletions

View File

@ -201,7 +201,7 @@ contract Pyth is PythGetters, PythSetters, AbstractPyth {
// Check that there is not a significant difference between this chain's time // Check that there is not a significant difference between this chain's time
// and the attestation time. This is a last-resort safety net, and this check // and the attestation time. This is a last-resort safety net, and this check
// will be iterated on in the future. // will be iterated on in the future.
if (diff(block.timestamp, info.attestationTime) > VALID_TIME_PERIOD_SECS) { if (diff(block.timestamp, info.publishTime) > VALID_TIME_PERIOD_SECS) {
info.priceFeed.status = PythStructs.PriceStatus.UNKNOWN; info.priceFeed.status = PythStructs.PriceStatus.UNKNOWN;
} }

View File

@ -130,8 +130,8 @@ contract("Pyth", function () {
); );
}); });
// NOTE(2022-04-11): Raw hex payload obtained from format serialization unit tests in `p2w-sdk/rust` // NOTE(2022-05-02): Raw hex payload obtained from format serialization unit tests in `p2w-sdk/rust`
// Latest known addition: num_publishers, max_num_publishers // Latest known addition: wire format v3
// //
// Tests rely on a p2w-sdk mock price/prod ID generation rule: // Tests rely on a p2w-sdk mock price/prod ID generation rule:
// nthProdByte(n) = n % 256, starting with n=1 // nthProdByte(n) = n % 256, starting with n=1
@ -144,13 +144,14 @@ contract("Pyth", function () {
// 2nd price = "0xFDFDFD[...]" // 2nd price = "0xFDFDFD[...]"
// 3rd prod = "0x030303[...]" // 3rd prod = "0x030303[...]"
// 3rd price = "0xFCFCFC[...]" // 3rd price = "0xFCFCFC[...]"
const RAW_BATCH_TIMESTAMP_REGEX = /DEADBEEFFADEDEED/g; const RAW_BATCH_ATTESTATION_TIME_REGEX = /DEADBEEFFADEDEED/g;
const RAW_BATCH_PUBLISH_TIME_REGEX = /00000000DADEBEEF/g;
const RAW_BATCH_PRICE_REGEX = /0000002BAD2FEED7/g; const RAW_BATCH_PRICE_REGEX = /0000002BAD2FEED7/g;
const RAW_PRICE_ATTESTATION_SIZE = 149; const RAW_PRICE_ATTESTATION_SIZE = 149;
const RAW_BATCH_ATTESTATION_COUNT = 10; const RAW_BATCH_ATTESTATION_COUNT = 10;
const rawBatchPriceAttestation = const RAW_BATCH =
"0x" + "0x" +
"5032574800030000000102000A00950101010101010101010101010101010101010101010101010101010101010101FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE0000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DEADBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0202020202020202020202020202020202020202020202020202020202020202FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD0000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DEADBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0303030303030303030303030303030303030303030303030303030303030303FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC0000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DEADBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0404040404040404040404040404040404040404040404040404040404040404FBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFB0000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DEADBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0505050505050505050505050505050505050505050505050505050505050505FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA0000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DEADBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0606060606060606060606060606060606060606060606060606060606060606F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F90000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DEADBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0707070707070707070707070707070707070707070707070707070707070707F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F80000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DEADBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0808080808080808080808080808080808080808080808080808080808080808F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F70000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DEADBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0909090909090909090909090909090909090909090909090909090909090909F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F60000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DEADBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0AF5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F50000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DEADBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF"; "5032574800030000000102000A00950101010101010101010101010101010101010101010101010101010101010101FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE0000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DADEBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0202020202020202020202020202020202020202020202020202020202020202FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD0000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DADEBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0303030303030303030303030303030303030303030303030303030303030303FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC0000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DADEBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0404040404040404040404040404040404040404040404040404040404040404FBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFB0000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DADEBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0505050505050505050505050505050505050505050505050505050505050505FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA0000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DADEBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0606060606060606060606060606060606060606060606060606060606060606F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F90000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DADEBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0707070707070707070707070707070707070707070707070707070707070707F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F80000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DADEBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0808080808080808080808080808080808080808080808080808080808080808F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F70000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DADEBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0909090909090909090909090909090909090909090909090909090909090909F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F60000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DADEBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0AF5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F50000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DADEBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF";
// Takes an unsigned 64-bit integer, converts it to hex with 0-padding // Takes an unsigned 64-bit integer, converts it to hex with 0-padding
function u64ToHex(timestamp) { function u64ToHex(timestamp) {
@ -158,11 +159,13 @@ contract("Pyth", function () {
return timestamp.toString(16).padStart(16, "0"); return timestamp.toString(16).padStart(16, "0");
} }
function generateRawBatchAttestation(timestamp, priceVal) { function generateRawBatchAttestation(publishTime, attestationTime, priceVal) {
const ts = u64ToHex(timestamp); const pubTs = u64ToHex(publishTime);
const attTs = u64ToHex(attestationTime);
const price = u64ToHex(priceVal); const price = u64ToHex(priceVal);
const replaced = rawBatchPriceAttestation const replaced = RAW_BATCH
.replace(RAW_BATCH_TIMESTAMP_REGEX, ts) .replace(RAW_BATCH_PUBLISH_TIME_REGEX, pubTs)
.replace(RAW_BATCH_ATTESTATION_TIME_REGEX, attTs)
.replace(RAW_BATCH_PRICE_REGEX, price); .replace(RAW_BATCH_PRICE_REGEX, price);
return replaced; return replaced;
} }
@ -172,9 +175,10 @@ contract("Pyth", function () {
const versionMajor = 3; const versionMajor = 3;
const versionMinor = 0; const versionMinor = 0;
let attestationTime = 1647273460; let attestationTime = 1647273460; // re-used for publishTime
let publishTime = 1647273465; // re-used for publishTime
let priceVal = 1337; let priceVal = 1337;
let rawBatch = generateRawBatchAttestation(attestationTime, priceVal); let rawBatch = generateRawBatchAttestation(publishTime, attestationTime, priceVal);
let parsed = await this.pythProxy.parseBatchPriceAttestation(rawBatch); let parsed = await this.pythProxy.parseBatchPriceAttestation(rawBatch);
// Check the header // Check the header
@ -209,7 +213,7 @@ contract("Pyth", function () {
parsed.attestations[i].attestationTime, parsed.attestations[i].attestationTime,
attestationTime attestationTime
); );
assert.equal(parsed.attestations[i].publishTime, 0xdeadbeef); assert.equal(parsed.attestations[i].publishTime, publishTime);
assert.equal(parsed.attestations[i].prevPublishTime, 0xdeadbabe); assert.equal(parsed.attestations[i].prevPublishTime, 0xdeadbabe);
assert.equal(parsed.attestations[i].prevPrice, 0xdeadfacebeef); assert.equal(parsed.attestations[i].prevPrice, 0xdeadfacebeef);
assert.equal(parsed.attestations[i].prevConf, 0xbadbadbeef); assert.equal(parsed.attestations[i].prevConf, 0xbadbadbeef);
@ -236,14 +240,15 @@ contract("Pyth", function () {
} }
it("should attest price updates over wormhole", async function () { it("should attest price updates over wormhole", async function () {
let rawBatch = generateRawBatchAttestation(1647273460, 1337); let ts = 1647273460
let rawBatch = generateRawBatchAttestation(ts - 5, ts, 1337);
await attest(this.pythProxy, rawBatch); await attest(this.pythProxy, rawBatch);
}); });
it("should cache price updates", async function () { it("should cache price updates", async function () {
let currentTimestamp = (await web3.eth.getBlock("latest")).timestamp; let currentTimestamp = (await web3.eth.getBlock("latest")).timestamp;
let priceVal = 521; let priceVal = 521;
let rawBatch = generateRawBatchAttestation(currentTimestamp, priceVal); let rawBatch = generateRawBatchAttestation(currentTimestamp - 5, currentTimestamp, priceVal);
await attest(this.pythProxy, rawBatch); await attest(this.pythProxy, rawBatch);
let first_prod_id = "0x" + "01".repeat(32); let first_prod_id = "0x" + "01".repeat(32);
@ -262,6 +267,7 @@ contract("Pyth", function () {
// Confirm the price is bumped after a new attestation updates each record // Confirm the price is bumped after a new attestation updates each record
let nextTimestamp = currentTimestamp + 1; let nextTimestamp = currentTimestamp + 1;
let rawBatch2 = generateRawBatchAttestation( let rawBatch2 = generateRawBatchAttestation(
nextTimestamp - 5,
nextTimestamp, nextTimestamp,
priceVal + 5 priceVal + 5
); );
@ -275,6 +281,7 @@ contract("Pyth", function () {
// Confirm that only strictly larger timestamps trigger updates // Confirm that only strictly larger timestamps trigger updates
let rawBatch3 = generateRawBatchAttestation( let rawBatch3 = generateRawBatchAttestation(
nextTimestamp - 5,
nextTimestamp, nextTimestamp,
priceVal + 10 priceVal + 10
); );
@ -300,7 +307,7 @@ contract("Pyth", function () {
it("should show stale cached prices as unknown", async function () { it("should show stale cached prices as unknown", async function () {
let smallestTimestamp = 1; let smallestTimestamp = 1;
let rawBatch = generateRawBatchAttestation(smallestTimestamp, 1337); let rawBatch = generateRawBatchAttestation(smallestTimestamp, smallestTimestamp + 5, 1337);
await attest(this.pythProxy, rawBatch); await attest(this.pythProxy, rawBatch);
for (var i = 1; i <= RAW_BATCH_ATTESTATION_COUNT; i++) { for (var i = 1; i <= RAW_BATCH_ATTESTATION_COUNT; i++) {
@ -317,7 +324,7 @@ contract("Pyth", function () {
it("should show cached prices too far into the future as unknown", async function () { it("should show cached prices too far into the future as unknown", async function () {
let largestTimestamp = 4294967295; let largestTimestamp = 4294967295;
let rawBatch = generateRawBatchAttestation(largestTimestamp, 1337); let rawBatch = generateRawBatchAttestation(largestTimestamp - 5, largestTimestamp, 1337);
await attest(this.pythProxy, rawBatch); await attest(this.pythProxy, rawBatch);
for (var i = 1; i <= RAW_BATCH_ATTESTATION_COUNT; i++) { for (var i = 1; i <= RAW_BATCH_ATTESTATION_COUNT; i++) {

View File

@ -490,7 +490,7 @@ mod tests {
num_publishers: 123212u32, num_publishers: 123212u32,
max_num_publishers: 321232u32, max_num_publishers: 321232u32,
attestation_time: (0xdeadbeeffadedeedu64) as i64, attestation_time: (0xdeadbeeffadedeedu64) as i64,
publish_time: 0xdeadbeefi64, publish_time: 0xdadebeefi64,
prev_publish_time: 0xdeadbabei64, prev_publish_time: 0xdeadbabei64,
prev_price: 0xdeadfacebeefi64, prev_price: 0xdeadfacebeefi64,
prev_conf: 0xbadbadbeefu64, // I could do this all day -SD prev_conf: 0xbadbadbeefu64, // I could do this all day -SD