ethereum/: use publishTime instead of attestationTime for queries (#196)
commit-id:b3c87e4e
This commit is contained in:
parent
ec7dcf7817
commit
7b9d5b1c22
|
@ -201,7 +201,7 @@ contract Pyth is PythGetters, PythSetters, AbstractPyth {
|
|||
// 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
|
||||
// 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;
|
||||
}
|
||||
|
||||
|
|
|
@ -130,8 +130,8 @@ contract("Pyth", function () {
|
|||
);
|
||||
});
|
||||
|
||||
// NOTE(2022-04-11): Raw hex payload obtained from format serialization unit tests in `p2w-sdk/rust`
|
||||
// Latest known addition: num_publishers, max_num_publishers
|
||||
// NOTE(2022-05-02): Raw hex payload obtained from format serialization unit tests in `p2w-sdk/rust`
|
||||
// Latest known addition: wire format v3
|
||||
//
|
||||
// Tests rely on a p2w-sdk mock price/prod ID generation rule:
|
||||
// nthProdByte(n) = n % 256, starting with n=1
|
||||
|
@ -144,13 +144,14 @@ contract("Pyth", function () {
|
|||
// 2nd price = "0xFDFDFD[...]"
|
||||
// 3rd prod = "0x030303[...]"
|
||||
// 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_PRICE_ATTESTATION_SIZE = 149;
|
||||
const RAW_BATCH_ATTESTATION_COUNT = 10;
|
||||
const rawBatchPriceAttestation =
|
||||
const RAW_BATCH =
|
||||
"0x" +
|
||||
"5032574800030000000102000A00950101010101010101010101010101010101010101010101010101010101010101FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE0000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DEADBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0202020202020202020202020202020202020202020202020202020202020202FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD0000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DEADBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0303030303030303030303030303030303030303030303030303030303030303FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC0000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DEADBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0404040404040404040404040404040404040404040404040404040404040404FBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFB0000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DEADBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0505050505050505050505050505050505050505050505050505050505050505FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA0000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DEADBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0606060606060606060606060606060606060606060606060606060606060606F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F90000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DEADBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0707070707070707070707070707070707070707070707070707070707070707F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F80000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DEADBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0808080808080808080808080808080808080808080808080808080808080808F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F70000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DEADBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0909090909090909090909090909090909090909090909090909090909090909F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F60000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DEADBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0AF5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F50000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DEADBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF";
|
||||
"5032574800030000000102000A00950101010101010101010101010101010101010101010101010101010101010101FEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFEFE0000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DADEBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0202020202020202020202020202020202020202020202020202020202020202FDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFDFD0000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DADEBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0303030303030303030303030303030303030303030303030303030303030303FCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFCFC0000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DADEBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0404040404040404040404040404040404040404040404040404040404040404FBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFBFB0000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DADEBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0505050505050505050505050505050505050505050505050505050505050505FAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFAFA0000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DADEBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0606060606060606060606060606060606060606060606060606060606060606F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F90000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DADEBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0707070707070707070707070707070707070707070707070707070707070707F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F80000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DADEBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0808080808080808080808080808080808080808080808080808080808080808F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F7F70000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DADEBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0909090909090909090909090909090909090909090909090909090909090909F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F6F60000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DADEBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0AF5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F5F50000002BAD2FEED70000000000000065FFFFFFFDFFFFFFFFFFFFFFD6000000000000002A010001E14C0004E6D0DEADBEEFFADEDEED00000000DADEBEEF00000000DEADBABE0000DEADFACEBEEF000000BADBADBEEF";
|
||||
|
||||
// Takes an unsigned 64-bit integer, converts it to hex with 0-padding
|
||||
function u64ToHex(timestamp) {
|
||||
|
@ -158,11 +159,13 @@ contract("Pyth", function () {
|
|||
return timestamp.toString(16).padStart(16, "0");
|
||||
}
|
||||
|
||||
function generateRawBatchAttestation(timestamp, priceVal) {
|
||||
const ts = u64ToHex(timestamp);
|
||||
function generateRawBatchAttestation(publishTime, attestationTime, priceVal) {
|
||||
const pubTs = u64ToHex(publishTime);
|
||||
const attTs = u64ToHex(attestationTime);
|
||||
const price = u64ToHex(priceVal);
|
||||
const replaced = rawBatchPriceAttestation
|
||||
.replace(RAW_BATCH_TIMESTAMP_REGEX, ts)
|
||||
const replaced = RAW_BATCH
|
||||
.replace(RAW_BATCH_PUBLISH_TIME_REGEX, pubTs)
|
||||
.replace(RAW_BATCH_ATTESTATION_TIME_REGEX, attTs)
|
||||
.replace(RAW_BATCH_PRICE_REGEX, price);
|
||||
return replaced;
|
||||
}
|
||||
|
@ -172,9 +175,10 @@ contract("Pyth", function () {
|
|||
const versionMajor = 3;
|
||||
const versionMinor = 0;
|
||||
|
||||
let attestationTime = 1647273460;
|
||||
let attestationTime = 1647273460; // re-used for publishTime
|
||||
let publishTime = 1647273465; // re-used for publishTime
|
||||
let priceVal = 1337;
|
||||
let rawBatch = generateRawBatchAttestation(attestationTime, priceVal);
|
||||
let rawBatch = generateRawBatchAttestation(publishTime, attestationTime, priceVal);
|
||||
let parsed = await this.pythProxy.parseBatchPriceAttestation(rawBatch);
|
||||
|
||||
// Check the header
|
||||
|
@ -209,7 +213,7 @@ contract("Pyth", function () {
|
|||
parsed.attestations[i].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].prevPrice, 0xdeadfacebeef);
|
||||
assert.equal(parsed.attestations[i].prevConf, 0xbadbadbeef);
|
||||
|
@ -236,14 +240,15 @@ contract("Pyth", 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);
|
||||
});
|
||||
|
||||
it("should cache price updates", async function () {
|
||||
let currentTimestamp = (await web3.eth.getBlock("latest")).timestamp;
|
||||
let priceVal = 521;
|
||||
let rawBatch = generateRawBatchAttestation(currentTimestamp, priceVal);
|
||||
let rawBatch = generateRawBatchAttestation(currentTimestamp - 5, currentTimestamp, priceVal);
|
||||
await attest(this.pythProxy, rawBatch);
|
||||
|
||||
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
|
||||
let nextTimestamp = currentTimestamp + 1;
|
||||
let rawBatch2 = generateRawBatchAttestation(
|
||||
nextTimestamp - 5,
|
||||
nextTimestamp,
|
||||
priceVal + 5
|
||||
);
|
||||
|
@ -275,6 +281,7 @@ contract("Pyth", function () {
|
|||
|
||||
// Confirm that only strictly larger timestamps trigger updates
|
||||
let rawBatch3 = generateRawBatchAttestation(
|
||||
nextTimestamp - 5,
|
||||
nextTimestamp,
|
||||
priceVal + 10
|
||||
);
|
||||
|
@ -300,7 +307,7 @@ contract("Pyth", function () {
|
|||
|
||||
it("should show stale cached prices as unknown", async function () {
|
||||
let smallestTimestamp = 1;
|
||||
let rawBatch = generateRawBatchAttestation(smallestTimestamp, 1337);
|
||||
let rawBatch = generateRawBatchAttestation(smallestTimestamp, smallestTimestamp + 5, 1337);
|
||||
await attest(this.pythProxy, rawBatch);
|
||||
|
||||
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 () {
|
||||
let largestTimestamp = 4294967295;
|
||||
let rawBatch = generateRawBatchAttestation(largestTimestamp, 1337);
|
||||
let rawBatch = generateRawBatchAttestation(largestTimestamp - 5, largestTimestamp, 1337);
|
||||
await attest(this.pythProxy, rawBatch);
|
||||
|
||||
for (var i = 1; i <= RAW_BATCH_ATTESTATION_COUNT; i++) {
|
||||
|
|
|
@ -490,7 +490,7 @@ mod tests {
|
|||
num_publishers: 123212u32,
|
||||
max_num_publishers: 321232u32,
|
||||
attestation_time: (0xdeadbeeffadedeedu64) as i64,
|
||||
publish_time: 0xdeadbeefi64,
|
||||
publish_time: 0xdadebeefi64,
|
||||
prev_publish_time: 0xdeadbabei64,
|
||||
prev_price: 0xdeadfacebeefi64,
|
||||
prev_conf: 0xbadbadbeefu64, // I could do this all day -SD
|
||||
|
|
Loading…
Reference in New Issue