diff --git a/contracts/gas-snapshots/llo-feeds.gas-snapshot b/contracts/gas-snapshots/llo-feeds.gas-snapshot index 0162809e90d..1d9b4d400b1 100644 --- a/contracts/gas-snapshots/llo-feeds.gas-snapshot +++ b/contracts/gas-snapshots/llo-feeds.gas-snapshot @@ -1,158 +1,246 @@ -ByteUtilTest:test_readAddress() (gas: 3388) -ByteUtilTest:test_readAddressMultiWord() (gas: 3386) +ByteUtilTest:test_readAddress() (gas: 542) +ByteUtilTest:test_readAddressMultiWord() (gas: 540) ByteUtilTest:test_readAddressWithEmptyArray() (gas: 3274) ByteUtilTest:test_readAddressWithNotEnoughBytes() (gas: 3314) -ByteUtilTest:test_readUint192Max() (gas: 3326) -ByteUtilTest:test_readUint192Min() (gas: 3349) -ByteUtilTest:test_readUint192MultiWord() (gas: 3327) +ByteUtilTest:test_readUint192Max() (gas: 485) +ByteUtilTest:test_readUint192Min() (gas: 508) +ByteUtilTest:test_readUint192MultiWord() (gas: 486) ByteUtilTest:test_readUint192WithEmptyArray() (gas: 3274) ByteUtilTest:test_readUint192WithNotEnoughBytes() (gas: 3314) -ByteUtilTest:test_readUint256Max() (gas: 3343) -ByteUtilTest:test_readUint256Min() (gas: 3387) -ByteUtilTest:test_readUint256MultiWord() (gas: 3341) +ByteUtilTest:test_readUint256Max() (gas: 502) +ByteUtilTest:test_readUint256Min() (gas: 546) +ByteUtilTest:test_readUint256MultiWord() (gas: 500) ByteUtilTest:test_readUint256WithEmptyArray() (gas: 3296) ByteUtilTest:test_readUint256WithNotEnoughBytes() (gas: 3293) -ByteUtilTest:test_readUint32Max() (gas: 3348) -ByteUtilTest:test_readUint32Min() (gas: 3328) -ByteUtilTest:test_readUint32MultiWord() (gas: 3393) +ByteUtilTest:test_readUint32Max() (gas: 507) +ByteUtilTest:test_readUint32Min() (gas: 487) +ByteUtilTest:test_readUint32MultiWord() (gas: 552) ByteUtilTest:test_readUint32WithEmptyArray() (gas: 3253) ByteUtilTest:test_readUint32WithNotEnoughBytes() (gas: 3272) -ByteUtilTest:test_readZeroAddress() (gas: 3365) -FeeManagerProcessFeeTest:test_DiscountIsAppliedForNative() (gas: 52645) -FeeManagerProcessFeeTest:test_DiscountIsReturnedForNative() (gas: 52595) -FeeManagerProcessFeeTest:test_DiscountIsReturnedForNativeWithSurcharge() (gas: 78808) -FeeManagerProcessFeeTest:test_V1PayloadVerifies() (gas: 26974) -FeeManagerProcessFeeTest:test_V1PayloadVerifiesAndReturnsChange() (gas: 58904) -FeeManagerProcessFeeTest:test_V2PayloadVerifies() (gas: 116750) -FeeManagerProcessFeeTest:test_V2PayloadWithoutQuoteFails() (gas: 27389) -FeeManagerProcessFeeTest:test_V2PayloadWithoutZeroFee() (gas: 70364) -FeeManagerProcessFeeTest:test_WithdrawERC20() (gas: 72682) -FeeManagerProcessFeeTest:test_WithdrawNonAdminAddr() (gas: 56286) -FeeManagerProcessFeeTest:test_WithdrawUnwrappedNative() (gas: 26387) -FeeManagerProcessFeeTest:test_baseFeeIsAppliedForLink() (gas: 17190) -FeeManagerProcessFeeTest:test_baseFeeIsAppliedForNative() (gas: 20128) -FeeManagerProcessFeeTest:test_correctDiscountIsAppliedWhenBothTokensAreDiscounted() (gas: 91011) -FeeManagerProcessFeeTest:test_discountAIsNotAppliedWhenSetForOtherUsers() (gas: 56534) -FeeManagerProcessFeeTest:test_discountFeeRoundsDownWhenUneven() (gas: 52847) -FeeManagerProcessFeeTest:test_discountIsAppliedForLink() (gas: 49636) -FeeManagerProcessFeeTest:test_discountIsAppliedWith100PercentSurcharge() (gas: 78903) -FeeManagerProcessFeeTest:test_discountIsNoLongerAppliedAfterRemoving() (gas: 46511) -FeeManagerProcessFeeTest:test_discountIsNotAppliedForInvalidTokenAddress() (gas: 17560) -FeeManagerProcessFeeTest:test_discountIsNotAppliedToOtherFeeds() (gas: 54604) -FeeManagerProcessFeeTest:test_discountIsReturnedForLink() (gas: 49608) -FeeManagerProcessFeeTest:test_emptyQuoteRevertsWithError() (gas: 12163) -FeeManagerProcessFeeTest:test_eventIsEmittedAfterSurchargeIsSet() (gas: 41356) -FeeManagerProcessFeeTest:test_eventIsEmittedIfNotEnoughLink() (gas: 173756) -FeeManagerProcessFeeTest:test_eventIsEmittedUponWithdraw() (gas: 69009) -FeeManagerProcessFeeTest:test_feeIsUpdatedAfterDiscountIsRemoved() (gas: 49757) -FeeManagerProcessFeeTest:test_feeIsUpdatedAfterNewDiscountIsApplied() (gas: 67699) -FeeManagerProcessFeeTest:test_feeIsUpdatedAfterNewSurchargeIsApplied() (gas: 64368) -FeeManagerProcessFeeTest:test_feeIsZeroWith100PercentDiscount() (gas: 52045) -FeeManagerProcessFeeTest:test_getBaseRewardWithLinkQuote() (gas: 17207) -FeeManagerProcessFeeTest:test_getLinkFeeIsRoundedUp() (gas: 49829) -FeeManagerProcessFeeTest:test_getLinkRewardIsSameAsFee() (gas: 55641) -FeeManagerProcessFeeTest:test_getLinkRewardWithNativeQuoteAndSurchargeWithLinkDiscount() (gas: 82765) -FeeManagerProcessFeeTest:test_getRewardWithLinkDiscount() (gas: 49654) -FeeManagerProcessFeeTest:test_getRewardWithLinkQuoteAndLinkDiscount() (gas: 49657) -FeeManagerProcessFeeTest:test_getRewardWithNativeQuote() (gas: 20148) -FeeManagerProcessFeeTest:test_getRewardWithNativeQuoteAndSurcharge() (gas: 50838) -FeeManagerProcessFeeTest:test_linkAvailableForPaymentReturnsLinkBalance() (gas: 53192) -FeeManagerProcessFeeTest:test_nativeSurcharge0Percent() (gas: 30848) -FeeManagerProcessFeeTest:test_nativeSurcharge100Percent() (gas: 50863) -FeeManagerProcessFeeTest:test_nativeSurchargeCannotExceed100Percent() (gas: 17175) -FeeManagerProcessFeeTest:test_nativeSurchargeEventIsEmittedOnUpdate() (gas: 41402) -FeeManagerProcessFeeTest:test_noFeeIsAppliedWhenReportHasZeroFee() (gas: 51868) -FeeManagerProcessFeeTest:test_noFeeIsAppliedWhenReportHasZeroFeeAndDiscountAndSurchargeIsSet() (gas: 78104) -FeeManagerProcessFeeTest:test_nonAdminProxyUserCannotProcessFee() (gas: 21895) -FeeManagerProcessFeeTest:test_nonAdminUserCanNotSetDiscount() (gas: 19849) -FeeManagerProcessFeeTest:test_payLinkDeficit() (gas: 194429) -FeeManagerProcessFeeTest:test_payLinkDeficitOnlyCallableByAdmin() (gas: 17413) -FeeManagerProcessFeeTest:test_payLinkDeficitPaysAllFeesProcessed() (gas: 214755) -FeeManagerProcessFeeTest:test_payLinkDeficitTwice() (gas: 198803) -FeeManagerProcessFeeTest:test_processFeeAsProxy() (gas: 117088) -FeeManagerProcessFeeTest:test_processFeeDefaultReportsStillVerifiesWithEmptyQuote() (gas: 27462) -FeeManagerProcessFeeTest:test_processFeeEmitsEventIfNotEnoughLink() (gas: 163205) -FeeManagerProcessFeeTest:test_processFeeIfSubscriberIsSelf() (gas: 27827) -FeeManagerProcessFeeTest:test_processFeeNative() (gas: 173826) -FeeManagerProcessFeeTest:test_processFeeUsesCorrectDigest() (gas: 118379) -FeeManagerProcessFeeTest:test_processFeeWithDefaultReportPayloadAndQuoteStillVerifies() (gas: 29536) -FeeManagerProcessFeeTest:test_processFeeWithDiscountEmitsEvent() (gas: 241353) -FeeManagerProcessFeeTest:test_processFeeWithInvalidReportVersionFailsToDecode() (gas: 28511) -FeeManagerProcessFeeTest:test_processFeeWithNoDiscountDoesNotEmitEvent() (gas: 166753) -FeeManagerProcessFeeTest:test_processFeeWithUnwrappedNative() (gas: 181691) -FeeManagerProcessFeeTest:test_processFeeWithUnwrappedNativeLinkAddress() (gas: 131466) -FeeManagerProcessFeeTest:test_processFeeWithUnwrappedNativeLinkAddressExcessiveFee() (gas: 157072) -FeeManagerProcessFeeTest:test_processFeeWithUnwrappedNativeShortFunds() (gas: 92635) -FeeManagerProcessFeeTest:test_processFeeWithUnwrappedNativeWithExcessiveFee() (gas: 188654) -FeeManagerProcessFeeTest:test_processFeeWithWithCorruptQuotePayload() (gas: 70675) -FeeManagerProcessFeeTest:test_processFeeWithWithEmptyQuotePayload() (gas: 27727) -FeeManagerProcessFeeTest:test_processFeeWithWithZeroQuotePayload() (gas: 27777) -FeeManagerProcessFeeTest:test_processFeeWithZeroLinkNonZeroNativeWithLinkQuote() (gas: 32967) -FeeManagerProcessFeeTest:test_processFeeWithZeroLinkNonZeroNativeWithNativeQuote() (gas: 153725) -FeeManagerProcessFeeTest:test_processFeeWithZeroNativeNonZeroLinkReturnsChange() (gas: 53795) -FeeManagerProcessFeeTest:test_processFeeWithZeroNativeNonZeroLinkWithLinkQuote() (gas: 116999) -FeeManagerProcessFeeTest:test_processFeeWithZeroNativeNonZeroLinkWithNativeQuote() (gas: 35738) -FeeManagerProcessFeeTest:test_processMultipleLinkReports() (gas: 223133) -FeeManagerProcessFeeTest:test_processMultipleUnwrappedNativeReports() (gas: 256996) -FeeManagerProcessFeeTest:test_processMultipleV1Reports() (gas: 74793) -FeeManagerProcessFeeTest:test_processMultipleWrappedNativeReports() (gas: 239801) -FeeManagerProcessFeeTest:test_processV1V2V3Reports() (gas: 207915) -FeeManagerProcessFeeTest:test_processV1V2V3ReportsWithUnwrapped() (gas: 249580) -FeeManagerProcessFeeTest:test_reportWithNoExpiryOrFeeReturnsZero() (gas: 13613) -FeeManagerProcessFeeTest:test_setDiscountOver100Percent() (gas: 19562) -FeeManagerProcessFeeTest:test_subscriberDiscountEventIsEmittedOnUpdate() (gas: 46261) -FeeManagerProcessFeeTest:test_surchargeFeeRoundsUpWhenUneven() (gas: 51215) -FeeManagerProcessFeeTest:test_surchargeIsApplied() (gas: 51096) -FeeManagerProcessFeeTest:test_surchargeIsAppliedForNativeFeeWithDiscount() (gas: 79265) -FeeManagerProcessFeeTest:test_surchargeIsNoLongerAppliedAfterRemoving() (gas: 47076) -FeeManagerProcessFeeTest:test_surchargeIsNotAppliedForLinkFee() (gas: 49938) -FeeManagerProcessFeeTest:test_surchargeIsNotAppliedWith100PercentDiscount() (gas: 78261) -FeeManagerProcessFeeTest:test_testRevertIfReportHasExpired() (gas: 14919) -RewardManagerClaimTest:test_claimAllRecipients() (gas: 277131) -RewardManagerClaimTest:test_claimMultipleRecipients() (gas: 154341) -RewardManagerClaimTest:test_claimRewardsWithDuplicatePoolIdsDoesNotPayoutTwice() (gas: 330086) -RewardManagerClaimTest:test_claimSingleRecipient() (gas: 89024) -RewardManagerClaimTest:test_claimUnevenAmountRoundsDown() (gas: 315289) -RewardManagerClaimTest:test_claimUnregisteredPoolId() (gas: 35145) -RewardManagerClaimTest:test_claimUnregisteredRecipient() (gas: 41182) +ByteUtilTest:test_readZeroAddress() (gas: 519) +FeeManagerNoNativeGetFeeAndRewardTest:test_DiscountIsAppliedForNative() (gas: 52310) +FeeManagerNoNativeGetFeeAndRewardTest:test_DiscountIsReturnedForNative() (gas: 52285) +FeeManagerNoNativeGetFeeAndRewardTest:test_DiscountIsReturnedForNativeWithSurcharge() (gas: 78446) +FeeManagerNoNativeGetFeeAndRewardTest:test_baseFeeIsAppliedForLink() (gas: 14347) +FeeManagerNoNativeGetFeeAndRewardTest:test_baseFeeIsAppliedForNative() (gas: 17285) +FeeManagerNoNativeGetFeeAndRewardTest:test_correctDiscountIsAppliedWhenBothTokensAreDiscounted() (gas: 90297) +FeeManagerNoNativeGetFeeAndRewardTest:test_discountAIsNotAppliedWhenSetForOtherUsers() (gas: 56177) +FeeManagerNoNativeGetFeeAndRewardTest:test_discountFeeRoundsDownWhenUneven() (gas: 52490) +FeeManagerNoNativeGetFeeAndRewardTest:test_discountIsAppliedForLink() (gas: 49279) +FeeManagerNoNativeGetFeeAndRewardTest:test_discountIsAppliedWith100PercentSurcharge() (gas: 78538) +FeeManagerNoNativeGetFeeAndRewardTest:test_discountIsNoLongerAppliedAfterRemoving() (gas: 45904) +FeeManagerNoNativeGetFeeAndRewardTest:test_discountIsNotAppliedForInvalidTokenAddress() (gas: 17546) +FeeManagerNoNativeGetFeeAndRewardTest:test_discountIsNotAppliedToOtherFeeds() (gas: 54247) +FeeManagerNoNativeGetFeeAndRewardTest:test_discountIsReturnedForLink() (gas: 49254) +FeeManagerNoNativeGetFeeAndRewardTest:test_emptyQuoteRevertsWithError() (gas: 12174) +FeeManagerNoNativeGetFeeAndRewardTest:test_feeIsUpdatedAfterDiscountIsRemoved() (gas: 49186) +FeeManagerNoNativeGetFeeAndRewardTest:test_feeIsUpdatedAfterNewDiscountIsApplied() (gas: 66963) +FeeManagerNoNativeGetFeeAndRewardTest:test_feeIsUpdatedAfterNewSurchargeIsApplied() (gas: 63666) +FeeManagerNoNativeGetFeeAndRewardTest:test_feeIsZeroWith100PercentDiscount() (gas: 51688) +FeeManagerNoNativeGetFeeAndRewardTest:test_getBaseRewardWithLinkQuote() (gas: 14364) +FeeManagerNoNativeGetFeeAndRewardTest:test_getLinkFeeIsRoundedUp() (gas: 49472) +FeeManagerNoNativeGetFeeAndRewardTest:test_getLinkRewardIsSameAsFee() (gas: 54936) +FeeManagerNoNativeGetFeeAndRewardTest:test_getLinkRewardWithNativeQuoteAndSurchargeWithLinkDiscount() (gas: 82400) +FeeManagerNoNativeGetFeeAndRewardTest:test_getRewardWithLinkDiscount() (gas: 49297) +FeeManagerNoNativeGetFeeAndRewardTest:test_getRewardWithLinkQuoteAndLinkDiscount() (gas: 49278) +FeeManagerNoNativeGetFeeAndRewardTest:test_getRewardWithNativeQuote() (gas: 17305) +FeeManagerNoNativeGetFeeAndRewardTest:test_getRewardWithNativeQuoteAndSurcharge() (gas: 50487) +FeeManagerNoNativeGetFeeAndRewardTest:test_nativeSurcharge0Percent() (gas: 30497) +FeeManagerNoNativeGetFeeAndRewardTest:test_nativeSurcharge100Percent() (gas: 50512) +FeeManagerNoNativeGetFeeAndRewardTest:test_nativeSurchargeCannotExceed100Percent() (gas: 17167) +FeeManagerNoNativeGetFeeAndRewardTest:test_nativeSurchargeEventIsEmittedOnUpdate() (gas: 41394) +FeeManagerNoNativeGetFeeAndRewardTest:test_noFeeIsAppliedWhenReportHasZeroFee() (gas: 51511) +FeeManagerNoNativeGetFeeAndRewardTest:test_noFeeIsAppliedWhenReportHasZeroFeeAndDiscountAndSurchargeIsSet() (gas: 77739) +FeeManagerNoNativeGetFeeAndRewardTest:test_nonAdminUserCanNotSetDiscount() (gas: 19835) +FeeManagerNoNativeGetFeeAndRewardTest:test_reportWithNoExpiryOrFeeReturnsZero() (gas: 10770) +FeeManagerNoNativeGetFeeAndRewardTest:test_setDiscountOver100Percent() (gas: 19548) +FeeManagerNoNativeGetFeeAndRewardTest:test_surchargeFeeRoundsUpWhenUneven() (gas: 50864) +FeeManagerNoNativeGetFeeAndRewardTest:test_surchargeIsApplied() (gas: 50745) +FeeManagerNoNativeGetFeeAndRewardTest:test_surchargeIsAppliedForNativeFeeWithDiscount() (gas: 78900) +FeeManagerNoNativeGetFeeAndRewardTest:test_surchargeIsNoLongerAppliedAfterRemoving() (gas: 46514) +FeeManagerNoNativeGetFeeAndRewardTest:test_surchargeIsNotAppliedForLinkFee() (gas: 49587) +FeeManagerNoNativeGetFeeAndRewardTest:test_surchargeIsNotAppliedWith100PercentDiscount() (gas: 77896) +FeeManagerNoNativeGetFeeAndRewardTest:test_testRevertIfReportHasExpired() (gas: 14908) +FeeManagerNoNativeProcessFeeBulkTest:test_eventIsEmittedIfNotEnoughLink() (gas: 172763) +FeeManagerNoNativeProcessFeeBulkTest:test_processMultipleLinkReports() (gas: 165257) +FeeManagerNoNativeProcessFeeBulkTest:test_processMultipleV1Reports() (gas: 53682) +FeeManagerNoNativeProcessFeeBulkTest:test_processMultipleWrappedNativeReports() (gas: 238433) +FeeManagerNoNativeProcessFeeBulkTest:test_processV1V2V3Reports() (gas: 206184) +FeeManagerNoNativeProcessFeeBulkTest:test_processV1V2V3ReportsWithWrapped() (gas: 241155) +FeeManagerNoNativeProcessFeeTest:test_V1PayloadBlocksNativeBilling() (gas: 37362) +FeeManagerNoNativeProcessFeeTest:test_V1PayloadVerifies() (gas: 54874) +FeeManagerNoNativeProcessFeeTest:test_V2PayloadVerifies() (gas: 116010) +FeeManagerNoNativeProcessFeeTest:test_V2PayloadWithoutQuoteFails() (gas: 27423) +FeeManagerNoNativeProcessFeeTest:test_V2PayloadWithoutZeroFee() (gas: 70397) +FeeManagerNoNativeProcessFeeTest:test_WithdrawERC20() (gas: 71639) +FeeManagerNoNativeProcessFeeTest:test_WithdrawNonAdminAddr() (gas: 56239) +FeeManagerNoNativeProcessFeeTest:test_WithdrawUnwrappedNative() (gas: 25322) +FeeManagerNoNativeProcessFeeTest:test_eventIsEmittedAfterSurchargeIsSet() (gas: 41348) +FeeManagerNoNativeProcessFeeTest:test_eventIsEmittedUponWithdraw() (gas: 68962) +FeeManagerNoNativeProcessFeeTest:test_linkAvailableForPaymentReturnsLinkBalance() (gas: 52419) +FeeManagerNoNativeProcessFeeTest:test_nonAdminProxyUserCannotProcessFee() (gas: 21925) +FeeManagerNoNativeProcessFeeTest:test_payLinkDeficit() (gas: 193848) +FeeManagerNoNativeProcessFeeTest:test_payLinkDeficitOnlyCallableByAdmin() (gas: 17405) +FeeManagerNoNativeProcessFeeTest:test_payLinkDeficitPaysAllFeesProcessed() (gas: 213899) +FeeManagerNoNativeProcessFeeTest:test_payLinkDeficitTwice() (gas: 198215) +FeeManagerNoNativeProcessFeeTest:test_processFeeAsProxy() (gas: 116437) +FeeManagerNoNativeProcessFeeTest:test_processFeeDefaultReportsStillVerifiesWithEmptyQuote() (gas: 55265) +FeeManagerNoNativeProcessFeeTest:test_processFeeEmitsEventIfNotEnoughLink() (gas: 161870) +FeeManagerNoNativeProcessFeeTest:test_processFeeIfSubscriberIsSelf() (gas: 27872) +FeeManagerNoNativeProcessFeeTest:test_processFeeNative() (gas: 172447) +FeeManagerNoNativeProcessFeeTest:test_processFeeUsesCorrectDigest() (gas: 117419) +FeeManagerNoNativeProcessFeeTest:test_processFeeWithDefaultReportPayloadAndQuoteStillVerifies() (gas: 57361) +FeeManagerNoNativeProcessFeeTest:test_processFeeWithDiscountEmitsEvent() (gas: 241320) +FeeManagerNoNativeProcessFeeTest:test_processFeeWithInvalidReportVersionFailsToDecode() (gas: 28478) +FeeManagerNoNativeProcessFeeTest:test_processFeeWithNoDiscountDoesNotEmitEvent() (gas: 166389) +FeeManagerNoNativeProcessFeeTest:test_processFeeWithUnwrappedNativeLinkAddress() (gas: 107037) +FeeManagerNoNativeProcessFeeTest:test_processFeeWithUnwrappedNativeWithExcessiveFee() (gas: 172766) +FeeManagerNoNativeProcessFeeTest:test_processFeeWithWithCorruptQuotePayload() (gas: 70708) +FeeManagerNoNativeProcessFeeTest:test_processFeeWithWithEmptyQuotePayload() (gas: 27761) +FeeManagerNoNativeProcessFeeTest:test_processFeeWithWithZeroQuotePayload() (gas: 27789) +FeeManagerNoNativeProcessFeeTest:test_processFeeWithWrappedNative() (gas: 177541) +FeeManagerNoNativeProcessFeeTest:test_processFeeWithWrappedNativeLinkAddressExcessiveFee() (gas: 131256) +FeeManagerNoNativeProcessFeeTest:test_processFeeWithZeroLinkNonZeroNativeWithLinkQuote() (gas: 61774) +FeeManagerNoNativeProcessFeeTest:test_processFeeWithZeroLinkNonZeroNativeWithNativeQuote() (gas: 152346) +FeeManagerNoNativeProcessFeeTest:test_processFeeWithZeroNativeNonZeroLinkReturnsChange() (gas: 61930) +FeeManagerNoNativeProcessFeeTest:test_processFeeWithZeroNativeNonZeroLinkWithLinkQuote() (gas: 116348) +FeeManagerNoNativeProcessFeeTest:test_processFeeWithZeroNativeNonZeroLinkWithNativeQuote() (gas: 67964) +FeeManagerNoNativeProcessFeeTest:test_subscriberDiscountEventIsEmittedOnUpdate() (gas: 46237) +FeeManagerProcessFeeTest:test_DiscountIsAppliedForNative() (gas: 52288) +FeeManagerProcessFeeTest:test_DiscountIsReturnedForNative() (gas: 52241) +FeeManagerProcessFeeTest:test_DiscountIsReturnedForNativeWithSurcharge() (gas: 78446) +FeeManagerProcessFeeTest:test_V1PayloadVerifies() (gas: 26980) +FeeManagerProcessFeeTest:test_V1PayloadVerifiesAndReturnsChange() (gas: 57895) +FeeManagerProcessFeeTest:test_V2PayloadVerifies() (gas: 116094) +FeeManagerProcessFeeTest:test_V2PayloadWithoutQuoteFails() (gas: 27395) +FeeManagerProcessFeeTest:test_V2PayloadWithoutZeroFee() (gas: 70370) +FeeManagerProcessFeeTest:test_WithdrawERC20() (gas: 71617) +FeeManagerProcessFeeTest:test_WithdrawNonAdminAddr() (gas: 56261) +FeeManagerProcessFeeTest:test_WithdrawUnwrappedNative() (gas: 25322) +FeeManagerProcessFeeTest:test_baseFeeIsAppliedForLink() (gas: 14347) +FeeManagerProcessFeeTest:test_baseFeeIsAppliedForNative() (gas: 17285) +FeeManagerProcessFeeTest:test_correctDiscountIsAppliedWhenBothTokensAreDiscounted() (gas: 90297) +FeeManagerProcessFeeTest:test_discountAIsNotAppliedWhenSetForOtherUsers() (gas: 56177) +FeeManagerProcessFeeTest:test_discountFeeRoundsDownWhenUneven() (gas: 52490) +FeeManagerProcessFeeTest:test_discountIsAppliedForLink() (gas: 49279) +FeeManagerProcessFeeTest:test_discountIsAppliedWith100PercentSurcharge() (gas: 78538) +FeeManagerProcessFeeTest:test_discountIsNoLongerAppliedAfterRemoving() (gas: 45940) +FeeManagerProcessFeeTest:test_discountIsNotAppliedForInvalidTokenAddress() (gas: 17546) +FeeManagerProcessFeeTest:test_discountIsNotAppliedToOtherFeeds() (gas: 54247) +FeeManagerProcessFeeTest:test_discountIsReturnedForLink() (gas: 49254) +FeeManagerProcessFeeTest:test_emptyQuoteRevertsWithError() (gas: 12152) +FeeManagerProcessFeeTest:test_eventIsEmittedAfterSurchargeIsSet() (gas: 41348) +FeeManagerProcessFeeTest:test_eventIsEmittedIfNotEnoughLink() (gas: 172747) +FeeManagerProcessFeeTest:test_eventIsEmittedUponWithdraw() (gas: 68984) +FeeManagerProcessFeeTest:test_feeIsUpdatedAfterDiscountIsRemoved() (gas: 49186) +FeeManagerProcessFeeTest:test_feeIsUpdatedAfterNewDiscountIsApplied() (gas: 66985) +FeeManagerProcessFeeTest:test_feeIsUpdatedAfterNewSurchargeIsApplied() (gas: 63666) +FeeManagerProcessFeeTest:test_feeIsZeroWith100PercentDiscount() (gas: 51688) +FeeManagerProcessFeeTest:test_getBaseRewardWithLinkQuote() (gas: 14364) +FeeManagerProcessFeeTest:test_getLinkFeeIsRoundedUp() (gas: 49472) +FeeManagerProcessFeeTest:test_getLinkRewardIsSameAsFee() (gas: 54936) +FeeManagerProcessFeeTest:test_getLinkRewardWithNativeQuoteAndSurchargeWithLinkDiscount() (gas: 82400) +FeeManagerProcessFeeTest:test_getRewardWithLinkDiscount() (gas: 49297) +FeeManagerProcessFeeTest:test_getRewardWithLinkQuoteAndLinkDiscount() (gas: 49300) +FeeManagerProcessFeeTest:test_getRewardWithNativeQuote() (gas: 17305) +FeeManagerProcessFeeTest:test_getRewardWithNativeQuoteAndSurcharge() (gas: 50487) +FeeManagerProcessFeeTest:test_linkAvailableForPaymentReturnsLinkBalance() (gas: 52419) +FeeManagerProcessFeeTest:test_nativeSurcharge0Percent() (gas: 30497) +FeeManagerProcessFeeTest:test_nativeSurcharge100Percent() (gas: 50512) +FeeManagerProcessFeeTest:test_nativeSurchargeCannotExceed100Percent() (gas: 17167) +FeeManagerProcessFeeTest:test_nativeSurchargeEventIsEmittedOnUpdate() (gas: 41394) +FeeManagerProcessFeeTest:test_noFeeIsAppliedWhenReportHasZeroFee() (gas: 51511) +FeeManagerProcessFeeTest:test_noFeeIsAppliedWhenReportHasZeroFeeAndDiscountAndSurchargeIsSet() (gas: 77739) +FeeManagerProcessFeeTest:test_nonAdminProxyUserCannotProcessFee() (gas: 21881) +FeeManagerProcessFeeTest:test_nonAdminUserCanNotSetDiscount() (gas: 19835) +FeeManagerProcessFeeTest:test_payLinkDeficit() (gas: 193861) +FeeManagerProcessFeeTest:test_payLinkDeficitOnlyCallableByAdmin() (gas: 17405) +FeeManagerProcessFeeTest:test_payLinkDeficitPaysAllFeesProcessed() (gas: 213908) +FeeManagerProcessFeeTest:test_payLinkDeficitTwice() (gas: 198228) +FeeManagerProcessFeeTest:test_processFeeAsProxy() (gas: 116432) +FeeManagerProcessFeeTest:test_processFeeDefaultReportsStillVerifiesWithEmptyQuote() (gas: 27468) +FeeManagerProcessFeeTest:test_processFeeEmitsEventIfNotEnoughLink() (gas: 161843) +FeeManagerProcessFeeTest:test_processFeeIfSubscriberIsSelf() (gas: 27822) +FeeManagerProcessFeeTest:test_processFeeNative() (gas: 172464) +FeeManagerProcessFeeTest:test_processFeeUsesCorrectDigest() (gas: 117392) +FeeManagerProcessFeeTest:test_processFeeWithDefaultReportPayloadAndQuoteStillVerifies() (gas: 29542) +FeeManagerProcessFeeTest:test_processFeeWithDiscountEmitsEvent() (gas: 241293) +FeeManagerProcessFeeTest:test_processFeeWithInvalidReportVersionFailsToDecode() (gas: 28517) +FeeManagerProcessFeeTest:test_processFeeWithNoDiscountDoesNotEmitEvent() (gas: 166406) +FeeManagerProcessFeeTest:test_processFeeWithUnwrappedNative() (gas: 179998) +FeeManagerProcessFeeTest:test_processFeeWithUnwrappedNativeLinkAddress() (gas: 131461) +FeeManagerProcessFeeTest:test_processFeeWithUnwrappedNativeLinkAddressExcessiveFee() (gas: 155390) +FeeManagerProcessFeeTest:test_processFeeWithUnwrappedNativeShortFunds() (gas: 92630) +FeeManagerProcessFeeTest:test_processFeeWithUnwrappedNativeWithExcessiveFee() (gas: 186961) +FeeManagerProcessFeeTest:test_processFeeWithWithCorruptQuotePayload() (gas: 70681) +FeeManagerProcessFeeTest:test_processFeeWithWithEmptyQuotePayload() (gas: 27733) +FeeManagerProcessFeeTest:test_processFeeWithWithZeroQuotePayload() (gas: 27783) +FeeManagerProcessFeeTest:test_processFeeWithZeroLinkNonZeroNativeWithLinkQuote() (gas: 32973) +FeeManagerProcessFeeTest:test_processFeeWithZeroLinkNonZeroNativeWithNativeQuote() (gas: 152363) +FeeManagerProcessFeeTest:test_processFeeWithZeroNativeNonZeroLinkReturnsChange() (gas: 53470) +FeeManagerProcessFeeTest:test_processFeeWithZeroNativeNonZeroLinkWithLinkQuote() (gas: 116343) +FeeManagerProcessFeeTest:test_processFeeWithZeroNativeNonZeroLinkWithNativeQuote() (gas: 35744) +FeeManagerProcessFeeTest:test_processMultipleLinkReports() (gas: 221473) +FeeManagerProcessFeeTest:test_processMultipleUnwrappedNativeReports() (gas: 255314) +FeeManagerProcessFeeTest:test_processMultipleV1Reports() (gas: 74137) +FeeManagerProcessFeeTest:test_processMultipleWrappedNativeReports() (gas: 238439) +FeeManagerProcessFeeTest:test_processV1V2V3Reports() (gas: 206233) +FeeManagerProcessFeeTest:test_processV1V2V3ReportsWithUnwrapped() (gas: 247907) +FeeManagerProcessFeeTest:test_reportWithNoExpiryOrFeeReturnsZero() (gas: 10770) +FeeManagerProcessFeeTest:test_setDiscountOver100Percent() (gas: 19548) +FeeManagerProcessFeeTest:test_subscriberDiscountEventIsEmittedOnUpdate() (gas: 46259) +FeeManagerProcessFeeTest:test_surchargeFeeRoundsUpWhenUneven() (gas: 50864) +FeeManagerProcessFeeTest:test_surchargeIsApplied() (gas: 50745) +FeeManagerProcessFeeTest:test_surchargeIsAppliedForNativeFeeWithDiscount() (gas: 78900) +FeeManagerProcessFeeTest:test_surchargeIsNoLongerAppliedAfterRemoving() (gas: 46514) +FeeManagerProcessFeeTest:test_surchargeIsNotAppliedForLinkFee() (gas: 49587) +FeeManagerProcessFeeTest:test_surchargeIsNotAppliedWith100PercentDiscount() (gas: 77896) +FeeManagerProcessFeeTest:test_testRevertIfReportHasExpired() (gas: 14908) +RewardManagerClaimTest:test_claimAllRecipients() (gas: 275763) +RewardManagerClaimTest:test_claimMultipleRecipients() (gas: 153308) +RewardManagerClaimTest:test_claimRewardsWithDuplicatePoolIdsDoesNotPayoutTwice() (gas: 328345) +RewardManagerClaimTest:test_claimSingleRecipient() (gas: 88340) +RewardManagerClaimTest:test_claimUnevenAmountRoundsDown() (gas: 313549) +RewardManagerClaimTest:test_claimUnregisteredPoolId() (gas: 34461) +RewardManagerClaimTest:test_claimUnregisteredRecipient() (gas: 40491) RewardManagerClaimTest:test_eventIsEmittedUponClaim() (gas: 86069) -RewardManagerClaimTest:test_eventIsNotEmittedUponUnsuccessfulClaim() (gas: 25031) -RewardManagerClaimTest:test_recipientsClaimMultipleDeposits() (gas: 386675) -RewardManagerClaimTest:test_singleRecipientClaimMultipleDeposits() (gas: 137685) -RewardManagerNoRecipientSet:test_claimAllRecipientsAfterRecipientsSet() (gas: 492113) -RewardManagerPayRecipientsTest:test_addFundsToPoolAsNonOwnerOrFeeManager() (gas: 11437) -RewardManagerPayRecipientsTest:test_addFundsToPoolAsOwner() (gas: 53894) -RewardManagerPayRecipientsTest:test_payAllRecipients() (gas: 250840) +RewardManagerClaimTest:test_eventIsNotEmittedUponUnsuccessfulClaim() (gas: 24700) +RewardManagerClaimTest:test_recipientsClaimMultipleDeposits() (gas: 383222) +RewardManagerClaimTest:test_singleRecipientClaimMultipleDeposits() (gas: 136295) +RewardManagerNoRecipientSet:test_claimAllRecipientsAfterRecipientsSet() (gas: 489377) +RewardManagerPayRecipientsTest:test_addFundsToPoolAsNonOwnerOrFeeManager() (gas: 11428) +RewardManagerPayRecipientsTest:test_addFundsToPoolAsOwner() (gas: 53876) +RewardManagerPayRecipientsTest:test_payAllRecipients() (gas: 249472) RewardManagerPayRecipientsTest:test_payAllRecipientsFromNonAdminUser() (gas: 20475) -RewardManagerPayRecipientsTest:test_payAllRecipientsFromRecipientInPool() (gas: 251086) -RewardManagerPayRecipientsTest:test_payAllRecipientsWithAdditionalInvalidRecipient() (gas: 262290) -RewardManagerPayRecipientsTest:test_payAllRecipientsWithAdditionalUnregisteredRecipient() (gas: 265775) -RewardManagerPayRecipientsTest:test_payRecipientWithInvalidPool() (gas: 28891) -RewardManagerPayRecipientsTest:test_payRecipientsEmptyRecipientList() (gas: 25312) -RewardManagerPayRecipientsTest:test_payRecipientsWithInvalidPoolId() (gas: 31397) -RewardManagerPayRecipientsTest:test_paySingleRecipient() (gas: 84696) -RewardManagerPayRecipientsTest:test_paySubsetOfRecipientsInPool() (gas: 198477) -RewardManagerRecipientClaimDifferentWeightsTest:test_allRecipientsClaimingReceiveExpectedAmount() (gas: 280793) -RewardManagerRecipientClaimMultiplePoolsTest:test_claimAllRecipientsMultiplePools() (gas: 512369) -RewardManagerRecipientClaimMultiplePoolsTest:test_claimAllRecipientsSinglePool() (gas: 283589) -RewardManagerRecipientClaimMultiplePoolsTest:test_claimEmptyPoolWhenSecondPoolContainsFunds() (gas: 293418) -RewardManagerRecipientClaimMultiplePoolsTest:test_claimMultipleRecipientsMultiplePools() (gas: 263015) -RewardManagerRecipientClaimMultiplePoolsTest:test_claimMultipleRecipientsSinglePool() (gas: 154507) -RewardManagerRecipientClaimMultiplePoolsTest:test_claimSingleRecipientMultiplePools() (gas: 132623) -RewardManagerRecipientClaimMultiplePoolsTest:test_claimSingleUniqueRecipient() (gas: 106022) -RewardManagerRecipientClaimMultiplePoolsTest:test_claimUnevenAmountRoundsDown() (gas: 579532) -RewardManagerRecipientClaimMultiplePoolsTest:test_claimUnregisteredRecipient() (gas: 64626) -RewardManagerRecipientClaimMultiplePoolsTest:test_getAvailableRewardsCursorAndTotalPoolsEqual() (gas: 13051) +RewardManagerPayRecipientsTest:test_payAllRecipientsFromRecipientInPool() (gas: 249718) +RewardManagerPayRecipientsTest:test_payAllRecipientsWithAdditionalInvalidRecipient() (gas: 260922) +RewardManagerPayRecipientsTest:test_payAllRecipientsWithAdditionalUnregisteredRecipient() (gas: 264058) +RewardManagerPayRecipientsTest:test_payRecipientWithInvalidPool() (gas: 28549) +RewardManagerPayRecipientsTest:test_payRecipientsEmptyRecipientList() (gas: 24970) +RewardManagerPayRecipientsTest:test_payRecipientsWithInvalidPoolId() (gas: 31055) +RewardManagerPayRecipientsTest:test_paySingleRecipient() (gas: 84354) +RewardManagerPayRecipientsTest:test_paySubsetOfRecipientsInPool() (gas: 197451) +RewardManagerRecipientClaimDifferentWeightsTest:test_allRecipientsClaimingReceiveExpectedAmount() (gas: 279425) +RewardManagerRecipientClaimMultiplePoolsTest:test_claimAllRecipientsMultiplePools() (gas: 509891) +RewardManagerRecipientClaimMultiplePoolsTest:test_claimAllRecipientsSinglePool() (gas: 281811) +RewardManagerRecipientClaimMultiplePoolsTest:test_claimEmptyPoolWhenSecondPoolContainsFunds() (gas: 291640) +RewardManagerRecipientClaimMultiplePoolsTest:test_claimMultipleRecipientsMultiplePools() (gas: 261591) +RewardManagerRecipientClaimMultiplePoolsTest:test_claimMultipleRecipientsSinglePool() (gas: 153438) +RewardManagerRecipientClaimMultiplePoolsTest:test_claimSingleRecipientMultiplePools() (gas: 131915) +RewardManagerRecipientClaimMultiplePoolsTest:test_claimSingleUniqueRecipient() (gas: 105314) +RewardManagerRecipientClaimMultiplePoolsTest:test_claimUnevenAmountRoundsDown() (gas: 576291) +RewardManagerRecipientClaimMultiplePoolsTest:test_claimUnregisteredRecipient() (gas: 63557) +RewardManagerRecipientClaimMultiplePoolsTest:test_getAvailableRewardsCursorAndTotalPoolsEqual() (gas: 10202) RewardManagerRecipientClaimMultiplePoolsTest:test_getAvailableRewardsCursorCannotBeGreaterThanTotalPools() (gas: 12680) -RewardManagerRecipientClaimMultiplePoolsTest:test_getAvailableRewardsCursorSingleResult() (gas: 22448) -RewardManagerRecipientClaimMultiplePoolsTest:test_getRewardsAvailableToRecipientInBothPools() (gas: 32225) -RewardManagerRecipientClaimMultiplePoolsTest:test_getRewardsAvailableToRecipientInBothPoolsWhereAlreadyClaimed() (gas: 148553) -RewardManagerRecipientClaimMultiplePoolsTest:test_getRewardsAvailableToRecipientInNoPools() (gas: 21705) -RewardManagerRecipientClaimMultiplePoolsTest:test_getRewardsAvailableToRecipientInSinglePool() (gas: 27742) -RewardManagerRecipientClaimMultiplePoolsTest:test_recipientsClaimMultipleDeposits() (gas: 391245) -RewardManagerRecipientClaimMultiplePoolsTest:test_singleRecipientClaimMultipleDeposits() (gas: 137770) -RewardManagerRecipientClaimUnevenWeightTest:test_allRecipientsClaimingReceiveExpectedAmount() (gas: 199454) -RewardManagerRecipientClaimUnevenWeightTest:test_allRecipientsClaimingReceiveExpectedAmountWithSmallDeposit() (gas: 219327) +RewardManagerRecipientClaimMultiplePoolsTest:test_getAvailableRewardsCursorSingleResult() (gas: 19606) +RewardManagerRecipientClaimMultiplePoolsTest:test_getRewardsAvailableToRecipientInBothPools() (gas: 29052) +RewardManagerRecipientClaimMultiplePoolsTest:test_getRewardsAvailableToRecipientInBothPoolsWhereAlreadyClaimed() (gas: 147218) +RewardManagerRecipientClaimMultiplePoolsTest:test_getRewardsAvailableToRecipientInNoPools() (gas: 18532) +RewardManagerRecipientClaimMultiplePoolsTest:test_getRewardsAvailableToRecipientInSinglePool() (gas: 24569) +RewardManagerRecipientClaimMultiplePoolsTest:test_recipientsClaimMultipleDeposits() (gas: 387672) +RewardManagerRecipientClaimMultiplePoolsTest:test_singleRecipientClaimMultipleDeposits() (gas: 136332) +RewardManagerRecipientClaimUnevenWeightTest:test_allRecipientsClaimingReceiveExpectedAmount() (gas: 198399) +RewardManagerRecipientClaimUnevenWeightTest:test_allRecipientsClaimingReceiveExpectedAmountWithSmallDeposit() (gas: 218269) RewardManagerSetRecipientsTest:test_eventIsEmittedUponSetRecipients() (gas: 191729) RewardManagerSetRecipientsTest:test_setRecipientContainsDuplicateRecipients() (gas: 126082) RewardManagerSetRecipientsTest:test_setRewardRecipientFromManagerAddress() (gas: 193880) @@ -165,19 +253,19 @@ RewardManagerSetRecipientsTest:test_setRewardRecipients() (gas: 185589) RewardManagerSetRecipientsTest:test_setRewardRecipientsIsEmpty() (gas: 87113) RewardManagerSetRecipientsTest:test_setSingleRewardRecipient() (gas: 110371) RewardManagerSetupTest:test_eventEmittedUponFeeManagerUpdate() (gas: 21388) -RewardManagerSetupTest:test_eventEmittedUponFeePaid() (gas: 259132) +RewardManagerSetupTest:test_eventEmittedUponFeePaid() (gas: 259121) RewardManagerSetupTest:test_rejectsZeroLinkAddressOnConstruction() (gas: 59411) RewardManagerSetupTest:test_setFeeManagerZeroAddress() (gas: 17038) -RewardManagerUpdateRewardRecipientsMultiplePoolsTest:test_updatePrimaryRecipientWeights() (gas: 376628) -RewardManagerUpdateRewardRecipientsTest:test_eventIsEmittedUponUpdateRecipients() (gas: 280487) +RewardManagerUpdateRewardRecipientsMultiplePoolsTest:test_updatePrimaryRecipientWeights() (gas: 373525) +RewardManagerUpdateRewardRecipientsTest:test_eventIsEmittedUponUpdateRecipients() (gas: 279119) RewardManagerUpdateRewardRecipientsTest:test_onlyAdminCanUpdateRecipients() (gas: 19749) -RewardManagerUpdateRewardRecipientsTest:test_partialUpdateRecipientWeights() (gas: 220972) -RewardManagerUpdateRewardRecipientsTest:test_updateAllRecipientsWithSameAddressAndWeight() (gas: 274309) +RewardManagerUpdateRewardRecipientsTest:test_partialUpdateRecipientWeights() (gas: 218898) +RewardManagerUpdateRewardRecipientsTest:test_updateAllRecipientsWithSameAddressAndWeight() (gas: 272941) RewardManagerUpdateRewardRecipientsTest:test_updatePartialRecipientsToSubset() (gas: 254232) RewardManagerUpdateRewardRecipientsTest:test_updatePartialRecipientsWithExcessiveWeight() (gas: 259219) -RewardManagerUpdateRewardRecipientsTest:test_updatePartialRecipientsWithSameAddressAndWeight() (gas: 149916) +RewardManagerUpdateRewardRecipientsTest:test_updatePartialRecipientsWithSameAddressAndWeight() (gas: 148890) RewardManagerUpdateRewardRecipientsTest:test_updatePartialRecipientsWithUnderWeightSet() (gas: 259293) -RewardManagerUpdateRewardRecipientsTest:test_updateRecipientWeights() (gas: 372109) +RewardManagerUpdateRewardRecipientsTest:test_updateRecipientWeights() (gas: 369006) RewardManagerUpdateRewardRecipientsTest:test_updateRecipientWithNewZeroAddress() (gas: 270780) RewardManagerUpdateRewardRecipientsTest:test_updateRecipientsContainsDuplicateRecipients() (gas: 288575) RewardManagerUpdateRewardRecipientsTest:test_updateRecipientsToDifferentLargerSet() (gas: 407876) @@ -186,95 +274,95 @@ RewardManagerUpdateRewardRecipientsTest:test_updateRecipientsToDifferentSet() (g RewardManagerUpdateRewardRecipientsTest:test_updateRecipientsToDifferentSetWithInvalidWeights() (gas: 312122) RewardManagerUpdateRewardRecipientsTest:test_updateRecipientsUpdateAndRemoveExistingForLargerSet() (gas: 399699) RewardManagerUpdateRewardRecipientsTest:test_updateRecipientsUpdateAndRemoveExistingForSmallerSet() (gas: 289513) -VerificationdeactivateConfigWhenThereAreMultipleDigestsTest:test_correctlyRemovesAMiddleDigest() (gas: 27017) -VerificationdeactivateConfigWhenThereAreMultipleDigestsTest:test_correctlyRemovesTheFirstDigest() (gas: 26984) -VerificationdeactivateConfigWhenThereAreMultipleDigestsTest:test_correctlyUnsetsDigestsInSequence() (gas: 45102) +VerificationdeactivateConfigWhenThereAreMultipleDigestsTest:test_correctlyRemovesAMiddleDigest() (gas: 24177) +VerificationdeactivateConfigWhenThereAreMultipleDigestsTest:test_correctlyRemovesTheFirstDigest() (gas: 24144) +VerificationdeactivateConfigWhenThereAreMultipleDigestsTest:test_correctlyUnsetsDigestsInSequence() (gas: 44109) VerificationdeactivateConfigWhenThereAreMultipleDigestsTest:test_revertsIfCalledByNonOwner() (gas: 15016) VerificationdeactivateConfigWhenThereAreMultipleDigestsTest:test_revertsIfRemovingAnEmptyDigest() (gas: 10907) VerificationdeactivateConfigWhenThereAreMultipleDigestsTest:test_revertsIfRemovingAnNonExistentDigest() (gas: 13381) VerifierActivateConfigTest:test_revertsIfDigestIsEmpty() (gas: 10984) VerifierActivateConfigTest:test_revertsIfDigestNotSet() (gas: 13394) -VerifierActivateConfigTest:test_revertsIfNotOwner() (gas: 17182) -VerifierActivateConfigWithDeactivatedConfigTest:test_allowsVerification() (gas: 97175) +VerifierActivateConfigTest:test_revertsIfNotOwner() (gas: 17171) +VerifierActivateConfigWithDeactivatedConfigTest:test_allowsVerification() (gas: 97164) VerifierActivateFeedTest:test_revertsIfNoFeedExistsActivate() (gas: 13179) VerifierActivateFeedTest:test_revertsIfNoFeedExistsDeactivate() (gas: 13157) -VerifierActivateFeedTest:test_revertsIfNotOwnerActivateFeed() (gas: 17109) -VerifierActivateFeedTest:test_revertsIfNotOwnerDeactivateFeed() (gas: 17164) -VerifierBulkVerifyBillingReport:test_verifyMultiVersions() (gas: 476595) -VerifierBulkVerifyBillingReport:test_verifyMultiVersionsReturnsVerifiedReports() (gas: 474853) -VerifierBulkVerifyBillingReport:test_verifyWithBulkLink() (gas: 557541) -VerifierBulkVerifyBillingReport:test_verifyWithBulkNative() (gas: 560806) -VerifierBulkVerifyBillingReport:test_verifyWithBulkNativeUnwrapped() (gas: 568629) -VerifierBulkVerifyBillingReport:test_verifyWithBulkNativeUnwrappedReturnsChange() (gas: 575635) +VerifierActivateFeedTest:test_revertsIfNotOwnerActivateFeed() (gas: 17098) +VerifierActivateFeedTest:test_revertsIfNotOwnerDeactivateFeed() (gas: 17153) +VerifierBulkVerifyBillingReport:test_verifyMultiVersions() (gas: 475585) +VerifierBulkVerifyBillingReport:test_verifyMultiVersionsReturnsVerifiedReports() (gas: 681857) +VerifierBulkVerifyBillingReport:test_verifyWithBulkLink() (gas: 556863) +VerifierBulkVerifyBillingReport:test_verifyWithBulkNative() (gas: 560460) +VerifierBulkVerifyBillingReport:test_verifyWithBulkNativeUnwrapped() (gas: 567951) +VerifierBulkVerifyBillingReport:test_verifyWithBulkNativeUnwrappedReturnsChange() (gas: 574957) VerifierConstructorTest:test_revertsIfInitializedWithEmptyVerifierProxy() (gas: 59960) -VerifierConstructorTest:test_setsTheCorrectProperties() (gas: 1813269) -VerifierDeactivateFeedWithVerifyTest:test_currentReportAllowsVerification() (gas: 192073) -VerifierDeactivateFeedWithVerifyTest:test_currentReportFailsVerification() (gas: 113388) -VerifierDeactivateFeedWithVerifyTest:test_previousReportAllowsVerification() (gas: 99624) -VerifierDeactivateFeedWithVerifyTest:test_previousReportFailsVerification() (gas: 69943) -VerifierProxyAccessControlledVerificationTest:test_proxiesToTheVerifierIfHasAccess() (gas: 208529) -VerifierProxyAccessControlledVerificationTest:test_revertsIfNoAccess() (gas: 112345) -VerifierProxyConstructorTest:test_correctlySetsTheCorrectAccessControllerInterface() (gas: 1485359) -VerifierProxyConstructorTest:test_correctlySetsTheOwner() (gas: 1465483) -VerifierProxyConstructorTest:test_correctlySetsVersion() (gas: 9701) -VerifierProxyInitializeVerifierTest:test_revertsIfDigestAlreadySet() (gas: 54133) -VerifierProxyInitializeVerifierTest:test_revertsIfNotCorrectVerifier() (gas: 13613) -VerifierProxyInitializeVerifierTest:test_revertsIfNotOwner() (gas: 17168) -VerifierProxyInitializeVerifierTest:test_revertsIfVerifierAlreadyInitialized() (gas: 42047) -VerifierProxyInitializeVerifierTest:test_revertsIfZeroAddress() (gas: 10956) -VerifierProxyInitializeVerifierTest:test_setFeeManagerWhichDoesntHonourIERC165Interface() (gas: 13823) -VerifierProxyInitializeVerifierTest:test_setFeeManagerWhichDoesntHonourInterface() (gas: 16290) -VerifierProxyInitializeVerifierTest:test_setFeeManagerZeroAddress() (gas: 10933) -VerifierProxyInitializeVerifierTest:test_updatesVerifierIfVerifier() (gas: 54086) -VerifierProxySetAccessControllerTest:test_emitsTheCorrectEvent() (gas: 35348) -VerifierProxySetAccessControllerTest:test_revertsIfCalledByNonOwner() (gas: 15069) -VerifierProxySetAccessControllerTest:test_successfullySetsNewAccessController() (gas: 34921) -VerifierProxySetAccessControllerTest:test_successfullySetsNewAccessControllerIsEmpty() (gas: 15020) -VerifierProxyUnsetVerifierTest:test_revertsIfDigestDoesNotExist() (gas: 13149) -VerifierProxyUnsetVerifierTest:test_revertsIfNotAdmin() (gas: 14973) -VerifierProxyUnsetVerifierWithPreviouslySetVerifierTest:test_correctlyUnsetsVerifier() (gas: 15555) -VerifierProxyUnsetVerifierWithPreviouslySetVerifierTest:test_emitsAnEventAfterUnsettingVerifier() (gas: 17961) -VerifierProxyVerifyTest:test_proxiesToTheCorrectVerifier() (gas: 204342) -VerifierProxyVerifyTest:test_revertsIfNoVerifierConfigured() (gas: 117264) -VerifierSetConfigFromSourceMultipleDigestsTest:test_correctlySetsConfigWhenDigestsAreRemoved() (gas: 542302) -VerifierSetConfigFromSourceMultipleDigestsTest:test_correctlyUpdatesDigestsOnMultipleVerifiersInTheProxy() (gas: 967768) -VerifierSetConfigFromSourceMultipleDigestsTest:test_correctlyUpdatesTheDigestInTheProxy() (gas: 523251) +VerifierConstructorTest:test_setsTheCorrectProperties() (gas: 1808155) +VerifierDeactivateFeedWithVerifyTest:test_currentReportAllowsVerification() (gas: 192062) +VerifierDeactivateFeedWithVerifyTest:test_currentReportFailsVerification() (gas: 113377) +VerifierDeactivateFeedWithVerifyTest:test_previousReportAllowsVerification() (gas: 99613) +VerifierDeactivateFeedWithVerifyTest:test_previousReportFailsVerification() (gas: 69932) +VerifierProxyAccessControlledVerificationTest:test_proxiesToTheVerifierIfHasAccess() (gas: 205796) +VerifierProxyAccessControlledVerificationTest:test_revertsIfNoAccess() (gas: 112334) +VerifierProxyConstructorTest:test_correctlySetsTheCorrectAccessControllerInterface() (gas: 1482522) +VerifierProxyConstructorTest:test_correctlySetsTheOwner() (gas: 1462646) +VerifierProxyConstructorTest:test_correctlySetsVersion() (gas: 6873) +VerifierProxyInitializeVerifierTest:test_revertsIfDigestAlreadySet() (gas: 54108) +VerifierProxyInitializeVerifierTest:test_revertsIfNotCorrectVerifier() (gas: 13595) +VerifierProxyInitializeVerifierTest:test_revertsIfNotOwner() (gas: 17157) +VerifierProxyInitializeVerifierTest:test_revertsIfVerifierAlreadyInitialized() (gas: 42025) +VerifierProxyInitializeVerifierTest:test_revertsIfZeroAddress() (gas: 10948) +VerifierProxyInitializeVerifierTest:test_setFeeManagerWhichDoesntHonourIERC165Interface() (gas: 13815) +VerifierProxyInitializeVerifierTest:test_setFeeManagerWhichDoesntHonourInterface() (gas: 16301) +VerifierProxyInitializeVerifierTest:test_setFeeManagerZeroAddress() (gas: 10947) +VerifierProxyInitializeVerifierTest:test_updatesVerifierIfVerifier() (gas: 53406) +VerifierProxySetAccessControllerTest:test_emitsTheCorrectEvent() (gas: 35340) +VerifierProxySetAccessControllerTest:test_revertsIfCalledByNonOwner() (gas: 15061) +VerifierProxySetAccessControllerTest:test_successfullySetsNewAccessController() (gas: 32032) +VerifierProxySetAccessControllerTest:test_successfullySetsNewAccessControllerIsEmpty() (gas: 12131) +VerifierProxyUnsetVerifierTest:test_revertsIfDigestDoesNotExist() (gas: 13141) +VerifierProxyUnsetVerifierTest:test_revertsIfNotAdmin() (gas: 14965) +VerifierProxyUnsetVerifierWithPreviouslySetVerifierTest:test_correctlyUnsetsVerifier() (gas: 12720) +VerifierProxyUnsetVerifierWithPreviouslySetVerifierTest:test_emitsAnEventAfterUnsettingVerifier() (gas: 17965) +VerifierProxyVerifyTest:test_proxiesToTheCorrectVerifier() (gas: 201609) +VerifierProxyVerifyTest:test_revertsIfNoVerifierConfigured() (gas: 117256) +VerifierSetConfigFromSourceMultipleDigestsTest:test_correctlySetsConfigWhenDigestsAreRemoved() (gas: 538898) +VerifierSetConfigFromSourceMultipleDigestsTest:test_correctlyUpdatesDigestsOnMultipleVerifiersInTheProxy() (gas: 964730) +VerifierSetConfigFromSourceMultipleDigestsTest:test_correctlyUpdatesTheDigestInTheProxy() (gas: 520482) VerifierSetConfigFromSourceTest:test_revertsIfCalledByNonOwner() (gas: 183217) -VerifierSetConfigTest:test_correctlyUpdatesTheConfig() (gas: 1062438) +VerifierSetConfigTest:test_correctlyUpdatesTheConfig() (gas: 1057925) VerifierSetConfigTest:test_revertsIfCalledByNonOwner() (gas: 182986) VerifierSetConfigTest:test_revertsIfDuplicateSigners() (gas: 251561) VerifierSetConfigTest:test_revertsIfFaultToleranceIsZero() (gas: 176543) VerifierSetConfigTest:test_revertsIfNotEnoughSigners() (gas: 15828) VerifierSetConfigTest:test_revertsIfSetWithTooManySigners() (gas: 22213) VerifierSetConfigTest:test_revertsIfSignerContainsZeroAddress() (gas: 228034) -VerifierSetConfigWhenThereAreMultipleDigestsTest:test_correctlySetsConfigWhenDigestsAreRemoved() (gas: 542051) -VerifierSetConfigWhenThereAreMultipleDigestsTest:test_correctlyUpdatesDigestsOnMultipleVerifiersInTheProxy() (gas: 967257) -VerifierSetConfigWhenThereAreMultipleDigestsTest:test_correctlyUpdatesTheDigestInTheProxy() (gas: 522991) -VerifierSupportsInterfaceTest:test_falseIfIsNotCorrectInterface() (gas: 8421) -VerifierSupportsInterfaceTest:test_trueIfIsCorrectInterface() (gas: 8464) -VerifierTestBillingReport:test_verifyWithLink() (gas: 275293) -VerifierTestBillingReport:test_verifyWithNative() (gas: 316326) -VerifierTestBillingReport:test_verifyWithNativeUnwrapped() (gas: 318574) -VerifierTestBillingReport:test_verifyWithNativeUnwrappedReturnsChange() (gas: 325642) -VerifierVerifyMultipleConfigDigestTest:test_canVerifyNewerReportsWithNewerConfigs() (gas: 133961) -VerifierVerifyMultipleConfigDigestTest:test_canVerifyOlderReportsWithOlderConfigs() (gas: 189865) -VerifierVerifyMultipleConfigDigestTest:test_revertsIfAReportIsVerifiedWithAnExistingButIncorrectDigest() (gas: 88216) -VerifierVerifyMultipleConfigDigestTest:test_revertsIfVerifyingWithAnUnsetDigest() (gas: 128073) -VerifierVerifySingleConfigDigestTest:test_emitsAnEventIfReportVerified() (gas: 186956) -VerifierVerifySingleConfigDigestTest:test_returnsThePriceAndBlockNumIfReportVerified() (gas: 189847) -VerifierVerifySingleConfigDigestTest:test_revertsIfConfigDigestNotSet() (gas: 116141) -VerifierVerifySingleConfigDigestTest:test_revertsIfDuplicateSignersHaveSigned() (gas: 182326) -VerifierVerifySingleConfigDigestTest:test_revertsIfMismatchedSignatureLength() (gas: 53108) -VerifierVerifySingleConfigDigestTest:test_revertsIfReportHasUnconfiguredFeedID() (gas: 103987) +VerifierSetConfigWhenThereAreMultipleDigestsTest:test_correctlySetsConfigWhenDigestsAreRemoved() (gas: 538647) +VerifierSetConfigWhenThereAreMultipleDigestsTest:test_correctlyUpdatesDigestsOnMultipleVerifiersInTheProxy() (gas: 964219) +VerifierSetConfigWhenThereAreMultipleDigestsTest:test_correctlyUpdatesTheDigestInTheProxy() (gas: 520222) +VerifierSupportsInterfaceTest:test_falseIfIsNotCorrectInterface() (gas: 5590) +VerifierSupportsInterfaceTest:test_trueIfIsCorrectInterface() (gas: 5633) +VerifierTestBillingReport:test_verifyWithLink() (gas: 274948) +VerifierTestBillingReport:test_verifyWithNative() (gas: 315650) +VerifierTestBillingReport:test_verifyWithNativeUnwrapped() (gas: 317898) +VerifierTestBillingReport:test_verifyWithNativeUnwrappedReturnsChange() (gas: 324966) +VerifierVerifyMultipleConfigDigestTest:test_canVerifyNewerReportsWithNewerConfigs() (gas: 131228) +VerifierVerifyMultipleConfigDigestTest:test_canVerifyOlderReportsWithOlderConfigs() (gas: 187132) +VerifierVerifyMultipleConfigDigestTest:test_revertsIfAReportIsVerifiedWithAnExistingButIncorrectDigest() (gas: 88205) +VerifierVerifyMultipleConfigDigestTest:test_revertsIfVerifyingWithAnUnsetDigest() (gas: 128062) +VerifierVerifySingleConfigDigestTest:test_emitsAnEventIfReportVerified() (gas: 186945) +VerifierVerifySingleConfigDigestTest:test_returnsThePriceAndBlockNumIfReportVerified() (gas: 187114) +VerifierVerifySingleConfigDigestTest:test_revertsIfConfigDigestNotSet() (gas: 116130) +VerifierVerifySingleConfigDigestTest:test_revertsIfDuplicateSignersHaveSigned() (gas: 182315) +VerifierVerifySingleConfigDigestTest:test_revertsIfMismatchedSignatureLength() (gas: 53037) +VerifierVerifySingleConfigDigestTest:test_revertsIfReportHasUnconfiguredFeedID() (gas: 103976) VerifierVerifySingleConfigDigestTest:test_revertsIfVerifiedByNonProxy() (gas: 100992) -VerifierVerifySingleConfigDigestTest:test_revertsIfVerifiedWithIncorrectAddresses() (gas: 184077) -VerifierVerifySingleConfigDigestTest:test_revertsIfWrongNumberOfSigners() (gas: 110042) -VerifierVerifySingleConfigDigestTest:test_setsTheCorrectEpoch() (gas: 194592) -Verifier_accessControlledVerify:testVerifyWithAccessControl_gas() (gas: 212077) -Verifier_bulkVerifyWithFee:testBulkVerifyProxyWithLinkFeeSuccess_gas() (gas: 519389) -Verifier_bulkVerifyWithFee:testBulkVerifyProxyWithNativeFeeSuccess_gas() (gas: 542808) -Verifier_setConfig:testSetConfigSuccess_gas() (gas: 922616) -Verifier_verify:testVerifyProxySuccess_gas() (gas: 198742) -Verifier_verify:testVerifySuccess_gas() (gas: 186736) -Verifier_verifyWithFee:testVerifyProxyWithLinkFeeSuccess_gas() (gas: 238899) -Verifier_verifyWithFee:testVerifyProxyWithNativeFeeSuccess_gas() (gas: 257399) \ No newline at end of file +VerifierVerifySingleConfigDigestTest:test_revertsIfVerifiedWithIncorrectAddresses() (gas: 184066) +VerifierVerifySingleConfigDigestTest:test_revertsIfWrongNumberOfSigners() (gas: 110031) +VerifierVerifySingleConfigDigestTest:test_setsTheCorrectEpoch() (gas: 194270) +Verifier_accessControlledVerify:testVerifyWithAccessControl_gas() (gas: 212066) +Verifier_bulkVerifyWithFee:testBulkVerifyProxyWithLinkFeeSuccess_gas() (gas: 519378) +Verifier_bulkVerifyWithFee:testBulkVerifyProxyWithNativeFeeSuccess_gas() (gas: 542797) +Verifier_setConfig:testSetConfigSuccess_gas() (gas: 922684) +Verifier_verify:testVerifyProxySuccess_gas() (gas: 198731) +Verifier_verify:testVerifySuccess_gas() (gas: 186725) +Verifier_verifyWithFee:testVerifyProxyWithLinkFeeSuccess_gas() (gas: 238888) +Verifier_verifyWithFee:testVerifyProxyWithNativeFeeSuccess_gas() (gas: 257388) \ No newline at end of file diff --git a/contracts/scripts/native_solc_compile_all_llo-feeds b/contracts/scripts/native_solc_compile_all_llo-feeds index eb17f93b0de..0382f2f5c22 100755 --- a/contracts/scripts/native_solc_compile_all_llo-feeds +++ b/contracts/scripts/native_solc_compile_all_llo-feeds @@ -31,6 +31,7 @@ compileContract () { compileContract llo-feeds/Verifier.sol compileContract llo-feeds/VerifierProxy.sol compileContract llo-feeds/FeeManager.sol +compileContract llo-feeds/FeeManagerNoNative.sol compileContract llo-feeds/RewardManager.sol diff --git a/contracts/src/v0.8/llo-feeds/FeeManager.sol b/contracts/src/v0.8/llo-feeds/FeeManager.sol index 665940d4670..1c5f38c0883 100644 --- a/contracts/src/v0.8/llo-feeds/FeeManager.sol +++ b/contracts/src/v0.8/llo-feeds/FeeManager.sol @@ -173,7 +173,7 @@ contract FeeManager is IFeeManager, ConfirmedOwner, TypeAndVersionInterface { bytes calldata payload, bytes calldata parameterPayload, address subscriber - ) external payable override onlyProxy { + ) external payable virtual override onlyProxy { (Common.Asset memory fee, Common.Asset memory reward, uint256 appliedDiscount) = _processFee( payload, parameterPayload, @@ -200,7 +200,7 @@ contract FeeManager is IFeeManager, ConfirmedOwner, TypeAndVersionInterface { bytes[] calldata payloads, bytes calldata parameterPayload, address subscriber - ) external payable override onlyProxy { + ) external payable virtual override onlyProxy { FeeAndReward[] memory feesAndRewards = new IFeeManager.FeeAndReward[](payloads.length); //keep track of the number of fees to prevent over initialising the FeePayment array within _convertToLinkAndNativeFees diff --git a/contracts/src/v0.8/llo-feeds/FeeManagerNoNative.sol b/contracts/src/v0.8/llo-feeds/FeeManagerNoNative.sol new file mode 100644 index 00000000000..11d4bb3f635 --- /dev/null +++ b/contracts/src/v0.8/llo-feeds/FeeManagerNoNative.sol @@ -0,0 +1,99 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.19; + +import {IFeeManager} from "./interfaces/IFeeManager.sol"; +import {Common} from "./libraries/Common.sol"; +import {IERC20} from "../vendor/openzeppelin-solidity/v4.8.3/contracts/interfaces/IERC20.sol"; +import {SafeERC20} from "../vendor/openzeppelin-solidity/v4.8.3/contracts/token/ERC20/utils/SafeERC20.sol"; +import {FeeManager} from "./FeeManager.sol"; + +/** + * @title FeeManagerNoNative + * @author Michael Fletcher + * @author Austin Born + * @author TJ Cunha + * @notice This contract is a variation of the FeeManager contract, and adds a modifier blocks native billing to fee handling functions + */ +contract FeeManagerNoNative is FeeManager { + using SafeERC20 for IERC20; + + /// @notice thrown when trying to pay nativeFee with native, which is disallowed when we force wETH billing for nativeFee + error NativeBillingDisallowed(); + + modifier blockNativeBilling() { + if (msg.value != 0) revert NativeBillingDisallowed(); + _; + } + constructor( + address _linkAddress, + address _nativeAddress, + address _proxyAddress, + address _rewardManagerAddress + ) FeeManager(_linkAddress, _nativeAddress, _proxyAddress, _rewardManagerAddress) {} + + /// @inheritdoc FeeManager + function processFee( + bytes calldata payload, + bytes calldata parameterPayload, + address subscriber + ) external payable override onlyProxy blockNativeBilling { + (Common.Asset memory fee, Common.Asset memory reward, uint256 appliedDiscount) = _processFee( + payload, + parameterPayload, + subscriber + ); + + IFeeManager.FeeAndReward[] memory feeAndReward = new IFeeManager.FeeAndReward[](1); + feeAndReward[0] = IFeeManager.FeeAndReward(bytes32(payload), fee, reward, appliedDiscount); + + if (fee.assetAddress == i_linkAddress) { + _handleFeesAndRewards(subscriber, feeAndReward, 1, 0); + } else { + _handleFeesAndRewards(subscriber, feeAndReward, 0, 1); + } + } + + /// @inheritdoc FeeManager + function processFeeBulk( + bytes[] calldata payloads, + bytes calldata parameterPayload, + address subscriber + ) external payable override onlyProxy blockNativeBilling { + FeeAndReward[] memory feesAndRewards = new IFeeManager.FeeAndReward[](payloads.length); + + //keep track of the number of fees to prevent over initialising the FeePayment array within _convertToLinkAndNativeFees + uint256 numberOfLinkFees; + uint256 numberOfNativeFees; + + uint256 feesAndRewardsIndex; + for (uint256 i; i < payloads.length; ++i) { + (Common.Asset memory fee, Common.Asset memory reward, uint256 appliedDiscount) = _processFee( + payloads[i], + parameterPayload, + subscriber + ); + + if (fee.amount != 0) { + feesAndRewards[feesAndRewardsIndex++] = IFeeManager.FeeAndReward( + bytes32(payloads[i]), + fee, + reward, + appliedDiscount + ); + + unchecked { + //keep track of some tallys to make downstream calculations more efficient + if (fee.assetAddress == i_linkAddress) { + ++numberOfLinkFees; + } else { + ++numberOfNativeFees; + } + } + } + } + + if (numberOfLinkFees != 0 || numberOfNativeFees != 0) { + _handleFeesAndRewards(subscriber, feesAndRewards, numberOfLinkFees, numberOfNativeFees); + } + } +} diff --git a/contracts/src/v0.8/llo-feeds/test/fee-manager-no-native/BaseFeeManagerNoNative.t.sol b/contracts/src/v0.8/llo-feeds/test/fee-manager-no-native/BaseFeeManagerNoNative.t.sol new file mode 100644 index 00000000000..218b07a56e7 --- /dev/null +++ b/contracts/src/v0.8/llo-feeds/test/fee-manager-no-native/BaseFeeManagerNoNative.t.sol @@ -0,0 +1,380 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.19; + +import {Test} from "forge-std/Test.sol"; +import {FeeManagerNoNative} from "../../FeeManagerNoNative.sol"; +import {FeeManager} from "../../FeeManager.sol"; +import {RewardManager} from "../../RewardManager.sol"; +import {Common} from "../../libraries/Common.sol"; +import {ERC20Mock} from "../../../vendor/openzeppelin-solidity/v4.8.3/contracts/mocks/ERC20Mock.sol"; +import {WERC20Mock} from "../../../shared/mocks/WERC20Mock.sol"; +import {IRewardManager} from "../../interfaces/IRewardManager.sol"; +import {FeeManagerProxy} from "../mocks/FeeManagerProxy.sol"; + +/** + * @title BaseFeeManagerTest + * @author Michael Fletcher + * @notice Base class for all feeManager tests + * @dev This contract is intended to be inherited from and not used directly. It contains functionality to setup the feeManager + */ +contract BaseFeeManagerNoNativeTest is Test { + //contracts + FeeManagerNoNative internal feeManager; + RewardManager internal rewardManager; + FeeManagerProxy internal feeManagerProxy; + + ERC20Mock internal link; + WERC20Mock internal native; + + //erc20 config + uint256 internal constant DEFAULT_LINK_MINT_QUANTITY = 100 ether; + uint256 internal constant DEFAULT_NATIVE_MINT_QUANTITY = 100 ether; + + //contract owner + address internal constant INVALID_ADDRESS = address(0); + address internal constant ADMIN = address(uint160(uint256(keccak256("ADMIN")))); + address internal constant USER = address(uint160(uint256(keccak256("USER")))); + address internal constant PROXY = address(uint160(uint256(keccak256("PROXY")))); + + //version masks + bytes32 internal constant V_MASK = 0x0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; + bytes32 internal constant V1_BITMASK = 0x0001000000000000000000000000000000000000000000000000000000000000; + bytes32 internal constant V2_BITMASK = 0x0002000000000000000000000000000000000000000000000000000000000000; + bytes32 internal constant V3_BITMASK = 0x0003000000000000000000000000000000000000000000000000000000000000; + + //feed ids & config digests + bytes32 internal constant DEFAULT_FEED_1_V1 = (keccak256("ETH-USD") & V_MASK) | V1_BITMASK; + bytes32 internal constant DEFAULT_FEED_1_V2 = (keccak256("ETH-USD") & V_MASK) | V2_BITMASK; + bytes32 internal constant DEFAULT_FEED_1_V3 = (keccak256("ETH-USD") & V_MASK) | V3_BITMASK; + + bytes32 internal constant DEFAULT_FEED_2_V3 = (keccak256("LINK-USD") & V_MASK) | V3_BITMASK; + bytes32 internal constant DEFAULT_CONFIG_DIGEST = keccak256("DEFAULT_CONFIG_DIGEST"); + + //report + uint256 internal constant DEFAULT_REPORT_LINK_FEE = 1e10; + uint256 internal constant DEFAULT_REPORT_NATIVE_FEE = 1e12; + + //rewards + uint64 internal constant FEE_SCALAR = 1e18; + + address internal constant NATIVE_WITHDRAW_ADDRESS = address(0); + + //the selector for each error + bytes4 internal immutable INVALID_DISCOUNT_ERROR = FeeManager.InvalidDiscount.selector; + bytes4 internal immutable INVALID_ADDRESS_ERROR = FeeManager.InvalidAddress.selector; + bytes4 internal immutable INVALID_SURCHARGE_ERROR = FeeManager.InvalidSurcharge.selector; + bytes4 internal immutable EXPIRED_REPORT_ERROR = FeeManager.ExpiredReport.selector; + bytes4 internal immutable INVALID_QUOTE_ERROR = FeeManager.InvalidQuote.selector; + bytes4 internal immutable UNAUTHORIZED_ERROR = FeeManager.Unauthorized.selector; + bytes4 internal immutable NATIVE_BILLING_DISALLOWED = FeeManagerNoNative.NativeBillingDisallowed.selector; + bytes internal constant ONLY_CALLABLE_BY_OWNER_ERROR = "Only callable by owner"; + bytes internal constant INSUFFICIENT_ALLOWANCE_ERROR = "ERC20: insufficient allowance"; + bytes4 internal immutable ZERO_DEFICIT = FeeManager.ZeroDeficit.selector; + + //events emitted + event SubscriberDiscountUpdated(address indexed subscriber, bytes32 indexed feedId, address token, uint64 discount); + event NativeSurchargeUpdated(uint64 newSurcharge); + event InsufficientLink(IRewardManager.FeePayment[] feesAndRewards); + event Withdraw(address adminAddress, address recipient, address assetAddress, uint192 quantity); + event LinkDeficitCleared(bytes32 indexed configDigest, uint256 linkQuantity); + event DiscountApplied( + bytes32 indexed configDigest, + address indexed subscriber, + Common.Asset fee, + Common.Asset reward, + uint256 appliedDiscountQuantity + ); + + function setUp() public virtual { + //change to admin user + vm.startPrank(ADMIN); + + //init required contracts + _initializeContracts(); + } + + function _initializeContracts() internal { + link = new ERC20Mock("LINK", "LINK", ADMIN, 0); + native = new WERC20Mock(); + + feeManagerProxy = new FeeManagerProxy(); + rewardManager = new RewardManager(address(link)); + feeManager = new FeeManagerNoNative( + address(link), + address(native), + address(feeManagerProxy), + address(rewardManager) + ); + + //link the feeManager to the proxy + feeManagerProxy.setFeeManager(feeManager); + + //link the feeManager to the reward manager + rewardManager.setFeeManager(address(feeManager)); + + //mint some tokens to the admin + link.mint(ADMIN, DEFAULT_LINK_MINT_QUANTITY); + native.mint(ADMIN, DEFAULT_NATIVE_MINT_QUANTITY); + vm.deal(ADMIN, DEFAULT_NATIVE_MINT_QUANTITY); + + //mint some tokens to the user + link.mint(USER, DEFAULT_LINK_MINT_QUANTITY); + native.mint(USER, DEFAULT_NATIVE_MINT_QUANTITY); + vm.deal(USER, DEFAULT_NATIVE_MINT_QUANTITY); + + //mint some tokens to the proxy + link.mint(PROXY, DEFAULT_LINK_MINT_QUANTITY); + native.mint(PROXY, DEFAULT_NATIVE_MINT_QUANTITY); + vm.deal(PROXY, DEFAULT_NATIVE_MINT_QUANTITY); + } + + function setSubscriberDiscount( + address subscriber, + bytes32 feedId, + address token, + uint256 discount, + address sender + ) internal { + //record the current address and switch to the recipient + address originalAddr = msg.sender; + changePrank(sender); + + //set the discount + feeManager.updateSubscriberDiscount(subscriber, feedId, token, uint64(discount)); + + //change back to the original address + changePrank(originalAddr); + } + + function setNativeSurcharge(uint256 surcharge, address sender) public { + //record the current address and switch to the recipient + address originalAddr = msg.sender; + changePrank(sender); + + //set the surcharge + feeManager.setNativeSurcharge(uint64(surcharge)); + + //change back to the original address + changePrank(originalAddr); + } + + // solium-disable-next-line no-unused-vars + function getFee(bytes memory report, address quote, address subscriber) public view returns (Common.Asset memory) { + //get the fee + (Common.Asset memory fee, , ) = feeManager.getFeeAndReward(subscriber, report, quote); + + return fee; + } + + function getReward(bytes memory report, address quote, address subscriber) public view returns (Common.Asset memory) { + //get the reward + (, Common.Asset memory reward, ) = feeManager.getFeeAndReward(subscriber, report, quote); + + return reward; + } + + function getAppliedDiscount(bytes memory report, address quote, address subscriber) public view returns (uint256) { + //get the reward + (, , uint256 appliedDiscount) = feeManager.getFeeAndReward(subscriber, report, quote); + + return appliedDiscount; + } + + function getV1Report(bytes32 feedId) public pure returns (bytes memory) { + return abi.encode(feedId, uint32(0), int192(0), int192(0), int192(0), uint64(0), bytes32(0), uint64(0), uint64(0)); + } + + function getV2Report(bytes32 feedId) public view returns (bytes memory) { + return + abi.encode( + feedId, + uint32(0), + uint32(0), + uint192(DEFAULT_REPORT_NATIVE_FEE), + uint192(DEFAULT_REPORT_LINK_FEE), + uint32(block.timestamp), + int192(0) + ); + } + + function getV3Report(bytes32 feedId) public view returns (bytes memory) { + return + abi.encode( + feedId, + uint32(0), + uint32(0), + uint192(DEFAULT_REPORT_NATIVE_FEE), + uint192(DEFAULT_REPORT_LINK_FEE), + uint32(block.timestamp), + int192(0), + int192(0), + int192(0) + ); + } + + function getV3ReportWithCustomExpiryAndFee( + bytes32 feedId, + uint256 expiry, + uint256 linkFee, + uint256 nativeFee + ) public pure returns (bytes memory) { + return + abi.encode( + feedId, + uint32(0), + uint32(0), + uint192(nativeFee), + uint192(linkFee), + uint32(expiry), + int192(0), + int192(0), + int192(0) + ); + } + + function getLinkQuote() public view returns (address) { + return address(link); + } + + function getNativeQuote() public view returns (address) { + return address(native); + } + + function withdraw(address assetAddress, address recipient, uint256 amount, address sender) public { + //record the current address and switch to the recipient + address originalAddr = msg.sender; + changePrank(sender); + + //set the surcharge + feeManager.withdraw(assetAddress, recipient, uint192(amount)); + + //change back to the original address + changePrank(originalAddr); + } + + function getLinkBalance(address balanceAddress) public view returns (uint256) { + return link.balanceOf(balanceAddress); + } + + function getNativeBalance(address balanceAddress) public view returns (uint256) { + return native.balanceOf(balanceAddress); + } + + function getNativeUnwrappedBalance(address balanceAddress) public view returns (uint256) { + return balanceAddress.balance; + } + + function mintLink(address recipient, uint256 amount) public { + //record the current address and switch to the recipient + address originalAddr = msg.sender; + changePrank(ADMIN); + + //mint the link to the recipient + link.mint(recipient, amount); + + //change back to the original address + changePrank(originalAddr); + } + + function mintNative(address recipient, uint256 amount, address sender) public { + //record the current address and switch to the recipient + address originalAddr = msg.sender; + changePrank(sender); + + //mint the native to the recipient + native.mint(recipient, amount); + + //change back to the original address + changePrank(originalAddr); + } + + function issueUnwrappedNative(address recipient, uint256 quantity) public { + vm.deal(recipient, quantity); + } + + function ProcessFeeAsUser( + bytes memory payload, + address subscriber, + address tokenAddress, + uint256 wrappedNativeValue, + address sender + ) public { + //record the current address and switch to the recipient + address originalAddr = msg.sender; + changePrank(sender); + + //process the fee + feeManager.processFee{value: wrappedNativeValue}(payload, abi.encode(tokenAddress), subscriber); + + //change ProcessFeeAsUserback to the original address + changePrank(originalAddr); + } + + function processFee(bytes memory payload, address subscriber, address feeAddress) public { + //record the current address and switch to the recipient + address originalAddr = msg.sender; + changePrank(subscriber); + + //process the fee + feeManagerProxy.processFee(payload, abi.encode(feeAddress)); + + //change back to the original address + changePrank(originalAddr); + } + + function processFee(bytes[] memory payloads, address subscriber, address feeAddress) public { + //record the current address and switch to the recipient + address originalAddr = msg.sender; + changePrank(subscriber); + + //process the fee + feeManagerProxy.processFeeBulk(payloads, abi.encode(feeAddress)); + + //change back to the original address + changePrank(originalAddr); + } + + function getPayload(bytes memory reportPayload) public pure returns (bytes memory) { + return abi.encode([DEFAULT_CONFIG_DIGEST, 0, 0], reportPayload, new bytes32[](1), new bytes32[](1), bytes32("")); + } + + function approveLink(address spender, uint256 quantity, address sender) public { + //record the current address and switch to the recipient + address originalAddr = msg.sender; + changePrank(sender); + + //approve the link to be transferred + link.approve(spender, quantity); + + //change back to the original address + changePrank(originalAddr); + } + + function approveNative(address spender, uint256 quantity, address sender) public { + //record the current address and switch to the recipient + address originalAddr = msg.sender; + changePrank(sender); + + //approve the link to be transferred + native.approve(spender, quantity); + + //change back to the original address + changePrank(originalAddr); + } + + function payLinkDeficit(bytes32 configDigest, address sender) public { + //record the current address and switch to the recipient + address originalAddr = msg.sender; + changePrank(sender); + + //approve the link to be transferred + feeManager.payLinkDeficit(configDigest); + + //change back to the original address + changePrank(originalAddr); + } + + function getLinkDeficit(bytes32 configDigest) public view returns (uint256) { + return feeManager.s_linkDeficit(configDigest); + } +} diff --git a/contracts/src/v0.8/llo-feeds/test/fee-manager-no-native/FeeManagerNoNative.general.t.sol b/contracts/src/v0.8/llo-feeds/test/fee-manager-no-native/FeeManagerNoNative.general.t.sol new file mode 100644 index 00000000000..84943696b2a --- /dev/null +++ b/contracts/src/v0.8/llo-feeds/test/fee-manager-no-native/FeeManagerNoNative.general.t.sol @@ -0,0 +1,242 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.19; + +import "./BaseFeeManagerNoNative.t.sol"; + +/** + * @title BaseFeeManagerTest + * @author Michael Fletcher + * @notice This contract will test the setup functionality of the feemanager + */ +contract FeeManagerNoNativeProcessFeeTest is BaseFeeManagerNoNativeTest { + function setUp() public override { + super.setUp(); + } + + function test_WithdrawERC20() public { + //simulate a fee + mintLink(address(feeManager), DEFAULT_LINK_MINT_QUANTITY); + + //get the balances to ne used for comparison + uint256 contractBalance = getLinkBalance(address(feeManager)); + uint256 adminBalance = getLinkBalance(ADMIN); + + //the amount to withdraw + uint256 withdrawAmount = contractBalance / 2; + + //withdraw some balance + withdraw(address(link), ADMIN, withdrawAmount, ADMIN); + + //check the balance has been reduced + uint256 newContractBalance = getLinkBalance(address(feeManager)); + uint256 newAdminBalance = getLinkBalance(ADMIN); + + //check the balance is greater than zero + assertGt(newContractBalance, 0); + //check the balance has been reduced by the correct amount + assertEq(newContractBalance, contractBalance - withdrawAmount); + //check the admin balance has increased by the correct amount + assertEq(newAdminBalance, adminBalance + withdrawAmount); + } + + function test_WithdrawUnwrappedNative() public { + //issue funds straight to the contract to bypass the lack of fallback function + issueUnwrappedNative(address(feeManager), DEFAULT_NATIVE_MINT_QUANTITY); + + //get the balances to be used for comparison + uint256 contractBalance = getNativeUnwrappedBalance(address(feeManager)); + uint256 adminBalance = getNativeUnwrappedBalance(ADMIN); + + //the amount to withdraw + uint256 withdrawAmount = contractBalance / 2; + + //withdraw some balance + withdraw(NATIVE_WITHDRAW_ADDRESS, ADMIN, withdrawAmount, ADMIN); + + //check the balance has been reduced + uint256 newContractBalance = getNativeUnwrappedBalance(address(feeManager)); + uint256 newAdminBalance = getNativeUnwrappedBalance(ADMIN); + + //check the balance is greater than zero + assertGt(newContractBalance, 0); + //check the balance has been reduced by the correct amount + assertEq(newContractBalance, contractBalance - withdrawAmount); + //check the admin balance has increased by the correct amount + assertEq(newAdminBalance, adminBalance + withdrawAmount); + } + + function test_WithdrawNonAdminAddr() public { + //simulate a fee + mintLink(address(feeManager), DEFAULT_LINK_MINT_QUANTITY); + + //should revert if not admin + vm.expectRevert(ONLY_CALLABLE_BY_OWNER_ERROR); + + //withdraw some balance + withdraw(address(link), ADMIN, DEFAULT_LINK_MINT_QUANTITY, USER); + } + + function test_eventIsEmittedAfterSurchargeIsSet() public { + //native surcharge + uint64 nativeSurcharge = FEE_SCALAR / 5; + + //expect an emit + vm.expectEmit(); + + //emit the event that is expected to be emitted + emit NativeSurchargeUpdated(nativeSurcharge); + + //set the surcharge + setNativeSurcharge(nativeSurcharge, ADMIN); + } + + function test_subscriberDiscountEventIsEmittedOnUpdate() public { + //native surcharge + uint64 discount = FEE_SCALAR / 3; + + //an event should be emitted + vm.expectEmit(); + + //emit the event that is expected to be emitted + emit SubscriberDiscountUpdated(USER, DEFAULT_FEED_1_V3, address(native), discount); + + //set the surcharge + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(native), discount, ADMIN); + } + + function test_eventIsEmittedUponWithdraw() public { + //simulate a fee + mintLink(address(feeManager), DEFAULT_LINK_MINT_QUANTITY); + + //the amount to withdraw + uint192 withdrawAmount = 1; + + //expect an emit + vm.expectEmit(); + + //the event to be emitted + emit Withdraw(ADMIN, ADMIN, address(link), withdrawAmount); + + //withdraw some balance + withdraw(address(link), ADMIN, withdrawAmount, ADMIN); + } + + function test_linkAvailableForPaymentReturnsLinkBalance() public { + //simulate a deposit of link for the conversion pool + mintLink(address(feeManager), DEFAULT_REPORT_LINK_FEE); + + //check there's a balance + assertGt(getLinkBalance(address(feeManager)), 0); + + //check the link available for payment is the link balance + assertEq(feeManager.linkAvailableForPayment(), getLinkBalance(address(feeManager))); + } + + function test_payLinkDeficit() public { + //get the default payload + bytes memory payload = getPayload(getV2Report(DEFAULT_FEED_1_V3)); + + approveNative(address(feeManager), DEFAULT_REPORT_NATIVE_FEE, USER); + + //not enough funds in the reward pool should trigger an insufficient link event + vm.expectEmit(); + + IRewardManager.FeePayment[] memory contractFees = new IRewardManager.FeePayment[](1); + contractFees[0] = IRewardManager.FeePayment(DEFAULT_CONFIG_DIGEST, uint192(DEFAULT_REPORT_LINK_FEE)); + + emit InsufficientLink(contractFees); + + //process the fee + processFee(payload, USER, address(native)); + + //double check the rewardManager balance is 0 + assertEq(getLinkBalance(address(rewardManager)), 0); + + //simulate a deposit of link to cover the deficit + mintLink(address(feeManager), DEFAULT_REPORT_LINK_FEE); + + vm.expectEmit(); + emit LinkDeficitCleared(DEFAULT_CONFIG_DIGEST, DEFAULT_REPORT_LINK_FEE); + + //pay the deficit which will transfer link from the rewardManager to the rewardManager + payLinkDeficit(DEFAULT_CONFIG_DIGEST, ADMIN); + + //check the rewardManager received the link + assertEq(getLinkBalance(address(rewardManager)), DEFAULT_REPORT_LINK_FEE); + } + + function test_payLinkDeficitTwice() public { + //get the default payload + bytes memory payload = getPayload(getV2Report(DEFAULT_FEED_1_V3)); + + approveNative(address(feeManager), DEFAULT_REPORT_NATIVE_FEE, USER); + + //not enough funds in the reward pool should trigger an insufficient link event + vm.expectEmit(); + + IRewardManager.FeePayment[] memory contractFees = new IRewardManager.FeePayment[](1); + contractFees[0] = IRewardManager.FeePayment(DEFAULT_CONFIG_DIGEST, uint192(DEFAULT_REPORT_LINK_FEE)); + + //emit the event that is expected to be emitted + emit InsufficientLink(contractFees); + + //process the fee + processFee(payload, USER, address(native)); + + //double check the rewardManager balance is 0 + assertEq(getLinkBalance(address(rewardManager)), 0); + + //simulate a deposit of link to cover the deficit + mintLink(address(feeManager), DEFAULT_REPORT_LINK_FEE); + + vm.expectEmit(); + emit LinkDeficitCleared(DEFAULT_CONFIG_DIGEST, DEFAULT_REPORT_LINK_FEE); + + //pay the deficit which will transfer link from the rewardManager to the rewardManager + payLinkDeficit(DEFAULT_CONFIG_DIGEST, ADMIN); + + //check the rewardManager received the link + assertEq(getLinkBalance(address(rewardManager)), DEFAULT_REPORT_LINK_FEE); + + //paying again should revert with 0 + vm.expectRevert(ZERO_DEFICIT); + + payLinkDeficit(DEFAULT_CONFIG_DIGEST, ADMIN); + } + + function test_payLinkDeficitPaysAllFeesProcessed() public { + //get the default payload + bytes memory payload = getPayload(getV2Report(DEFAULT_FEED_1_V3)); + + //approve the native to be transferred from the user + approveNative(address(feeManager), DEFAULT_REPORT_NATIVE_FEE * 2, USER); + + //processing the fee will transfer the native from the user to the feeManager + processFee(payload, USER, address(native)); + processFee(payload, USER, address(native)); + + //check the deficit has been increased twice + assertEq(getLinkDeficit(DEFAULT_CONFIG_DIGEST), DEFAULT_REPORT_LINK_FEE * 2); + + //double check the rewardManager balance is 0 + assertEq(getLinkBalance(address(rewardManager)), 0); + + //simulate a deposit of link to cover the deficit + mintLink(address(feeManager), DEFAULT_REPORT_LINK_FEE * 2); + + vm.expectEmit(); + emit LinkDeficitCleared(DEFAULT_CONFIG_DIGEST, DEFAULT_REPORT_LINK_FEE * 2); + + //pay the deficit which will transfer link from the rewardManager to the rewardManager + payLinkDeficit(DEFAULT_CONFIG_DIGEST, ADMIN); + + //check the rewardManager received the link + assertEq(getLinkBalance(address(rewardManager)), DEFAULT_REPORT_LINK_FEE * 2); + } + + function test_payLinkDeficitOnlyCallableByAdmin() public { + vm.expectRevert(ONLY_CALLABLE_BY_OWNER_ERROR); + + payLinkDeficit(DEFAULT_CONFIG_DIGEST, USER); + } +} diff --git a/contracts/src/v0.8/llo-feeds/test/fee-manager-no-native/FeeManagerNoNative.getFeeAndReward.t.sol b/contracts/src/v0.8/llo-feeds/test/fee-manager-no-native/FeeManagerNoNative.getFeeAndReward.t.sol new file mode 100644 index 00000000000..b5716ea8e0a --- /dev/null +++ b/contracts/src/v0.8/llo-feeds/test/fee-manager-no-native/FeeManagerNoNative.getFeeAndReward.t.sol @@ -0,0 +1,606 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.19; + +import {Common} from "../../libraries/Common.sol"; +import "./BaseFeeManagerNoNative.t.sol"; + +/** + * @title BaseFeeManagerTest + * @author Michael Fletcher + * @notice This contract will test the functionality of the feeManager's getFeeAndReward + */ +contract FeeManagerNoNativeGetFeeAndRewardTest is BaseFeeManagerNoNativeTest { + function test_baseFeeIsAppliedForNative() public { + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //fee should be the default + assertEq(fee.amount, DEFAULT_REPORT_NATIVE_FEE); + } + + function test_baseFeeIsAppliedForLink() public { + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getLinkQuote(), USER); + + //fee should be the default + assertEq(fee.amount, DEFAULT_REPORT_LINK_FEE); + } + + function test_discountAIsNotAppliedWhenSetForOtherUsers() public { + //set the subscriber discount for another user + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(link), FEE_SCALAR / 2, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), INVALID_ADDRESS); + + //fee should be the default + assertEq(fee.amount, DEFAULT_REPORT_NATIVE_FEE); + } + + function test_discountIsNotAppliedForInvalidTokenAddress() public { + //should revert with invalid address as it's not a configured token + vm.expectRevert(INVALID_ADDRESS_ERROR); + + //set the subscriber discount for another user + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, INVALID_ADDRESS, FEE_SCALAR / 2, ADMIN); + } + + function test_discountIsAppliedForLink() public { + //set the subscriber discount to 50% + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(link), FEE_SCALAR / 2, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getLinkQuote(), USER); + + //fee should be half the default + assertEq(fee.amount, DEFAULT_REPORT_LINK_FEE / 2); + } + + function test_DiscountIsAppliedForNative() public { + //set the subscriber discount to 50% + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(native), FEE_SCALAR / 2, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //fee should be half the default + assertEq(fee.amount, DEFAULT_REPORT_NATIVE_FEE / 2); + } + + function test_discountIsNoLongerAppliedAfterRemoving() public { + //set the subscriber discount to 50% + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(link), FEE_SCALAR / 2, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getLinkQuote(), USER); + + //fee should be half the default + assertEq(fee.amount, DEFAULT_REPORT_LINK_FEE / 2); + + //remove the discount + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(link), 0, ADMIN); + + //get the fee required by the feeManager + fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getLinkQuote(), USER); + + //fee should be the default + assertEq(fee.amount, DEFAULT_REPORT_LINK_FEE); + } + + function test_surchargeIsApplied() public { + //native surcharge + uint256 nativeSurcharge = FEE_SCALAR / 5; + + //set the surcharge + setNativeSurcharge(nativeSurcharge, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //calculate the expected surcharge + uint256 expectedSurcharge = ((DEFAULT_REPORT_NATIVE_FEE * nativeSurcharge) / FEE_SCALAR); + + //expected fee should the base fee offset by the surcharge and discount + assertEq(fee.amount, DEFAULT_REPORT_NATIVE_FEE + expectedSurcharge); + } + + function test_surchargeIsNotAppliedForLinkFee() public { + //native surcharge + uint256 nativeSurcharge = FEE_SCALAR / 5; + + //set the surcharge + setNativeSurcharge(nativeSurcharge, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getLinkQuote(), USER); + + //fee should be the default + assertEq(fee.amount, DEFAULT_REPORT_LINK_FEE); + } + + function test_surchargeIsNoLongerAppliedAfterRemoving() public { + //native surcharge + uint256 nativeSurcharge = FEE_SCALAR / 5; + + //set the surcharge + setNativeSurcharge(nativeSurcharge, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //calculate the expected surcharge + uint256 expectedSurcharge = ((DEFAULT_REPORT_NATIVE_FEE * nativeSurcharge) / FEE_SCALAR); + + //expected fee should be the base fee offset by the surcharge and discount + assertEq(fee.amount, DEFAULT_REPORT_NATIVE_FEE + expectedSurcharge); + + //remove the surcharge + setNativeSurcharge(0, ADMIN); + + //get the fee required by the feeManager + fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //fee should be the default + assertEq(fee.amount, DEFAULT_REPORT_NATIVE_FEE); + } + + function test_feeIsUpdatedAfterNewSurchargeIsApplied() public { + //native surcharge + uint256 nativeSurcharge = FEE_SCALAR / 5; + + //set the surcharge + setNativeSurcharge(nativeSurcharge, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //calculate the expected surcharge + uint256 expectedSurcharge = ((DEFAULT_REPORT_NATIVE_FEE * nativeSurcharge) / FEE_SCALAR); + + //expected fee should the base fee offset by the surcharge and discount + assertEq(fee.amount, DEFAULT_REPORT_NATIVE_FEE + expectedSurcharge); + + //change the surcharge + setNativeSurcharge(nativeSurcharge, ADMIN); + + //get the fee required by the feeManager + fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //calculate the expected surcharge + expectedSurcharge = ((DEFAULT_REPORT_NATIVE_FEE * nativeSurcharge) / FEE_SCALAR); + + //expected fee should the base fee offset by the surcharge and discount + assertEq(fee.amount, DEFAULT_REPORT_NATIVE_FEE + expectedSurcharge); + } + + function test_surchargeIsAppliedForNativeFeeWithDiscount() public { + //native surcharge + uint256 nativeSurcharge = FEE_SCALAR / 5; + + //set the subscriber discount to 50% + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(native), FEE_SCALAR / 2, ADMIN); + + //set the surcharge + setNativeSurcharge(nativeSurcharge, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //calculate the expected surcharge quantity + uint256 expectedSurcharge = ((DEFAULT_REPORT_NATIVE_FEE * nativeSurcharge) / FEE_SCALAR); + + //calculate the expected discount quantity + uint256 expectedDiscount = ((DEFAULT_REPORT_NATIVE_FEE + expectedSurcharge) / 2); + + //expected fee should the base fee offset by the surcharge and discount + assertEq(fee.amount, DEFAULT_REPORT_NATIVE_FEE + expectedSurcharge - expectedDiscount); + } + + function test_emptyQuoteRevertsWithError() public { + //expect a revert + vm.expectRevert(INVALID_QUOTE_ERROR); + + //get the fee required by the feeManager + getFee(getV3Report(DEFAULT_FEED_1_V3), address(0), USER); + } + + function test_nativeSurcharge100Percent() public { + //set the surcharge + setNativeSurcharge(FEE_SCALAR, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //fee should be twice the base fee + assertEq(fee.amount, DEFAULT_REPORT_NATIVE_FEE * 2); + } + + function test_nativeSurcharge0Percent() public { + //set the surcharge + setNativeSurcharge(0, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //fee should base fee + assertEq(fee.amount, DEFAULT_REPORT_NATIVE_FEE); + } + + function test_nativeSurchargeCannotExceed100Percent() public { + //should revert if surcharge is greater than 100% + vm.expectRevert(INVALID_SURCHARGE_ERROR); + + //set the surcharge above the max + setNativeSurcharge(FEE_SCALAR + 1, ADMIN); + } + + function test_discountIsAppliedWith100PercentSurcharge() public { + //set the subscriber discount to 50% + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(native), FEE_SCALAR / 2, ADMIN); + + //set the surcharge + setNativeSurcharge(FEE_SCALAR, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //calculate the expected discount quantity + uint256 expectedDiscount = DEFAULT_REPORT_NATIVE_FEE; + + //fee should be twice the surcharge minus the discount + assertEq(fee.amount, DEFAULT_REPORT_NATIVE_FEE * 2 - expectedDiscount); + } + + function test_feeIsZeroWith100PercentDiscount() public { + //set the subscriber discount to 100% + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(native), FEE_SCALAR, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //fee should be zero + assertEq(fee.amount, 0); + } + + function test_feeIsUpdatedAfterDiscountIsRemoved() public { + //set the subscriber discount to 50% + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(native), FEE_SCALAR / 2, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //calculate the expected discount quantity + uint256 expectedDiscount = DEFAULT_REPORT_NATIVE_FEE / 2; + + //fee should be 50% of the base fee + assertEq(fee.amount, DEFAULT_REPORT_NATIVE_FEE - expectedDiscount); + + //remove the discount + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(native), 0, ADMIN); + + //get the fee required by the feeManager + fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //fee should be the base fee + assertEq(fee.amount, DEFAULT_REPORT_NATIVE_FEE); + } + + function test_feeIsUpdatedAfterNewDiscountIsApplied() public { + //set the subscriber discount to 50% + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(native), FEE_SCALAR / 2, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //calculate the expected discount quantity + uint256 expectedDiscount = DEFAULT_REPORT_NATIVE_FEE / 2; + + //fee should be 50% of the base fee + assertEq(fee.amount, DEFAULT_REPORT_NATIVE_FEE - expectedDiscount); + + //change the discount to 25% + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(native), FEE_SCALAR / 4, ADMIN); + + //get the fee required by the feeManager + fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //expected discount is now 25% + expectedDiscount = DEFAULT_REPORT_NATIVE_FEE / 4; + + //fee should be the base fee minus the expected discount + assertEq(fee.amount, DEFAULT_REPORT_NATIVE_FEE - expectedDiscount); + } + + function test_setDiscountOver100Percent() public { + //should revert with invalid discount + vm.expectRevert(INVALID_DISCOUNT_ERROR); + + //set the subscriber discount to over 100% + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(native), FEE_SCALAR + 1, ADMIN); + } + + function test_surchargeIsNotAppliedWith100PercentDiscount() public { + //native surcharge + uint256 nativeSurcharge = FEE_SCALAR / 5; + + //set the subscriber discount to 100% + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(native), FEE_SCALAR, ADMIN); + + //set the surcharge + setNativeSurcharge(nativeSurcharge, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //fee should be zero + assertEq(fee.amount, 0); + } + + function test_nonAdminUserCanNotSetDiscount() public { + //should revert with unauthorized + vm.expectRevert(ONLY_CALLABLE_BY_OWNER_ERROR); + + //set the subscriber discount to 50% + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(native), FEE_SCALAR, USER); + } + + function test_surchargeFeeRoundsUpWhenUneven() public { + //native surcharge + uint256 nativeSurcharge = FEE_SCALAR / 3; + + //set the surcharge + setNativeSurcharge(nativeSurcharge, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //calculate the expected surcharge quantity + uint256 expectedSurcharge = (DEFAULT_REPORT_NATIVE_FEE * nativeSurcharge) / FEE_SCALAR; + + //expected fee should the base fee offset by the expected surcharge + assertEq(fee.amount, DEFAULT_REPORT_NATIVE_FEE + expectedSurcharge + 1); + } + + function test_discountFeeRoundsDownWhenUneven() public { + //native surcharge + uint256 discount = FEE_SCALAR / 3; + + //set the subscriber discount to 33.333% + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(native), discount, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //calculate the expected quantity + uint256 expectedDiscount = ((DEFAULT_REPORT_NATIVE_FEE * discount) / FEE_SCALAR); + + //expected fee should the base fee offset by the expected surcharge + assertEq(fee.amount, DEFAULT_REPORT_NATIVE_FEE - expectedDiscount); + } + + function test_reportWithNoExpiryOrFeeReturnsZero() public { + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV1Report(DEFAULT_FEED_1_V1), getNativeQuote(), USER); + + //fee should be zero + assertEq(fee.amount, 0); + } + + function test_correctDiscountIsAppliedWhenBothTokensAreDiscounted() public { + //set the subscriber and native discounts + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(link), FEE_SCALAR / 4, ADMIN); + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(native), FEE_SCALAR / 2, ADMIN); + + //get the fee required by the feeManager for both tokens + Common.Asset memory linkFee = getFee(getV3Report(DEFAULT_FEED_1_V3), getLinkQuote(), USER); + Common.Asset memory nativeFee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //calculate the expected discount quantity for each token + uint256 expectedDiscountLink = (DEFAULT_REPORT_LINK_FEE * FEE_SCALAR) / 4 / FEE_SCALAR; + uint256 expectedDiscountNative = (DEFAULT_REPORT_NATIVE_FEE * FEE_SCALAR) / 2 / FEE_SCALAR; + + //check the fee calculation for each token + assertEq(linkFee.amount, DEFAULT_REPORT_LINK_FEE - expectedDiscountLink); + assertEq(nativeFee.amount, DEFAULT_REPORT_NATIVE_FEE - expectedDiscountNative); + } + + function test_discountIsNotAppliedToOtherFeeds() public { + //set the subscriber discount to 50% + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(native), FEE_SCALAR / 2, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_2_V3), getNativeQuote(), USER); + + //fee should be the base fee + assertEq(fee.amount, DEFAULT_REPORT_NATIVE_FEE); + } + + function test_noFeeIsAppliedWhenReportHasZeroFee() public { + //set the subscriber discount to 50% + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(native), FEE_SCALAR / 2, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee( + getV3ReportWithCustomExpiryAndFee(DEFAULT_FEED_1_V3, uint32(block.timestamp), 0, 0), + getNativeQuote(), + USER + ); + + //fee should be zero + assertEq(fee.amount, 0); + } + + function test_noFeeIsAppliedWhenReportHasZeroFeeAndDiscountAndSurchargeIsSet() public { + //set the subscriber discount to 50% + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(native), FEE_SCALAR / 2, ADMIN); + + //set the surcharge + setNativeSurcharge(FEE_SCALAR / 2, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee( + getV3ReportWithCustomExpiryAndFee(DEFAULT_FEED_1_V3, uint32(block.timestamp), 0, 0), + getNativeQuote(), + USER + ); + + //fee should be zero + assertEq(fee.amount, 0); + } + + function test_nativeSurchargeEventIsEmittedOnUpdate() public { + //native surcharge + uint64 nativeSurcharge = FEE_SCALAR / 3; + + //an event should be emitted + vm.expectEmit(); + + //emit the event that is expected to be emitted + emit NativeSurchargeUpdated(nativeSurcharge); + + //set the surcharge + setNativeSurcharge(nativeSurcharge, ADMIN); + } + + function test_getBaseRewardWithLinkQuote() public { + //get the fee required by the feeManager + Common.Asset memory reward = getReward(getV3Report(DEFAULT_FEED_1_V3), getLinkQuote(), USER); + + //the reward should equal the base fee + assertEq(reward.amount, DEFAULT_REPORT_LINK_FEE); + } + + function test_getRewardWithLinkQuoteAndLinkDiscount() public { + //set the link discount + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(link), FEE_SCALAR / 2, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory reward = getReward(getV3Report(DEFAULT_FEED_1_V3), getLinkQuote(), USER); + + //the reward should equal the discounted base fee + assertEq(reward.amount, DEFAULT_REPORT_LINK_FEE / 2); + } + + function test_getRewardWithNativeQuote() public { + //get the fee required by the feeManager + Common.Asset memory reward = getReward(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //the reward should equal the base fee in link + assertEq(reward.amount, DEFAULT_REPORT_LINK_FEE); + } + + function test_getRewardWithNativeQuoteAndSurcharge() public { + //set the native surcharge + setNativeSurcharge(FEE_SCALAR / 2, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory reward = getReward(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //the reward should equal the base fee in link regardless of the surcharge + assertEq(reward.amount, DEFAULT_REPORT_LINK_FEE); + } + + function test_getRewardWithLinkDiscount() public { + //set the link discount + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(link), FEE_SCALAR / 2, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory reward = getReward(getV3Report(DEFAULT_FEED_1_V3), getLinkQuote(), USER); + + //the reward should equal the discounted base fee + assertEq(reward.amount, DEFAULT_REPORT_LINK_FEE / 2); + } + + function test_getLinkFeeIsRoundedUp() public { + //set the link discount + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(link), FEE_SCALAR / 3, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getLinkQuote(), USER); + + //the reward should equal .66% + 1 of the base fee due to a 33% discount rounded up + assertEq(fee.amount, (DEFAULT_REPORT_LINK_FEE * 2) / 3 + 1); + } + + function test_getLinkRewardIsSameAsFee() public { + //set the link discount + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(link), FEE_SCALAR / 3, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getLinkQuote(), USER); + Common.Asset memory reward = getReward(getV3Report(DEFAULT_FEED_1_V3), getLinkQuote(), USER); + + //check the reward is in link + assertEq(fee.assetAddress, address(link)); + + //the reward should equal .66% of the base fee due to a 33% discount rounded down + assertEq(reward.amount, fee.amount); + } + + function test_getLinkRewardWithNativeQuoteAndSurchargeWithLinkDiscount() public { + //set the native surcharge + setNativeSurcharge(FEE_SCALAR / 2, ADMIN); + + //set the link discount + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(link), FEE_SCALAR / 3, ADMIN); + + //get the fee required by the feeManager + Common.Asset memory reward = getReward(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //the reward should equal the base fee in link regardless of the surcharge + assertEq(reward.amount, DEFAULT_REPORT_LINK_FEE); + } + + function test_testRevertIfReportHasExpired() public { + //expect a revert + vm.expectRevert(EXPIRED_REPORT_ERROR); + + //get the fee required by the feeManager + getFee( + getV3ReportWithCustomExpiryAndFee( + DEFAULT_FEED_1_V3, + block.timestamp - 1, + DEFAULT_REPORT_LINK_FEE, + DEFAULT_REPORT_NATIVE_FEE + ), + getNativeQuote(), + USER + ); + } + + function test_discountIsReturnedForLink() public { + //set the subscriber discount to 50% + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(link), FEE_SCALAR / 2, ADMIN); + + //get the fee applied + uint256 discount = getAppliedDiscount(getV3Report(DEFAULT_FEED_1_V3), getLinkQuote(), USER); + + //fee should be half the default + assertEq(discount, FEE_SCALAR / 2); + } + + function test_DiscountIsReturnedForNative() public { + //set the subscriber discount to 50% + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(native), FEE_SCALAR / 2, ADMIN); + + //get the discount applied + uint256 discount = getAppliedDiscount(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //fee should be half the default + assertEq(discount, FEE_SCALAR / 2); + } + + function test_DiscountIsReturnedForNativeWithSurcharge() public { + //set the subscriber discount to 50% + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(native), FEE_SCALAR / 2, ADMIN); + + //set the surcharge + setNativeSurcharge(FEE_SCALAR / 5, ADMIN); + + //get the discount applied + uint256 discount = getAppliedDiscount(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + //fee should be half the default + assertEq(discount, FEE_SCALAR / 2); + } +} diff --git a/contracts/src/v0.8/llo-feeds/test/fee-manager-no-native/FeeManagerNoNative.processFee.t.sol b/contracts/src/v0.8/llo-feeds/test/fee-manager-no-native/FeeManagerNoNative.processFee.t.sol new file mode 100644 index 00000000000..9d82e66d06d --- /dev/null +++ b/contracts/src/v0.8/llo-feeds/test/fee-manager-no-native/FeeManagerNoNative.processFee.t.sol @@ -0,0 +1,481 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.19; + +import {Common} from "../../libraries/Common.sol"; + +import "./BaseFeeManagerNoNative.t.sol"; +import {IRewardManager} from "../../interfaces/IRewardManager.sol"; + +/** + * @title BaseFeeManagerTest + * @author Michael Fletcher + * @notice This contract will test the functionality of the feeManager processFee + */ +contract FeeManagerNoNativeProcessFeeTest is BaseFeeManagerNoNativeTest { + function setUp() public override { + super.setUp(); + } + + function test_nonAdminProxyUserCannotProcessFee() public { + //get the default payload + bytes memory payload = getPayload(getV3Report(DEFAULT_FEED_1_V3)); + + //should revert as the user is not the owner + vm.expectRevert(UNAUTHORIZED_ERROR); + + //process the fee + ProcessFeeAsUser(payload, USER, address(link), 0, USER); + } + + function test_processFeeAsProxy() public { + //get the default payload + bytes memory payload = getPayload(getV3Report(DEFAULT_FEED_1_V3)); + + //approve the link to be transferred from the from the subscriber to the rewardManager + approveLink(address(rewardManager), DEFAULT_REPORT_LINK_FEE, USER); + + //processing the fee will transfer the link from the user to the rewardManager + processFee(payload, USER, address(link)); + + //check the link has been transferred + assertEq(getLinkBalance(address(rewardManager)), DEFAULT_REPORT_LINK_FEE); + + //check the user has had the link fee deducted + assertEq(getLinkBalance(USER), DEFAULT_LINK_MINT_QUANTITY - DEFAULT_REPORT_LINK_FEE); + } + + function test_processFeeIfSubscriberIsSelf() public { + //get the default payload + bytes memory payload = getPayload(getV3Report(DEFAULT_FEED_1_V3)); + + //expect a revert due to the feeManager being the subscriber + vm.expectRevert(INVALID_ADDRESS_ERROR); + + //process the fee will fail due to assertion + processFee(payload, address(feeManager), address(native)); + } + + function test_processFeeWithWithEmptyQuotePayload() public { + //get the default payload + bytes memory payload = getPayload(getV3Report(DEFAULT_FEED_1_V3)); + + //expect a revert as the quote is invalid + vm.expectRevert(); //TODO check what this revert this should be + + //processing the fee will transfer the link by default + processFee(payload, USER, address(0)); + } + + function test_processFeeWithWithZeroQuotePayload() public { + //get the default payload + bytes memory payload = getPayload(getV3Report(DEFAULT_FEED_1_V3)); + + //expect a revert as the quote is invalid + vm.expectRevert(INVALID_QUOTE_ERROR); + + //processing the fee will transfer the link by default + processFee(payload, USER, INVALID_ADDRESS); + } + + function test_processFeeWithWithCorruptQuotePayload() public { + //get the default payload + bytes memory payload = abi.encode( + [DEFAULT_CONFIG_DIGEST, 0, 0], + getV3Report(DEFAULT_FEED_1_V3), + new bytes32[](1), + new bytes32[](1), + bytes32("") + ); + + //expect an evm revert as the quote is corrupt + vm.expectRevert(); + + //processing the fee will not withdraw anything as there is no fee to collect + processFee(payload, USER, address(link)); + } + + function test_processFeeDefaultReportsStillVerifiesWithEmptyQuote() public { + //get the default payload + bytes memory payload = getPayload(getV1Report(DEFAULT_FEED_1_V1)); + + //processing the fee will transfer the link from the user to the rewardManager + processFee(payload, USER, address(0)); + } + + function test_processFeeWithDefaultReportPayloadAndQuoteStillVerifies() public { + //get the default payload + bytes memory payload = getPayload(getV1Report(DEFAULT_FEED_1_V1)); + + //processing the fee will not withdraw anything as there is no fee to collect + processFee(payload, USER, address(link)); + } + + function test_processFeeNative() public { + //simulate a deposit of link for the conversion pool + mintLink(address(feeManager), DEFAULT_REPORT_LINK_FEE); + + //get the default payload + bytes memory payload = getPayload(getV3Report(DEFAULT_FEED_1_V3)); + + //approve the native to be transferred from the user + approveNative(address(feeManager), DEFAULT_REPORT_NATIVE_FEE, USER); + + //processing the fee will transfer the native from the user to the feeManager + processFee(payload, USER, address(native)); + + //check the native has been transferred + assertEq(getNativeBalance(address(feeManager)), DEFAULT_REPORT_NATIVE_FEE); + + //check the link has been transferred to the rewardManager + assertEq(getLinkBalance(address(rewardManager)), DEFAULT_REPORT_LINK_FEE); + + //check the feeManager has had the link deducted, the remaining balance should be 0 + assertEq(getLinkBalance(address(feeManager)), 0); + + //check the subscriber has had the native deducted + assertEq(getNativeBalance(USER), DEFAULT_NATIVE_MINT_QUANTITY - DEFAULT_REPORT_NATIVE_FEE); + } + + function test_processFeeEmitsEventIfNotEnoughLink() public { + //simulate a deposit of half the link required for the fee + mintLink(address(feeManager), DEFAULT_REPORT_LINK_FEE / 2); + + //get the default payload + bytes memory payload = getPayload(getV3Report(DEFAULT_FEED_1_V3)); + + //approve the native to be transferred from the user + approveNative(address(feeManager), DEFAULT_REPORT_NATIVE_FEE, USER); + + //expect an emit as there's not enough link + vm.expectEmit(); + + IRewardManager.FeePayment[] memory contractFees = new IRewardManager.FeePayment[](1); + contractFees[0] = IRewardManager.FeePayment(DEFAULT_CONFIG_DIGEST, uint192(DEFAULT_REPORT_LINK_FEE)); + + //emit the event that is expected to be emitted + emit InsufficientLink(contractFees); + + //processing the fee will transfer the native from the user to the feeManager + processFee(payload, USER, address(native)); + + //check the native has been transferred + assertEq(getNativeBalance(address(feeManager)), DEFAULT_REPORT_NATIVE_FEE); + + //check no link has been transferred to the rewardManager + assertEq(getLinkBalance(address(rewardManager)), 0); + assertEq(getLinkBalance(address(feeManager)), DEFAULT_REPORT_LINK_FEE / 2); + + //check the subscriber has had the native deducted + assertEq(getNativeBalance(USER), DEFAULT_NATIVE_MINT_QUANTITY - DEFAULT_REPORT_NATIVE_FEE); + } + + function test_processFeeWithWrappedNative() public { + // Mint and approve LINK for feeManager transfer to rewardManager following successful verification + mintLink(address(feeManager), DEFAULT_REPORT_LINK_FEE); + approveLink(address(rewardManager), DEFAULT_REPORT_LINK_FEE, address(feeManager)); + + // Mint and approve ERC20 representing native for the verification fee. USER given native ERC20 in setup + approveNative(address(feeManager), DEFAULT_REPORT_NATIVE_FEE, USER); + + //get the default payload + bytes memory payload = getPayload(getV3Report(DEFAULT_FEED_1_V3)); + + //only the proxy or admin can call processFee, they will pass in the native value on the users behalf + processFee(payload, USER, address(native)); + + //Check that fee manager has received wrapped native + assertEq(getNativeBalance(address(feeManager)), DEFAULT_REPORT_NATIVE_FEE); + + //check the link has been transferred to the rewardManager + assertEq(getLinkBalance(address(rewardManager)), DEFAULT_REPORT_LINK_FEE); + + //check the feeManager has had the link deducted, the remaining balance should be 0 + assertEq(getLinkBalance(address(feeManager)), 0); + + //check the subscriber has had the native deducted + assertEq(getNativeBalance(USER), DEFAULT_NATIVE_MINT_QUANTITY - DEFAULT_REPORT_NATIVE_FEE); + } + + function test_processFeeWithUnwrappedNativeLinkAddress() public { + //simulate a deposit of link for the conversion pool + mintLink(address(feeManager), DEFAULT_REPORT_LINK_FEE); + + //get the default payload + bytes memory payload = getPayload(getV3Report(DEFAULT_FEED_1_V3)); + + //expect a revert as not enough funds + vm.expectRevert(INSUFFICIENT_ALLOWANCE_ERROR); + + //the change will be returned and the user will attempted to be billed in LINK + processFee(payload, USER, address(link)); + } + + function test_processFeeWithWrappedNativeLinkAddressExcessiveFee() public { + //approve the link to be transferred from the from the subscriber to the rewardManager + approveLink(address(rewardManager), DEFAULT_REPORT_LINK_FEE, PROXY); + + // Mint native so we can check balance at end, no need to approve since transfer shouldn't happen + bytes memory payload = getPayload(getV3Report(DEFAULT_FEED_1_V3)); + + //call processFee from the proxy to test whether the funds are returned to the subscriber. In reality, the funds would be returned to the caller of the proxy. + processFee(payload, PROXY, address(link)); + + //check the native unwrapped is no longer in the account + assertEq(getNativeBalance(address(feeManager)), 0); + + //check the link has been transferred to the rewardManager + assertEq(getLinkBalance(address(rewardManager)), DEFAULT_REPORT_LINK_FEE); + + //check the feeManager has had the link deducted, the remaining balance should be 0 + assertEq(getLinkBalance(address(feeManager)), 0); + + //native should not be deducted, note that native was minted for PROXY in setup + assertEq(getNativeBalance(PROXY), DEFAULT_NATIVE_MINT_QUANTITY); + } + + function test_processFeeWithUnwrappedNativeWithExcessiveFee() public { + //simulate a deposit of link for the conversion pool + mintLink(address(feeManager), DEFAULT_REPORT_LINK_FEE); + approveNative(address(feeManager), DEFAULT_REPORT_NATIVE_FEE, PROXY); + + //get the default payload + bytes memory payload = getPayload(getV3Report(DEFAULT_FEED_1_V3)); + + //call processFee from the proxy to test whether the funds are returned to the subscriber. In reality, the funds would be returned to the caller of the proxy. + processFee(payload, PROXY, address(native)); + + //check the native has been transferred and converted to wrapped native + assertEq(getNativeBalance(address(feeManager)), DEFAULT_REPORT_NATIVE_FEE); + assertEq(getNativeUnwrappedBalance(address(feeManager)), 0); + + //check the link has been transferred to the rewardManager + assertEq(getLinkBalance(address(rewardManager)), DEFAULT_REPORT_LINK_FEE); + + //check the feeManager has had the link deducted, the remaining balance should be 0 + assertEq(getLinkBalance(address(feeManager)), 0); + + //check the subscriber has had the native deducted + assertEq(getNativeBalance(PROXY), DEFAULT_NATIVE_MINT_QUANTITY - DEFAULT_REPORT_NATIVE_FEE); + } + + function test_processFeeUsesCorrectDigest() public { + //get the default payload + bytes memory payload = getPayload(getV3Report(DEFAULT_FEED_1_V3)); + + //approve the link to be transferred from the from the subscriber to the rewardManager + approveLink(address(rewardManager), DEFAULT_REPORT_LINK_FEE, USER); + + //processing the fee will transfer the link from the user to the rewardManager + processFee(payload, USER, address(link)); + + //check the link has been transferred + assertEq(getLinkBalance(address(rewardManager)), DEFAULT_REPORT_LINK_FEE); + + //check the user has had the link fee deducted + assertEq(getLinkBalance(USER), DEFAULT_LINK_MINT_QUANTITY - DEFAULT_REPORT_LINK_FEE); + + //check funds have been paid to the reward manager + assertEq(rewardManager.s_totalRewardRecipientFees(DEFAULT_CONFIG_DIGEST), DEFAULT_REPORT_LINK_FEE); + } + + function test_V1PayloadVerifies() public { + //replicate a default payload + bytes memory payload = abi.encode( + [DEFAULT_CONFIG_DIGEST, 0, 0], + getV2Report(DEFAULT_FEED_1_V1), + new bytes32[](1), + new bytes32[](1), + bytes32("") + ); + + //processing the fee will transfer the link from the user to the rewardManager + processFee(payload, USER, address(0)); + } + + function test_V2PayloadVerifies() public { + //get the default payload + bytes memory payload = getPayload(getV2Report(DEFAULT_FEED_1_V2)); + + //approve the link to be transferred from the from the subscriber to the rewardManager + approveLink(address(rewardManager), DEFAULT_REPORT_LINK_FEE, USER); + + //processing the fee will transfer the link from the user to the rewardManager + processFee(payload, USER, address(link)); + + //check the link has been transferred + assertEq(getLinkBalance(address(rewardManager)), DEFAULT_REPORT_LINK_FEE); + + //check the user has had the link fee deducted + assertEq(getLinkBalance(USER), DEFAULT_LINK_MINT_QUANTITY - DEFAULT_REPORT_LINK_FEE); + } + + function test_V2PayloadWithoutQuoteFails() public { + //get the default payload + bytes memory payload = getPayload(getV2Report(DEFAULT_FEED_1_V2)); + + //expect a revert as the quote is invalid + vm.expectRevert(); + + //processing the fee will transfer the link from the user to the rewardManager + processFee(payload, USER, address(0)); + } + + function test_V2PayloadWithoutZeroFee() public { + //get the default payload + bytes memory payload = getPayload(getV2Report(DEFAULT_FEED_1_V2)); + + //expect a revert as the quote is invalid + vm.expectRevert(); + + //processing the fee will transfer the link from the user to the rewardManager + processFee(payload, USER, address(link)); + } + + function test_processFeeWithInvalidReportVersionFailsToDecode() public { + bytes memory data = abi.encode(0x0000100000000000000000000000000000000000000000000000000000000000); + + //get the default payload + bytes memory payload = getPayload(data); + + //serialization will fail as there is no report to decode + vm.expectRevert(); + + //processing the fee will not withdraw anything as there is no fee to collect + processFee(payload, USER, address(link)); + } + + function test_processFeeWithZeroNativeNonZeroLinkWithNativeQuote() public { + //get the default payload + bytes memory payload = getPayload( + getV3ReportWithCustomExpiryAndFee(DEFAULT_FEED_1_V3, block.timestamp, DEFAULT_REPORT_LINK_FEE, 0) + ); + + //call processFee should not revert as the fee is 0 + processFee(payload, PROXY, address(native)); + } + + function test_processFeeWithZeroNativeNonZeroLinkWithLinkQuote() public { + //get the default payload + bytes memory payload = getPayload( + getV3ReportWithCustomExpiryAndFee(DEFAULT_FEED_1_V3, block.timestamp, DEFAULT_REPORT_LINK_FEE, 0) + ); + + //approve the link to be transferred from the from the subscriber to the rewardManager + approveLink(address(rewardManager), DEFAULT_REPORT_LINK_FEE, USER); + + //processing the fee will transfer the link to the rewardManager from the user + processFee(payload, USER, address(link)); + + //check the link has been transferred + assertEq(getLinkBalance(address(rewardManager)), DEFAULT_REPORT_LINK_FEE); + + //check the user has had the link fee deducted + assertEq(getLinkBalance(USER), DEFAULT_LINK_MINT_QUANTITY - DEFAULT_REPORT_LINK_FEE); + } + + function test_processFeeWithZeroLinkNonZeroNativeWithNativeQuote() public { + //simulate a deposit of link for the conversion pool + mintLink(address(feeManager), DEFAULT_REPORT_LINK_FEE); + + //get the default payload + bytes memory payload = getPayload( + getV3ReportWithCustomExpiryAndFee(DEFAULT_FEED_1_V3, block.timestamp, 0, DEFAULT_REPORT_NATIVE_FEE) + ); + + //approve the native to be transferred from the user + approveNative(address(feeManager), DEFAULT_REPORT_NATIVE_FEE, USER); + + //processing the fee will transfer the native from the user to the feeManager + processFee(payload, USER, address(native)); + + //check the native has been transferred + assertEq(getNativeBalance(address(feeManager)), DEFAULT_REPORT_NATIVE_FEE); + + //check no link has been transferred to the rewardManager + assertEq(getLinkBalance(address(rewardManager)), 0); + + //check the feeManager has had no link deducted + assertEq(getLinkBalance(address(feeManager)), DEFAULT_REPORT_LINK_FEE); + + //check the subscriber has had the native deducted + assertEq(getNativeBalance(USER), DEFAULT_NATIVE_MINT_QUANTITY - DEFAULT_REPORT_NATIVE_FEE); + } + + function test_processFeeWithZeroLinkNonZeroNativeWithLinkQuote() public { + //get the default payload + bytes memory payload = getPayload( + getV3ReportWithCustomExpiryAndFee(DEFAULT_FEED_1_V3, block.timestamp, 0, DEFAULT_REPORT_NATIVE_FEE) + ); + + //call processFee should not revert as the fee is 0 + processFee(payload, USER, address(link)); + } + + function test_processFeeWithZeroNativeNonZeroLinkReturnsChange() public { + //get the default payload + bytes memory payload = getPayload( + getV3ReportWithCustomExpiryAndFee(DEFAULT_FEED_1_V3, block.timestamp, 0, DEFAULT_REPORT_NATIVE_FEE) + ); + + //call processFee should not revert as the fee is 0 + processFee(payload, USER, address(link)); + + //check the change has been returned + assertEq(USER.balance, DEFAULT_NATIVE_MINT_QUANTITY); + } + + function test_V1PayloadBlocksNativeBilling() public { + //emulate a V1 payload with no quote + bytes memory payload = getPayload(getV1Report(DEFAULT_FEED_1_V1)); + //record the current address and switch to the recipient + changePrank(USER); + + //Expect revert since no native allowed + vm.expectRevert(NATIVE_BILLING_DISALLOWED); + + //process the fee + feeManagerProxy.processFee{value: 1 wei}(payload, abi.encode(address(0))); + } + + function test_processFeeWithDiscountEmitsEvent() public { + //simulate a deposit of link for the conversion pool + mintLink(address(feeManager), DEFAULT_REPORT_LINK_FEE); + + //set the subscriber discount to 50% + setSubscriberDiscount(USER, DEFAULT_FEED_1_V3, address(native), FEE_SCALAR / 2, ADMIN); + + //approve the native to be transferred from the user + approveNative(address(feeManager), DEFAULT_REPORT_NATIVE_FEE / 2, USER); + + //get the default payload + bytes memory payload = getPayload(getV3Report(DEFAULT_FEED_1_V3)); + + Common.Asset memory fee = getFee(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + Common.Asset memory reward = getReward(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + uint256 appliedDiscount = getAppliedDiscount(getV3Report(DEFAULT_FEED_1_V3), getNativeQuote(), USER); + + vm.expectEmit(); + + emit DiscountApplied(DEFAULT_CONFIG_DIGEST, USER, fee, reward, appliedDiscount); + + //call processFee should not revert as the fee is 0 + processFee(payload, USER, address(native)); + } + + function test_processFeeWithNoDiscountDoesNotEmitEvent() public { + //simulate a deposit of link for the conversion pool + mintLink(address(feeManager), DEFAULT_REPORT_LINK_FEE); + + //approve the native to be transferred from the user + approveNative(address(feeManager), DEFAULT_REPORT_NATIVE_FEE, USER); + + //get the default payload + bytes memory payload = getPayload(getV3Report(DEFAULT_FEED_1_V3)); + + //call processFee should not revert as the fee is 0 + processFee(payload, USER, address(native)); + + //no logs should have been emitted + assertEq(vm.getRecordedLogs().length, 0); + } +} diff --git a/contracts/src/v0.8/llo-feeds/test/fee-manager-no-native/FeeManagerNoNative.processFeeBulk.t.sol b/contracts/src/v0.8/llo-feeds/test/fee-manager-no-native/FeeManagerNoNative.processFeeBulk.t.sol new file mode 100644 index 00000000000..d0699ef76e2 --- /dev/null +++ b/contracts/src/v0.8/llo-feeds/test/fee-manager-no-native/FeeManagerNoNative.processFeeBulk.t.sol @@ -0,0 +1,174 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity 0.8.19; + +import "./BaseFeeManagerNoNative.t.sol"; +import {IRewardManager} from "../../interfaces/IRewardManager.sol"; + +/** + * @title BaseFeeManagerTest + * @author Michael Fletcher + * @notice This contract will test the functionality of the feeManager processFee + */ +contract FeeManagerNoNativeProcessFeeBulkTest is BaseFeeManagerNoNativeTest { + uint256 internal constant NUMBER_OF_REPORTS = 5; + + function setUp() public override { + super.setUp(); + } + + function test_processMultipleLinkReports() public { + bytes memory payload = getPayload(getV3Report(DEFAULT_FEED_1_V3)); + + bytes[] memory payloads = new bytes[](NUMBER_OF_REPORTS); + for (uint256 i = 0; i < NUMBER_OF_REPORTS; ++i) { + payloads[i] = payload; + } + + approveLink(address(rewardManager), DEFAULT_REPORT_LINK_FEE * NUMBER_OF_REPORTS, USER); + + processFee(payloads, USER, address(link)); + + assertEq(getLinkBalance(address(rewardManager)), DEFAULT_REPORT_LINK_FEE * NUMBER_OF_REPORTS); + assertEq(getLinkBalance(address(feeManager)), 0); + assertEq(getLinkBalance(USER), DEFAULT_LINK_MINT_QUANTITY - DEFAULT_REPORT_LINK_FEE * NUMBER_OF_REPORTS); + + //the subscriber (user) should receive funds back and not the proxy, although when live the proxy will forward the funds sent and not cover it seen here + assertEq(USER.balance, DEFAULT_NATIVE_MINT_QUANTITY); + assertEq(PROXY.balance, DEFAULT_NATIVE_MINT_QUANTITY); + } + + function test_processMultipleWrappedNativeReports() public { + mintLink(address(feeManager), DEFAULT_REPORT_LINK_FEE * NUMBER_OF_REPORTS + 1); + + bytes memory payload = getPayload(getV3Report(DEFAULT_FEED_1_V3)); + + bytes[] memory payloads = new bytes[](NUMBER_OF_REPORTS); + for (uint256 i; i < NUMBER_OF_REPORTS; ++i) { + payloads[i] = payload; + } + + approveNative(address(feeManager), DEFAULT_REPORT_NATIVE_FEE * NUMBER_OF_REPORTS, USER); + + processFee(payloads, USER, address(native)); + + assertEq(getNativeBalance(address(feeManager)), DEFAULT_REPORT_NATIVE_FEE * NUMBER_OF_REPORTS); + assertEq(getLinkBalance(address(rewardManager)), DEFAULT_REPORT_LINK_FEE * NUMBER_OF_REPORTS); + assertEq(getLinkBalance(address(feeManager)), 1); + assertEq(getNativeBalance(USER), DEFAULT_NATIVE_MINT_QUANTITY - DEFAULT_REPORT_NATIVE_FEE * NUMBER_OF_REPORTS); + } + + function test_processV1V2V3Reports() public { + mintLink(address(feeManager), 1); + + bytes memory payloadV1 = abi.encode( + [DEFAULT_CONFIG_DIGEST, 0, 0], + getV1Report(DEFAULT_FEED_1_V1), + new bytes32[](1), + new bytes32[](1), + bytes32("") + ); + + bytes memory linkPayloadV2 = getPayload(getV2Report(DEFAULT_FEED_1_V2)); + bytes memory linkPayloadV3 = getPayload(getV3Report(DEFAULT_FEED_1_V3)); + + bytes[] memory payloads = new bytes[](5); + payloads[0] = payloadV1; + payloads[1] = linkPayloadV2; + payloads[2] = linkPayloadV2; + payloads[3] = linkPayloadV3; + payloads[4] = linkPayloadV3; + + approveLink(address(rewardManager), DEFAULT_REPORT_LINK_FEE * 4, USER); + + processFee(payloads, USER, address(link)); + + assertEq(getNativeBalance(address(feeManager)), 0); + assertEq(getLinkBalance(address(rewardManager)), DEFAULT_REPORT_LINK_FEE * 4); + assertEq(getLinkBalance(address(feeManager)), 1); + + assertEq(getLinkBalance(USER), DEFAULT_LINK_MINT_QUANTITY - DEFAULT_REPORT_LINK_FEE * 4); + assertEq(getNativeBalance(USER), DEFAULT_NATIVE_MINT_QUANTITY - 0); + } + + function test_processV1V2V3ReportsWithWrapped() public { + mintLink(address(feeManager), DEFAULT_REPORT_LINK_FEE * 4 + 1); + approveNative(address(feeManager), DEFAULT_REPORT_NATIVE_FEE * 4, USER); + + bytes memory payloadV1 = abi.encode( + [DEFAULT_CONFIG_DIGEST, 0, 0], + getV1Report(DEFAULT_FEED_1_V1), + new bytes32[](1), + new bytes32[](1), + bytes32("") + ); + + bytes memory nativePayloadV2 = getPayload(getV2Report(DEFAULT_FEED_1_V2)); + bytes memory nativePayloadV3 = getPayload(getV3Report(DEFAULT_FEED_1_V3)); + + bytes[] memory payloads = new bytes[](5); + payloads[0] = payloadV1; + payloads[1] = nativePayloadV2; + payloads[2] = nativePayloadV2; + payloads[3] = nativePayloadV3; + payloads[4] = nativePayloadV3; + + processFee(payloads, USER, address(native)); + + assertEq(getNativeBalance(address(feeManager)), DEFAULT_REPORT_NATIVE_FEE * 4); + assertEq(getLinkBalance(address(rewardManager)), DEFAULT_REPORT_LINK_FEE * 4); + assertEq(getLinkBalance(address(feeManager)), 1); + + assertEq(getNativeBalance(USER), DEFAULT_NATIVE_MINT_QUANTITY - DEFAULT_REPORT_NATIVE_FEE * 4); + assertEq(getNativeBalance(PROXY), DEFAULT_NATIVE_MINT_QUANTITY); + } + + function test_processMultipleV1Reports() public { + bytes memory payload = abi.encode( + [DEFAULT_CONFIG_DIGEST, 0, 0], + getV1Report(DEFAULT_FEED_1_V1), + new bytes32[](1), + new bytes32[](1), + bytes32("") + ); + + bytes[] memory payloads = new bytes[](NUMBER_OF_REPORTS); + for (uint256 i = 0; i < NUMBER_OF_REPORTS; ++i) { + payloads[i] = payload; + } + + processFee(payloads, USER, address(native)); + + assertEq(USER.balance, DEFAULT_NATIVE_MINT_QUANTITY); + assertEq(PROXY.balance, DEFAULT_NATIVE_MINT_QUANTITY); + } + + function test_eventIsEmittedIfNotEnoughLink() public { + bytes memory nativePayload = getPayload(getV3Report(DEFAULT_FEED_1_V3)); + + bytes[] memory payloads = new bytes[](5); + payloads[0] = nativePayload; + payloads[1] = nativePayload; + payloads[2] = nativePayload; + payloads[3] = nativePayload; + payloads[4] = nativePayload; + + approveNative(address(feeManager), DEFAULT_REPORT_NATIVE_FEE * 5, USER); + + IRewardManager.FeePayment[] memory payments = new IRewardManager.FeePayment[](5); + payments[0] = IRewardManager.FeePayment(DEFAULT_CONFIG_DIGEST, uint192(DEFAULT_REPORT_LINK_FEE)); + payments[1] = IRewardManager.FeePayment(DEFAULT_CONFIG_DIGEST, uint192(DEFAULT_REPORT_LINK_FEE)); + payments[2] = IRewardManager.FeePayment(DEFAULT_CONFIG_DIGEST, uint192(DEFAULT_REPORT_LINK_FEE)); + payments[3] = IRewardManager.FeePayment(DEFAULT_CONFIG_DIGEST, uint192(DEFAULT_REPORT_LINK_FEE)); + payments[4] = IRewardManager.FeePayment(DEFAULT_CONFIG_DIGEST, uint192(DEFAULT_REPORT_LINK_FEE)); + + vm.expectEmit(); + + emit InsufficientLink(payments); + + processFee(payloads, USER, address(native)); + + assertEq(getNativeBalance(address(feeManager)), DEFAULT_REPORT_NATIVE_FEE * 5); + assertEq(getNativeBalance(USER), DEFAULT_NATIVE_MINT_QUANTITY - DEFAULT_REPORT_NATIVE_FEE * 5); + assertEq(getLinkBalance(USER), DEFAULT_LINK_MINT_QUANTITY); + } +} diff --git a/core/gethwrappers/llo-feeds/generated/fee_manager_no_native/fee_manager_no_native.go b/core/gethwrappers/llo-feeds/generated/fee_manager_no_native/fee_manager_no_native.go new file mode 100644 index 00000000000..2b6229b30bb --- /dev/null +++ b/core/gethwrappers/llo-feeds/generated/fee_manager_no_native/fee_manager_no_native.go @@ -0,0 +1,1748 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package fee_manager_no_native + +import ( + "errors" + "fmt" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" + "github.com/smartcontractkit/chainlink/v2/core/gethwrappers/generated" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +type CommonAddressAndWeight struct { + Addr common.Address + Weight uint64 +} + +type CommonAsset struct { + AssetAddress common.Address + Amount *big.Int +} + +type IRewardManagerFeePayment struct { + PoolId [32]byte + Amount *big.Int +} + +var FeeManagerNoNativeMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_linkAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_nativeAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_proxyAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_rewardManagerAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ExpiredReport\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDeposit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidDiscount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidQuote\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidReceivingAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidSurcharge\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NativeBillingDisallowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroDeficit\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"subscriber\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"assetAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structCommon.Asset\",\"name\":\"fee\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"assetAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"indexed\":false,\"internalType\":\"structCommon.Asset\",\"name\":\"reward\",\"type\":\"tuple\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"appliedDiscount\",\"type\":\"uint256\"}],\"name\":\"DiscountApplied\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"poolId\",\"type\":\"bytes32\"},{\"internalType\":\"uint192\",\"name\":\"amount\",\"type\":\"uint192\"}],\"indexed\":false,\"internalType\":\"structIRewardManager.FeePayment[]\",\"name\":\"rewards\",\"type\":\"tuple[]\"}],\"name\":\"InsufficientLink\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"linkQuantity\",\"type\":\"uint256\"}],\"name\":\"LinkDeficitCleared\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newSurcharge\",\"type\":\"uint64\"}],\"name\":\"NativeSurchargeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferRequested\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"subscriber\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"discount\",\"type\":\"uint64\"}],\"name\":\"SubscriberDiscountUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"adminAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"assetAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint192\",\"name\":\"quantity\",\"type\":\"uint192\"}],\"name\":\"Withdraw\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"subscriber\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"report\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"quoteAddress\",\"type\":\"address\"}],\"name\":\"getFeeAndReward\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"assetAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structCommon.Asset\",\"name\":\"\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"assetAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"internalType\":\"structCommon.Asset\",\"name\":\"\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_linkAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_nativeAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_proxyAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"i_rewardManager\",\"outputs\":[{\"internalType\":\"contractIRewardManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"linkAvailableForPayment\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"}],\"name\":\"payLinkDeficit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"payload\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"parameterPayload\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"subscriber\",\"type\":\"address\"}],\"name\":\"processFee\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"payloads\",\"type\":\"bytes[]\"},{\"internalType\":\"bytes\",\"name\":\"parameterPayload\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"subscriber\",\"type\":\"address\"}],\"name\":\"processFeeBulk\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"s_linkDeficit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"s_nativeSurcharge\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"s_subscriberDiscounts\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"configDigest\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"weight\",\"type\":\"uint64\"}],\"internalType\":\"structCommon.AddressAndWeight[]\",\"name\":\"rewardRecipientAndWeights\",\"type\":\"tuple[]\"}],\"name\":\"setFeeRecipients\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"surcharge\",\"type\":\"uint64\"}],\"name\":\"setNativeSurcharge\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"typeAndVersion\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"subscriber\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"feedId\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"discount\",\"type\":\"uint64\"}],\"name\":\"updateSubscriberDiscount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"assetAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"internalType\":\"uint192\",\"name\":\"quantity\",\"type\":\"uint192\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x6101006040523480156200001257600080fd5b50604051620034bf380380620034bf833981016040819052620000359162000290565b838383833380600081620000905760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b600080546001600160a01b0319166001600160a01b0384811691909117909155811615620000c357620000c381620001c8565b5050506001600160a01b0384161580620000e457506001600160a01b038316155b80620000f757506001600160a01b038216155b806200010a57506001600160a01b038116155b15620001295760405163e6c4247b60e01b815260040160405180910390fd5b6001600160a01b03848116608081905284821660a05283821660c05290821660e081905260405163095ea7b360e01b81526004810191909152600019602482015263095ea7b3906044016020604051808303816000875af115801562000193573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001b99190620002ed565b50505050505050505062000318565b336001600160a01b03821603620002225760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640162000087565b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b80516001600160a01b03811681146200028b57600080fd5b919050565b60008060008060808587031215620002a757600080fd5b620002b28562000273565b9350620002c26020860162000273565b9250620002d26040860162000273565b9150620002e26060860162000273565b905092959194509250565b6000602082840312156200030057600080fd5b815180151581146200031157600080fd5b9392505050565b60805160a05160c05160e0516130c5620003fa60003960008181610275015281816114a60152818161163401528181611e4f015261209d015260008181610335015281816107fb01528181610ddf015261157a0152600081816102ee01528181610c02015281816110170152818161106e0152818161131b01528181611d750152611e1e0152600081816104ba015281816109ae01528181610bab01528181610d4201528181610f080152818161103c015281816110c50152818161120a01528181611277015281816112b7015281816119f00152611f1001526130c56000f3fe60806040526004361061016a5760003560e01c806379ba5097116100cb578063dba45fe01161007f578063ea4b861b11610059578063ea4b861b146104a8578063f2fde38b146104dc578063f65df962146104fc57600080fd5b8063dba45fe01461040a578063e03dab1a1461041d578063e389d9a41461048857600080fd5b80638da5cb5b116100b05780638da5cb5b146103aa578063ce7817d1146103d5578063d09dc339146103f557600080fd5b806379ba50971461035757806387d6d8431461036c57600080fd5b80633aa5ac0711610122578063638786681161010757806363878668146102dc5780636c2f1a17146103105780636d1342cb1461032357600080fd5b80633aa5ac071461026357806350538094146102bc57600080fd5b8063181f5a7711610153578063181f5a77146101df5780631d4d84a21461022b57806332f5f7461461024d57600080fd5b8063013f542b1461016f57806301ffc9a7146101af575b600080fd5b34801561017b57600080fd5b5061019c61018a36600461269f565b60036020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101bb57600080fd5b506101cf6101ca3660046126b8565b61051c565b60405190151581526020016101a6565b3480156101eb57600080fd5b50604080518082018252601081527f4665654d616e6167657220322e302e3000000000000000000000000000000000602082015290516101a6919061271e565b34801561023757600080fd5b5061024b6102463660046127c7565b6105b5565b005b34801561025957600080fd5b5061019c60045481565b34801561026f57600080fd5b506102977f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a6565b3480156102c857600080fd5b5061024b6102d736600461282a565b610749565b3480156102e857600080fd5b506102977f000000000000000000000000000000000000000000000000000000000000000081565b61024b61031e36600461288e565b6107e3565b34801561032f57600080fd5b506102977f000000000000000000000000000000000000000000000000000000000000000081565b34801561036357600080fd5b5061024b610a53565b34801561037857600080fd5b5061019c61038736600461293d565b600260209081526000938452604080852082529284528284209052825290205481565b3480156103b657600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610297565b3480156103e157600080fd5b5061024b6103f0366004612974565b610b55565b34801561040157600080fd5b5061019c610d11565b61024b6104183660046129c5565b610dc7565b34801561042957600080fd5b5061043d610438366004612b23565b610f7e565b60408051845173ffffffffffffffffffffffffffffffffffffffff9081168252602095860151868301528451169181019190915292909101516060830152608082015260a0016101a6565b34801561049457600080fd5b5061024b6104a336600461269f565b61137d565b3480156104b457600080fd5b506102977f000000000000000000000000000000000000000000000000000000000000000081565b3480156104e857600080fd5b5061024b6104f7366004612b7c565b61154e565b34801561050857600080fd5b5061024b610517366004612b99565b611562565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fdba45fe00000000000000000000000000000000000000000000000000000000014806105af57507fffffffff0000000000000000000000000000000000000000000000000000000082167f6c2f1a1700000000000000000000000000000000000000000000000000000000145b92915050565b6105bd6116a4565b73ffffffffffffffffffffffffffffffffffffffff83166106925760008273ffffffffffffffffffffffffffffffffffffffff168277ffffffffffffffffffffffffffffffffffffffffffffffff1660405160006040518083038185875af1925050503d806000811461064c576040519150601f19603f3d011682016040523d82523d6000602084013e610651565b606091505b505090508061068c576040517fef2af20100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6106cd73ffffffffffffffffffffffffffffffffffffffff84168377ffffffffffffffffffffffffffffffffffffffffffffffff8416611727565b6040805133815273ffffffffffffffffffffffffffffffffffffffff848116602083015285168183015277ffffffffffffffffffffffffffffffffffffffffffffffff8316606082015290517f7ff78a71698bdb18dcca96f52ab25e0a1b146fb6a49adf8e6845299e49021f299181900360800190a15b505050565b6107516116a4565b670de0b6b3a764000067ffffffffffffffff8216111561079d576040517f05e8ac2900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff811660048190556040519081527f08f7c0d17932ddb8523bc06754d42ff19ebc77d76a8b9bfde02c28ab1ed3d6399060200160405180910390a150565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610852576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b341561088a576040517fa5cde11d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008467ffffffffffffffff8111156108a5576108a5612a49565b6040519080825280602002602001820160405280156108de57816020015b6108cb612612565b8152602001906001900390816108c35790505b5090506000806000805b88811015610a295760008060006109248d8d8681811061090a5761090a612c18565b905060200281019061091c9190612c47565b8d8d8d6117fb565b9250925092508260200151600014610a155760405180608001604052808e8e8781811061095357610953612c18565b90506020028101906109659190612c47565b61096e91612cac565b81526020018481526020018381526020018281525088868061098f90612d17565b9750815181106109a1576109a1612c18565b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff1603610a0e57866001019650610a15565b8560010195505b50505080610a2290612d17565b90506108e8565b5082151580610a3757508115155b15610a4857610a488585858561190b565b505050505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610ad9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b60008054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610b5d6116a4565b670de0b6b3a764000067ffffffffffffffff82161115610ba9576040517f997ea36000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015610c5157507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15610c88576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff848116600081815260026020908152604080832088845282528083209487168084529482529182902067ffffffffffffffff86169081905582519485529084015285927f5eba5a8afa39780f0f99b6cbeb95f3da6a7040ca00abd46bdc91a0a060134139910160405180910390a350505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610d9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc29190612d4f565b905090565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610e36576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415610e6e576040517fa5cde11d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000610e8088888888886117fb565b604080516001808252818301909252939650919450925060009190816020015b610ea8612612565b815260200190600190039081610ea0575050604080516080810190915290915080610ed38a8c612cac565b81526020018581526020018481526020018381525081600081518110610efb57610efb612c18565b60200260200101819052507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16846000015173ffffffffffffffffffffffffffffffffffffffff1603610f7057610f6b85826001600061190b565b610a48565b610a4885826000600161190b565b6040805180820182526000808252602080830182905283518085018552828152808201839052845180860186528381528083018490528551808701909652838652918501839052929382610fd188612d68565b90507fffff00000000000000000000000000000000000000000000000000000000000080821690810161106c57505073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811683527f0000000000000000000000000000000000000000000000000000000000000000168152909350915060009050611374565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161415801561111457507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614155b1561114b576040517ff861803000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060008b8060200190518101906111649190612dc1565b77ffffffffffffffffffffffffffffffffffffffffffffffff91821698509116955063ffffffff16935050504282101590506111cc576040517fb6c405f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff808e16600090815260026020908152604080832089845282528083208f851684529091529020547f0000000000000000000000000000000000000000000000000000000000000000909116875261125b61124382670de0b6b3a7640000612e33565b61124d9086612e46565b670de0b6b3a764000061211f565b602088015273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000008116908d16036112e85773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016885260208088015190890152611365565b6004546000906113049061124390670de0b6b3a7640000612e5d565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168a52905061135e61135483670de0b6b3a7640000612e33565b61124d9083612e46565b60208a0152505b96995094975094955050505050505b93509350939050565b6113856116a4565b600081815260036020526040812054908190036113ce576040517f03aad31200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000828152600360205260408082208290558051600180825281830190925290816020015b60408051808201909152600080825260208201528152602001906001900390816113f357905050905060405180604001604052808481526020018377ffffffffffffffffffffffffffffffffffffffffffffffff168152508160008151811061145e5761145e612c18565b60209081029190910101526040517fb0d9fa1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b0d9fa19906114dd9084903090600401612ed0565b600060405180830381600087803b1580156114f757600080fd5b505af115801561150b573d6000803e3d6000fd5b50505050827f843f0b103e50b42b08f9d30f12f961845a6d02623730872e24644899c0dd98958360405161154191815260200190565b60405180910390a2505050565b6115566116a4565b61155f81612157565b50565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016148015906115c0575060005473ffffffffffffffffffffffffffffffffffffffff163314155b156115f7576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f14060f2300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906314060f239061166d90869086908690600401612f08565b600060405180830381600087803b15801561168757600080fd5b505af115801561169b573d6000803e3d6000fd5b50505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611725576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610ad0565b565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526107449084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261224c565b6040805180820190915260008082526020820152604080518082019091526000808252602082015260003073ffffffffffffffffffffffffffffffffffffffff851603611874576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611882888a018a612f88565b91505060008161189190612d68565b905060007e010000000000000000000000000000000000000000000000000000000000007fffff0000000000000000000000000000000000000000000000000000000000008316146118ec576118e9888a018a612b7c565b90505b6118f7878483610f7e565b955095509550505050955095509592505050565b60008267ffffffffffffffff81111561192657611926612a49565b60405190808252806020026020018201604052801561196b57816020015b60408051808201909152600080825260208201528152602001906001900390816119445790505b50905060008267ffffffffffffffff81111561198957611989612a49565b6040519080825280602002602001820160405280156119ce57816020015b60408051808201909152600080825260208201528152602001906001900390816119a75790505b5090506000808080806119e1888a612e5d565b905060005b81811015611d30577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168b8281518110611a3757611a37612c18565b6020026020010151602001516000015173ffffffffffffffffffffffffffffffffffffffff1603611afd5760405180604001604052808c8381518110611a7f57611a7f612c18565b60200260200101516000015181526020018c8381518110611aa257611aa2612c18565b6020026020010151604001516020015177ffffffffffffffffffffffffffffffffffffffffffffffff16815250888580611adb90612d17565b965081518110611aed57611aed612c18565b6020026020010181905250611bf2565b60405180604001604052808c8381518110611b1a57611b1a612c18565b60200260200101516000015181526020018c8381518110611b3d57611b3d612c18565b6020026020010151604001516020015177ffffffffffffffffffffffffffffffffffffffffffffffff16815250878480611b7690612d17565b955081518110611b8857611b88612c18565b60200260200101819052508a8181518110611ba557611ba5612c18565b6020026020010151602001516020015186611bc09190612e5d565b95508a8181518110611bd457611bd4612c18565b6020026020010151604001516020015185611bef9190612e5d565b94505b8a8181518110611c0457611c04612c18565b602002602001015160600151600014611d20578b73ffffffffffffffffffffffffffffffffffffffff168b8281518110611c4057611c40612c18565b6020026020010151600001517f88b15eb682210089cddf967648e2cb2a4535aeadc8f8f36050922e33c04e71258d8481518110611c7f57611c7f612c18565b6020026020010151602001518e8581518110611c9d57611c9d612c18565b6020026020010151604001518f8681518110611cbb57611cbb612c18565b602002602001015160600151604051611d1793929190835173ffffffffffffffffffffffffffffffffffffffff908116825260209485015185830152835116604082015291909201516060820152608081019190915260a00190565b60405180910390a35b611d2981612d17565b90506119e6565b5060003415611dfe5734861115611d73576040517fb2e532de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0876040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ddb57600080fd5b505af1158015611def573d6000803e3d6000fd5b50505050508534039050611e46565b8515611e4657611e4673ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168d3089612358565b875115611edb577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b0d9fa19898e6040518363ffffffff1660e01b8152600401611ea8929190612ed0565b600060405180830381600087803b158015611ec257600080fd5b505af1158015611ed6573d6000803e3d6000fd5b505050505b865115612107576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015611f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f909190612d4f565b8511156120605760005b875181101561202357878181518110611fb557611fb5612c18565b60200260200101516020015177ffffffffffffffffffffffffffffffffffffffffffffffff16600360008a8481518110611ff157611ff1612c18565b6020908102919091018101515182528101919091526040016000208054909101905561201c81612d17565b9050611f9a565b507ff52e5907b69d97c33392936c12d78b494463b78c5b72df50b4c497eee5720b6787604051612053919061302c565b60405180910390a1612107565b6040517fb0d9fa1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b0d9fa19906120d4908a903090600401612ed0565b600060405180830381600087803b1580156120ee57600080fd5b505af1158015612102573d6000803e3d6000fd5b505050505b6121118c826123b6565b505050505050505050505050565b6000821561214d5781612133600185612e33565b61213d919061303f565b612148906001612e5d565b612150565b60005b9392505050565b3373ffffffffffffffffffffffffffffffffffffffff8216036121d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610ad0565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691821790925560008054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b60006122ae826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166124039092919063ffffffff16565b80519091501561074457808060200190518101906122cc919061307a565b610744576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610ad0565b60405173ffffffffffffffffffffffffffffffffffffffff8085166024830152831660448201526064810182905261068c9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611779565b80156123ff5760405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610744573d6000803e3d6000fd5b5050565b6060612412848460008561241a565b949350505050565b6060824710156124ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610ad0565b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516124d5919061309c565b60006040518083038185875af1925050503d8060008114612512576040519150601f19603f3d011682016040523d82523d6000602084013e612517565b606091505b509150915061252887838387612533565b979650505050505050565b606083156125c95782516000036125c25773ffffffffffffffffffffffffffffffffffffffff85163b6125c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610ad0565b5081612412565b61241283838151156125de5781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad0919061271e565b60405180608001604052806000801916815260200161265a6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b81526020016126926040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b8152602001600081525090565b6000602082840312156126b157600080fd5b5035919050565b6000602082840312156126ca57600080fd5b81357fffffffff000000000000000000000000000000000000000000000000000000008116811461215057600080fd5b60005b838110156127155781810151838201526020016126fd565b50506000910152565b602081526000825180602084015261273d8160408501602087016126fa565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b73ffffffffffffffffffffffffffffffffffffffff8116811461155f57600080fd5b803561279c8161276f565b919050565b77ffffffffffffffffffffffffffffffffffffffffffffffff8116811461155f57600080fd5b6000806000606084860312156127dc57600080fd5b83356127e78161276f565b925060208401356127f78161276f565b91506040840135612807816127a1565b809150509250925092565b803567ffffffffffffffff8116811461279c57600080fd5b60006020828403121561283c57600080fd5b61215082612812565b60008083601f84011261285757600080fd5b50813567ffffffffffffffff81111561286f57600080fd5b60208301915083602082850101111561288757600080fd5b9250929050565b6000806000806000606086880312156128a657600080fd5b853567ffffffffffffffff808211156128be57600080fd5b818801915088601f8301126128d257600080fd5b8135818111156128e157600080fd5b8960208260051b85010111156128f657600080fd5b60209283019750955090870135908082111561291157600080fd5b5061291e88828901612845565b9094509250612931905060408701612791565b90509295509295909350565b60008060006060848603121561295257600080fd5b833561295d8161276f565b92506020840135915060408401356128078161276f565b6000806000806080858703121561298a57600080fd5b84356129958161276f565b93506020850135925060408501356129ac8161276f565b91506129ba60608601612812565b905092959194509250565b6000806000806000606086880312156129dd57600080fd5b853567ffffffffffffffff808211156129f557600080fd5b612a0189838a01612845565b90975095506020880135915080821115612a1a57600080fd5b50612a2788828901612845565b9094509250506040860135612a3b8161276f565b809150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112612a8957600080fd5b813567ffffffffffffffff80821115612aa457612aa4612a49565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612aea57612aea612a49565b81604052838152866020858801011115612b0357600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080600060608486031215612b3857600080fd5b8335612b438161276f565b9250602084013567ffffffffffffffff811115612b5f57600080fd5b612b6b86828701612a78565b92505060408401356128078161276f565b600060208284031215612b8e57600080fd5b81356121508161276f565b600080600060408486031215612bae57600080fd5b83359250602084013567ffffffffffffffff80821115612bcd57600080fd5b818601915086601f830112612be157600080fd5b813581811115612bf057600080fd5b8760208260061b8501011115612c0557600080fd5b6020830194508093505050509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112612c7c57600080fd5b83018035915067ffffffffffffffff821115612c9757600080fd5b60200191503681900382131561288757600080fd5b803560208310156105af577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff602084900360031b1b1692915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612d4857612d48612ce8565b5060010190565b600060208284031215612d6157600080fd5b5051919050565b80516020808301519190811015612da7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8160200360031b1b821691505b50919050565b805163ffffffff8116811461279c57600080fd5b60008060008060008060c08789031215612dda57600080fd5b86519550612dea60208801612dad565b9450612df860408801612dad565b93506060870151612e08816127a1565b6080880151909350612e19816127a1565b9150612e2760a08801612dad565b90509295509295509295565b818103818111156105af576105af612ce8565b80820281158282048414176105af576105af612ce8565b808201808211156105af576105af612ce8565b600081518084526020808501945080840160005b83811015612ec55781518051885283015177ffffffffffffffffffffffffffffffffffffffffffffffff168388015260409096019590820190600101612e84565b509495945050505050565b604081526000612ee36040830185612e70565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b8381526040602080830182905282820184905260009190859060608501845b87811015612f7b578335612f3a8161276f565b73ffffffffffffffffffffffffffffffffffffffff16825267ffffffffffffffff612f66858501612812565b16828401529284019290840190600101612f27565b5098975050505050505050565b60008060808385031215612f9b57600080fd5b83601f840112612faa57600080fd5b6040516060810167ffffffffffffffff8282108183111715612fce57612fce612a49565b816040528291506060860187811115612fe657600080fd5b865b81811015613000578035845260209384019301612fe8565b509294509135918083111561301457600080fd5b505061302285828601612a78565b9150509250929050565b6020815260006121506020830184612e70565b600082613075577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561308c57600080fd5b8151801515811461215057600080fd5b600082516130ae8184602087016126fa565b919091019291505056fea164736f6c6343000813000a", +} + +var FeeManagerNoNativeABI = FeeManagerNoNativeMetaData.ABI + +var FeeManagerNoNativeBin = FeeManagerNoNativeMetaData.Bin + +func DeployFeeManagerNoNative(auth *bind.TransactOpts, backend bind.ContractBackend, _linkAddress common.Address, _nativeAddress common.Address, _proxyAddress common.Address, _rewardManagerAddress common.Address) (common.Address, *types.Transaction, *FeeManagerNoNative, error) { + parsed, err := FeeManagerNoNativeMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(FeeManagerNoNativeBin), backend, _linkAddress, _nativeAddress, _proxyAddress, _rewardManagerAddress) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &FeeManagerNoNative{address: address, abi: *parsed, FeeManagerNoNativeCaller: FeeManagerNoNativeCaller{contract: contract}, FeeManagerNoNativeTransactor: FeeManagerNoNativeTransactor{contract: contract}, FeeManagerNoNativeFilterer: FeeManagerNoNativeFilterer{contract: contract}}, nil +} + +type FeeManagerNoNative struct { + address common.Address + abi abi.ABI + FeeManagerNoNativeCaller + FeeManagerNoNativeTransactor + FeeManagerNoNativeFilterer +} + +type FeeManagerNoNativeCaller struct { + contract *bind.BoundContract +} + +type FeeManagerNoNativeTransactor struct { + contract *bind.BoundContract +} + +type FeeManagerNoNativeFilterer struct { + contract *bind.BoundContract +} + +type FeeManagerNoNativeSession struct { + Contract *FeeManagerNoNative + CallOpts bind.CallOpts + TransactOpts bind.TransactOpts +} + +type FeeManagerNoNativeCallerSession struct { + Contract *FeeManagerNoNativeCaller + CallOpts bind.CallOpts +} + +type FeeManagerNoNativeTransactorSession struct { + Contract *FeeManagerNoNativeTransactor + TransactOpts bind.TransactOpts +} + +type FeeManagerNoNativeRaw struct { + Contract *FeeManagerNoNative +} + +type FeeManagerNoNativeCallerRaw struct { + Contract *FeeManagerNoNativeCaller +} + +type FeeManagerNoNativeTransactorRaw struct { + Contract *FeeManagerNoNativeTransactor +} + +func NewFeeManagerNoNative(address common.Address, backend bind.ContractBackend) (*FeeManagerNoNative, error) { + abi, err := abi.JSON(strings.NewReader(FeeManagerNoNativeABI)) + if err != nil { + return nil, err + } + contract, err := bindFeeManagerNoNative(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &FeeManagerNoNative{address: address, abi: abi, FeeManagerNoNativeCaller: FeeManagerNoNativeCaller{contract: contract}, FeeManagerNoNativeTransactor: FeeManagerNoNativeTransactor{contract: contract}, FeeManagerNoNativeFilterer: FeeManagerNoNativeFilterer{contract: contract}}, nil +} + +func NewFeeManagerNoNativeCaller(address common.Address, caller bind.ContractCaller) (*FeeManagerNoNativeCaller, error) { + contract, err := bindFeeManagerNoNative(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &FeeManagerNoNativeCaller{contract: contract}, nil +} + +func NewFeeManagerNoNativeTransactor(address common.Address, transactor bind.ContractTransactor) (*FeeManagerNoNativeTransactor, error) { + contract, err := bindFeeManagerNoNative(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &FeeManagerNoNativeTransactor{contract: contract}, nil +} + +func NewFeeManagerNoNativeFilterer(address common.Address, filterer bind.ContractFilterer) (*FeeManagerNoNativeFilterer, error) { + contract, err := bindFeeManagerNoNative(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &FeeManagerNoNativeFilterer{contract: contract}, nil +} + +func bindFeeManagerNoNative(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := FeeManagerNoNativeMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +func (_FeeManagerNoNative *FeeManagerNoNativeRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _FeeManagerNoNative.Contract.FeeManagerNoNativeCaller.contract.Call(opts, result, method, params...) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _FeeManagerNoNative.Contract.FeeManagerNoNativeTransactor.contract.Transfer(opts) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _FeeManagerNoNative.Contract.FeeManagerNoNativeTransactor.contract.Transact(opts, method, params...) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _FeeManagerNoNative.Contract.contract.Call(opts, result, method, params...) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _FeeManagerNoNative.Contract.contract.Transfer(opts) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _FeeManagerNoNative.Contract.contract.Transact(opts, method, params...) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCaller) GetFeeAndReward(opts *bind.CallOpts, subscriber common.Address, report []byte, quoteAddress common.Address) (CommonAsset, CommonAsset, *big.Int, error) { + var out []interface{} + err := _FeeManagerNoNative.contract.Call(opts, &out, "getFeeAndReward", subscriber, report, quoteAddress) + + if err != nil { + return *new(CommonAsset), *new(CommonAsset), *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(CommonAsset)).(*CommonAsset) + out1 := *abi.ConvertType(out[1], new(CommonAsset)).(*CommonAsset) + out2 := *abi.ConvertType(out[2], new(*big.Int)).(**big.Int) + + return out0, out1, out2, err + +} + +func (_FeeManagerNoNative *FeeManagerNoNativeSession) GetFeeAndReward(subscriber common.Address, report []byte, quoteAddress common.Address) (CommonAsset, CommonAsset, *big.Int, error) { + return _FeeManagerNoNative.Contract.GetFeeAndReward(&_FeeManagerNoNative.CallOpts, subscriber, report, quoteAddress) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCallerSession) GetFeeAndReward(subscriber common.Address, report []byte, quoteAddress common.Address) (CommonAsset, CommonAsset, *big.Int, error) { + return _FeeManagerNoNative.Contract.GetFeeAndReward(&_FeeManagerNoNative.CallOpts, subscriber, report, quoteAddress) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCaller) ILinkAddress(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _FeeManagerNoNative.contract.Call(opts, &out, "i_linkAddress") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_FeeManagerNoNative *FeeManagerNoNativeSession) ILinkAddress() (common.Address, error) { + return _FeeManagerNoNative.Contract.ILinkAddress(&_FeeManagerNoNative.CallOpts) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCallerSession) ILinkAddress() (common.Address, error) { + return _FeeManagerNoNative.Contract.ILinkAddress(&_FeeManagerNoNative.CallOpts) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCaller) INativeAddress(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _FeeManagerNoNative.contract.Call(opts, &out, "i_nativeAddress") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_FeeManagerNoNative *FeeManagerNoNativeSession) INativeAddress() (common.Address, error) { + return _FeeManagerNoNative.Contract.INativeAddress(&_FeeManagerNoNative.CallOpts) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCallerSession) INativeAddress() (common.Address, error) { + return _FeeManagerNoNative.Contract.INativeAddress(&_FeeManagerNoNative.CallOpts) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCaller) IProxyAddress(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _FeeManagerNoNative.contract.Call(opts, &out, "i_proxyAddress") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_FeeManagerNoNative *FeeManagerNoNativeSession) IProxyAddress() (common.Address, error) { + return _FeeManagerNoNative.Contract.IProxyAddress(&_FeeManagerNoNative.CallOpts) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCallerSession) IProxyAddress() (common.Address, error) { + return _FeeManagerNoNative.Contract.IProxyAddress(&_FeeManagerNoNative.CallOpts) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCaller) IRewardManager(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _FeeManagerNoNative.contract.Call(opts, &out, "i_rewardManager") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_FeeManagerNoNative *FeeManagerNoNativeSession) IRewardManager() (common.Address, error) { + return _FeeManagerNoNative.Contract.IRewardManager(&_FeeManagerNoNative.CallOpts) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCallerSession) IRewardManager() (common.Address, error) { + return _FeeManagerNoNative.Contract.IRewardManager(&_FeeManagerNoNative.CallOpts) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCaller) LinkAvailableForPayment(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _FeeManagerNoNative.contract.Call(opts, &out, "linkAvailableForPayment") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_FeeManagerNoNative *FeeManagerNoNativeSession) LinkAvailableForPayment() (*big.Int, error) { + return _FeeManagerNoNative.Contract.LinkAvailableForPayment(&_FeeManagerNoNative.CallOpts) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCallerSession) LinkAvailableForPayment() (*big.Int, error) { + return _FeeManagerNoNative.Contract.LinkAvailableForPayment(&_FeeManagerNoNative.CallOpts) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _FeeManagerNoNative.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +func (_FeeManagerNoNative *FeeManagerNoNativeSession) Owner() (common.Address, error) { + return _FeeManagerNoNative.Contract.Owner(&_FeeManagerNoNative.CallOpts) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCallerSession) Owner() (common.Address, error) { + return _FeeManagerNoNative.Contract.Owner(&_FeeManagerNoNative.CallOpts) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCaller) SLinkDeficit(opts *bind.CallOpts, arg0 [32]byte) (*big.Int, error) { + var out []interface{} + err := _FeeManagerNoNative.contract.Call(opts, &out, "s_linkDeficit", arg0) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_FeeManagerNoNative *FeeManagerNoNativeSession) SLinkDeficit(arg0 [32]byte) (*big.Int, error) { + return _FeeManagerNoNative.Contract.SLinkDeficit(&_FeeManagerNoNative.CallOpts, arg0) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCallerSession) SLinkDeficit(arg0 [32]byte) (*big.Int, error) { + return _FeeManagerNoNative.Contract.SLinkDeficit(&_FeeManagerNoNative.CallOpts, arg0) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCaller) SNativeSurcharge(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _FeeManagerNoNative.contract.Call(opts, &out, "s_nativeSurcharge") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_FeeManagerNoNative *FeeManagerNoNativeSession) SNativeSurcharge() (*big.Int, error) { + return _FeeManagerNoNative.Contract.SNativeSurcharge(&_FeeManagerNoNative.CallOpts) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCallerSession) SNativeSurcharge() (*big.Int, error) { + return _FeeManagerNoNative.Contract.SNativeSurcharge(&_FeeManagerNoNative.CallOpts) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCaller) SSubscriberDiscounts(opts *bind.CallOpts, arg0 common.Address, arg1 [32]byte, arg2 common.Address) (*big.Int, error) { + var out []interface{} + err := _FeeManagerNoNative.contract.Call(opts, &out, "s_subscriberDiscounts", arg0, arg1, arg2) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +func (_FeeManagerNoNative *FeeManagerNoNativeSession) SSubscriberDiscounts(arg0 common.Address, arg1 [32]byte, arg2 common.Address) (*big.Int, error) { + return _FeeManagerNoNative.Contract.SSubscriberDiscounts(&_FeeManagerNoNative.CallOpts, arg0, arg1, arg2) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCallerSession) SSubscriberDiscounts(arg0 common.Address, arg1 [32]byte, arg2 common.Address) (*big.Int, error) { + return _FeeManagerNoNative.Contract.SSubscriberDiscounts(&_FeeManagerNoNative.CallOpts, arg0, arg1, arg2) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _FeeManagerNoNative.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +func (_FeeManagerNoNative *FeeManagerNoNativeSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _FeeManagerNoNative.Contract.SupportsInterface(&_FeeManagerNoNative.CallOpts, interfaceId) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _FeeManagerNoNative.Contract.SupportsInterface(&_FeeManagerNoNative.CallOpts, interfaceId) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCaller) TypeAndVersion(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _FeeManagerNoNative.contract.Call(opts, &out, "typeAndVersion") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +func (_FeeManagerNoNative *FeeManagerNoNativeSession) TypeAndVersion() (string, error) { + return _FeeManagerNoNative.Contract.TypeAndVersion(&_FeeManagerNoNative.CallOpts) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeCallerSession) TypeAndVersion() (string, error) { + return _FeeManagerNoNative.Contract.TypeAndVersion(&_FeeManagerNoNative.CallOpts) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeTransactor) AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _FeeManagerNoNative.contract.Transact(opts, "acceptOwnership") +} + +func (_FeeManagerNoNative *FeeManagerNoNativeSession) AcceptOwnership() (*types.Transaction, error) { + return _FeeManagerNoNative.Contract.AcceptOwnership(&_FeeManagerNoNative.TransactOpts) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeTransactorSession) AcceptOwnership() (*types.Transaction, error) { + return _FeeManagerNoNative.Contract.AcceptOwnership(&_FeeManagerNoNative.TransactOpts) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeTransactor) PayLinkDeficit(opts *bind.TransactOpts, configDigest [32]byte) (*types.Transaction, error) { + return _FeeManagerNoNative.contract.Transact(opts, "payLinkDeficit", configDigest) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeSession) PayLinkDeficit(configDigest [32]byte) (*types.Transaction, error) { + return _FeeManagerNoNative.Contract.PayLinkDeficit(&_FeeManagerNoNative.TransactOpts, configDigest) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeTransactorSession) PayLinkDeficit(configDigest [32]byte) (*types.Transaction, error) { + return _FeeManagerNoNative.Contract.PayLinkDeficit(&_FeeManagerNoNative.TransactOpts, configDigest) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeTransactor) ProcessFee(opts *bind.TransactOpts, payload []byte, parameterPayload []byte, subscriber common.Address) (*types.Transaction, error) { + return _FeeManagerNoNative.contract.Transact(opts, "processFee", payload, parameterPayload, subscriber) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeSession) ProcessFee(payload []byte, parameterPayload []byte, subscriber common.Address) (*types.Transaction, error) { + return _FeeManagerNoNative.Contract.ProcessFee(&_FeeManagerNoNative.TransactOpts, payload, parameterPayload, subscriber) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeTransactorSession) ProcessFee(payload []byte, parameterPayload []byte, subscriber common.Address) (*types.Transaction, error) { + return _FeeManagerNoNative.Contract.ProcessFee(&_FeeManagerNoNative.TransactOpts, payload, parameterPayload, subscriber) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeTransactor) ProcessFeeBulk(opts *bind.TransactOpts, payloads [][]byte, parameterPayload []byte, subscriber common.Address) (*types.Transaction, error) { + return _FeeManagerNoNative.contract.Transact(opts, "processFeeBulk", payloads, parameterPayload, subscriber) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeSession) ProcessFeeBulk(payloads [][]byte, parameterPayload []byte, subscriber common.Address) (*types.Transaction, error) { + return _FeeManagerNoNative.Contract.ProcessFeeBulk(&_FeeManagerNoNative.TransactOpts, payloads, parameterPayload, subscriber) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeTransactorSession) ProcessFeeBulk(payloads [][]byte, parameterPayload []byte, subscriber common.Address) (*types.Transaction, error) { + return _FeeManagerNoNative.Contract.ProcessFeeBulk(&_FeeManagerNoNative.TransactOpts, payloads, parameterPayload, subscriber) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeTransactor) SetFeeRecipients(opts *bind.TransactOpts, configDigest [32]byte, rewardRecipientAndWeights []CommonAddressAndWeight) (*types.Transaction, error) { + return _FeeManagerNoNative.contract.Transact(opts, "setFeeRecipients", configDigest, rewardRecipientAndWeights) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeSession) SetFeeRecipients(configDigest [32]byte, rewardRecipientAndWeights []CommonAddressAndWeight) (*types.Transaction, error) { + return _FeeManagerNoNative.Contract.SetFeeRecipients(&_FeeManagerNoNative.TransactOpts, configDigest, rewardRecipientAndWeights) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeTransactorSession) SetFeeRecipients(configDigest [32]byte, rewardRecipientAndWeights []CommonAddressAndWeight) (*types.Transaction, error) { + return _FeeManagerNoNative.Contract.SetFeeRecipients(&_FeeManagerNoNative.TransactOpts, configDigest, rewardRecipientAndWeights) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeTransactor) SetNativeSurcharge(opts *bind.TransactOpts, surcharge uint64) (*types.Transaction, error) { + return _FeeManagerNoNative.contract.Transact(opts, "setNativeSurcharge", surcharge) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeSession) SetNativeSurcharge(surcharge uint64) (*types.Transaction, error) { + return _FeeManagerNoNative.Contract.SetNativeSurcharge(&_FeeManagerNoNative.TransactOpts, surcharge) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeTransactorSession) SetNativeSurcharge(surcharge uint64) (*types.Transaction, error) { + return _FeeManagerNoNative.Contract.SetNativeSurcharge(&_FeeManagerNoNative.TransactOpts, surcharge) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeTransactor) TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) { + return _FeeManagerNoNative.contract.Transact(opts, "transferOwnership", to) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _FeeManagerNoNative.Contract.TransferOwnership(&_FeeManagerNoNative.TransactOpts, to) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeTransactorSession) TransferOwnership(to common.Address) (*types.Transaction, error) { + return _FeeManagerNoNative.Contract.TransferOwnership(&_FeeManagerNoNative.TransactOpts, to) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeTransactor) UpdateSubscriberDiscount(opts *bind.TransactOpts, subscriber common.Address, feedId [32]byte, token common.Address, discount uint64) (*types.Transaction, error) { + return _FeeManagerNoNative.contract.Transact(opts, "updateSubscriberDiscount", subscriber, feedId, token, discount) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeSession) UpdateSubscriberDiscount(subscriber common.Address, feedId [32]byte, token common.Address, discount uint64) (*types.Transaction, error) { + return _FeeManagerNoNative.Contract.UpdateSubscriberDiscount(&_FeeManagerNoNative.TransactOpts, subscriber, feedId, token, discount) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeTransactorSession) UpdateSubscriberDiscount(subscriber common.Address, feedId [32]byte, token common.Address, discount uint64) (*types.Transaction, error) { + return _FeeManagerNoNative.Contract.UpdateSubscriberDiscount(&_FeeManagerNoNative.TransactOpts, subscriber, feedId, token, discount) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeTransactor) Withdraw(opts *bind.TransactOpts, assetAddress common.Address, recipient common.Address, quantity *big.Int) (*types.Transaction, error) { + return _FeeManagerNoNative.contract.Transact(opts, "withdraw", assetAddress, recipient, quantity) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeSession) Withdraw(assetAddress common.Address, recipient common.Address, quantity *big.Int) (*types.Transaction, error) { + return _FeeManagerNoNative.Contract.Withdraw(&_FeeManagerNoNative.TransactOpts, assetAddress, recipient, quantity) +} + +func (_FeeManagerNoNative *FeeManagerNoNativeTransactorSession) Withdraw(assetAddress common.Address, recipient common.Address, quantity *big.Int) (*types.Transaction, error) { + return _FeeManagerNoNative.Contract.Withdraw(&_FeeManagerNoNative.TransactOpts, assetAddress, recipient, quantity) +} + +type FeeManagerNoNativeDiscountAppliedIterator struct { + Event *FeeManagerNoNativeDiscountApplied + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeManagerNoNativeDiscountAppliedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeManagerNoNativeDiscountApplied) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeManagerNoNativeDiscountApplied) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeManagerNoNativeDiscountAppliedIterator) Error() error { + return it.fail +} + +func (it *FeeManagerNoNativeDiscountAppliedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeManagerNoNativeDiscountApplied struct { + ConfigDigest [32]byte + Subscriber common.Address + Fee CommonAsset + Reward CommonAsset + AppliedDiscount *big.Int + Raw types.Log +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) FilterDiscountApplied(opts *bind.FilterOpts, configDigest [][32]byte, subscriber []common.Address) (*FeeManagerNoNativeDiscountAppliedIterator, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + var subscriberRule []interface{} + for _, subscriberItem := range subscriber { + subscriberRule = append(subscriberRule, subscriberItem) + } + + logs, sub, err := _FeeManagerNoNative.contract.FilterLogs(opts, "DiscountApplied", configDigestRule, subscriberRule) + if err != nil { + return nil, err + } + return &FeeManagerNoNativeDiscountAppliedIterator{contract: _FeeManagerNoNative.contract, event: "DiscountApplied", logs: logs, sub: sub}, nil +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) WatchDiscountApplied(opts *bind.WatchOpts, sink chan<- *FeeManagerNoNativeDiscountApplied, configDigest [][32]byte, subscriber []common.Address) (event.Subscription, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + var subscriberRule []interface{} + for _, subscriberItem := range subscriber { + subscriberRule = append(subscriberRule, subscriberItem) + } + + logs, sub, err := _FeeManagerNoNative.contract.WatchLogs(opts, "DiscountApplied", configDigestRule, subscriberRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(FeeManagerNoNativeDiscountApplied) + if err := _FeeManagerNoNative.contract.UnpackLog(event, "DiscountApplied", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) ParseDiscountApplied(log types.Log) (*FeeManagerNoNativeDiscountApplied, error) { + event := new(FeeManagerNoNativeDiscountApplied) + if err := _FeeManagerNoNative.contract.UnpackLog(event, "DiscountApplied", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type FeeManagerNoNativeInsufficientLinkIterator struct { + Event *FeeManagerNoNativeInsufficientLink + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeManagerNoNativeInsufficientLinkIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeManagerNoNativeInsufficientLink) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeManagerNoNativeInsufficientLink) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeManagerNoNativeInsufficientLinkIterator) Error() error { + return it.fail +} + +func (it *FeeManagerNoNativeInsufficientLinkIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeManagerNoNativeInsufficientLink struct { + Rewards []IRewardManagerFeePayment + Raw types.Log +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) FilterInsufficientLink(opts *bind.FilterOpts) (*FeeManagerNoNativeInsufficientLinkIterator, error) { + + logs, sub, err := _FeeManagerNoNative.contract.FilterLogs(opts, "InsufficientLink") + if err != nil { + return nil, err + } + return &FeeManagerNoNativeInsufficientLinkIterator{contract: _FeeManagerNoNative.contract, event: "InsufficientLink", logs: logs, sub: sub}, nil +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) WatchInsufficientLink(opts *bind.WatchOpts, sink chan<- *FeeManagerNoNativeInsufficientLink) (event.Subscription, error) { + + logs, sub, err := _FeeManagerNoNative.contract.WatchLogs(opts, "InsufficientLink") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(FeeManagerNoNativeInsufficientLink) + if err := _FeeManagerNoNative.contract.UnpackLog(event, "InsufficientLink", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) ParseInsufficientLink(log types.Log) (*FeeManagerNoNativeInsufficientLink, error) { + event := new(FeeManagerNoNativeInsufficientLink) + if err := _FeeManagerNoNative.contract.UnpackLog(event, "InsufficientLink", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type FeeManagerNoNativeLinkDeficitClearedIterator struct { + Event *FeeManagerNoNativeLinkDeficitCleared + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeManagerNoNativeLinkDeficitClearedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeManagerNoNativeLinkDeficitCleared) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeManagerNoNativeLinkDeficitCleared) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeManagerNoNativeLinkDeficitClearedIterator) Error() error { + return it.fail +} + +func (it *FeeManagerNoNativeLinkDeficitClearedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeManagerNoNativeLinkDeficitCleared struct { + ConfigDigest [32]byte + LinkQuantity *big.Int + Raw types.Log +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) FilterLinkDeficitCleared(opts *bind.FilterOpts, configDigest [][32]byte) (*FeeManagerNoNativeLinkDeficitClearedIterator, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _FeeManagerNoNative.contract.FilterLogs(opts, "LinkDeficitCleared", configDigestRule) + if err != nil { + return nil, err + } + return &FeeManagerNoNativeLinkDeficitClearedIterator{contract: _FeeManagerNoNative.contract, event: "LinkDeficitCleared", logs: logs, sub: sub}, nil +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) WatchLinkDeficitCleared(opts *bind.WatchOpts, sink chan<- *FeeManagerNoNativeLinkDeficitCleared, configDigest [][32]byte) (event.Subscription, error) { + + var configDigestRule []interface{} + for _, configDigestItem := range configDigest { + configDigestRule = append(configDigestRule, configDigestItem) + } + + logs, sub, err := _FeeManagerNoNative.contract.WatchLogs(opts, "LinkDeficitCleared", configDigestRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(FeeManagerNoNativeLinkDeficitCleared) + if err := _FeeManagerNoNative.contract.UnpackLog(event, "LinkDeficitCleared", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) ParseLinkDeficitCleared(log types.Log) (*FeeManagerNoNativeLinkDeficitCleared, error) { + event := new(FeeManagerNoNativeLinkDeficitCleared) + if err := _FeeManagerNoNative.contract.UnpackLog(event, "LinkDeficitCleared", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type FeeManagerNoNativeNativeSurchargeUpdatedIterator struct { + Event *FeeManagerNoNativeNativeSurchargeUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeManagerNoNativeNativeSurchargeUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeManagerNoNativeNativeSurchargeUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeManagerNoNativeNativeSurchargeUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeManagerNoNativeNativeSurchargeUpdatedIterator) Error() error { + return it.fail +} + +func (it *FeeManagerNoNativeNativeSurchargeUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeManagerNoNativeNativeSurchargeUpdated struct { + NewSurcharge uint64 + Raw types.Log +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) FilterNativeSurchargeUpdated(opts *bind.FilterOpts) (*FeeManagerNoNativeNativeSurchargeUpdatedIterator, error) { + + logs, sub, err := _FeeManagerNoNative.contract.FilterLogs(opts, "NativeSurchargeUpdated") + if err != nil { + return nil, err + } + return &FeeManagerNoNativeNativeSurchargeUpdatedIterator{contract: _FeeManagerNoNative.contract, event: "NativeSurchargeUpdated", logs: logs, sub: sub}, nil +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) WatchNativeSurchargeUpdated(opts *bind.WatchOpts, sink chan<- *FeeManagerNoNativeNativeSurchargeUpdated) (event.Subscription, error) { + + logs, sub, err := _FeeManagerNoNative.contract.WatchLogs(opts, "NativeSurchargeUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(FeeManagerNoNativeNativeSurchargeUpdated) + if err := _FeeManagerNoNative.contract.UnpackLog(event, "NativeSurchargeUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) ParseNativeSurchargeUpdated(log types.Log) (*FeeManagerNoNativeNativeSurchargeUpdated, error) { + event := new(FeeManagerNoNativeNativeSurchargeUpdated) + if err := _FeeManagerNoNative.contract.UnpackLog(event, "NativeSurchargeUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type FeeManagerNoNativeOwnershipTransferRequestedIterator struct { + Event *FeeManagerNoNativeOwnershipTransferRequested + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeManagerNoNativeOwnershipTransferRequestedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeManagerNoNativeOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeManagerNoNativeOwnershipTransferRequested) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeManagerNoNativeOwnershipTransferRequestedIterator) Error() error { + return it.fail +} + +func (it *FeeManagerNoNativeOwnershipTransferRequestedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeManagerNoNativeOwnershipTransferRequested struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*FeeManagerNoNativeOwnershipTransferRequestedIterator, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _FeeManagerNoNative.contract.FilterLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return &FeeManagerNoNativeOwnershipTransferRequestedIterator{contract: _FeeManagerNoNative.contract, event: "OwnershipTransferRequested", logs: logs, sub: sub}, nil +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *FeeManagerNoNativeOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _FeeManagerNoNative.contract.WatchLogs(opts, "OwnershipTransferRequested", fromRule, toRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(FeeManagerNoNativeOwnershipTransferRequested) + if err := _FeeManagerNoNative.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) ParseOwnershipTransferRequested(log types.Log) (*FeeManagerNoNativeOwnershipTransferRequested, error) { + event := new(FeeManagerNoNativeOwnershipTransferRequested) + if err := _FeeManagerNoNative.contract.UnpackLog(event, "OwnershipTransferRequested", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type FeeManagerNoNativeOwnershipTransferredIterator struct { + Event *FeeManagerNoNativeOwnershipTransferred + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeManagerNoNativeOwnershipTransferredIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeManagerNoNativeOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeManagerNoNativeOwnershipTransferred) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeManagerNoNativeOwnershipTransferredIterator) Error() error { + return it.fail +} + +func (it *FeeManagerNoNativeOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeManagerNoNativeOwnershipTransferred struct { + From common.Address + To common.Address + Raw types.Log +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*FeeManagerNoNativeOwnershipTransferredIterator, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _FeeManagerNoNative.contract.FilterLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return &FeeManagerNoNativeOwnershipTransferredIterator{contract: _FeeManagerNoNative.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *FeeManagerNoNativeOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) { + + var fromRule []interface{} + for _, fromItem := range from { + fromRule = append(fromRule, fromItem) + } + var toRule []interface{} + for _, toItem := range to { + toRule = append(toRule, toItem) + } + + logs, sub, err := _FeeManagerNoNative.contract.WatchLogs(opts, "OwnershipTransferred", fromRule, toRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(FeeManagerNoNativeOwnershipTransferred) + if err := _FeeManagerNoNative.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) ParseOwnershipTransferred(log types.Log) (*FeeManagerNoNativeOwnershipTransferred, error) { + event := new(FeeManagerNoNativeOwnershipTransferred) + if err := _FeeManagerNoNative.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type FeeManagerNoNativeSubscriberDiscountUpdatedIterator struct { + Event *FeeManagerNoNativeSubscriberDiscountUpdated + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeManagerNoNativeSubscriberDiscountUpdatedIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeManagerNoNativeSubscriberDiscountUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeManagerNoNativeSubscriberDiscountUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeManagerNoNativeSubscriberDiscountUpdatedIterator) Error() error { + return it.fail +} + +func (it *FeeManagerNoNativeSubscriberDiscountUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeManagerNoNativeSubscriberDiscountUpdated struct { + Subscriber common.Address + FeedId [32]byte + Token common.Address + Discount uint64 + Raw types.Log +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) FilterSubscriberDiscountUpdated(opts *bind.FilterOpts, subscriber []common.Address, feedId [][32]byte) (*FeeManagerNoNativeSubscriberDiscountUpdatedIterator, error) { + + var subscriberRule []interface{} + for _, subscriberItem := range subscriber { + subscriberRule = append(subscriberRule, subscriberItem) + } + var feedIdRule []interface{} + for _, feedIdItem := range feedId { + feedIdRule = append(feedIdRule, feedIdItem) + } + + logs, sub, err := _FeeManagerNoNative.contract.FilterLogs(opts, "SubscriberDiscountUpdated", subscriberRule, feedIdRule) + if err != nil { + return nil, err + } + return &FeeManagerNoNativeSubscriberDiscountUpdatedIterator{contract: _FeeManagerNoNative.contract, event: "SubscriberDiscountUpdated", logs: logs, sub: sub}, nil +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) WatchSubscriberDiscountUpdated(opts *bind.WatchOpts, sink chan<- *FeeManagerNoNativeSubscriberDiscountUpdated, subscriber []common.Address, feedId [][32]byte) (event.Subscription, error) { + + var subscriberRule []interface{} + for _, subscriberItem := range subscriber { + subscriberRule = append(subscriberRule, subscriberItem) + } + var feedIdRule []interface{} + for _, feedIdItem := range feedId { + feedIdRule = append(feedIdRule, feedIdItem) + } + + logs, sub, err := _FeeManagerNoNative.contract.WatchLogs(opts, "SubscriberDiscountUpdated", subscriberRule, feedIdRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(FeeManagerNoNativeSubscriberDiscountUpdated) + if err := _FeeManagerNoNative.contract.UnpackLog(event, "SubscriberDiscountUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) ParseSubscriberDiscountUpdated(log types.Log) (*FeeManagerNoNativeSubscriberDiscountUpdated, error) { + event := new(FeeManagerNoNativeSubscriberDiscountUpdated) + if err := _FeeManagerNoNative.contract.UnpackLog(event, "SubscriberDiscountUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +type FeeManagerNoNativeWithdrawIterator struct { + Event *FeeManagerNoNativeWithdraw + + contract *bind.BoundContract + event string + + logs chan types.Log + sub ethereum.Subscription + done bool + fail error +} + +func (it *FeeManagerNoNativeWithdrawIterator) Next() bool { + + if it.fail != nil { + return false + } + + if it.done { + select { + case log := <-it.logs: + it.Event = new(FeeManagerNoNativeWithdraw) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + + select { + case log := <-it.logs: + it.Event = new(FeeManagerNoNativeWithdraw) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +func (it *FeeManagerNoNativeWithdrawIterator) Error() error { + return it.fail +} + +func (it *FeeManagerNoNativeWithdrawIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +type FeeManagerNoNativeWithdraw struct { + AdminAddress common.Address + Recipient common.Address + AssetAddress common.Address + Quantity *big.Int + Raw types.Log +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) FilterWithdraw(opts *bind.FilterOpts) (*FeeManagerNoNativeWithdrawIterator, error) { + + logs, sub, err := _FeeManagerNoNative.contract.FilterLogs(opts, "Withdraw") + if err != nil { + return nil, err + } + return &FeeManagerNoNativeWithdrawIterator{contract: _FeeManagerNoNative.contract, event: "Withdraw", logs: logs, sub: sub}, nil +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) WatchWithdraw(opts *bind.WatchOpts, sink chan<- *FeeManagerNoNativeWithdraw) (event.Subscription, error) { + + logs, sub, err := _FeeManagerNoNative.contract.WatchLogs(opts, "Withdraw") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + + event := new(FeeManagerNoNativeWithdraw) + if err := _FeeManagerNoNative.contract.UnpackLog(event, "Withdraw", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +func (_FeeManagerNoNative *FeeManagerNoNativeFilterer) ParseWithdraw(log types.Log) (*FeeManagerNoNativeWithdraw, error) { + event := new(FeeManagerNoNativeWithdraw) + if err := _FeeManagerNoNative.contract.UnpackLog(event, "Withdraw", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func (_FeeManagerNoNative *FeeManagerNoNative) ParseLog(log types.Log) (generated.AbigenLog, error) { + switch log.Topics[0] { + case _FeeManagerNoNative.abi.Events["DiscountApplied"].ID: + return _FeeManagerNoNative.ParseDiscountApplied(log) + case _FeeManagerNoNative.abi.Events["InsufficientLink"].ID: + return _FeeManagerNoNative.ParseInsufficientLink(log) + case _FeeManagerNoNative.abi.Events["LinkDeficitCleared"].ID: + return _FeeManagerNoNative.ParseLinkDeficitCleared(log) + case _FeeManagerNoNative.abi.Events["NativeSurchargeUpdated"].ID: + return _FeeManagerNoNative.ParseNativeSurchargeUpdated(log) + case _FeeManagerNoNative.abi.Events["OwnershipTransferRequested"].ID: + return _FeeManagerNoNative.ParseOwnershipTransferRequested(log) + case _FeeManagerNoNative.abi.Events["OwnershipTransferred"].ID: + return _FeeManagerNoNative.ParseOwnershipTransferred(log) + case _FeeManagerNoNative.abi.Events["SubscriberDiscountUpdated"].ID: + return _FeeManagerNoNative.ParseSubscriberDiscountUpdated(log) + case _FeeManagerNoNative.abi.Events["Withdraw"].ID: + return _FeeManagerNoNative.ParseWithdraw(log) + + default: + return nil, fmt.Errorf("abigen wrapper received unknown log topic: %v", log.Topics[0]) + } +} + +func (FeeManagerNoNativeDiscountApplied) Topic() common.Hash { + return common.HexToHash("0x88b15eb682210089cddf967648e2cb2a4535aeadc8f8f36050922e33c04e7125") +} + +func (FeeManagerNoNativeInsufficientLink) Topic() common.Hash { + return common.HexToHash("0xf52e5907b69d97c33392936c12d78b494463b78c5b72df50b4c497eee5720b67") +} + +func (FeeManagerNoNativeLinkDeficitCleared) Topic() common.Hash { + return common.HexToHash("0x843f0b103e50b42b08f9d30f12f961845a6d02623730872e24644899c0dd9895") +} + +func (FeeManagerNoNativeNativeSurchargeUpdated) Topic() common.Hash { + return common.HexToHash("0x08f7c0d17932ddb8523bc06754d42ff19ebc77d76a8b9bfde02c28ab1ed3d639") +} + +func (FeeManagerNoNativeOwnershipTransferRequested) Topic() common.Hash { + return common.HexToHash("0xed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae1278") +} + +func (FeeManagerNoNativeOwnershipTransferred) Topic() common.Hash { + return common.HexToHash("0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0") +} + +func (FeeManagerNoNativeSubscriberDiscountUpdated) Topic() common.Hash { + return common.HexToHash("0x5eba5a8afa39780f0f99b6cbeb95f3da6a7040ca00abd46bdc91a0a060134139") +} + +func (FeeManagerNoNativeWithdraw) Topic() common.Hash { + return common.HexToHash("0x7ff78a71698bdb18dcca96f52ab25e0a1b146fb6a49adf8e6845299e49021f29") +} + +func (_FeeManagerNoNative *FeeManagerNoNative) Address() common.Address { + return _FeeManagerNoNative.address +} + +type FeeManagerNoNativeInterface interface { + GetFeeAndReward(opts *bind.CallOpts, subscriber common.Address, report []byte, quoteAddress common.Address) (CommonAsset, CommonAsset, *big.Int, error) + + ILinkAddress(opts *bind.CallOpts) (common.Address, error) + + INativeAddress(opts *bind.CallOpts) (common.Address, error) + + IProxyAddress(opts *bind.CallOpts) (common.Address, error) + + IRewardManager(opts *bind.CallOpts) (common.Address, error) + + LinkAvailableForPayment(opts *bind.CallOpts) (*big.Int, error) + + Owner(opts *bind.CallOpts) (common.Address, error) + + SLinkDeficit(opts *bind.CallOpts, arg0 [32]byte) (*big.Int, error) + + SNativeSurcharge(opts *bind.CallOpts) (*big.Int, error) + + SSubscriberDiscounts(opts *bind.CallOpts, arg0 common.Address, arg1 [32]byte, arg2 common.Address) (*big.Int, error) + + SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) + + TypeAndVersion(opts *bind.CallOpts) (string, error) + + AcceptOwnership(opts *bind.TransactOpts) (*types.Transaction, error) + + PayLinkDeficit(opts *bind.TransactOpts, configDigest [32]byte) (*types.Transaction, error) + + ProcessFee(opts *bind.TransactOpts, payload []byte, parameterPayload []byte, subscriber common.Address) (*types.Transaction, error) + + ProcessFeeBulk(opts *bind.TransactOpts, payloads [][]byte, parameterPayload []byte, subscriber common.Address) (*types.Transaction, error) + + SetFeeRecipients(opts *bind.TransactOpts, configDigest [32]byte, rewardRecipientAndWeights []CommonAddressAndWeight) (*types.Transaction, error) + + SetNativeSurcharge(opts *bind.TransactOpts, surcharge uint64) (*types.Transaction, error) + + TransferOwnership(opts *bind.TransactOpts, to common.Address) (*types.Transaction, error) + + UpdateSubscriberDiscount(opts *bind.TransactOpts, subscriber common.Address, feedId [32]byte, token common.Address, discount uint64) (*types.Transaction, error) + + Withdraw(opts *bind.TransactOpts, assetAddress common.Address, recipient common.Address, quantity *big.Int) (*types.Transaction, error) + + FilterDiscountApplied(opts *bind.FilterOpts, configDigest [][32]byte, subscriber []common.Address) (*FeeManagerNoNativeDiscountAppliedIterator, error) + + WatchDiscountApplied(opts *bind.WatchOpts, sink chan<- *FeeManagerNoNativeDiscountApplied, configDigest [][32]byte, subscriber []common.Address) (event.Subscription, error) + + ParseDiscountApplied(log types.Log) (*FeeManagerNoNativeDiscountApplied, error) + + FilterInsufficientLink(opts *bind.FilterOpts) (*FeeManagerNoNativeInsufficientLinkIterator, error) + + WatchInsufficientLink(opts *bind.WatchOpts, sink chan<- *FeeManagerNoNativeInsufficientLink) (event.Subscription, error) + + ParseInsufficientLink(log types.Log) (*FeeManagerNoNativeInsufficientLink, error) + + FilterLinkDeficitCleared(opts *bind.FilterOpts, configDigest [][32]byte) (*FeeManagerNoNativeLinkDeficitClearedIterator, error) + + WatchLinkDeficitCleared(opts *bind.WatchOpts, sink chan<- *FeeManagerNoNativeLinkDeficitCleared, configDigest [][32]byte) (event.Subscription, error) + + ParseLinkDeficitCleared(log types.Log) (*FeeManagerNoNativeLinkDeficitCleared, error) + + FilterNativeSurchargeUpdated(opts *bind.FilterOpts) (*FeeManagerNoNativeNativeSurchargeUpdatedIterator, error) + + WatchNativeSurchargeUpdated(opts *bind.WatchOpts, sink chan<- *FeeManagerNoNativeNativeSurchargeUpdated) (event.Subscription, error) + + ParseNativeSurchargeUpdated(log types.Log) (*FeeManagerNoNativeNativeSurchargeUpdated, error) + + FilterOwnershipTransferRequested(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*FeeManagerNoNativeOwnershipTransferRequestedIterator, error) + + WatchOwnershipTransferRequested(opts *bind.WatchOpts, sink chan<- *FeeManagerNoNativeOwnershipTransferRequested, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferRequested(log types.Log) (*FeeManagerNoNativeOwnershipTransferRequested, error) + + FilterOwnershipTransferred(opts *bind.FilterOpts, from []common.Address, to []common.Address) (*FeeManagerNoNativeOwnershipTransferredIterator, error) + + WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *FeeManagerNoNativeOwnershipTransferred, from []common.Address, to []common.Address) (event.Subscription, error) + + ParseOwnershipTransferred(log types.Log) (*FeeManagerNoNativeOwnershipTransferred, error) + + FilterSubscriberDiscountUpdated(opts *bind.FilterOpts, subscriber []common.Address, feedId [][32]byte) (*FeeManagerNoNativeSubscriberDiscountUpdatedIterator, error) + + WatchSubscriberDiscountUpdated(opts *bind.WatchOpts, sink chan<- *FeeManagerNoNativeSubscriberDiscountUpdated, subscriber []common.Address, feedId [][32]byte) (event.Subscription, error) + + ParseSubscriberDiscountUpdated(log types.Log) (*FeeManagerNoNativeSubscriberDiscountUpdated, error) + + FilterWithdraw(opts *bind.FilterOpts) (*FeeManagerNoNativeWithdrawIterator, error) + + WatchWithdraw(opts *bind.WatchOpts, sink chan<- *FeeManagerNoNativeWithdraw) (event.Subscription, error) + + ParseWithdraw(log types.Log) (*FeeManagerNoNativeWithdraw, error) + + ParseLog(log types.Log) (generated.AbigenLog, error) + + Address() common.Address +} diff --git a/core/gethwrappers/llo-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt b/core/gethwrappers/llo-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt index 729d3a295cd..dd0b909d359 100644 --- a/core/gethwrappers/llo-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt +++ b/core/gethwrappers/llo-feeds/generation/generated-wrapper-dependency-versions-do-not-edit.txt @@ -6,6 +6,7 @@ errored_verifier: ../../../contracts/solc/v0.8.19/ErroredVerifier/ErroredVerifie exposed_channel_verifier: ../../../contracts/solc/v0.8.19/ExposedChannelVerifier/ExposedChannelVerifier.abi ../../../contracts/solc/v0.8.19/ExposedChannelVerifier/ExposedChannelVerifier.bin c21cde078900241c06de69e2bc5d906c5ef558b52db66caa68bed065940a2253 exposed_verifier: ../../../contracts/solc/v0.8.19/ExposedVerifier/ExposedVerifier.abi ../../../contracts/solc/v0.8.19/ExposedVerifier/ExposedVerifier.bin 00816ab345f768e522c79abadeadf9155c2c688067e18f8f73e5d6ab71037663 fee_manager: ../../../contracts/solc/v0.8.19/FeeManager/FeeManager.abi ../../../contracts/solc/v0.8.19/FeeManager/FeeManager.bin edc85f34294ae7c90d45c4c71eb5c105c60a4842dfbbf700c692870ffcc403a1 +fee_manager_no_native: ../../../contracts/solc/v0.8.19/FeeManagerNoNative/FeeManagerNoNative.abi ../../../contracts/solc/v0.8.19/FeeManagerNoNative/FeeManagerNoNative.bin eb72121945e70b91fb75c55abb910259d100c4765f156eed3aa0502fecd1c978 llo_feeds: ../../../contracts/solc/v0.8.19/FeeManager.abi ../../../contracts/solc/v0.8.19/FeeManager.bin cb71e018f67e49d7bc0e194c822204dfd59f79ff42e4fc8fd8ab63f3acd71361 llo_feeds_test: ../../../contracts/solc/v0.8.19/ExposedVerifier.abi ../../../contracts/solc/v0.8.19/ExposedVerifier.bin 6932cea8f2738e874d3ec9e1a4231d2421704030c071d9e15dd2f7f08482c246 reward_manager: ../../../contracts/solc/v0.8.19/RewardManager/RewardManager.abi ../../../contracts/solc/v0.8.19/RewardManager/RewardManager.bin 7996cbc89a7f9af85b1ca4079ecf782d7138626b3f4bdb3bfa996248c9ccb9f4 diff --git a/core/gethwrappers/llo-feeds/go_generate.go b/core/gethwrappers/llo-feeds/go_generate.go index 5e5b841b72d..3fc5451b10a 100644 --- a/core/gethwrappers/llo-feeds/go_generate.go +++ b/core/gethwrappers/llo-feeds/go_generate.go @@ -9,6 +9,7 @@ package gethwrappers //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/ExposedVerifier/ExposedVerifier.abi ../../../contracts/solc/v0.8.19/ExposedVerifier/ExposedVerifier.bin ExposedVerifier exposed_verifier //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/RewardManager/RewardManager.abi ../../../contracts/solc/v0.8.19/RewardManager/RewardManager.bin RewardManager reward_manager //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/FeeManager/FeeManager.abi ../../../contracts/solc/v0.8.19/FeeManager/FeeManager.bin FeeManager fee_manager +//go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/FeeManagerNoNative/FeeManagerNoNative.abi ../../../contracts/solc/v0.8.19/FeeManagerNoNative/FeeManagerNoNative.bin FeeManagerNoNative fee_manager_no_native //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/ChannelConfigStore/ChannelConfigStore.abi ../../../contracts/solc/v0.8.19/ChannelConfigStore/ChannelConfigStore.bin ChannelConfigStore channel_config_store //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/ChannelVerifier/ChannelVerifier.abi ../../../contracts/solc/v0.8.19/ChannelVerifier/ChannelVerifier.bin ChannelVerifier channel_verifier //go:generate go run ../generation/generate/wrap.go ../../../contracts/solc/v0.8.19/ExposedChannelVerifier/ExposedChannelVerifier.abi ../../../contracts/solc/v0.8.19/ExposedChannelVerifier/ExposedChannelVerifier.bin ExposedChannelVerifier exposed_channel_verifier