Bananapus/nana-core

bug: testFuzzMultiCurrencyAllowance failing fuzz case

Closed this issue · 4 comments

I found a fuzz seed in which testFuzzMultiCurrencyAllowance fails as copied below.

If you put this line into a file named failures (no extension, if you add .txt for example, forge will ignore it) in cache/fuzz/ and then run forge test, you should be able to replicate: cc 2804b41053a622a41e6db11253db5c040d98551fe5fb19213272f0e8df2e39f7 # shrinks to 0xf8094f79000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000000000


How testFuzzMultiCurrencyAllowance fails:

proptest: Saving this and future failures in cache/fuzz/failures
proptest: If this test was run on a CI system, you may wish to add the following line to your copy of the file. (You may need to create it.)
cc 2804b41053a622a41e6db11253db5c040d98551fe5fb19213272f0e8df2e39f7

Ran 6 tests for test/TestAccessToFunds.sol:TestAccessToFunds_Local
[FAIL. Reason: assertion failed; counterexample: calldata=0xf8094f79000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000000000 args=[0, 2, 3, 0, 2000, 0]] testFuzzMultiCurrencyAllowance(uint224,uint224,uint256,uint224,uint224,uint256) (runs: 236, μ: 2372004, ~: 2329808)
Logs:
  Bound Result 3
  Bound Result 0
  Error: a == b not satisfied [uint]
        Left: 0
       Right: 1
  Error: a == b not satisfied [uint]
        Left: 0
       Right: 1

