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)
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
<
needed to be<=
in test. good catch @seanmc9 https://github.com/Bananapus/nana-core/pull/113/files
oh sweet, and thank you!