{"assessments":[],"deployments":[],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"ecefcf0f-7a59-49f2-b474-72d31566eeae","kind":"skill:build-contract-project","nodes":[{"acceptedSubmissionHash":"23c5181d6bda081405385c19de6187db107ec1b35f353fd8b512264b956e194c","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"47381b166d1f406a34f0ebdc740ee21bc0383e56e7ad9084b26abf1bf7570904","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"47381b166d1f406a34f0ebdc740ee21bc0383e56e7ad9084b26abf1bf7570904","skillId":"build-contract-project","state":"accepted"}],"objective":"Security-review and harden the existing SwarmWorld Core design. This is NOT a new protocol and NOT a token project.\n\nExisting system:\nSwarmWorld is an on-chain world with 3 settlements and resource state. Missions are worked by distinct builder, tester, reviewer and verifier roles. A mission records artifact hashes and a deterministic proofHash. Settlement state changes only after successful verification.\n\nYour task:\nProduce a hardened SwarmWorld Solidity implementation with Foundry tests. Preserve the existing architecture unless a security fix requires a change.\n\nContracts:\n- SwarmWorld: settlement/world state.\n- MissionManager: mission lifecycle, escrow/rewards, verification and settlement.\n\nAudit these issues specifically:\n\n1. activeMission cleanup\nA settlement must never remain permanently locked after a mission reaches a terminal state.\nClear activeMission correctly after SETTLED, FAILED, EXPIRED or any other terminal path.\nTest that a new mission can be created after each terminal state.\n\n2. Mission state machine\nEnforce valid transitions only:\nOPEN -> WORKING -> VERIFYING -> PASSED/FAILED -> SETTLED where applicable.\nNo caller may skip required stages or settle twice.\n\n3. Expiry\nExpired missions must have a deterministic terminal path.\nExpiry must not leave funds or settlements permanently locked.\nTest before/after deadline behavior.\n\n4. Escrow accounting\nNever distribute more than the funded reward.\nSuccessful settlement pays exactly:\nbuilder 50%\ntester 15%\nreviewer 15%\nverifier 20%\nPrevent double payout, double refund and double claim.\nFailed/expired missions must have a safe refund path.\n\n5. Reentrancy\nProtect all ERC20 payout/refund paths.\nUse checks-effects-interactions and ReentrancyGuard where appropriate.\n\n6. Roles\nbuilder, tester, reviewer and verifier must be nonzero and distinct.\nA participant cannot review or verify their own work.\nEnforce caller permissions for every stage.\n\n7. World-state safety\nResources energy, food, materials and knowledge must always remain 0..1000.\nStability must remain 0..100.\nInvalid signed deltas must revert safely.\nWorld state must NOT change when builder submits work, tester reviews, or verifier passes.\nApply state transition only during final successful settlement.\n\n8. activeMission and mission IDs\nHandle missionId 0 safely.\nPrevent duplicate or conflicting active missions for one settlement.\n\n9. proofHash\nKeep a deterministic proofHash committing to:\nchainId,\nmissionId,\nsettlementId,\nspecHash,\npre-state hash,\nbuilder artifact hash,\ntest artifact hash,\nreview artifact hash,\nverifier artifact hash,\nproposed transition,\nbuilder/tester/reviewer/verifier addresses.\n\nDocument clearly that proofHash is an evidence commitment, NOT proof that the underlying work is objectively true.\n\n10. Identity.MD provenance\nIf seat IDs are stored, do NOT claim the contract proves wallet ownership of an Identity.MD seat unless such verification is actually implemented.\nDocument seat IDs as provenance metadata only.\n\nTesting:\nUse Foundry unit tests plus fuzz tests and invariant tests.\n\nRequired invariants:\n- settlement resources always stay within bounds\n- escrow never pays more than funded\n- each mission settles at most once\n- terminal missions cannot lock a settlement forever\n- world state changes only through valid final settlement\n- role permissions cannot be bypassed\n\nInclude adversarial tests for:\nunauthorized calls,\nself-review,\nself-verification,\nduplicate proof/artifact submissions,\ndouble settlement,\ndouble refund,\nreentrancy,\nexpired missions,\ninvalid state transitions,\nresource overflow/underflow,\nmissionId 0,\nERC20 transfer failure.\n\nDo not invent IMD oracle, consensus or cryptographic capabilities that are not implemented.\n\nDeliver:\n- hardened Solidity source\n- complete Foundry test suite\n- fuzz/invariant tests\n- deployment script\n- ABI\n- README\n- SECURITY.md listing","parentJobId":null,"planHash":"f606754f72f4f4dfed00e539e900aca2c59ca512e468693e1db688071e09322f","previousHash":"52047d88479864122c41a02b3b270dff9e82d75bb37b0a96fd2fe6d84b0de322","projectId":"ecefcf0f-7a59-49f2-b474-72d31566eeae","publication":{"commit":"e13f4e8bea0b00bf51c92983bad51ca571f2c64a","deliveredAt":"2026-09-28T17:46:00.320Z","repoUrl":"https://github.com/identity-md-launches/launch-430-security-review-harden-existing-swarmwor"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"b718b3623c0f5274922d1ed61bfc9fb4d8f6de44e44befb28d0f27d3861867dd","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"6be93c146698e02f6e96865b92b62b617a764072ed049b044a8bf8253753d420","device":"35c52a5b502e847c","findings":[],"hash":"23c5181d6bda081405385c19de6187db107ec1b35f353fd8b512264b956e194c","nodeId":"44448a22-79a0-4e24-90b0-dce92b96ff96","outcome":"completed","summary":"Implemented the supplied two-contract design, including hardened lifecycle/escrow handling, deployment script, exported ABIs, and adversarial, fuzz, and invariant tests.\n\nVerified with Solidity **0.8.26**:\n\n- `forge build` — passed\n- `forge test` — **40 passed, 0 failed**\n- `forge fmt --check` — passed\n- Exported ABIs match compiler artifacts\n\nDeployment assumptions, operational responsibilities, proofHash limitations, and seat provenance semantics are documented in `README.md` and `SECURITY.md`. The workspace was empty, so this implements the supplied architecture rather than auditing prior source.","treeHash":"6fd238ed5358a1ea1619b44f4937d6a980b0612e","usage":{"cachedInputTokens":843136,"inputTokens":71506,"model":"gpt-6-astra","outputTokens":38766,"runtime":"codex","turns":7,"wallClockMs":1244212}}],"verification":[{"checks":[{"durationMs":13816,"exitCode":0,"name":"build","output":"Compiling 12 files with Solc 0.8.26\nSolc 0.8.26 finished in 13.75s\nCompiler run successful!\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmWorld.sol:53:23\n   │\n53 │         next.energy = uint16(_bounded(current.energy, delta.energy, 1000));\n   │                       ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint16' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmWorld.sol:54:21\n   │\n54 │         next.food = uint16(_bounded(current.food, delta.food, 1000));\n   │                     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint16' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmWorld.sol:55:26\n   │\n55 │         next.materials = uint16(_bounded(current.materials, delta.materials, 1000));\n   │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint16' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmWorld.sol:56:26\n   │\n56 │         next.knowledge = uint16(_bounded(current.knowledge, delta.knowledge, 1000));\n   │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint16' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmWorld.sol:57:26\n   │\n57 │         next.stability = uint8(_bounded(current.stability, delta.stability, 100));\n   │                          ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint8' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmWorld.sol:70:25\n   │\n70 │         int256 result = int256(current) + delta;\n   │                         ━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'int256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[unsafe-typecast]: typecast can truncate values\n   ╭▸ src/SwarmWorld.sol:72:16\n   │\n72 │         return uint256(result);\n   │                ━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://getfoundry.sh/forge/linting/unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MissionManager.sol:122:13\n    │\n122 │         if (deadline <= block.timestamp || uint256(deadline) - block.timestamp > MAX_DURATION) {\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MissionManager.sol:122:44\n    │\n122 │         if (deadline <= block.timestamp || uint256(deadline) - block.timestamp > MAX_DURATION) {\n    │                                            ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[unused-return]: return value of an external call is not used\n    ╭▸ src/MissionManager.sol:165:9\n    │\n165 │         world.preview(m.settlementId, delta);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/unused-return\n\nwarning[reentrancy-no-eth]: external call can be reentered before `_entered` is updated\n    ╭▸ src/MissionManager.sol:215:9\n    │\n215 │         world.applyTransition(m.settlementId, m.preStateHash, m.transition);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/reentrancy-no-eth\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MissionManager.sol:210:49\n    │\n210 │         claimable[missionId][m.roles.builder] = unit * 10;\n    │                                                 ━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MissionManager.sol:211:48\n    │\n211 │         claimable[missionId][m.roles.tester] = unit * 3;\n    │                                                ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MissionManager.sol:212:50\n    │\n212 │         claimable[missionId][m.roles.reviewer] = unit * 3;\n    │                                                  ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[divide-before-multiply]: division before multiplication may lose precision\n    ╭▸ src/MissionManager.sol:213:50\n    │\n213 │         claimable[missionId][m.roles.verifier] = unit * 4;\n    │                                                  ━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/divide-before-multiply\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MissionManager.sol:222:13\n    │\n222 │         if (block.timestamp <= m.deadline) revert NotExpired();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n    ╭▸ src/MissionManager.sol:273:13\n    │\n273 │         if (block.timestamp > m.deadline) revert DeadlinePassed();\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/block-timestamp\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MissionManager.sol:294:48\n    │\n294 │             if (participants[i] == address(0)) revert InvalidRoles();\n    │                                                ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\nwarning[require-revert-in-loop]: `require` or `revert` inside a loop\n    ╭▸ src/MissionManager.sol:296:57\n    │\n296 │                 if (participants[i] == participants[j]) revert InvalidRoles();\n    │                                                         ━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://getfoundry.sh/forge/linting/require-revert-in-loop\n\n","passed":true},{"durationMs":6364,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 11 tests for test/Lifecycle.t.sol:LifecycleTest\n[PASS] testAllRolePairsMustBeDistinctAndNonzero() (gas: 437101)\n[PASS] testCreationInputValidation() (gas: 704060)\n[PASS] testDeadlineBoundaryAllowsFinalizationAtDeadline() (gas: 1364176)\n[PASS] testDuplicateAndZeroArtifactsCannotBeSubmitted() (gas: 1499542)\n[PASS] testExpiredStageCallsRevertBeforeCleanup() (gas: 3183353)\n[PASS] testExpiryFromEveryNonterminalStateUnlocksAndRefunds() (gas: 6741693)\n[PASS] testInvalidTransitionsAndMissingStages() (gas: 1016732)\n[PASS] testMissionZeroExistsAndConflictsAreRejected() (gas: 1437729)\n[PASS] testRejectedMissionUnlocksBeforeRefundAndOldRefundKeepsNewLock() (gas: 1643878)\n[PASS] testSuccessfulLifecycleAndNewMissionAfterSettlement() (gas: 1939346)\n[PASS] testUnauthorizedStagesAndSelfReviewVerification() (gas: 1269548)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 49.06ms (10.10ms CPU time)\n\nRan 10 tests for test/WorldAndProof.t.sol:WorldAndProofTest\n[PASS] testBoundsAreInclusiveAndCanReachBothExtremes() (gas: 3210407)\n[PASS] testDeploymentUsesExplicitParametersIndependentlyOfCaller() (gas: 4862678)\n[PASS] testDifferentMissionIdsAndChainIdsProduceDifferentProofs() (gas: 2055348)\n[PASS] testEveryResourceBoundaryRejectsWithoutPanicOrStateChange() (gas: 3209371)\n[PASS] testFinalSettlementAppliesExactlyTheProposedTransition() (gas: 1641928)\n[PASS] testInitialWorldAndOnlyManagerCanMutate() (gas: 136474)\n[PASS] testProofCommitsToEveryRequiredField() (gas: 2143187)\n[PASS] testProofHashMatchesIndependentSchemaAndIsImmutable() (gas: 1464128)\n[PASS] testProvenanceMetadataCanBeZeroOrDuplicatedWithoutGrantingAuthority() (gas: 576328)\n[PASS] testWorldRechecksBoundsAndStaleStateEvenForManager() (gas: 77785)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 53.86ms (6.05ms CPU time)\n\nRan 11 tests for test/Escrow.t.sol:EscrowTest\n[PASS] testClaimsAndRefundsCanRedirectButCannotBeStolen() (gas: 2249977)\n[PASS] testEveryPayoutFailurePreservesClaimsAndRefundsForRetry() (gas: 5055466)\n[PASS] testExactPayoutsAndDoubleClaimsSettlementRefundRevert() (gas: 1915690)\n[PASS] testFundingFailureIsAtomicForFalseRevertMalformedFeeAndNoopTokens() (gas: 3968677)\n[PASS] testInsufficientAllowanceAndBalanceRollbackCreation() (gas: 927265)\n[PASS] testInvalidRecipientsRollbackAccounting() (gas: 2367608)\n[PASS] testNoReturnTokenSupportedForFundingClaimsAndRefund() (gas: 2212940)\n[PASS] testReentrantClaimAndCrossFunctionCallAreBlocked() (gas: 2183927)\n[PASS] testReentrantFundingAndRefundAreBlocked() (gas: 1882010)\n[PASS] testRejectedMissionRefundIsFullAndOnce() (gas: 1245693)\n[PASS] testTokenFailureCannotPreventTerminalCleanupOrNewMissionAfterRecovery() (gas: 3993549)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 54.57ms (11.17ms CPU time)\n\nRan 6 tests for test/Fuzz.t.sol:FuzzTest\n[PASS] testFuzzDeadlineAndExpiryRefund(uint32,uint32,bool) (runs: 256, μ: 1394536, ~: 1618912)\n[PASS] testFuzzExactConservationAndArbitraryClaimOrder(uint128,uint8) (runs: 256, μ: 1781600, ~: 1781583)\n[PASS] testFuzzSignedDeltasRevertSafelyOrStayBounded(int256,int256,int256,int256,int256) (runs: 256, μ: 626975, ~: 627023)\n[PASS] testFuzzUnauthorizedCallerCannotPerformStages(address) (runs: 256, μ: 1033501, ~: 1170697)\n[PASS] testFuzzUnknownMissionNeverActsLikeMissionZero(uint256) (runs: 256, μ: 743388, ~: 742875)\n[PASS] testFuzzValidTransitionsApplyOnlyOnce(uint256,uint256,uint256,uint256,uint256) (runs: 256, μ: 1199729, ~: 1200337)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 61.13ms (264.94ms CPU time)\n\nRan 2 tests for test/Invariant.t.sol:InvariantTest\n[PASS]\nInvariantTest invariants:\n[PASS] invariantEscrowConservationAndAtMostOneSettlement\n[PASS] invariantResourcesBoundedAndWorldChangesOnlyAtFinalSettlement\n[PASS] invariantRolePermissionsCannotBeBypassed\n[PASS] invariantTerminalMissionsReleaseSettlementsAndLiveLocksMatch\n InvariantTest invariants (runs: 128, calls: 8192, reverts: 0)\n\n╭----------------+----------+-------+---------+----------╮\n| Contract       | Selector | Calls | Reverts | Discards |\n+========================================================+\n| MissionHandler | attack   | 1338  | 0       | 0        |\n|----------------+----------+-------+---------+----------|\n| MissionHandler | complete | 1348  | 0       | 0        |\n|----------------+----------+-------+---------+----------|\n| MissionHandler | elapse   | 1394  | 0       | 0        |\n|----------------+----------+-------+---------+----------|\n| MissionHandler | progress | 1399  | 0       | 0        |\n|----------------+----------+-------+---------+----------|\n| MissionHandler | timeout  | 1360  | 0       | 0        |\n|----------------+----------+-------+---------+----------|\n| MissionHandler | withdraw | 1353  | 0       | 0        |\n╰----------------+----------+-------+---------+----------╯\n\n[PASS] testHandlerExercisesSuccessFailureExpiryClaimsAndAttacks() (gas: 4036269)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.31s (6.31s CPU time)\n\nRan 5 test suites in 6.31s (6.53s CPU time): 40 tests passed, 0 failed, 0 skipped (40 total tests)\n","passed":true},{"durationMs":1690,"exitCode":0,"name":"slither","output":"[high/medium] reentrancy-balance at src/MissionManager.sol:108: Reentrancy in MissionManager.createMission(uint256,bytes32,MissionManager.Roles,bytes32[4],uint256,uint64) (src/MissionManager.sol#108-149):\n[high/medium] reentrancy-balance at src/MissionManager.sol:108: Reentrancy in MissionManager.createMission(uint256,bytes32,MissionManager.Roles,bytes32[4],uint256,uint64) (src/MissionManager.sol#108-149):\n[high/medium] reentrancy-balance at src/MissionManager.sol:252: Reentrancy in MissionManager._pay(address,uint256) (src/MissionManager.sol#252-263):\n[high/medium] reentrancy-balance at src/MissionManager.sol:252: Reentrancy in MissionManager._pay(address,uint256) (src/MissionManager.sol#252-263):\n[medium/medium] divide-before-multiply at src/MissionManager.sol:205: MissionManager.settleMission(uint256) (src/MissionManager.sol#205-216) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/MissionManager.sol:205: MissionManager.settleMission(uint256) (src/MissionManager.sol#205-216) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/MissionManager.sol:205: MissionManager.settleMission(uint256) (src/MissionManager.sol#205-216) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/MissionManager.sol:205: MissionManager.settleMission(uint256) (src/MissionManager.sol#205-216) performs a multiplication on the result of a division:\n[medium/medium] unused-return at src/MissionManager.sol:157: MissionManager.submitWork(uint256,bytes32,SwarmWorld.Transition) (src/MissionManager.sol#157-169) ignores return value by world.preview(m.settlementId,delta) (src/MissionManager.sol#165)\n[low/medium] timestamp at src/MissionManager.sol:108: MissionManager.createMission(uint256,bytes32,MissionManager.Roles,bytes32[4],uint256,uint64) (src/MissionManager.sol#108-149) uses timestamp for comparisons\n[low/medium] timestamp at src/MissionManager.sol:219: MissionManager.expireMission(uint256) (src/MissionManager.sol#219-225) uses timestamp for comparisons\n[low/medium] timestamp at src/MissionManager.sol:270: MissionManager._liveMission(uint256,MissionManager.Status) (src/MissionManager.sol#270-274) uses timestamp for comparisons","passed":true},{"durationMs":353,"exitCode":0,"name":"aderyn","output":"[high] reentrancy-state-change at src/MissionManager.sol:117: Reentrancy: State change after external call (2 places)\n[low] literal-instead-of-constant at src/MissionManager.sol:112: Literal Instead of Constant (16 places)\n[low] require-revert-in-loop at src/MissionManager.sol:293: Loop Contains `require`/`revert` (2 places)\n[low] unchecked-return at src/MissionManager.sol:165: Unchecked Return\n[low] uninitialized-local-variable at src/MissionManager.sol:293: Uninitialized Local Variable (2 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"23c5181d6bda081405385c19de6187db107ec1b35f353fd8b512264b956e194c","verifiedTreeHash":"6fd238ed5358a1ea1619b44f4937d6a980b0612e","verifierVersion":"0.1.0+78c54e29"}]}