Traces:
  [1978942] TestAccessToFunds_Local::testFuzzMultiCurrencyAllowance(0, 2, 3, 0, 2000, 0)
    ├─ [0] console::log("Bound Result", 3) [staticcall]
    │   └─ ← ()
    ├─ [266] ERC20::decimals() [staticcall]
    │   └─ ← 6
    ├─ [0] console::log("Bound Result", 0) [staticcall]
    │   └─ ← ()
    ├─ [0] VM::assume(true) [staticcall]
    │   └─ ← ()
    ├─ [0] VM::assume(true) [staticcall]
    │   └─ ← ()
    ├─ [551804] JBController::launchProjectFor(0x00000000000000000000000000000000000001a4, "whatever", [JBRulesetConfig({ mustStartAtOrAfter: 0, duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: JBRulesetMetadata({ reservedRate: 5000, redemptionRate: 5000, baseCurrency: 61166 [6.116e4], pausePay: false, pauseCreditTransfers: false, allowOwnerMinting: false, allowTerminalMigration: false, allowSetTerminals: false, allowControllerMigration: false, allowSetController: false, holdFees: false, useTotalSurplusForRedemptions: true, useDataHookForPay: false, useDataHookForRedeem: false, dataHook: 0x0000000000000000000000000000000000000000, metadata: 0 }), splitGroups: [], fundAccessLimitGroups: [JBFundAccessLimitGroup({ terminal: 0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233, token: 0x000000000000000000000000000000000000EEEe, payoutLimits: [JBCurrencyAmount({ amount: 2, currency: 61166 [6.116e4] }), JBCurrencyAmount({ amount: 2000, currency: 1903754239 [1.903e9] })], surplusAllowances: [JBCurrencyAmount({ amount: 0, currency: 61166 [6.116e4] }), JBCurrencyAmount({ amount: 0, currency: 1903754239 [1.903e9] })] })] })], [JBTerminalConfig({ terminal: 0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233, tokensToAccept: [0x000000000000000000000000000000000000EEEe, 0xD6BbDE9174b1CdAa358d2Cf4D57D1a9F7178FBfF] })], "")
    │   ├─ [124034] JBProjects::createFor(0x00000000000000000000000000000000000001a4)
    │   │   ├─ emit Transfer(from: 0x0000000000000000000000000000000000000000, to: 0x00000000000000000000000000000000000001a4, tokenId: 1)
    │   │   ├─ emit Create(projectId: 1, owner: 0x00000000000000000000000000000000000001a4, caller: JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9])
    │   │   └─ ← 1
    │   ├─ [28931] JBDirectory::setControllerOf(1, JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9])
    │   │   ├─ [620] JBProjects::ownerOf(1) [staticcall]
    │   │   │   └─ ← 0x00000000000000000000000000000000000001a4
    │   │   ├─ [364] JBProjects::count() [staticcall]
    │   │   │   └─ ← 1
    │   │   ├─ emit SetController(projectId: 1, controller: JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9], caller: JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9])
    │   │   └─ ← ()
    │   ├─ [78591] JBRulesets::queueFor(1, 0, 1000000000000000000000 [1e21], 0, 0x0000000000000000000000000000000000000000, 75557867929215080413313 [7.555e22], 0)
    │   │   ├─ [512] JBDirectory::controllerOf(1) [staticcall]
    │   │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   │   ├─ emit RulesetInitialized(rulesetId: 1643802347 [1.643e9], projectId: 1, basedOnId: 0)
    │   │   ├─ emit RulesetQueued(rulesetId: 1643802347 [1.643e9], projectId: 1, duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, hook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22], mustStartAtOrAfter: 1643802347 [1.643e9], caller: JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9])
    │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] })
    │   ├─ [1531] JBSplits::setSplitGroupsOf(1, 1643802347 [1.643e9], [])
    │   │   ├─ [512] JBDirectory::controllerOf(1) [staticcall]
    │   │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   │   └─ ← ()
    │   ├─ [80384] JBFundAccessLimits::setFundAccessLimitsFor(1, 1643802347 [1.643e9], [JBFundAccessLimitGroup({ terminal: 0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233, token: 0x000000000000000000000000000000000000EEEe, payoutLimits: [JBCurrencyAmount({ amount: 2, currency: 61166 [6.116e4] }), JBCurrencyAmount({ amount: 2000, currency: 1903754239 [1.903e9] })], surplusAllowances: [JBCurrencyAmount({ amount: 0, currency: 61166 [6.116e4] }), JBCurrencyAmount({ amount: 0, currency: 1903754239 [1.903e9] })] })])
    │   │   ├─ [512] JBDirectory::controllerOf(1) [staticcall]
    │   │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   │   ├─ emit SetFundAccessLimits(rulesetId: 1643802347 [1.643e9], projectId: 1, limits: JBFundAccessLimitGroup({ terminal: 0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233, token: 0x000000000000000000000000000000000000EEEe, payoutLimits: [JBCurrencyAmount({ amount: 2, currency: 61166 [6.116e4] }), JBCurrencyAmount({ amount: 2000, currency: 1903754239 [1.903e9] })], surplusAllowances: [JBCurrencyAmount({ amount: 0, currency: 61166 [6.116e4] }), JBCurrencyAmount({ amount: 0, currency: 1903754239 [1.903e9] })] }), caller: JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9])
    │   │   └─ ← ()
    │   ├─ [123870] JBMultiTerminal::addAccountingContextsFor(1, [0x000000000000000000000000000000000000EEEe, 0xD6BbDE9174b1CdAa358d2Cf4D57D1a9F7178FBfF])
    │   │   ├─ [620] JBProjects::ownerOf(1) [staticcall]
    │   │   │   └─ ← 0x00000000000000000000000000000000000001a4
    │   │   ├─ [512] JBDirectory::controllerOf(1) [staticcall]
    │   │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   │   ├─ emit SetAccountingContext(projectId: 1, token: 0x000000000000000000000000000000000000EEEe, context: JBAccountingContext({ token: 0x000000000000000000000000000000000000EEEe, decimals: 18, currency: 61166 [6.116e4] }), caller: JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9])
    │   │   ├─ [266] ERC20::decimals() [staticcall]
    │   │   │   └─ ← 6
    │   │   ├─ emit SetAccountingContext(projectId: 1, token: ERC20: [0xD6BbDE9174b1CdAa358d2Cf4D57D1a9F7178FBfF], context: JBAccountingContext({ token: 0xD6BbDE9174b1CdAa358d2Cf4D57D1a9F7178FBfF, decimals: 6, currency: 1903754239 [1.903e9] }), caller: JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9])
    │   │   └─ ← ()
    │   ├─ [57486] JBDirectory::setTerminalsOf(1, [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233])
    │   │   ├─ [620] JBProjects::ownerOf(1) [staticcall]
    │   │   │   └─ ← 0x00000000000000000000000000000000000001a4
    │   │   ├─ [579] JBController::supportsInterface(0x2877540700000000000000000000000000000000000000000000000000000000) [staticcall]
    │   │   │   └─ ← true
    │   │   ├─ [6544] JBController::setTerminalsAllowed(1) [staticcall]
    │   │   │   ├─ [4145] JBRulesets::currentOf(1) [staticcall]
    │   │   │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] })
    │   │   │   └─ ← false
    │   │   ├─ emit SetTerminals(projectId: 1, terminals: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], caller: JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9])
    │   │   └─ ← ()
    │   ├─ emit LaunchProject(rulesetId: 1643802347 [1.643e9], projectId: 1, metadata: "whatever", memo: "", caller: TestAccessToFunds_Local: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496])
    │   └─ ← 1
    ├─ [467663] JBController::launchProjectFor(projectOwner: [0x000000000000000000000000000000000000007B], "myIPFSHash", [JBRulesetConfig({ mustStartAtOrAfter: 0, duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: JBRulesetMetadata({ reservedRate: 5000, redemptionRate: 5000, baseCurrency: 61166 [6.116e4], pausePay: false, pauseCreditTransfers: false, allowOwnerMinting: false, allowTerminalMigration: false, allowSetTerminals: false, allowControllerMigration: false, allowSetController: false, holdFees: false, useTotalSurplusForRedemptions: true, useDataHookForPay: false, useDataHookForRedeem: false, dataHook: 0x0000000000000000000000000000000000000000, metadata: 0 }), splitGroups: [], fundAccessLimitGroups: [JBFundAccessLimitGroup({ terminal: 0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233, token: 0x000000000000000000000000000000000000EEEe, payoutLimits: [JBCurrencyAmount({ amount: 2, currency: 61166 [6.116e4] }), JBCurrencyAmount({ amount: 2000, currency: 1903754239 [1.903e9] })], surplusAllowances: [JBCurrencyAmount({ amount: 0, currency: 61166 [6.116e4] }), JBCurrencyAmount({ amount: 0, currency: 1903754239 [1.903e9] })] })] })], [JBTerminalConfig({ terminal: 0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233, tokensToAccept: [0x000000000000000000000000000000000000EEEe, 0xD6BbDE9174b1CdAa358d2Cf4D57D1a9F7178FBfF] })], "")
    │   ├─ [56893] JBProjects::createFor(projectOwner: [0x000000000000000000000000000000000000007B])
    │   │   ├─ emit Transfer(from: 0x0000000000000000000000000000000000000000, to: projectOwner: [0x000000000000000000000000000000000000007B], tokenId: 2)
    │   │   ├─ emit Create(projectId: 2, owner: projectOwner: [0x000000000000000000000000000000000000007B], caller: JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9])
    │   │   └─ ← 2
    │   ├─ [26931] JBDirectory::setControllerOf(2, JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9])
    │   │   ├─ [620] JBProjects::ownerOf(2) [staticcall]
    │   │   │   └─ ← projectOwner: [0x000000000000000000000000000000000000007B]
    │   │   ├─ [364] JBProjects::count() [staticcall]
    │   │   │   └─ ← 2
    │   │   ├─ emit SetController(projectId: 2, controller: JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9], caller: JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9])
    │   │   └─ ← ()
    │   ├─ [78591] JBRulesets::queueFor(2, 0, 1000000000000000000000 [1e21], 0, 0x0000000000000000000000000000000000000000, 75557867929215080413313 [7.555e22], 0)
    │   │   ├─ [512] JBDirectory::controllerOf(2) [staticcall]
    │   │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   │   ├─ emit RulesetInitialized(rulesetId: 1643802347 [1.643e9], projectId: 2, basedOnId: 0)
    │   │   ├─ emit RulesetQueued(rulesetId: 1643802347 [1.643e9], projectId: 2, duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, hook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22], mustStartAtOrAfter: 1643802347 [1.643e9], caller: JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9])
    │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] })
    │   ├─ [1531] JBSplits::setSplitGroupsOf(2, 1643802347 [1.643e9], [])
    │   │   ├─ [512] JBDirectory::controllerOf(2) [staticcall]
    │   │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   │   └─ ← ()
    │   ├─ [80384] JBFundAccessLimits::setFundAccessLimitsFor(2, 1643802347 [1.643e9], [JBFundAccessLimitGroup({ terminal: 0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233, token: 0x000000000000000000000000000000000000EEEe, payoutLimits: [JBCurrencyAmount({ amount: 2, currency: 61166 [6.116e4] }), JBCurrencyAmount({ amount: 2000, currency: 1903754239 [1.903e9] })], surplusAllowances: [JBCurrencyAmount({ amount: 0, currency: 61166 [6.116e4] }), JBCurrencyAmount({ amount: 0, currency: 1903754239 [1.903e9] })] })])
    │   │   ├─ [512] JBDirectory::controllerOf(2) [staticcall]
    │   │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   │   ├─ emit SetFundAccessLimits(rulesetId: 1643802347 [1.643e9], projectId: 2, limits: JBFundAccessLimitGroup({ terminal: 0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233, token: 0x000000000000000000000000000000000000EEEe, payoutLimits: [JBCurrencyAmount({ amount: 2, currency: 61166 [6.116e4] }), JBCurrencyAmount({ amount: 2000, currency: 1903754239 [1.903e9] })], surplusAllowances: [JBCurrencyAmount({ amount: 0, currency: 61166 [6.116e4] }), JBCurrencyAmount({ amount: 0, currency: 1903754239 [1.903e9] })] }), caller: JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9])
    │   │   └─ ← ()
    │   ├─ [123870] JBMultiTerminal::addAccountingContextsFor(2, [0x000000000000000000000000000000000000EEEe, 0xD6BbDE9174b1CdAa358d2Cf4D57D1a9F7178FBfF])
    │   │   ├─ [620] JBProjects::ownerOf(2) [staticcall]
    │   │   │   └─ ← projectOwner: [0x000000000000000000000000000000000000007B]
    │   │   ├─ [512] JBDirectory::controllerOf(2) [staticcall]
    │   │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   │   ├─ emit SetAccountingContext(projectId: 2, token: 0x000000000000000000000000000000000000EEEe, context: JBAccountingContext({ token: 0x000000000000000000000000000000000000EEEe, decimals: 18, currency: 61166 [6.116e4] }), caller: JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9])
    │   │   ├─ [266] ERC20::decimals() [staticcall]
    │   │   │   └─ ← 6
    │   │   ├─ emit SetAccountingContext(projectId: 2, token: ERC20: [0xD6BbDE9174b1CdAa358d2Cf4D57D1a9F7178FBfF], context: JBAccountingContext({ token: 0xD6BbDE9174b1CdAa358d2Cf4D57D1a9F7178FBfF, decimals: 6, currency: 1903754239 [1.903e9] }), caller: JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9])
    │   │   └─ ← ()
    │   ├─ [57486] JBDirectory::setTerminalsOf(2, [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233])
    │   │   ├─ [620] JBProjects::ownerOf(2) [staticcall]
    │   │   │   └─ ← projectOwner: [0x000000000000000000000000000000000000007B]
    │   │   ├─ [579] JBController::supportsInterface(0x2877540700000000000000000000000000000000000000000000000000000000) [staticcall]
    │   │   │   └─ ← true
    │   │   ├─ [6544] JBController::setTerminalsAllowed(2) [staticcall]
    │   │   │   ├─ [4145] JBRulesets::currentOf(2) [staticcall]
    │   │   │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] })
    │   │   │   └─ ← false
    │   │   ├─ emit SetTerminals(projectId: 2, terminals: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], caller: JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9])
    │   │   └─ ← ()
    │   ├─ emit LaunchProject(rulesetId: 1643802347 [1.643e9], projectId: 2, metadata: "myIPFSHash", memo: "", caller: TestAccessToFunds_Local: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496])
    │   └─ ← 2
    ├─ [0] VM::startPrank(projectOwner: [0x000000000000000000000000000000000000007B])
    │   └─ ← ()
    ├─ [175358] → new Mock Price Feed Native-USDC@0x2Ce562Be1E6e71f3679d1D25D6DbF1bfF7073fB8
    │   └─ ← 654 bytes of code
    ├─ [0] VM::label(Mock Price Feed Native-USDC: [0x2Ce562Be1E6e71f3679d1D25D6DbF1bfF7073fB8], "Mock Price Feed Native-USDC")
    │   └─ ← ()
    ├─ [30442] JBPrices::addPriceFeedFor(0, 1903754239 [1.903e9], 61166 [6.116e4], Mock Price Feed Native-USDC: [0x2Ce562Be1E6e71f3679d1D25D6DbF1bfF7073fB8])
    │   ├─ emit AddPriceFeed(projectId: 0, pricingCurrency: 1903754239 [1.903e9], unitCurrency: 61166 [6.116e4], feed: Mock Price Feed Native-USDC: [0x2Ce562Be1E6e71f3679d1D25D6DbF1bfF7073fB8])
    │   └─ ← ()
    ├─ [0] VM::stopPrank()
    │   └─ ← ()
    ├─ [141179] JBMultiTerminal::pay{value: 3}(2, 0x000000000000000000000000000000000000EEEe, 3, beneficiary: [0x0000000000000000000000000000000000010f2C], 0, "", 0x)
    │   ├─ [35605] JBTerminalStore::recordPaymentFrom(TestAccessToFunds_Local: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496], JBTokenAmount({ token: 0x000000000000000000000000000000000000EEEe, value: 3, decimals: 18, currency: 61166 [6.116e4] }), 2, beneficiary: [0x0000000000000000000000000000000000010f2C], 0x)
    │   │   ├─ [4145] JBRulesets::currentOf(2) [staticcall]
    │   │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] })
    │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] }), 3000, []
    │   ├─ [512] JBDirectory::controllerOf(2) [staticcall]
    │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   ├─ [91192] JBController::mintTokensOf(2, 3000, beneficiary: [0x0000000000000000000000000000000000010f2C], "", true)
    │   │   ├─ [4145] JBRulesets::currentOf(2) [staticcall]
    │   │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] })
    │   │   ├─ [620] JBProjects::ownerOf(2) [staticcall]
    │   │   │   └─ ← projectOwner: [0x000000000000000000000000000000000000007B]
    │   │   ├─ [1064] JBDirectory::isTerminalOf(2, JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233]) [staticcall]
    │   │   │   └─ ← true
    │   │   ├─ [1064] JBDirectory::isTerminalOf(2, JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233]) [staticcall]
    │   │   │   └─ ← true
    │   │   ├─ [51284] JBTokens::mintFor(beneficiary: [0x0000000000000000000000000000000000010f2C], 2, 1500)
    │   │   │   ├─ [512] JBDirectory::controllerOf(2) [staticcall]
    │   │   │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   │   │   ├─ emit Mint(holder: beneficiary: [0x0000000000000000000000000000000000010f2C], projectId: 2, amount: 1500, tokensWereClaimed: false, caller: JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9])
    │   │   │   └─ ← ()
    │   │   ├─ emit MintTokens(beneficiary: beneficiary: [0x0000000000000000000000000000000000010f2C], projectId: 2, tokenCount: 3000, beneficiaryTokenCount: 1500, memo: "", reservedRate: 5000, caller: JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233])
    │   │   └─ ← 1500
    │   ├─ emit Pay(rulesetId: 1643802347 [1.643e9], rulesetCycleNumber: 1, projectId: 2, payer: TestAccessToFunds_Local: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496], beneficiary: beneficiary: [0x0000000000000000000000000000000000010f2C], amount: 3, beneficiaryTokenCount: 1500, memo: "", metadata: 0x, caller: TestAccessToFunds_Local: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496])
    │   └─ ← 1500
    ├─ [852] JBTokens::totalBalanceOf(beneficiary: [0x0000000000000000000000000000000000010f2C], 2) [staticcall]
    │   └─ ← 1500
    ├─ [6989] ERC20::mint(TestAccessToFunds_Local: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496], 0)
    │   ├─ emit Transfer(from: 0x0000000000000000000000000000000000000000, to: TestAccessToFunds_Local: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496], value: 0)
    │   └─ ← ()
    ├─ [4839] ERC20::approve(JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], 0)
    │   ├─ emit Approval(owner: TestAccessToFunds_Local: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496], spender: JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], value: 0)
    │   └─ ← true
    ├─ [32278] JBMultiTerminal::pay(2, ERC20: [0xD6BbDE9174b1CdAa358d2Cf4D57D1a9F7178FBfF], 0, beneficiary: [0x0000000000000000000000000000000000010f2C], 0, "", 0x)
    │   ├─ [2562] ERC20::balanceOf(JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233]) [staticcall]
    │   │   └─ ← 0
    │   ├─ [814] ERC20::allowance(TestAccessToFunds_Local: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496], JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233]) [staticcall]
    │   │   └─ ← 0
    │   ├─ [4162] ERC20::transferFrom(TestAccessToFunds_Local: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496], JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], 0)
    │   │   ├─ emit Transfer(from: TestAccessToFunds_Local: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496], to: JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], value: 0)
    │   │   └─ ← true
    │   ├─ [562] ERC20::balanceOf(JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233]) [staticcall]
    │   │   └─ ← 0
    │   ├─ [9986] JBTerminalStore::recordPaymentFrom(TestAccessToFunds_Local: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496], JBTokenAmount({ token: 0xD6BbDE9174b1CdAa358d2Cf4D57D1a9F7178FBfF, value: 0, decimals: 6, currency: 1903754239 [1.903e9] }), 2, beneficiary: [0x0000000000000000000000000000000000010f2C], 0x)
    │   │   ├─ [4145] JBRulesets::currentOf(2) [staticcall]
    │   │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] })
    │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] }), 0, []
    │   ├─ emit Pay(rulesetId: 1643802347 [1.643e9], rulesetCycleNumber: 1, projectId: 2, payer: TestAccessToFunds_Local: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496], beneficiary: beneficiary: [0x0000000000000000000000000000000000010f2C], amount: 0, beneficiaryTokenCount: 0, memo: "", metadata: 0x, caller: TestAccessToFunds_Local: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496])
    │   └─ ← 0
    ├─ [786] JBTerminalStore::balanceOf(JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], 2, 0x000000000000000000000000000000000000EEEe) [staticcall]
    │   └─ ← 3
    ├─ [2786] JBTerminalStore::balanceOf(JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], 2, ERC20: [0xD6BbDE9174b1CdAa358d2Cf4D57D1a9F7178FBfF]) [staticcall]
    │   └─ ← 0
    ├─ [562] ERC20::balanceOf(JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233]) [staticcall]
    │   └─ ← 0
    ├─ [266] ERC20::decimals() [staticcall]
    │   └─ ← 6
    ├─ [852] JBTokens::totalBalanceOf(beneficiary: [0x0000000000000000000000000000000000010f2C], 2) [staticcall]
    │   └─ ← 1500
    ├─ [0] VM::expectRevert(INADEQUATE_CONTROLLER_ALLOWANCE())
    │   └─ ← ()
    ├─ [0] VM::prank(projectOwner: [0x000000000000000000000000000000000000007B])
    │   └─ ← ()
    ├─ [20455] JBMultiTerminal::useAllowanceOf(2, 0x000000000000000000000000000000000000EEEe, 0, 61166 [6.116e4], 0, beneficiary: [0x0000000000000000000000000000000000010f2C], "MEMO")
    │   ├─ [620] JBProjects::ownerOf(2) [staticcall]
    │   │   └─ ← projectOwner: [0x000000000000000000000000000000000000007B]
    │   ├─ [17071] JBTerminalStore::recordUsedAllowanceOf(2, JBAccountingContext({ token: 0x000000000000000000000000000000000000EEEe, decimals: 18, currency: 61166 [6.116e4] }), 0, 61166 [6.116e4])
    │   │   ├─ [4145] JBRulesets::currentOf(2) [staticcall]
    │   │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] })
    │   │   ├─ [512] JBDirectory::controllerOf(2) [staticcall]
    │   │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   │   ├─ [348] JBController::FUND_ACCESS_LIMITS() [staticcall]
    │   │   │   └─ ← JBFundAccessLimits: [0xA4AD4f68d0b91CFD19687c881e50f3A00242828c]
    │   │   ├─ [3111] JBFundAccessLimits::surplusAllowanceOf(2, 1643802347 [1.643e9], JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], 0x000000000000000000000000000000000000EEEe, 61166 [6.116e4]) [staticcall]
    │   │   │   └─ ← 0
    │   │   └─ ← INADEQUATE_CONTROLLER_ALLOWANCE()
    │   └─ ← INADEQUATE_CONTROLLER_ALLOWANCE()
    ├─ [262] JBMultiTerminal::FEE() [staticcall]
    │   └─ ← 25
    ├─ [786] JBTerminalStore::balanceOf(JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], 2, 0x000000000000000000000000000000000000EEEe) [staticcall]
    │   └─ ← 3
    ├─ [2786] JBTerminalStore::balanceOf(JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], 1, 0x000000000000000000000000000000000000EEEe) [staticcall]
    │   └─ ← 0
    ├─ [4852] JBTokens::totalBalanceOf(projectOwner: [0x000000000000000000000000000000000000007B], 1) [staticcall]
    │   └─ ← 0
    ├─ [0] VM::expectRevert(INADEQUATE_CONTROLLER_ALLOWANCE())
    │   └─ ← ()
    ├─ [0] VM::prank(projectOwner: [0x000000000000000000000000000000000000007B])
    │   └─ ← ()
    ├─ [20455] JBMultiTerminal::useAllowanceOf(2, 0x000000000000000000000000000000000000EEEe, 0, 1903754239 [1.903e9], 0, beneficiary: [0x0000000000000000000000000000000000010f2C], "MEMO")
    │   ├─ [620] JBProjects::ownerOf(2) [staticcall]
    │   │   └─ ← projectOwner: [0x000000000000000000000000000000000000007B]
    │   ├─ [17071] JBTerminalStore::recordUsedAllowanceOf(2, JBAccountingContext({ token: 0x000000000000000000000000000000000000EEEe, decimals: 18, currency: 61166 [6.116e4] }), 0, 1903754239 [1.903e9])
    │   │   ├─ [4145] JBRulesets::currentOf(2) [staticcall]
    │   │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] })
    │   │   ├─ [512] JBDirectory::controllerOf(2) [staticcall]
    │   │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   │   ├─ [348] JBController::FUND_ACCESS_LIMITS() [staticcall]
    │   │   │   └─ ← JBFundAccessLimits: [0xA4AD4f68d0b91CFD19687c881e50f3A00242828c]
    │   │   ├─ [3111] JBFundAccessLimits::surplusAllowanceOf(2, 1643802347 [1.643e9], JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], 0x000000000000000000000000000000000000EEEe, 1903754239 [1.903e9]) [staticcall]
    │   │   │   └─ ← 0
    │   │   └─ ← INADEQUATE_CONTROLLER_ALLOWANCE()
    │   └─ ← INADEQUATE_CONTROLLER_ALLOWANCE()
    ├─ [262] JBMultiTerminal::FEE() [staticcall]
    │   └─ ← 25
    ├─ [786] JBTerminalStore::balanceOf(JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], 2, 0x000000000000000000000000000000000000EEEe) [staticcall]
    │   └─ ← 3
    ├─ [786] JBTerminalStore::balanceOf(JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], 1, 0x000000000000000000000000000000000000EEEe) [staticcall]
    │   └─ ← 0
    ├─ [852] JBTokens::totalBalanceOf(projectOwner: [0x000000000000000000000000000000000000007B], 1) [staticcall]
    │   └─ ← 0
    ├─ [196687] JBMultiTerminal::sendPayoutsOf(2, 0x000000000000000000000000000000000000EEEe, 2, 61166 [6.116e4], 0)
    │   ├─ [38276] JBTerminalStore::recordPayoutFor(2, JBAccountingContext({ token: 0x000000000000000000000000000000000000EEEe, decimals: 18, currency: 61166 [6.116e4] }), 2, 61166 [6.116e4])
    │   │   ├─ [4145] JBRulesets::currentOf(2) [staticcall]
    │   │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] })
    │   │   ├─ [512] JBDirectory::controllerOf(2) [staticcall]
    │   │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   │   ├─ [348] JBController::FUND_ACCESS_LIMITS() [staticcall]
    │   │   │   └─ ← JBFundAccessLimits: [0xA4AD4f68d0b91CFD19687c881e50f3A00242828c]
    │   │   ├─ [1584] JBFundAccessLimits::payoutLimitOf(2, 1643802347 [1.643e9], JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], 0x000000000000000000000000000000000000EEEe, 61166 [6.116e4]) [staticcall]
    │   │   │   └─ ← 2
    │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] }), 2
    │   ├─ [620] JBProjects::ownerOf(2) [staticcall]
    │   │   └─ ← projectOwner: [0x000000000000000000000000000000000000007B]
    │   ├─ [5491] JBSplits::splitsOf(2, 1643802347 [1.643e9], 61166 [6.116e4]) [staticcall]
    │   │   └─ ← []
    │   ├─ [5105] JBDirectory::primaryTerminalOf(1, 0x000000000000000000000000000000000000EEEe) [staticcall]
    │   │   ├─ [1096] JBMultiTerminal::accountingContextForTokenOf(1, 0x000000000000000000000000000000000000EEEe) [staticcall]
    │   │   │   └─ ← JBAccountingContext({ token: 0x000000000000000000000000000000000000EEEe, decimals: 18, currency: 61166 [6.116e4] })
    │   │   └─ ← JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233]
    │   ├─ [127503] JBMultiTerminal::executeProcessFee(2, 0x000000000000000000000000000000000000EEEe, 1, projectOwner: [0x000000000000000000000000000000000000007B], JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233])
    │   │   ├─ [31605] JBTerminalStore::recordPaymentFrom(JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], JBTokenAmount({ token: 0x000000000000000000000000000000000000EEEe, value: 1, decimals: 18, currency: 61166 [6.116e4] }), 1, projectOwner: [0x000000000000000000000000000000000000007B], 0x0000000000000000000000000000000000000000000000000000000000000002)
    │   │   │   ├─ [4145] JBRulesets::currentOf(1) [staticcall]
    │   │   │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] })
    │   │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] }), 1000, []
    │   │   ├─ [512] JBDirectory::controllerOf(1) [staticcall]
    │   │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   │   ├─ [84692] JBController::mintTokensOf(1, 1000, projectOwner: [0x000000000000000000000000000000000000007B], "", true)
    │   │   │   ├─ [4145] JBRulesets::currentOf(1) [staticcall]
    │   │   │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] })
    │   │   │   ├─ [620] JBProjects::ownerOf(1) [staticcall]
    │   │   │   │   └─ ← 0x00000000000000000000000000000000000001a4
    │   │   │   ├─ [1064] JBDirectory::isTerminalOf(1, JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233]) [staticcall]
    │   │   │   │   └─ ← true
    │   │   │   ├─ [1064] JBDirectory::isTerminalOf(1, JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233]) [staticcall]
    │   │   │   │   └─ ← true
    │   │   │   ├─ [47284] JBTokens::mintFor(projectOwner: [0x000000000000000000000000000000000000007B], 1, 500)
    │   │   │   │   ├─ [512] JBDirectory::controllerOf(1) [staticcall]
    │   │   │   │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   │   │   │   ├─ emit Mint(holder: projectOwner: [0x000000000000000000000000000000000000007B], projectId: 1, amount: 500, tokensWereClaimed: false, caller: JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9])
    │   │   │   │   └─ ← ()
    │   │   │   ├─ emit MintTokens(beneficiary: projectOwner: [0x000000000000000000000000000000000000007B], projectId: 1, tokenCount: 1000, beneficiaryTokenCount: 500, memo: "", reservedRate: 5000, caller: JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233])
    │   │   │   └─ ← 500
    │   │   ├─ emit Pay(rulesetId: 1643802347 [1.643e9], rulesetCycleNumber: 1, projectId: 1, payer: JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], beneficiary: projectOwner: [0x000000000000000000000000000000000000007B], amount: 1, beneficiaryTokenCount: 500, memo: "", metadata: 0x0000000000000000000000000000000000000000000000000000000000000002, caller: JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233])
    │   │   └─ ← ()
    │   ├─ emit ProcessFee(projectId: 2, token: 0x000000000000000000000000000000000000EEEe, amount: 1, wasHeld: false, beneficiary: projectOwner: [0x000000000000000000000000000000000000007B], caller: TestAccessToFunds_Local: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496])
    │   ├─ [0] projectOwner::fallback{value: 1}()
    │   │   └─ ← ()
    │   ├─ emit SendPayouts(rulesetId: 1643802347 [1.643e9], rulesetCycleNumber: 1, projectId: 2, beneficiary: projectOwner: [0x000000000000000000000000000000000000007B], amount: 2, amountPaidOut: 2, fee: 1, beneficiaryDistributionAmount: 1, caller: TestAccessToFunds_Local: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496])
    │   └─ ← 2
    ├─ [262] JBMultiTerminal::FEE() [staticcall]
    │   └─ ← 25
    ├─ [786] JBTerminalStore::balanceOf(JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], 2, 0x000000000000000000000000000000000000EEEe) [staticcall]
    │   └─ ← 1
    ├─ [786] JBTerminalStore::balanceOf(JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], 1, 0x000000000000000000000000000000000000EEEe) [staticcall]
    │   └─ ← 1
    ├─ [108829] JBMultiTerminal::sendPayoutsOf(2, 0x000000000000000000000000000000000000EEEe, 2000, 1903754239 [1.903e9], 0)
    │   ├─ [46718] JBTerminalStore::recordPayoutFor(2, JBAccountingContext({ token: 0x000000000000000000000000000000000000EEEe, decimals: 18, currency: 61166 [6.116e4] }), 2000, 1903754239 [1.903e9])
    │   │   ├─ [4145] JBRulesets::currentOf(2) [staticcall]
    │   │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] })
    │   │   ├─ [512] JBDirectory::controllerOf(2) [staticcall]
    │   │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   │   ├─ [348] JBController::FUND_ACCESS_LIMITS() [staticcall]
    │   │   │   └─ ← JBFundAccessLimits: [0xA4AD4f68d0b91CFD19687c881e50f3A00242828c]
    │   │   ├─ [1716] JBFundAccessLimits::payoutLimitOf(2, 1643802347 [1.643e9], JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], 0x000000000000000000000000000000000000EEEe, 1903754239 [1.903e9]) [staticcall]
    │   │   │   └─ ← 2000
    │   │   ├─ [7181] JBPrices::pricePerUnitOf(2, 1903754239 [1.903e9], 61166 [6.116e4], 18) [staticcall]
    │   │   │   ├─ [1233] Mock Price Feed Native-USDC::currentUnitPrice(18) [staticcall]
    │   │   │   │   └─ ← 2000000000000000000000 [2e21]
    │   │   │   └─ ← 2000000000000000000000 [2e21]
    │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] }), 1
    │   ├─ [620] JBProjects::ownerOf(2) [staticcall]
    │   │   └─ ← projectOwner: [0x000000000000000000000000000000000000007B]
    │   ├─ [1491] JBSplits::splitsOf(2, 1643802347 [1.643e9], 61166 [6.116e4]) [staticcall]
    │   │   └─ ← []
    │   ├─ [3105] JBDirectory::primaryTerminalOf(1, 0x000000000000000000000000000000000000EEEe) [staticcall]
    │   │   ├─ [1096] JBMultiTerminal::accountingContextForTokenOf(1, 0x000000000000000000000000000000000000EEEe) [staticcall]
    │   │   │   └─ ← JBAccountingContext({ token: 0x000000000000000000000000000000000000EEEe, decimals: 18, currency: 61166 [6.116e4] })
    │   │   └─ ← JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233]
    │   ├─ [43903] JBMultiTerminal::executeProcessFee(2, 0x000000000000000000000000000000000000EEEe, 1, projectOwner: [0x000000000000000000000000000000000000007B], JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233])
    │   │   ├─ [11705] JBTerminalStore::recordPaymentFrom(JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], JBTokenAmount({ token: 0x000000000000000000000000000000000000EEEe, value: 1, decimals: 18, currency: 61166 [6.116e4] }), 1, projectOwner: [0x000000000000000000000000000000000000007B], 0x0000000000000000000000000000000000000000000000000000000000000002)
    │   │   │   ├─ [4145] JBRulesets::currentOf(1) [staticcall]
    │   │   │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] })
    │   │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] }), 1000, []
    │   │   ├─ [512] JBDirectory::controllerOf(1) [staticcall]
    │   │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   │   ├─ [20992] JBController::mintTokensOf(1, 1000, projectOwner: [0x000000000000000000000000000000000000007B], "", true)
    │   │   │   ├─ [4145] JBRulesets::currentOf(1) [staticcall]
    │   │   │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] })
    │   │   │   ├─ [620] JBProjects::ownerOf(1) [staticcall]
    │   │   │   │   └─ ← 0x00000000000000000000000000000000000001a4
    │   │   │   ├─ [1064] JBDirectory::isTerminalOf(1, JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233]) [staticcall]
    │   │   │   │   └─ ← true
    │   │   │   ├─ [1064] JBDirectory::isTerminalOf(1, JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233]) [staticcall]
    │   │   │   │   └─ ← true
    │   │   │   ├─ [5484] JBTokens::mintFor(projectOwner: [0x000000000000000000000000000000000000007B], 1, 500)
    │   │   │   │   ├─ [512] JBDirectory::controllerOf(1) [staticcall]
    │   │   │   │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   │   │   │   ├─ emit Mint(holder: projectOwner: [0x000000000000000000000000000000000000007B], projectId: 1, amount: 500, tokensWereClaimed: false, caller: JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9])
    │   │   │   │   └─ ← ()
    │   │   │   ├─ emit MintTokens(beneficiary: projectOwner: [0x000000000000000000000000000000000000007B], projectId: 1, tokenCount: 1000, beneficiaryTokenCount: 500, memo: "", reservedRate: 5000, caller: JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233])
    │   │   │   └─ ← 500
    │   │   ├─ emit Pay(rulesetId: 1643802347 [1.643e9], rulesetCycleNumber: 1, projectId: 1, payer: JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], beneficiary: projectOwner: [0x000000000000000000000000000000000000007B], amount: 1, beneficiaryTokenCount: 500, memo: "", metadata: 0x0000000000000000000000000000000000000000000000000000000000000002, caller: JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233])
    │   │   └─ ← ()
    │   ├─ emit ProcessFee(projectId: 2, token: 0x000000000000000000000000000000000000EEEe, amount: 1, wasHeld: false, beneficiary: projectOwner: [0x000000000000000000000000000000000000007B], caller: TestAccessToFunds_Local: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496])
    │   ├─ [0] projectOwner::fallback()
    │   │   └─ ← ()
    │   ├─ emit SendPayouts(rulesetId: 1643802347 [1.643e9], rulesetCycleNumber: 1, projectId: 2, beneficiary: projectOwner: [0x000000000000000000000000000000000000007B], amount: 2000, amountPaidOut: 1, fee: 1, beneficiaryDistributionAmount: 0, caller: TestAccessToFunds_Local: [0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496])
    │   └─ ← 1
    ├─ [262] JBMultiTerminal::FEE() [staticcall]
    │   └─ ← 25
    ├─ [786] JBTerminalStore::balanceOf(JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], 2, 0x000000000000000000000000000000000000EEEe) [staticcall]
    │   └─ ← 0
    ├─ [786] JBTerminalStore::balanceOf(JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], 1, 0x000000000000000000000000000000000000EEEe) [staticcall]
    │   └─ ← 2
    ├─ [786] JBTerminalStore::balanceOf(JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], 2, 0x000000000000000000000000000000000000EEEe) [staticcall]
    │   └─ ← 0
    ├─ emit log(val: "Error: a == b not satisfied [uint]")
    ├─ emit log_named_uint(key: "      Left", val: 0)
    ├─ emit log_named_uint(key: "     Right", val: 1)
    ├─ [0] VM::store(VM: [0x7109709ECfa91a80626fF3989D68f67F5b1DD12D], 0x6661696c65640000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001)
    │   └─ ← ()
    ├─ [786] JBTerminalStore::balanceOf(JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], 2, ERC20: [0xD6BbDE9174b1CdAa358d2Cf4D57D1a9F7178FBfF]) [staticcall]
    │   └─ ← 0
    ├─ [1712] JBController::totalTokenSupplyWithReservedTokensOf(2) [staticcall]
    │   ├─ [764] JBTokens::totalSupplyOf(2) [staticcall]
    │   │   └─ ← 1500
    │   └─ ← 3000
    ├─ [0] VM::startPrank(beneficiary: [0x0000000000000000000000000000000000010f2C])
    │   └─ ← ()
    ├─ [266] ERC20::decimals() [staticcall]
    │   └─ ← 6
    ├─ [64580] JBMultiTerminal::redeemTokensOf(beneficiary: [0x0000000000000000000000000000000000010f2C], 2, ERC20: [0xD6BbDE9174b1CdAa358d2Cf4D57D1a9F7178FBfF], 1500, 0, beneficiary: [0x0000000000000000000000000000000000010f2C], 0x)
    │   ├─ [41280] JBTerminalStore::recordRedemptionFor(beneficiary: [0x0000000000000000000000000000000000010f2C], 2, 1500, JBAccountingContext({ token: 0xD6BbDE9174b1CdAa358d2Cf4D57D1a9F7178FBfF, decimals: 6, currency: 1903754239 [1.903e9] }), [JBAccountingContext({ token: 0x000000000000000000000000000000000000EEEe, decimals: 18, currency: 61166 [6.116e4] }), JBAccountingContext({ token: 0xD6BbDE9174b1CdAa358d2Cf4D57D1a9F7178FBfF, decimals: 6, currency: 1903754239 [1.903e9] })], 0x)
    │   │   ├─ [4145] JBRulesets::currentOf(2) [staticcall]
    │   │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] })
    │   │   ├─ [1093] JBDirectory::terminalsOf(2) [staticcall]
    │   │   │   └─ ← [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233]
    │   │   ├─ [24147] JBMultiTerminal::currentSurplusOf(2, 6, 1903754239 [1.903e9]) [staticcall]
    │   │   │   ├─ [22298] JBTerminalStore::currentSurplusOf(JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], 2, [JBAccountingContext({ token: 0x000000000000000000000000000000000000EEEe, decimals: 18, currency: 61166 [6.116e4] }), JBAccountingContext({ token: 0xD6BbDE9174b1CdAa358d2Cf4D57D1a9F7178FBfF, decimals: 6, currency: 1903754239 [1.903e9] })], 6, 1903754239 [1.903e9]) [staticcall]
    │   │   │   │   ├─ [4145] JBRulesets::currentOf(2) [staticcall]
    │   │   │   │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] })
    │   │   │   │   ├─ [512] JBDirectory::controllerOf(2) [staticcall]
    │   │   │   │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   │   │   │   ├─ [348] JBController::FUND_ACCESS_LIMITS() [staticcall]
    │   │   │   │   │   └─ ← JBFundAccessLimits: [0xA4AD4f68d0b91CFD19687c881e50f3A00242828c]
    │   │   │   │   ├─ [2666] JBFundAccessLimits::payoutLimitsOf(2, 1643802347 [1.643e9], JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], 0x000000000000000000000000000000000000EEEe) [staticcall]
    │   │   │   │   │   └─ ← [JBCurrencyAmount({ amount: 2, currency: 61166 [6.116e4] }), JBCurrencyAmount({ amount: 2000, currency: 1903754239 [1.903e9] })]
    │   │   │   │   ├─ [512] JBDirectory::controllerOf(2) [staticcall]
    │   │   │   │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   │   │   │   ├─ [348] JBController::FUND_ACCESS_LIMITS() [staticcall]
    │   │   │   │   │   └─ ← JBFundAccessLimits: [0xA4AD4f68d0b91CFD19687c881e50f3A00242828c]
    │   │   │   │   ├─ [3348] JBFundAccessLimits::payoutLimitsOf(2, 1643802347 [1.643e9], JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], ERC20: [0xD6BbDE9174b1CdAa358d2Cf4D57D1a9F7178FBfF]) [staticcall]
    │   │   │   │   │   └─ ← []
    │   │   │   │   └─ ← 0
    │   │   │   └─ ← 0
    │   │   ├─ [512] JBDirectory::controllerOf(2) [staticcall]
    │   │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   │   ├─ [1712] JBController::totalTokenSupplyWithReservedTokensOf(2) [staticcall]
    │   │   │   ├─ [764] JBTokens::totalSupplyOf(2) [staticcall]
    │   │   │   │   └─ ← 1500
    │   │   │   └─ ← 3000
    │   │   └─ ← JBRuleset({ cycleNumber: 1, id: 1643802347 [1.643e9], basedOnId: 0, start: 1643802347 [1.643e9], duration: 0, weight: 1000000000000000000000 [1e21], decayRate: 0, approvalHook: 0x0000000000000000000000000000000000000000, metadata: 75557867929215080413313 [7.555e22] }), 0, 5000, []
    │   ├─ [512] JBDirectory::controllerOf(2) [staticcall]
    │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   ├─ [11595] JBController::burnTokensOf(beneficiary: [0x0000000000000000000000000000000000010f2C], 2, 1500, "")
    │   │   ├─ [1064] JBDirectory::isTerminalOf(2, JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233]) [staticcall]
    │   │   │   └─ ← true
    │   │   ├─ [5691] JBTokens::burnFrom(beneficiary: [0x0000000000000000000000000000000000010f2C], 2, 1500)
    │   │   │   ├─ [512] JBDirectory::controllerOf(2) [staticcall]
    │   │   │   │   └─ ← JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9]
    │   │   │   ├─ emit Burn(holder: beneficiary: [0x0000000000000000000000000000000000010f2C], projectId: 2, amount: 1500, initialCreditBalance: 1500, initialTokenBalance: 0, caller: JBController: [0x15cF58144EF33af1e14b5208015d11F9143E27b9])
    │   │   │   └─ ← ()
    │   │   ├─ emit BurnTokens(holder: beneficiary: [0x0000000000000000000000000000000000010f2C], projectId: 2, tokenCount: 1500, memo: "", caller: JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233])
    │   │   └─ ← ()
    │   ├─ emit RedeemTokens(rulesetId: 1643802347 [1.643e9], rulesetCycleNumber: 1, projectId: 2, holder: beneficiary: [0x0000000000000000000000000000000000010f2C], beneficiary: beneficiary: [0x0000000000000000000000000000000000010f2C], tokenCount: 1500, redemptionRate: 5000, reclaimedAmount: 0, metadata: 0x, caller: beneficiary: [0x0000000000000000000000000000000000010f2C])
    │   └─ ← 0
    ├─ [0] VM::stopPrank()
    │   └─ ← ()
    ├─ [786] JBTerminalStore::balanceOf(JBMultiTerminal: [0xBEF8BC89756284170ec0EdD9F15dcf23EAD26233], 2, 0x000000000000000000000000000000000000EEEe) [staticcall]
    │   └─ ← 0
    ├─ emit log(val: "Error: a == b not satisfied [uint]")
    ├─ emit log_named_uint(key: "      Left", val: 0)
    ├─ emit log_named_uint(key: "     Right", val: 1)
    ├─ [0] VM::store(VM: [0x7109709ECfa91a80626fF3989D68f67F5b1DD12D], 0x6661696c65640000000000000000000000000000000000000000000000000000, 0x0000000000000000000000000000000000000000000000000000000000000001)
    │   └─ ← ()
    └─ ← ()

