Skip to content

Commit

Permalink
Add gas units to data provider return value (#280)
Browse files Browse the repository at this point in the history
* fix: Add gas units to data provider return value

* fix: update naming scheme

* fix: update asset naming

* fix typo

* test: fix testHappySubsidyHelper test

Co-authored-by: benesjan <[email protected]>
  • Loading branch information
LHerskind and benesjan authored Nov 18, 2022
1 parent 46af418 commit ee5fbe2
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 35 deletions.
17 changes: 14 additions & 3 deletions src/aztec/DataProvider.sol
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: Apache-2.0
// Copyright 2022 Aztec.
pragma solidity >=0.8.4;

import {AztecTypes} from "rollup-encoder/libraries/AztecTypes.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {IRollupProcessor} from "rollup-encoder/interfaces/IRollupProcessor.sol";
Expand Down Expand Up @@ -187,8 +188,17 @@ contract DataProvider is Ownable {
* @param _bridgeCallData The bridge call data for a specific bridge interaction
* @return The criteria passed to the subsidy contract
* @return The amount of eth claimed at the current gas prices
* @return The number of gas units (eth claimed / basefee)
*/
function getAccumulatedSubsidyAmount(uint256 _bridgeCallData) public view returns (uint256, uint256) {
function getAccumulatedSubsidyAmount(uint256 _bridgeCallData)
public
view
returns (
uint256,
uint256,
uint256
)
{
AccVal memory vars;

vars.bridgeAddressId = _bridgeCallData & MASK_THIRTY_TWO_BITS;
Expand Down Expand Up @@ -226,12 +236,13 @@ contract DataProvider is Ownable {
);

if (!success) {
return (0, 0);
return (0, 0, 0);
}

uint256 criteria = abi.decode(returnData, (uint256));
uint256 ethSub = SUBSIDY.getAccumulatedSubsidyAmount(vars.bridgeAddress, criteria);

return (criteria, SUBSIDY.getAccumulatedSubsidyAmount(vars.bridgeAddress, criteria));
return (criteria, ethSub, ethSub / block.basefee);
}

function _aztecAsset(uint256 _assetId) internal view returns (AztecTypes.AztecAsset memory) {
Expand Down
2 changes: 2 additions & 0 deletions src/deployment/AggregateDeployment.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,8 @@ contract AggregateDeployment is BaseDeployment {
liquityTroveDeployment.deployAndList(275);
liquityTroveDeployment.deployAndList(400);
}

readStats();
}

function bogota() public {
Expand Down
57 changes: 31 additions & 26 deletions src/deployment/dataprovider/DataProviderDeployment.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ pragma solidity >=0.8.4;

import {Strings} from "@openzeppelin/contracts/utils/Strings.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {IERC20Metadata} from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";
import {BaseDeployment} from "../base/BaseDeployment.s.sol";
import {DataProvider} from "../../aztec/DataProvider.sol";
import {IRollupProcessor} from "rollup-encoder/interfaces/IRollupProcessor.sol";
Expand Down Expand Up @@ -90,25 +91,25 @@ contract DataProviderDeployment is BaseDeployment {

function deployAndListMany() public returns (address) {
address provider = deploy();
updateNames(provider);
readProvider(provider);
return provider;
}

function updateNames(address _provider) public {
DataProvider provider = DataProvider(_provider);
IRollupProcessor rp = provider.ROLLUP_PROCESSOR();

uint256[] memory assetIds = new uint256[](10);
string[] memory assetTags = new string[](10);
for (uint256 i = 0; i < assetIds.length; i++) {
uint256 supportedAssetLength = rp.getSupportedAssetsLength();
uint256[] memory assetIds = new uint256[](supportedAssetLength);
string[] memory assetTags = new string[](supportedAssetLength);
for (uint256 i = 0; i < supportedAssetLength; i++) {
assetIds[i] = i;
assetTags[i] = i == 0 ? "Eth" : IERC20Metadata(rp.getSupportedAsset(i)).symbol();
}
assetTags[0] = "eth";
assetTags[1] = "dai";
assetTags[2] = "wsteth";
assetTags[3] = "vydai";
assetTags[4] = "vyweth";
assetTags[5] = "weweth";
assetTags[6] = "wewsteth";
assetTags[7] = "wedai";
assetTags[8] = "we2dai";
assetTags[9] = "we2weth";

uint256[] memory bridgeAddressIds = new uint256[](9);
string[] memory bridgeTags = new string[](9);

uint256[] memory bridgeAddressIds = new uint256[](11);
string[] memory bridgeTags = new string[](11);

bridgeAddressIds[0] = 1;
bridgeAddressIds[1] = 6;
Expand All @@ -119,21 +120,25 @@ contract DataProviderDeployment is BaseDeployment {
bridgeAddressIds[6] = 11;
bridgeAddressIds[7] = 12;
bridgeAddressIds[8] = 13;

bridgeTags[0] = "ElementBridge";
bridgeTags[1] = "CurveStEthBridge";
bridgeTags[2] = "YearnBridge_Deposit";
bridgeTags[3] = "YearnBridge_Withdraw";
bridgeTags[4] = "ElementBridge2M";
bridgeTags[5] = "ERC4626";
bridgeTags[6] = "DCA400K";
bridgeAddressIds[9] = 14;
bridgeAddressIds[10] = 15;

bridgeTags[0] = "ElementBridge_800K";
bridgeTags[1] = "CurveStEthBridge_250K";
bridgeTags[2] = "YearnBridgeDeposit_200K";
bridgeTags[3] = "YearnBridgeWithdraw_800K";
bridgeTags[4] = "ElementBridge_2M";
bridgeTags[5] = "ERC4626_300K";
bridgeTags[6] = "DCA_400K";
bridgeTags[7] = "ERC4626_500K";
bridgeTags[8] = "ERC4626_400K";
bridgeTags[9] = "Liquity275_550K";
bridgeTags[10] = "Liquity400_550K";

vm.broadcast();
DataProvider(provider).addAssetsAndBridges(assetIds, assetTags, bridgeAddressIds, bridgeTags);
DataProvider(_provider).addAssetsAndBridges(assetIds, assetTags, bridgeAddressIds, bridgeTags);

return provider;
readProvider(_provider);
}

function _listBridge(
Expand Down
25 changes: 19 additions & 6 deletions src/test/aztec/dataprovider/DataProvider.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ contract DataProviderTest is BridgeTestBase {

// fund yearn bridge to ensure that there are funds.
SUBSIDY.topUp{value: 10 ether}(ROLLUP_PROCESSOR.getSupportedBridge(7), 0);
SUBSIDY.topUp{value: 10 ether}(ROLLUP_PROCESSOR.getSupportedBridge(7), 1);
}

function testAddMultipleAssetsAndBridgesWrongInput() public {
Expand Down Expand Up @@ -188,25 +189,33 @@ contract DataProviderTest is BridgeTestBase {
vm.warp(block.timestamp + 1 days);

uint256 bridgeCallData = ROLLUP_ENCODER.encodeBridgeCallData(7, eth, empty, vyvault, empty, 0);
(uint256 criteria, uint256 subsidy) = provider.getAccumulatedSubsidyAmount(bridgeCallData);
(uint256 criteria, uint256 subsidy, uint256 gasUnits) = provider.getAccumulatedSubsidyAmount(bridgeCallData);
assertEq(criteria, 0, "Subsidy have accrued");
assertGt(subsidy, 0, "No subsidy accrued");
assertGe(subsidy, gasUnits * block.basefee, "Invalid gas units accrued");
assertEq(gasUnits, subsidy / block.basefee, "Invalid gas units accrued");

{
uint256 bridgeCallData = ROLLUP_ENCODER.encodeBridgeCallData(7, vyvault, empty, eth, empty, 1);
(uint256 criteria, uint256 subsidy) = provider.getAccumulatedSubsidyAmount(bridgeCallData);
(uint256 criteria, uint256 subsidy, uint256 gasUnits) = provider.getAccumulatedSubsidyAmount(
bridgeCallData
);
assertEq(criteria, 1, "Wrong criteria");
assertEq(subsidy, 0, "Subsidy accrued");
assertGe(subsidy, 0, "Subsidy accrued");
assertGe(subsidy, gasUnits * block.basefee, "Invalid gas units accrued");
assertEq(gasUnits, subsidy / block.basefee, "Invalid gas units accrued");
}
}

function testHappySubsidyHelper2InOut() public {
AztecTypes.AztecAsset memory eth = ROLLUP_ENCODER.getRealAztecAsset(address(0));
AztecTypes.AztecAsset memory dai = ROLLUP_ENCODER.getRealAztecAsset(0x6B175474E89094C44Da98b954EedeAC495271d0F);
uint256 bridgeCallData = ROLLUP_ENCODER.encodeBridgeCallData(7, dai, eth, dai, eth, 0);
(uint256 criteria, uint256 subsidy) = provider.getAccumulatedSubsidyAmount(bridgeCallData);
(uint256 criteria, uint256 subsidy, uint256 gasUnits) = provider.getAccumulatedSubsidyAmount(bridgeCallData);
assertEq(criteria, 0, "Wrong criteria");
assertGt(subsidy, 0, "No subsidy accrued");
assertGe(subsidy, gasUnits * block.basefee, "Invalid gas units accrued");
assertEq(gasUnits, subsidy / block.basefee, "Invalid gas units accrued");
}

function testHappySubsidyHelperVirtual() public {
Expand All @@ -218,17 +227,21 @@ contract DataProviderTest is BridgeTestBase {
});

uint256 bridgeCallData = ROLLUP_ENCODER.encodeBridgeCallData(7, virtualAsset, eth, virtualAsset, eth, 0);
(uint256 criteria, uint256 subsidy) = provider.getAccumulatedSubsidyAmount(bridgeCallData);
(uint256 criteria, uint256 subsidy, uint256 gasUnits) = provider.getAccumulatedSubsidyAmount(bridgeCallData);
assertEq(criteria, 0, "Wrong criteria");
assertGt(subsidy, 0, "No subsidy accrued");
assertGe(subsidy, gasUnits * block.basefee, "Invalid gas units accrued");
assertEq(gasUnits, subsidy / block.basefee, "Invalid gas units accrued");
}

function testUnHappySubsidyHelper() public {
AztecTypes.AztecAsset memory empty;
AztecTypes.AztecAsset memory dai = ROLLUP_ENCODER.getRealAztecAsset(0x6B175474E89094C44Da98b954EedeAC495271d0F);
uint256 bridgeCallData = ROLLUP_ENCODER.encodeBridgeCallData(1, dai, empty, dai, empty, 0);
(uint256 criteria, uint256 subsidy) = provider.getAccumulatedSubsidyAmount(bridgeCallData);
(uint256 criteria, uint256 subsidy, uint256 gasUnits) = provider.getAccumulatedSubsidyAmount(bridgeCallData);
assertEq(criteria, 0, "Wrong criteria");
assertEq(subsidy, 0, "Subsidy have accrued");
assertGe(subsidy, gasUnits * block.basefee, "Invalid gas units accrued");
assertEq(gasUnits, subsidy / block.basefee, "Invalid gas units accrued");
}
}

0 comments on commit ee5fbe2

Please sign in to comment.