From 1ceed177ecf63c7be67cfe389b2b2cc38f41a315 Mon Sep 17 00:00:00 2001 From: Darun Seethammagari Date: Thu, 12 Dec 2024 14:11:16 -0800 Subject: [PATCH 1/5] Add fee but still failing --- lazer/evm/lib/forge-std | 2 +- lazer/evm/lib/openzeppelin-contracts-upgradeable | 2 +- lazer/evm/lib/pyth-crosschain | 2 +- lazer/evm/src/ExampleReceiver.sol | 8 ++++++-- lazer/evm/test/ExampleReceiver.t.sol | 13 +++++++++---- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/lazer/evm/lib/forge-std b/lazer/evm/lib/forge-std index 1eea5ba..d3db4ef 160000 --- a/lazer/evm/lib/forge-std +++ b/lazer/evm/lib/forge-std @@ -1 +1 @@ -Subproject commit 1eea5bae12ae557d589f9f0f0edae2faa47cb262 +Subproject commit d3db4ef90a72b7d24aa5a2e5c649593eaef7801d diff --git a/lazer/evm/lib/openzeppelin-contracts-upgradeable b/lazer/evm/lib/openzeppelin-contracts-upgradeable index fa52531..e3deb4d 160000 --- a/lazer/evm/lib/openzeppelin-contracts-upgradeable +++ b/lazer/evm/lib/openzeppelin-contracts-upgradeable @@ -1 +1 @@ -Subproject commit fa525310e45f91eb20a6d3baa2644be8e0adba31 +Subproject commit e3deb4d2a5835f5dcb5bb6afbfa81be0061bfac8 diff --git a/lazer/evm/lib/pyth-crosschain b/lazer/evm/lib/pyth-crosschain index fb09981..cc16040 160000 --- a/lazer/evm/lib/pyth-crosschain +++ b/lazer/evm/lib/pyth-crosschain @@ -1 +1 @@ -Subproject commit fb09981799bf0ff9bd9bc7d5f3b340292a9783b2 +Subproject commit cc16040038691a5a5a499661d8de0daba8eed4c3 diff --git a/lazer/evm/src/ExampleReceiver.sol b/lazer/evm/src/ExampleReceiver.sol index 3768f61..cc5bd40 100644 --- a/lazer/evm/src/ExampleReceiver.sol +++ b/lazer/evm/src/ExampleReceiver.sol @@ -14,8 +14,12 @@ contract ExampleReceiver { pythLazer = PythLazer(pythLazerAddress); } - function updatePrice(bytes calldata update) public { - (bytes memory payload,) = pythLazer.verifyUpdate(update); + function updatePrice(bytes calldata update) payable public { + (bytes memory payload,) = pythLazer.verifyUpdate{value: pythLazer.verification_fee()}(update); + if (msg.value > pythLazer.verification_fee()) { + payable(msg.sender).transfer(msg.value - pythLazer.verification_fee()); + } + (uint64 _timestamp, PythLazerLib.Channel channel, uint8 feedsLen, uint16 pos) = PythLazerLib.parsePayloadHeader(payload); console.log("timestamp %d", _timestamp); diff --git a/lazer/evm/test/ExampleReceiver.t.sol b/lazer/evm/test/ExampleReceiver.t.sol index 222bcb3..89a1bb9 100644 --- a/lazer/evm/test/ExampleReceiver.t.sol +++ b/lazer/evm/test/ExampleReceiver.t.sol @@ -12,19 +12,24 @@ contract ExampleReceiverTest is Test { address trustedSigner = 0xEfEf56cD66896f6799A90A4e4d512C330c094e44; console.log("trustedSigner %s", trustedSigner); + address lazer = makeAddr("lazer"); PythLazer pythLazer = new PythLazer(); - pythLazer.initialize(address(0x1)); - vm.prank(address(0x1)); + pythLazer.initialize(lazer); + vm.prank(lazer); pythLazer.updateTrustedSigner(trustedSigner, 3000000000000000); + address consumer = makeAddr("consumer"); ExampleReceiver receiver = new ExampleReceiver(address(pythLazer)); - bytes memory update = hex"2a22999a577d3cc0202197939d736bc0dcf71b9dde7b9470e4d16fa8e2120c0787a1c0d744d0c39cc372af4d1ecf2d09e84160ca905f3f597d20e2eec144a446a0459ad600001c93c7d3750006240af373971c01010000000201000000000005f5e100"; console.logBytes(update); - receiver.updatePrice(update); + vm.deal(consumer, 1 ether); + vm.prank(consumer); + receiver.updatePrice{value: pythLazer.verification_fee()}(update); assertEq(receiver.price(), 100000000); assertEq(receiver.timestamp(), 1728479312975644); + assertEq(address(pythLazer).balance, pythLazer.verification_fee()); + assertEq(consumer.balance, 1 ether - pythLazer.verification_fee()); } } From b8782d0fb7bb51699b34a42e55254170cfafd4b8 Mon Sep 17 00:00:00 2001 From: Darun Seethammagari Date: Fri, 13 Dec 2024 10:40:48 -0800 Subject: [PATCH 2/5] Fee correctly used --- lazer/evm/src/ExampleReceiver.sol | 9 ++++++--- lazer/evm/test/ExampleReceiver.t.sol | 14 ++++++++++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/lazer/evm/src/ExampleReceiver.sol b/lazer/evm/src/ExampleReceiver.sol index cc5bd40..0141377 100644 --- a/lazer/evm/src/ExampleReceiver.sol +++ b/lazer/evm/src/ExampleReceiver.sol @@ -7,17 +7,20 @@ import {PythLazerLib} from "pyth-lazer/PythLazerLib.sol"; contract ExampleReceiver { PythLazer pythLazer; + uint256 verification_fee; uint64 public price; uint64 public timestamp; constructor(address pythLazerAddress) { pythLazer = PythLazer(pythLazerAddress); + verification_fee = pythLazer.verification_fee(); } function updatePrice(bytes calldata update) payable public { - (bytes memory payload,) = pythLazer.verifyUpdate{value: pythLazer.verification_fee()}(update); - if (msg.value > pythLazer.verification_fee()) { - payable(msg.sender).transfer(msg.value - pythLazer.verification_fee()); + require(msg.value >= verification_fee, "Insufficient fee provided"); + (bytes memory payload,) = pythLazer.verifyUpdate{value: verification_fee}(update); + if (msg.value > verification_fee) { + payable(msg.sender).transfer(msg.value - verification_fee); } (uint64 _timestamp, PythLazerLib.Channel channel, uint8 feedsLen, uint16 pos) = diff --git a/lazer/evm/test/ExampleReceiver.t.sol b/lazer/evm/test/ExampleReceiver.t.sol index 89a1bb9..a643c2d 100644 --- a/lazer/evm/test/ExampleReceiver.t.sol +++ b/lazer/evm/test/ExampleReceiver.t.sol @@ -15,21 +15,27 @@ contract ExampleReceiverTest is Test { address lazer = makeAddr("lazer"); PythLazer pythLazer = new PythLazer(); pythLazer.initialize(lazer); + vm.prank(lazer); pythLazer.updateTrustedSigner(trustedSigner, 3000000000000000); + uint256 fee = pythLazer.verification_fee(); address consumer = makeAddr("consumer"); + vm.deal(consumer, 10 wei); + ExampleReceiver receiver = new ExampleReceiver(address(pythLazer)); bytes memory update = hex"2a22999a577d3cc0202197939d736bc0dcf71b9dde7b9470e4d16fa8e2120c0787a1c0d744d0c39cc372af4d1ecf2d09e84160ca905f3f597d20e2eec144a446a0459ad600001c93c7d3750006240af373971c01010000000201000000000005f5e100"; console.logBytes(update); - vm.deal(consumer, 1 ether); vm.prank(consumer); - receiver.updatePrice{value: pythLazer.verification_fee()}(update); + receiver.updatePrice{value: 5 * fee}(update); + assertEq(receiver.price(), 100000000); assertEq(receiver.timestamp(), 1728479312975644); - assertEq(address(pythLazer).balance, pythLazer.verification_fee()); - assertEq(consumer.balance, 1 ether - pythLazer.verification_fee()); + + assertEq(address(pythLazer).balance, fee); + assertEq(address(receiver).balance, 0); + assertEq(consumer.balance, 10 wei - fee); } } From 91f301c1b7bc928d6bae48543be6d034c29ae239 Mon Sep 17 00:00:00 2001 From: Darun Seethammagari Date: Fri, 13 Dec 2024 10:49:14 -0800 Subject: [PATCH 3/5] Update function stub --- lazer/evm/src/ExampleReceiver.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/lazer/evm/src/ExampleReceiver.sol b/lazer/evm/src/ExampleReceiver.sol index 0141377..8136edf 100644 --- a/lazer/evm/src/ExampleReceiver.sol +++ b/lazer/evm/src/ExampleReceiver.sol @@ -21,6 +21,7 @@ contract ExampleReceiver { (bytes memory payload,) = pythLazer.verifyUpdate{value: verification_fee}(update); if (msg.value > verification_fee) { payable(msg.sender).transfer(msg.value - verification_fee); + function updatePrice(bytes calldata update) public payable { } (uint64 _timestamp, PythLazerLib.Channel channel, uint8 feedsLen, uint16 pos) = From b5fbbf983e0651ee5e4f0c1d70b524a6384212c9 Mon Sep 17 00:00:00 2001 From: Darun Seethammagari Date: Fri, 13 Dec 2024 10:55:03 -0800 Subject: [PATCH 4/5] Fix format issue --- lazer/evm/src/ExampleReceiver.sol | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lazer/evm/src/ExampleReceiver.sol b/lazer/evm/src/ExampleReceiver.sol index 8136edf..ac36a8d 100644 --- a/lazer/evm/src/ExampleReceiver.sol +++ b/lazer/evm/src/ExampleReceiver.sol @@ -16,12 +16,11 @@ contract ExampleReceiver { verification_fee = pythLazer.verification_fee(); } - function updatePrice(bytes calldata update) payable public { + function updatePrice(bytes calldata update) public payable { require(msg.value >= verification_fee, "Insufficient fee provided"); (bytes memory payload,) = pythLazer.verifyUpdate{value: verification_fee}(update); if (msg.value > verification_fee) { payable(msg.sender).transfer(msg.value - verification_fee); - function updatePrice(bytes calldata update) public payable { } (uint64 _timestamp, PythLazerLib.Channel channel, uint8 feedsLen, uint16 pos) = From 1a831f5c57f8f1b603c85f623809bd0ccdf87b84 Mon Sep 17 00:00:00 2001 From: Darun Seethammagari Date: Mon, 16 Dec 2024 08:39:12 -0800 Subject: [PATCH 5/5] Pull fee from lazer contract --- lazer/evm/src/ExampleReceiver.sol | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lazer/evm/src/ExampleReceiver.sol b/lazer/evm/src/ExampleReceiver.sol index ac36a8d..efddf0c 100644 --- a/lazer/evm/src/ExampleReceiver.sol +++ b/lazer/evm/src/ExampleReceiver.sol @@ -7,16 +7,15 @@ import {PythLazerLib} from "pyth-lazer/PythLazerLib.sol"; contract ExampleReceiver { PythLazer pythLazer; - uint256 verification_fee; uint64 public price; uint64 public timestamp; constructor(address pythLazerAddress) { pythLazer = PythLazer(pythLazerAddress); - verification_fee = pythLazer.verification_fee(); } function updatePrice(bytes calldata update) public payable { + uint256 verification_fee = pythLazer.verification_fee(); require(msg.value >= verification_fee, "Insufficient fee provided"); (bytes memory payload,) = pythLazer.verifyUpdate{value: verification_fee}(update); if (msg.value > verification_fee) {