[PASS] testFuzzMultiTerminalAllowance(uint224,uint224,uint256,uint224,uint224,uint256) (runs: 256, μ: 2430802, ~: 2482429)
[PASS] testFuzzNativeAllowance(uint224,uint224,uint256) (runs: 256, μ: 1375606, ~: 1244222)
[PASS] testFuzzNativeAllowanceWithRevertingFeeProject(uint224,uint224,uint256,bool) (runs: 256, μ: 1048484, ~: 1052173)
[PASS] testFuzzNativeTokenAllowanceForTheFeeProject(uint224,uint224,uint256) (runs: 256, μ: 936253, ~: 882268)
[PASS] testNativeAllowance() (gas: 1631870)
Suite result: FAILED. 5 passed; 1 failed; 0 skipped; finished in 1.20s (2.88s CPU time)

Ran 17 test suites in 2.23s (5.60s CPU time): 55 tests passed, 1 failed, 0 skipped (56 total tests)

Failing tests:
Encountered 1 failing test in test/TestAccessToFunds.sol:TestAccessToFunds_Local
[FAIL. Reason: assertion failed; counterexample: calldata=0xf8094f79000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007d00000000000000000000000000000000000000000000000000000000000000000 args=[0, 2, 3, 0, 2000, 0]] testFuzzMultiCurrencyAllowance(uint224,uint224,uint256,uint224,uint224,uint256) (runs: 236, μ: 2372004, ~: 2329808)

trying to reproduce
Uploading image.png…

reproduced by hardcoding the failed values. investigating cause

< needed to be <= in test. good catch @seanmc9 https://github.com/Bananapus/nana-core/pull/113/files

oh sweet, and thank you!